The Tab Police watches for possibly inconsistent indentation.
diff --git a/Tools/scripts/tabpolice.py b/Tools/scripts/tabpolice.py
new file mode 100755
index 0000000..9236b71
--- /dev/null
+++ b/Tools/scripts/tabpolice.py
@@ -0,0 +1,74 @@
+#! /usr/bin/env python
+
+"""The Tab Police watches for possibly inconsistent indentation."""
+
+import os
+import sys
+import getopt
+import string
+import tokenize
+
+verbose = 0
+
+def main():
+	global verbose
+	try:
+		opts, args = getopt.getopt(sys.argv[1:], "v")
+	except getopt.error, msg:
+		print msg
+	for o, a in opts:
+		if o == '-v':
+			verbose = verbose + 1
+	for arg in args:
+		check(arg)
+
+def check(file):
+	if os.path.isdir(file) and not os.path.islink(file):
+		if verbose:
+			print "%s: listing directory" % `file`
+		names = os.listdir(file)
+		for name in names:
+			fullname = os.path.join(file, name)
+			if (os.path.isdir(fullname) and
+			    not os.path.islink(fullname) or
+			    os.path.normcase(name[-3:]) == ".py"):
+				check(fullname)
+		return
+
+	try:
+		f = open(file)
+	except IOError, msg:
+		print "%s: I/O Error: %s" % (`file`, str(msg))
+		return
+
+	if verbose > 1:
+		print "checking", `file`, "with tabsize 8..."
+	tokens = []
+	tokenize.tabsize = 8
+	try:
+		tokenize.tokenize(f.readline, tokens.append)
+	except tokenize.TokenError, msg:
+		print "%s: Token Error: %s" % (`file`, str(msg))
+
+	if verbose > 1:
+		print "checking", `file`, "with tabsize 4..."
+	f.seek(0)
+	alttokens = []
+	tokenize.tabsize = 4
+	try:
+		tokenize.tokenize(f.readline, alttokens.append)
+	except tokenize.TokenError, msg:
+		print "%s: Token Error: %s" % (`file`, str(msg))
+	f.close()
+
+	if tokens != alttokens:
+		if verbose:
+			print "%s: *** Trouble in tab city! ***" % `file`
+		else:
+			print file
+	else:
+		if verbose:
+			print "%s: Clean bill of health." % `file`
+
+if __name__ == '__main__':
+	main()