diff --git a/tests/run-tests-exp.py b/tests/run-tests-exp.py
new file mode 100644
index 0000000000000000000000000000000000000000..a4ac26dba2a5e0cea3efce72149803e174785043
--- /dev/null
+++ b/tests/run-tests-exp.py
@@ -0,0 +1,96 @@
+#
+# This is minimal MicroPython variant of run-tests script, which uses
+# .exp files as generated by run-tests --write-exp. It is useful to run
+# testsuite on systems which have neither CPython3 nor unix shell.
+# This script is intended to be run by the same interpreter executable
+# which is to be tested, so should use minimal language functionality.
+#
+import sys
+import _os as os
+
+
+tests = [
+    "basics", "micropython", "float", "import", "io",
+    " misc", "unicode", "extmod", "unix"
+]
+
+if sys.platform == 'win32':
+    MICROPYTHON = "micropython.exe"
+else:
+    MICROPYTHON = "micropython"
+
+
+def should_skip(test):
+    if test.startswith("native"):
+        return True
+    if test.startswith("viper"):
+        return True
+
+test_count = 0
+passed_count = 0
+skip_count = 0
+
+for suite in tests:
+    #print("Running in: %s" % suite)
+    if sys.platform == 'win32':
+        # dir /b prints only contained filenames, one on a line
+        # http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/dir.mspx
+        r = os.system("dir /b %s/*.py >tests.lst" % suite)
+    else:
+        r = os.system("ls %s/*.py | xargs -n1 basename >tests.lst" % suite)
+    assert r == 0
+
+    with open("tests.lst") as f:
+        testcases = f.readlines()
+        testcases = [l[:-1] for l in testcases]
+    assert testcases, "No tests found in dir '%s', which is implausible" % suite
+    #print(testcases)
+    for t in testcases:
+        if t == "native_check.py":
+            continue
+
+        qtest = "%s/%s" % (suite, t)
+
+        if should_skip(t):
+            print("skip " + qtest)
+            skip_count += 1
+            continue
+
+        exp = None
+        try:
+            f = open(qtest + ".exp")
+            exp = f.read()
+            f.close()
+        except OSError:
+            pass
+
+        if exp is not None:
+            #print("run " + qtest)
+            r = os.system(MICROPYTHON + " %s >.tst.out" % qtest)
+            if r == 0:
+                f = open(".tst.out")
+                out = f.read()
+                f.close()
+            else:
+                out = "CRASH"
+
+            if out == "SKIP\n":
+                print("skip " + qtest)
+                skip_count += 1
+            else:
+                if out == exp:
+                    print("pass " + qtest)
+                    passed_count += 1
+                else:
+                    print("FAIL " + qtest)
+
+                test_count += 1
+        else:
+            skip_count += 1
+
+print("%s tests performed" % test_count)
+print("%s tests passed" % passed_count)
+if test_count != passed_count:
+    print("%s tests failed" % (test_count - passed_count))
+if skip_count:
+    print("%s tests skipped" % skip_count)