diff --git a/lib/master.pike b/lib/master.pike
index 580a2622e2095ee3a17cc198d4e0ec3179235465..a68d23a60049fbe0664c5cd0ad4955793282f0da 100644
--- a/lib/master.pike
+++ b/lib/master.pike
@@ -278,16 +278,15 @@ varargs mixed resolv(string identifier, string current_file)
   {
     foreach(pike_module_path, path)
       {
-	path=combine_path(path,identifier);
-	if(ret=findmodule(path)) break;
+	string file=combine_path(path,identifier);
+	if(ret=findmodule(file)) break;
       }
   }
 
   if(!ret)
   {
     string path=combine_path(pike_library_path+"/modules",identifier);
-    if(!(ret=findmodule(path)))
-      ret=_static_modules[identifier];
+    ret=findmodule(path);
   }
 
   if(ret)
@@ -316,14 +315,12 @@ void _main(string *argv, string *env)
   add_constant("getenv",getenv);
   add_constant("putenv",putenv);
 
-  add_constant("write",_static_modules.files.file("stdout")->write);
+  add_constant("write",_static_modules.files()->file("stdout")->write);
 
   a=backtrace()[-1][0];
   q=a/"/";
   pike_library_path = q[0..sizeof(q)-2] * "/";
 
-  tmp=resolv("Getopt");
-
   add_include_path(pike_library_path+"/include");
   add_module_path(pike_library_path+"/modules");
 
@@ -333,6 +330,8 @@ void _main(string *argv, string *env)
   q=(getenv("PIKE_MODULE_PATH")||"")/":"-({""});
   for(i=sizeof(q)-1;i>=0;i--) add_module_path(q[i]);
 
