diff --git a/.travis.yml b/.travis.yml
index c598783f44039ebd8ff00291f33e9005b585d5bc..5d9a383c168b1e56efc116f402d49dd6b3594b50 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -35,6 +35,8 @@ script:
   - make -C unix CC=gcc-4.7 coverage
   - (cd tests && MICROPY_CPYTHON3=python3.4 MICROPY_MICROPYTHON=../unix/micropython_coverage ./run-tests)
   - (cd tests && MICROPY_CPYTHON3=python3.4 MICROPY_MICROPYTHON=../unix/micropython_coverage ./run-tests --emit native)
+  # TODO the output of this extra coverage test is not checked
+  - unix/micropython_coverage --coverage
 
 after_success:
   - (cd unix && coveralls --root .. --build-root . --gcov $(which gcov-4.7) --gcov-options '\-o build-coverage/' --include py --include extmod)
diff --git a/unix/Makefile b/unix/Makefile
index 403f9295febc14407e1cc6616e4cdc9560e94f37..78572dbbae2a3706bbe11f8fffd697c5796b5af9 100644
--- a/unix/Makefile
+++ b/unix/Makefile
@@ -94,6 +94,7 @@ SRC_C = \
 	file.c \
 	modos.c \
 	alloc.c \
+	coverage.c \
 	$(SRC_MOD)
 
 
@@ -133,9 +134,11 @@ minimal:
 
 # build an interpreter for coverage testing and do the testing
 coverage:
-	$(MAKE) COPT="-O0" CFLAGS_EXTRA='-fprofile-arcs -ftest-coverage -Wdouble-promotion -Wformat -Wmissing-declarations -Wmissing-prototypes -Wold-style-definition -Wpointer-arith -Wshadow -Wsign-compare -Wuninitialized -Wunused-parameter' LDFLAGS_EXTRA='-fprofile-arcs -ftest-coverage' BUILD=build-coverage PROG=micropython_coverage
+	$(MAKE) COPT="-O0" CFLAGS_EXTRA='-fprofile-arcs -ftest-coverage -Wdouble-promotion -Wformat -Wmissing-declarations -Wmissing-prototypes -Wold-style-definition -Wpointer-arith -Wshadow -Wsign-compare -Wuninitialized -Wunused-parameter -DMICROPY_UNIX_COVERAGE' LDFLAGS_EXTRA='-fprofile-arcs -ftest-coverage' BUILD=build-coverage PROG=micropython_coverage
 
 coverage_test: coverage
 	$(eval DIRNAME=$(notdir $(CURDIR)))
 	cd ../tests && MICROPY_MICROPYTHON=../$(DIRNAME)/micropython_coverage ./run-tests
+	cd ../tests && MICROPY_MICROPYTHON=../$(DIRNAME)/micropython_coverage ./run-tests --emit native
 	gcov -o build-coverage/py ../py/*.c
+	gcov -o build-coverage/extmod ../extmod/*.c
diff --git a/unix/coverage.c b/unix/coverage.c
new file mode 100644
index 0000000000000000000000000000000000000000..48dbfd5c7c1563c30f70efeb3cdf058b4be7f4f4
--- /dev/null
+++ b/unix/coverage.c
@@ -0,0 +1,26 @@
+#include <stdio.h>
+
+#include "py/obj.h"
+#include "py/runtime.h"
+#include "py/repl.h"
+
+#if defined(MICROPY_UNIX_COVERAGE)
+
+// function to run extra tests for things that can't be checked by scripts
+void run_extra_coverage_tests(void);
+
+void run_extra_coverage_tests(void) {
+    // repl autocomplete
+    {
+        const char *str;
+        mp_uint_t len = mp_repl_autocomplete("__", 2, &mp_plat_print, &str);
+        printf("%.*s\n", (int)len, str);
+
+        mp_store_global(MP_QSTR_sys, mp_import_name(MP_QSTR_sys, mp_const_none, MP_OBJ_NEW_SMALL_INT(0)));
+        mp_repl_autocomplete("sys.", 4, &mp_plat_print, &str);
+        len = mp_repl_autocomplete("sys.impl", 8, &mp_plat_print, &str);
+        printf("%.*s\n", (int)len, str);
+    }
+}
+
+#endif
diff --git a/unix/main.c b/unix/main.c
index 4a71bfac6f9a797d42b593a9a0c38c1aeced712e..abea15728676763078dea181903348dfd35445b8 100644
--- a/unix/main.c
+++ b/unix/main.c
@@ -434,6 +434,12 @@ int main(int argc, char **argv) {
                     MP_STATE_VM(mp_optimise_value) = 0;
                     for (char *p = argv[a] + 1; *p && *p == 'O'; p++, MP_STATE_VM(mp_optimise_value)++);
                 }
+            #if defined(MICROPY_UNIX_COVERAGE)
+            } else if (strcmp(argv[a], "--coverage") == 0) {
+                void run_extra_coverage_tests(void);
+                run_extra_coverage_tests();
+                ret = 0;
+            #endif
             } else {
                 return usage(argv);
             }