diff --git a/std/shells/hobbit.c b/std/shells/hobbit.c
new file mode 100644
index 0000000..b626b06
--- /dev/null
+++ b/std/shells/hobbit.c
@@ -0,0 +1,139 @@
+// MorgenGrauen MUDlib
+//
+// shells/hobbit.c -- Hobbit Shell
+//
+//   9.April 1995  V1.0 Gundur
+//
+//   15.Juni prayroom und defHome auf Hobbitdorf gesetzt von Gundur
+//
+// $Id: hobbit.c 8920 2014-09-02 20:18:38Z 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 <combat.h>
+#include <moving.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/wald/gundur/hobbitdorf/schrein");
+  SetDefaultPrayRoom("/d/wald/gundur/hobbitdorf/schrein");
+  SetProp(P_ATTRIBUTES_OFFSETS,([A_DEX:4,A_CON:2]));
+  SetProp(P_AVERAGE_SIZE, 105);
+  SetProp(P_AVERAGE_WEIGHT, 60000);
+  SetProp(P_MATERIAL_KNOWLEDGE,([MATGROUP_EATABLE:30, 
+                                 MATGROUP_DRUG:30, 
+                                 MATGROUP_POISONOUS:10]));
+  SetProp(P_RESISTANCE_STRENGTHS,
+	  ([ DT_TERROR : -0.1,
+	   DT_MAGIC : -0.1,
+	   DT_SOUND : 0.2,
+	   DT_LIGHTNING : 0.1,
+	   DT_POISON : 0.1 ]));
+  SetProp(P_MAX_FOOD,250);
+  SetProp(P_MAX_DRINK,100);
+  SetProp(P_MAX_ALCOHOL,150);
+
+  SetProp(P_SP_DELAY,HEAL_DELAY+1);
+  SetProp(P_POISON_DELAY,POISON_DELAY-1);
+  SetProp(P_FOOD_DELAY,FOOD_DELAY-2);
+  SetProp(P_ALCOHOL_DELAY,ALCOHOL_DELAY+1);
+
+  SetProp(P_MAGIC_RESISTANCE_OFFSET,
+          ([ MT_ANGRIFF : 500,
+	   MT_HELLSICHT : -500,
+	   MT_PSYCHO : -500 ]));
+
+  if(!(res=QueryProp(P_HANDS)) || !pointerp(res) || (sizeof(res)<3))
+    res=({" mit pelzigen Haenden",25,({DT_BLUDGEON})});
+  res[1]=25;
+  SetProp(P_HANDS,res);
+  SetProp(P_BODY,15);
+
+  /* Groesse wird nur einmal gesetzt */
+  if(!QueryProp(P_SIZE)){
+    SetProp(P_SIZE,95+random(21));
+    Set(P_SIZE,SAVE,F_MODE_AS);
+  }
+
+  /* Dito Gewicht */
+  if(!QueryProp(P_WEIGHT) || (QueryProp(P_WEIGHT) == 75000)){
+    SetProp(P_WEIGHT,50000+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,140);
+  SetProp(P_DEFUEL_LIMIT_DRINK,50);
+  SetProp(P_DEFUEL_TIME_FOOD,850);
+  SetProp(P_DEFUEL_TIME_DRINK,450);
+  SetProp(P_DEFUEL_AMOUNT_FOOD,0.8);
+  SetProp(P_DEFUEL_AMOUNT_DRINK,0.6);
+
+}
+
+string _query_race()
+{
+  return "Hobbit";
+}
+
+string _query_real_race()
+{
+  return "Hobbit";
+}
+
+string _query_racedescr()
+{
+  return "Hobbits sind kleine Wesen, die am ehesten den Menschen aehneln.\n"+
+    "Sie zeichnen sich trotz Ihrer Groesse durch ihren Mut und Standfestigkeit "+
+	"aus.\nObwohl sie viel lieber zuhause vorm warmen Kamin sitzen, sind sie "+
+	"immer\nfuer ein Abenteuer zu haben.\n";
+}
+
+int QueryAllowSelect() { return 1; }
+
+string *_query_racestring(){
+  if (QueryProp(P_GENDER) == FEMALE)
+    return ({"Hobbitfrau","Hobbitfrau","Hobbitfrau","Hobbitfrau"});
+  return ({"Hobbit","Hobbits","Hobbit","Hobbit"});
+}
+
+string _query_default_guild(){
+  return "abenteurer";
+}
+
+void FinalSetup() {
+  if(!present("pfeifchen",this_object()))
+    clone_object("/items/pfeifchen")->move(this_object(),M_NOCHECK);
+}
+
+mixed RaceDefault(string arg)
+{
+  if (!arg)
+    return 0;
+  switch(arg)
+  {
+    case P_HANDS :
+      return ({" mit pelzigen Haenden",25,({DT_BLUDGEON}) });
+    case P_BODY :
+      return 15;
+  }
+  return base::RaceDefault(arg);
+}
