diff --git a/std/room/doors.c b/std/room/doors.c
new file mode 100644
index 0000000..e05f009
--- /dev/null
+++ b/std/room/doors.c
@@ -0,0 +1,162 @@
+// MorgenGrauen MUDlib
+//
+// room/doors.c -- new doors, managed by doormaster
+//
+// $Id: doors.c 9134 2015-02-02 19:26:03Z Zesstra $
+
+#pragma strong_types
+#pragma save_types
+#pragma pedantic
+#pragma range_check
+#pragma no_clone
+
+#include <config.h>
+#include <properties.h>
+#include <defines.h>
+#include <language.h>
+#include <doorroom.h>
+#define NEED_PROTOTYPES
+#include <thing/properties.h>
+#include <room/exits.h>
+
+protected void create()
+{
+  if (object_name(this_object()) == __FILE__[0..<3])
+  {
+    set_next_reset(-1);
+    return;
+  }
+  SetProp(P_DOOR_INFOS,0);
+}
+
+protected void create_super() {
+  set_next_reset(-1);
+}
+
+varargs int NewDoor(string|string* cmds, string dest, string|string* ids,
+                    mapping|<int|string|string*>* props)
+{
+/*
+  cmds: Befehl(e), um durch die Tuer zu gehen (String oder Array von Strings)
+  dest: Zielraum
+  ids:  Id(s) der Tuer, default "tuer" (String, Array von Strings oder 0)
+  props: besondere Eigenschaften der Tuer (optional)
+  Array mit Paaren Nummer der Eigenschaft, Inhalt
+  definierte Properties sind:
+  D_FLAGS:  Flags wie bei Sir's Tueren
+  default: DOOR_CLOSED | DOOR_RESET_CL
+  Bei Schluesseln wird getestet, ob der String, den
+  QueryDoorKey zurueckliefert, gleich
+  "raumname1:raumname2" ist, wobei raumname1,2 die
+  kompletten Filenamen der beiden Raeume in sortierter
+  Reihenfolge sind.
+  D_LONG:   lange Beschreibung der Tuer
+  default: "Eine Tuer.\n"
+  D_SHORT:  kurze Beschreibung der Tuer, wird an die Raumbeschreibung
+  angefuegt, wobei %s durch geoeffnet bzw. geschlossen
+  ersetzt wird.
+  default: "Eine %se Tuer. "
+  D_NAME:   Name, der beim Oeffnen/Schliessen und bei Fehlermeldungen
+  angezeigt wird.
+  default: "Tuer"
+  D_GENDER: default: FEMALE
+  D_FUNC:   Funktion, die im Raum aufgerufen werden soll, wenn die
+  Tuer erfolgreich durchschritten wird.
+  default: 0
+  D_MSGS:   Falls String: ausgegebene Richtung fuer move
+  Falls Array: ({direction, textout, textin}) fuer move
+  default: 0
+
+  Beispiel:
+  NewDoor("norden","/players/rochus/room/test2","portal",
+  ({D_NAME,"Portal",
+  D_GENDER,NEUTER,
+  D_SHORT,"Im Norden siehst Du ein %ses Portal. ",
+  D_LONG,"Das Portal ist einfach nur gigantisch.\n"
+  }));
+
+*/
+
+  if (!cmds || !dest) return 0;
+  return call_other(DOOR_MASTER,"NewDoor",cmds,dest,ids,props);
+}
+
+void init()
+{
+  mixed *info;
+  string *cmds;
+  int i,j;
+
+  if (!pointerp(info=(mixed *)QueryProp(P_DOOR_INFOS))) return;
+  add_action("oeffnen","oeffne");
+  add_action("schliessen","schliesse");
+  add_action("schliessen","schliess");
+  for (i=sizeof(info)-1;i>=0;i--) {
+    cmds=(string *)(info[i][D_CMDS]);
+    for (j=sizeof(cmds)-1;j>=0;j--)
+      add_action("go_door",cmds[j]);
+    // Befehle IMMER anfuegen, gechecked wird sowieso erst beim Durchgehen.
+  }
+}
+
+void reset()
+{
+  if (QueryProp(P_DOOR_INFOS))
+    call_other(DOOR_MASTER,"reset_doors");
+}
+
+int oeffnen (string str)
+{
+  if (!str || !QueryProp(P_DOOR_INFOS))
+    return 0;
+  return (int) call_other(DOOR_MASTER,"oeffnen",str);
+}
+
+int schliessen (string str)
+{
+  if (!str || !QueryProp(P_DOOR_INFOS))
+    return 0;
+  return (int) call_other(DOOR_MASTER,"schliessen",str);
+}
+
+varargs int
+go_door (string str)
+{
+  if (!QueryProp(P_DOOR_INFOS))
+    return 0;
+  if (call_other(DOOR_MASTER,"go_door",query_verb()))
+    return 1;
+  return 0;
+}
+
+int set_doors(string *cmds,int open)
+{
+  int j;
+  
+  if (!previous_object())
+    return 0;
+  if (object_name(previous_object())!=DOOR_MASTER)
+    return 0;
+  // Andere sollen nicht rumpfuschen.
+  if (!this_player()) return 0;
+  if (environment(this_player())!=this_object())
+    return 0;
+  // Ist sowieso keiner da...
+  if (!pointerp(cmds))
+    return 0;
+  if (open)
+    AddSpecialExit(cmds,"go_door");
+  else
+    RemoveSpecialExit(cmds);
+  for (j=sizeof(cmds)-1;j>=0;j--)
+    add_action("go_door",cmds[j]);
+  return 1;
+}
+
+/* Fuer Tueren, die flexible Langbeschreibungen haben, wird ein 
+ * SpecialDetail eingefuehrt.
+ */
+
+string special_detail_doors(string key){
+  return DOOR_MASTER->special_detail_doors(key);
+}
