diff --git a/room/death/death_room_vc.c b/room/death/death_room_vc.c
new file mode 100644
index 0000000..71038fb
--- /dev/null
+++ b/room/death/death_room_vc.c
@@ -0,0 +1,168 @@
+// MorgenGrauen MUDlib
+//
+// death_room_vc.c -- Das Standardobjekt fuer den VC-Todesraum
+//
+// $Id: death_room_vc.c 8988 2014-12-31 13:10:19Z Zesstra $
+
+
+#pragma strict_types
+
+#include <defines.h>
+#include <properties.h>
+#include <moving.h>
+#include <language.h>
+#include <wizlevels.h>
+#include <daemon.h>
+#include <new_skills.h>
+
+inherit "/std/room";
+
+public int no_attack();
+public int no_poison(int val);
+
+public void create()
+{
+  if (IS_BLUE(this_object())) return;
+    ::create();
+    
+    SetProp( P_GENDER, MALE );
+    SetProp( P_ARTICLE, 0 );
+    SetProp( P_LIGHT,1 );
+    SetProp( P_NO_TPORT, NO_TPORT_OUT );
+    SetProp( P_LOG_FILE, "TOD/Todesraum" );
+    SetProp( P_INT_SHORT, "Arbeitszimmer des Todes" );
+    SetProp( P_INT_LONG, break_string(
+             "Ein dunkler Raum, erleuchtet von dunklem Licht, das sich der "
+             "Dunkelheit nicht so sehr zu widersetzen scheint, indem es "
+             "leuchtet, als dass es der dunkelste Punkt in einer weniger "
+             "dunklen Umgebung ist. Im seltsamen Licht erkennst Du einen "+
+             "zentral aufgestellten Schreibtisch, der mit Diagrammen und "
+             "Buechern bedeckt ist. Die Waende verschwinden hinter Regalen, "
+             "die gefuellt sind mit in Leder gebundenen, dunklen Waelzern, "
+             "von denen geheimnisvolle Runen leuchten.\nTod.", 78, 0, 1 ) );
+    previous_object()->CustomizeObject();
+    call_other("/room/death/death_room","???");
+}
+
+void test_remove()
+{
+  if (!sizeof(all_inventory(this_object())&users()))
+    if (!this_object()->remove()) destruct(this_object());
+}
+
+public void reset()
+{
+  ::reset();
+  test_remove();
+  return;
+}
+
+public void exit(object liv)
+{
+  call_out("test_remove",2);
+  return;
+}
+
+
+static void deep_destruct( object ob )
+{
+    if ( objectp(ob) && environment(ob) == this_object() )
+        filter( deep_inventory(ob) + ({ ob }),
+                      lambda( ({'x/*'*/}), ({#'destruct, 'x}) ) );
+}
+
+public void init()
+{  
+  string prayroom;
+  int res;
+
+  ::init();
+  if ( !query_once_interactive(this_player()) ){
+      call_out( "deep_destruct", 0, this_player() );
+      return;
+  }
+
+  if ( !(prayroom = (string) this_player()->QueryPrayRoom()) )
+      prayroom = "/room/pray_room";
+  
+  if ( !this_player()->QueryProp(P_GHOST) )
+    {
+      if ( IS_WIZARD(this_player()) &&
+           this_player()->QueryProp(P_WANTS_TO_LEARN) )
+	{
+          if ( !this_player()->QueryProp(P_INVIS) )
+              tell_room( this_object(),
+                         "Der Tod sagt: WAS WILLST DU HIER, "+
+                         upperstring((string) this_player()->name())+"?\n"+
+                         "Der Tod sagt: DU BIST UNSTERBLICH, DU HAST HIER "
+                         "NICHTS ZU SUCHEN!\n\n" );
+	}
+      else 
+	{
+          write("Der Tod sagt: WAS TUST DU HIER? DEINE ZEIT IST NOCH "
+                "NICHT REIF!\n\n");
+          
+	  if ( catch(res = (int) this_player()->move( prayroom,M_GO|M_SILENT|M_NOCHECK ))
+               || res < 1 && environment(this_player()) == this_object() )
+              this_player()->move( "/room/pray_room", M_GO|M_SILENT|M_NOCHECK );
+	}
+      return;
+    }
+
+  if ( !IS_DEPUTY(this_player()) ){
+    add_action( "filter_ldfied", "", 1 );
+    this_player()->Set( P_TMP_MOVE_HOOK,
+                        ({ time()+31536000, 
+                           find_object("/room/death/death_room"), 
+                           "hier_geblieben" }) );
+  }
+
+  this_player()->Set( P_NO_ATTACK, #'no_attack, F_QUERY_METHOD );
+  this_player()->Set( P_POISON, #'no_poison, F_SET_METHOD );
+  
+  "/room/death/death_room"->add_player(this_player());
+}
+
+// public, da command_me() sonst buggt (Wurzels Speedy o.ae.)
+public int filter_ldfied( string str )
+{
+    // Description:   Filter out relevant commands.
+    string verb;
+    
+    verb=query_verb();
+    
+    if ( (verb == "schlafe" || verb == "schlaf") && str == "ein" ){
+        write("DU KANNST DEM TOD NICHT ENTRINNEN!\n");
+        return 0;
+    }
+    
+    if ( verb == "typo" || verb == "fehler" || verb == "bug" || verb == "idee" )
+        return 0;
+
+    write( "Dein Koerper gehorcht Dir nicht !\n" );
+    return 1;
+}
+
+public int no_attack()
+{
+  int i;
+
+  // Spieler haengt noch in der Todessequenz
+  if( present(previous_object()) )
+    return 1;
+  else
+    previous_object()->Set( P_NO_ATTACK, 0, F_QUERY_METHOD );
+
+  return 0;
+}
+
+public int no_poison(int val)
+{
+  if ( val != 0 )
+  {
+    catch( raise_error("Poisoning dead players is illegal. Calling object "
+      "was "+object_name(previous_object(1))+"\n");publish );
+  }
+  return 0;
+}
+
