diff --git a/Lib/distutils/cmd.py b/Lib/distutils/cmd.py
index ce44829..cec4bff 100644
--- a/Lib/distutils/cmd.py
+++ b/Lib/distutils/cmd.py
@@ -9,7 +9,7 @@
 
 __revision__ = "$Id$"
 
-import sys, os, string, re
+import sys, os, re
 from types import *
 from distutils.errors import *
 from distutils import util, dir_util, file_util, archive_util, dep_util
@@ -161,7 +161,7 @@
         print indent + header
         indent = indent + "  "
         for (option, _, _) in self.user_options:
-            option = string.translate(option, longopt_xlate)
+            option = option.translate(longopt_xlate)
             if option[-1] == "=":
                 option = option[:-1]
             value = getattr(self, option)
@@ -421,7 +421,7 @@
         """
         if exec_msg is None:
             exec_msg = "generating %s from %s" % \
-                       (outfile, string.join(infiles, ', '))
+                       (outfile, ', '.join(infiles))
         if skip_msg is None:
             skip_msg = "skipping %s (inputs unchanged)" % outfile
         
diff --git a/Lib/lib-old/codehack.py b/Lib/lib-old/codehack.py
index 6453db5..52ac6be 100644
--- a/Lib/lib-old/codehack.py
+++ b/Lib/lib-old/codehack.py
@@ -48,7 +48,7 @@
 	if ord(code[0]) == SET_LINENO:
 		lineno = ord(code[1]) | ord(code[2]) << 8
 		line = linecache.getline(filename, lineno)
-		words = string.split(line)
+		words = line.split()
 		if len(words) >= 2 and words[0] in ('def', 'class'):
 			name = words[1]
 			for i in range(len(name)):
diff --git a/Lib/lib-old/grep.py b/Lib/lib-old/grep.py
index 6f74fd3..6f66081 100644
--- a/Lib/lib-old/grep.py
+++ b/Lib/lib-old/grep.py
@@ -2,7 +2,6 @@
 
 import regex
 from regex_syntax import *
-import string
 
 opt_show_where = 0
 opt_show_filename = 0
@@ -59,7 +58,7 @@
 def showline(filename, lineno, line, prog):
 	if line[-1:] == '\n': line = line[:-1]
 	if opt_show_lineno:
-		prefix = string.rjust(`lineno`, 3) + ': '
+		prefix = `lineno`.rjust(, 3) + ': '
 	else:
 		prefix = ''
 	if opt_show_filename:
diff --git a/Lib/lib-old/ni.py b/Lib/lib-old/ni.py
index 4a06f59..074f989 100644
--- a/Lib/lib-old/ni.py
+++ b/Lib/lib-old/ni.py
@@ -163,7 +163,6 @@
 
 
 import imp
-import string
 import sys
 import __builtin__
 
@@ -206,7 +205,7 @@
     def load_dynamic(self, name, stuff):
         file, filename, (suff, mode, type) = stuff
         # Hack around restriction in imp.load_dynamic()
-        i = string.rfind(name, '.')
+        i = name.rfind('.')
         tail = name[i+1:]
         if sys.modules.has_key(tail):
             save = sys.modules[tail]
@@ -241,7 +240,7 @@
     def set_parent(self, m):
         name = m.__name__
         if '.' in name:
-            name = name[:string.rfind(name, '.')]
+            name = name[:name.rfind('.')]
         else:
             name = ''
         m.__ = sys.modules[name]
@@ -250,7 +249,7 @@
         name = package.__name__
         package.__domain__ = domain = [name]
         while '.' in name:
-            name = name[:string.rfind(name, '.')]
+            name = name[:name.rfind('.')]
             domain.append(name)
         if name:
             domain.append('')
@@ -285,7 +284,7 @@
             if not name:
                 return self.finish(package, p, '', fromlist)
             if '.' in name:
-                i = string.find(name, '.')
+                i = name.find('.')
                 name, tail = name[:i], name[i:]
             else:
                 tail = ''
@@ -293,7 +292,7 @@
             m = self.get1(mname)
             return self.finish(package, m, tail, fromlist)
         if '.' in name:
-            i = string.find(name, '.')
+            i = name.find('.')
             name, tail = name[:i], name[i:]
         else:
             tail = ''
@@ -312,7 +311,7 @@
             yname, tail = yname + tail, ''
             m = self.get1(yname)
         while tail:
-            i = string.find(tail, '.', 1)
+            i = tail.find('.', 1)
             if i > 0:
                 head, tail = tail[:i], tail[i:]
             else:
@@ -351,7 +350,7 @@
         if sys.modules.has_key(name):
             return sys.modules[name]
         if '.' in name:
-            i = string.rfind(name, '.')
+            i = name.rfind('.')
             head, tail = name[:i], name[i+1:]
         else:
             head, tail = '', name
@@ -367,7 +366,7 @@
     def reload(self, module):
         name = module.__name__
         if '.' in name:
-            i = string.rfind(name, '.')
+            i = name.rfind('.')
             head, tail = name[:i], name[i+1:]
             path = sys.modules[head].__path__
         else:
diff --git a/Lib/lib-old/packmail.py b/Lib/lib-old/packmail.py
index 2a5aa75..8d247bc 100644
--- a/Lib/lib-old/packmail.py
+++ b/Lib/lib-old/packmail.py
@@ -5,7 +5,6 @@
 
 import os
 from stat import ST_MTIME
-import string
 
 # Print help
 def help():
@@ -103,7 +102,7 @@
 		packtree(outfp, subdirname)
 
 def unixfix(name):
-	comps = string.splitfields(name, os.sep)
+	comps = name.splitfields(os.sep)
 	res = ''
 	for comp in comps:
 		if comp:
diff --git a/Lib/lib-old/tb.py b/Lib/lib-old/tb.py
index abe4824..57851aa 100644
--- a/Lib/lib-old/tb.py
+++ b/Lib/lib-old/tb.py
@@ -5,7 +5,6 @@
 import sys
 import os
 from stat import *
-import string
 import linecache
 
 def br(): browser(sys.last_traceback)
@@ -35,7 +34,7 @@
 		except EOFError:
 			print '\n[EOF]'
 			break
-		cmd = string.strip(line)
+		cmd = line.strip()
 		if cmd:
 			if cmd == 'quit':
 				break
@@ -62,8 +61,8 @@
 	last = lineno
 	first = max(1, last-10)
 	for i in range(first, last+1):
-		if i == lineno: prefix = '***' + string.rjust(`i`, 4) + ':'
-		else: prefix = string.rjust(`i`, 7) + ':'
+		if i == lineno: prefix = '***' + `i`.rjust(4) + ':'
+		else: prefix = `i`.rjust(7) + ':'
 		line = linecache.getline(filename, i)
 		if line[-1:] == '\n': line = line[:-1]
 		print prefix + line
@@ -115,14 +114,14 @@
 	info = '"' + filename + '"(' + `lineno` + ')'
 	line = linecache.getline(filename, lineno)
 	if line:
-		info = info + ': ' + string.strip(line)
+		info = info + ': ' + line.strip()
 	print info
 
 def printsymbols(d):
 	keys = d.keys()
 	keys.sort()
 	for name in keys:
-		print '  ' + string.ljust(name, 12) + ':',
+		print '  ' + name.ljust(12) + ':',
 		printobject(d[name], 4)
 		print
 
diff --git a/Lib/lib-tk/Tkinter.py b/Lib/lib-tk/Tkinter.py
index c4e78a2..da436c1 100644
--- a/Lib/lib-tk/Tkinter.py
+++ b/Lib/lib-tk/Tkinter.py
@@ -37,14 +37,13 @@
 TclError = _tkinter.TclError
 from types import *
 from Tkconstants import *
-import string; _string = string; del string
 try:
     import MacOS; _MacOS = MacOS; del MacOS
 except ImportError:
     _MacOS = None
 
-TkVersion = _string.atof(_tkinter.TK_VERSION)
-TclVersion = _string.atof(_tkinter.TCL_VERSION)
+TkVersion = float(_tkinter.TK_VERSION)
+TclVersion = float(_tkinter.TCL_VERSION)
 
 READABLE = _tkinter.READABLE
 WRITABLE = _tkinter.WRITABLE
@@ -782,7 +781,7 @@
         return t[:1] + tuple(map(self.__winfo_getint, t[1:]))
     def __winfo_getint(self, x):
         """Internal function."""
-        return _string.atoi(x, 0)
+        return int(x, 0)
     def winfo_vrootheight(self):
         """Return the height of the virtual root window associated with this
         widget in pixels. If there is no virtual root window return the
