diff --git a/d/seher/haeuser/moebel/schrankmaster.c b/d/seher/haeuser/moebel/schrankmaster.c
new file mode 100644
index 0000000..c602ddc
--- /dev/null
+++ b/d/seher/haeuser/moebel/schrankmaster.c
@@ -0,0 +1,233 @@
+//--------------------------------------------------------------------------------
+// Name des Objects:    Schrankmaster
+// Letzte Aenderung:    19.03.2001
+// Magier:              wurzel
+//--------------------------------------------------------------------------------
+/* Changelog:
+   * 21.06.2007, Zesstra
+           call_out ohne Verzoegerung beim Updaten durch eines mit 2s Verzoegerung ersetzt.
+*/
+#pragma strong_types,rtt_checks
+
+inherit "/std/room";
+
+#include <properties.h>
+#include <language.h>
+#include "schrankladen.h"
+
+mapping schraenke;
+string *cnts;
+int update_laeuft;
+int reset_laeuft;
+
+protected void create() 
+{
+  ::create();
+  SP(P_INT_SHORT, "Irgendwo und Nirgends");
+  SP(P_INT_LONG,
+     "Dies ist der Master-Raum fuer den SCHRAENKER.\n"
+    +"Hier merkt sich August die Anzahl der verkauften Container.\n"
+    +"Davon sind momentan @@ANZAHL@@ registrierte im Umlauf!\n"
+    +"Folgende Befehle sind verfuegbar:\n"
+    +"  schrankliste.........Listet registrierte, im Spiel befindliche Container.\n"
+    +"  schrankupdate........Fuehrt ein Update aller registrierten Container durch.\n");
+
+  SP(P_LIGHT, 1);
+  SP(P_INDOORS, 1);
+  if( SCHRANKMASTER2->QueryProp("schraenke") )  // Der Sicherungsraum hat Daten?
+    schraenke=SCHRANKMASTER2->QueryProp("schraenke");  // Daten holen...
+  else
+    schraenke=([]);
+  SetProp("schraenke", schraenke );
+
+  update_laeuft=0;
+
+  // unnoetig, SCHRANKMASTER2 ist jetzt schon geladen, s.o.
+  //load_object(SCHRANKMASTER2);
+  set_next_reset(3600); // Reset 1 x pro Std.
+
+  AddCmd(({"schrankliste"}), "Schrankliste");
+  AddCmd(({"schrankupdate"}), "SchrankUpdate");
+}
+
+public int clean_up(int ref) {return 0;}   // verhindert Ausswappen des Raumes
+
+public varargs string GetExits( object viewer ) 
+{
+  return "";
+}
+
+string ANZAHL()
+{
+  return to_string( sizeof(schraenke) );
+}
+
+
+// cnt = Object des Containers
+// ver = Version des Containers (VERSION_STD+VERSION_OBJ von std.cont. + objekt...)
+// seher=Der Besitzer/Kaeufer
+// standort=Raum in dem der Container steht
+void RegisterCnt(mixed cnt, mixed ver, mixed seher, mixed standort)
+{
+  if (objectp(standort)) standort=object_name(standort);
+  if( !objectp(cnt) || !stringp(ver) || !stringp(seher) || !stringp(standort) )
+  {
+    log_file("swift/schraenker/bugs.log", "schrankmaster (RegisterCnt) *"
+      +to_string(cnt)+"*"+to_string(ver)+"*"+to_string(seher)+"*"
+      +to_string(standort)+"*\n");
+    return;
+  }
+  m_delete(schraenke,object_name(cnt));
+  schraenke+=([object_name(cnt): ver; seher; to_string(standort)]);
+  SetProp("schraenke", schraenke );
+  SCHRANKMASTER2->SetProp("schraenke", schraenke );
+}
+
+void RemoveCnt(mixed cnt, mixed seher)
+{
+  if( !objectp(cnt) || !stringp(seher) )
+  {
+    log_file("swift/schraenker/bugs.log", "schrankmaster (RemoveCnt) *"
+      +to_string(cnt)+"*"+to_string(seher)+"*\n");
+    return;
+  }
+  schraenke-=([object_name(cnt)]);
+  SetProp("schraenke", schraenke );
+  SCHRANKMASTER2->SetProp("schraenke", schraenke );
+}
+
+string fn(string was)
+{
+  string str,*strs;
+  strs=old_explode( was, "/" );
+  str=strs[sizeof(strs)-1];
+  strs=old_explode( str, "#" );
+  str=strs[0];
+  return str;
+}
+
+int Schrankliste()
+{
+  int i;
+  string str, *strs;
+  object cnt;
+  if(update_laeuft && !reset_laeuft) // Nicht waehrend eines Updates der Schraenke!
+  {
+    write("Update wird durchgefuehrt. Bitte bis zum Ende warten!\n");
+    return 1;
+  }
+  str="----------------------------------------------------------------------\n";
+  strs=m_indices(schraenke);
+  for(i=0;i<sizeof(strs);i++)
+  {
+    if( cnt=find_object(strs[i]) )
+    {
+      str+=(fn(object_name(cnt))+"....................")[0..20]+" ";
+      str+=schraenke[strs[i], 0]+" ";
+      str+=(schraenke[strs[i], 1]+"....................")[0..20]+" ";
+      str+=fn(schraenke[strs[i], 2])+"\n";
+    }
+    else
+    {
+      str+="Nicht auffindbaren Container aus Liste geloescht!\n";
+      schraenke-=([strs[i]]);
+      SetProp("schraenke", schraenke );
+      SCHRANKMASTER2->SetProp("schraenke", schraenke );
+    }
+  }
+  str+="----------------------------------------------------------------------\n";
+  if( TP && present(TP) ) //wurzel 19.03.01 
+    TP->More(str);
+  return 1;
+}
+
+void Update_naechster_Schrank()
+{
+  int i;
+  object cnt, cnt_neu, *inv;
+  if( sizeof(cnts) )    // Es gibt noch Schraenke zum abarbeiten...
+  {
+    cnt=find_object(cnts[0]); // Schrank auswaehlen + Objekt suchen
+    if(cnt)
+    {
+      // Autoloadertruhe ist etwas spezieller zu updaten... Daher alternativer
+      // Mechanismus: UpdateMe() im Moebelstueck aufrufen. Wenn die Funktion
+      // etwas != 0 liefert, wird angenommen, dass diese Funktion das Update
+      // gemacht hat oder sich in Kuerze darum kuemmert. Sonst wird das alte
+      // Update gemacht.
+      // Das neue Moebelobjekt ist dafuer verantwortlich, sich beim
+      // Schrankmaster zu (de-)registrieren!
+      object oldenv=environment(cnt);
+      if (cnt->UpdateMe())
+      {
+          tell_room(TO, "...Update "+CAP(fn(cnts[0]))
+              +" in " + object_name(oldenv) + "\n" );
+      }
+      else
+      {
+          tell_room(TO, CAP(fn(cnts[0]))
+              +" in " + object_name(oldenv) 
+              + " hat kein UpdateMe()!\n" );
+      }
+    }
+    else
+    {
+      tell_room(TO, "Nicht auffindbaren Container aus Liste geloescht!\n");
+      schraenke-=([cnts[0]]);
+    }
+    cnts-=({cnts[0]});   // Schrank aus Liste nehmen
+    call_out("Update_naechster_Schrank", 2);  // Nur 1 Schrank-Update pro heart_beat!
+  }
+  else  // Alle Schraenke abgearbeitet:
+  {
+    tell_room(TO, "*** Update abgeschlossen.\n");
+    SetProp("schraenke", schraenke );
+    SCHRANKMASTER2->SetProp("schraenke", schraenke );
+    update_laeuft=0;
+  }
+}
+
+int SchrankUpdate()
+{
+  if(update_laeuft)   // Nicht waehrend eines Updates der Schraenke!
+  {
+    write("Update wird durchgefuehrt. Bitte bis zum Ende warten!\n");
+    return 1;
+  }
+  update_laeuft=1;    // Ab sofort laeuft Update!
+  cnts=m_indices(schraenke);
+  tell_room(TO, "*** Update wird gestartet...\n");
+  Update_naechster_Schrank();
+  return 1;
+}
+
+
+void reset()
+{
+  reset_laeuft=1;
+  set_next_reset(3600); // Reset 1 x pro Std.
+  ::reset();
+  // Wirft Schraenke aus der Liste, die aus welchem Grund auch immer nicht mehr existieren
+  Schrankliste();
+  if( !(schraenke==QueryProp("schraenke")==SCHRANKMASTER2->QueryProp("schraenke")) )
+    log_file("swift/schraenker/reset.log", "schrankmaster (reset) "
+      +sizeof(schraenke)+" "
+      +sizeof(QueryProp("schraenke"))+" "
+      +sizeof(SCHRANKMASTER2->QueryProp("schraenke"))+"\n");
+  if( present("Interactive") )
+    tell_room(TO, "*** RESET ***\n");
+  reset_laeuft=0;
+}
+
+/*
+// Veraltete Funktionen, um Fehler abzufangen. Kann nach dem naechsten Reboot
+// geloescht werden !!!
+void AddCnt(mixed cnt, mixed ver, mixed seher, mixed standort)
+{
+  log_file("swift/schraenker/verloren.log", to_string(cnt)+"\n");
+}
+void EditCnt(mixed cnt, mixed ver, mixed seher, mixed standort)
+{
+  log_file("swift/schraenker/verloren.log", to_string(cnt)+"\n");
+}
+*/
