diff --git a/d/seher/haeuser/virtual_compiler.c b/d/seher/haeuser/virtual_compiler.c
new file mode 100644
index 0000000..d5d1ab8
--- /dev/null
+++ b/d/seher/haeuser/virtual_compiler.c
@@ -0,0 +1,164 @@
+/** Letzte Aenderung:
+// 01.04.2008 - Objekte des VC werden jetzt im memory gespeichert
+//            - Kleinere Aenderungen im Code.
+// 01.01.2007 - Grundlegende Ueberarbeitung, Vanion
+//            - Verwaltung der Objekte in einer Liste
+//              Dadurch kann ls die VC-Objekte darstellen
+//            - Genauere Ueberpruefung der Dateinamen auf 
+//              Korrektheit. Falls ein illegaler Zugriff
+//              stattfindet, wirds geloggt.
+//
+*/
+
+#pragma strict_types
+#pragma no_clone
+#pragma no_shadow
+#pragma no_inherit
+#pragma verbose_errors
+#pragma combine_strings
+#pragma pedantic
+#pragma warn_deprecated
+
+#include "haus.h"
+#include <thing/properties.h>
+#include <wizlevels.h>
+
+#define MEMORY "/secure/memory"
+
+private nosave mapping objects;
+private nosave int show_clone_list;
+
+/**
+ Initialisierung
+*/
+void create()
+{
+  seteuid(getuid());
+
+  // Zeiger auf Cloneliste holen
+  if (call_other(MEMORY,"HaveRights")) {
+    // Objektpointer laden
+    objects = (mixed) call_other(MEMORY,"Load","objects");
+
+    // Hats geklappt?
+    if (!mappingp(objects)) 
+    // vermutlich noch nicht initialisiert.
+    // Zeiger erzeugen
+    objects = ([]); 
+    call_other(MEMORY,"Save","objects",objects); // Und in den Memory schreiben
+  } else {
+    // Wenn ich keinen Zeiger habe, muss ich halt einen lokalen nehmen.
+
+    objects = ([]);
+  }
+
+  show_clone_list = 0; 
+}
+
+/**
+ Die Funktion wird vom GameDriver aufgerufen. Wenn die Namen-
+ konventionen passen, erzeugt compile_object ein passendes Objekt
+ und gibt es zurueck
+ \param name Name des zu ladenden Objekts
+ \return Das geladene und initialisierte Objekt
+*/
+object compile_object(string name)
+{
+  object ob;
+
+  if (name[<6..<3] == "haus" )
+  {
+    ob = (object) (VERWALTER)->_LadeHaus(name[0..<7]);
+  }
+  else if (name[<7..<4] == "raum" )
+  {
+    ob = (object) (VERWALTER)->_LadeRaum(name[0..<8], to_int(name[<3..<3]));
+  } 
+  else 
+  {
+    log_file("seher/haeuser/vc_load_error", 
+      dtime(time())+"\n Falscher Objektname: "+name+"\n"+
+  	         " PO:  "+object_name(previous_object(1))+",\n"+
+  	         " PPO: "+object_name(previous_object(2))+",\n"+
+  	         " TI:  "+object_name(this_interactive())+".\n\n");
+  	return 0;
+  }
+  
+  // Objekt speichern (fuer ls)
+  if (objectp(ob)) objects[name] = ob;
+
+  return ob;
+}
+
+/**
+  Soll die Liste der Objekte zum VC per QueryObjects ausgegeben werden oder nicht?
+*/
+  
+int ToggleCloneList()
+{
+  show_clone_list ^= 1;
+  tell_object(this_player(), "Die Clone List wird nun "+
+        (show_clone_list?"":"nicht mehr ")+"angezeigt.\n");
+}
+
+/**
+ return all cloned virtual objects, wird zum Beispiel fuer "ls" benutzt.
+*/
+mixed QueryObjects()
+{
+  if (show_clone_list)
+    return m_values(objects)-({0});
+  else 
+    return ({});
+}
+
+/**
+  Nur EM und Maintainer duerfen die sicheren Funktionen nutzen
+*/
+int secure()
+{
+	if (ARCH_SECURITY || IS_MAINTAINER(this_interactive())) 
+	  return 1;
+	else  
+	  return 0;
+}
+
+/*
+/**
+ Die Funktion versucht, die Clones dieses VCs aus der Objekt List 
+ zu regenerieren
+*/
+/*
+int regenerate_clone_list()
+{
+	if (sizeof(objects)==0)
+	HDEBUG("Tbd: regenerate_clone_list im vc");
+	
+	return 1;
+}
+*/
+
+/**
+  Die Funktion zerstoert alle bereits geclonten Seherhausobjekte
+  Das gibt wirklich nur irre wenige Momente, wo das nicht schlecht ist.
+*/
+int desctruct_all_my_clones()
+{
+  mixed ob;
+
+  if (!secure()) return 0;
+
+  if(!mappingp(objects)) return 0;
+  
+  for(ob = QueryObjects(); sizeof(ob); ob = ob[1..])
+  {
+    if(objectp(ob[0]))
+    {
+      ob[0]->remove();
+      if(objectp(ob[0])) destruct(ob[0]);
+    }
+  }
+   
+  return 1;
+}
+
