diff --git a/unix/main.c b/unix/main.c
index b9b8fe0b9fe9445155d08e906ffbd52df7dc9c15..d5b04d565b652ee522ca02285f807168ddf4ca80 100644
--- a/unix/main.c
+++ b/unix/main.c
@@ -357,9 +357,6 @@ int main(int argc, char **argv) {
 #endif
 
     microsocket_init();
-#if MICROPY_MOD_TIME
-    time_init();
-#endif
 #if MICROPY_MOD_FFI
     ffi_init();
 #endif
diff --git a/unix/modtime.c b/unix/modtime.c
index daf72ff88a6f9dfb82c7cef4f0239d001fa30ee5..a0d7cd046235c7c6cefb0560f173f45a1d10680e 100644
--- a/unix/modtime.c
+++ b/unix/modtime.c
@@ -51,9 +51,26 @@ STATIC mp_obj_t mod_time_sleep(mp_obj_t arg) {
 }
 STATIC MP_DEFINE_CONST_FUN_OBJ_1(mod_time_sleep_obj, mod_time_sleep);
 
-void time_init() {
-    mp_obj_t m = mp_obj_new_module(QSTR_FROM_STR_STATIC("time"));
-    mp_store_attr(m, QSTR_FROM_STR_STATIC("time"), (mp_obj_t)&mod_time_time_obj);
-    mp_store_attr(m, QSTR_FROM_STR_STATIC("clock"), (mp_obj_t)&mod_time_clock_obj);
-    mp_store_attr(m, QSTR_FROM_STR_STATIC("sleep"), (mp_obj_t)&mod_time_sleep_obj);
-}
+STATIC const mp_map_elem_t mp_module_time_globals_table[] = {
+    { MP_OBJ_NEW_QSTR(MP_QSTR___name__), MP_OBJ_NEW_QSTR(MP_QSTR_time) },
+    { MP_OBJ_NEW_QSTR(MP_QSTR_clock), (mp_obj_t)&mod_time_clock_obj },
+    { MP_OBJ_NEW_QSTR(MP_QSTR_sleep), (mp_obj_t)&mod_time_sleep_obj },
+    { MP_OBJ_NEW_QSTR(MP_QSTR_time), (mp_obj_t)&mod_time_time_obj },
+};
+
+STATIC const mp_obj_dict_t mp_module_time_globals = {
+    .base = {&mp_type_dict},
+    .map = {
+        .all_keys_are_qstrs = 1,
+        .table_is_fixed_array = 1,
+        .used = sizeof(mp_module_time_globals_table) / sizeof(mp_map_elem_t),
+        .alloc = sizeof(mp_module_time_globals_table) / sizeof(mp_map_elem_t),
+        .table = (mp_map_elem_t*)mp_module_time_globals_table,
+    },
+};
+
+const mp_obj_module_t mp_module_time = {
+    .base = { &mp_type_module },
+    .name = MP_QSTR_time,
+    .globals = (mp_obj_dict_t*)&mp_module_time_globals,
+};
diff --git a/unix/mpconfigport.h b/unix/mpconfigport.h
index cf6e6fae26dd0c0505c3e80caabeb4fe2595fbce..bfbb49aee6c7fc1e2de140496d676c4c8619fa4b 100644
--- a/unix/mpconfigport.h
+++ b/unix/mpconfigport.h
@@ -17,6 +17,10 @@
 #define MICROPY_MOD_SYS_STDFILES    (1)
 #define MICROPY_ENABLE_MOD_CMATH    (1)
 
+extern const struct _mp_obj_module_t mp_module_time;
+#define MICROPY_EXTRA_BUILTIN_MODULES \
+    { MP_OBJ_NEW_QSTR(MP_QSTR_time), (mp_obj_t)&mp_module_time }, \
+
 // type definitions for the specific machine
 
 #ifdef __LP64__
diff --git a/unix/qstrdefsport.h b/unix/qstrdefsport.h
index 42f20d2657866dddb8601362a26fdd5b954baed9..eb61e2a6188530edf86e30ff6e6be9c1e236e1eb 100644
--- a/unix/qstrdefsport.h
+++ b/unix/qstrdefsport.h
@@ -30,3 +30,7 @@ Q(fficallback)
 Q(ffivar)
 Q(func)
 Q(var)
+
+Q(time)
+Q(clock)
+Q(sleep)