diff --git a/d/seher/haeuser/traghaus.c b/d/seher/haeuser/traghaus.c
new file mode 100644
index 0000000..f79fb36
--- /dev/null
+++ b/d/seher/haeuser/traghaus.c
@@ -0,0 +1,187 @@
+/*
+ * traghaus.c -- Wie suess! ;)
+ *
+ * (c) 1994 Boing@MorgenGrauen
+ * Be- und ueberarbeitet von Jof und Wargon.
+ *
+ * HINWEIS: Um einen Bauplatz zu kennzeichnen, muss dort die
+ *  Propertie "haus_erlaubt" auf 1 gesetzt werden!
+ *
+ * 17.11.2003 Feigling - Bugfix: Fehlenden Regionsmagier abgefangen
+ *
+ * $Date: 1994/10/24 08:25:18 $
+ * $Revision: 1.5 $
+ * $Log: traghaus.c,v $
+ * Revision 1.5  1994/10/24  08:25:18  Wargon
+ * Macht jetzt Gebrauch von VERWALTER->Unbebaubar() und dem geaenderten
+ * VERWALTER->NeuesHaus().
+ *
+ * Revision 1.4  1994/10/19  10:03:29  Wargon
+ * Hinweis eingebaut (s.o.)
+ * Beschraenkung auf ein Seherhaus pro Raum rausgenommen.
+ *
+ * Revision 1.3  1994/10/09  20:17:03  Wargon
+ * In blas() haus->Save() eingefuegt.
+ *
+ * Revision 1.2  1994/10/07  22:13:17  Wargon
+ * Etwas aufgeraeumt.
+ * Text beim Giessen geaendert.
+ * Falls in dem Raum schon ein Seherhaus steht, kann kein weiteres mehr
+ * aufgestellt werden.
+ *
+ * Revision 1.1  1994/10/07  14:40:54  Wargon
+ * Initial revision
+ *
+ */
+#include <properties.h>
+#include <moving.h>
+#include "haus.h"
+
+inherit "std/thing";
+
+static string owner;
+
+void create()
+{
+   if (!clonep(this_object())) return;
+   ::create();
+   owner = getuid(this_player());
+   SetProp(P_SHORT, "Ein tragbares Instanthaus");
+   SetProp(P_LONG, "Dies ist Dein Haus. Du kannst es abstellen und giessen, dann wird daraus ein\n\
+richtiges Seherhaus, in das Du sofort einziehen kannst. Es ist allerdings\n\
+noetig, dass der Magier, der den Raum erschaffen hat, in dem Du es abstellen\n\
+moechtest, dem Bau eines Seherhauses in diesem Raum zustimmt.\n");
+   SetProp(P_NAME, "Haus");
+   SetProp(P_NEVERDROP, 1);
+   SetProp(P_GENDER, 0);
+   AddId(({"haus", "sehe\rhaus"}));
+   SetProp(P_VALUE, 0);
+   SetProp(P_WEIGHT, 0);
+   AddCmd(({"gies", "giess", "giesse"}), "blas");
+}
+
+string SetOwner(string o)
+{
+   return owner = o;
+}
+
+string QueryOwner()
+{
+  return owner;
+}
+
+string get_mag(mixed dest)
+{
+  mapping reg;
+  string *mag;
+  string ret;
+  int i, j;
+
+  catch(reg = "/obj/mliste"->QueryProp("Magierliste"));
+
+  if (mappingp(reg) && member(reg, getuid(dest)))
+    mag = reg[getuid(dest)];
+  else
+    return capitalize(getuid(dest));
+
+
+  if (!sizeof(mag)) 
+    return capitalize(getuid(dest)); //Hinzugefuegt Feigling
+  
+  if ((i=sizeof(mag)) == 1)
+    return capitalize(mag[0]);
+  else {
+    ret = capitalize(mag[0]);
+    j = 1;
+    while (j < i-1) {
+      ret += ", "+capitalize(mag[j]);
+      j++;
+    }
+    ret += " und "+capitalize(mag[<1]);
+  }
+  return ret;
+}
+
+int move(mixed dest, int method)
+{
+  int nix;
+
+  if ((method & M_GIVE) == M_GIVE)
+  {
+    write("Dein sauer verdientes Seherhaus weggeben? NIEMALS!\n");
+    return 0;
+  }
+  if ((method & M_PUT) == M_PUT)
+  {
+    if ((nix = VERWALTER->Unbebaubar(dest)))
+    {
+      write( ({ "Hier ist das Bauen von Haeusern untersagt!\n",
+		"Du kannst das Haus nicht in geschlossenen Raeumen abstellen.\n",
+		"Dieser Platz ist nicht als Bauplatz gekennzeichnet, Du solltest mal\nmit dem verantwortlichen Magier reden. Die Zustaendigkeit fuer diesen Ort\nliegt bei "+get_mag(dest)+".\n"
+	     })[nix-1]);
+      return 0;
+    }
+    return ::move(dest, method);
+  }
+  if ((method & M_GET) == M_GET)
+  {
+    if (getuid(this_player())!=owner)
+    {
+      write("Dies ist nicht Dein Haus.\n");
+      return 0;
+    }
+  }
+  return ::move(dest, method);
+}
+
+int blas(string str)
+{
+  object haus;
+
+  notify_fail("Was moechtest Du giessen?\n");
+  if (!str || str!="haus")
+    return 0;
+  if (living(environment()))
+  {
+    write("Du solltest das Haus vielleicht erst mal abstellen.\n");
+    return 1;
+  }
+  if (getuid(this_player())!=owner)
+  {
+    write("Machst Du immer fremde Haeuser nass?\n");
+    return 1;
+  }
+  if (!environment()->QueryProp(P_HAUS_ERLAUBT))
+  {
+    write("Dieser Platz ist nicht als Bauplatz gekennzeichnet, Du solltest mal\n\
+mit dem entsprechenden Magier reden.\nFrag mal "+capitalize(getuid(environment()))+".\n");
+    return 0;
+  }
+  write( "Voller Vorfreude greifst Du nach Deiner Giesskanne und beginnst, Dein mueh-\n\
+sam erspartes Instanthaus zu begiessen. Moment... Giesskanne? Reichlich ver-\n\
+dutzt schaust Du auf die kleine gruene Kanne in Deinen Haenden. Wo mag sie\n\
+nur hergekommen sein? Doch kaum erreichen die ersten Tropfen das Instanthaus,\n\
+wird Deine Aufmerksamkeit auch schon wieder von der Kanne abgelenkt:\n\
+Das Trockenhaus beginnt zu schaeumen und sich ueber den Boden auszubreiten.\n\
+In dem Schaum entstehen und vergehen Waende, Decken und Fenster, als ob sie\n\
+sich noch nicht recht entscheiden koennten, wie sich sich zu einem Ganzen zu-\n\
+sammenfuegen sollen.\n\
+Dann erhebt sich dort, wo Du das Trockenhaus abgestellt hattest, eine grosse,\n\
+schaumige Blase! Sie wird groesser und groesser, bis sie Dich schliesslich\n\
+streift. Dabei platzt sie mit einem leisen *PLOPP* - und es bleibt ein be-\n\
+zugsfertiges Seherhaus zurueck!\n\
+Du wirfst noch einmal einen verstohlenen Blick auf die Giesskanne, musst aber\n\
+feststellen, dass sie verschwunden ist und auch verschwunden bleibt.\n" );
+
+  say(capitalize((string)(this_player()->name()))+" verwandelt mit einem Tropfen Wasser "+
+      this_player()->QueryPossPronoun(this_object(), WEN) + " Haus.\n");
+
+  VERWALTER->NeuesHaus(owner, environment(this_object()));
+  remove();
+  return 1;
+}
+
+static string _query_autoloadobj()
+{
+  return owner;
+}
