diff --git a/bin/install.pike b/bin/install.pike
index f99fbaffc3b8c6bf71722511cf91ed9b27d3eb72..38d5d3754d2248fb25dac46ccc87d6fcd8e81997 100644
--- a/bin/install.pike
+++ b/bin/install.pike
@@ -297,6 +297,16 @@ void install_header_files(string from, string to)
 
 mapping vars=([]);
 
+string fakeroot(string s)
+{
+  if(vars->fakeroot)
+  {
+    return vars->fakeroot+combine_path(getcwd(),s);
+  }else{
+    return s;
+  }
+}
+
 string export_base_name;
 
 int mklink(string from, string to)
@@ -1064,22 +1074,22 @@ void do_install()
 		  lib_prefix);
     }
     
-    install_dir(vars->TMP_LIBDIR,lib_prefix,1);
-    install_dir(vars->LIBDIR_SRC,lib_prefix,1);
+    install_dir(fakeroot(vars->TMP_LIBDIR),lib_prefix,1);
+    install_dir(fakeroot(vars->LIBDIR_SRC),lib_prefix,1);
     
-    install_header_files(vars->SRCDIR,include_prefix);
-    install_header_files(vars->TMP_BUILDDIR,include_prefix);
+    install_header_files(fakeroot(vars->SRCDIR),include_prefix);
+    install_header_files(fakeroot(vars->TMP_BUILDDIR),include_prefix);
     
