diff --git a/src/modules/Makefile.in b/src/modules/Makefile.in
index 54708a8b23e45db92a4a94d07361b51ed07f7b97..ddd99a4c2d3011572d31a1d4887b890b19872a45 100644
--- a/src/modules/Makefile.in
+++ b/src/modules/Makefile.in
@@ -1,22 +1,27 @@
 @SET_MAKE@
 
 MODULES=@subdirs@
-MODULE_OBJS=@MODULE_OBJS@
+MODULE_SEGMENTS=@MODULE_SEGMENTS@
+MODULE_LINKOPTS=@MODULE_LINKOPTS@
 
 MAKE_FLAGS = "prefix=$(prefix)" "exec_prefix=$(exec_prefix)" "CC=$(CC)" "OTHERFLAGS=$(OTHERFLAGS)" "TMP_BINDIR=$(TMP_BINDIR)" "TMP_LIBDIR=$(TMP_LIBDIR)" "RUNPIKE=$(RUNPIKE)" "DEFINES=$(DEFINES)"
 
 all: modules
 
 modules:
-	for a in $(MODULES) ; do ( cd $$a ; $(MAKE) $(MAKE_FLAGS) ) ; done
-	$(MAKE) linker_options lib_dirs
+	for a in $(MODULES) ; do ( cd $$a ; $(MAKE) $(MAKE_FLAGS) MODNAME=$$a) ; done
+	$(MAKE) linker_options lib_dirs modlist.h modlist_headers.h
 
-linker_options: $(MODULE_OBJS)
-	( for a in $(MODULES) ; do echo modules/$$a/$$a.a ; \
-	if test -f $$a/linker_options ; then cat $$a/linker_options ; else : ; fi ; \
-	done ; ) >linker_options
+modlist.h: $(MODULE_SEGMENTS)
+	( for a in $(MODULES) ; do cat $$a/modlist_segment ; done ; ) >modlist.h
 
