diff --git a/room/welcome/std.c b/room/welcome/std.c
new file mode 100644
index 0000000..eae3cee
--- /dev/null
+++ b/room/welcome/std.c
@@ -0,0 +1,151 @@
+#include <properties.h>
+#include <moving.h>
+#include <defines.h>
+
+inherit  "/std/room";
+
+#pragma strong_types
+#pragma rtt_checks
+#pragma no_shadow
+#pragma no_inherit
+#pragma pedantic
+#pragma range_check
+
+#define BS(x) break_string(x, 78, 0, BS_LEAVE_MY_LFS|BS_SINGLE_SPACE)
+#define TUTSTART "/d/anfaenger/arathorn/minitut/room/huette_"
+
+void create() {
+  ::create();
+
+  SetProp(P_LIGHT,1);
+  SetProp(P_LIGHT_TYPE, LT_STARS|LT_MOON);
+  SetProp(P_MAP_RESTRICTIONS, MR_NOUID|MR_NOINFO);
+  SetProp(P_INDOORS,0);
+  SetProp(P_NO_TPORT, NO_TPORT);
+
+  SetProp(P_INT_SHORT, "Irgendwo im Nirgendwo");
+  SetProp(P_INT_LONG, BS(
+    "Du schwebst im Nirgendwo. Sterne umgeben Dich, und Du glaubst "
+    "zu fallen, obwohl Du Dich vollkommen schwerelos fuehlst. Ein hauch"
+    "duenner Schleier aus Staub umfaengt Dich, als Du langsam aber sicher "
+    "Deines Koerpers gewahr wirst."));
+  AddSpecialExit("welt", function int () {
+    if ( PL->QueryGuest() ) 
+      return PL->move("/gilden/abenteurer", M_GO);
+    else return 0; 
+  });
+  Set(P_HIDE_EXITS, function mixed () {
+    return !(PL && PL->QueryGuest());
+  }, F_QUERY_METHOD);
+}
+
+void init() {
+  set_next_reset(300);
+  if ( objectp(PL) )
+    call_out("Sequenz", 0, 0);
+  return ::init();
+}
+
+// Nix resetten, aber Raum entsorgen, wenn kein Spieler drin.
+// Notfalls gibt es auch noch nen cleanup() aus dem Standardraum...
+protected void reset() {
+  if (!sizeof(filter(all_inventory(this_object()), #'query_once_interactive))
+      )
+    remove(1);
+}
+
+//TODO: Delays anpassen bzw. ausklammern, wenn immer =5 ausser am Ende.
+void Sequenz(int count) {
+  int delay;
+
+  if ( !objectp(PL) || environment(PL) != ME )
+    return;
+
+  switch(count) {
+    case 0:
+      tell_object(PL, BS(QueryProp(P_INT_LONG)));
+      delay = 4;
+      break;
+    case 1:
+      tell_object(PL, BS(
+        "\nDu schaust Dich erstaunt um. Du befindest Dich anscheinend im "
+        "Weltall, aber wie bist Du hierhergekommen? Ist das schon das "
+        "MorgenGrauen, oder bist Du wohl erst noch auf dem Weg dorthin?"));
+      delay = 8;
+      break;
+    case 2:
+      tell_object(PL, BS(
+        "\nMit einem Blick auf Deine Umgebung bemerkst Du, dass der Staub, "
+        "der Dich umgibt, sich langsam auf Dich zuzubewegen scheint. "
+        "Du willst neugierig danach greifen, aber es will Dir nicht "
+        "gelingen. Verwundert stellst Du fest, dass Du keine Haende "
+        "besitzt, und bei naeherer Betrachtung wird Dir klar, dass Du "
+        "auch sonst noch ziemlich koerperlos bist! "));
+      delay = 12;
+      break;
+    case 3:
+      tell_object(PL, BS(
+        "\nDas aendert sich aber bald, als der glitzernde Staub allmaehlich "
+        "um Dich herum eine durchscheinende Gestalt zu bilden beginnt, "
+        "die sich zuegig verdichtet."));
+      delay = 8;
+      break;
+    case 4:
+      int g = PL->QueryProp(P_GENDER);
+      string desc = PL->QueryProp(P_RACESTRING)[0];
+      string msg = (g==MALE?"ein richtiger ":"eine richtige ")+desc;
+      tell_object(PL, BS(
+        "\nSchon kurz darauf hat sich ein eleganter Koerper geformt, der "
+        "nun vollkommen Dir gehoert. Dass Du noch nackt bist, stoert Dich "
+        "nicht im geringsten, denn endlich, endlich fuehlst Du Dich "
+        "wie "+msg+"!"));
+      delay = 10;
+      break;
+    case 5:
+      tell_object(PL, BS(
+        "\nDeine Begeisterung ueber Deinen makellosen Koerper wird jaeh "
+        "unterbrochen, als ploetzlich die Sterne verblassen und sich mit "
+        "unfassbarem Tempo von Dir zu entfernen scheinen. Dann wird es "
+        "kurz schwarz um Dich herum und kurz darauf wieder hell."));
+      delay = 8;
+      break;
+    case 6:
+      tell_object(PL, "\n"+break_string(
+        "Herzlich Willkommen! Uebrigens, wenn Du auf der "
+        "Ebene Anfaenger mit anderen reden willst, folgender Tip: Probiere "
+        "mal '-anf Hallo Morgengrauen' (natuerlich ohne die ' mit "
+        "einzugeben) aus.", 78, "Merlin teilt Dir mit: "));
+      delay = 6;
+      break;
+    case 7:
+      if (PL->QueryGuest() ) {
+        PL->move("/gilden/abenteurer", M_GO);
+        return;
+      }
+      else
+        tell_object(PL, "\n"+break_string(
+          "Ich werde Dich jetzt in das Tutorial fuer Anfaenger bewegen, wo "
+          "Du Deine ersten Schritte machen kannst...",
+          78, "Merlin teilt Dir mit: ")+"\n");
+      delay = 4;
+      break;
+    case 8:
+      PL->move(TUTSTART+getuid(PL), M_GO);
+      return; // call_out nicht wieder anwerfen.
+   }
+   ++count;
+   call_out("Sequenz", delay, count);
+}
+
+// Bei Disconnect Sequenz abbrechen, bei Re-Login wieder starten mit
+// count == 5 d.h. Spieler fliegt also quasi "im Schlaf" weiter...
+void BecomesNetDead(object pl) {
+  while(remove_call_out("Sequenz")!=-1)
+   ;
+}
+
+void BecomesNetAlive(object pl) {
+  if (interactive(pl))
+    call_out("Sequenz", 6, 5);
+}
+
