diff --git a/d/seher/haeuser/bausparvertrag.c b/d/seher/haeuser/bausparvertrag.c
new file mode 100644
index 0000000..44d9976
--- /dev/null
+++ b/d/seher/haeuser/bausparvertrag.c
@@ -0,0 +1,155 @@
+/*
+ *  bausparvertrag.c -- Wir geben unsern Sehern ein Zuhause...
+ *
+ *  Grundversion von Jof, weiterbearbeitet von Wargon.
+ *
+ * $Date: 1994/12/17 15:56:11 $
+ * $Revision: 1.4 $
+ * $Log: bausparvertrag.c,v $
+ * Revision 1.4  1994/12/17  15:56:11  Wargon
+ * Etwas mehr Sicherheit gegen Zugriffe von aussen.
+ *
+ * Revision 1.3  1994/10/21  09:52:03  Wargon
+ * zerreissen eingebaut.
+ *
+ * Revision 1.2  1994/10/09  21:00:59  Wargon
+ * Laufzeit etc. ausgebaut, da das ueber den Block abgewickelt
+ * wird.
+ * Funktion Einzahlung() eingebaut (wird von der Bank aufgerufen).
+ *
+ * Revision 1.1  1994/10/09  20:49:28  Wargon
+ * Initial revision
+ *
+ */
+#pragma strong_types,rtt_checks
+
+#include "haus.h"
+#include <properties.h>
+#include <moving.h>
+
+inherit "/std/thing";
+
+protected void create()
+{
+  if (!clonep(this_object())) return;
+  ::create();
+  SetProp(P_SHORT,"Ein Bausparvertrag");
+  SetProp(P_NAME,"Bausparvertrag");
+  Set(P_AUTOLOADOBJ, ({0, V_EP}) );
+  Set(P_AUTOLOADOBJ, SECURED, F_MODE); // Sicher ist sicher...
+  SetProp(P_NODROP,1);
+  SetProp(P_NEVERDROP,1);
+  SetProp(P_ARTICLE,1);
+  SetProp(P_WEIGHT, 0);
+  SetProp(P_GENDER,1);
+  AddId( ({"bausparvertrag", "vertrag", "sehe\rvertrag"}) );
+  AddCmd("lies","lesen");
+  AddCmd( ({ "unterschreibe", "unterschreib" }), lambda( ({}),
+    ({#',, ({#'notify_fail, "Hier kannst Du den Vertrag nicht unterschreiben!\n" }),
+	   ({#'return, 0})
+    }) ) );
+  AddCmd( ({ "zerreiss", "zerreisse" }), lambda( ({ 'str }),
+    ({#',, ({#'notify_fail, "Was willst Du zerreissen?\n"}),
+	   ({#'?!, ({#'id, 'str}), ({#'return, 0}) }),
+	   ({#'=, 'blk, ({#'present, "\n block", ({#'this_player}) }) }),
+	   ({#'write, "Du zerreisst Deinen Vertrag.\n"}),
+	   ({#'write_file, PATH+"log/BANK.LOG", ({#'sprintf, "%s - Vertrag: %s zerriss ihn.\n",
+	       ({#'dtime, ({#'time}) }), ({#'getuid, ({#'this_player})})})}),
+	   ({#'?, 'blk, ({#'call_other, 'blk, "remove", 1}) }),
+	   ({#'remove, 1}),
+	   ({#'return, 1})
+    }) ) );
+}
+
+string _query_long()
+{
+  int max;
+
+  max = (Query(P_AUTOLOADOBJ)[1] & V_FAST) ? SUMME_S : SUMME_L;
+  if (Query(P_AUTOLOADOBJ)[1] & V_RAUM)
+    max = max * 4/10;
+  return sprintf(
+      "Dies ist ein Bausparvertrag. Du hast bisher %d (von %d) Punkten eingezahlt.\n",
+      QueryProp(P_AUTOLOADOBJ)[0], max);
+}
+
+#if 0
+int query_prevent_shadow(object ob)
+{
+  HLOG("SHADOW", sprintf("%s, von %O im Vertrag.\n", dtime(time())[5..], ob));
+  return 1;
+}
+#endif
+
+int lesen(string str)
+{
+  if (id(str))
+  {
+    if (Query(P_AUTOLOADOBJ)[1] & V_RAUM)
+      this_player()->More(PATH+"txt/vertrag_raum.txt",1);
+    else
+      this_player()->More(PATH+"txt/vertrag.txt",1);
+    return 1;
+  }
+  return 0;
+}
+
+int Einzahlung()
+{
+  int *al;
+  object env, po;
+
+  if (old_explode(object_name(po=previous_object()),"#")[0] != PATH+"sb_einzahlung") {
+    env = environment();
+    HLOG( (env ? getuid(env) : "BANK.LOG"), sprintf("Vertrag: Einzahlung von aussen! TI = %O, PO = %O\n", this_interactive(), previous_object()));
+  }
+  al = Query(P_AUTOLOADOBJ);
+  return Set(P_AUTOLOADOBJ, ({ al[0]+RATENHOEHE, al[1] }) )[0];
+}
+
+void Sign(int flag)
+{
+  Set(P_AUTOLOADOBJ, ({ Query(P_AUTOLOADOBJ)[0], flag }) );
+}
+
+public int move(mixed dest, int meth)
+{
+  object penv;
+  int ret;
+
+  penv = environment();
+  ret = ::move(dest, meth);
+
+  if (ret == 1 && (penv || (object_name(previous_object()) != PATH+"sb_antrag" &&
+			    object_name(previous_object()) != (stringp(dest) ? dest : object_name(dest)))))
+    HLOG("MOVING", sprintf("Vertrag: von %O -> %O mit %O (%O)\n", environment(), dest, previous_object(), getuid(previous_object())));
+  return ret;
+}
+
+mixed _set_autoloadobj(mixed al)
+{
+  // Loggen, wenn nicht vom Spielerobjekt selber via den
+  // Autoloader-Mechanismus gesetzt.
+  if (previous_object(1)
+      && strstr(load_name(previous_object(1)),"/std/shells") != 0)
+    HLOG("SET_AL",sprintf("Vertrag: TP = %O, PO = %O, ENV = %O\n",
+          this_player(), previous_object(), environment()));
+
+  /* Kompatibilitaet zu alten Vertraegen */
+  if (pointerp(al) && !(al[1] & V_EP)) {
+    al[0] *= 4;
+    al[1] |= V_EP;
+    call_out("notifyChange", 0, this_player());
+  }
+  return Set(P_AUTOLOADOBJ, al);
+}
+
+void notifyChange(object wem)
+{
+  tell_object(wem,
+       "\nNACHRICHT VON DER SEHERBANK:\n"
+      +"Die Vertragsmodalitaeten haben sich geaendert! Bitte lesen Sie den\n"
+      +"Vertrag noch einmal genau durch (insbes. Art. 4)!\n"
+      +"Statt Geld haben Sie jetzt Erfahrungspunkte zu zahlen!\n\n" );
+}
+
