diff --git a/secure/simul_efun/files.c b/secure/simul_efun/files.c
index 291bef6..d2b81a5 100644
--- a/secure/simul_efun/files.c
+++ b/secure/simul_efun/files.c
@@ -43,3 +43,64 @@
     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;
+
+    file="/log/"+file;
+    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;
+    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));
+}
+
+#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)
+
+
diff --git a/secure/simul_efun/simul_efun.c b/secure/simul_efun/simul_efun.c
index e36d141..f5583db 100644
--- a/secure/simul_efun/simul_efun.c
+++ b/secure/simul_efun/simul_efun.c
@@ -392,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);
@@ -931,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)
@@ -1804,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) {
