diff --git a/std/shells/feline.c b/std/shells/feline.c
new file mode 100644
index 0000000..f590fab
--- /dev/null
+++ b/std/shells/feline.c
@@ -0,0 +1,259 @@
+// MorgenGrauen MUDlib
+//
+// shells/feline.c -- Feline Shell
+//
+// $Id: feline.c 8487 2013-05-21 19:15:52Z Zesstra $
+
+#pragma strong_types,save_types
+
+inherit "/std/player/base";
+
+#include <attributes.h>
+#include <combat.h>
+#include <health.h>
+#include <new_skills.h>
+#include <properties.h>
+#include <language.h>
+#include <wizlevels.h>
+#include <defuel.h>
+
+
+void create()
+{   
+    if (!clonep() || object_name(this_object()) == __FILE__[0..<3]) {
+      set_next_reset(-1);    
+      return;
+    }
+
+    int   i,g;
+    mixed h;
+
+    base::create();
+
+// Startraum/Kapelle setzen
+    SetDefaultHome("/d/dschungel/paracelsus/room/fkapelle");
+    SetDefaultPrayRoom("/d/dschungel/paracelsus/room/fkapelle");
+
+// Besondere rassenspezifische Properties (bei denen es nichts macht, wenn
+// sie nach jedem Einloggen neu gesetzt werden):
+
+    SetProp(P_ATTRIBUTES_OFFSETS, // Summe 4 statt 6 wg. SA_SPEED
+    ([
+        A_STR :  1,
+        A_INT :  2,
+        A_DEX :  2,
+        A_CON : -1 
+    ]) );
+    SetProp(P_AVERAGE_SIZE,200);
+    SetProp(P_AVERAGE_WEIGHT,85000);
+    SetProp(P_BODY,15);
+    SetProp(P_SKILL_ATTRIBUTE_OFFSETS,([SA_SPEED:120]));
+    SetProp(P_MATERIAL_KNOWLEDGE,
+    ([
+        MATGROUP_WOOD    :  60,
+        MATGROUP_JEWEL   : 100,
+        MATGROUP_EATABLE :  30
+    ]) );
+
+    SetProp(P_MAGIC_RESISTANCE_OFFSET,
+    ([
+        MT_ANGRIFF     :  200,
+        MT_ILLUSION    : -500,
+        MT_VERWANDLUNG :  500,
+        MT_PSYCHO      : 1000 
+    ]) );
+
+    SetProp(P_RESISTANCE_STRENGTHS,
+    ([
+        DT_WATER : -0.1,
+        DT_ACID  :  0.1,
+        DT_COLD  :  0.1 
+    ]) );
+
+// Lebenspunkte werden langsamer als normal regeneriert
+    SetProp(P_HP_DELAY,HEAL_DELAY+1);
+
+// Magiepunkte werden schneller als normal regeneriert
+    SetProp(P_SP_DELAY,HEAL_DELAY-1);
+
+// Gift wirkt etwas langsamer als normal
+    SetProp(P_POISON_DELAY,POISON_DELAY+1);
+
+// Getraenke werden etwas schneller als normal abgebaut
+    SetProp(P_DRINK_DELAY,DRINK_DELAY-1);
+
+// Essen wird etwas schneller als normal abgebaut ...
+    SetProp(P_FOOD_DELAY,FOOD_DELAY-1);
+    SetProp(P_MAX_FOOD,140);
+
+// Es gibt einige Sachen, die sollen nur beim ersten Einloggen gesetzt werden.
+// Andere muessen nachtraeglich - aber nur einmal - gemacht werden, weil sich
+// etwas geaendert hat.
+    switch( QueryProp(P_SHELL_VERSION) )
+    {
+        case 0 :
+
+            g=QueryProp(P_GENDER);
+
+            if ( !(i=QueryProp(P_SIZE)) || (i<(g==FEMALE?165:170)) 
+                || (i>(g==FEMALE?225:230)) )
+            {
+                SetProp(P_SIZE, (g==FEMALE?195:200)
+                    + random(16) - random(16) + random(16) - random(16) );
+            }
+
+            if( !(i=QueryProp(P_WEIGHT)) || (i<(g==FEMALE?70000:77000)) 
+               || (i>(g==FEMALE?88000:95000)) || (i==75000) )
+            {
+                SetProp(P_WEIGHT, (g==FEMALE?70000:77000)
+                    + random(4501) + random(4501) + random(4501) + random(4501) );
+            }
+
+
+            SetProp(P_MATERIAL,([
+                MAT_MISC_LIVING : 90,
+                MAT_PELT        :  8,
+                MAT_HORN        :  2
+            ]) );
+
+            if ( !IS_SEER(this_object()) )
+            {
+                SetProp(P_MSGIN,"schleicht herein");
+                SetProp(P_MSGOUT,"schleicht");
+                SetProp(P_MMSGIN,"erscheint mit einem grellen Blitz");
+                SetProp(P_MMSGOUT,"verschwindet mit einem grellen Blitz");
+                SetProp(P_HANDS,({" mit scharfen Krallen",40, ({DT_RIP}) }));
+            }
+            else
+            {
+                if ( !pointerp(h=QueryProp(P_HANDS)) || (sizeof(h)<1) )
+                    h = ({" mit scharfen Krallen",40, ({DT_RIP}) });
+                else
+                    h = ({h[0],40, ({DT_RIP}) });
+                SetProp(P_HANDS, h);
+            }
+
+            if ( !pointerp(h=QueryProp(P_CHANNELS)) )
+                SetProp(P_CHANNELS,({"katzenkrieger"}));
+            else if ( member(h,"katzenkrieger")==-1 )
+                SetProp(P_CHANNELS, h + ({"katzenkrieger"}) );
+
+            Set(P_SIZE,SAVE,F_MODE_AS);
+            Set(P_MATERIAL,SAVE,F_MODE_AS);
+            Set(P_WEIGHT,SAVE,F_MODE_AS);
+
+        default :
+
+            SetProp(P_SHELL_VERSION,1);
+    }
+  SetProp(P_DEFUEL_LIMIT_FOOD,70);
+  SetProp(P_DEFUEL_LIMIT_DRINK,40);
+  SetProp(P_DEFUEL_TIME_FOOD,400);
+  SetProp(P_DEFUEL_TIME_DRINK,300);
+  SetProp(P_DEFUEL_AMOUNT_FOOD,0.55);
+  SetProp(P_DEFUEL_AMOUNT_DRINK,0.4);
+
+}
+
+// Diese Rasse kann derzeit gewaehlt werden:
+int QueryAllowSelect() { return 1; }
+
+// Rassenbezeichnung
+string _query_race()
+{
+    return "Feline";
+}
+
+string _query_real_race()
+{
+    return "Feline";
+}
+
+// Die Rassenbeschreibung, die man beim ersten Einloggen abrufen kann.
+string _query_racedescr()
+{
+    return break_string(
+        "Felinen sind aufrecht gehende Katzenwesen.\n"+
+        "Ihre Heimat ist der Dschungel. Kaum jemand duerfte sich dort "+
+        "besser zurechtfinden als sie. Bedingt durch diese Umgebung "+
+        "haben sie im Laufe der Zeit eine Vorliebe fuer elegante Hoelzer "+
+        "und funkelnde Edelsteine entwickelt. Sie sind zwar nicht so "+
+        "'raffgierig' wie Zwerge, aber dennoch sollte man besser nicht "+
+        "versuchen, einem Felinen einen Edelstein wegzunehmen. Sie "+
+        "benutzen die Edelsteine sehr gerne, um sich damit zu schmuecken. "+
+        "Felinen betreiben sogar einen regelrechten Koerperkult, "+
+        "insbesondere wenn es darum geht, das Fell oder die Krallen zu "+
+        "faerben. Edelsteine kommen da als Accessoires gerade recht.\n"+
+        "Auch im Kampf gegen einen Felinen sollte man sehr vorsichtig "+
+        "sein, da Felinen ihre geringe Ausdauer durch eine hohe "+
+        "Geschwindigkeit sowie Geschick und Intelligenz wettmachen. "+
+        "Auch die Spitzen Krallen sind da nicht zu verachten und so "+
+        "mancher Gegner musste schon als Ersatz fuer einen Kratzbaum "+
+        "herhalten.",78,0,1);
+}
+
+// Geschlechtsabhaengiges Rassenbezeichnungs-Array
+string *_query_racestring()
+{
+    if (QueryProp(P_GENDER)==2)
+        return ({"Felinin","Felinin","Felinin","Felinin"});
+    return ({"Feline","Felinen","Felinen","Felinen"});
+}
+
+// Regeneration der Lebenspunkte ist von der Umgebung abhaengig
+// Im Wald und Dschungel geht es schneller, in der Wueste und im
+// Polargebiet dagegen langsamer.
+int _query_hp_delay()
+{
+    int re;
+    string fn;
+
+    re = Query(P_HP_DELAY);
+    if (environment() && !(environment()->QueryProp(P_INDOORS)) &&
+        fn=object_name(environment()))
+    {
+        if (fn[0..12]=="/d/dschungel/" || fn[0..7]=="/d/wald/")
+            re--;
+        else if (fn[0..9]=="/d/wueste/" || fn[0..8]=="/d/polar/")
+            re++;
+    }
+    return re;
+}
+
+// Regeneration der Magiepunkte ist von der Umgebung abhaengig
+// Im Wald und Dschungel geht es schneller, in der Wueste und im
+// Polargebiet dagegen langsamer.
+int _query_sp_delay()
+{
+    int re;
+    string fn;
+
+    re = Query(P_SP_DELAY);
+    if (environment() && !(environment()->QueryProp(P_INDOORS)) &&
+        fn=object_name(environment()))
+    {
+        if (fn[0..12]=="/d/dschungel/" || fn[0..7]=="/d/wald/")
+            re--;
+        else if (fn[0..9]=="/d/wueste/" || fn[0..8]=="/d/polar/")
+            re++;
+    }
+    return re;
+}
+
+string _query_default_guild(){
+  return "katzenkrieger";
+}
+
+mixed RaceDefault(string arg)
+{
+    if (!arg)
+      return 0;
+    switch(arg)
+    {
+        case P_HANDS :
+            return ({" mit scharfen Krallen",40, ({DT_RIP}) });
+        case P_BODY :
+            return 15;
+    }
+    return base::RaceDefault(arg);
+}
