diff --git a/std/room.c b/std/room.c
new file mode 100644
index 0000000..29ab503
--- /dev/null
+++ b/std/room.c
@@ -0,0 +1,239 @@
+// MorgenGrauen MUDlib
+//
+// room.c -- room base object
+//
+// $Id: room.c 9475 2016-02-19 21:16:17Z Zesstra $
+#pragma strong_types
+#pragma save_types
+#pragma range_check
+#pragma no_clone
+#pragma pedantic
+
+inherit "/std/thing/properties";
+inherit "/std/thing/language";
+inherit "/std/hook_provider";
+inherit "/std/room/light";
+inherit "/std/container/inventory";
+inherit "/std/room/moving";
+inherit "/std/room/restrictions";
+inherit "/std/room/description";
+inherit "/std/room/exits";
+inherit "/std/room/commands";
+inherit "/std/room/items";
+inherit "/std/room/doors";
+
+#include <thing/properties.h>
+#include <config.h>
+#include <properties.h>
+#include <rooms.h>
+#include <language.h>
+#include <wizlevels.h>
+#include <moving.h>
+#include <defines.h>
+#include <doorroom.h>
+#include <functionlist.h>
+
+void reset()
+{
+  items::reset();
+  exits::reset();
+  doors::reset();
+}
+
+static int
+_query_noget()
+{
+  return 1;
+}
+
+//#define DB(x) if (find_player("jof")) tell_object(find_player("jof"),x); else write(x)
+//#undef DB
+//#define DB(x)
+void maybe_replace_program()
+{
+  string *list, first;
+  object first_ob;
+
+// Debugkram auskommentiert, Zesstra, 04.11.06
+//  DB("MAYBE_REPLACE_PROGRAM\n");
+//  DB(sprintf("FILENAME: %O\n",object_name(this_object())));
+//  DB(sprintf("FIRST_OB: %O\n",inherit_list(this_object())));
+//  first_ob=find_object(first=(list=inherit_list(this_object()))[1]);
+//  DB(sprintf("%O ?= %O\n",sizeof(list),1+sizeof(inherit_list(first_ob))));
+//  DB(sprintf("%O ?= sizeof(%O)\n",1,list=functionlist(this_object(),RETURN_FUNCTION_NAME|NAME_INHERITED)));
+  if (object_name(this_object())=="/std/room" ||
+      !(first_ob=find_object(first=(list=inherit_list(this_object()))[1])) ||
+      (sizeof(list)!=1+sizeof(inherit_list(first_ob))) ||
+      (1!=sizeof(list=functionlist(this_object(),
+           RETURN_FUNCTION_NAME|NAME_INHERITED))) ||
+      list[0]!="create")
+    return;
+//  DB("REPLACING\n");
+  replace_program(first);
+}
+
+protected void create()
+{
+  maybe_replace_program();
+  /* Set effective userid to userid */
+  /* so that we may clone other things */
+  seteuid(getuid(this_object()));
+  properties::create();
+  restrictions::create();
+  commands::create();
+  light::create();
+  description::create();
+  exits::create();
+  items::create();
+  doors::create();
+
+  SetProp(P_NAME,0);
+  SetProp(P_NAME_ADJ,({}));
+  Set(P_SHORT,0);
+  Set(P_LONG,0);
+  Set(P_TRANSPARENT,0);
+  Set(P_ADJECTIVES,({}));
+  Set(P_IDS,({}));
+  Set(P_WEIGHT,PROTECTED,F_MODE);
+  Set(P_TOTAL_WEIGHT,PROTECTED,F_MODE);
+  Set(" clean counter ",2);
+}
+
+protected void create_super() {
+  set_next_reset(-1);
+}
+
+private int
+check_clean_count()
+{
+  int cc;
+
+  cc=Query(" clean counter ");
+  if (--cc<=0)
+    return 1;
+  Set(" clean counter ",cc);
+  return 0;
+}
+
+int
+clean_up(int arg)
+{
+  mixed itema;
+
+  if(arg>1) return 1; // better not ;)
+
+  if (Query(" never clean ")) return 0;
+
+  // if there are any item we have produced ourselfes check them
+  if(pointerp(itema = QueryProp(P_ITEMS)))
+  {
+    mixed names;
+    int i;
+    i = sizeof(names = all_inventory(this_object()));
+    while(i--)
+    {
+      if (query_once_interactive(names[i]))
+      {
+	Set(" clean counter ",2);
+	return 1;
+      }
+      if(objectp(names[i])) names[i] = explode(object_name(names[i]),"#")[0];
+    }
+
+    for(i = sizeof(itema)-1; i >= 0; i--)
+    {
+      // Semantik:
+      // 1. Wenn RITEM_OBJECT ein array ist, kann evtl ge'clean'ed werden.
+      // 2. Wenn es ein REFRESH_NONE Item ist und es entweder nicht mehr 
+      //    existiert oder nicht in diesem Raum ist, kein clean_up (es wuerde
+      //    beim neuladen des Raumes ja wieder erzeugt;
+      //    falls es aber hier ist, wird es mitvernichtet, dann ists ok)
+      // 3. Wenn es ein REFRESH_DESTRUCT ist und noch existiert, aber nicht
+      //    hier ist, KEIN clean_up.
+      if (!pointerp(itema[i][RITEM_OBJECT]) 
+	  && ((itema[i][RITEM_REFRESH] == REFRESH_NONE 
+	      && (!itema[i][RITEM_OBJECT] 
+		|| environment(itema[i][RITEM_OBJECT])!=this_object())) 
+	    || (itema[i][RITEM_REFRESH] == REFRESH_DESTRUCT 
+	      && itema[i][RITEM_OBJECT] 
+	      && environment(itema[i][RITEM_OBJECT]) != this_object())))
+	  return 1;
+      names -= (pointerp(itema[i][RITEM_FILE]) ?
+	  itema[i][RITEM_FILE] : ({ itema[i][RITEM_FILE] }));
+    }
+    // if there are objects left in the room do not clean up but try again later
+    if(sizeof(names) && !check_clean_count()) return 1;
+  }
+  else
+    // is there any object lying around?
+    if(first_inventory(this_object()) && !check_clean_count()) return 2;
+
+  // do clean_up
+  //log_file("clean_up_log",sprintf(
+  //	"%s:%s: %O\n",ctime(time())[11..18],__HOST_NAME__,this_object()));
+  
+  remove();
+  // wenn der Raum sich im remove() nicht zerstoert, hat er dafuer vermutlich
+  // nen Grund. Evtl. klappts ja naechstes Mal.
+
+  return(1);
+}
+
+/* Instead of printing the exits with the long description, we implement */
+/* the command "exits" to show them. */
+int
+show_exits() {
+  mixed ex;
+  if( this_player()->CannotSee() ) return 1;
+  if ((ex=QueryProp(P_HIDE_EXITS)) && intp(ex)) return 1;
+  if (ex = GetExits(this_player())) write(ex);
+  return 1;
+}
+
+int
+toggle_exits(string str)
+{
+  int ex;
+
+  /* Nur das aktuelle Environment des Spielers ist zustaendig fuer die
+     Auflistung der Ausgaenge. Anderenfalls wird das Kommando von Raeumen
+     im Raum (z.B. Transportern) abgefangen und es werden dessen Ausgaenge
+     aufgelistet.
+     Sprich: keine Auflistung von Aussen. */
+  if (environment(this_player()) != this_object()) return 0;
+  if (!str) return show_exits();
+  if (str!="auto") return 0;
+  ex = this_player()->QueryProp(P_SHOW_EXITS);
+  this_player()->SetProp(P_SHOW_EXITS, !ex);
+  if (ex) write("Ausgaenge werden nicht mehr automatisch angezeigt.\n");
+  else write("Ausgaenge werden automatisch angezeigt.\n");
+  return 1;
+}
+
+void
+init()
+{
+  Set(" clean counter ",2);
+
+  exits::init();
+  commands::init();
+  description::init();
+  doors::init();
+
+  add_action("toggle_exits", "exits");
+  add_action("toggle_exits", "ausgang");
+  add_action("toggle_exits", "ausgaenge");
+  add_action("toggle_exits", "aus");
+}
+
+int _query_para(){
+  int re;
+  if(re=Query(P_PARA))return re;
+  if(sizeof(regexp(({object_name(this_object())}),".*\\^0$")))
+      return -1;
+  return to_int(
+    regreplace(object_name(this_object()),".*\\^\([1-9][0-9]*\)$","\\1",1));
+}
+
+//dies ist ein Raum, war gewuenscht von mehreren Leuten.
+status IsRoom() {return(1);}
