diff --git a/std/shells/darkelf.c b/std/shells/darkelf.c
new file mode 100644
index 0000000..45e37fb
--- /dev/null
+++ b/std/shells/darkelf.c
@@ -0,0 +1,270 @@
+// MorgenGrauen MUDlib
+//
+// shells/darkelf.c -- Darkelf Shell
+//
+// $Id: darkelf.c 8675 2014-02-18 20:39:54Z Zesstra $
+
+#pragma strong_types,save_types
+
+inherit "/std/player/base";
+
+#include <properties.h>
+#include <attributes.h>
+#include <wizlevels.h>
+#include <health.h>
+#include <new_skills.h>
+#include <language.h>
+#include <defines.h>
+#include <combat.h>
+#include <defuel.h>
+#include <errord.h>
+
+
+protected void create()
+{
+  if (!clonep() || object_name(this_object()) == __FILE__[0..<3]) {
+    set_next_reset(-1);
+    return;
+  }
+  base::create();
+  SetDefaultHome("/gilden/dunkelelfen");
+  SetDefaultPrayRoom("/d/unterwelt/cadra/room/town/templemain");
+  SetProp(P_AVERAGE_SIZE,175);
+  SetProp(P_AVERAGE_WEIGHT,70000);
+  SetProp(P_ALIGN, -500);
+  SetProp(P_SKILL_ATTRIBUTE_OFFSETS,([SA_ENEMY_SAVE:110]));
+  SetProp(P_ATTRIBUTES_OFFSETS,([A_INT:4,A_DEX:2]));
+  SetProp(P_MATERIAL_KNOWLEDGE,([MATGROUP_UNHOLY: 100,
+                                 MATGROUP_MAGIC:   70,
+                                 MATGROUP_DEAD:    50,
+                                 MATGROUP_METAL:   30]) );
+  SetProp(P_RESISTANCE_STRENGTHS,
+            ([ DT_HOLY :    0.25,
+               DT_UNHOLY : -0.15,
+               DT_TERROR : -0.05 ]));
+  SetProp(P_MAX_FOOD,80);
+  SetProp(P_MAX_DRINK,150);
+  SetProp(P_MAX_ALCOHOL,70);
+
+  SetProp(P_SP_DELAY, HEAL_DELAY-2); // dafuer regeneriert man im freien
+  SetProp(P_HP_DELAY, HEAL_DELAY-1); // wirklich _nichts_
+  SetProp(P_FOOD_DELAY,FOOD_DELAY+1);
+  SetProp(P_DRINK_DELAY,DRINK_DELAY-2);
+  SetProp(P_ALCOHOL_DELAY,ALCOHOL_DELAY+1);
+
+  SetProp(P_MAGIC_RESISTANCE_OFFSET,
+        ([ MT_ILLUSION    : 200,
+           MT_ANGRIFF     : 500,
+	   MT_BEHERRSCHUNG: 500,
+	   MT_PSYCHO      : 800 ]));
+
+  /* Groesse wird nur einmal gesetzt */
+  if(!QueryProp(P_SIZE)) {
+    SetProp(P_SIZE,150+random(50));
+    Set(P_SIZE,SAVE,F_MODE_AS);
+  }
+
+  /* Dito Gewicht */
+  if(!QueryProp(P_WEIGHT) || (QueryProp(P_WEIGHT) == 75000)){
+    SetProp(P_WEIGHT,60000+random(20001));
+    if(QueryProp(P_GENDER)==FEMALE)
+      SetProp(P_WEIGHT,QueryProp(P_WEIGHT)-5000);
+    Set(P_WEIGHT,SAVE,F_MODE_AS);
+  }
+  SetProp(P_DEFUEL_LIMIT_FOOD,40);
+  SetProp(P_DEFUEL_LIMIT_DRINK,30);
+  SetProp(P_DEFUEL_TIME_FOOD,400);
+  SetProp(P_DEFUEL_TIME_DRINK,250);
+  SetProp(P_DEFUEL_AMOUNT_FOOD,0.45);
+  SetProp(P_DEFUEL_AMOUNT_DRINK,0.4);
+}
+
+static void FinalSetup()
+{
+   if (!QuerySkill(SK_NIGHTVISION))
+      ModifySkill(SK_NIGHTVISION, 5000, 0, "ANY");
+}
+
+string _query_race()
+// nicht static, da sie manchmal auch so aufgerufen wird...
+{
+  return "Dunkelelf";
+}
+
+string _query_real_race()
+{
+  return "Dunkelelf";
+}
+
+static string _query_racedescr()
+{
+	  return
+"\
+Das Volk der Dunkelelfen lebt in einer grossen Hoehlenstadt gut versteckt\n\
+hinter einem Wasserfall. Ueber kaum ein anderes Volk gibt es soviele\n\
+Vorurteile wie ueber die Dunkelelfen, und so werden sie von allen misstrauisch\n\
+beaeugt oder sogar bekaempft. In diesem Kampf, insbesondere gegen die Elfen,\n\
+sind sie voellig auf sich allein gestellt, und so hat sich eine mehr oder\n\
+minder autarke Gesellschaft entwickelt. Die Dunkelelfen haben eine eigene\n\
+Kultur und eine eigene Goettin, der sie huldigen. Wie auch die Elfen\n\
+verfuegen sie ueber ausserordenlich grosse magische Faehigkeiten, auch wenn\n\
+sie sich mehr auf die schwarze Seite der Magie spezialisiert haben.\n";
+}
+
+// int QueryAllowSelect() { return 0; }
+// Aktiviert am 28.07.03, Ark.
+int QueryAllowSelect() { return 1; }
+
+string *_query_racestring()
+{
+  if (QueryProp(P_GENDER)==2)
+    return ({"Dunkelelfe","Dunkelelfe","Dunkelelfe","Dunkelelfe"});
+  return ({"Dunkelelf","Dunkelelfen","Dunkelelf","Dunkelelf"});
+}
+
+static string _query_default_guild()
+{
+  return "dunkelelfen";
+}
+
+static int sun_in_room(object room)
+{
+  if (!room) return 0;
+  closure qp=symbol_function("QueryProp", room);
+  int lt=funcall(qp, P_LIGHT_TYPE);
+  // (lt & LT_SUN) ist hier zunaechst _testweise_ drin. Die Rasse wurde
+  // anders genehmigt. Sollte das im MG ueberhand nehmen und jeder Keller
+  // nun sonnendurchflutet sein, dann wird das wieder ausgebaut!
+  // 27.06.04 Padreic
+  return ( (funcall(qp, P_INT_LIGHT)>0) &&
+          ((lt & LT_SUN) || ((lt==LT_MISC) && !funcall(qp, P_INDOORS))));
+}
+
+protected void heart_beat()
+{
+  ::heart_beat();
+  if (sun_in_room(environment()) &&
+      QueryProp("Dunkelelfen:Outdoor")<random(100) && !QueryProp(P_GHOST)) {
+     int hp;
+     hp=QueryProp(P_HP)-1;
+     SetProp(P_HP, hp);
+     if (hp<0) {
+       tell_object(ME,
+         "Das war wohl zuviel fuer Dich. Das naechste mal solltest Du Dich "
+        +"wohl besser\ngegen die Sonne schuetzen.\n");
+       SetProp(P_KILL_NAME,"Zuviel Sonne");
+       do_damage(999,ME);
+       SetProp(P_KILL_NAME,0);
+     }
+     else tell_object(ME, /* die Info musste irgendwie in eine Zeile */
+           "Die Sonne scheint gnadenlos auf Dein Haupt und schwaecht Dich.\n");
+  }
+}
+
+static int _query_no_regeneration()
+{
+  if (sun_in_room(environment()))
+     return NO_REG;
+  return Query(P_NO_REGENERATION);
+}
+
+int StdSkill_Nightvision(object me, string sname, mixed sinfo)
+{
+  int last, light;
+
+  if (!sinfo || !environment()) return 0;
+  if (intp(sinfo)) sinfo=([SI_SKILLABILITY:sinfo]);
+  if (!mappingp(sinfo)) return 0;
+  light=(QueryProp(P_PLAYER_LIGHT)<=0 ? -1 : 1);
+  if (last=sinfo[SI_USR]) { // letztes Lichtlevel != 0
+     if (light==last) {
+       if (sinfo[SI_LASTLIGHT]<=time())
+          return sinfo[SI_SKILLABILITY]+1;
+       return -1;
+     }
+     else {
+       last=( MAX_ABILITY - sinfo[SI_SKILLABILITY] );
+       last=(last/1000) + (last%1000 > random(1001) ? 1 : 0);
+       if (light<0) last/=2; // an Dunkelkeit schneller gewoehnen...
+       if(!this_interactive() || this_interactive()==this_object())
+       {
+	       ModifySkill(sname, ([SI_USR: light, SI_LASTLIGHT: time()+last]),
+        	           0, sinfo[SI_GUILD]);
+       }
+       if (last<=0)
+          return sinfo[SI_SKILLABILITY]+1;
+       return -1;
+     }
+  }
+  else { // Startwert...
+    if(!this_interactive() || this_interactive()==this_object())
+    {
+    	ModifySkill(sname, ([SI_USR: light, SI_LASTLIGHT: 0]), 0, sinfo[SI_GUILD]);
+    }
+    return sinfo[SI_SKILLABILITY]+1;
+  }
+  return 0;
+}
+
+varargs int CannotSee(int silent)
+{
+  string is_blind;
+
+  if ( is_blind = QueryProp( P_BLIND ) ) {
+     if (!silent) {
+       if (stringp(is_blind)) write(is_blind);
+       else write("Du bist blind!\n");
+     }
+     return 1;
+  }
+  if (environment() && (!IS_LEARNER(ME) || !Query(P_WANTS_TO_LEARN))) {
+     if (QueryProp(P_GHOST)) {
+        if (StdSkill_Nightvision(ME, SK_NIGHTVISION, QuerySkill(SK_NIGHTVISION))>0)
+            return 0;
+     }
+     else if (UseSkill(SK_NIGHTVISION)>0) return 0;
+     if (!silent) {
+        if (QueryProp(P_PLAYER_LIGHT)<=0)
+          write("Du kannst nichts sehen, da sich Deine Augen noch nicht an die Dunkelheit\n"
+               +"gewoehnt haben!\n");
+        else write("Du bist von dem hellen Licht total geblendet und Du musst Dich erst langsam\n"
+                  +"daran gewoehnen.\n");
+     }
+     return 1;
+  }
+  return 0;
+}
+
+
+/*
+ * 2003-11-05, Zook:
+ *
+ *   Temporaere Funktion, die den Delfen es ermoeglicht, einen
+ *   moeglicherweise falschen Raum (Indoor/Outdoor) zu melden.
+ *
+ */
+
+static int _indoorbug(string key)
+{
+  if (!stringp(key))
+    key= "";
+
+  ERRORD->LogReportedError(
+      ([ F_PROG: "unbekannt",
+         F_LINE: 0,
+         F_MSG: "Sonnenfehler: " + key,
+         F_OBJ: environment(this_object())
+      ])
+      );
+
+  write("Du hast einen fehlerhaften Innen-/Aussen-/Sonnenlichtraum gemeldet.\n");
+
+  return 1;
+}
+
+static mixed _query_localcmds()
+{
+  return ({ ({"sonnenfehler", "_indoorbug", 0, 0 }) })
+            + base::_query_localcmds();
+}
+
