diff --git a/secure/simul_efun/spare/files.c b/secure/simul_efun/spare/files.c
new file mode 100644
index 0000000..030b306
--- /dev/null
+++ b/secure/simul_efun/spare/files.c
@@ -0,0 +1,121 @@
+#include "/sys/files.h"
+
+#define PO        efun::previous_object(0)
+
+public varargs string read_data(string file, int start, int anzahl)
+{
+    if (!stringp(file))
+      raise_error("Bad arg 1 to read_data(): expected 'string'.\n");
+
+    // Wenn Pfad nicht absolut, ist das nen Fehler, daher wird das nicht
+    // korrigiert.
+
+    // wenn kein /data/ vorn steht, wird es vorangestellt.
+    if (strstr(file,"/"LIBDATADIR"/") != 0)
+    {
+      file = "/"LIBDATADIR + file;
+    }
+    // read_file() nicht direkt rufen, sondern vorher als closure ans
+    // aufrufende Objekt binden. Sonst laeuft die Rechtepruefung in
+    // valid_write() im Master unter der Annahme, dass die simul_efun.c mit
+    // ihrer root id was will.
+    return funcall(bind_lambda(#'efun::read_file, previous_object()),
+                   file, start, anzahl);
+}
+
+public varargs int write_data(string file, string str, int flags)
+{
+    if (!stringp(file))
+      raise_error("Bad arg 1 to write_data(): expected 'string'.\n");
+    if (!stringp(str))
+      raise_error("Bad arg 2 to write_data(): expected 'string'.\n");
+
+    // Wenn Pfad nicht absolut, ist das nen Fehler, daher wird das nicht
+    // korrigiert.
+
+    // wenn kein /data/ vorn steht, wird es vorangestellt.
+    if (strstr(file,"/"LIBDATADIR"/") != 0)
+    {
+      file = "/"LIBDATADIR + file;
+    }
+    // write_file() nicht direkt rufen, sondern vorher als closure ans
+    // aufrufende Objekt binden. Sonst laeuft die Rechtepruefung in
+    // valid_write() im Master unter der Annahme, dass die simul_efun.c mit
+    // ihrer root id was will.
+    return funcall(bind_lambda(#'efun::write_file, previous_object()),
+                   file, str, flags);
+}
+
+// * Bei 50k Groesse Log-File rotieren
+varargs int log_file(string file, string txt, int size_to_break)
+{
+    mixed *st;
+    // Wenn file schon mit /log/ anfaengt, schreiben wir nicht noch eins
+    // davor.
+    if (strstr(file,"/"LIBLOGDIR"/") != 0)
+    {
+      file="/log/"+file;
+    }
+
+    // Achtung: es ist verfuehrerisch, diese Pruefung zu entfernen und
+    // stattdessen, den Aufruf von write_file() an den Aufrufer zu binden.
+    // Dies funktioniert aber nicht, weil log_file gesonderte Behandlung in
+    // valid_write() erfaehrt.
+    file=implode((efun::explode(file,"/")-({".."})),"/");
+    if (!funcall(bind_lambda(#'efun::call_other,PO),"secure/master",//')
+                "valid_write",file,geteuid(PO),"log_file",PO))
+      return 0;
+
+    // Wenn zu gross, rotieren.
+    if ( size_to_break >= 0 & (
+        sizeof(st = get_dir(file,2) ) && st[0] >= (size_to_break|MAX_LOG_SIZE)))
+        catch(rename(file, file + ".old");publish); /* No panic if failure */
+
+    // Die Zugriffspruefung hier laeuft mit Rechten der simul_efuns...
+    // Rechtepruefung oben
+    return(write_file(file,txt));
+}
+
+#if !__EFUN_DEFINED__(copy_file)
+#define MAXLEN 50000
+public nomask int copy_file(string source, string dest)
+{
+
+    int ptr;
+    string bytes;
+
+    set_this_object(previous_object());
+    if (!sizeof(source)||!sizeof(dest)||source==dest||(file_size(source)==-1)||
+        (!call_other(master(),"valid_read",source,
+                     getuid(this_interactive()||
+                   previous_object()),"read_file",previous_object()))||
+        (!call_other(master(),"valid_read",source,
+                     getuid(this_interactive()||
+                   previous_object()),"write_file",previous_object())))
+      return 1;
+    switch (file_size(dest))
+    {
+    case -1:
+      break;
+    case -2:
+      if (dest[<1]!='/') dest+="/";
+      dest+=efun::explode(source,"/")[<1];
+      if (file_size(dest)==-2) return 1;
+      if (file_size(dest)!=-1) break;
+    default:
+      if (!rm(dest)) return 1;
+      break;
+    }
+    do
+    {
+      bytes = read_bytes(source, ptr, MAXLEN); ptr += MAXLEN;
+      if (!bytes) bytes="";
+      write_file(dest, bytes);
+    }
+    while(sizeof(bytes) == MAXLEN);
+    return 0;
+}
+#endif //!__EFUN_DEFINED__(copy_file)
+
+#undef PO
+
diff --git a/secure/simul_efun/spare/simul_efun.c b/secure/simul_efun/spare/simul_efun.c
index 2a89fcf..f5583db 100644
--- a/secure/simul_efun/spare/simul_efun.c
+++ b/secure/simul_efun/spare/simul_efun.c
@@ -86,6 +86,7 @@
 #include __DIR__"shadow.c"
 #include __DIR__"livings.c"
 #include __DIR__"comm.c"
+#include __DIR__"files.c"
 
 #define TO        efun::this_object()
 #define TI        efun::this_interactive()
@@ -391,22 +392,6 @@
   return(0); //sonst
 }
 
-// * Bei 50k Groesse Log-File rotieren
-varargs int log_file(string file, string txt, int size_to_break) {
-  mixed *st;
-
-  file="/log/"+file;
-  file=implode((efun::explode(file,"/")-({".."})),"/");
-//  tell_object(find_player("jof"),sprintf("LOG FILE: %O -> %O\n",previous_object(),file));
-  if (!funcall(bind_lambda(#'efun::call_other,PO),"secure/master",//')
-              "valid_write",file,geteuid(PO),"log_file",PO))
-      return 0;
-  if ( size_to_break >= 0 & (
-      sizeof(st = get_dir(file,2) ) && st[0] >= (size_to_break|MAX_LOG_SIZE)))
-      catch(rename(file, file + ".old");publish); /* No panic if failure */
-  return(write_file(file,txt));
-}
-
 // * Magier-Level abfragen
 int query_wiz_level(mixed player) {
   return (int)"/secure/master"->query_wiz_level(player);
@@ -930,12 +915,12 @@
   if (name[0] != '#')
   {
     // abs. Pfad erzeugen *seufz*
-    if (name[0] != '#' && name[0]!='/')
+    if (name[0]!='/')
       name = "/" + name;
 
     // wenn kein /data/ vorn steht, erstmal gucken, ob das Savefile unter
     // /data/ existiert. Wenn ja, wird das geladen.
-    if (name[0]!='#' && strstr(name,"/"LIBDATADIR"/") != 0)
+    if (strstr(name,"/"LIBDATADIR"/") != 0)
     {
       string path = "/"LIBDATADIR + name;
       if (file_size(path + ".o") >= 0)
@@ -1803,47 +1788,6 @@
 }
 
 
-#if !__EFUN_DEFINED__(copy_file)
-#define MAXLEN 50000
-nomask int copy_file(string source, string dest)
-{
-
-  int ptr;
-  string bytes;
-
-  set_this_object(previous_object());
-  if (!sizeof(source)||!sizeof(dest)||source==dest||(file_size(source)==-1)||
-      (!call_other(master(),"valid_read",source,
-                   getuid(this_interactive()||
-                 previous_object()),"read_file",previous_object()))||
-      (!call_other(master(),"valid_read",source,
-                   getuid(this_interactive()||
-                 previous_object()),"write_file",previous_object())))
-    return 1;
-  switch (file_size(dest))
-  {
-  case -1:
-    break;
-  case -2:
-    if (dest[<1]!='/') dest+="/";
-    dest+=efun::explode(source,"/")[<1];
-    if (file_size(dest)==-2) return 1;
-    if (file_size(dest)!=-1) break;
-  default:
-    if (!rm(dest)) return 1;
-    break;
-  }
-  do
-  {
-    bytes = read_bytes(source, ptr, MAXLEN); ptr += MAXLEN;
-    if (!bytes) bytes="";
-    write_file(dest, bytes);
-  }
-  while(sizeof(bytes) == MAXLEN);
-  return 0;
-}
-#endif //!__EFUN_DEFINED__(copy_file)
-
 
 // ### Ersatzaufloesung in Strings ###
 varargs string replace_personal(string str, mixed *obs, int caps) {