@@ -850,7 +849,7 @@
                    %
                    (add and '+' or '',
                 funcid,
-                _string.join(self._subst_format)))
+                " ".join(self._subst_format)))
             self.tk.call(what + (sequence, cmd))
             return funcid
         elif sequence:
@@ -972,9 +971,8 @@
         if name[0] == '.':
             w = w._root()
             name = name[1:]
-        find = _string.find
         while name:
-            i = find(name, '.')
+            i = name.find('.')
             if i >= 0:
                 name, tail = name[:i], name[i+1:]
             else:
diff --git a/Lib/lib-tk/tkFont.py b/Lib/lib-tk/tkFont.py
index a41e368..169c529 100644
--- a/Lib/lib-tk/tkFont.py
+++ b/Lib/lib-tk/tkFont.py
@@ -18,7 +18,6 @@
 __version__ = "0.9"
 
 import Tkinter
-import string
 
 # weight/slant
 NORMAL = "normal"
@@ -120,7 +119,7 @@
 
     def measure(self, text):
         "Return text width"
-        return string.atoi(self._call("font", "measure", self.name, text))
+        return int(self._call("font", "measure", self.name, text))
 
     def metrics(self, *options):
         """Return font metrics.
@@ -129,14 +128,14 @@
         using this font before calling this method."""
 
         if options:
