diff --git a/std/shells/orc.c b/std/shells/orc.c
new file mode 100644
index 0000000..95c73f6
--- /dev/null
+++ b/std/shells/orc.c
@@ -0,0 +1,203 @@
+#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 <defines.h>
+#include <defuel.h>
+
+/*
+ * Orks:
+ * Orks sind eigentlich boese und blutruenstig, was auch oft genug zum 
+ * Vorschein tritt :) Wenn ein Ork zu heftig forscht, quengelt er rum 
+ * und weigert sich, bis er nicht wieder ein bisschen Blut verspritzt
+ * hat,
+*/ 
+#define F_MAX 500
+#define F_DEG 3 
+#define NO_EXAMINE ({ \
+    "Du knurrst: Ich will Blut, keine Bluemchen.", \
+    "Du grummelst: Bin ich ein Forscher, oder was?" \
+    })
+
+static int f_cnt, f_deg;
+
+int 
+QueryFCnt() {
+  return f_cnt;
+}
+
+int 
+SetFCnt(int fc) {
+  if(fc > -1 && fc < F_MAX)
+    f_cnt = fc;
+  return f_cnt;
+}
+  
+int
+QueryFDeg() {
+  return f_deg;
+}
+
+void 
+create() {
+  if (!clonep() || object_name(this_object()) == __FILE__[0..<3]) {
+      set_next_reset(-1);    
+      return;
+  }
+
+  mixed res;
+
+  base::create();
+
+  f_cnt=0;
+  f_deg=F_DEG;
+  
+  SetDefaultHome("/d/vland/morgoth/room/city/rathalle");
+  SetDefaultPrayRoom("/d/vland/morgoth/room/city/c0606");
+  SetProp(P_ATTRIBUTES_OFFSETS,([A_STR:3,A_INT:-1,A_CON:2]));
+  /* Kleine aeh grosse Muskelpakete */
+  SetProp(P_SKILL_ATTRIBUTE_OFFSETS,([SA_DAMAGE:110]));
+  SetProp(P_AVERAGE_SIZE,195);
+  SetProp(P_AVERAGE_WEIGHT,125000); // ziemlich schwer, viele Muskeln
+  SetProp(P_MATERIAL_KNOWLEDGE,([MATGROUP_DEAD:60,
+                                 MATGROUP_BIO:40, 
+                                 MATGROUP_ELEMENTAL: 20, 
+                                 MAT_BLOOD:100]));
+  SetProp(P_CHANNELS, QueryProp(P_CHANNELS) + ({"Uruk-Hai"}));
+  SetProp(P_RESISTANCE_STRENGTHS,
+	  ([ 
+     DT_FIRE : -0.2,
+     DT_HOLY :0.3,
+     DT_UNHOLY : -0.2,
+	   DT_ACID : 0.2 ]));
+
+  SetProp(P_MAX_FOOD,110);
+  SetProp(P_MAX_DRINK,110);
+  SetProp(P_MAX_ALCOHOL,150);
+  SetProp(P_DEFUEL_LIMIT_FOOD,50);
+  SetProp(P_DEFUEL_LIMIT_DRINK,70);
+  SetProp(P_DEFUEL_TIME_FOOD,300);
+  SetProp(P_DEFUEL_TIME_DRINK,400);
+  SetProp(P_DEFUEL_AMOUNT_FOOD,0.4);
+  SetProp(P_DEFUEL_AMOUNT_DRINK,0.35);
+
+  /* SP regenerieren sie nich ganz so schnell, dafuer sind sie
+   * ein bischen schneller bei Gift und Futter */
+  SetProp(P_SP_DELAY,HEAL_DELAY+1);
+  SetProp(P_POISON_DELAY,POISON_DELAY-1);
+  SetProp(P_FOOD_DELAY,FOOD_DELAY-1);
+
+  SetProp(P_MAGIC_RESISTANCE_OFFSET,
+          ([ MT_ANGRIFF : 500,
+        	   MT_ILLUSION : -250,
+             MT_BEHERRSCHUNG : -250,
+        	   MT_VERWANDLUNG : 500 ]));
+
+
+  if(!(res=QueryProp(P_HANDS)) || !pointerp(res) || (sizeof(res)<3))
+    res=({" mit starken Haenden",35,({DT_BLUDGEON, DT_RIP}) });
+  SetProp(P_HANDS,res);
+  /* Orks haben dicke Haut */
+  SetProp(P_BODY,20);
+
+  /* Groesse wird nur einmal gesetzt */
+  if(!QueryProp(P_SIZE)){
+    SetProp(P_SIZE,180+random(31));
+    Set(P_SIZE,SAVE,F_MODE_AS);
+  }
+
+  /* Dito Gewicht */
+  if(!QueryProp(P_WEIGHT) || (QueryProp(P_WEIGHT) == 75000)){
+    SetProp(P_WEIGHT,100000+random(25001)+random(25001));
+    Set(P_WEIGHT,SAVE,F_MODE_AS);
+  }
+}
+
+string 
+_query_race() {
+  return "Ork";
+}
+
+string 
+_query_real_race() {
+  return "Ork";
+}
+
+string 
+_query_racedescr() {
+  return break_string("Ein Ork. Die brutale Macht des Boesen. Ein "
+      "erbitterter Kaempfer, ohne Furcht vor dem Tod. So stellst Du "
+      "Dir einen Ork vor.\nDiese Orks sehen vielleicht ausserlich so "
+      "aus: Eine dicke und dunkle, lederartige Haut, die sicher "
+      "einiges an Schlaegen abhaelt. Lange Eckzaehne, die sicher boese "
+      "Wunden reissen koennen.\nDu spuerst, dass diese Orks hier ein "
+      "wenig anders sind. Ihren Drang nach dem Blut ihrer Feinde scheinen "
+      "sie recht gut unter Kontrolle zu haben, die meiste Zeit zumindest. "
+      "Sie sind in der Lage, friedlich zwischen den anderen Rassen zu "
+      "wandeln. Dennoch sind vor allem die Uruk-Hai Orks als Gegner nicht "
+      "zu unterschaetzen, sollte es doch einmal zu einem Kampf kommen.",
+      78,0,BS_LEAVE_MY_LFS);
+}
+
+int 
+QueryAllowSelect() { 
+  return 1; 
+}
+
+string 
+*_query_racestring() {
+  if (QueryProp(P_GENDER)==FEMALE)
+    return ({"Orkin","Orkin","Orkin","Orkin"});
+  return ({"Ork","Orkes","Ork","Ork"});
+}
+
+string 
+_query_default_guild(){
+  return "urukhai";
+}
+
+mixed 
+RaceDefault(string arg) {
+  if (!arg)
+    return 0;
+  switch(arg) {
+    case P_HANDS :
+      return ({" mit starken Haenden",35,({DT_BLUDGEON,DT_RIP}) });
+    case P_BODY :
+      return 25;
+  }
+  return base::RaceDefault(arg);
+}
+
+protected void heart_beat() {
+  ::heart_beat();
+
+  if(f_cnt > 0 && !--f_deg) {
+    f_cnt--;
+    f_deg=F_DEG;
+  }
+}
+
+void
+Attack(object enemy) {
+  if(f_cnt > 0)
+    f_cnt--;
+  return ::Attack(enemy);
+}
+
+varargs int 
+_examine(string str, int mode) {
+
+  if(++f_cnt > F_MAX) {
+    tell_object(this_object(),break_string(NO_EXAMINE[random(sizeof(NO_EXAMINE))],78));
+    return 1;
+  }
+  return ::_examine(str,mode);
+}
