diff --git a/Lib/threading.py b/Lib/threading.py
index 751b692..b6f0375 100644
--- a/Lib/threading.py
+++ b/Lib/threading.py
@@ -9,6 +9,8 @@
     raise
 
 import warnings
+
+from functools import wraps
 from time import time as _time, sleep as _sleep
 from traceback import format_exc as _format_exc
 from collections import deque
@@ -31,6 +33,18 @@
                         module='threading', message='sys.exc_clear')
 
 
+def _old_api(callable, old_name):
+    if not _sys.py3kwarning:
+        return callable
+    @wraps(callable)
+    def old(*args, **kwargs):
+        warnings.warnpy3k("In 3.x, {0} is renamed to {1}."
+                          .format(old_name, callable.__name__),
+                          stacklevel=3)
+        return callable(*args, **kwargs)
+    old.__name__ = old_name
+    return old
+
 # Debug support (adapted from ihooks.py).
 # All the major classes here derive from _Verbose.  We force that to
 # be a new-style class so that all the major classes here are new-style.
@@ -274,6 +288,8 @@
     def notify_all(self):
         self.notify(len(self.__waiters))
 
+    notifyAll = _old_api(notify_all, "notifyAll")
+
 
 def Semaphore(*args, **kwargs):
     return _Semaphore(*args, **kwargs)
@@ -353,6 +369,8 @@
     def is_set(self):
         return self.__flag
 
+    isSet = _old_api(is_set, "isSet")
+
     def set(self):
         self.__cond.acquire()
         try:
@@ -635,10 +653,14 @@
         assert self.__initialized, "Thread.__init__() not called"
         return self.__name
 
+    getName = _old_api(get_name, "getName")
+
     def set_name(self, name):
         assert self.__initialized, "Thread.__init__() not called"
         self.__name = str(name)
 
+    setName = _old_api(set_name, "setName")
+
     def get_ident(self):
         assert self.__initialized, "Thread.__init__() not called"
         return self.__ident
@@ -647,10 +669,14 @@
         assert self.__initialized, "Thread.__init__() not called"
         return self.__started.is_set() and not self.__stopped
 
+    isAlive = _old_api(is_alive, "isAlive")
+
     def is_daemon(self):
         assert self.__initialized, "Thread.__init__() not called"
         return self.__daemonic
 
+    isDaemon = _old_api(is_daemon, "isDaemon")
+
     def set_daemon(self, daemonic):
         if not self.__initialized:
             raise RuntimeError("Thread.__init__() not called")
@@ -658,6 +684,8 @@
             raise RuntimeError("cannot set daemon status of active thread");
         self.__daemonic = daemonic
 
+    setDaemon = _old_api(set_daemon, "setDaemon")
+
 # The timer class was contributed by Itamar Shtull-Trauring
 
 def Timer(*args, **kwargs):
@@ -763,12 +791,16 @@
         ##print "current_thread(): no current thread for", _get_ident()
         return _DummyThread()
 
+currentThread = _old_api(current_thread, "currentThread")
+
 def active_count():
     _active_limbo_lock.acquire()
     count = len(_active) + len(_limbo)
     _active_limbo_lock.release()
     return count
 
+activeCount = _old_api(active_count, "activeCount")
+
 def enumerate():
     _active_limbo_lock.acquire()
     active = _active.values() + _limbo.values()