-            return string.atoi(
+            return int(
                 self._call("font", "metrics", self.name, self._get(options))
                 )
         else:
             res = self._split(self._call("font", "metrics", self.name))
             options = {}
             for i in range(0, len(res), 2):
-                options[res[i][1:]] = string.atoi(res[i+1])
+                options[res[i][1:]] = int(res[i+1])
             return options
 
 def families(root=None):
diff --git a/Lib/lib-tk/tkSimpleDialog.py b/Lib/lib-tk/tkSimpleDialog.py
index 0dc5c84..15ff544 100644
--- a/Lib/lib-tk/tkSimpleDialog.py
+++ b/Lib/lib-tk/tkSimpleDialog.py
@@ -157,8 +157,6 @@
 # --------------------------------------------------------------------
 # convenience dialogues
 
-import string
-
 class _QueryDialog(Dialog):
 
     def __init__(self, title, prompt,
@@ -236,7 +234,7 @@
 class _QueryInteger(_QueryDialog):
     errormessage = "Not an integer."
     def getresult(self):
-        return string.atoi(self.entry.get())
+        return int(self.entry.get())
 
 def askinteger(title, prompt, **kw):
     '''get an integer from the user
@@ -255,7 +253,7 @@
 class _QueryFloat(_QueryDialog):
     errormessage = "Not a floating point value."
     def getresult(self):
-        return string.atof(self.entry.get())
+        return float(self.entry.get())
 
 def askfloat(title, prompt, **kw):
     '''get a float from the user
diff --git a/Lib/sre_parse.py b/Lib/sre_parse.py
index 7c6eb9f..635605d 100644
--- a/Lib/sre_parse.py
+++ b/Lib/sre_parse.py
@@ -10,7 +10,7 @@
 
 # XXX: show string offset and offending character for all errors
 
-import string, sys
+import sys
 
 from sre_constants import *
 
@@ -60,12 +60,6 @@
     "u": SRE_FLAG_UNICODE,
 }
 
-try:
-    int("10", 8)
-    atoi = int
-except TypeError:
-    atoi = string.atoi
-
 class Pattern:
     # master pattern object.  keeps track of global attributes
     def __init__(self):
@@ -222,7 +216,7 @@
 def _group(escape, groups):
     # check if the escape string represents a valid group
     try:
-        gid = atoi(escape[1:])
+        gid = int(escape[1:])
         if gid and gid < groups:
             return gid
     except ValueError:
@@ -245,13 +239,13 @@
             escape = escape[2:]
             if len(escape) != 2:
                 raise error, "bogus escape: %s" % repr("\\" + escape)
-            return LITERAL, atoi(escape, 16) & 0xff
+            return LITERAL, int(escape, 16) & 0xff
         elif str(escape[1:2]) in OCTDIGITS:
             # octal escape (up to three digits)
             while source.next in OCTDIGITS and len(escape) < 5:
                 escape = escape + source.get()
             escape = escape[1:]
-            return LITERAL, atoi(escape, 8) & 0xff
+            return LITERAL, int(escape, 8) & 0xff
         if len(escape) == 2:
             return LITERAL, ord(escape[1])
     except ValueError:
@@ -273,12 +267,12 @@
                 escape = escape + source.get()
             if len(escape) != 4:
                 raise ValueError
-            return LITERAL, atoi(escape[2:], 16) & 0xff
+            return LITERAL, int(escape[2:], 16) & 0xff
         elif escape[1:2] == "0":
             # octal escape
             while source.next in OCTDIGITS and len(escape) < 4:
                 escape = escape + source.get()
-            return LITERAL, atoi(escape[1:], 8) & 0xff
+            return LITERAL, int(escape[1:], 8) & 0xff
         elif escape[1:2] in DIGITS:
             # octal escape *or* decimal group reference (sigh)
             here = source.tell()
@@ -288,7 +282,7 @@
                     source.next in OCTDIGITS):
                     # got three octal digits; this is an octal escape
                     escape = escape + source.get()
