diff --git a/src/module.c b/src/module.c
index fb71fa99c0685e562cf87bb478a208ae53273d18..d2ed0f6ad17ddfe785c2867e186332eacc8f16de 100644
--- a/src/module.c
+++ b/src/module.c
@@ -3,38 +3,65 @@
 ||| Pike is distributed as GPL (General Public License)
 ||| See the files COPYING and DISCLAIMER for more information.
 \*/
+#include "global.h"
 #include "module.h"
 #include "macros.h"
 #include "error.h"
+#include "builtin_functions.h"
+#include "main.h"
+#include "svalue.h"
+#include "interpret.h"
+#include "stralloc.h"
+#include "object.h"
+#include "mapping.h"
 
-#include "modlist.h"
+#include "modules/modlist_headers.h"
 
-struct module *current_module=module_list;
+typedef void (*modfun)(void);
 
-void init_modules_efuns()
+struct static_module
 {
-  unsigned int e;
-  for(e=0;e<NELEM(module_list);e++)
-  {
-    current_module=module_list+e;
-    module_list[e].init_efuns();
-  }
-  current_module=module_list;
-}
+  char *name;
+  modfun init;
+  modfun exit;
+};
 
-void init_modules_programs()
+static struct static_module module_list[] = {
+  { "builtin", init_main, exit_main }
+#include "modules/modlist.h"
+};
+
+void init_modules(void)
 {
   unsigned int e;
+  struct mapping *m = allocate_mapping(10);
+  m->refs++;
+  push_text("_static_modules");
+  push_mapping(m);
+  f_add_constant(2);
+
   for(e=0;e<NELEM(module_list);e++)
   {
-    current_module=module_list+e;
-    module_list[e].init_programs();
+    struct program *p;
+    struct object *o;
+    struct pike_string *s;
+    start_new_program();
+    module_list[e].init();
+    p=end_program();
+
+    o=clone(p,0);
+    free_program(p);
+
+    push_text(module_list[e].name); 
+    push_object(o);
+    mapping_insert(m, sp-2, sp-1);
+    pop_n_elems(2);
   }
-  current_module=module_list;
 }
 
-void exit_modules()
+void exit_modules(void)
 {
   int e;
-  for(e=NELEM(module_list)-1;e>=0;e--) module_list[e].exit();
+  for(e=NELEM(module_list)-1;e>=0;e--)
+    module_list[e].exit();
 }
diff --git a/src/module.h b/src/module.h
index 21c0bd76d4674b365940f8f4dea2eaf803dd51fd..85c5d5a216a71cb03f70e5d3b8949de8a6342976 100644
--- a/src/module.h
+++ b/src/module.h
@@ -8,24 +8,10 @@
 
 #include "types.h"
 
-typedef void (*fun)(void);
-
-struct module
-{
-  char *name;
-  fun init_efuns;  /* this one _might_ be called before the master is compiled */
-  fun init_programs; /* this one is called after the master is compiled */
-  fun exit;
-  INT32 refs;
-};
-
-#define UGLY_WORKAROUND []
-extern struct module *current_module;
-
 /* Prototypes begin here */
-void init_modules_efuns();
-void init_modules_programs();
-void exit_modules();
+struct static_module;
+void init_modules(void);
+void exit_modules(void);
 /* Prototypes end here */