-lib_dirs: $(MODULE_OBJS)
+modlist_headers.h: $(MODULE_SEGMENTS)
+	( for a in $(MODULES) ; do cat $$a/modlist_segment; done ) | sed -e 's/^.*{.*,\(.*\),\(.*\).*}.*$$/void \1(void),\2(void);/' >modlist_headers.h
+
+linker_options: $(MODULE_LINKOPTS)
+	( for a in $(MODULES) ; do cat $$a/linker_options ; done ; ) >linker_options
+
+lib_dirs: $(MODULE_LINKOPTS)
 	( ( if test -f master_lib_dirs; then cat master_lib_dirs; else :; fi; \
             for a in $(MODULES) ; do \
 	      if test -f $$a/lib_dirs ; then cat $$a/lib_dirs ; else : ; fi ; \
@@ -24,15 +29,18 @@ lib_dirs: $(MODULE_OBJS)
 	sed -e 's/:$$//' -e 's/^/-R/' -e 's/^-R$$//' >lib_dirs
 
 depend:
-	for a in $(MODULES) ; do ( cd $$a ; ${MAKE} $(MAKE_FLAGS) depend ) ; done
+	for a in $(MODULES) ; do ( cd $$a ; ${MAKE} $(MAKE_FLAGS) MODNAME=$$a depend ) ; done
+
+install:
+	for a in $(MODULES) ; do ( cd $$a ; ${MAKE} $(MAKE_FLAGS) MODNAME=$$a install ) ; done
 
 clean:
-	for a in $(MODULES) ; do ( cd $$a ; ${MAKE} $(MAKE_FLAGS) clean ) ; done
+	for a in $(MODULES) ; do ( cd $$a ; ${MAKE} $(MAKE_FLAGS) MODNAME=$$a clean ) ; done
 
 verify:
-	for a in $(MODULES) ; do ( cd $$a ; echo verifying $$a ; ${MAKE} $(MAKE_FLAGS) verify ) ; done
+	for a in $(MODULES) ; do ( cd $$a ; echo verifying $$a ; ${MAKE} $(MAKE_FLAGS) MODNAME=$$a verify ) ; done
 
 verbose_verify:
-	for a in $(MODULES) ; do ( cd $$a ; ${MAKE} $(MAKE_FLAGS) verbose_verify ) ; done
+	for a in $(MODULES) ; do ( cd $$a ; ${MAKE} $(MAKE_FLAGS) MODNAME=$$a verbose_verify ) ; done
 
 @dependencies@
diff --git a/src/modules/call_out/Makefile.in b/src/modules/call_out/Makefile.in
index 588de186c7795eec7bf2cd672dcdb5616179f2d1..d31956b2403f38fed257d814b0ca34e43baf9399 100644
--- a/src/modules/call_out/Makefile.in
+++ b/src/modules/call_out/Makefile.in
@@ -1,14 +1,7 @@
 SRCDIR=@srcdir@
 VPATH=@srcdir@:@srcdir@/../..:../..
-FILES=call_out.o
-
-all: call_out.a
-
-@module_makefile@
-
-call_out.a: $(FILES)
-	-rm -f call_out.a
-	ar cq call_out.a $(FILES)
-	-@RANLIB@ call_out.a
+OBJS=call_out.o
+MODULE_LDFLAGS=@LIBS@
 
+@static_module_makefile@
 @dependencies@
diff --git a/src/modules/call_out/configure.in b/src/modules/call_out/configure.in
index a6e609d9ddbf225246fdf547fad659fdab2c9ba7..0a9bb6277064a7a46912c7b57bd7c9cee9828a0d 100644
--- a/src/modules/call_out/configure.in
+++ b/src/modules/call_out/configure.in
@@ -1,12 +1,6 @@
 AC_INIT(call_out.c)
 
-AC_PROG_CC
-AC_PROG_RANLIB
-AC_SUBST(RANLIB)
-AC_SUBST_FILE(dependencies)
-dependencies=$srcdir/dependencies
-AC_SUBST_FILE(module_makefile)
-module_makefile=$srcdir/../module_makefile
+sinclude(../module_configure.in)
 
 AC_OUTPUT(Makefile,echo FOO >stamp-h )
 
diff --git a/src/modules/configure.in b/src/modules/configure.in
index e8ded21a05e3a21fffd0a8ad48ebf5c038923955..9e4229fd530ed76265be60f7646623ab4079c666 100644
--- a/src/modules/configure.in
+++ b/src/modules/configure.in
@@ -1,52 +1,29 @@
-AC_INIT(module_makefile)
+AC_INIT(dynamic_module_makefile.in)
 
 AC_SET_MAKE
 
 dirs=
-MODULE_OBJS=
-module_names=
+MODULE_LINKOBJS=
+MODULE_SEGMENTS=
+
 for a in `(cd $srcdir ; echo *)`
 do
   if test "$a" != "CVS" -a "$a" != "RCS" ; then
     if test -d "$srcdir/$a" ; then
       dirs="$dirs $a"
-      MODULE_OBJS="$MODULE_OBJS $a/$a.a"
+      MODULE_LINKOPTS="$MODULE_LINKOPTS $a/linker_options"
+      MODULE_SEGMENTS="$MODULE_SEGMENTS $a/modlist_headers"
       module_names="$module_names $a"
     fi
   fi
 done
 
-AC_SUBST(MODULE_OBJS)
+AC_SUBST(MODULE_LINKOPTS)
+AC_SUBST(MODULE_SEGMENTS)
+
 AC_SUBST_FILE(dependencies)
 dependencies=$srcdir/dependencies
 AC_CONFIG_SUBDIRS($dirs)
 
-AC_OUTPUT(Makefile,
-[
-echo creating modlist.h
-(
-echo "void init_main_efuns(void);"
-echo "void init_main_programs(void);"
-echo "void exit_main(void);"
-
-for a in $dirs
-do
-  echo "void init_"$a"_efuns(void);"
-  echo "void init_"$a"_programs(void);"
-  echo "void exit_"$a"(void);"
-done
-echo ""
-echo "struct module module_list UGLY_WORKAROUND={"
-
-echo "  { \"main\", init_main_efuns, init_main_programs, exit_main, 0 }"
-for a in $dirs
-do
-  echo " ,{ \"$a\", init_"$a"_efuns, init_"$a"_programs, exit_"$a", 0 }"
-done
-echo "};" 
-) > ../modlist.h
-]
-,
-dirs="$module_names"
-)
+AC_OUTPUT(Makefile,[],dirs="$module_names")
 
diff --git a/src/modules/files/Makefile.in b/src/modules/files/Makefile.in
index e654c893686aad3c4be5701b662fd20fb511b6e7..fbb34967a25835019bb4500675503a4debe9e8c7 100644
--- a/src/modules/files/Makefile.in
+++ b/src/modules/files/Makefile.in
@@ -1,15 +1,7 @@
 SRCDIR=@srcdir@
 VPATH=@srcdir@:@srcdir@/../..:../..
-FILES=file.o efuns.o socket.o
-
-all: files.a
-
-@module_makefile@
-
-files.a: $(FILES)
-	-rm -f files.a
-	ar cq files.a $(FILES)
-	-@RANLIB@ files.a
-	echo >linker_options @LIBS@
+OBJS=file.o efuns.o socket.o
+MODULE_LDFLAGS=@LIBS@
 
+@static_module_makefile@
 @dependencies@
diff --git a/src/modules/files/configure.in b/src/modules/files/configure.in
index 0f4f5b61930f07a4581445bda74b0ee6a12cd50f..5f0033be194e0968c529f64f94f5a256f62ec795 100644
--- a/src/modules/files/configure.in
+++ b/src/modules/files/configure.in
@@ -1,13 +1,7 @@
 AC_INIT(file.c)
 AC_CONFIG_HEADER(file_machine.h)
 
-AC_PROG_CC
-AC_PROG_RANLIB
-AC_SUBST(RANLIB)
-AC_SUBST_FILE(dependencies)
-dependencies=$srcdir/dependencies
-AC_SUBST_FILE(module_makefile)
-module_makefile=$srcdir/../module_makefile
+sinclude(../module_configure.in)
 
 AC_HAVE_HEADERS(arpa/inet.h sys/socketvar.h netinet/in.h \
  sys/stream.h sys/protosw.h netdb.h)
diff --git a/src/modules/gdbmmod/Makefile.in b/src/modules/gdbmmod/Makefile.in
index 83310b82bc6134a27060a0b3924a07918c0f981a..75379bf80d5b3cbf7a69e307678bdd626a7ca047 100644
--- a/src/modules/gdbmmod/Makefile.in
+++ b/src/modules/gdbmmod/Makefile.in
@@ -1,17 +1,7 @@
 SRCDIR=@srcdir@
 VPATH=@srcdir@:@srcdir@/../..:../..
+MODULE_LDFLAGS=@LIBS@
+OBJS=gdbmmod.o
 
-FILES=gdbmmod.o
-LIB=gdbmmod.a
-
-all: $(LIB)
-
-@module_makefile@
-
-$(LIB): $(FILES)
-	-rm -f $(LIB)
-	ar cq $(LIB) $(FILES)
-	-@RANLIB@ $(LIB)
-	echo >linker_options @LIBS@
-
+@static_module_makefile@
 @dependencies@
diff --git a/src/modules/gdbmmod/configure.in b/src/modules/gdbmmod/configure.in
index 6619e71f5e3aba3d21746951e122e5cae7fc41bd..1ae3ef7fa67fc824d10a947fd5ab2b5b480c017e 100644
--- a/src/modules/gdbmmod/configure.in
+++ b/src/modules/gdbmmod/configure.in
@@ -3,13 +3,7 @@ AC_CONFIG_HEADER(gdbm_machine.h)
 
 AC_ARG_WITH(gdbm,    [  --with(out)-gdbm       GNU database manager support ],[],[with_gdbm=yes])
 
-AC_PROG_CC
-AC_PROG_RANLIB
-AC_SUBST(RANLIB)
-AC_SUBST_FILE(dependencies)
-dependencies=$srcdir/dependencies
-AC_SUBST_FILE(module_makefile)
-module_makefile=$srcdir/../module_makefile
+sinclude(../module_configure.in)
 
 if test x$with_gdbm = xyes; then
   AC_CHECK_HEADERS(gdbm.h)
diff --git a/src/modules/gdbmmod/gdbmmod.c b/src/modules/gdbmmod/gdbmmod.c
index 0333d3b44fb80bcf79bbb748a3526aedda0eb6ce..287eb8231d4b86cf9f8cf5c60d6a5cf1b6aef797 100644
--- a/src/modules/gdbmmod/gdbmmod.c
+++ b/src/modules/gdbmmod/gdbmmod.c
@@ -4,7 +4,7 @@
 ||| See the files COPYING and DISCLAIMER for more information.
 \*/
 #include "global.h"
-RCSID("$Id: gdbmmod.c,v 1.5 1997/01/18 22:01:26 hubbe Exp $");
+RCSID("$Id: gdbmmod.c,v 1.6 1997/02/07 00:42:11 hubbe Exp $");
 #include "gdbm_machine.h"
 #include "types.h"
 #include "threads.h"
@@ -329,10 +329,9 @@ static void exit_gdbm_glue(struct object *o)
 
 #endif
 
-void init_gdbmmod_efuns(void) {}
-void exit_gdbmmod(void) {}
+void pike_module_exit(void) {}
 
-void init_gdbmmod_programs(void)
+void pike_module_init(void)
 {
 #if defined(HAVE_GDBM_H) && defined(HAVE_LIBGDBM)
   start_new_program();
@@ -353,8 +352,7 @@ void init_gdbmmod_programs(void)
 
   set_init_callback(init_gdbm_glue);
   set_exit_callback(exit_gdbm_glue);
-
-  end_c_program("/precompiled/gdbm");
+  end_class("gdbm");
 #endif
 }
 
diff --git a/src/modules/gmpmod/Makefile.in b/src/modules/gmpmod/Makefile.in
index 7f875d752cb8a9b5208852428a73a863e47cf0f2..a7c8bf3359a841d71cd7ba63701fc2cfdb09843c 100644
--- a/src/modules/gmpmod/Makefile.in
+++ b/src/modules/gmpmod/Makefile.in
@@ -1,17 +1,7 @@
 SRCDIR=@srcdir@
 VPATH=@srcdir@:@srcdir@/../..:../..
+MODULE_LDFLAGS=@LIBS@
+OBJS=mpz_glue.o
 
-FILES=mpz_glue.o
-LIB=gmpmod.a
-
-all: $(LIB)
-
-@module_makefile@
-
-$(LIB): $(FILES)
-	-rm -f $(LIB)
-	ar cq $(LIB) $(FILES)
-	-@RANLIB@ $(LIB)
-	echo >linker_options @LIBS@
-
+@static_module_makefile@
 @dependencies@
diff --git a/src/modules/gmpmod/configure.in b/src/modules/gmpmod/configure.in
index d68e301ed273fe0c12621bf5d86ca0a05e6b9a6a..0df3eec9246412a615eb05ac4a7721ec12630c80 100644
--- a/src/modules/gmpmod/configure.in
+++ b/src/modules/gmpmod/configure.in
@@ -2,13 +2,7 @@ AC_INIT(mpz_glue.c)
 AC_CONFIG_HEADER(gmp_machine.h)
 AC_ARG_WITH(gmp,     [  --with(out)-gmp        Support bignums],[],[with_gmp=yes])
 
-AC_PROG_CC
-AC_PROG_RANLIB
-AC_SUBST(RANLIB)
-AC_SUBST_FILE(dependencies)
-dependencies=$srcdir/dependencies
-AC_SUBST_FILE(module_makefile)
-module_makefile=$srcdir/../module_makefile
+sinclude(../module_configure.in)
 
 if test x$with_gmp = xyes ; then
   AC_CHECK_HEADERS(gmp.h)
diff --git a/src/modules/gmpmod/mpz_glue.c b/src/modules/gmpmod/mpz_glue.c
index 7b70fbfcd66f2ff61b9a3a43dd5d19ca341eaadf..d444a288bd94fb5eeb4e73c1e90e6fcd8de62bc3 100644
--- a/src/modules/gmpmod/mpz_glue.c
+++ b/src/modules/gmpmod/mpz_glue.c
@@ -4,7 +4,7 @@
 ||| See the files COPYING and DISCLAIMER for more information.
 \*/
 #include "global.h"
-RCSID("$Id: mpz_glue.c,v 1.13 1996/12/12 17:15:35 grubba Exp $");
+RCSID("$Id: mpz_glue.c,v 1.14 1997/02/07 00:42:42 hubbe Exp $");
 #include "gmp_machine.h"
 #include "types.h"
 
@@ -578,8 +578,7 @@ static void exit_mpz_glue(struct object *o)
 }
 #endif
 
-void init_gmpmod_efuns(void) {}
-void exit_gmpmod(void)
+void pike_module_exit(void)
 {
 #ifdef HAVE_GMP_H
   if(temporary) free_object(temporary);
@@ -587,7 +586,7 @@ void exit_gmpmod(void)
 #endif
 }
 
-void init_gmpmod_programs(void)
+void pike_module_init(void)
 {
 #ifdef HAVE_GMP_H
   start_new_program();
@@ -660,8 +659,8 @@ void init_gmpmod_programs(void)
   set_init_callback(init_mpz_glue);
   set_exit_callback(exit_mpz_glue);
 
-  mpzmod_program=end_c_program("/precompiled/mpz");
-  mpzmod_program->refs++;
+  mpzmod_program=end_program();
+  add_program_constant("mpz",mpzmod_program,0);
 #endif
 }
 
diff --git a/src/modules/image/Makefile.in b/src/modules/image/Makefile.in
index 389cb503ab03a6a6ac4c301edc5d567c646615df..b28ff0d6bfbe5515768107fb5d5e380598a2ac1b 100644
--- a/src/modules/image/Makefile.in
+++ b/src/modules/image/Makefile.in
@@ -1,22 +1,15 @@
 SRCDIR=@srcdir@
 VPATH=@srcdir@:@srcdir@/../..:../..
-
-all: image.a
-
-@module_makefile@
-
-FILES =	image.o font.o quant.o lzw.o togif.o matrix.o pnm.o blit.o \
+OBJS = image.o font.o quant.o lzw.o togif.o matrix.o pnm.o blit.o \
 	pattern.o dct.o operator.o
+MODNAME=image
 
-image.a: $(FILES)
-	-rm -f image.a
-	ar cq image.a $(FILES)
-	-@RANLIB@ image.a
+@dynamic_module_makefile@
 
-pike: image.a
+pike: all
 	cd ../..; make
 
-pure: image.a
+pure: all
 	cd ../..; make pure
 
 
diff --git a/src/modules/image/configure.in b/src/modules/image/configure.in
index 750eb58c58537d128a500c140be0852185b0dbef..4df99cce8ce80f712f8a1b3dc45eefb9111abc27 100644
--- a/src/modules/image/configure.in
+++ b/src/modules/image/configure.in
@@ -1,13 +1,9 @@
 AC_INIT(image.c)
 AC_CONFIG_HEADER(config.h)
 
-AC_PROG_CC
-AC_PROG_RANLIB
+sinclude(../module_configure.in)
+
 AC_FUNC_MMAP
-AC_SUBST_FILE(dependencies)
-dependencies=$srcdir/dependencies
-AC_SUBST_FILE(module_makefile)
-module_makefile=$srcdir/../module_makefile
 
 AC_CHECK_HEADERS(sys/fcntl.h fcntl.h stdlib.h)
 
diff --git a/src/modules/math/Makefile.in b/src/modules/math/Makefile.in
index 669fb7a76a75405761e78732977d5d88245f4b11..71853f100c9e20ffb739b909e007d0de4c59151c 100644
--- a/src/modules/math/Makefile.in
+++ b/src/modules/math/Makefile.in
@@ -1,16 +1,7 @@
 SRCDIR=@srcdir@
 VPATH=@srcdir@:@srcdir@/../..:../..
+MODULE_LDFLAGS=@LIBS@
+OBJS=math.o
 
-FILES=math.o
-
-all: math.a
-
-@module_makefile@
-
-math.a: $(FILES)
-	-rm -f math.a
-	ar cq math.a $(FILES)
-	-@RANLIB@ math.a
-	echo >linker_options @LIBS@
-
+@static_module_makefile@
 @dependencies@
diff --git a/src/modules/math/configure.in b/src/modules/math/configure.in
index bcd847a2787a3289e84734ad5806b09ace37cdb4..3795e0c145795474a692f8ceb9088acf2fcf425a 100644
--- a/src/modules/math/configure.in
+++ b/src/modules/math/configure.in
@@ -1,7 +1,6 @@
 AC_INIT(math.c)
 
-AC_PROG_CC
-AC_PROG_RANLIB
+sinclude(../module_configure.in)
 
 AC_CHECK_LIB(m, floor)
 if test "${ac_cv_lib_m}" = "no" -a "${pike_cv_sys_os}" = "Linux"; then
@@ -9,11 +8,6 @@ if test "${ac_cv_lib_m}" = "no" -a "${pike_cv_sys_os}" = "Linux"; then
   LIBS="${LIBS} -lc -lm"
 fi
 
-AC_SUBST(RANLIB)
-AC_SUBST_FILE(dependencies)
-dependencies=$srcdir/dependencies
-AC_SUBST_FILE(module_makefile)
-module_makefile=$srcdir/../module_makefile
 
 AC_OUTPUT(Makefile,echo FOO >stamp-h )
 
diff --git a/src/modules/mysql/Makefile.in b/src/modules/mysql/Makefile.in
index 9993327a5ae911bd78c6361222a8502bb6e69e0c..ee236764a8d0eecd00bfa1928a0cc69cd362082e 100644
--- a/src/modules/mysql/Makefile.in
+++ b/src/modules/mysql/Makefile.in
@@ -1,34 +1,12 @@
 #
-# $Id: Makefile.in,v 1.2 1997/01/30 22:07:43 grubba Exp $
+# $Id: Makefile.in,v 1.3 1997/02/07 00:43:32 hubbe Exp $
 #
 
 SRCDIR=@srcdir@
 VPATH=@srcdir@:@srcdir@/../..:../..
-PREFLAGS=$(DEFINES) @DEFS@ -I. -I$(SRCDIR) -I$(SRCDIR)/../.. -I../.. @CPPFLAGS@
-
-CFLAGS=$(PREFLAGS) $(OTHERFLAGS)
-
+MODULE_CPPFLAGS=@DEFS@ @CPPFLAGS@
 OBJS=mysql.o result.o
+MODULE_LDFLAGS=@LDFLAGS@ @MYSQL_LIBS@
 
-all: mysql.a linker_options
-
-mysql.a: $(OBJS)
-	-rm -f mysql.a
-	ar cq mysql.a $(OBJS)
-	-@RANLIB@ mysql.a
-
-linker_options: Makefile
-	echo >linker_options "@LDFLAGS@ @MYSQL_LIBS@"
-
-verify:
-	@echo No tests for the mysql-module.
-
-verbose_verify: verify
-
-clean:
-	-rm -f *.o *.a
-
-depend:
-	gcc -MM $(PREFLAGS) $(SRCDIR)/*.c | $(TMP_BINDIR)/fixdepends.sh $(SRCDIR)
-
+@dynamic_module_makefile@
 @dependencies@
\ No newline at end of file
diff --git a/src/modules/mysql/configure.in b/src/modules/mysql/configure.in
index 1d0fad69ae0f3251dc85e2da9091f2ceccc302cd..14acbf07f78ce57a357fe046890b71c6b64f4d16 100644
--- a/src/modules/mysql/configure.in
+++ b/src/modules/mysql/configure.in
@@ -1,5 +1,5 @@
 #
-# $Id: configure.in,v 1.14 1997/02/01 14:44:37 grubba Exp $
+# $Id: configure.in,v 1.15 1997/02/07 00:43:33 hubbe Exp $
 #
 # Configure script for the mysql-module
 #
@@ -20,11 +20,7 @@
 AC_INIT(mysql.c)
 AC_CONFIG_HEADER(config.h)
 
-AC_PROG_CC
-AC_PROG_RANLIB
-AC_SUBST(RANLIB)
-AC_SUBST_FILE(dependencies)
-dependencies=$srcdir/dependencies
+sinclude(../module_configure.in)
 
 OLD_LIBS=$LIBS
 OLD_LDFLAGS=$LDFLAGS
diff --git a/src/modules/pipe/Makefile.in b/src/modules/pipe/Makefile.in
index 9184af8ceb3d39be27945004451471d248d18591..2f114663c728caf7b6e11bb301fe8a705f77db0e 100644
--- a/src/modules/pipe/Makefile.in
+++ b/src/modules/pipe/Makefile.in
@@ -1,15 +1,6 @@
 SRCDIR=@srcdir@
 VPATH=@srcdir@:@srcdir@/../..:../..
+OBJS=pipe.o
 
-FILES=pipe.o
-
-all: pipe.a
-
-@module_makefile@
-
-pipe.a: $(FILES)
-	-rm -f pipe.a
-	ar cq pipe.a $(FILES)
-	-@RANLIB@ pipe.a
-
+@dynamic_module_makefile@
 @dependencies@
diff --git a/src/modules/pipe/configure.in b/src/modules/pipe/configure.in
index 00033f8fde5c6cf9895b1b867681567c2a66d697..84dd753063f827919780d8d80eb1b3967a264fdf 100644
--- a/src/modules/pipe/configure.in
+++ b/src/modules/pipe/configure.in
@@ -1,16 +1,7 @@
 AC_INIT(pipe.c)
 AC_CONFIG_HEADER(config.h)
 
-AC_PROG_CC
-AC_PROG_RANLIB
-
-AC_SUBST(RANLIB)
-
-AC_SUBST_FILE(dependencies)
-dependencies=$srcdir/dependencies
-
-AC_SUBST_FILE(module_makefile)
-module_makefile=$srcdir/../module_makefile
+sinclude(../module_configure.in)
 
 AC_HAVE_HEADERS(sys/mman.h linux/mman.h)
 AC_HAVE_FUNCS(mmap munmap)
diff --git a/src/modules/readlinemod/Makefile.in b/src/modules/readlinemod/Makefile.in
index c3def860f319249ab23d1082b6090cb1c2360aa6..e678eb017c229e583888648a72a67196be1b8116 100644
--- a/src/modules/readlinemod/Makefile.in
+++ b/src/modules/readlinemod/Makefile.in
@@ -1,37 +1,8 @@
 SRCDIR=@srcdir@
 VPATH=@srcdir@:@srcdir@/../..:../..
-PREFLAGS=$(DEFINES) -I. -I$(SRCDIR) -I$(SRCDIR)/../.. -I../.. @CPPFLAGS@
-CFLAGS=$(PREFLAGS) $(OTHERFLAGS)
-
-FILES=readlinemod.o
-LIB=readlinemod.a
-
-$(LIB): $(FILES)
-	-rm -f $(LIB)
-	ar cq $(LIB) $(FILES)
-	-@RANLIB@ $(LIB)
-	echo >linker_options @LIBS@
-
-clean:
-	-rm -f *.o *.a
-
-depend:
-	gcc -MM $(PREFLAGS) $(SRCDIR)/*.c | $(TMP_BINDIR)/fixdepends.sh $(SRCDIR)
-
-#verify / debug
-module_testsuite: $(SRCDIR)/testsuite.in
-	$(TMP_BINDIR)/mktestsuite $(SRCDIR)/testsuite.in >module_testsuite
-
-verify: module_testsuite
-	$(RUNPIKE) $(TMP_BINDIR)/test_pike.pike module_testsuite
-
-verbose_verify: module_testsuite
-	$(RUNPIKE) $(TMP_BINDIR)/test_pike.pike module_testsuite --verbose
-
-gdb_verify: module_testsuite
-	@echo >.gdbinit handle SIGUSR1 nostop noprint pass
-	@echo >>.gdbinit run -m @srcdir@/../../../lib/master.pike $(PIKEOPTS) @srcdir@/../../../bin/test_pike.pike module_testsuite -v -v -f
-	gdb ../../pike
-	@rm .gdbinit
+MODULE_CPPFLAGS=@CPPFLAGS@
+MODULE_LDFLAGS=@LIBS@
+OBJS=readlinemod.o
 
+@dynamic_module_makefile@
 @dependencies@
diff --git a/src/modules/readlinemod/configure.in b/src/modules/readlinemod/configure.in
index 2c6dcf2e591abb49bac59282b113502a072a1e89..2d27610c9c5ff16709debbe3e480da6bd5f4ae60 100644
--- a/src/modules/readlinemod/configure.in
+++ b/src/modules/readlinemod/configure.in
@@ -2,12 +2,7 @@ AC_INIT(readlinemod.c)
 AC_CONFIG_HEADER(readline_machine.h)
 AC_ARG_WITH(readline,[  --with(out)-readline   support command line editing],[],[with_readline=yes])
 
-AC_PROG_CC
-AC_PROG_RANLIB
-AC_SUBST(RANLIB)
-
-AC_SUBST_FILE(dependencies)
-dependencies=$srcdir/dependencies
+sinclude(../module_configure.in)
 
 if test x$with_readline = xyes ; then
   AC_MSG_CHECKING(Checking for GNU directory)
diff --git a/src/modules/regexp/Makefile.in b/src/modules/regexp/Makefile.in
index 9330113b6564a295fa8ed7dcf15b62a3833d36b4..21853b9fc4c4f4ec9110cbd08caed4824af78aa6 100644
--- a/src/modules/regexp/Makefile.in
+++ b/src/modules/regexp/Makefile.in
@@ -1,15 +1,6 @@
 SRCDIR=@srcdir@
 VPATH=@srcdir@:@srcdir@/../..:../..
+OBJS=regexp.o glue.o
 
-FILES=regexp.o glue.o
-
-all: regexp.a
-
-@module_makefile@
-
-regexp.a: $(FILES)
-	-rm -f regexp.a
-	ar cq regexp.a $(FILES)
-	-@RANLIB@ regexp.a
-
+@dynamic_module_makefile@
 @dependencies@
\ No newline at end of file
diff --git a/src/modules/regexp/configure.in b/src/modules/regexp/configure.in
index 657933265f4bb35247b34e89a7ea73a86292b7d9..ed3283c8eec415697210f9591f054dac166c5e4c 100644
--- a/src/modules/regexp/configure.in
+++ b/src/modules/regexp/configure.in
@@ -1,14 +1,6 @@
 AC_INIT(regexp.c)
 
-AC_PROG_CC
-AC_PROG_RANLIB
-AC_SUBST(RANLIB)
-
-AC_SUBST_FILE(dependencies)
-dependencies=$srcdir/dependencies
-
-AC_SUBST_FILE(module_makefile)
-module_makefile=$srcdir/../module_makefile
+sinclude(../module_configure.in)
 
 
 AC_OUTPUT(Makefile,echo FOO >stamp-h )
diff --git a/src/modules/regexp/glue.c b/src/modules/regexp/glue.c
index 72f6ae956df43cbc613be5f815b9cc90bd430264..04cf266c257b4c2ef523bbf11179e346823adbf5 100644
--- a/src/modules/regexp/glue.c
+++ b/src/modules/regexp/glue.c
@@ -103,12 +103,10 @@ static void exit_regexp_glue(struct object *o)
 }
 
 
-void init_regexp_efuns(void) {}
-void exit_regexp(void) {}
+void pike_module_exit(void) {}
 
-void init_regexp_programs(void)
+void pike_module_init(void)
 {
-  start_new_program();
   add_storage(sizeof(struct regexp_glue));
   
   add_function("create",regexp_create,"function(void|string:void)",0);
@@ -117,6 +115,4 @@ void init_regexp_programs(void)
 
   set_init_callback(init_regexp_glue);
   set_exit_callback(exit_regexp_glue);
-
-  end_c_program("/precompiled/regexp");
 }
diff --git a/src/modules/spider/Makefile.in b/src/modules/spider/Makefile.in
index 0baa99c21c3f499fbfe289dd9909caa386116d27..986ef29a8fb3f4525e345ce92d4f6ca5f45aa611 100644
--- a/src/modules/spider/Makefile.in
+++ b/src/modules/spider/Makefile.in
@@ -1,36 +1,6 @@
 SRCDIR=@srcdir@
 VPATH=@srcdir@:@srcdir@/../..:../..
-PREFLAGS=$(DEFINES) -I. -I$(SRCDIR) -I$(SRCDIR)/../.. -I../..
-CFLAGS=$(PREFLAGS) $(OTHERFLAGS)
-
-FILES=spider.o discdate.o stardate.o dumudp.o streamed_parser.o accesseddb.o
-
-spider.a: $(FILES)
-	-rm -f spider.a
-	ar cq spider.a $(FILES)
-	-@RANLIB@ spider.a
-
-clean:
-	-rm -f *.o *.a
-
-depend:
-	gcc -MM $(PREFLAGS) $(SRCDIR)/*.c | $(TMP_BINDIR)/fixdepends.sh $(SRCDIR)
-
-#verify / debug
-module_testsuite: $(SRCDIR)/testsuite.in
-	$(TMP_BINDIR)/mktestsuite $(SRCDIR)/testsuite.in >module_testsuite
-
-verify: module_testsuite
-	$(RUNPIKE) $(TMP_BINDIR)/test_pike.pike module_testsuite
-
-verbose_verify: module_testsuite
-	$(RUNPIKE) $(TMP_BINDIR)/test_pike.pike module_testsuite --verbose
-
-
-gdb_verify: module_testsuite
-	@echo >.gdbinit handle SIGUSR1 nostop noprint pass
-	@echo >>.gdbinit run -m @srcdir@/../../../lib/master.pike $(PIKEOPTS) @srcdir@/../../../bin/test_pike.pike module_testsuite -v -v -f
-	gdb ../../pike
-	@rm .gdbinit
+OBJS=spider.o discdate.o stardate.o dumudp.o streamed_parser.o accesseddb.o
 
+@static_module_makefile@
 @dependencies@
diff --git a/src/modules/spider/configure.in b/src/modules/spider/configure.in
index de6c15a1ce5360217d421f2577eebb6a1ad504d8..b52caee5b716bca8e9335a03e5ee68cffb4b893e 100644
--- a/src/modules/spider/configure.in
+++ b/src/modules/spider/configure.in
@@ -1,8 +1,7 @@
 AC_INIT(spider.c)
 AC_CONFIG_HEADER(config.h)
 
-AC_PROG_CC
-AC_PROG_RANLIB
+sinclude(../module_configure.in)
 
 AC_CHECK_LIB(socket, socket)
 AC_CHECK_LIB(nsl, gethostbyname)
@@ -18,10 +17,6 @@ AC_HAVE_FUNCS(perror strdup sendmsg)
 
 AC_CHECK_TYPE(time_t, long)
 
-AC_SUBST(RANLIB)
-AC_SUBST_FILE(dependencies)
-dependencies=$srcdir/dependencies
-
 AC_MSG_CHECKING(how to find timezone)
 
 AC_CACHE_VAL(pike_cv_timezone,
diff --git a/src/modules/sprintf/Makefile.in b/src/modules/sprintf/Makefile.in
index fde69de030141464ed04562332a8e7ed6e5cc1e7..10842a53e155a16abcd0c1c36fc1662c272299ec 100644
--- a/src/modules/sprintf/Makefile.in
+++ b/src/modules/sprintf/Makefile.in
@@ -1,14 +1,6 @@
 SRCDIR=@srcdir@
 VPATH=@srcdir@:@srcdir@/../..:../..
-FILES=sprintf.o
-
-all: sprintf.a
-
-@module_makefile@
-
-sprintf.a: $(FILES)
-	-rm -f sprintf.a
-	ar cq sprintf.a $(FILES)
-	-@RANLIB@ sprintf.a
+OBJS=sprintf.o
 
+@static_module_makefile@
 @dependencies@
diff --git a/src/modules/sprintf/configure.in b/src/modules/sprintf/configure.in
index f85c2e17cc66301445eba2f9009956dcf41c7957..a1593a9c61187726adce4e8064ae6c156d4c9e38 100644
--- a/src/modules/sprintf/configure.in
+++ b/src/modules/sprintf/configure.in
@@ -1,15 +1,6 @@
 AC_INIT(sprintf.c)
 
-AC_PROG_CC
-AC_PROG_RANLIB
-AC_SUBST(RANLIB)
-
-AC_SUBST_FILE(dependencies)
-dependencies=$srcdir/dependencies
-
-AC_SUBST_FILE(module_makefile)
-module_makefile=$srcdir/../module_makefile
-
+sinclude(../module_configure.in)
 
 AC_OUTPUT(Makefile,echo FOO >stamp-h )
 
diff --git a/src/modules/sprintf/sprintf.c b/src/modules/sprintf/sprintf.c
index 688808018d5697f79370b0a2ad2ec772e93eda20..eaf8952630f6808e6558949ccff04aa389699436 100644
--- a/src/modules/sprintf/sprintf.c
+++ b/src/modules/sprintf/sprintf.c
@@ -96,7 +96,7 @@
 */
 
 #include "global.h"
-RCSID("$Id: sprintf.c,v 1.8 1996/12/07 03:13:27 hubbe Exp $");
+RCSID("$Id: sprintf.c,v 1.9 1997/02/07 00:45:06 hubbe Exp $");
 #include "error.h"
 #include "array.h"
 #include "svalue.h"
@@ -852,14 +852,13 @@ static void f_sprintf(INT32 num_arg)
   push_string(ret);
 }
 