-    install_file(combine_path(vars->TMP_BUILDDIR,"modules/dynamic_module_makefile"),
+    install_file(fakeroot(combine_path(vars->TMP_BUILDDIR,"modules/dynamic_module_makefile")),
 		 combine_path(include_prefix,"dynamic_module_makefile"));
-    install_file(combine_path(vars->TMP_BUILDDIR,"aclocal"),
+    install_file(fakeroot(combine_path(vars->TMP_BUILDDIR,"aclocal")),
 		 combine_path(include_prefix,"aclocal.m4"));
     
     if(file_stat(vars->MANDIR_SRC))
     {
 //      trace(9);
 //      _debug(5);
-      install_dir(vars->MANDIR_SRC,combine_path(man_prefix,"man1"),0);
+      install_dir(fakeroot(vars->MANDIR_SRC),combine_path(man_prefix,"man1"),0);
     }
   };
 
@@ -1098,20 +1108,30 @@ void do_install()
     mixed s2=file_stat(master+".o");
     if(!s1 || !s2 || s1[3]>=s2[3] || redump_all)
     {
-      Process.create_process( ({pike,"-m",combine_path(vars->SRCDIR,"dumpmaster.pike"),master}))->wait();
+      Process.create_process( ({pike,"-m",
+				  combine_path(vars->SRCDIR,"dumpmaster.pike"),
+				  @(vars->fakeroot? ({"--fakeroot="+vars->fakeroot}):({})),
+				  master}))->wait();
     }
     
     if(sizeof(to_dump))
     {
-      status("Dumping modules, please wait... ");
+      status("Dumping modules, please wait...");
       foreach(to_dump, string mod) rm(mod+".o");
-      Process.create_process( ({pike,
-				  combine_path(vars->SRCDIR,"dumpmodule.pike"),
+      /* Dump 50 modules at a time */
+      write("\n");
+      foreach(to_dump/50,to_dump)
+	{
+	  write("    ");
+	  Process.create_process( ({pike,
+				      combine_path(vars->SRCDIR,"dumpmodule.pike"),
 #if defined(USE_GTK) && constant(GTK.parse_rc)
-				  label1?"--distquiet":
+				      label1?"--distquiet":
 #endif
-				  "--quiet"
-				  }) + to_dump)->wait();
+	    "--quiet",
+				      @(vars->fakeroot? ({"--fakeroot="+vars->fakeroot}):({})),
+				      }) + to_dump)->wait();
+	}
     }
 
     // Delete any .pmod files that would shadow the .so
diff --git a/src/dumpmaster.pike b/src/dumpmaster.pike
index 4bfe92f7239e3e5373ebc9a8f280d7a3027bec68..cd07b193e707ccfe6e523128120a5a1e253cf810 100644
--- a/src/dumpmaster.pike
+++ b/src/dumpmaster.pike
@@ -1,12 +1,23 @@
 #define UNDEFINED (([])[0])
 
+string fakeroot;
+
 void handle_error(mixed err)
 {
   werror("%O\n",err);
 }
+
+string read_file(string s)
+{
+  if(fakeroot)
+    s=fakeroot+combine_path(getcwd(),s);
+
+  return _static_modules.files()->Fd(s,"r")->read();
+}
+
 program compile_file(string file)
 {
-  return compile(cpp(_static_modules.files()->Fd(file,"r")->read(),file));
+  return compile(cpp(read_file(file),file));
 }
 
 class Codec
@@ -19,6 +30,9 @@ class Codec
 }
 void _main(string *argv, string *env)
 {
+  foreach(argv[1..sizeof(argv)-2], string f)
+    sscanf(f,"--fakeroot=%s",fakeroot);
+    
   program p=compile_file(argv[-1]);
   string s=encode_value(p, Codec());
   _static_modules.files()->Fd(argv[-1] + ".o","wct")->write(s);
diff --git a/src/dumpmodule.pike b/src/dumpmodule.pike
index c58b0c86b3e98dfe7820839586c41ecc94b9fdb6..6f9fb1a07a85c56a36651abb36ac7f454a716957 100755
--- a/src/dumpmodule.pike
+++ b/src/dumpmodule.pike
@@ -2,6 +2,17 @@
 
 program p;
 
+string fakeroot;
+
+class FakeMaster
+{
+  inherit "/master";
+  string master_read_file(string s)
+    {
+      return ::master_read_file(fakeroot+combine_path_with_cwd(s));
+    }
+}
+
 #define error(X) throw( ({ (X), backtrace()[0..sizeof(backtrace())-2] }) )
 class Codec
 {
@@ -100,6 +111,75 @@ void log(string file, int line, string err)
   logfile->write(sprintf("%s:%d:%s\n",file,line,err));
 }
 
+void dumpit(string file)
+{
+  if(!quiet)
+    werror(file +": ");
+  
+  mixed err=catch {
+    rm(file+".o"); // Make sure no old files are left
+    if(mixed s=file_stat(file))
+    {
+      if(s[1]<=0)
+      {
+	werror("is a directory or special file.\n");
+	break;
+      }
+    }else{
+      if(!quiet)
+      werror("does not exist.\n");
+      break;
+    }
+    if(programp(p=compile_file(file)))
+    {
+      string s=encode_value(p, Codec());
+      p=decode_value(s,Codec());
+      if(programp(p))
+      {
+	Stdio.File(file + ".o","wct")->write(s);
+	switch(quiet)
+	{
+	  case 1: werror("."); break;
+	  case 0: werror("dumped.\n");
+	}
+      }else{
+	switch(quiet)
+	{
+	  case 1: werror("i"); break;
+	  case 0: werror("Decode of %O failed.\n", file);
+	}
+      }
+    }else{
+      switch(quiet)
+      {
+	case 1: werror("!"); break;
+	case 0: werror("Compilation of %O failed.\n", file);
+      }
+    }
+  };
+  if(err)
+  {
+#ifdef ERRORS
+    err[0]="While dumping "+file+": "+err[0];
+    werror(master()->describe_backtrace(err));
+#else
+    if(quiet)
+    {
+      if(quiet<2)
+	werror("X");
+      if(logfile)
+      {
+	err[0]="While dumping "+file+": "+err[0];
+	logfile->write("================================================\n");
+	logfile->write(master()->describe_backtrace(err));
+      }
+    }else{
+      werror(err[0]);
+    }
+#endif
+  }
+}
+
 int main(int argc, string *argv)
 {
   if(argv[1]=="--quiet")
@@ -123,74 +203,15 @@ int main(int argc, string *argv)
     logfile=0;
   }
 
+  if(sscanf(argv[1],"--fakeroot=%s",fakeroot))
+  {
+    argv=argv[1..];
+    replace_master(FakeMaster());
+  }
+
   foreach(argv[1..],string file)
-    {
-      if(!quiet)
-	werror(file +": ");
+    dumpit(file);
 
-      mixed err=catch {
-	rm(file+".o"); // Make sure no old files are left
-	if(mixed s=file_stat(file))
-	{
-	  if(s[1]<=0)
-	  {
-	    werror("is a directory or special file.\n");
-	    break;
-	  }
-	}else{
-	  if(!quiet)
-	    werror("does not exist.\n");
-	  break;
-	}
-	if(programp(p=compile_file(file)))
-	{
-	  string s=encode_value(p, Codec());
-	  p=decode_value(s,Codec());
-	  if(programp(p))
-	  {
-	    Stdio.File(file + ".o","wct")->write(s);
-	    switch(quiet)
-	    {
-	      case 1: werror("."); break;
-	      case 0: werror("dumped.\n");
-	    }
-	  }else{
-	    switch(quiet)
-	    {
-	      case 1: werror("i"); break;
-	      case 0: werror("Decode of %O failed.\n", file);
-	    }
-	  }
-	}else{
-	  switch(quiet)
-	  {
-	    case 1: werror("!"); break;
-	    case 0: werror("Compilation of %O failed.\n", file);
-	  }
-	}
-      };
-      if(err)
-      {
-#ifdef ERRORS
-	err[0]="While dumping "+file+": "+err[0];
-	werror(master()->describe_backtrace(err));
-#else
-	if(quiet)
-	{
-	  if(quiet<2)
-	    werror("X");
-	  if(logfile)
-	  {
-	    err[0]="While dumping "+file+": "+err[0];
-	    logfile->write("================================================\n");
-	    logfile->write(master()->describe_backtrace(err));
-	  }
-	}else{
-	  werror(err[0]);
-	}
-#endif
-      }
-    }
   if(quiet==1)
     werror("\n");
 }