diff --git a/d/seher/haeuser/haus.c b/d/seher/haeuser/haus.c
new file mode 100644
index 0000000..d61471c
--- /dev/null
+++ b/d/seher/haeuser/haus.c
@@ -0,0 +1,361 @@
+//
+//  haus.c  -- Das Rohgeruest eines Seherhauses.
+//
+//  Grundobjekt (c) 1994 Boing@MorgenGrauen
+//  Abschliessen und Rauswerfen von Jof
+//  Fuer Aenderungen ab dem 06.10.94 verantwortlich: Wargon
+//
+// $Date: 1996/02/21 18:09:55 $
+// $Revision: 2.8 $
+/* $Log: haus.c,v $
+ * Revision 2.8  1996/02/21  18:09:55  Wargon
+ * SmartLog() fuer Rueckmeldungen eingebaut.
+ *
+ * Revision 2.7  1995/07/06  11:18:07  Wargon
+ * Langbeschreibung aenderbar.
+ *
+ * Revision 2.6  1995/04/21  10:48:20  Wargon
+ * Bugfix in "beschreibe tuerstatus".
+ *
+ * Revision 2.5  1995/04/21  08:56:55  Wargon
+ * Haustuer ausgelagert.
+ * 'beschreibe tuerzustand' ist dazugekommen.
+ *
+ * Revision 2.4  1995/02/27  20:47:32  Wargon
+ * Diverse Bugs gefixed...
+ *
+ * Revision 2.2  1995/02/15  11:19:17  Wargon
+ * Die Haustuer kann jetzt auch beschrieben werden (H_DOOR).
+ *
+ * Revision 2.1  1995/02/04  14:51:14  Wargon
+ * Statt "Haus" wird weitestgehend name() verwendet.
+ *
+ * Revision 2.0  1995/02/01  20:40:26  Wargon
+ * Das Haus ist jetzt nur noch ein Objekt in einem Raum, nicht
+ * mehr ein Raum im Raum.
+ *
+ */
+#include "haus.h"
+#include <properties.h>
+#include <moving.h>
+#include <wizlevels.h>
+
+inherit "/std/thing";
+inherit HAUSTUER;
+
+private nosave string text;
+private nosave string owner;
+
+void create()
+{
+  if (!clonep(this_object())) return;
+
+  thing::create();
+  haustuer::create();
+
+  SetProp(P_NAME, ({ "Haus", "Hauses", "Haus", "Haus" }));
+  SetProp(P_IDS, ({"haus","sehe\rhaus"}));
+  SetProp(P_GENDER, NEUTER);
+  SetProp(P_NOGET,1);
+
+  Set(P_LONG, SAVE, F_MODE);
+  Set(P_SHORT, SAVE, F_MODE);
+  Set(P_IDS, SAVE, F_MODE);
+  Set(P_GENDER, SAVE, F_MODE);
+  Set(P_NAME, SAVE, F_MODE);
+
+  text = 0;
+
+  AddCmd( ({"betritt", "betrete"}), "betritt" );
+  AddCmd( ({"beschreib", "beschreibe"}), "beschreiben");
+  AddCmd( ({"aender", "aendere"}), "aendern");
+  AddCmd( ({"klopf","klopfe"}), "klopfen");
+  AddCmd("erlaube", "erlauben");
+  AddCmd("verbiete", "verbieten");
+  AddCmd("notiz", "merktext");
+}
+
+varargs void Save(int crunched)
+{
+  save_object(HAUSSAVEPATH+owner);
+}
+
+void Load()
+{
+  restore_object(HAUSSAVEPATH+owner);
+}
+
+void init()
+{
+  // statt im Haus landet man im Hauptraum Raum 0, sollte ansich nicht passieren
+  // da man nomalerweise nicht ins Haus sondern direkt in den Hauptraum gemoved wird
+  if (environment(this_player()) == this_object()) {
+    this_player()->move(RAUMNAME(owner,0), M_GO | M_NO_SHOW | M_SILENT);
+    return;
+  }
+  ::init();
+}
+
+// Extra fuer Boing! ;)
+// Setzt man P_SHORT des Hauses auf 0, so verschwindet es zwar aus
+// der Beschreibung des Raumes, ist aber immer noch ansprechbar!
+string short()
+{
+  string ret;
+
+  ret = ::short();
+  if (previous_object() != environment() && !ret)
+    ret ="";
+
+  return ret;
+}
+
+// Zustand der Haustuer und evtl. Notiz mit einbauen.
+varargs string long(int mode)
+{
+  string ret, door;
+
+  door = haustuer::long(mode);
+
+  ret = QueryProp(P_LONG)+door;
+  if (text) {
+    ret += break_string( "An "+name(WEM,1)+" befindet sich eine Notiz: '"+text+"'.", 75);
+  }
+  return break_string(ret, 75);
+}
+
+// Setze neuen Besitzer fuer dieses Haus
+// setzt Default-Short, -Long und Id fuer neuen Besitzer,
+// leitet Besitzer an Haustuer weiter und laedt den Hauptraum
+varargs string SetOwner(string o)
+{
+  SetProp(P_SHORT, "Das Haus von "+capitalize(o));
+  SetProp(P_LONG, "Das Haus von "+capitalize(o)+", es sieht sehr nach einem Rohbau aus.\n");
+  AddId( ({ "\n"+o+"haus", "haus von "+o }) );
+  haustuer::SetTuerOwner(o);
+  load_object(RAUMNAME(o,0));
+  return owner = o;
+}
+
+// liefert den Name des Haus-Besitzers
+string QueryOwner() { return owner; }
+
+private int tp_ownercheck()
+{
+  if(getuid(this_player()) != owner)
+  {
+    notify_fail( "Das ist nicht Dein Haus!\n" );
+    return 0;
+  }
+  return 1;
+}
+
+// Aktion zum Betreten
+static int betritt(string str)
+{
+  notify_fail("Was moechtest Du betreten?\n");
+
+  // Haus war nicht angesprochen
+  if (!str || !id(str))
+    return 0;
+
+  // Haustuer ist zu
+  if (Query(H_DOORSTAT) & D_CLOSED) {
+    printf("%s von %s ist zu.\n", capitalize(name(WER,1)), capitalize(owner));
+    return 1;
+  }
+  // bewege Spieler in Hauptraum
+  this_player()->move(RAUMNAME(owner,0), M_GO, 0, "betritt "+name(WEN,1), "kommt herein");
+  return 1;
+}
+
+// Aktion zum Setzen/Loeschen von Notizen am Haus
+static int
+merktext(string str)
+{
+  // darf der Spieler das, d.h. ist das sein Haus?
+  if(!tp_ownercheck())
+  {
+    notify_fail( "Du kannst keine Notiz an "+capitalize(name(WEM,1))+" von "+capitalize(owner)+" anbringen!\n" );
+    return 0;
+  }
+
+  str = this_player()->_unparsed_args();
+
+  // kein Text => Notiz loeschen, ansonsten => Text als Notiz setzen
+  if (!str || str == "") {
+    write( "OK, Notiz ist geloescht.\n" );
+    text = 0;
+  }
+  else {
+    write( "OK, Notiz lautet '"+str+"'\n");
+    text = str;
+  }
+
+  return 1;
+}
+
+// Aktion Anklopfen am Haus
+static int
+klopfen(string str)
+{
+  int i;
+  object room;
+
+  notify_fail( "Syntax: klopfe an <haus> an\n" );
+  // parsen von klopfe an <haus> an
+  if (!str || sscanf(str, "an %s an", str) != 1)
+    return 0;
+
+  if (str == "tuer" || str == "haustuer" || id(str)) {
+    // Meldungen an Spieler und Raum
+    printf( "Du klopfst an "+name(WEM,1)+" von "+capitalize(owner)+" an.\n");
+    say( capitalize(this_player()->name(WER))+" klopft an "+name(WEM,1)+" von "+capitalize(owner)+" an.\n" );
+    // in allen geladenen Raeumen Klopfen melden
+    for (i=VERWALTER->HausProp(owner,HP_ROOMS); i>=0; i--) {
+      if (room = find_object(RAUMNAME(owner,i)))
+	tell_room(room, "Du hoerst, wie jemand an der Haustuer anklopft.\n" );
+    }
+    return 1;
+  }
+  return 0;
+}
+
+// Aktion Tuer/Haus beschreiben
+static int
+beschreiben(string str)
+{
+  string *p, *ds;
+
+  // darf der Spieler das, d.h. ist das sein Haus?
+  if (!tp_ownercheck())
+    return 0;
+
+  notify_fail( "Hier draussen funktioniert nur 'beschreibe <haus> lang',\n"
+	      +"'beschreibe haustuer' oder 'beschreibe tuerzustand'!\n");
+
+  // zu wenig Eingabe zum Parsen
+  if (!str || str == "")
+    return 0;
+
+  p = old_explode(str," ");
+
+  if (p[0] == "tuer" || p[0] == "haustuer") {
+    // beschreibe (haus)tuer
+    write( "Beschreibung der Haustuer angeben. Es ist nur eine Zeile moeglich.\n"
+	  +"Als Platzhalter fuer den Zustand der Tuer dient %s. Falls die Tuer\n"
+	  +"nicht in der Langebschreibung des Hauses auftauchen soll, bitte ein-\n"
+	  +"fach nur <RETURN> druecken.\n]" );
+    input_to("doorDesc");
+    return 1;
+  }
+  else if (p[0] == "tuerzustand") {
+    // beschreibe tuerzustand
+    ds = Query(H_DOORLSTAT);
+    write( "Beschreibung des Tuerzustandes angeben. Es ist nur eine Zeile moeg-\n"
+	  +"lich. Die Zustaende muessen durch Kommata getrennt in der Reihen-\n"
+	  +"folge 'offen', 'geschlossen', 'abgeschlossen' angegeben werden.\n"
+	  +"Momentaner Zustand:\n");
+    printf("'%s', '%s', '%s'.\n", ds[0], ds[1], ds[3]);
+    write( "(Abbruch: Einfach <RETURN> druecken!)\n]");
+    input_to("doorLDesc");
+    return 1;
+  }
+  else if (p[<1] == "lang" && id(implode(p[0..<2]," "))) {
+    object home = load_object(RAUMNAME(owner,0));
+    // beschreibe <haus> lang
+    home->beschreiben("haus lang", AUSSEN);
+    return 1;
+  }
+  // Eingabe Syntax nicht passend => notify_fail von oben
+  return 0;
+}
+
+// Aktion Haus Aendern
+static int
+aendern(string str)
+{
+  string *p, *ds;
+
+  // Darf der Spieler das, d.h. ist das sein Haus?
+  if (!tp_ownercheck())
+    return 0;
+
+  notify_fail( "Hier draussen funktioniert nur 'aendere <haus> lang'!\n");
+  // zu wenig Eingabe zum Parsen
+  if (!str || str == "")
+    return 0;
+
+  p = old_explode(str," ");
+
+  if (p[<1] == "lang" && id(implode(p[0..<2]," "))) {
+    object home = load_object(RAUMNAME(owner,0));
+    // aendere <haus> lang
+    home->aendern("haus lang", AUSSEN);
+    return 1;
+  }
+  // Eingabe Syntax nicht passend => notify_fail von oben
+  return 0; 
+}
+
+// input_to zu beschreibe (haus)tuer
+static void doorDesc(string str)
+{
+  if (!str)
+    str = "";
+  if (sizeof(str))
+    str += "\n";
+
+  Set(H_DOOR, str);
+  Save();
+
+  if (str == "")
+    write("OK, Haustuer wurde geloescht.\n");
+  else
+    write("OK, Beschreibung der Haustuer wurde gesetzt.\n");
+}
+
+// input_to zu beschreibe tuerzustand
+static void doorLDesc(string str)
+{
+  string *s;
+
+  if (!str || sizeof(s=old_explode(str, ","))!=3) {
+    write("ABBRUCH!\nNichts geaendert!\n");
+    return;
+  }
+  Set(H_DOORLSTAT, ({ s[0], s[1], 0, s[2] }));
+  printf("OK, Tuerzustaende sehen wie folgt aus:\n'%s', '%s', '%s'.\n",
+	 s[0], s[1], s[2]);
+  Save();
+}
+
+int SmartLog(string ofile, string typ, string msg, string date)
+{
+  object home;
+  string foo, bar;
+  
+  string hn=RAUMNAME(owner,0);
+
+  write_file(REPFILE(owner), sprintf("%s von %s vor dem Haus (%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, vor dem Haus (%s):\n"
+		     +"Bitte zur Kenntnis nehmen! (Mit dem Befehl 'meldungen')  -Wargon\n",
+		     capitalize(getuid(this_player())),
+		     date));
+  }
+
+  home = load_object(hn);
+  home->Set(H_REPORT, home->Query(H_REPORT)+1);
+  home->Save();
+
+  return 1;
+}
+
+