-void init_sprintf_efuns(void)
+void pike_module_init(void)
 {
   add_efun("sprintf", f_sprintf,"function(string, mixed ... : string)",
 	   OPT_TRY_OPTIMIZE);
 }
-void init_sprintf_programs(void) {}
 
-void exit_sprintf(void)
+void pike_module_exit(void)
 {
   free_sprintf_strings();
 }
diff --git a/src/modules/ssleay/Makefile.in b/src/modules/ssleay/Makefile.in
index 1f33e415f90dbc97fa68394540511f5bcbdc50a3..03ef9ccd3254f8908ade770b9461f417c89c36b6 100644
--- a/src/modules/ssleay/Makefile.in
+++ b/src/modules/ssleay/Makefile.in
@@ -1,29 +1,9 @@
 SRCDIR=@srcdir@
 VPATH=@srcdir@:@srcdir@/../..:../..
-PREFLAGS=$(DEFINES) @DEFS@ -I. -I$(SRCDIR) -I$(SRCDIR)/../.. -I../.. @CPPFLAGS@
-
-CFLAGS=$(PREFLAGS) $(OTHERFLAGS)
-
+MODULE_CLAGS=@DEFS@ @CPPFLAGS@
 OBJS=ssleay.o
+MODULE_LDFLAGS=@LDFLAGS@ @LIBS@
 
