diff --git a/std/virtual/v_compiler.c b/std/virtual/v_compiler.c
new file mode 100644
index 0000000..80eb370
--- /dev/null
+++ b/std/virtual/v_compiler.c
@@ -0,0 +1,165 @@
+// MorgenGrauen MUDlib
+//
+// virtual/v_compiler.c -- a general virtual compiler object
+//
+// $Id: v_compiler.c 9142 2015-02-04 22:17:29Z Zesstra $
+
+// principle:
+//  - inherit this object into your own 'virtual_compiler.c'
+//  - customize Validate() and CustomizeObject() for you own sake
+//  
+//  * Validate() checks if a room filename given as argument (without path)
+//    is valid and returns this filename with stripped '.c'!!
+//  * CustomizeObject() uses the previous_object()->Function() strategy to
+//    customize the standard object (for example to set a description)
+//
+// Properties: P_STD_OBJECT, P_COMPILER_PATH
+
+#pragma strict_types
+#pragma save_types
+#pragma range_check
+#pragma no_clone
+#pragma pedantic
+
+inherit "/std/thing/properties";
+
+//#define NEED_PROTOTYPES
+
+#include <thing/properties.h>
+#include <defines.h>
+#include <v_compiler.h>
+#include <exploration.h>
+#include <sys_debug.h>
+#include <living/description.h> //fuer P_PARA
+
+// Der VC braucht das 'alte' object_name()-basierte BLUE_NAME, da sonst das
+// Konfigurieren der von einem VC-Objekt geclonten Clones via
+// CustomizeObject() nicht funktioniert (load_name() ermittelt den Namen des
+// VC-Standardobjektes)
+#ifdef BLUE_NAME
+#undef BLUE_NAME
+#endif
+#define BLUE_NAME(ob) (explode(object_name(ob),"#")[0])
+
+private nosave string last_loaded_file;
+private nosave mapping objects;
+
+void create()
+{
+  ::create();
+  seteuid(getuid());
+  SetProp(P_STD_OBJECT, "/std/room");
+  SetProp(P_COMPILER_PATH, sprintf("/%s/",
+        implode(old_explode(object_name(this_object()), "/")[0..<2], "/")));
+  SetProp(P_PARA, ({}) ); // keine Para-VC-Objekte
+  objects = ([]);
+}
+
+// von den erbenen VCs zu ueberschreiben...
+// TODO: aus Standardobjekt entfernen, weil durch P_PARA und QueryValidObject
+// obsolet. 
+int NoParaObjects() { return 0; }
+
+string Validate(string file)
+{
+  if(!file) return 0;
+  if(file[<2..] == ".c") file = file[0..<3];
+  EPMASTER->PrepareVCQuery(file);
+  return file;
+}
+
+// Die Funktion bekommt einen Objektnamen uebergeben und muss entscheiden, ob
+// dieser VC dafuer zustaendig ist, das Objekt zu generieren. Jeder Wert != 0
+// zaehlt als 'zustaendig'. Es ist eine Art generalisiertem Validate(). Fuer
+// maximale Nuetzlichkeit muss diese Funktion von den erbenden VCs
+// ueberschrieben werden.
+public int QueryValidObject(string oname) {
+    string fname, path, *pelem;
+    int para;
+    mixed ppara;
+
+    //erstmal Validate fragen
+    pelem=explode(oname,"/");
+    fname=pelem[<1];
+    if (!fname=Validate(fname))
+        return(0); //nicht zustaendig
+    // nicht im richtigen Pfad?
+    path=sprintf("%s/",implode(pelem[0..<2],"/"));
+    if (path!=QueryProp(P_COMPILER_PATH))
+        return(0);
+    // Para-Objekt?
+    if (sscanf(fname,"%s^%d",fname,para) > 1) {
+        if (NoParaObjects())
+            return(0); //direkt zurueck, keine Para-Objekte
+        // bestimmte Para-Dimensionen explizit erlaubt? (Wenn P_PARA nicht
+        // gesetzt ist, sind alle erlaubt!)
+        if (ppara=QueryProp(P_PARA)) {
+            if (pointerp(ppara) && member(ppara,para)!=-1)
+                return(1);
+            else if (intp(para) && ppara==para)
+                return(1);
+            // P_PARA gesetzt, aber gewuenschtes Para nicht enthalten...
+            else return(0);
+        }
+    }
+    return(1); //fall-through, offenbar zustaendig.
+}
+
+mixed CustomizeObject()
+{
+  string file;
+
+  if(!clonep(previous_object()))
+    return Validate(explode(BLUE_NAME(previous_object()), "/")[<1]);
+  if(stringp(last_loaded_file)) file = last_loaded_file;
+  else file = Validate(explode(BLUE_NAME(previous_object()), "/")[<1]);
+  if(!file) return 0;
+  last_loaded_file = 0;
+  return file;
+}
+
+// add a new object to the object list if it compiles
+private mixed AddObject(string file)
+{
+  object ob;
+  string err;
+
+  // clean up the object list
+  objects = filter_indices(objects, function int (string f) {
+      return (objectp(objects[f])); } );
+
+  last_loaded_file = file;
+  // register new object
+  if(ob = clone_object(QueryProp(P_STD_OBJECT)))
+    objects[file] = ob;
+  return ob;
+}
+
+// try to create an object for the wanted file
+mixed compile_object(string file)
+{
+  // validate if the file name is a correct one
+  if(file = Validate(file))
+    return AddObject(file);
+  return 0;
+}  
+
+// return all cloned virtual objects
+mixed QueryObjects()
+{
+  return m_values(objects)-({0});
+}
+
+// clean up rooms that have not been destructed yet
+int remove() {
+
+  if(!mappingp(objects)) return 0;
+
+  //for(ob = QueryObjects(); sizeof(ob); ob = ob[1..])
+  foreach(object ob: QueryObjects()) {
+      ob->remove();
+      if(objectp(ob)) destruct(ob);
+  }
+  return 1;
+}
+
