diff --git a/Lib/test/test_threading.py b/Lib/test/test_threading.py
index b36c196..6458f7e 100644
--- a/Lib/test/test_threading.py
+++ b/Lib/test/test_threading.py
@@ -1,7 +1,7 @@
 # Very rudimentary test of threading module
 
 import test.support
-from test.support import verbose
+from test.support import verbose, catch_warning
 import random
 import re
 import sys
@@ -323,6 +323,43 @@
                           msg=('%d references still around' %
                                sys.getrefcount(weak_raising_cyclic_object())))
 
+    def test_pep8ified_threading(self):
+        import threading
+
+        def check(_, w, msg):
+            self.assertEqual(str(w.message), msg)
+
+        t = threading.Thread()
+        with catch_warning() as w:
+            msg = "isDaemon() is deprecated in favor of the " \
+                  "Thread.daemon property"
+            check(t.isDaemon(), w, msg)
+            w.reset()
+            msg = "setDaemon() is deprecated in favor of the " \
+                  "Thread.daemon property"
+            check(t.setDaemon(True), w, msg)
+            w.reset()
+            msg = "getName() is deprecated in favor of the " \
+                  "Thread.name property"
+            check(t.getName(), w, msg)
+            w.reset()
+            msg = "setName() is deprecated in favor of the " \
+                  "Thread.name property"
+            check(t.setName("name"), w, msg)
+            w.reset()
+            msg = "isAlive() is deprecated in favor of is_alive()"
+            check(t.isAlive(), w, msg)
+            w.reset()
+            e = threading.Event()
+            msg = "isSet() is deprecated in favor of is_set()"
+            check(e.isSet(), w, msg)
+            w.reset()
+            msg = "currentThread() is deprecated in favor of current_thread()"
+            check(threading.currentThread(), w, msg)
+            w.reset()
+            msg = "activeCount() is deprecated in favor of active_count()"
+            check(threading.activeCount(), w, msg)
+
 
 class ThreadJoinOnShutdown(unittest.TestCase):
 
diff --git a/Lib/threading.py b/Lib/threading.py
index 9416f80..48c63ce 100644
--- a/Lib/threading.py
+++ b/Lib/threading.py
@@ -2,6 +2,7 @@
 
 import sys as _sys
 import _thread
+import warnings
 
 from time import time as _time, sleep as _sleep
 from traceback import format_exc as _format_exc
@@ -340,6 +341,11 @@
     def is_set(self):
         return self._flag
 
+    def isSet(self):
+        warnings.warn("isSet() is deprecated in favor of is_set()",
+                      DeprecationWarning)
+        return self.is_set()
+
     def set(self):
         self._cond.acquire()
         try:
@@ -640,6 +646,11 @@
         assert self._initialized, "Thread.__init__() not called"
         return self._started.is_set() and not self._stopped
 
+    def isAlive(self):
+        warnings.warn("isAlive() is deprecated in favor of is_alive()",
+                      DeprecationWarning)
+        return self.is_alive()
+
     @property
     def daemon(self):
         assert self._initialized, "Thread.__init__() not called"
@@ -654,15 +665,23 @@
         self._daemonic = daemonic
 
     def isDaemon(self):
+        warnings.warn("isDaemon() is deprecated in favor of the " \
+                      "Thread.daemon property", DeprecationWarning)
         return self.daemon
 
     def setDaemon(self, daemonic):
+        warnings.warn("setDaemon() is deprecated in favor of the " \
+                      "Thread.daemon property", DeprecationWarning)
         self.daemon = daemonic
 
     def getName(self):
+        warnings.warn("getName() is deprecated in favor of the " \
+                      "Thread.name property", DeprecationWarning)
         return self.name
 
     def setName(self, name):
+        warnings.warn("setName() is deprecated in favor of the " \
+                      "Thread.name property", DeprecationWarning)
         self.name = name
 
 # The timer class was contributed by Itamar Shtull-Trauring
@@ -771,12 +790,21 @@
         ##print "current_thread(): no current thread for", _get_ident()
         return _DummyThread()
 
+def currentThread():
+    warnings.warn("currentThread() is deprecated in favor of current_thread()",
+                  DeprecationWarning)
+
 def active_count():
     _active_limbo_lock.acquire()
     count = len(_active) + len(_limbo)
     _active_limbo_lock.release()
     return count
 
+def activeCount():
+    warnings.warn("activeCount() is deprecated in favor of active_count()",
+                  DeprecationWarning)
+    return active_count()
+
 def enumerate():
     _active_limbo_lock.acquire()
     active = list(_active.values()) + list(_limbo.values())