-ssleay.a: $(OBJS)
-	-rm -f ssleay.a
-	ar cq ssleay.a $(OBJS)
-	-@RANLIB@ ssleay.a
-	echo >linker_options "@LDFLAGS@ @LIBS@"
-
-linker_options: Makefile
-	echo >linker_options "@LDFLAGS@ @LIBS@"
-
-verify:
-	@echo No tests for the ssleay-module.
-
-verbose_verify: verify
-
-clean:
-	-rm -f *.o *.a
-
-depend:
-	gcc -MM $(PREFLAGS) $(SRCDIR)/*.c | $(TMP_BINDIR)/fixdepends.sh $(SRCDIR)
+@dynamic_module_makefile@
+@dependencies@
 
-@dependencies@
\ No newline at end of file
diff --git a/src/modules/ssleay/configure.in b/src/modules/ssleay/configure.in
index c9db0cefb608b1566c47f740e10bf5e927f41364..dedd922090f9bce519a760d803e963ca3327c34a 100644
--- a/src/modules/ssleay/configure.in
+++ b/src/modules/ssleay/configure.in
@@ -1,11 +1,6 @@
 AC_INIT(ssleay.c)
 
-AC_PROG_CC
-AC_PROG_RANLIB
-AC_SUBST(RANLIB)
-AC_SUBST_FILE(dependencies)
-dependencies=$srcdir/dependencies
-
+sinclude(../module_configure.in)
 
 AC_ARG_WITH(ssleay,  [  --without-ssleay       no support for the secure socket protocol],[],[with_ssleay=yes])
 
diff --git a/src/modules/ssleay/ssleay.c b/src/modules/ssleay/ssleay.c
index d4ca450b77b4221d7692d0c3b2a63c35cd0970a1..6c9bc50da078ea4188dc32d8ae869a6c0d4d91a6 100644
--- a/src/modules/ssleay/ssleay.c
+++ b/src/modules/ssleay/ssleay.c
@@ -5,7 +5,7 @@
 \*/
 
 #include "global.h"
