diff --git a/Tools/compiler/regrtest.py b/Tools/compiler/regrtest.py
new file mode 100644
index 0000000..fd990a9
--- /dev/null
+++ b/Tools/compiler/regrtest.py
@@ -0,0 +1,55 @@
+"""Run the Python regression test using the compiler
+
+This test runs the standard Python test suite using bytecode generated
+by this compiler instead of by the builtin compiler.
+
+The regression test is run with the interpreter in verbose mode so
+that import problems can be observed easily.
+"""
+
+from compiler import compile
+
+import os
+import sys
+import test
+import tempfile
+
+def copy_test_suite():
+    dest = tempfile.mktemp()
+    os.mkdir(dest)
+    os.system("cp -r %s/* %s" % (test.__path__[0], dest))
+    print "Creating copy of test suite in", dest
+    return dest
+
+def compile_files(dir):
+    print "Compiling",
+    line_len = 10
+    for file in os.listdir(dir):
+        base, ext = os.path.splitext(file)
+        if ext == '.py' and base[:4] == 'test':
+            source = os.path.join(dir, file)
+            line_len = line_len + len(file) + 1
+            if line_len > 75:
+                print "\n\t",
+                line_len = len(source) + 9
+            print file,
+            compile(source)
+            # make sure the .pyc file is not over-written
+            os.chmod(source + "c", 444)
+    print
+
+def run_regrtest(test_dir):
+    os.chdir(test_dir)
+    os.system("%s -v regrtest.py" % sys.executable)
+
+def cleanup(dir):
+    os.system("rm -rf %s" % dir)
+
+def main():
+    test_dir = copy_test_suite()
+    compile_files(test_dir)
+    run_regrtest(test_dir)
+    cleanup(test_dir)
+
+if __name__ == "__main__":
+    main()
