diff --git a/py/runtime.c b/py/runtime.c
index f12b3e612547d6654e19add33f13c9dd03db4bcf..d15a38e089eac4d422530b787c1bc15ecde4ca78 100644
--- a/py/runtime.c
+++ b/py/runtime.c
@@ -1016,6 +1016,17 @@ mp_obj_t rt_import_from(mp_obj_t module, qstr name) {
     return x;
 }
 
+void rt_import_all(mp_obj_t module) {
+    DEBUG_printf("import all %p\n", module);
+
+    mp_map_t *map = mp_obj_module_get_globals(module);
+    for (uint i = 0; i < map->alloc; i++) {
+        if (map->table[i].key != MP_OBJ_NULL) {
+            rt_store_name(MP_OBJ_QSTR_VALUE(map->table[i].key), map->table[i].value);
+        }
+    }
+}
+
 mp_map_t *rt_locals_get(void) {
     return map_locals;
 }
diff --git a/py/runtime.h b/py/runtime.h
index 20595c6a58ee19713d0b991a67fa08b7666dd373..f5a9f2abc7e2f7117eb9ea6ff882a24b4f9dff80 100644
--- a/py/runtime.h
+++ b/py/runtime.h
@@ -39,6 +39,7 @@ mp_obj_t rt_getiter(mp_obj_t o);
 mp_obj_t rt_iternext(mp_obj_t o);
 mp_obj_t rt_import_name(qstr name, mp_obj_t fromlist, mp_obj_t level);
 mp_obj_t rt_import_from(mp_obj_t module, qstr name);
+void rt_import_all(mp_obj_t module);
 
 struct _mp_map_t;
 struct _mp_map_t *rt_locals_get(void);
diff --git a/py/showbc.c b/py/showbc.c
index 9dfbc887219d3e65f68b4b97cae82f6ddfb9174f..e3387dbe272dcdffd6b2634750bafedf68d9a7d0 100644
--- a/py/showbc.c
+++ b/py/showbc.c
@@ -390,6 +390,10 @@ void mp_byte_code_print(const byte *ip, int len) {
                 printf("IMPORT_FROM %s", qstr_str(qstr));
                 break;
 
+            case MP_BC_IMPORT_STAR:
+                printf("IMPORT_STAR");
+                break;
+
             default:
                 printf("code %p, byte code 0x%02x not implemented\n", ip, op);
                 assert(0);
diff --git a/py/vm.c b/py/vm.c
index 1d47076dfb9a1b1725cbc09bd7b636dbe25644e6..10db35e25fde36fbae29d075526add74a48c4e00 100644
--- a/py/vm.c
+++ b/py/vm.c
@@ -595,6 +595,10 @@ unwind_return:
                         PUSH(obj1);
                         break;
 
+                    case MP_BC_IMPORT_STAR:
+                        rt_import_all(TOP());
+                        break;
+
                     default:
                         printf("code %p, byte code 0x%02x not implemented\n", ip, op);
                         assert(0);
diff --git a/tests/basics/import2a.py b/tests/basics/import2a.py
new file mode 100644
index 0000000000000000000000000000000000000000..ce32b10b1b956e5b27e73b1b34c2a2776c6f4d1a
--- /dev/null
+++ b/tests/basics/import2a.py
@@ -0,0 +1,2 @@
+from import1b import var
+print(var)
diff --git a/tests/basics/import3a.py b/tests/basics/import3a.py
new file mode 100644
index 0000000000000000000000000000000000000000..2e9d41f71dbdfabb08e12c1cf94ec8dc26db616b
--- /dev/null
+++ b/tests/basics/import3a.py
@@ -0,0 +1,2 @@
+from import1b import *
+print(var)