-RCSID("$Id: ssleay.c,v 1.8 1996/12/15 17:40:00 nisse Exp $");
+RCSID("$Id: ssleay.c,v 1.9 1997/02/07 00:45:45 hubbe Exp $");
 #include "types.h"
 #include "interpret.h"
 #include "svalue.h"
@@ -260,19 +260,17 @@ void exit_connection(struct object *o)
 
 #endif /* HAVE_SSLEAY */
 
-void init_ssleay_efuns(void)
-{
-}
-
-void exit_ssleay()
+void pike_module_exit()
 {
 #ifdef HAVE_SSLEAY
   free_program(ssleay_connection_program);
   free_program(ssleay_program);
+  ssleay_connection_program=0;
+  ssleay_program=0;
 #endif
 }
 
-void init_ssleay_programs(void)
+void pike_module_init(void)
 {
 #ifdef HAVE_SSLEAY
   ERR_load_ERR_strings();
@@ -292,8 +290,8 @@ void init_ssleay_programs(void)
   set_init_callback(init_context);
   set_exit_callback(exit_context);
 
-  ssleay_program=end_c_program("/precompiled/ssleay");
-  ssleay_program->refs++;
+  ssleay_program=end_program();
+  add_program_constant("ssleay",ssleay_program);
   
   start_new_program();
   add_storage(sizeof(struct ssleay_connection));
@@ -307,8 +305,8 @@ void init_ssleay_programs(void)
   set_init_callback(init_connection);
   set_exit_callback(exit_connection);
 
-  ssleay_connection_program=end_c_program("/precompiled/ssleay_connection");
-  ssleay_connection_program->refs++;
+  ssleay_connection_program=end_program();
+  add_program_constant("connection",ssleay_program);
 #endif /* HAVE_SSLEAY */
 }
 
