diff --git a/d/seher/haeuser/moebel/kleiderschrank.c b/d/seher/haeuser/moebel/kleiderschrank.c
new file mode 100644
index 0000000..79209b4
--- /dev/null
+++ b/d/seher/haeuser/moebel/kleiderschrank.c
@@ -0,0 +1,208 @@
+//--------------------------------------------------------------------------------
+// Name des Objects:    Kleiderschrank
+// Letzte Aenderung:    17.03.2001
+// Magier:              Swift
+//--------------------------------------------------------------------------------
+#pragma strong_types,rtt_checks
+
+#include "schrankladen.h"
+#include <ansi.h>
+inherit LADEN("swift_std_container");
+
+#define VERSION_OBJ "3"
+
+string strall;
+
+protected void create()
+{
+  if (!clonep(TO)) return;
+  swift_std_container::create();
+  SetProp(P_SHORT, "Ein Kleiderschrank");
+  SetProp(P_LONG, BS(
+     "In diesem massiven Holzschrank kannst Du die Ausruestung fuer eine "
+    +"halbe Armee unterbringen. Mehrere Regale sorgen dafuer, dass alles "
+    +"seinen geordneten Platz findet, damit Du es auch schnell "
+    +"wiederfindest.")+"@@cnt_status@@");
+  AddId(({"kleiderschrank", "holzschrank", "schrank"}));
+  SetProp("cnt_version_obj", VERSION_OBJ);
+  SetProp(P_NAME, "Kleiderschrank");
+  SetProp(P_GENDER, MALE);
+  SetProp(P_WEIGHT, 5000);         // Gewicht 5 Kg
+  SetProp(P_MAX_WEIGHT, 1000000);  // Es passen fuer 1000 kg Sachen rein.
+  SetProp(P_WEIGHT_PERCENT, 100);  // Dafuer macht er auch nix leichter :)
+  SetProp(P_MAX_OBJECTS, 100);     // Mehr sollte nicht sein, lt. Tiamak.
+  SetProp(P_VALUE, 0);             // Kein materieller Wert. Ist eh nicht verkaufbar.
+  SetProp(P_NOBUY, 1);             // Wird im Laden zerstoert, falls er verkauft wird.
+  SetProp(P_NOGET, "Das geht nicht. "+Name(WER,1)+" haftet wie magisch am Boden.\n");
+  SetProp(P_MATERIAL, ({MAT_MISC_WOOD, MAT_MISC_MAGIC}) );
+  SetProp(P_INFO, "Versuchs mal mit: \"skommandos "+QueryProp(P_IDS)[1]+"\" !\n");
+  SetProp("obj_cmd", "sliste [Objekt-Id] [Kleidungs-/Ruestungstyp|\"alles\"]\n"
+                    +"  Kleidungs-/Ruestungstypen: Helme, Umhaenge, Ruestungen, Hosen, Schuhe,\n"
+                    +"                             Handschuhe, Guertel, Amulette, Ringe, Koecher,\n"
+                    +"                             Schilde, Sonstiges\n");
+  AD(({"regal", "regale"}), BS("Durch die Regale kommt etwas Ordnung in die "
+    +"vielen Sachen, die man in den Schrank stecken kann. Du kannst Dir z.B. "
+    +"eine Liste bestimmter Kleidungs-/Ruestungstypen des Schrankinhaltes "
+    +"mit dem Befehl \"sliste\" anschauen. (Das geht natuerlich nur bei "
+    +"offenem Schrank!"));
+
+  AddCmd(({"sliste"}), "auflistung");
+}
+
+varargs int PreventInsert(object ob)
+{
+  // Nur Ruestung/Kleidung hat in diesem Container was verloren!
+  if ((ob->IsClothing() || ob->QueryProp(P_ARMOUR_TYPE))
+      && !ob->QueryProp(P_WEAPON_TYPE) )
+  {
+    return ::PreventInsert(ob);
+  }
+
+  write( BS("In "+name(WEN,1)+" kannst Du nur Ruestungs-/Kleidungsstuecke legen!"));
+  return 1;
+}
+
+int auflistung2(string was, string nf_str1, string nf_str2, int alles)
+{
+  string obshort, suche, *strs;
+  object *obs;
+  int i;
+  mapping suchobs;
+  switch(was)
+  {
+    case "helme"      : suche=AT_HELMET; break;
+    case "umhaenge"   : suche=AT_CLOAK; break;
+    case "ruestungen" : suche=AT_ARMOUR; break;
+    case "hosen"      : suche=AT_TROUSERS; break;
+    case "schuhe"     : suche=AT_BOOT; break;
+    case "handschuhe" : suche=AT_GLOVE; break;
+    case "guertel"    : suche=AT_BELT; break;
+    case "amulette"   : suche=AT_AMULET; break;
+    case "ringe"      : suche=AT_RING; break;
+    case "koecher"    : suche=AT_QUIVER; break;
+    case "schilde"    : suche=AT_SHIELD; break;
+    case "sonstiges"  : suche=AT_MISC; break;
+    default           : write("Fehler: Ungueltiger Kleidungs-/Ruestungstyp. "
+                             +"Folgende Typen gibt es:\n"+nf_str1+nf_str2);
+                        return 1; break;
+  }
+  obs=all_inventory();
+  suchobs=([]);
+  for(i=0;i<sizeof(obs);i++)
+  {
+    obshort=obs[i]->QueryProp(P_SHORT);
+    if(obshort=="Nichts besonderes") // keine P_SHORT ?
+      obshort=obs[i]->Name(WER);     //   Hoffen wir mal dass das Obj. nen Namen hat.
+    if(obs[i]->QueryProp(P_ARMOUR_TYPE)==suche)    // Gesuchter ArmourType gefunden...
+    {
+      if(suchobs[obshort])                         // P_SHORT des Obj. schon im mapping?
+      {
+        if( obs[i]->QueryProp(P_AMOUNT) )
+          suchobs[obshort]+=obs[i]->QueryProp(P_AMOUNT); //   Dann den Zaehler um Amount hoch!
+        else
+          suchobs[obshort]+=1;                     //   Dann den Zaehler um 1 hoch!
+      }
+      else
+      {
+        if( obs[i]->QueryProp(P_AMOUNT) )
+          suchobs+=([obshort: obs[i]->QueryProp(P_AMOUNT)]);
+        else
+          suchobs+=([obshort: 1]);
+      }
+    }
+  }
+  strs=m_indices(suchobs);
+  if(sizeof(strs))
+  {
+    if(!alles)
+    {
+      strall+=Name(WER,1)+" enthaelt folgende "+CAP(was)+":\n";
+      strall+="------------------------------------------------------------\n";
+    }
+    else
+      strall+=ANSI_BOLD+"=== "+CAP(was)+":\n"+ANSI_NORMAL;
+    for(i=0;i<sizeof(strs);i++)
+    {
+      if(suchobs[strs[i]] > 1)
+        strall+=strs[i]+". ("+suchobs[strs[i]]+")\n";
+      else
+        strall+=strs[i]+".\n";
+    }
+  }
+  else
+    if(!alles)
+      strall+=Name(WER,1)+" enthaelt keine "+CAP(was)+"!\n";
+  return 1;
+}
+
+int auflistung(string str)
+{
+  string *strs, ob_id, was, nf_str1,nf_str2;
+  strall="";
+  nf_str1="   (Helme, Umhaenge, Ruestungen, Hosen, Schuhe, Handschuhe,\n"
+         +"    Guertel, Amulette, Ringe, Koecher, Schilde, Sonstiges)\n";
+  nf_str2="Syntax: sliste [Objekt-Id] [Kleidungs-/Ruestungstyp|\"alles\"]\n"
+         +"Bsp.:   sliste "+QueryProp(P_IDS)[1]+" "+"helme\n"
+         +"        sliste "+QueryProp(P_IDS)[1]+" alles\n";
+  notify_fail("Fehler: Ohne Parameter klappt das nicht.\n"+nf_str2);
+  if(!str) return 0;
+  if(present(str)==TO)   // Ueberpruefe, ob dieses Objekt gemeint ist!
+  {
+    write("Fehler: Es fehlt ein Kleidungs-/Ruestungstyp. Folgende Typen gibt es:\n"
+         +nf_str1+nf_str2);
+    return 1;
+  }
+  strs=old_explode(str, " ");
+  notify_fail("Fehler: Du musst eine gueltige Objekt-Id angeben!\n"
+             +nf_str2);
+  if( sizeof(strs) < 2 ) return 0;   // Nur 1 Par. und der ist nicht die Objekt-Id
+  if( sizeof(strs) == 2 )   // Anzahl Par. = 2
+  {
+    ob_id=strs[0];
+    was=strs[1];
+    if( IST_ZAHL(was) )     // Objekt-Id z.B. mit "schrank 2" angesprochen?
+      if(present(ob_id+" "+was)==TO)   // Falls dieses Objekt gemeint ist und kein 3. Par!
+      {
+        write("Fehler: Es fehlt ein Kleidungs-/Ruestungstyp. Folgende Typen gibt es:\n"
+              +nf_str1+nf_str2);
+        return 1;
+      }
+      else
+        return 0;
+  }
+  else if( sizeof(strs) == 3 )
+  {
+    ob_id=strs[0]+" "+strs[1];
+    was=strs[2];
+  }
+  else        // Anzahl erforderlicher Parameter ueberschritten!
+    return 0;
+  if(present(ob_id)!=TO)   // Ueberpruefe, ob auch dieses Objekt gemeint ist!
+    return 0;
+  if(QueryProp(P_CNT_STATUS)!=CNT_STATUS_OPEN)
+  {
+    write("Dazu muesste "+name(WER,1)+" geoeffnet sein.\n");
+    return 1;
+  }
+//--- Hier ist Parameterpruefung zu Ende.
+  was=LOWER(was);
+  if(was!="alles")
+    auflistung2(was, nf_str1, nf_str2, 0);
+  else
+  {
+    auflistung2("helme", nf_str1, nf_str2, 1);
+    auflistung2("umhaenge", nf_str1, nf_str2, 1);
+    auflistung2("ruestungen", nf_str1, nf_str2, 1);
+    auflistung2("hosen", nf_str1, nf_str2, 1);
+    auflistung2("schuhe", nf_str1, nf_str2, 1);
+    auflistung2("handschuhe", nf_str1, nf_str2, 1);
+    auflistung2("guertel", nf_str1, nf_str2, 1);
+    auflistung2("amulette", nf_str1, nf_str2, 1);
+    auflistung2("ringe", nf_str1, nf_str2, 1);
+    auflistung2("koecher", nf_str1, nf_str2, 1);
+    auflistung2("schilde", nf_str1, nf_str2, 1);
+    auflistung2("sonstiges", nf_str1, nf_str2, 1);
+  }
+  TP->More(strall);
+  return 1;
+}
