diff --git a/d/seher/haeuser/truhe.c b/d/seher/haeuser/truhe.c
new file mode 100644
index 0000000..3eab8ad
--- /dev/null
+++ b/d/seher/haeuser/truhe.c
@@ -0,0 +1,365 @@
+#include "haus.h"
+#include <properties.h>
+#include <moving.h>
+#include <wizlevels.h>
+
+inherit "/d/wueste/durian/behaelter";
+inherit "/p/service/wargon/mat_ed";
+inherit "/mail/nedit";
+
+static string owner;
+
+void create()
+{
+  if (!clonep(this_object())) return;
+
+  ::create();
+
+  Set(P_NAME, SAVE, F_MODE_AS);
+  Set(P_SHORT, SAVE, F_MODE_AS);
+  Set(P_LONG, SAVE, F_MODE_AS);
+  Set(P_GENDER, SAVE, F_MODE_AS);
+  Set(P_IDS, SAVE, F_MODE_AS);
+  Set(P_INVIS, SAVE, F_MODE_AS);
+  Set(P_NAME_ADJ, SAVE, F_MODE_AS);
+  Set(P_MATERIAL, SAVE, F_MODE_AS);
+  Set(H_DOORLSTAT, SAVE, F_MODE_AS);
+
+  SetProp( P_NAME, "Truhe" );
+  SetProp( P_SHORT, "Eine Truhe" );
+  SetProp( P_LONG,
+     "Eine stabile Holztruhe mit einem Sicherheitsschloss. Nur ausgewaehlte\n"
+    +"Personen duerfen die Truhe oeffnen und Sachen in ihr lagern oder aus\n"
+    +"ihr nehmen.\n" );
+  SetProp( P_GENDER, FEMALE );
+  SetProp( P_NOGET, 1 );
+  SetProp( P_IDS, ({ "truhe","holztruhe", TRUHE}) );
+  SetProp( P_MATERIAL, ([ MAT_MISC_WOOD : 100 ]) );
+  SetProp( H_DOORLSTAT, ({ "geschlossen", "geoeffnet"}) );
+
+  AddCmd( ({ "schieb","schiebe"}), "schieben" );
+  AddCmd( ({ "beschreib", "beschreibe" }), "beschreiben" );
+  AddCmd( ({ "aender", "aendere" }), "aendern" );
+}
+
+mixed
+_set_owner(string ow)
+{
+  string *na, *a;
+  int i;
+
+  if (ow && stringp(ow))
+    restore_object(HAUSSAVEPATH+ow+"truhe");
+
+  if ((na = QueryProp(P_NAME_ADJ)) && (i=sizeof(na))) {
+    for (a = ({ }), i-=1; i>=0; i--)
+      a += ({ DeclAdj(na[i], WER)[0..<2], DeclAdj(na[i], WEM)[0..<2], DeclAdj(na[i],WEN)[0..<2] });
+
+    a = m_indices(mkmapping(a));
+    if (sizeof(a))
+      AddAdjective(a);
+  }
+
+  SetZu();
+  return owner=ow;
+}
+
+string
+short()
+{
+  int open;
+  string sh, *stat;
+
+  open = (QueryProp(P_CNT_STATUS) == CNT_STATUS_OPEN);
+  sh = QueryProp(P_SHORT);
+  stat = QueryProp(H_DOORLSTAT);
+  if (!stat)
+    stat = ({ "", ""});
+  else if (strstr(sh, "%s") == -1)
+    sh += " (%s)";
+  if(QueryProp(P_INVIS)) return "";
+  return sprintf(sh, stat[offen])+".\n";
+}
+
+oeffne(string str)
+{
+  object env;
+
+  notify_fail("WAS moechtest Du oeffnen?\n");
+
+  // bin ich gemeint?
+  if (!str || present(str, environment()) != this_object())
+    return 0;
+
+  if ((env=environment()) && env->id("sehe\rhaus")) {
+    if (!env->allowed_check(this_player())) {
+      write("Du darfst "+name(WEN)+" nicht oeffnen!\n" );
+      return 1;
+    }
+  }
+  return ::oeffne(str);
+}
+
+int MayAddWeight(int w)
+{
+  return 0;
+}
+
+static int
+schieben(string richtung)
+{
+  string *aus;
+  mapping exits;
+
+  if (!environment() || (!environment()->id("sehe\rhaus")) ||
+      !environment()->tp_owner_check())
+    return 0;
+
+  notify_fail( "Syntax: schiebe <truhe> nach <richtung>\n");
+
+  if (!richtung || richtung == "")
+    return 0;
+
+  aus = old_explode(richtung, " ");
+  richtung = aus[<1];
+  if (sizeof(aus) < 3 || !id(implode(aus[0..<3]," ")))
+    return 0;
+
+  if (member(aus = m_indices(exits = environment()->QueryProp(P_EXITS)),richtung)==-1)
+    write( "Du kannst "+name(WEN,1)+" nicht nach '"+richtung+"' schieben!\n");
+  else if (!exits[richtung]->tp_owner_check())
+    write( "Du kannst "+name(WEN,1)+" nicht aus Deinem Haus hinausschieben!\n");
+  else {
+    write( "Du schiebst "+name(WEN,1)+" in einen anderen Raum. Dann kehrst\n"
+	  +"Du wieder zurueck.\n");
+    say(capitalize(this_player()->name(WER))+" schiebt "+name(WEN)+" in einen anderen\n"
+	+"Raum, kehrt aber selber wieder.\n");
+    environment()->Set(H_CHEST,0);
+    environment()->Save();
+    move(exits[richtung], M_NOCHECK);
+    environment()->Set(H_CHEST,1);
+    environment()->Save();
+  }
+  return 1;
+}
+
+private string *brk(string str)
+{
+  int i;
+  string *t1, *t2;
+
+  t1 = regexplode(str, ", *");
+  for (t2 = ({}), i=sizeof(t1)-1; i>=0; i-=2)
+    t2 = ({t1[i]}) + t2;
+
+  return t2;
+}
+
+static void getShort();
+
+static int beschreiben(string str)
+{
+  string *x;
+
+  if (!str || getuid(this_player()) != owner)
+    return 0;
+
+  x = old_explode(str, " ");
+
+  if (x[<1] == "status" && !id(implode(x[0..<2]," ")))
+    return 0;
+  else if (!id(str) && (str != "truhe"))
+    return 0;
+
+  write( "Beschreibung "+name(WESSEN,1)+"\n"
+	+"Wenn die Vorgaben nicht geaendert werden sollen, einfach weiter\n"
+	+"mit <RETURN>.\n\n");
+  getShort();
+  return 1;
+}
+
+static void getShort()
+{
+  write("Geschlecht (m, w, s): ["
+	+({ "s","m","w" })[QueryProp(P_GENDER)]+"]\n]" );
+  input_to("gotGender");
+}
+
+static void gotGender(string str)
+{
+  int gen;
+  mixed name;
+
+  if (!str || str == "")
+    write("Geschlecht nicht geaendert.\n");
+  else if ((gen = member(({'s','m','w'}),str[0])) == -1) {
+    write( "Bitte nur 'm', 'w' oder 's' eingeben!\nGeschlecht:\n]");
+    input_to("gotGender");
+    return;
+  }
+  else {
+    SetProp(P_GENDER, gen);
+    write( "Das Geschlecht ist jetzt "+QueryGenderString()+".\n");
+  }
+
+  name = QueryProp(P_NAME);
+  write("Nun musst Du den Namen eingeben. Sollte der Name unregelmaessig dekliniert\n"
+       +"werden, musst Du den Namen in allen vier Faellen in der Reihenfolge Nomi-\n"
+       +"nativ, Genitiv, Dativ, Akkusativ und durch Kommata getrennt eingeben.\n"
+       +"Name: ["+(pointerp(name) ? implode(name, ", ") : name)+ "]\n]");
+  input_to("gotName");
+}
+
+static void gotName(string str)
+{
+  string *n;
+
+  if (!str || member(({ "", ".", "**", "~q"}), str) >= 0)
+    write("Name wurde nicht geaendert.\n");
+  else {
+    n = brk(str);
+
+    if (sizeof(n) == 1)
+      SetProp(P_NAME, n[0]);
+    else {
+      if (sizeof(n) > 4)
+	n = n[0..3];
+      else
+	while (sizeof(n) != 4)
+	  n = n + ({ n[0] });
+      SetProp(P_NAME,n);
+    }
+    printf("Der Name ist jetzt '%s'\n", implode(n, ", "));
+  }
+  write("Du kannst jetzt noch Namensadjektive angeben. Hier darfst Du nur den Wort-\n"
+       +"stamm angeben, da die Adjektive automatisch dekliniert werden (also fuer\n"
+       +"eine 'alte Truhe' muesstest Du 'alt' angeben).\n"
+       +"Du kannst auch mehrere Adjektive, durch Kommata getrennt, angeben.\n"
+       +"Um alle Namensadjektive zu loeschen, gib bitte 'nix' ein.\n"
+       +"Namensadjektive: ["+implode(QueryProp(P_NAME_ADJ),", ")+"]\n");
+  input_to("gotAdj");
+}
+
+static void gotAdj(string str)
+{
+  string *n;
+
+  if (!str || member(({ "", ".", "**", "~q"}), str) >= 0)
+    write("Adjektive nicht geaendert.\n");
+  else {
+    n = brk(str);
+
+    if (member(n, "nix") == -1) {
+      SetProp(P_NAME_ADJ, n);
+      printf("Namensadjektive lauten %s.\n", implode(n,", "));
+    }
+    else {
+      SetProp(P_NAME_ADJ, ({}) );
+      write("Namensadjektive geloescht.\n");
+    }
+  }
+  SetProp(P_SHORT, capitalize(name(WER)));
+  write( "Die Kurzbeschreibung lautet damit:\n"+short());
+  write( "Falls das Ergebnis nicht Deinen Vorstellungen entspricht, gelangst Du\n"
+	+"mit 'n' wieder in die Geschlechtsabfrage, ansonsten geht es in der\n"
+	+"Beschreibunssequenz weiter.\n"
+	+"Stimmt die Kurzbeschreibung so? (j/n)\n]");
+  input_to("gotKurz");
+}
+
+static void gotKurz(string str)
+{
+  string art, nam, *p;
+  int gen;
+
+  if (str && sizeof(str) && str[0] == 'n') {
+    write( "Neues Spiel, neues Glueck... ;)\n");
+    getShort();
+    return;
+  }
+  write("\nIDs (durch Kommata getrennt):\n["+implode(QueryProp(P_IDS)-({TRUHE}), ",")+"]\n]");
+  input_to("gotIDs");
+}
+
+static void gotIDs(string str)
+{
+  if (!str || member( ({ "", ".", "**", "~q" }), str) >= 0 )
+    write("IDs nicht geaendert.\n");
+  else {
+    str = implode(old_explode(lower_case(str)," ")-({""})," ");
+    str = implode(old_explode(str,", "),",");
+    SetProp(P_IDS, old_explode(str, ",")+({TRUHE}));
+    write("OK, IDs lauten '"+str+"'\n");
+  }
+  write("\nBitte Langbeschreibung eingeben (Abbruch mit ~q, Ende mit . oder **):\n");
+  nedit("gotLang");
+}
+
+static void gotMat(mapping mat);
+
+static void gotLang(string str)
+{
+  if (!str || str == "")
+    write("Die Langbeschreibung wurde nicht veraendert.\n");
+  else
+    SetProp(P_LONG,implode(old_explode(str, "@@"),"**"));
+
+  write("\nBitte das Material "+name(WESSEN,1)+" bestimmen:\n"
+	"(<RETURN> falls nichts geaendert werden soll)\n\n");
+
+  EditMaterial(QueryProp(P_MATERIAL), #'gotMat, 0, ({MATGROUP_GAS,MATGROUP_EXPLOSIVE}));
+}
+
+static void gotMat(mapping mat)
+{
+  if (mappingp(mat)) {
+    SetProp(P_MATERIAL, mat);
+    write("OK.\n");
+  }
+  else
+    write("Das Material wurde nicht veraendert.\n");
+
+  save_object(HAUSSAVEPATH+owner+"truhe");
+}
+
+static int aendern(string str)
+{
+  if (getuid(this_player())!=owner || !id(str))
+    return 0;
+
+  write("Bitte Langbeschreibung aendern.\n(Abbruch mit ~q, Ende mit . oder **, Hilfe mit ~h)\n");
+  nedit("gotLang", QueryProp(P_LONG));
+  return 1;
+}
+
+void Save()
+{
+  save_object(HAUSSAVEPATH+owner+"truhe");
+}
+
+int SmartLog(string ofile, string typ, string msg, string date)
+{
+  object home;
+  string foo, bar;
+
+  write_file(REPFILE(owner), sprintf("%s von %s an der Truhe (%s):\n%s\n",
+				     typ,
+				     capitalize(getuid(this_player())),
+				     date,
+				     break_string(msg,78)));
+
+  if (IS_LEARNER(owner)) {
+    log_file("report/"+owner+".rep",
+	     sprintf("MELDUNG von %s im Seherhaus, an der Truhe (%s):\n"
+		     +"Bitte zur Kenntnis nehmen! (Mit dem Befehl 'meldungen')  -Wargon\n",
+		     capitalize(getuid(this_player())),
+		     date));
+  }
+
+  home = load_object(RAUMNAME(owner,0));
+  home->Set(H_REPORT, home->Query(H_REPORT)+1);
+  home->Save();
+
+  return 1;
+}
+