diff --git a/src/modules/system/Makefile.in b/src/modules/system/Makefile.in
index 4bee07b23689212f91a63fceb619a99b1bb945df..d1c6888a9ce9c7e3e81a3ed418eeab0da3ff8bb5 100644
--- a/src/modules/system/Makefile.in
+++ b/src/modules/system/Makefile.in
@@ -1,15 +1,7 @@
 SRCDIR=@srcdir@
 VPATH=@srcdir@:@srcdir@/../..:../..
-FILES=system.o syslog.o passwords.o
-
-all: system.a
-
-@module_makefile@
-
-system.a: $(FILES)
-	-rm -f system.a
-	ar cq system.a $(FILES)
-	-@RANLIB@ system.a
-	echo >linker_options @LIBS@
+OBJS=system.o syslog.o passwords.o
+MODULE_LDFLAGS=@LIBS@
 
+@static_module_makefile@
 @dependencies@
diff --git a/src/modules/system/configure.in b/src/modules/system/configure.in
index c515b7e9c3afe05865dfd7551ad25f8f379ceae1..ecc8c4ee2707b17c7e782e1968cbbbf32891f75f 100644
--- a/src/modules/system/configure.in
+++ b/src/modules/system/configure.in
@@ -1,13 +1,7 @@
 AC_INIT(system.c)
 AC_CONFIG_HEADER(system_machine.h)
 
