diff --git a/Lib/curses/ascii.py b/Lib/curses/ascii.py
index 3c21169..b8ae6f3 100644
--- a/Lib/curses/ascii.py
+++ b/Lib/curses/ascii.py
@@ -1,41 +1,41 @@
 """Constants and membership tests for ASCII characters"""
 
-NUL	= 0x00	# ^@
-SOH	= 0x01	# ^A
-STX	= 0x02	# ^B
-ETX	= 0x03	# ^C
-EOT	= 0x04	# ^D
-ENQ	= 0x05	# ^E
-ACK	= 0x06	# ^F
-BEL	= 0x07	# ^G
-BS	= 0x08	# ^H
-TAB	= 0x09	# ^I
-HT	= 0x09	# ^I
-LF	= 0x0a	# ^J
-NL	= 0x0a	# ^J
-VT	= 0x0b	# ^K
-FF	= 0x0c	# ^L
-CR	= 0x0d	# ^M
-SO	= 0x0e	# ^N
-SI	= 0x0f	# ^O
-DLE	= 0x10	# ^P
-DC1	= 0x11	# ^Q
-DC2	= 0x12	# ^R
-DC3	= 0x13	# ^S
-DC4	= 0x14	# ^T
-NAK	= 0x15	# ^U
-SYN	= 0x16	# ^V
-ETB	= 0x17	# ^W
-CAN	= 0x18	# ^X
-EM	= 0x19	# ^Y
-SUB	= 0x1a	# ^Z
-ESC	= 0x1b	# ^[
-FS	= 0x1c	# ^\
-GS	= 0x1d	# ^]
-RS	= 0x1e	# ^^
-US	= 0x1f	# ^_
-SP	= 0x20	# space
-DEL	= 0x7f	# delete
+NUL     = 0x00  # ^@
+SOH     = 0x01  # ^A
+STX     = 0x02  # ^B
+ETX     = 0x03  # ^C
+EOT     = 0x04  # ^D
+ENQ     = 0x05  # ^E
+ACK     = 0x06  # ^F
+BEL     = 0x07  # ^G
+BS      = 0x08  # ^H
+TAB     = 0x09  # ^I
+HT      = 0x09  # ^I
+LF      = 0x0a  # ^J
+NL      = 0x0a  # ^J
+VT      = 0x0b  # ^K
+FF      = 0x0c  # ^L
+CR      = 0x0d  # ^M
+SO      = 0x0e  # ^N
+SI      = 0x0f  # ^O
+DLE     = 0x10  # ^P
+DC1     = 0x11  # ^Q
+DC2     = 0x12  # ^R
+DC3     = 0x13  # ^S
+DC4     = 0x14  # ^T
+NAK     = 0x15  # ^U
+SYN     = 0x16  # ^V
+ETB     = 0x17  # ^W
+CAN     = 0x18  # ^X
+EM      = 0x19  # ^Y
+SUB     = 0x1a  # ^Z
+ESC     = 0x1b  # ^[
+FS      = 0x1c  # ^\
+GS      = 0x1d  # ^]
+RS      = 0x1e  # ^^
+US      = 0x1f  # ^_
+SP      = 0x20  # space
+DEL     = 0x7f  # delete
 
 controlnames = [
 "NUL", "SOH", "STX", "ETX", "EOT", "ENQ", "ACK", "BEL",
@@ -53,7 +53,7 @@
 
 def isalnum(c): return isalpha(c) or isdigit(c)
 def isalpha(c): return isupper(c) or islower(c)
-def isascii(c): return _ctoi(c) <= 127		# ?
+def isascii(c): return _ctoi(c) <= 127          # ?
 def isblank(c): return _ctoi(c) in (8,32)
 def iscntrl(c): return _ctoi(c) <= 31
 def isdigit(c): return _ctoi(c) >= 48 and _ctoi(c) <= 57
@@ -97,4 +97,3 @@
     if bits & 0x80:
         return "!" + rep
     return rep
-
diff --git a/Lib/curses/textpad.py b/Lib/curses/textpad.py
index ece425f..bfc270a 100644
--- a/Lib/curses/textpad.py
+++ b/Lib/curses/textpad.py
@@ -71,7 +71,7 @@
                     self.win.addch(ch)
                 except curses.error:
                     pass
-        elif ch == ascii.SOH:				# ^a
+        elif ch == ascii.SOH:                           # ^a
             self.win.move(y, 0)
         elif ch in (ascii.STX,curses.KEY_LEFT, ascii.BS,curses.KEY_BACKSPACE):
             if x > 0:
@@ -84,48 +84,48 @@
                 self.win.move(y-1, self.maxx)
             if ch in (ascii.BS, curses.KEY_BACKSPACE):
                 self.win.delch()
-        elif ch == ascii.EOT:				# ^d
+        elif ch == ascii.EOT:                           # ^d
             self.win.delch()
-        elif ch == ascii.ENQ:				# ^e
+        elif ch == ascii.ENQ:                           # ^e
             if self.stripspaces:
                 self.win.move(y, self._end_of_line(y))
             else:
                 self.win.move(y, self.maxx)
-        elif ch in (ascii.ACK, curses.KEY_RIGHT):	# ^f
+        elif ch in (ascii.ACK, curses.KEY_RIGHT):       # ^f
             if x < self.maxx:
                 self.win.move(y, x+1)
             elif y == self.maxy:
                 pass
             else:
                 self.win.move(y+1, 0)
-        elif ch == ascii.BEL:				# ^g
+        elif ch == ascii.BEL:                           # ^g
             return 0
-        elif ch == ascii.NL:				# ^j
+        elif ch == ascii.NL:                            # ^j
             if self.maxy == 0:
                 return 0
             elif y < self.maxy:
                 self.win.move(y+1, 0)
-        elif ch == ascii.VT:				# ^k
+        elif ch == ascii.VT:                            # ^k
             if x == 0 and self._end_of_line(y) == 0:
                 self.win.deleteln()
             else:
                 self.win.clrtoeol()
-        elif ch == ascii.FF:				# ^l
+        elif ch == ascii.FF:                            # ^l
             self.win.refresh()
-        elif ch in (ascii.SO, curses.KEY_DOWN):		# ^n
+        elif ch in (ascii.SO, curses.KEY_DOWN):         # ^n
             if y < self.maxy:
                 self.win.move(y+1, x)
                 if x > self._end_of_line(y+1):
                     self.win.move(y+1, self._end_of_line(y+1))
-        elif ch == ascii.SI:				# ^o
+        elif ch == ascii.SI:                            # ^o
             self.win.insertln()
-        elif ch in (ascii.DLE, curses.KEY_UP):		# ^p
+        elif ch in (ascii.DLE, curses.KEY_UP):          # ^p
             if y > 0:
                 self.win.move(y-1, x)
                 if x > self._end_of_line(y-1):
                     self.win.move(y-1, self._end_of_line(y-1))
         return 1
-        
+
     def gather(self):
         "Collect and return the contents of the window."
         result = ""
diff --git a/Lib/curses/wrapper.py b/Lib/curses/wrapper.py
index 51fb724..e725c5a 100644
--- a/Lib/curses/wrapper.py
+++ b/Lib/curses/wrapper.py
@@ -16,20 +16,20 @@
     as its first argument, followed by any other arguments passed to
     wrapper().
     """
-    
+
     res = None
     try:
-	# Initialize curses
+        # Initialize curses
         stdscr=curses.initscr()
-        
-	# Turn off echoing of keys, and enter cbreak mode,
-	# where no buffering is performed on keyboard input
+
+        # Turn off echoing of keys, and enter cbreak mode,
+        # where no buffering is performed on keyboard input
         curses.noecho()
         curses.cbreak()
 
-	# In keypad mode, escape sequences for special keys
-	# (like the cursor keys) will be interpreted and
-	# a special value like curses.KEY_LEFT will be returned
+        # In keypad mode, escape sequences for special keys
+        # (like the cursor keys) will be interpreted and
+        # a special value like curses.KEY_LEFT will be returned
         stdscr.keypad(1)
 
         # Start color, too.  Harmless if the terminal doesn't have
@@ -43,21 +43,21 @@
 
         res = apply(func, (stdscr,) + rest)
     except:
-	# In the event of an error, restore the terminal
-	# to a sane state.
+        # In the event of an error, restore the terminal
+        # to a sane state.
         stdscr.keypad(0)
         curses.echo()
         curses.nocbreak()
         curses.endwin()
-        
+
         # Pass the exception upwards
         (exc_type, exc_value, exc_traceback) = sys.exc_info()
         raise exc_type, exc_value, exc_traceback
     else:
-	# Set everything back to normal
+        # Set everything back to normal
         stdscr.keypad(0)
         curses.echo()
         curses.nocbreak()
-        curses.endwin()		 # Terminate curses
+        curses.endwin()          # Terminate curses
 
         return res
diff --git a/Lib/distutils/emxccompiler.py b/Lib/distutils/emxccompiler.py
index 9cd9600..7c3ad02 100644
--- a/Lib/distutils/emxccompiler.py
+++ b/Lib/distutils/emxccompiler.py
@@ -16,7 +16,7 @@
 #   of Python is only distributed with threads enabled.
 #
 # tested configurations:
-#   
+#
 # * EMX gcc 2.81/EMX 0.9d fix03
 
 # created 2001/5/7, Andrew MacIntyre, from Rene Liebscher's cywinccompiler.py
@@ -40,7 +40,7 @@
     shared_lib_format = "%s%s"
     res_extension = ".res"      # compiled resource file
     exe_extension = ".exe"
-   
+
     def __init__ (self,
                   verbose=0,
                   dry_run=0,
@@ -56,11 +56,11 @@
                 "Python's pyconfig.h doesn't seem to support your compiler.  " +
                 ("Reason: %s." % details) +
                 "Compiling may fail because of undefined preprocessor macros.")
-        
+
         (self.gcc_version, self.ld_version) = \
             get_versions()
         self.debug_print(self.compiler_type + ": gcc %s, ld %s\n" %
-                         (self.gcc_version, 
+                         (self.gcc_version,
                           self.ld_version) )
 
         # Hard-code GCC because that's what this is all about.
@@ -73,7 +73,7 @@
         # want the gcc library statically linked (so that we don't have
         # to distribute a version dependent on the compiler we have)
         self.dll_libraries=["gcc"]
-        
+
     # __init__ ()
 
     def _compile(self, obj, src, ext, cc_args, extra_postargs, pp_opts):
@@ -83,7 +83,7 @@
                 self.spawn(["rc", "-r", src])
             except DistutilsExecError, msg:
                 raise CompileError, msg
-        else: # for other files use the C-compiler 
+        else: # for other files use the C-compiler
             try:
                 self.spawn(self.compiler_so + cc_args + [src, '-o', obj] +
                            extra_postargs)
@@ -103,12 +103,12 @@
               extra_preargs=None,
               extra_postargs=None,
               build_temp=None):
-        
+
         # use separate copies, so we can modify the lists
         extra_preargs = copy.copy(extra_preargs or [])
         libraries = copy.copy(libraries or [])
         objects = copy.copy(objects or [])
-                
+
         # Additional libraries
         libraries.extend(self.dll_libraries)
 
@@ -118,10 +118,10 @@
             (target_desc != self.EXECUTABLE)):
             # (The linker doesn't do anything if output is up-to-date.
             # So it would probably better to check if we really need this,
-            # but for this we had to insert some unchanged parts of 
-            # UnixCCompiler, and this is not what we want.) 
+            # but for this we had to insert some unchanged parts of
+            # UnixCCompiler, and this is not what we want.)
 
-            # we want to put some files in the same directory as the 
+            # we want to put some files in the same directory as the
             # object files are, build_temp doesn't help much
             # where are the object files
             temp_dir = os.path.dirname(objects[0])
@@ -131,7 +131,7 @@
 
             # generate the filenames for these files
             def_file = os.path.join(temp_dir, dll_name + ".def")
-       
+
             # Generate .def file
             contents = [
                 "LIBRARY %s INITINSTANCE TERMINSTANCE" % \
@@ -144,21 +144,21 @@
                          "writing %s" % def_file)
 
             # next add options for def-file and to creating import libraries
-            # for gcc/ld the def-file is specified as any other object files    
+            # for gcc/ld the def-file is specified as any other object files
             objects.append(def_file)
 
         #end: if ((export_symbols is not None) and
         #        (target_desc != self.EXECUTABLE or self.linker_dll == "gcc")):
-                                                 
+
         # who wants symbols and a many times larger output file
-        # should explicitly switch the debug mode on 
+        # should explicitly switch the debug mode on
         # otherwise we let dllwrap/ld strip the output file
-        # (On my machine: 10KB < stripped_file < ??100KB 
+        # (On my machine: 10KB < stripped_file < ??100KB
         #   unstripped_file = stripped_file + XXX KB
-        #  ( XXX=254 for a typical python extension)) 
-        if not debug: 
-            extra_preargs.append("-s") 
-        
+        #  ( XXX=254 for a typical python extension))
+        if not debug:
+            extra_preargs.append("-s")
+
         UnixCCompiler.link(self,
                            target_desc,
                            objects,
@@ -172,7 +172,7 @@
                            extra_preargs,
                            extra_postargs,
                            build_temp)
-        
+
     # link ()
 
     # -- Miscellaneous methods -----------------------------------------
@@ -196,7 +196,7 @@
                 base = os.path.basename (base)
             if ext == '.rc':
                 # these need to be compiled to object files
-                obj_names.append (os.path.join (output_dir, 
+                obj_names.append (os.path.join (output_dir,
                                             base + self.res_extension))
             else:
                 obj_names.append (os.path.join (output_dir,
@@ -216,7 +216,7 @@
             emx_dirs = os.environ['LIBRARY_PATH'].split(';')
         except KeyError:
             emx_dirs = []
-	
+
         for dir in dirs + emx_dirs:
             shortlibp = os.path.join(dir, shortlib)
             longlibp = os.path.join(dir, longlib)
@@ -224,7 +224,7 @@
                 return shortlibp
             elif os.path.exists(longlibp):
                 return longlibp
-            
+
         # Oops, didn't find it in *any* of 'dirs'
         return None
 
@@ -266,15 +266,15 @@
     # GCC, and the pyconfig.h file should be OK
     if string.find(sys.version,"GCC") >= 0:
         return (CONFIG_H_OK, "sys.version mentions 'GCC'")
-    
+
     fn = sysconfig.get_config_h_filename()
     try:
         # It would probably better to read single lines to search.
-        # But we do this only once, and it is fast enough 
+        # But we do this only once, and it is fast enough
         f = open(fn)
         s = f.read()
         f.close()
-        
+
     except IOError, exc:
         # if we can't read this file, we cannot say it is wrong
         # the compiler will complain later about this file as missing
@@ -296,7 +296,7 @@
     from distutils.version import StrictVersion
     from distutils.spawn import find_executable
     import re
-        
+
     gcc_exe = find_executable('gcc')
     if gcc_exe:
         out = os.popen(gcc_exe + ' -dumpversion','r')
@@ -313,4 +313,3 @@
     # anyway - so we can link OMF DLLs
     ld_version = None
     return (gcc_version, ld_version)
-
diff --git a/Lib/lib-tk/turtle.py b/Lib/lib-tk/turtle.py
index d59cd7a..16e5735 100644
--- a/Lib/lib-tk/turtle.py
+++ b/Lib/lib-tk/turtle.py
@@ -199,7 +199,7 @@
         if self._filling:
             self._path.append(self._position)
         self._draw_turtle()
-            
+
     def heading(self):
         return self._angle
 
@@ -209,13 +209,13 @@
 
     def window_width(self):
         width = self._canvas.winfo_width()
-        if width <= 1:	# the window isn't managed by a geometry manager
+        if width <= 1:  # the window isn't managed by a geometry manager
             width = self._canvas['width']
         return width
 
     def window_height(self):
         height = self._canvas.winfo_height()
-        if height <= 1:	# the window isn't managed by a geometry manager
+        if height <= 1: # the window isn't managed by a geometry manager
             height = self._canvas['height']
         return height
 
@@ -254,7 +254,7 @@
         if self._filling:
             self._path.append(self._position)
         if self._drawing:
-            if self._tracing:                
+            if self._tracing:
                 dx = float(x1 - x0)
                 dy = float(y1 - y0)
                 distance = hypot(dx, dy)
diff --git a/Lib/test/test_multifile.py b/Lib/test/test_multifile.py
index 8f70347..6cb946f 100644
--- a/Lib/test/test_multifile.py
+++ b/Lib/test/test_multifile.py
@@ -4,12 +4,12 @@
 
 msg = """Mime-Version: 1.0
 Content-Type: multipart/mixed;
-	boundary="=====================_590453667==_"
+        boundary="=====================_590453667==_"
 X-OriginalArrivalTime: 05 Feb 2002 03:43:23.0310 (UTC) FILETIME=[42D88CE0:01C1ADF7]
 
 --=====================_590453667==_
 Content-Type: multipart/alternative;
-	boundary="=====================_590453677==_.ALT"
+        boundary="=====================_590453677==_.ALT"
 
 --=====================_590453677==_.ALT
 Content-Type: text/plain; charset="us-ascii"; format=flowed
@@ -49,8 +49,8 @@
         boundaries += 1
 
         mf.push(boundary)
-        while mf.next(): 
-            getMIMEMsg(mf)     
+        while mf.next():
+            getMIMEMsg(mf)
         mf.pop()
     else:
         lines = mf.readlines()
