diff --git a/d/seher/haeuser/tools/haustool.c b/d/seher/haeuser/tools/haustool.c
new file mode 100644
index 0000000..50f6e1e
--- /dev/null
+++ b/d/seher/haeuser/tools/haustool.c
@@ -0,0 +1,182 @@
+#include "../haus.h"
+#include <properties.h>
+#include <moving.h>
+#include <wizlevels.h>
+
+inherit "std/secure_thing";
+
+private int secure()
+{
+  return (this_interactive() && (IS_ARCH(this_interactive()) ||
+				 getuid(this_interactive()) == "wurzel"));
+}
+
+create()
+{
+  if (!clonep(this_object())) return;
+  ::create();
+
+  SetProp(P_SHORT, "Ein Adressverzeichnis" );
+  SetProp(P_LONG,
+     "Mit diesem Adressverzeichnis koennen die richtigen Leute Ordnung in den\n"
+    +"Wust der Seherhausangelegenheiten bringen.\n"
+    +"Die richtigen Leute?\n"
+    +"Ja: Man muss schon Erzmagier sein oder Wurzel heissen! ;)\n"
+    +"Du kannst es uebrigens lesen!\n" );
+  SetProp(P_NAME, "Adressverzeichnis");
+  SetProp(P_READ_MSG,
+     "Es stehen folgende Befehle zur Verfuegung:\n"
+    +"checked <name> [+/-] <nr>\n"
+    +"rep\n"
+    +"mkmail <name>\n"
+    );
+  SetProp(P_GENDER, NEUTER);
+  SetProp(P_WEIGHT, 100);
+  SetProp(P_AUTOLOADOBJ, 1);
+  SetProp(P_NEVERDROP, 1);
+  SetProp(P_NODROP, 1);
+
+  AddId( ({ "verzeichnis", "adressverzeichnis", "haustool" }) );
+
+  AddCmd("checked", "checked");
+  AddCmd("rep", "report");
+  AddCmd("mkmail", "mkmail");
+}
+
+#define CHECKED PATH+"log/CHECKED"
+static int
+checked(string str)
+{
+  mapping drin;
+  string name, *lines, *ind, pm;
+  int nr, i;
+  closure hp;
+
+  if (!secure())
+    return 0;
+
+  notify_fail("Syntax: checked <name> [+/-] <nr>\n" );
+  if (!str || str == "")
+    return 0;
+
+  if (file_size(CHECKED) > 0)
+    lines = explode(read_file(CHECKED), "\n") - ({""});
+  else
+    lines = ({});
+
+  for (drin = ([]), i=sizeof(lines)-1; i>=0; i--) {
+    if (sscanf(lines[i], "%s%t%d", name, nr) == 2)
+      drin += ([ name : nr-1 ]);
+  }
+  lines = ({ });
+  pm = "";
+  hp = symbol_function("HausProp", VERWALTER);
+
+  if (sscanf(str, "%s %d", name, nr)==2 || sscanf(str, "%s %s %d", name, pm, nr) == 3) {
+    if (!funcall(hp, name, HP_ENV)) {
+      write(capitalize(name)+" hat gar kein Haus!\n");
+      return 1;
+    }
+    if (nr < 0) {
+      write("Zum Abziehen nimm bitte 'checked <name> - <nr>'!\n");
+      return 1;
+    }
+    if (member(drin, name))
+      i = drin[name];
+    switch(pm) {
+      case "+":
+	if (i+nr > funcall(hp, name, HP_ROOMS)) {
+	  printf("%d Raeume? Wie soll das gehen?\n", i+nr);
+	  return 1;
+	}
+	drin[name] += nr;
+	break;
+      case "-":
+	if (i-nr < 0) {
+	  write("Soviele Raeume kannst Du "+capitalize(name)+" gar nicht abziehen...\n");
+	  return 1;
+	}
+	drin[name] -= nr;
+	break;
+      default:
+	if (nr > funcall(hp, name, HP_ROOMS)) {
+	  printf("%s nat keine %d Raeume!\n",capitalize(name),nr);
+	  return 1;
+	}
+	drin[name] = nr;
+    }
+    rm(CHECKED);
+    for (i=sizeof(ind=sort_array(m_indices(drin),#'<))-1; i>=0; i--)
+      write_file(CHECKED, sprintf("%s %d\n",ind[i], 1+drin[ind[i]]));
+    return 1;
+  }
+  else
+    return 0;
+}
+
+static int
+report()
+{
+  string *rep, *head, name;
+  int i, lp, nr;
+
+  if (file_size("/log/report/wurzel.rep")<=0) {
+    write("Kein wurzel.rep (Jippieh! ;)\n");
+    return 1;
+  }
+
+  rep = old_explode(read_file("/log/report/wurzel.rep"),"\n");
+  lp = sizeof(PATH)-1;
+
+  for (i=sizeof(rep)-2; i>=0; i-=2) {
+    head = old_explode(rep[i], " ");
+    if (head[4][0..lp] == PATH) {
+      name = old_explode(head[4],"/")[<1];
+      nr = to_int(name[<1..<1]);
+      name = name[0..<6];
+      head[2] = capitalize(head[2]);
+      write_file(PATH+"rep/"+name,
+		 sprintf("%s in Raum %d:\n%s\n",
+			 implode(head[0..2]," "),nr,rep[i+1]));
+    }
+    else
+      write_file(PATH+"rep/wurzel.rep",sprintf("%s\n%s\n", rep[i], rep[i+1]));
+  }
+  return 1;
+}
+
+static int
+mkmail(string str)
+{
+  string f,fm;
+
+  if (!str || str == "") {
+    notify_fail( "Syntax: mkmail <name>\n");
+    return 0;
+  }
+
+  if (!(f=(VERWALTER)->HausProp(str, HP_ENV))) {
+    printf("%s hat kein Haus!\n", str);
+    return 1;
+  }
+  fm = PATH+str+".mail";
+
+  write_file(fm, "\
+  Huhu!\n\
+\n\
+Da Du Magier bist, brauchst Du auch kein Seherhaus mehr. Damit Deine\n\
+Beschreibungen aber nicht verloren sind, findest Du die Files Deines\n\
+Hauses in /players/"+str+"/seherhaus/.\n\
+\n\
+Soll Dein Haus weiterhin an der jetzigen Stelle stehen bleiben\n\
+("+f+"),\n\
+so klaere das bitte mit dem dort zustaendigen Magier sowie den zustaen-\n\
+digen Regionsmagiern (weil es sich jetzt um den Anschluss von Files an\n\
+ein Gebiet handelt).\n\
+\n\
+!! Das Haus wird auf jeden Fall nach Ende der Haussperre abgerissen !!\n\
+\n\
+  Wargon.\n");
+
+  return 1;
+}
