diff --git a/inc/lektor/reg.h b/inc/lektor/reg.h
index 8d4e1e204d76077f01b1e1e8a2f737110e11c492..ba8a6021bd4400bccfc1e833e11f7bdc7feace54 100644
--- a/inc/lektor/reg.h
+++ b/inc/lektor/reg.h
@@ -48,7 +48,7 @@ struct lkt_module {
 
 /* Call a function from a reg. */
 #define MOD_CALL(module, name, ...)     \
-    reg_call((module).reg, name, 1 + (GET_VA_COUNT(__VA_ARGS__)), (module).data, __VA_ARGS__)
+    reg_call((module).reg, name, 1 + (GET_VA_COUNT(__VA_ARGS__)), &(module).data, __VA_ARGS__)
 int reg_call(struct module_reg *reg, const char *name, int count, ...);
 
 /* Import a module, from a file (mod is a filepath) or from the __reg__ in the
diff --git a/src/main/server.c b/src/main/server.c
index 3c5340738b3ce9f1f9fc24791a029566407c1cfe..eb9054adff6f3dca159e2efb1fa555c3a1102274 100644
--- a/src/main/server.c
+++ b/src/main/server.c
@@ -122,9 +122,10 @@ normal_launch:
     reg_import("repo", &srv.repo_mod.reg, &srv.repo_mod.handle);
     free(module);
 
-    srv.repo_mod.data = safe_zero_malloc(sizeof(struct lkt_repo));
-    MOD_CALL(srv.repo_mod, "new", &srv, srv.repo_mod.handle);
-    MOD_CALL(srv.window_mod, "new", &srv.queue, srv.db);
+    if (MOD_CALL(srv.repo_mod, "new", &srv, srv.repo_mod.handle))
+        return 100;
+    if (MOD_CALL(srv.window_mod, "new", &srv.queue, srv.db))
+        return 101;
 
     /* Get ENV */
     /* Not working -> race condition with player module */
diff --git a/src/module/module_sdl2.c b/src/module/module_sdl2.c
index 775f1b696525e5bfc9bbde65bb40575abbf6dcaf..718852bad32dc6e5a2920aef230cbaeaa2a2d72f 100644
--- a/src/module/module_sdl2.c
+++ b/src/module/module_sdl2.c
@@ -118,9 +118,9 @@ int
 mod_new(va_list *va)
 {
     va_list copy;
+    struct module_sdl2_window **win;
     va_copy(copy, *va);
-    void **win_void = va_arg(copy, void **);
-    struct module_sdl2_window **win = (struct module_sdl2_window **) win_void;
+    win = (struct module_sdl2_window **) va_arg(copy, void **);
     struct queue *queue  = va_arg(copy, struct queue *);
     volatile sqlite3 *db = va_arg(copy, volatile sqlite3 *);
     bool ret = module_sdl2_new(win, queue, db);
@@ -132,9 +132,10 @@ int
 mod_close(va_list *va)
 {
     va_list copy;
+    struct module_sdl2_window **win;
     va_copy(copy, *va);
-    struct module_sdl2_window *win = va_arg(copy, void *);
-    module_sdl2_close(win);
+    win = (struct module_sdl2_window **) va_arg(copy, void **);
+    module_sdl2_close(*win);
     va_end(copy);
     return 0;
 }
@@ -143,9 +144,10 @@ int
 mod_free(va_list *va)
 {
     va_list copy;
+    struct module_sdl2_window **win;
     va_copy(copy, *va);
-    struct module_sdl2_window *win = va_arg(copy, void *);
-    module_sdl2_free(win);
+    win = (struct module_sdl2_window **) va_arg(copy, void **);
+    module_sdl2_free(*win);
     va_end(copy);
     return 0;
 }
@@ -154,9 +156,10 @@ int
 mod_toggle_pause(va_list *va)
 {
     va_list copy;
+    struct module_sdl2_window **win;
     va_copy(copy, *va);
-    struct module_sdl2_window *win = va_arg(copy, void *);
-    bool ret = module_sdl2_toggle_pause(win);
+    win = (struct module_sdl2_window **) va_arg(copy, void **);
+    bool ret = module_sdl2_toggle_pause(*win);
     va_end(copy);
     return ! ret;
 }
@@ -165,10 +168,11 @@ int
 mod_load_file(va_list *va)
 {
     va_list copy;
+    struct module_sdl2_window **win;
     va_copy(copy, *va);
-    struct module_sdl2_window *win = va_arg(copy, void *);
+    win = (struct module_sdl2_window **) va_arg(copy, void **);
     const char *file = va_arg(copy, const char *);
-    bool ret = module_sdl2_load_file(win, file);
+    bool ret = module_sdl2_load_file(*win, file);
     va_end(copy);
     return ! ret;
 }
@@ -177,10 +181,11 @@ int
 mod_set_volume(va_list *va)
 {
     va_list copy;
+    struct module_sdl2_window **win;
     va_copy(copy, *va);
-    struct module_sdl2_window *win = va_arg(copy, void *);
+    win = (struct module_sdl2_window **) va_arg(copy, void **);
     int volume = va_arg(copy, int);
-    bool ret = module_sdl2_set_volume(win, volume);
+    bool ret = module_sdl2_set_volume(*win, volume);
     va_end(copy);
     return ! ret;
 }
@@ -189,10 +194,11 @@ int
 mod_get_duration(va_list *va)
 {
     va_list copy;
+    struct module_sdl2_window **win;
     va_copy(copy, *va);
-    struct module_sdl2_window *win = va_arg(copy, void *);
+    win = (struct module_sdl2_window **) va_arg(copy, void **);
     int *duration = va_arg(copy, int *);
-    bool ret = module_sdl2_get_duration(win, duration);
+    bool ret = module_sdl2_get_duration(*win, duration);
     va_end(copy);
     return ! ret;
 }
@@ -201,10 +207,11 @@ int
 mod_get_elapsed(va_list *va)
 {
     va_list copy;
+    struct module_sdl2_window **win;
     va_copy(copy, *va);
-    struct module_sdl2_window *win = va_arg(copy, void *);
+    win = (struct module_sdl2_window **) va_arg(copy, void **);
     int *elapsed = va_arg(copy, int *);
-    bool ret = module_sdl2_get_elapsed(win, elapsed);
+    bool ret = module_sdl2_get_elapsed(*win, elapsed);
     va_end(copy);
     return ! ret;
 }
diff --git a/src/module/repo.c b/src/module/repo.c
index dba9a1b954a1d8c57efee8a87f7890be893fe79d..84f8967a1623dab65a361ae611c98a1229ab9070 100644
--- a/src/module/repo.c
+++ b/src/module/repo.c
@@ -96,9 +96,13 @@ load_repo_https(va_list *va)
 {
     va_list copy;
     va_copy(copy, *va);
-    struct lkt_repo *repo = va_arg(copy, void *);
+    struct lkt_repo **repo = (struct lkt_repo **) va_arg(copy, void **);
     struct lkt_state *srv = va_arg(copy, struct lkt_state *);
-    int ret = repo_new(repo, srv);
+    if (!*repo)
+        *repo = malloc(sizeof(struct lkt_repo));
+    if (!*repo)
+        return 1;
+    int ret = repo_new(*repo, srv);
     va_end(copy);
     return ret;
 }