-AC_PROG_CC
-AC_PROG_RANLIB
-AC_SUBST(RANLIB)
-AC_SUBST_FILE(dependencies)
-dependencies=$srcdir/dependencies
-AC_SUBST_FILE(module_makefile)
-module_makefile=$srcdir/../module_makefile
+sinclude(../module_configure.in)
 
 AC_CHECK_LIB(socket, socket)
 AC_CHECK_LIB(nsl, gethostbyname)
diff --git a/src/modules/system/system.c b/src/modules/system/system.c
index b0ebf6f4290bd70b8fed5d6bfc91cab7ddedb43f..1c1a8df6edc9eec5a9b47f519db0e988a1d76db2 100644
--- a/src/modules/system/system.c
+++ b/src/modules/system/system.c
@@ -1,5 +1,5 @@
 /*
- * $Id: system.c,v 1.10 1997/02/05 01:22:55 neotron Exp $
+ * $Id: system.c,v 1.11 1997/02/07 00:46:26 hubbe Exp $
  *
  * System-call module for Pike
  *
@@ -14,7 +14,7 @@
 #include "system.h"
 
 #include <global.h>
-RCSID("$Id: system.c,v 1.10 1997/02/05 01:22:55 neotron Exp $");
+RCSID("$Id: system.c,v 1.11 1997/02/07 00:46:26 hubbe Exp $");
 #include <module_support.h>
 #include <las.h>
 #include <interpret.h>
@@ -691,7 +691,7 @@ void f_gethostbyname(INT32 args)
  * Module linkage
  */
 
