diff --git a/inc/lektor/reg.h b/inc/lektor/reg.h
index e64b641479d9e1d948794bb5af50a44872bd9e0c..1799246981c570d7739a14a146fccc803867242a 100644
--- a/inc/lektor/reg.h
+++ b/inc/lektor/reg.h
@@ -6,16 +6,21 @@ struct lkt_state;
    with a name that can be generated or red from a config file. */
 struct module_reg {
     const char *name;
-    void (*func)(void);
+    union {
+        void (*func)(void);
+        void *obj;
+    };
 };
 
-#define REG_BEGIN(reg)          struct module_reg reg[] = {
-#define REG_ADD(__f)            { .name = #__f,  .func = (void(*)(void)) __f    },
-#define REG_ADD_NAMED(__n, __f) { .name = __n,   .func = (void(*)(void)) __f    },
-#define REG_END()               { .name = NULL,  .func = NULL                   } };
+#define REG_EXPORT_NAME     "__reg__"
+#define REG_BEGIN(reg)      struct module_reg reg[] = {
+#define REG_ADD(f)          { .name = #f, .func = (void(*)(void)) f },
+#define REG_ADD_NAMED(n, f) { .name = n,  .func = (void(*)(void)) f },
+#define REG_END()           { .name = NULL, .func = NULL            } };
 
+/* Use only once per .so files or you will have some problems... */
 #if ! defined(_STATIC_MODULES)
-#define REG_EXPORT(__reg)       struct module_reg *__reg__ = __reg;
+#define REG_EXPORT(__reg)   struct module_reg *__reg__ = __reg;
 #else
 #define REG_EXPORT(__reg)
 #endif
@@ -29,10 +34,14 @@ void *reg_pick(const char *file, void **handle, const char *symbol);
    shared library with REG_EXPORT. Note that this reg is named `__reg__`,
    thus no symbol must be named `__reg__` in the .so file.
    Returns 0 on success, something else on error. */
-int reg_from_file(const char *file, struct module_reg *ret);
+int reg_from_file(const char *file, struct module_reg **ret, void **handle);
 
-/* Set the ref for this .a / .so file */
-void reg_set(struct module_reg *);
+/* Set the __reg__ pointer. */
+void reg_export(struct module_reg *reg);
+
+/* Get the object named with 'name' from the reg. Returns NULL on error
+   or 'not found'. */
+void *__reg_get(struct module_reg *reg, const char *name);
 
 /* Load a module by its name. Also initialize the mod pointer. No check on data
    type is done, it is up to the user to check if the structure passed as a
diff --git a/src/main/server.c b/src/main/server.c
index 0e2f5dedf39d1425fc161d99b9c378eb3742b97f..3527e199813af4434de05c104ebb17b06f29b8e7 100644
--- a/src/main/server.c
+++ b/src/main/server.c
@@ -66,7 +66,7 @@ main(int argc, char *argv[])
     }
 
 normal_launch:
-    reg_set(server_reg);
+    reg_export(server_reg);
     mthread_init();
     pthread_create(&th, NULL, mthread_main, NULL);
     if (read_self_exe(exe, PATH_MAX))
diff --git a/src/mkv/mkv.c b/src/mkv/mkv.c
index a108cdcddbb1322c353c6f1666c7b224130fbe70..70e10586529b343c571bf82bcf1d50864f0f8cc8 100644
--- a/src/mkv/mkv.c
+++ b/src/mkv/mkv.c
@@ -608,9 +608,8 @@ kara_read_length(double *len, const char *filename)
         } else {
             if (mkv_read_element_length(&file, &elength) < 0)
                 goto error;
-            if (bufferfd_skip(&file, elength) < 0) {
+            if (bufferfd_skip(&file, elength) < 0)
                 goto error;
-            }
         }
     }
 
diff --git a/src/reg.c b/src/reg.c
index c0ba8596d723b93959d92bd01734357811f23a6c..d42614021086c358ad72c96ca930d1d85a47d7de 100644
--- a/src/reg.c
+++ b/src/reg.c
@@ -10,12 +10,27 @@
 #include <strings.h>
 #include <stddef.h>
 
-struct module_reg *reg;
+struct module_reg *__reg__;
+
+void
+reg_export(struct module_reg *reg)
+{
+    __reg__ = reg;
+}
 
 void *
-reg_pick(const char *file, void **handle, const char *symbol)
+__reg_get(struct module_reg *reg, const char *name)
 {
     int i;
+    for (i = 0; reg[i].name && reg[i].func; ++i)
+        if (STR_MATCH(reg[i].name, name))
+            return *(void **) &reg[i].func;
+    return NULL;
+}
+
+void *
+reg_pick(const char *file, void **handle, const char *symbol)
+{
     if (!symbol)
         return NULL;
 
@@ -48,17 +63,7 @@ reg_pick(const char *file, void **handle, const char *symbol)
     /* Read the reg */
 use_reg:
     LOG_INFO("REG", "Using the reg structure to find %s", symbol);
-    for (i = 0; reg[i].name && reg[i].func; ++i)
-        if (STR_MATCH(reg[i].name, symbol))
-            return *(void **) &reg[i].func;
-
-    return NULL;
-}
-
-void
-reg_set(struct module_reg *_reg)
-{
-    reg = _reg;
+    return __reg_get(__reg__, symbol);
 }
 
 int
@@ -104,3 +109,9 @@ load_module_by_name(struct lkt_state *srv, const char *name, void *mod)
     return load_so(mod_path, mod_load, mod, srv);
 }
 
+int
+reg_from_file(const char *file, struct module_reg **ret, void **handle)
+{
+    *ret = reg_pick(file, handle, REG_EXPORT_NAME);
+    return *ret != NULL;
+}