diff --git a/secure/simul_efun/simul_efun.c b/secure/simul_efun/simul_efun.c
index aa1f706..2b1c18c 100644
--- a/secure/simul_efun/simul_efun.c
+++ b/secure/simul_efun/simul_efun.c
@@ -902,29 +902,10 @@
     }
   }
 
-  save = m_allocate(0, 2);
-  properties = previous_object()->QueryProperties();
+  // prepare properties
+  previous_object()->_prop_prepare_save();
 
-  if(mappingp(properties))
-  {
-    // delete all entries in mapping properties without SAVE flag!
-    index = m_indices(properties);
-    for(i = sizeof(index)-1; i>=0;i--)
-    {
-      if(properties[index[i], F_MODE] & SAVE)
-      {
-       save[index[i]] = properties[index[i]];
-       save[index[i], F_MODE] =
-       properties[index[i], F_MODE] &
-                    (~(SETMNOTFOUND|QUERYMNOTFOUND|QUERYCACHED|SETCACHED));
-      }
-    }
-  }
-  else save = ([]);
-
-  // save object!
-  previous_object()->_set_save_data(save);
-  // format: wie definiert in config.h
+  // actual save object (format version: wie definiert in config.h)
   if (stringp(name)) {
     res = funcall(bind_lambda(#'efun::save_object, previous_object()), name,
        __LIB__SAVE_FORMAT_VERSION__);
@@ -938,7 +919,7 @@
     res = funcall(bind_lambda(#'efun::save_object, previous_object()),
        __LIB__SAVE_FORMAT_VERSION__);
 
-  previous_object()->_set_save_data(0);
+  previous_object()->_prop_finalize_save();
 
 #ifdef IOSTATS
   // Stats...
@@ -1002,36 +983,12 @@
     }
   }
 
-  // get actual property settings (by create())
-  properties = previous_object()->QueryProperties();
-
-//  DEBUG(sprintf("RESTORE %O\n",name));
+  //  DEBUG(sprintf("RESTORE %O\n",name));
   // restore object
   result=funcall(bind_lambda(#'efun::restore_object, previous_object()), name);
   //'))
-  //_get_save_data liefert tatsaechlich mixed zurueck, wenn das auch immer ein 
-  //mapping sein sollte.
-  save = previous_object()->_get_save_data();
-  if((save))
-  {
-    index = m_indices(save);
-    for(i = sizeof(index)-1; i>=0; i--)
-    {
-      properties[index[i]] = save[index[i]];
-      properties[index[i], F_MODE] = save[index[i], F_MODE]
-                            &~(SETCACHED|QUERYCACHED);
-    }
-  }
-  else properties = ([]);
 
-  // restore properties
-  funcall(
-          bind_lambda(
-                     unbound_lambda(({'arg}), //'})
-                                  ({#'call_other,({#'this_object}),
-                                  "SetProperties",'arg})),//')
-                     previous_object()),properties);
-  previous_object()->_set_save_data(0);
+  previous_object()->_prop_finalize_restore();
 
 #ifdef IOSTATS
   // Stats...
diff --git a/secure/simul_efun/spare/simul_efun.c b/secure/simul_efun/spare/simul_efun.c
index aa1f706..2b1c18c 100644
--- a/secure/simul_efun/spare/simul_efun.c
+++ b/secure/simul_efun/spare/simul_efun.c
@@ -902,29 +902,10 @@
     }
   }
 
-  save = m_allocate(0, 2);
-  properties = previous_object()->QueryProperties();
+  // prepare properties
+  previous_object()->_prop_prepare_save();
 
-  if(mappingp(properties))
-  {
-    // delete all entries in mapping properties without SAVE flag!
-    index = m_indices(properties);
-    for(i = sizeof(index)-1; i>=0;i--)
-    {
-      if(properties[index[i], F_MODE] & SAVE)
-      {
-       save[index[i]] = properties[index[i]];
-       save[index[i], F_MODE] =
-       properties[index[i], F_MODE] &
-                    (~(SETMNOTFOUND|QUERYMNOTFOUND|QUERYCACHED|SETCACHED));
-      }
-    }
-  }
-  else save = ([]);
-
-  // save object!
-  previous_object()->_set_save_data(save);
-  // format: wie definiert in config.h
+  // actual save object (format version: wie definiert in config.h)
   if (stringp(name)) {
     res = funcall(bind_lambda(#'efun::save_object, previous_object()), name,
        __LIB__SAVE_FORMAT_VERSION__);
@@ -938,7 +919,7 @@
     res = funcall(bind_lambda(#'efun::save_object, previous_object()),
        __LIB__SAVE_FORMAT_VERSION__);
 
-  previous_object()->_set_save_data(0);
+  previous_object()->_prop_finalize_save();
 
 #ifdef IOSTATS
   // Stats...
@@ -1002,36 +983,12 @@
     }
   }
 
-  // get actual property settings (by create())
-  properties = previous_object()->QueryProperties();
-
-//  DEBUG(sprintf("RESTORE %O\n",name));
+  //  DEBUG(sprintf("RESTORE %O\n",name));
   // restore object
   result=funcall(bind_lambda(#'efun::restore_object, previous_object()), name);
   //'))
-  //_get_save_data liefert tatsaechlich mixed zurueck, wenn das auch immer ein 
-  //mapping sein sollte.
-  save = previous_object()->_get_save_data();
-  if((save))
-  {
-    index = m_indices(save);
-    for(i = sizeof(index)-1; i>=0; i--)
-    {
-      properties[index[i]] = save[index[i]];
-      properties[index[i], F_MODE] = save[index[i], F_MODE]
-                            &~(SETCACHED|QUERYCACHED);
-    }
-  }
-  else properties = ([]);
 
-  // restore properties
-  funcall(
-          bind_lambda(
-                     unbound_lambda(({'arg}), //'})
-                                  ({#'call_other,({#'this_object}),
-                                  "SetProperties",'arg})),//')
-                     previous_object()),properties);
-  previous_object()->_set_save_data(0);
+  previous_object()->_prop_finalize_restore();
 
 #ifdef IOSTATS
   // Stats...
diff --git a/std/thing/properties.c b/std/thing/properties.c
index 102e883..efbe10e 100644
--- a/std/thing/properties.c
+++ b/std/thing/properties.c
@@ -296,10 +296,17 @@
 }
 
 // Viele Properties auf einen Schlag setzen.
-// genutzt von simul_efun zum Setzen aller Properties, welche im
+// Wurde genutzt von simul_efun zum Setzen aller Properties, welche im
 // restore_object() eingelesen wurden.
+// Nutzer in Lib: Magiershell (upd), Spellbooks Zaubis, Klerus, Lupe
 // Andere objekt-externe Nutzung ausdruecklich **NICHT** supportet!
-public void SetProperties( mapping props )
+// Problem: ggf. Verlust von SECURED, wenn Props kopiert werden (im alten
+//   SECURED; im neuen nicht und nicht-privilegiertes Objekt
+// Problem 2: beim Kopieren von einem alten in ein neues Objekt gehen alle
+//   internen QM/SM auf das eigene Objekt ersatzlos kaputt.
+// Problem 3: beim "Clonen" von Objekten haben beide Clones dann geteilte
+//   Referenztypen wie Mappings/Structs/Arrays
+public deprecated void SetProperties( mapping props )
 {
   int i, j;
 
@@ -333,17 +340,25 @@
       }
     }
   }
-  return;
 }
 
 
 // Ein Mapping mit allen Properties zurueckgeben
-// genutzt von simul_efun im save_object() zur Abfrage aller Properties, um
-// hieraus die gespeicherten zu bestimmen.
+// Wurde genutzt von simul_efun im save_object() zur Abfrage aller Properties,
+// um hieraus die gespeicherten zu bestimmen.
+// Nutzer in Lib: Magiershell (upd), Spellbooks Zaubis, Klerus, Lupe,
+// Listmaster-Zaubis, Fingerdaemon, Kaempfergilde (Karteikarten)
 // Andere objekt-externe Nutzung ausdruecklich **NICHT** supportet!
 // TODO fuer zukuenftige Features (wie private Properties) auf die simul_efun
 // beschraenken.
-public mapping QueryProperties()
+// Problem: QueryProperties: die Werte entsprechen Query, nicht QueryProp und
+// Abfragende werten die QMs in der Regel nicht aus (und waere auch nicht
+// dieselbe Abfragesituation und wuerde daher nicht funktionieren).
+// Problem 2: Herausgabe interner Daten wie Closures, Referenztypen wie
+// Mappings/Arrays/Structs etc. Diese koennen dann geaendert werden oder im
+// Falle von Closures sind ggf. private lfuns rufbar (stimmt: momentan koennen
+// die auch per Query abgefragt werden).
+public deprecated mapping QueryProperties()
 {
   mapping props;
   int i, j;
@@ -364,7 +379,8 @@
   return props;
 }
 
-// Die Properties als urspruengliches Array zurueckgeben
+// Die Properties als urspruengliches Array zurueckgeben, wird fuers MG-Tool
+// benoetigt.
 public mixed *__query_properties()
 {
   if ( pointerp(prop) )
@@ -374,17 +390,54 @@
 }
 
 
-// mapping Properties setzen zum Speichern (per save_object())
-// Aufruf nur aus simul_efun heraus (sinnvoll). Diese fragt alle Properties
-// via QueryProperties() ab, filtert alle nicht-gespeicherten Properties aus
-// und setzt ueber diese Funktion die gespeicherten in der tatsaechlich von
-// save_object() gespeicherten Variable <properties>.
-public void  _set_save_data(mixed data) { properties = data; }
+// Wird aus simul_efun (und nur von dort) gerufen, sollte die Properties aufs
+// Speichern vorbereiten und alle *gespeicherten* Props in passender Form in
+// der gespeicherten Variable <properties> ablegen.
+public void _prop_prepare_save()
+{
+  // 2 Werte pro Prop (Wert + Modusflags) speichern
+  // F_SET_METHOD, F_QUERY_METHOD werden nicht gespeichert.
+  // Anzahl gespeicherter Props raten, 20% der Props mit Modusflags
+  properties = m_allocate(sizeof(props[F_MODE])/5, 2);
+  foreach(string pname, int mode: props[F_MODE])
+  {
+    if (mode & SAVE)
+    {
+      // Uralte, ungenutzte Flags loeschen sowie SETMAPPED (F_SET_METHOD wird
+      // nicht gespeichert)
+      properties[pname, F_MODE] = mode &
+            (~(SETMNOTFOUND|QUERYMNOTFOUND|QUERYCACHED|SETCACHED|SETMAPPED));
+      properties[pname, F_VALUE] = props[F_VALUE][pname];
+    }
+  }
+}
 
-// mapping Properties zum Restoren zurueckgeben
-// Aufruf nur aus simul_efun heraus (sinnvoll). Diese ruft nach dem
-// restore_object die restaurierten Properties hiermit ab und schreibt sie
-// nach Konditionierung via SetProperties() zurueck, damit die Daten (wieder)
-// in <prop> zur Verfuegung steheh.
-public mixed _get_save_data()           { return properties; }
+// Wird nach dem Speichern gerufen und kann ggf. aufraeumen. Vor allem wird
+// der Inhalt von <properties> geloescht, da dies nur beim Speichern relevant
+// ist (und auch nicht gecached werden kann!).
+public void _prop_finalize_save()
+{
+  properties = 0;
+}
 
+// Konvertiert die Daten in <properties> wieder in die Laufzeitform und mergt
+// sie mit den bereits existierenden Props.
+public void _prop_finalize_restore()
+{
+  // Da wir das eigene Savefile oder Savestring restaurieren, koennen wir
+  // alle Rechte ignorieren. Wer das Savefile schreiben kann, hat gewonnen...
+  // Und Savestrings muss das Objekt selber in seinen restore_object()-Aufruf
+  // schreiben.
+  foreach(string pname, mixed value, int mode: properties)
+  {
+    props[F_VALUE][pname] = value;
+    // mode aus dem Savefile wird uebernommen, ausser SETMAPPED, was vom
+    // bisher gueltigem mode uebernommen werden muss.
+    if (props[F_MODE][pname] & SETMAPPED)
+      mode &= SETMAPPED;
+    props[F_MODE][pname] = mode;
+    // F_SET_METHOD und F_QUERY_METHOD werden beibehalten, sollten sie vor dem
+    // restore bereits gesetzt sein. Aus dem Savefile kommen beide nie.
+  }
+  properties = 0;
+}
