Use string.ascii_letters instead of string.letters (SF bug #226706).
diff --git a/Demo/pdist/rcslib.py b/Demo/pdist/rcslib.py
index 5e79247..6d2e313 100755
--- a/Demo/pdist/rcslib.py
+++ b/Demo/pdist/rcslib.py
@@ -33,7 +33,7 @@
     """
 
     # Characters allowed in work file names
-    okchars = string.letters + string.digits + '-_=+.'
+    okchars = string.ascii_letters + string.digits + '-_=+'
 
     def __init__(self):
         """Constructor."""
diff --git a/Lib/Cookie.py b/Lib/Cookie.py
index dd116b7..3fc2ffc 100644
--- a/Lib/Cookie.py
+++ b/Lib/Cookie.py
@@ -249,7 +249,7 @@
 #       _LegalChars       is the list of chars which don't require "'s
 #       _Translator       hash-table for fast quoting
 #
-_LegalChars       = string.letters + string.digits + "!#$%&'*+-.^_`|~"
+_LegalChars       = string.ascii_letters + string.digits + "!#$%&'*+-.^_`|~"
 _Translator       = {
     '\000' : '\\000',  '\001' : '\\001',  '\002' : '\\002',
     '\003' : '\\003',  '\004' : '\\004',  '\005' : '\\005',
diff --git a/Lib/cmd.py b/Lib/cmd.py
index 10c11a2..eacd498 100644
--- a/Lib/cmd.py
+++ b/Lib/cmd.py
@@ -40,7 +40,7 @@
 __all__ = ["Cmd"]
 
 PROMPT = '(Cmd) '
-IDENTCHARS = string.letters + string.digits + '_'
+IDENTCHARS = string.ascii_letters + string.digits + '_'
 
 class Cmd:
     prompt = PROMPT
diff --git a/Lib/dospath.py b/Lib/dospath.py
index ed35d59..958f9f6 100644
--- a/Lib/dospath.py
+++ b/Lib/dospath.py
@@ -241,7 +241,7 @@
     if '$' not in path:
         return path
     import string
-    varchars = string.letters + string.digits + '_-'
+    varchars = string.ascii_letters + string.digits + "_-"
     res = ''
     index = 0
     pathlen = len(path)
diff --git a/Lib/lib-old/codehack.py b/Lib/lib-old/codehack.py
index 52ac6be..248205b 100644
--- a/Lib/lib-old/codehack.py
+++ b/Lib/lib-old/codehack.py
@@ -31,7 +31,7 @@
 # Because this is a pretty expensive hack, a cache is kept.
 
 SET_LINENO = 127 # The opcode (see "opcode.h" in the Python source)
-identchars = string.letters + string.digits + '_' # Identifier characters
+identchars = string.ascii_letters + string.digits + '_' # Identifier characters
 
 _namecache = {} # The cache
 
diff --git a/Lib/ntpath.py b/Lib/ntpath.py
index 13de59b..d81e8fb 100644
--- a/Lib/ntpath.py
+++ b/Lib/ntpath.py
@@ -334,7 +334,7 @@
     if '$' not in path:
         return path
     import string
-    varchars = string.letters + string.digits + '_-'
+    varchars = string.ascii_letters + string.digits + '_-'
     res = ''
     index = 0
     pathlen = len(path)
diff --git a/Lib/plat-riscos/riscospath.py b/Lib/plat-riscos/riscospath.py
index d55a8b8..32f39ba 100644
--- a/Lib/plat-riscos/riscospath.py
+++ b/Lib/plat-riscos/riscospath.py
@@ -62,7 +62,7 @@
         s= q # find end of main FS name, not including special field
     else:
         for c in p[dash:s]:
-            if c not in string.letters:
+            if c not in string.ascii_letters:
                 q= 0
                 break # disallow invalid non-special-field characters in FS name
     r= q
diff --git a/Lib/test/test_mimetools.py b/Lib/test/test_mimetools.py
index 4ee11a1..0300714 100644
--- a/Lib/test/test_mimetools.py
+++ b/Lib/test/test_mimetools.py
@@ -2,7 +2,7 @@
 import mimetools
 
 import string,StringIO
-start = string.letters + "=" + string.digits + "\n"
+start = string.ascii_letters + "=" + string.digits + "\n"
 for enc in ['7bit','8bit','base64','quoted-printable']:
     print enc,
     i = StringIO.StringIO(start)
diff --git a/Lib/tokenize.py b/Lib/tokenize.py
index cbe4552..33c5e41 100644
--- a/Lib/tokenize.py
+++ b/Lib/tokenize.py
@@ -133,7 +133,7 @@
 
 def generate_tokens(readline):
     lnum = parenlev = continued = 0
-    namechars, numchars = string.letters + '_', string.digits
+    namechars, numchars = string.ascii_letters + '_', '0123456789'
     contstr, needcont = '', 0
     contline = None
     indents = [0]
diff --git a/Mac/Tools/IDE/PyEdit.py b/Mac/Tools/IDE/PyEdit.py
index 10f583f..d8539c1 100644
--- a/Mac/Tools/IDE/PyEdit.py
+++ b/Mac/Tools/IDE/PyEdit.py
@@ -25,8 +25,7 @@
 	haveThreading = Wthreading.haveThreading
 
 _scriptuntitledcounter = 1
-# _wordchars = string.letters + string.digits + "_"
-_wordchars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_'
+_wordchars = string.ascii_letters + string.digits + "_"
 
 
 runButtonLabels = ["Run all", "Stop!"]
diff --git a/Mac/scripts/gensuitemodule.py b/Mac/scripts/gensuitemodule.py
index b68def7..6549ed2 100644
--- a/Mac/scripts/gensuitemodule.py
+++ b/Mac/scripts/gensuitemodule.py
@@ -825,7 +825,7 @@
 	if not str:
 		return "_empty_ae_name"
 	rv = ''
-	ok = string.letters  + '_'
+	ok = string.ascii_letters + '_'
 	ok2 = ok + string.digits
 	for c in str:
 		if c in ok:
diff --git a/Tools/idle/AutoExpand.py b/Tools/idle/AutoExpand.py
index 09f34b3..40d39f3 100644
--- a/Tools/idle/AutoExpand.py
+++ b/Tools/idle/AutoExpand.py
@@ -21,7 +21,7 @@
          ]),
     ]
 
-    wordchars = string.letters + string.digits + "_"
+    wordchars = string.ascii_letters + string.digits + "_"
 
     def __init__(self, editwin):
         self.text = editwin.text
diff --git a/Tools/idle/UndoDelegator.py b/Tools/idle/UndoDelegator.py
index ec7af81..3ef14c3 100644
--- a/Tools/idle/UndoDelegator.py
+++ b/Tools/idle/UndoDelegator.py
@@ -251,7 +251,7 @@
         self.chars = self.chars + cmd.chars
         return 1
 
-    alphanumeric = string.letters + string.digits + "_"
+    alphanumeric = string.ascii_letters + string.digits + "_"
 
     def classify(self, c):
         if c in self.alphanumeric:
diff --git a/Tools/scripts/fixheader.py b/Tools/scripts/fixheader.py
index 9b65a44..ba2e0c5 100755
--- a/Tools/scripts/fixheader.py
+++ b/Tools/scripts/fixheader.py
@@ -29,7 +29,7 @@
     sys.stderr.write('Processing %s ...\n' % file)
     magic = 'Py_'
     for c in file:
-        if c in string.letters + string.digits:
+        if c in string.ascii_letters + string.digits:
             magic = magic + string.upper(c)
         else: magic = magic + '_'
     sys.stdout = f
diff --git a/Tools/scripts/texi2html.py b/Tools/scripts/texi2html.py
index dfe96db..f3e7fb3 100755
--- a/Tools/scripts/texi2html.py
+++ b/Tools/scripts/texi2html.py
@@ -422,7 +422,7 @@
                 # Cannot happen unless spprog is changed
                 raise RuntimeError, 'unexpected funny '+`c`
             start = i
-            while i < n and text[i] in string.letters: i = i+1
+            while i < n and text[i] in string.ascii_letters: i = i+1
             if i == start:
                 # @ plus non-letter: literal next character
                 i = i+1
@@ -1260,7 +1260,7 @@
         if self.itemindex: self.index(self.itemindex, args)
         if self.itemarg:
             if self.itemarg[0] == '@' and self.itemarg[1:2] and \
-                            self.itemarg[1] in string.letters:
+                            self.itemarg[1] in string.ascii_letters:
                 args = self.itemarg + '{' + args + '}'
             else:
                 # some other character, e.g. '-'
@@ -1524,7 +1524,7 @@
 
 
 # Characters that are perfectly safe in filenames and hyperlinks
-goodchars = string.letters + string.digits + '!@-=+.'
+goodchars = string.ascii_letters + string.digits + '!@-=+.'
 
 # Replace characters that aren't perfectly safe by dashes
 # Underscores are bad since Cern HTTPD treats them as delimiters for