diff --git a/d/seher/haeuser/moebel/wasch.c b/d/seher/haeuser/moebel/wasch.c
new file mode 100644
index 0000000..7789350
--- /dev/null
+++ b/d/seher/haeuser/moebel/wasch.c
@@ -0,0 +1,220 @@
+// Name des Objects:    Waschobjekt
+// Letzte Aenderung:    01.04.2005
+// Magier:              Seleven
+// Dieses File gibt dem Spieler die Moeglichkeit, eine Waschgelegenheit in
+// seinem Seherhaus aufzustellen. Das beim Kommando wasch(e), dusch(e) laesst
+// sich die Medung ueberschreiben (Test per raum->QueryProp("h_commands"))
+// 01.07.2007 (Zesstra): GetOwner() definiert.
+//----------------------------------------------------------------------------
+#pragma strong_types,rtt_checks
+
+#include "schrankladen.h"
+inherit LADEN("swift_std_container");
+
+string *wcmd;
+string *objekte =
+  (({"\nstinkobj","\nzesstra_asche","seleve\nscheisse","\npopc",
+     "\nsspbollen","seleve\nstinkobj","\nq2p_gestank","ber\tram_skot",
+     "bambi\nschmutzigehaende"}));
+/* Wurzel(Klo/Imbiss), Zesstra(Vulkan/Illuminatos), Seleven(Klo/Nebelelfen),
+ * Seleven(Popcorn/Nebelelfen), Boing(Schleimschmeisser,SSP), STANDART
+ */
+
+static void wasch_fun();
+
+protected void create()
+{
+  if (!clonep(this_object())) return;
+  ::create();
+
+  wcmd = (({"wasche","wasch","dusche","dusch"}));
+  AddId(({"duschkabine","kabine","dusche","waschgelegenheit"}));
+  SetProp(P_NAME,"Duschkabine");
+  
+  SetProp("cnt_version_obj",1);
+
+  SetProp("obj_cmd",
+  "wasch(e), dusch(e)\n"+
+  "   Damit laesst sich das Stinken aus dem Imbissklo beseitigen.\n"+
+  "   Wenn kein Befehl 'wasch(e)' im Raum beschrieben ist, erfolgt eine\n"+
+  "   Standartmeldung, selbiges gilt fuer 'dusch(e)'.\n"+
+  "ssetz(e) waschbefehl\n"+
+  "   Damit kann man die Befehlsliste erweitern, die das Waschen \n"+
+  "   ausloesen\n"+
+  "sloesch(e) waschbefehl\n"+
+  "   Damit kann man einen Befehl aus der Liste loeschen\n"+
+  "waschbefehlslite, wbl"+
+  "   Zeigt eine Liste der Befehle an, die das Waschen ausloesen.\n");
+
+  SetProp(P_SHORT,"Eine Duschkabine");
+  SetProp(P_LONG,BS("Die Duschkabine hat einen Rahmen aus hellem Holz. "
+   "Dazwischen wurden matte Scheiben eingelassen, damit man niemanden beim "
+   "Duschen beobachten kann."));
+  AddDetail("rahmen","Der Rahmen ist aus hellem Holz.\n");
+  AddDetail(({"scheiben","scheibe"}),"Die Scheiben der Duschkabine sind "+
+   "matt und absolut undurchsichtig!\n");
+  AddDetail(({"duschen","beim duschen"}),
+   "Man kann niemanden beim Duschen beobachten.\n");
+
+  SetProp(P_GENDER, FEMALE);
+  SetProp(P_WEIGHT, 5000);         // Gewicht 5 Kg
+  SetProp(P_MAX_WEIGHT, 0);        // Soll nur n pseudo-Container
+  SetProp(P_WEIGHT_PERCENT, 100);  // Dafuer macht er auch nix leichter :)
+  SetProp(P_MAX_OBJECTS, 0);       // Kein Container :)
+  SetProp(P_VALUE, 0);             // Ist eh nicht verkaufbar.
+  SetProp(P_NOBUY, 1);             // Fals doch: zerstoeren!
+  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");
+
+  AddCmd(wcmd,"cmd_waschen");
+  RemoveCmd(({"oeffne","oeffn","schliesse","schliess"}));
+  AddCmd(({"ssetze","ssetz"}),"cmd_setzen");
+  AddCmd(({"sloesche","sloesche"}),"cmd_loeschen");
+  AddCmd(({"wbl","waschbefehlsliste"}),"liste");
+}
+
+// Zesstra, 1.7.07, fuers Hoerrohr
+string GetOwner() {return "seleven";}
+
+varargs int PreventInsert(object ob) {return 1;} //Das ist kein Container :)
+
+static void wasch_fun()
+{
+  int i;
+  object ob;
+  i = sizeof(objekte);
+  i--;
+  while(i > -1)
+  {
+
+    if(!TP) return;
+    ob = present(objekte[i],TP);
+    while(ob)
+    {
+      if(query_once_interactive(ob))
+	  {
+	    tell_object(TP,BS("Du scheinst jemanden in Deinem Inv zu haben!\n"
+	     "Das sollte sich vielleicht ein Magier anschauen."));
+	    i--;
+	    return;
+      }
+      ob->remove(1);
+      if(present(objekte[i],TP));
+       ob = present(objekte[i],TP);
+    }
+    i--;
+
+  }
+}
+
+int cmd_waschen(string str)
+{
+  string verb;
+  verb = query_verb();
+  if(!environment()) return 0;
+  if( !erlaubt() )
+  {
+      write("Du solltest den Besitzer vielleicht um Erlaubnis bitten.\n");
+      return 1;
+  }
+  if(member(environment()->QueryProp("h_commands"),verb) == 0)
+  {
+    write(
+     "Du springst schnell unter die Dusche und waeschst Dich gruendlich.\n");
+    say(this_player()->Name(WER)+" springt schnell unter die Dusche.\n");
+    wasch_fun();
+    return 1;
+  }
+  wasch_fun();
+  return 1;
+}
+
+
+static int cmd_setzen(string str)
+{
+  string bef;
+  notify_fail("Moechtest Du einen Waschbefehl setzen?\n"+
+    "Syntax: ssetz(e) waschbefehl [befehl]\n");
+  if(!str || !stringp(str) || sizeof(str) == 0) return 0;
+  sscanf(str,"waschbefehl %s",bef);
+  if(!bef) return 0;
+  if(bef[sizeof(bef) .. sizeof(bef)-1] == "e")
+   bef = bef[sizeof(bef) .. sizeof(bef)-2];
+  notify_fail("Der Befehl steht schon auf der Liste.\n");
+  if(member(wcmd,bef) != -1) return 0;
+  wcmd += (({bef,bef+"e"}));
+  AddCmd(wcmd,"cmd_waschen");
+  write(BS("Du hast die Befehle "+bef+" und "+bef+"e an die Liste "
+   "angefuegt."));
+  return 1;
+}
+
+static int cmd_loeschen(string str)
+{
+  string bef;
+  notify_fail("Moechtest Du einen Waschbefehl loeschen?\n"+
+    "Syntax: sloesch(e) waschbefehl [befehl]\n");
+  if(!str || !stringp(str) || sizeof(str) == 0) return 0;
+  sscanf(str,"waschbefehl %s",bef);
+  if(!bef) return 0;
+  notify_fail("Der Befehl steht gar nicht auf der Liste.\n");
+  if(member(wcmd,bef) == -1) return 0;
+  wcmd -= (({bef}));
+  RemoveCmd(bef);
+  write(BS("Du hast die Befehle "+bef+" und "+bef+"e von der Liste "
+   "entfernt."));
+  return 1;
+}
+
+static int liste(string str)
+{
+  write("Du hast folgende Befehle auf der Waschliste stehen:\n"+
+   break_string(implode(wcmd,", "),78,3));
+  return 1;
+}
+
+
+
+// oeffnen und schliessen ausbauen.
+varargs int skommandos(string str)
+{
+  notify_fail( "Fehler: Dieser Befehl benoetigt eine gueltige Objekt-Id als Parameter.\n"
+    +"Beispiel: skommandos "+QueryProp(P_IDS)[1]+"\n");
+  if(!str) return 0;
+  if(present(str)!=TO ) // Bin ich gemeint?
+    return 0;
+  write("=============================================================================\n");
+  write("Aktuelle Version: "+QueryProp("cnt_version_std")+QueryProp("cnt_version_obj")+"\n");
+  write( BS(Name(WER,1)+" kann nur in diesem Seherhaus verwendet werden, "
+    +"da "+QueryPronoun(WER)+" speziell dafuer gekauft wurde. "+CAP(QueryPronoun(WER))
+    +" verfuegt ueber folgende Kommandos:")
+    +"-----------------------------------------------------------------------------\n"
+    +"serlaube [Objekt-Id] [Spielername|\"hausfreunde\"|\"zweities\"]\n"
+    +"  Erlaubt Personen, "+name(WEN,1)+" mitzubenutzen.\n"
+    +"  serlaube + Objekt-Id (ohne Spielername/hausfreunde)\n"
+    +"  listet alle Personen mit Zugriff auf "+name(WEN,1)+"\n\n"
+    +"verschiebe [Objekt-Id] nach [Ausgang]\n"
+    +"  Damit kannst Du "+name(WEN,1)+" innerhalb Deines Seherhauses verschieben.\n\n"
+  //Seleven 07.12.2005
+    +"sverstecke [Objekt-Id]\n"
+    +"  Damit machst Du "+name(WEN,1)+" unsichtbar.\n"
+    +"shole [Objekt-Id] hervor\n"
+    +"  Damit machst Du "+name(WEN,1)+" wieder sichtbar.\n"
+  // Bis hier
+    +"zertruemmer [Objekt-Id]\n"
+    +"  Damit zerstoerst Du "+name(WEN,1)+".\n\n");
+
+
+  if( QueryProp("obj_cmd") )
+    write( QueryProp("obj_cmd")+"\n" );
+
+  write("[Objekt-Id] muss eine gueltige Id sein, in diesem Fall z.B. "
+      +QueryProp(P_IDS)[1]+"\n");
+  write("=============================================================================\n");
+
+
+  return 1;
+}
+
