diff --git a/Tools/scripts/patchcheck.py b/Tools/scripts/patchcheck.py
index e194c98..bc8bc79 100644
--- a/Tools/scripts/patchcheck.py
+++ b/Tools/scripts/patchcheck.py
@@ -1,8 +1,16 @@
+import re
+import sys
+import shutil
 import os.path
 import subprocess
-import sys
 
 import reindent
+import untabify
+
+
+def n_files_str(count):
+    """Return 'N file(s)' with the proper plurality on 'file'."""
+    return "{} file{}".format(count, "s" if count != 1 else "")
 
 
 def status(message, modal=False, info=None):
@@ -17,53 +25,105 @@
             elif info:
                 print info(result)
             else:
-                if result:
-                    print "yes"
-                else:
-                    print "NO"
+                print "yes" if result else "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)
+@status("Getting the list of files that have been added/changed",
+        info=lambda x: n_files_str(len(x)))
+def changed_files():
+    """Get the list of changed or added files from the VCS."""
+    if os.path.isdir('.hg'):
+        vcs = 'hg'
+        cmd = 'hg status --added --modified --no-status'
+    elif os.path.isdir('.svn'):
+        vcs = 'svn'
+        cmd = 'svn status --quiet --non-interactive --ignore-externals'
+    else:
+        sys.exit('need a checkout to get modified files')
+
+    st = subprocess.Popen(cmd.split(), stdout=subprocess.PIPE)
+    try:
+        st.wait()
+        if vcs == 'hg':
+            return [x.decode().rstrip() for x in st.stdout]
+        else:
+            output = (x.decode().rstrip().rsplit(None, 1)[-1]
+                      for x in st.stdout if x[0] in 'AM')
+        return set(path for path in output if os.path.isfile(path))
+    finally:
+        st.stdout.close()
+
+
+def report_modified_files(file_paths):
+    count = len(file_paths)
+    if count == 0:
+        return n_files_str(count)
+    else:
+        lines = ["{}:".format(n_files_str(count))]
+        for path in file_paths:
+            lines.append("  {}".format(path))
+        return "\n".join(lines)
+
+
+@status("Fixing whitespace", info=report_modified_files)
 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)
+    fixed = []
+    for path in (x for x in file_paths if x.endswith('.py')):
+        if reindent.check(path):
+            fixed.append(path)
+    return fixed
+
+
+@status("Fixing C file whitespace", info=report_modified_files)
+def normalize_c_whitespace(file_paths):
+    """Report if any C files """
+    fixed = []
+    for path in file_paths:
+        with open(path, 'r') as f:
+            if '\t' not in f.read():
+                continue
+        untabify.process(path, 8, verbose=False)
+        fixed.append(path)
+    return fixed
+
+
+ws_re = re.compile(br'\s+(\r?\n)$')
+
+@status("Fixing docs whitespace", info=report_modified_files)
+def normalize_docs_whitespace(file_paths):
+    fixed = []
+    for path in file_paths:
+        try:
+            with open(path, 'rb') as f:
+                lines = f.readlines()
+            new_lines = [ws_re.sub(br'\1', line) for line in lines]
+            if new_lines != lines:
+                shutil.copyfile(path, path + '.bak')
+                with open(path, 'wb') as f:
+                    f.writelines(new_lines)
+                fixed.append(path)
+        except Exception as err:
+            print 'Cannot fix %s: %s' % (path, err)
+    return fixed
+
 
 @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
+    """Report if any file in the Doc directory has been changed."""
+    return bool(file_paths)
+
 
 @status("Misc/ACKS updated", modal=True)
 def credit_given(file_paths):
     """Check if Misc/ACKS has been changed."""
     return 'Misc/ACKS' in file_paths
 
+
 @status("Misc/NEWS updated", modal=True)
 def reported_news(file_paths):
     """Check if Misc/NEWS has been changed."""
@@ -72,14 +132,22 @@
 
 def main():
     file_paths = changed_files()
-    # PEP 7/8 verification.
-    normalize_whitespace(file_paths)
+    python_files = [fn for fn in file_paths if fn.endswith('.py')]
+    c_files = [fn for fn in file_paths if fn.endswith(('.c', '.h'))]
+    doc_files = [fn for fn in file_paths if fn.startswith('Doc')]
+    special_files = {'Misc/ACKS', 'Misc/NEWS'} & set(file_paths)
+    # PEP 8 whitespace rules enforcement.
+    normalize_whitespace(python_files)
+    # C rules enforcement.
+    normalize_c_whitespace(c_files)
+    # Doc whitespace enforcement.
+    normalize_docs_whitespace(doc_files)
     # Docs updated.
-    docs_modified(file_paths)
+    docs_modified(doc_files)
     # Misc/ACKS changed.
-    credit_given(file_paths)
+    credit_given(special_files)
     # Misc/NEWS changed.
-    reported_news(file_paths)
+    reported_news(special_files)
 
     # Test suite run and passed.
     print
diff --git a/Tools/scripts/reindent-rst.py b/Tools/scripts/reindent-rst.py
index bf431d9..ceb84bf 100755
--- a/Tools/scripts/reindent-rst.py
+++ b/Tools/scripts/reindent-rst.py
@@ -3,27 +3,12 @@
 # Make a reST file compliant to our pre-commit hook.
 # Currently just remove trailing whitespace.
 
-from __future__ import with_statement
-import sys, re, shutil
+import sys
 
-ws_re = re.compile(r'\s+(\r?\n)$')
+import patchcheck
 
 def main(argv=sys.argv):
-    rv = 0
-    for filename in argv[1:]:
-        try:
-            with open(filename, 'rb') as f:
-                lines = f.readlines()
-            new_lines = [ws_re.sub(r'\1', line) for line in lines]
-            if new_lines != lines:
-                print 'Fixing %s...' % filename
-            shutil.copyfile(filename, filename + '.bak')
-            with open(filename, 'wb') as f:
-                f.writelines(new_lines)
-        except Exception, err:
-            print 'Cannot fix %s: %s' % (filename, err)
-            rv = 1
-    return rv
+    patchcheck.normalize_docs_whitespace(argv[1:])
 
 if __name__ == '__main__':
     sys.exit(main())
diff --git a/Tools/scripts/untabify.py b/Tools/scripts/untabify.py
index 9bdf235..83e73da 100755
--- a/Tools/scripts/untabify.py
+++ b/Tools/scripts/untabify.py
@@ -23,7 +23,7 @@
     for filename in args:
         process(filename, tabsize)
 
-def process(filename, tabsize):
+def process(filename, tabsize, verbose=True):
     try:
         f = open(filename)
         text = f.read()
@@ -43,10 +43,10 @@
         os.rename(filename, backup)
     except os.error:
         pass
-    f = open(filename, "w")
-    f.write(newtext)
-    f.close()
-    print filename
+    with open(filename, "w") as f:
+        f.write(newtext)
+    if verbose:
+        print filename
 
 if __name__ == '__main__':
     main()
