diff --git a/std/living/std_skills.c b/std/living/std_skills.c
new file mode 100644
index 0000000..d132efc
--- /dev/null
+++ b/std/living/std_skills.c
@@ -0,0 +1,104 @@
+// MorgenGrauen MUDlib
+//
+// living/std_skills.c -- Standardfaehigkeiten
+//
+// $Id: std_skills.c 6673 2008-01-05 20:57:43Z Zesstra $
+#pragma strong_types
+#pragma save_types
+#pragma range_check
+#pragma no_clone
+#pragma pedantic
+
+#define NEED_PROTOTYPES
+#include <living/skills.h>
+#include <living/skill_attributes.h>
+#include <thing/properties.h>
+#include <attributes.h>
+#undef NEED_PROTOTYPES
+#include <properties.h>
+#include <new_skills.h>
+
+#define SIG(x) (x?(x>0?1:-1):0)
+
+protected int StdSkill_Nightvision(object me, string sname, mixed sinfo) {
+  int abil,light,llt,dt,res;
+
+  if (!sinfo || !environment()) return 0;
+  if (intp(sinfo)) sinfo=([SI_SKILLABILITY:sinfo]);
+  if (!mappingp(sinfo)) return 0;
+  if ((light=QueryProp(P_PLAYER_LIGHT))>0) {
+    ModifySkill(sname,([SI_LASTLIGHT:time()]));
+    return light;
+  }
+  abil=sinfo[SI_SKILLABILITY];
+  if (!(llt=sinfo[SI_LASTLIGHT])) {
+    ModifySkill(sname,([SI_LASTLIGHT:time()]));
+    dt=0;
+  } else {
+    dt=time()-llt;
+    if (dt<0) dt=0;
+    if (dt>86400) dt=86400;
+  }
+
+  res=(abil*dt)/(20*MAX_ABILITY)+light;
+  if (res<=0) {
+    res--; // Wert muss !=0 sein
+    if (res<-MAX_ABILITY) res=-MAX_ABILITY;
+  } else {
+    if (res>MAX_ABILITY) res=MAX_ABILITY;
+  }
+  return res;
+}
+
+protected mapping StdSkill_Bihand(object me, string sname, mapping sinfo) {
+  int abil,val;
+
+  // printf("Bihand: %O\n",sinfo);
+  if (!sinfo) return 0;
+  abil=sinfo[SI_SKILLABILITY];
+  val=(abil*(QueryAttribute(A_STR)+33))/MAX_ABILITY;
+  val=(val*QuerySkillAttribute(SA_DAMAGE))/100;
+  sinfo[SI_SKILLDAMAGE]+=val;
+  // + max. 53
+  return sinfo;
+}
+
+protected mapping StdSkill_Fight_sword(object me, string sname, mapping sinfo) {
+  int abil,asig,val;
+
+  abil=sinfo[SI_SKILLABILITY];asig=SIG(abil);
+  val=(abil*(QueryAttribute(A_STR) +
+             QueryAttribute(A_DEX)*asig +
+             33))/MAX_ABILITY;
+  val=(val*QuerySkillAttribute(SA_DAMAGE))/100;
+  sinfo[SI_SKILLDAMAGE]+=val;
+  // + max. 73
+  return sinfo;
+}
+
+protected mapping StdSkill_Fight_hands(object me, string sname, mapping sinfo) {
+  int abil,asig,val;
+
+  if (!sinfo) return 0;
+  abil=sinfo[SI_SKILLABILITY];asig=SIG(abil);
+  val=(abil*(QueryAttribute(A_STR) +
+             QueryAttribute(A_DEX)*3*asig +
+             100))/MAX_ABILITY;
+  val=(val*QuerySkillAttribute(SA_DAMAGE))/100;
+  sinfo[SI_SKILLDAMAGE]+=val;
+  // + max. 180
+  return sinfo;
+}
+
+protected int StdSkill_Booze(object me, string sname, mapping sinfo) {
+  int abil,val;
+
+  val=0;
+  if (!sinfo || (val=sinfo[SI_SKILLARG])<=0)
+    return val;
+  abil=sinfo[SI_SKILLABILITY];
+  val-=(val*abil)/(MAX_ABILITY+2500); // Bis zu 80% Abzug bei Alkoholikern.
+  if (val<=0) val=1;
+  return val;
+}
+
