diff --git a/Lib/compiler/ast.py b/Lib/compiler/ast.py
index a81937f..6f585b7 100644
--- a/Lib/compiler/ast.py
+++ b/Lib/compiler/ast.py
@@ -607,7 +607,7 @@
         self.code = code
         self.argnames = ['[outmost-iterable]']
         self.varargs = self.kwargs = None
-    
+
 
 
     def getChildren(self):
@@ -785,7 +785,7 @@
             self.varargs = 1
         if flags & CO_VARKEYWORDS:
             self.kwargs = 1
-    
+
 
 
     def getChildren(self):
diff --git a/Lib/compiler/pycodegen.py b/Lib/compiler/pycodegen.py
index e859ac5..e33551a 100644
--- a/Lib/compiler/pycodegen.py
+++ b/Lib/compiler/pycodegen.py
@@ -372,7 +372,7 @@
             ndecorators = len(node.decorators.nodes)
         else:
             ndecorators = 0
-            
+
         gen = self.FunctionGen(node, self.scopes, isLambda,
                                self.class_name, self.get_module())
         walk(node.code, gen)
@@ -389,7 +389,7 @@
         else:
             self.emit('LOAD_CONST', gen)
             self.emit('MAKE_FUNCTION', len(node.defaults))
-            
+
         for i in range(ndecorators):
             self.emit('CALL_FUNCTION', 1)
 
diff --git a/Lib/compiler/transformer.py b/Lib/compiler/transformer.py
index 229657b..53a0fda 100644
--- a/Lib/compiler/transformer.py
+++ b/Lib/compiler/transformer.py
@@ -198,7 +198,7 @@
             i += 2
 
         return item
-        
+
     def decorator(self, nodelist):
         # '@' dotted_name [ '(' [arglist] ')' ]
         assert len(nodelist) in (2, 4, 5)
@@ -212,9 +212,9 @@
             expr = self.com_call_function(funcname, nodelist[3])
         else:
             expr = funcname
-            
+
         return expr
-    
+
     def decorators(self, nodelist):
         # decorators: decorator ([NEWLINE] decorator)* NEWLINE
         listlen = len(nodelist)
@@ -228,7 +228,7 @@
             if i < listlen and nodelist[i][0] == token.NEWLINE:
                 i += 1
         return Decorators(items)
-    
+
     def funcdef(self, nodelist):
         #                    -6   -5    -4         -3  -2    -1
         # funcdef: [decorators] 'def' NAME parameters ':' suite
@@ -240,7 +240,7 @@
         else:
             assert len(nodelist) == 5
             decorators = None
-            
+
         lineno = nodelist[-4][2]
         name = nodelist[-4][1]
         args = nodelist[-3][2]
diff --git a/Lib/distutils/cygwinccompiler.py b/Lib/distutils/cygwinccompiler.py
index acd393d..31e8e34 100644
--- a/Lib/distutils/cygwinccompiler.py
+++ b/Lib/distutils/cygwinccompiler.py
@@ -122,17 +122,17 @@
                 "Consider upgrading to a newer version of gcc")
         else:
             self.dll_libraries=[]
-	    # Include the appropriate MSVC runtime library if Python was built
-	    # with MSVC 7.0 or 7.1.
-	    msc_pos = sys.version.find('MSC v.')
-	    if msc_pos != -1:
-		msc_ver = sys.version[msc_pos+6:msc_pos+10]
-		if msc_ver == '1300':
-		    # MSVC 7.0
-		    self.dll_libraries = ['msvcr70']
-		elif msc_ver == '1310':
-		    # MSVC 7.1
-		    self.dll_libraries = ['msvcr71']
+            # Include the appropriate MSVC runtime library if Python was built
+            # with MSVC 7.0 or 7.1.
+            msc_pos = sys.version.find('MSC v.')
+            if msc_pos != -1:
+                msc_ver = sys.version[msc_pos+6:msc_pos+10]
+                if msc_ver == '1300':
+                    # MSVC 7.0
+                    self.dll_libraries = ['msvcr70']
+                elif msc_ver == '1310':
+                    # MSVC 7.1
+                    self.dll_libraries = ['msvcr71']
 
     # __init__ ()
 
@@ -319,17 +319,17 @@
         # no additional libraries needed
         self.dll_libraries=[]
 
-	# Include the appropriate MSVC runtime library if Python was built
-	# with MSVC 7.0 or 7.1.
-	msc_pos = sys.version.find('MSC v.')
-	if msc_pos != -1:
-	    msc_ver = sys.version[msc_pos+6:msc_pos+10]
-	    if msc_ver == '1300':
-		# MSVC 7.0
-		self.dll_libraries = ['msvcr70']
-	    elif msc_ver == '1310':
-		# MSVC 7.1
-		self.dll_libraries = ['msvcr71']
+        # Include the appropriate MSVC runtime library if Python was built
+        # with MSVC 7.0 or 7.1.
+        msc_pos = sys.version.find('MSC v.')
+        if msc_pos != -1:
+            msc_ver = sys.version[msc_pos+6:msc_pos+10]
+            if msc_ver == '1300':
+                # MSVC 7.0
+                self.dll_libraries = ['msvcr70']
+            elif msc_ver == '1310':
+                # MSVC 7.1
+                self.dll_libraries = ['msvcr71']
 
     # __init__ ()
 
diff --git a/Lib/test/pyclbr_input.py b/Lib/test/pyclbr_input.py
index b410fcc..8efc9de 100644
--- a/Lib/test/pyclbr_input.py
+++ b/Lib/test/pyclbr_input.py
@@ -10,11 +10,11 @@
 
 class B (object):
     def bm(self): pass
