diff --git a/std/shells/dwarf.c b/std/shells/dwarf.c
new file mode 100644
index 0000000..7a696dc
--- /dev/null
+++ b/std/shells/dwarf.c
@@ -0,0 +1,156 @@
+// MorgenGrauen MUDlib
+//
+// shells/dwarf.c -- Dwarven Shell
+//
+// $Id: dwarf.c,v 3.14 2004/12/13 12:54:31 Zook Exp $
+
+#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 <combat.h>
+#include <defuel.h>
+
+
+void create(){
+  if (!clonep() || object_name(this_object()) == __FILE__[0..<3]) {
+      set_next_reset(-1);    
+      return;
+  }
+
+  mixed res;
+
+  base::create();
+  SetDefaultHome("/d/gebirge/room/zkapelle");
+  SetDefaultPrayRoom("/d/gebirge/room/zkapelle");
+  SetProp(P_ATTRIBUTES_OFFSETS,([A_STR:2,A_DEX:1,A_CON:3]));
+  SetProp(P_SKILL_ATTRIBUTE_OFFSETS,([SA_DURATION:110]));
+  SetProp(P_AVERAGE_SIZE,120);
+  SetProp(P_AVERAGE_WEIGHT,75000);
+  SetProp(P_MATERIAL_KNOWLEDGE,([MATGROUP_STONE:30,
+                                 MATGROUP_METAL:30, 
+                                 MATGROUP_PRECIOUS_METAL: 40, 
+                                 MAT_GOLD:100]));
+  SetProp(P_RESISTANCE_STRENGTHS,
+	  ([ DT_FIRE : -0.2,
+	   DT_WATER : 0.4 ]));
+  SetProp(P_MAX_ALCOHOL,200);
+  SetProp(P_MAX_FOOD,160);
+
+  SetProp(P_SP_DELAY,HEAL_DELAY+1);
+  SetProp(P_POISON_DELAY,POISON_DELAY+1);
+  SetProp(P_FOOD_DELAY,FOOD_DELAY-1);
+  SetProp(P_ALCOHOL_DELAY,ALCOHOL_DELAY-1);
+
+  SetProp(P_MAGIC_RESISTANCE_OFFSET,
+          ([ MT_ANGRIFF : 200,
+	   MT_ILLUSION : -500,
+           MT_BEHERRSCHUNG : 1000,
+	   MT_VERWANDLUNG : 500 ]));
+
+  if(!IS_SEER(this_object())){
+    SetProp(P_MSGIN,"stapft herein");
+    SetProp(P_MSGOUT,"stapft");
+  }
+
+  if(!(res=QueryProp(P_HANDS)) || !pointerp(res) || (sizeof(res)<3))
+    res=({" mit blossen Haenden",35,({DT_BLUDGEON}) });
+  res[1]=35;
+  SetProp(P_HANDS,res);
+  SetProp(P_BODY,10);
+
+  /* Groesse wird nur einmal gesetzt */
+  if(!QueryProp(P_SIZE)){
+    SetProp(P_SIZE,110+random(21));
+    Set(P_SIZE,SAVE,F_MODE_AS);
+  }
+
+  /* Dito Gewicht */
+  if(!QueryProp(P_WEIGHT) || (QueryProp(P_WEIGHT) == 75000)){
+    SetProp(P_WEIGHT,65000+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,70);
+  SetProp(P_DEFUEL_LIMIT_DRINK,50);
+  SetProp(P_DEFUEL_TIME_FOOD,535);
+  SetProp(P_DEFUEL_TIME_DRINK,500);
+  SetProp(P_DEFUEL_AMOUNT_FOOD,0.8);
+  SetProp(P_DEFUEL_AMOUNT_DRINK,0.6);
+
+}
+
+string _query_race()
+{
+  return "Zwerg";
+}
+
+string _query_real_race()
+{
+  return "Zwerg";
+}
+
+string _query_racedescr()
+{
+  return
+  "Zwerge sind kleine aber kraeftige Gebirgsbewohner, nicht sehr gespraechig,\n"
+    +"leicht erzuernt, aber eine schlagkraeftige Unterstuetzung fuer ihre Freunde."
+    +"\n"
+    +"Ihr Mut und ihre Standfestigkeit ist weit und breit beruehmt, auch ihr\n"
+    +"Geschick im Umgang mit Zwergenwaffen verleiht ihnen zusaetzliche Kraft.\n"
+    +"Leider sind Zwerge nicht allzu schlau, sie verlassen sich lieber auf\n"
+    +"ihre Kraft als auf ihr Gehirn.\n";
+}
+
+int QueryAllowSelect() { return 1; }
+
+string *_query_racestring()
+{
+  if (QueryProp(P_GENDER)==2)
+    return ({"Zwergin","Zwergin","Zwergin","Zwergin"});
+  return ({"Zwerg","Zwerges","Zwerg","Zwerg"});
+}
+int _query_hp_delay(){
+  int re;
+  re = Query(P_HP_DELAY);
+  if (environment() && environment()->QueryProp(P_INDOORS))
+    re--;
+  else
+    re++;
+  return re;
+}
+int _query_sp_delay(){
+  int re;
+  re = Query(P_SP_DELAY);
+  if (environment() && environment()->QueryProp(P_INDOORS))
+    re--;
+  else
+    re++;
+  return re;
+}
+
+string _query_default_guild(){
+  return "abenteurer";
+}
+
+mixed RaceDefault(string arg)
+{
+  if (!arg)
+    return 0;
+  switch(arg)
+  {
+    case P_HANDS :
+      return ({" mit blossen Haenden",35,({DT_BLUDGEON}) });
+    case P_BODY :
+      return 10;
+  }
+  return 0;
+}