+  tmp=resolv("Getopt");
+
   q=tmp->find_all_options(argv,({
     ({"version",tmp->NO_ARG,({"-v","--version"})}),
       ({"help",tmp->NO_ARG,({"-h","--help"})}),
@@ -413,7 +412,14 @@ void _main(string *argv, string *env)
     argv=argv[1..];
   }
 
-  script=cast_to_object(argv[0], getcwd()+"/");
+  program tmp=compile_file(argv[0]);
+  if(!tmp)
+  {
+    werror("Pike: Couldn't find script to execute.\n");
+    exit(1);
+  }
+
+  object script=tmp();
 
   if(!script->main)
   {
@@ -508,6 +514,13 @@ string handle_include(string f,
   return path;
 }
 
+// FIXME
+string stupid_describe(mixed m)
+{
+  if(intp(m)) return (string)m;
+  return sprintf("%t",m);
+}
+
 /* It is possible that this should be a real efun,
  * it is currently used by handle_error to convert a backtrace to a
  * readable message.
@@ -544,8 +557,14 @@ string describe_backtrace(mixed *trace)
 	row="";
 	if(sizeof(tmp)>=3 && functionp(tmp[2]))
 	{
-	  row=function_name(tmp[2])+" in ";
+	  row=function_name(tmp[2])+"(";
 	}
+	for(int e=3;e<sizeof(tmp);e++)
+	{
+	  row+=stupid_describe(tmp[e])+",";
+	}
+
+	row=row[..sizeof(row)-2]+") in ";
 
 	if(sizeof(tmp)>=2 && stringp(tmp[0]) && intp(tmp[1]))
 	{
diff --git a/src/Makefile.in b/src/Makefile.in
index 89add6954c4d365e793f0b1095d539cc177f9e8d..e68bf8a7fa200469d08fa85e2b3fa975cccb1dd6 100644
--- a/src/Makefile.in
+++ b/src/Makefile.in
@@ -12,17 +12,18 @@ SRCDIR=@srcdir@
 VPATH=@srcdir@
 
 # These are used while compiling
-TMP_LIBDIR = @LIBDIR@
+LIBDIR_SRC = @LIBDIR@
 TMP_BINDIR = @BINDIR@
 TMP_BUILDDIR = @BUILDDIR@
 TMP_DOCDIR = @DOCDIR@
+TMP_LIBDIR = $(TMP_BUILDDIR)/lib
 
 prefix = @prefix@
 exec_prefix = $(prefix)/bin
 lib_prefix = $(prefix)/lib/pike
 
 #
-# use bison please, yacc doesn't always work good enough.
+# use bison please, yacc isn't good enough.
 #
 YACC=@YACC@
 YFLAGS=-d -v
@@ -56,7 +57,7 @@ CPP=@CPP@
 LD=$(CC)
 LDFLAGS=$(CFLAGS) @LDFLAGS@ @LINKFORSHARED@
 
-RUNPIKE=$(TMP_BUILDDIR)/pike -DNOT_INSTALLED -m $(TMP_LIBDIR)/master.pike -M$(TMP_BUILDDIR)/modules $(PIKEOPTS)
+RUNPIKE=$(TMP_BUILDDIR)/pike -m $(TMP_LIBDIR)/master.pike $(PIKEOPTS)
 
 MAKE_FLAGS = "prefix=$(prefix)" "exec_prefix=$(exec_prefix)" "CC=$(CC)" "OTHERFLAGS=$(OTHERFLAGS)" "TMP_BINDIR=$(TMP_BINDIR)" "DEFINES=$(DEFINES)" "TMP_LIBDIR=$(TMP_LIBDIR)" "RUNPIKE=$(RUNPIKE)" "INSTALL=$(INSTALL)"
 
@@ -113,22 +114,22 @@ all: module_objects
 
 pike: $(OBJ) modules/linker_options modules/lib_dirs
 	-mv pike pike.old
-	$(LD) $(LDFLAGS) $(OBJ) `cat modules/linker_options` @SET_RUN_PATH@ $(LIBS) -o pike
+	$(LD) $(LDFLAGS) $(OBJ) `cat modules/linker_options` $(LIBS) -o pike
 
 # purify
 pure: $(OBJ) module_objects
 	-mv pike pike.old
-	purify -free-queue-length=500 -inuse-at-exit=yes -chain-length=12 $(LD) $(LDFLAGS) $(OBJ) `cat modules/linker_options` @SET_RUN_PATH@ $(LIBS) -o pike
+	purify -free-queue-length=500 -inuse-at-exit=yes -chain-length=12 gcc $(LDFLAGS) $(OBJ) `cat modules/linker_options` $(LIBS) -o pike
 
 # purecov
 cover: $(OBJ) module_objects
 	-mv pike pike.old
-	purecov purify -free-queue-length=500 -inuse-at-exit=yes -chain-length=12 $(LD) $(LDFLAGS) $(OBJ) `cat modules/linker_options` @SET_RUN_PATH@ $(LIBS) -o pike
+	purecov purify -free-queue-length=500 -inuse-at-exit=yes -chain-length=12 gcc $(LDFLAGS) $(OBJ) `cat modules/linker_options` $(LIBS) -o pike
 
 # quantify
 quant: $(OBJ) module_objects
 	-mv pike pike.old
-	quantify $(LD) $(LDFLAGS) $(OBJ) `cat modules/linker_options` @SET_RUN_PATH@ $(LIBS) -o pike
+	quantify gcc $(LDFLAGS) $(OBJ) `cat modules/linker_options` $(LIBS) -o pike
 
 # install
 install:
@@ -141,10 +142,7 @@ install:
 	if [ ! -d "$(prefix)/include" ]; then mkdir "$(prefix)/include"; chmod 755 "$(prefix)/include"; fi
 	if [ ! -d "$(prefix)/include/pike" ]; then mkdir "$(prefix)/include/pike"; chmod 755 "$(prefix)/include/pike"; fi
 	$(INSTALL) $(SRCDIR)/*.h *.h $(prefix)/include/pike
-	$(INSTALL) $(TMP_LIBDIR)/master.pike $(lib_prefix)
-	cp -r $(TMP_LIBDIR)/include $(lib_prefix)
-	cp -r $(TMP_LIBDIR)/modules $(lib_prefix)
-	-( cd modules; ${MAKE} $(MAKE_FLAGS) install )
+	cp -r $(TMP_LIBDIR) $(lib_prefix)
 
 # tidy up a bit
 tidy:
@@ -200,6 +198,9 @@ gdb_verify: testsuite
 run_hilfe:
 	$(RUNPIKE) $(TMP_BINDIR)/hilfe
 
+lib: $(LIBDIR_SRC) $(LIBDIR_SRC)/master.pike
+	cp -r $(LIBDIR_SRC) .
+
 # make export archive (requires compiled Pike)
 # Do not compile in source tree if you want to use this!
 # Beware that export archive this includes bison/yacc/byacc source
@@ -234,7 +235,7 @@ html_docs: docs
 #
 # Pike internal targets
 #
-module_objects: global.h $(SRCDIR)/language.h
+module_objects: global.h $(SRCDIR)/language.h lib
 	( cd modules ; ${MAKE} $(MAKE_FLAGS) )
 
 language.o: $(SRCDIR)/language.c $(SRCDIR)/object.h $(SRCDIR)/interpret.h $(SRCDIR)/program.h
diff --git a/src/module.c b/src/module.c
index 6fd8d2f2f5096ee97e7908f56e241837f979d026..9b7b673a716be0a372185f96a1648a5dc1aa2867 100644
--- a/src/module.c
+++ b/src/module.c
@@ -43,17 +43,13 @@ void init_modules(void)
   for(e=0;e<NELEM(module_list);e++)
   {
     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);
+    push_program(p);
     mapping_insert(m, sp-2, sp-1);
     pop_n_elems(2);
   }
diff --git a/src/modules/Makefile.in b/src/modules/Makefile.in
index f7e96c5a0cf4978dd2a96a94e9b8324f5435789a..5eca6b1ec7f13e0b1eb23034d80fbcf592626365 100644
--- a/src/modules/Makefile.in
+++ b/src/modules/Makefile.in
@@ -10,7 +10,7 @@ all: modules
 
 modules:
 	for a in $(MODULES) ; do echo making $$a ; ( cd $$a ; $(MAKE) $(MAKE_FLAGS) MODNAME=$$a) ; done
-	$(MAKE) linker_options lib_dirs modlist.h modlist_headers.h
+	$(MAKE) linker_options lib_dirs modlist.h modlist_headers.h module_list
 
 modlist.h: $(MODULE_SEGMENTS)
 	( for a in $(MODULES) ; do cat $$a/modlist_segment ; done ; ) >modlist.h
@@ -19,14 +19,7 @@ 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 ; \
-	    done ; ) | sort | uniq | tr '\012' ':'; echo "" )| \
-	sed -e 's/:$$//' -e 's/^/-R/' -e 's/^-R$$//' >lib_dirs
+	( for a in $(MODULES) ; do cat $$a/linker_options; done ; ) >linker_options
 
 depend:
 	for a in $(MODULES) ; do ( cd $$a ; ${MAKE} $(MAKE_FLAGS) MODNAME=$$a depend ) ; done
diff --git a/src/modules/dynamic_module_makefile.in b/src/modules/dynamic_module_makefile.in
index deaab448f75317a2b2ec7f12a36ef4a4e3595746..28844953fb564903ee03e4a960162b589e059173 100644
--- a/src/modules/dynamic_module_makefile.in
+++ b/src/modules/dynamic_module_makefile.in
@@ -1,26 +1,22 @@
 PREFLAGS=$(DEFINES) -I. -I$(SRCDIR) -I$(SRCDIR)/../.. -I../.. -I. $(MODULE_CPPFLAGS)
 CFLAGS=$(PREFLAGS) $(OTHERFLAGS) @CCSHARED@ $(MODULE_CFLAGS)
 
-all: module.@SO@ linker_options modlist_segment modlist_headers
+MAKE_FLAGS = "prefix=$(prefix)" "exec_prefix=$(exec_prefix)" "CC=$(CC)" "OTHERFLAGS=$(OTHERFLAGS)" "TMP_BINDIR=$(TMP_BINDIR)" "DEFINES=$(DEFINES)" "TMP_LIBDIR=$(TMP_LIBDIR)" "RUNPIKE=$(RUNPIKE)" "INSTALL=$(INSTALL)"
 
-linker_options:
-	echo "" >linker_options
+all: module.@SO@ dummy
 
-modlist_headers:
+dummy:
+	echo "" >linker_options
 	echo "" >modlist_headers
-
-modlist_segment:
 	echo "" >modlist_segment
+	tmp="$(INSTALL_NAME)" ; if test x$$tmp = x ; then tmp="$(MODNAME)"; fi ; $(INSTALL) module.so $(TMP_LIBDIR)/modules/$$tmp.so
 
 module.so: $(OBJS)
-	@LDSHARED@ -o module.@SO@ $(OBJS) $(MODULE_LDFLAGS)
+	$(TMP_BINDIR)/smartlink "@LDSHARED@" -o module.@SO@ $(OBJS) $(MODULE_LDFLAGS)
 	if test @SO@ != so ; then mv module.@SO@ module.so ; fi
-	echo "" >linker_options
-	echo "" >modlist_headers
-	echo "" >modlist_segment
 
 clean:
-	-rm -f *.o module.so
+	-rm -f *.o *.a *.so module.so
 
 depend:
 	gcc -MM $(PREFLAGS) $(SRCDIR)/*.c | $(TMP_BINDIR)/fixdepends.sh $(SRCDIR)
diff --git a/src/modules/static_module_makefile.in b/src/modules/static_module_makefile.in
index 54c95dcc4a316e8eadfafb075944500979addcd4..a18980f8c323176980bb74fee83ec8aa4d6f8338 100644
--- a/src/modules/static_module_makefile.in
+++ b/src/modules/static_module_makefile.in
@@ -1,27 +1,24 @@
 PREFLAGS=$(DEFINES) -I. -I$(SRCDIR) -I$(SRCDIR)/../.. -I../.. -I. -Dpike_module_init=pike_module_$(MODNAME)_init -Dpike_module_exit=pike_module_$(MODNAME)_exit $(MODULE_CPPFLAGS)
 CFLAGS=$(PREFLAGS) $(OTHERFLAGS) $(MODULE_CFLAGS)
 
-all: module.a modlist_segment modlist_headers linker_options
+MAKE_FLAGS = "prefix=$(prefix)" "exec_prefix=$(exec_prefix)" "CC=$(CC)" "OTHERFLAGS=$(OTHERFLAGS)" "TMP_BINDIR=$(TMP_BINDIR)" "DEFINES=$(DEFINES)" "TMP_LIBDIR=$(TMP_LIBDIR)" "RUNPIKE=$(RUNPIKE)" "INSTALL=$(INSTALL)"
 
-module.a: $(OBJS)
-	-rm -f module.a
-	ar cq module.a $(OBJS)
-	-@RANLIB@ module.a
-	echo >linker_options modules/$(MODNAME)/module.a $(MODULE_LDFLAGS)
-	echo >modlist_headers "void pike_module_$(MODNAME)_init(void), pike_module_$(MODNAME)_exit(void);"
-	echo >modlist_segment " ,{ \"$(MODNAME)\", pike_module_$(MODNAME)_init, pike_module_$(MODNAME)_exit } "
+all: module.a dummy
 
-linker_options:
+dummy:
 	echo >linker_options modules/$(MODNAME)/module.a $(MODULE_LDFLAGS)
-
-modlist_headers:
 	echo >modlist_headers "void pike_module_$(MODNAME)_init(void), pike_module_$(MODNAME)_exit(void);"
-
-modlist_segment:
 	echo >modlist_segment " ,{ \"$(MODNAME)\", pike_module_$(MODNAME)_init, pike_module_$(MODNAME)_exit } "
+	echo >module.pmod "inherit _static_modules.$(MODNAME);"
+	tmp="$(INSTALL_NAME)" ; if test x$$tmp = x ; then tmp="$(MODNAME)"; fi ; $(INSTALL) module.pmod $(TMP_LIBDIR)/modules/$$tmp.pmod
+
+module.a: $(OBJS)
+	-rm -f module.a
+	ar cq module.a $(OBJS)
+	-@RANLIB@ module.a
 
 clean:
-	-rm -f *.o *.a
+	-rm -f *.o *.a *.so module.so module.pmod
 
 depend:
 	gcc -MM $(PREFLAGS) $(SRCDIR)/*.c | $(TMP_BINDIR)/fixdepends.sh $(SRCDIR)
@@ -43,3 +40,4 @@ gdb_verify: module_testsuite
 	@rm .gdbinit
 
 install:
+