-                    return LITERAL, atoi(escape[1:], 8) & 0xff
+                    return LITERAL, int(escape[1:], 8) & 0xff
             # got at least one decimal digit; this is a group reference
             group = _group(escape, state.groups)
             if group:
@@ -462,9 +456,9 @@
                     source.seek(here)
                     continue
                 if lo:
-                    min = atoi(lo)
+                    min = int(lo)
                 if hi:
-                    max = atoi(hi)
+                    max = int(hi)
                 if max < min:
                     raise error, "bad repeat interval"
             else:
@@ -652,7 +646,7 @@
                 if not name:
                     raise error, "bad group name"
                 try:
-                    index = atoi(name)
+                    index = int(name)
                 except ValueError:
                     if not isname(name):
                         raise error, "bad character in group name"
@@ -676,7 +670,7 @@
                         break
                 if not code:
                     this = this[1:]
-                    code = LITERAL, atoi(this[-6:], 8) & 0xff
+                    code = LITERAL, int(this[-6:], 8) & 0xff
                 a(code)
             else:
                 try:
@@ -705,4 +699,4 @@
             if s is None:
                 raise error, "empty group"
             a(s)
-    return string.join(p, sep)
+    return sep.join(p)
diff --git a/Lib/test/regrtest.py b/Lib/test/regrtest.py
index 60bc6c6..5866d43 100755
--- a/Lib/test/regrtest.py
+++ b/Lib/test/regrtest.py
@@ -32,7 +32,6 @@
 """
 
 import sys
-import string
 import os
 import getopt
 import traceback
@@ -106,7 +105,7 @@
         filename = os.path.join(gettempdir(), 'pynexttest')
         try:
             fp = open(filename, 'r')
-            next = string.strip(fp.read())
+            next = fp.read().strip()
             tests = [next]
             fp.close()
         except IOError:
@@ -163,10 +162,10 @@
             print "that passes in verbose mode may fail without it."
     if bad:
         print count(len(bad), "test"), "failed:",
-        print string.join(bad)
+        print " ".join(bad)
     if skipped and not quiet:
         print count(len(skipped), "test"), "skipped:",
-        print string.join(skipped)
+        print " ".join(skipped)
 
     if single:
         alltests = findtests(testdir, stdtests, nottests)
diff --git a/Lib/test/sortperf.py b/Lib/test/sortperf.py
index 34ed338..fd22194 100644
--- a/Lib/test/sortperf.py
+++ b/Lib/test/sortperf.py
@@ -112,16 +112,15 @@
     Extra arguments are used to seed the random generator.
 
     """
-    import string
     # default range (inclusive)
     k1 = 15
     k2 = 19
     if sys.argv[1:]:
         # one argument: single point
-        k1 = k2 = string.atoi(sys.argv[1])
+        k1 = k2 = int(sys.argv[1])
         if sys.argv[2:]:
             # two arguments: specify range
-            k2 = string.atoi(sys.argv[2])
+            k2 = int(sys.argv[2])
             if sys.argv[3:]:
                 # derive random seed from remaining arguments
                 x, y, z = 0, 0, 0
diff --git a/Lib/test/string_tests.py b/Lib/test/string_tests.py
index 2e912c8..a408ef3 100644
--- a/Lib/test/string_tests.py
+++ b/Lib/test/string_tests.py
@@ -44,8 +44,8 @@
     test('join', BadSeq2(), 'a b c')
 
     # try a few long ones
-    print string.join(['x' * 100] * 100, ':')
-    print string.join(('x' * 100,) * 100, ':')
+    print ":".join(['x' * 100] * 100)
+    print ":".join(('x' * 100,) * 100)
 
 
 def run_method_tests(test):
