diff --git a/std/shells/magier/upd.c b/std/shells/magier/upd.c
index ebee975..7482156 100644
--- a/std/shells/magier/upd.c
+++ b/std/shells/magier/upd.c
@@ -260,37 +260,6 @@
   return ret;
 }
 
-
-//
-// _illegal_closure(): ist closure in arg an objekt gebunden?
-// arg: closure(-array/mapping)
-// Rueckgabe: 0 wenn alles okay
-//            1 wenn closure geloescht werden muss
-//
-
-private int _illegal_closure( mixed arg )
-{
-  int i, j;
-  string *indices;
-  
-  if ( closurep(arg) && !objectp(query_closure_object(arg)) )
-    return 1;
-  
-  if ( pointerp(arg) ){
-    for ( i = sizeof(arg); i--; )
-      if ( _illegal_closure(arg[i]) )
-        return 1;
-  }
-  else if ( mappingp(arg) ){
-    indices = m_indices(arg);
-    for ( i = sizeof(indices); i--; )
-      for ( j = get_type_info( arg, 1 ); j--; )
-        if ( _illegal_closure(arg[indices[i], j]) )
-          return 1;
-  }
-  return 0;
-}
-
 //
 // _make(): Update file
 // file:  Filename
@@ -361,24 +330,18 @@
     mixed configdata;
     int restore_config;
 
-    // Wenn Objekt existiert, dann Inhalt und ggf. Daten aus Configure() oder
-    // Props sichern:
+    // Wenn Objekt existiert, dann Inhalt und ggf. Daten aus Configure() sichern
     if (obj)
     {
-      // im Fall UPD_C erfolgt _kein_ Auslesen und _keine_ Restauration
-      // mittels Configure()
-      if ( ! (flags & UPD_C ) )
+      catch(restore_config=call_resolved(&configdata,obj,
+                                                "Configure",0);
+            publish);
+      // Wenn UPD_CONF gesetzt wird, _muss_ das Objekt ein oeffentliches
+      // Configure() definieren, sonst erfolgt Abbruch.
+      if ((flags & UPD_CONF) && !restore_config)
       {
-        catch(restore_config=call_resolved(&configdata,obj,
-                                                  "Configure",0);
-              publish);
-        // Wenn UPD_CONF gesetzt wird, _muss_ das Objekt ein oeffentliches
-        // Configure() definieren, sonst erfolgt Abbruch.
-        if ((flags & UPD_CONF) && !restore_config)
-        {
-          printf("upd: %s: hat kein Configure(), Zerstoerung abgebrochen.\n",file);
-          return RET_FAIL;
-        }
+        printf("upd: %s: hat kein Configure(), Zerstoerung abgebrochen.\n",file);
+        return RET_FAIL;
       }
       if (!(flags&UPD_D)&&(flags&(UPD_L|UPD_R)))
       {
@@ -404,10 +367,6 @@
         inv=map( deep_inventory(obj), #'_save/*'*/, inv_saver )-({0});
       }
       env = environment(obj);
-      if ( flags & UPD_C )
-      {
-        pro = ({mapping})(obj->QueryProperties());
-      }
     }
     else inv = ({});
 
@@ -431,33 +390,12 @@
       if ( obj = _reload( blue,inst,flags, &err ) )
         msg += ", " + (inst ? "neu geclont" : "neu geladen");
      
-// Neu geladen: Properties wiederherstellen, Closures filtern 
+// Neu geladen: Konfiguration wiederherstellen
       if (!err)
       {
         if (!obj) obj = find_object(file);
-        // Wenn gewuenscht, Props zurueckschreiben (hat Prioritaet vor
-        // Configure(), weil explizit vom Magier angefordert).
-        if ( pro && (flags & UPD_C) )
-        {
-          string *names;
-          
-          names = m_indices(pro);
-          
-          // Closures in (mittlerweile) zerstoerten Objekten
-          // rausfiltern, damit die (hoffentlich korrekten) Closures
-          // im neu geclonten Objekt erhalten bleiben
-          for ( i = sizeof(names); i--; )
-            if ( _illegal_closure(pro[names[i], F_VALUE]) ||
-                 _illegal_closure(pro[names[i], F_QUERY_METHOD]) ||
-                 _illegal_closure(pro[names[i], F_SET_METHOD]) )
-              m_delete( pro, names[i] );
-          
-          ({mapping})obj->SetProperties(pro);
-          msg += ", Properties gesetzt";
-        }
-        // Wenn kein UPD_C, wird ggf. das Ergebnis von Configure() wieder
-        // uebergeben.
-        else if (restore_config)
+        // Ggf. Ergebnis von Configure() uebergeben
+        if (restore_config)
         {
           int conf_res;
           if (!catch(conf_res=({int})obj->Configure(configdata); publish)
@@ -517,11 +455,6 @@
   args=parseargs(cmdline,&flags,UPD_OPTS,1);
   if(flags==-1||!sizeof(args))
     return USAGE("upd [-"+UPD_OPTS+"] <datei> [<datei> ..]");
-  if ((flags & UPD_C) && (flags & UPD_CONF))
-  {
-    printf("upd: -c und -C gleichzeitig werden nicht unterstuetzt.\n");
-    return 1;
-  }
   args=file_list(args,MODE_UPD,0,"/");
   if(!sizeof(args)) return printf("upd: Keine passende Datei gefunden!\n"),1;
 
