diff --git a/Makefile.pre.in b/Makefile.pre.in
index 61e7282..4edc784 100644
--- a/Makefile.pre.in
+++ b/Makefile.pre.in
@@ -1140,6 +1140,10 @@
 		-o -name MANIFEST \
 		-o -print
 
+# Perform some verification checks on any modified files.
+check:
+	./$(BUILDPYTHON) $(srcdir)/Tools/scripts/patchcheck.py
+
 # Dependencies
 
 Python/thread.o: @THREADHEADERS@
diff --git a/Tools/scripts/patchcheck.py b/Tools/scripts/patchcheck.py
new file mode 100644
index 0000000..cc177e7
--- /dev/null
+++ b/Tools/scripts/patchcheck.py
@@ -0,0 +1,90 @@
+import os.path
+import subprocess
+import sys
+
+import reindent
+
+
+def status(message, modal=False, info=None):
+    """Decorator to output status info to stdout."""
+    def decorated_fxn(fxn):
+        def call_fxn(*args, **kwargs):
+            sys.stdout.write(message + ' ... ')
+            sys.stdout.flush()
+            result = fxn(*args, **kwargs)
+            if not modal and not info:
+                print "done"
+            elif info:
+                print info(result)
+            else:
+                if result:
+                    print "yes"
+                else:
+                    print "NO"
+            return result
+        return call_fxn
+    return decorated_fxn
+
+@status("Getting the list of files that have been added/changed",
+            info=lambda x: "%s files" % len(x))
+def changed_files():
+    """Run ``svn status`` and return a set of files that have been
+    changed/added."""
+    cmd = 'svn status --quiet --non-interactive --ignore-externals'
+    svn_st = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE)
+    svn_st.wait()
+    output = [line.strip() for line in svn_st.stdout.readlines()]
+    files = set()
+    for line in output:
+        if not line[0] in ('A', 'M'):
+            continue
+        line_parts = line.split()
+        path = line_parts[-1]
+        if os.path.isfile(path):
+            files.add(path)
+    return files
+
+@status("Fixing whitespace", info=lambda x: "%s files" % x)
+def normalize_whitespace(file_paths):
+    """Make sure that the whitespace for .py files have been normalized."""
+    reindent.makebackup = False  # No need to create backups.
+    result = map(reindent.check, (x for x in file_paths if x.endswith('.py')))
+    return sum(result)
+
+@status("Docs modified", modal=True)
+def docs_modified(file_paths):
+    """Report if any files in the Docs directory."""
+    for path in file_paths:
+        if path.startswith("Doc"):
+            return True
+    return False
+
+@status("Misc/ACKS updated", modal=True)
+def credit_given(file_paths):
+    """Check if Misc/ACKS has been changed."""
+    return True if 'Misc/ACKS' in file_paths else False
+
+@status("Misc/NEWS updated", modal=True)
+def reported_news(file_paths):
+    """Check if Misc/NEWS has been changed."""
+    return True if 'Misc/NEWS' in file_paths else False
+
+
+def main():
+    file_paths = changed_files()
+    # PEP 7/8 verification.
+    normalize_whitespace(file_paths)
+    # Docs updated.
+    docs_modified(file_paths)
+    # Misc/ACKS changed.
+    credit_given(file_paths)
+    # Misc/NEWS changed.
+    reported_news(file_paths)
+
+    # Test suite run and passed.
+    print
+    print "Did you run the test suite?"
+
+
+if __name__ == '__main__':
+    main()
diff --git a/Tools/scripts/reindent.py b/Tools/scripts/reindent.py
index 0805ef7..65749f0 100755
--- a/Tools/scripts/reindent.py
+++ b/Tools/scripts/reindent.py
@@ -130,9 +130,11 @@
             f.close()
             if verbose:
                 print "wrote new", file
+        return True
     else:
         if verbose:
             print "unchanged."
+        return False
 
 def _rstrip(line, JUNK='\n \t'):
     """Return line stripped of trailing spaces, tabs, newlines.