diff --git a/Lib/test/test_dospath.py b/Lib/test/test_dospath.py
index 08d32da..5b0fee5 100644
--- a/Lib/test/test_dospath.py
+++ b/Lib/test/test_dospath.py
@@ -1,11 +1,10 @@
 import dospath
-import string
 import os
 
 errors = 0
 
 def tester(fn, wantResult):
-    fn = string.replace(fn, "\\", "\\\\")
+    fn = fn.replace("\\", "\\\\")
     gotResult = eval(fn)
     if wantResult != gotResult:
         print "error!"
diff --git a/Lib/test/test_extcall.py b/Lib/test/test_extcall.py
index 10162aa..9e6da62 100644
--- a/Lib/test/test_extcall.py
+++ b/Lib/test/test_extcall.py
@@ -1,6 +1,5 @@
 from test_support import verify, verbose, TestFailed
 from UserList import UserList
-import string
 
 def sortdict(d):
     keys = d.keys()
@@ -195,7 +194,7 @@
                 if vararg: arglist.append('*' + vararg)
                 if kwarg: arglist.append('**' + kwarg)
                 decl = 'def %s(%s): print "ok %s", a, b, d, e, v, k' % (
-                    name, string.join(arglist, ', '), name)
+                    name, ', '.join(arglist), name)
                 exec(decl)
                 func = eval(name)
                 funcs.append(func)
diff --git a/Lib/test/test_imgfile.py b/Lib/test/test_imgfile.py
index 8eb330d..26f6186 100755
--- a/Lib/test/test_imgfile.py
+++ b/Lib/test/test_imgfile.py
@@ -30,7 +30,6 @@
 
     import sys
     import os
-    import string
 
     outputfile = '/tmp/deleteme'
 
@@ -47,9 +46,9 @@
         else: # ...or the full path of the module
             ourname = sys.modules[__name__].__file__
 
-        parts = string.splitfields(ourname, os.sep)
+        parts = ourname.split(os.sep)
         parts[-1] = name
-        name = string.joinfields(parts, os.sep)
+        name = os.sep.joinfields(parts)
         sizes = imgfile.getsizes(name)
     if verbose:
         print 'Opening test image: %s, sizes: %s' % (name, str(sizes))
diff --git a/Lib/test/test_mmap.py b/Lib/test/test_mmap.py
index 4673913..8066285 100644
--- a/Lib/test/test_mmap.py
+++ b/Lib/test/test_mmap.py
@@ -1,6 +1,6 @@
 from test_support import verify
 import mmap
-import string, os, re, sys
+import os, re, sys
 
 PAGESIZE = mmap.PAGESIZE
 
@@ -21,8 +21,8 @@
     # Simple sanity checks
 
     print type(m)  # SF bug 128713:  segfaulted on Linux
-    print '  Position of foo:', string.find(m, 'foo') / float(PAGESIZE), 'pages'
-    verify(string.find(m, 'foo') == PAGESIZE)
+    print '  Position of foo:', m.find('foo') / float(PAGESIZE), 'pages'
+    verify(m.find('foo') == PAGESIZE)
 
     print '  Length of file:', len(m) / float(PAGESIZE), 'pages'
     verify(len(m) == 2*PAGESIZE)
diff --git a/Lib/test/test_ntpath.py b/Lib/test/test_ntpath.py
index 1b49c03..7867fd9 100644
--- a/Lib/test/test_ntpath.py
+++ b/Lib/test/test_ntpath.py
@@ -1,11 +1,10 @@
 import ntpath
-import string
 import os
 
 errors = 0
 
 def tester(fn, wantResult):
-    fn = string.replace(fn, "\\", "\\\\")
+    fn = fn.replace("\\", "\\\\")
     gotResult = eval(fn)
     if wantResult != gotResult:
         print "error!"
diff --git a/Lib/test/test_pkg.py b/Lib/test/test_pkg.py
index d915e10..f699af40 100644
--- a/Lib/test/test_pkg.py
+++ b/Lib/test/test_pkg.py
@@ -1,6 +1,6 @@
 # Test packages (dotted-name import)
 
-import sys, os, string, tempfile, traceback
+import sys, os, tempfile, traceback
 from os import mkdir, rmdir             # Can't test if these fail
 del mkdir, rmdir
 from test_support import verify, verbose, TestFailed
@@ -10,7 +10,7 @@
 def mkhier(root, descr):
     mkdir(root)
     for name, contents in descr:
-        comps = string.split(name)
+        comps = name.split()
         fullname = root
         for c in comps:
             fullname = os.path.join(fullname, c)