-void init_system_efuns(void)
+void pike_module_init(void)
 {
   /*
    * From this file:
@@ -776,10 +776,6 @@ void init_system_efuns(void)
 
 }
 
-void init_system_programs(void)
-{
-}
-
-void exit_system(void)
+void pike_module_exit(void)
 {
 }
diff --git a/src/modules/zlibmod/Makefile.in b/src/modules/zlibmod/Makefile.in
index c0d39f77c059883d92ed5f7b85333826781c569d..77326ae1469f9fd62b7ee2669ea147482d594afc 100644
--- a/src/modules/zlibmod/Makefile.in
+++ b/src/modules/zlibmod/Makefile.in
@@ -1,16 +1,7 @@
 SRCDIR=@srcdir@
 VPATH=@srcdir@:@srcdir@/../..:../..
-FILES=zlibmod.o
-LIB=zlibmod.a
-
-all:$(LIB)
-
-@module_makefile@
-
-$(LIB): $(FILES)
-	-rm -f $(LIB)
-	ar cq $(LIB) $(FILES)
-	-@RANLIB@ $(LIB)
-	echo >linker_options @LIBS@
+OBJS=zlibmod.o
+MODULE_LDFLAGS=@LIBS@
 
+@static_module_makefile@
 @dependencies@
diff --git a/src/modules/zlibmod/configure.in b/src/modules/zlibmod/configure.in
index d0c2063019511f1f934a5eeb54e49beb58b9f37a..4576722861dd7696625c27fd835ae06a51a20b63 100644
--- a/src/modules/zlibmod/configure.in
+++ b/src/modules/zlibmod/configure.in
@@ -2,14 +2,7 @@ AC_INIT(zlibmod.c)
 AC_CONFIG_HEADER(zlib_machine.h)
 AC_ARG_WITH(zlib,     [  --with(out)-zlib       Support gzip compression],[],[with_zlib=yes])
 
-AC_PROG_CC
-AC_PROG_RANLIB
-AC_SUBST(RANLIB)
-AC_SUBST_FILE(dependencies)
-dependencies=$srcdir/dependencies
-
-AC_SUBST_FILE(module_makefile)
-module_makefile=$srcdir/../module_makefile
+sinclude(../module_configure.in)
 
 if test x$with_zlib = xyes ; then
   AC_CHECK_HEADERS(zlib.h)
diff --git a/src/modules/zlibmod/zlibmod.c b/src/modules/zlibmod/zlibmod.c
index 00eae602cf9ad641001480698f3ef0cac34d74a1..d1e557d1c732096c9593264d27438dee36c49967 100644
--- a/src/modules/zlibmod/zlibmod.c
+++ b/src/modules/zlibmod/zlibmod.c
@@ -4,7 +4,7 @@
 ||| See the files COPYING and DISCLAIMER for more information.
 \*/
 #include "global.h"
-RCSID("$Id: zlibmod.c,v 1.2 1996/11/23 00:09:58 hubbe Exp $");
+RCSID("$Id: zlibmod.c,v 1.3 1997/02/07 00:46:53 hubbe Exp $");
 
 #include "zlib_machine.h"
 #include "types.h"
@@ -332,10 +332,9 @@ static void exit_gz_inflate(struct object *o)
 
 #endif
 
-void init_zlibmod_efuns(void) {}
-void exit_zlibmod(void) { }
+void pike_module_exit(void) {}
 
-void init_zlibmod_programs(void)
+void pike_module_init(void)
 {
 #ifdef HAVE_ZLIB_H
   start_new_program();
@@ -352,7 +351,7 @@ void init_zlibmod_programs(void)
   set_init_callback(init_gz_deflate);
   set_exit_callback(exit_gz_deflate);
 
-  end_c_program("/precompiled/gz_deflate");
+  end_class("deflate");
 
   start_new_program();
   add_storage(sizeof(struct zipper));
@@ -368,7 +367,7 @@ void init_zlibmod_programs(void)
   set_init_callback(init_gz_inflate);
   set_exit_callback(exit_gz_inflate);
 
-  end_c_program("/precompiled/gz_inflate");
+  end_class("inflate");
 #endif
 }