-    
+
 class C (B):
     foo = Other().foo
     om = Other.om
-    
+
     d = 10
 
     # XXX: This causes test_pyclbr.py to fail, but only because the
@@ -23,9 +23,9 @@
     #      The pyclbr.py module gets this right as it parses the text.
     #
     #f = f
-    
+
     def m(self): pass
-    
+
     @staticmethod
     def sm(self): pass
 
diff --git a/Lib/test/test_decorators.py b/Lib/test/test_decorators.py
index ef40e17..dbe45cf 100644
--- a/Lib/test/test_decorators.py
+++ b/Lib/test/test_decorators.py
@@ -22,8 +22,8 @@
         # A real version of this would set attributes here
         Exception.__init__(self, "dbcheck %r failed (func=%s args=%s kwds=%s)" %
                            (exprstr, func, args, kwds))
-    
-    
+
+
 def dbcheck(exprstr, globals=None, locals=None):
     "Decorator to implement debugging assertions"
     def decorate(func):
@@ -66,7 +66,7 @@
             # Unhashable argument
             return func(*args)
     return call
-            
+
 # -----------------------------------------------
 
 class TestDecorators(unittest.TestCase):
@@ -80,7 +80,7 @@
 
     def test_staticmethod_function(self):
         @staticmethod
-        def notamethod(x): 
+        def notamethod(x):
             return x
         self.assertRaises(TypeError, notamethod, 1)
 
@@ -94,7 +94,7 @@
     def test_argforms(self):
         # A few tests of argument passing, as we use restricted form
         # of expressions for decorators.
-        
+
         def noteargs(*args, **kwds):
             def decorate(func):
                 setattr(func, 'dbval', (args, kwds))
@@ -129,7 +129,7 @@
         # XXX: This doesn't work unless memoize is the last decorator -
         #      see the comment in countcalls.
         counts = {}
-        @countcalls(counts) @memoize 
+        @countcalls(counts) @memoize
         def double(x):
             return x * 2
 
@@ -157,7 +157,7 @@
         for expr in [ "1+2", "x[3]", "(1, 2)" ]:
             # Sanity check: is expr is a valid expression by itself?
             compile(expr, "testexpr", "exec")
-            
+
             codestr = "@%s\ndef f(): pass" % expr
             self.assertRaises(SyntaxError, compile, codestr, "test", "exec")
 
@@ -166,7 +166,7 @@
         def unimp(func):
             raise NotImplementedError
         context = dict(nullval=None, unimp=unimp)
-        
+
         for expr, exc in [ ("undef", NameError),
                            ("nullval", TypeError),
                            ("nullval.attr", AttributeError),
diff --git a/Lib/test/test_pyclbr.py b/Lib/test/test_pyclbr.py
index eddd593..ae8a396 100644
--- a/Lib/test/test_pyclbr.py
+++ b/Lib/test/test_pyclbr.py
@@ -151,7 +151,7 @@
         #      if it were not commented out.
         #
         self.checkModule('test.pyclbr_input')
-        
+
     def test_others(self):
         cm = self.checkModule
 
diff --git a/Lib/test/test_threadsignals.py b/Lib/test/test_threadsignals.py
index 84cf2fa..778879d 100644
--- a/Lib/test/test_threadsignals.py
+++ b/Lib/test/test_threadsignals.py
@@ -10,7 +10,7 @@
 if sys.platform[:3] in ('win', 'os2') or sys.platform=='riscos':
     raise TestSkipped, "Can't test signal on %s" % sys.platform
 
-signal_blackboard = { signal.SIGUSR1 : {'tripped': 0, 'tripped_by': 0 }, 
+signal_blackboard = { signal.SIGUSR1 : {'tripped': 0, 'tripped_by': 0 },
                       signal.SIGUSR2 : {'tripped': 0, 'tripped_by': 0 },
                       signal.SIGALRM : {'tripped': 0, 'tripped_by': 0 } }
 
@@ -28,7 +28,7 @@
 # The signal handler. Just note that the signal occured and
 # from who.
 def handle_signals(sig,frame):
-    signal_blackboard[sig]['tripped'] += 1 
+    signal_blackboard[sig]['tripped'] += 1
     signal_blackboard[sig]['tripped_by'] = thread.get_ident()
 
 # a function that will be spawned as a separate thread.
@@ -55,20 +55,20 @@
         # wait for it return.
         if signal_blackboard[signal.SIGUSR2]['tripped'] == 0 \
            or signal_blackboard[signal.SIGUSR2]['tripped'] == 0:
-             signal.alarm(1)
-             signal.pause()
-             signal.alarm(0)
+            signal.alarm(1)
+            signal.pause()
+            signal.alarm(0)
 
         self.assertEqual( signal_blackboard[signal.SIGUSR1]['tripped'], 1)
-        self.assertEqual( signal_blackboard[signal.SIGUSR1]['tripped_by'], 
+        self.assertEqual( signal_blackboard[signal.SIGUSR1]['tripped_by'],
                            thread.get_ident())
         self.assertEqual( signal_blackboard[signal.SIGUSR2]['tripped'], 1)
-        self.assertEqual( signal_blackboard[signal.SIGUSR2]['tripped_by'], 
+        self.assertEqual( signal_blackboard[signal.SIGUSR2]['tripped_by'],
                            thread.get_ident())
 
     def spawnSignallingThread(self):
         thread.start_new_thread(send_signals, ())
-        
+
 
 def test_main():
     oldsigs = registerSignals((handle_signals, handle_signals, handle_signals))
