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...
