diff --git a/std/restriction_checker.c b/std/restriction_checker.c
new file mode 100644
index 0000000..f2d4248
--- /dev/null
+++ b/std/restriction_checker.c
@@ -0,0 +1,323 @@
+// MorgenGrauen MUDlib
+//
+// restriction_checker.c -- Beschraenkungen in Gilden, Spells und Skills
+//
+// $Id: restriction_checker.c 8754 2014-04-26 13:12:58Z Zesstra $
+#pragma strong_types
+#pragma save_types
+#pragma no_clone
+#pragma pedantic
+//#pragma range_check
+#pragma no_shadow
+
+inherit "/std/util/executer";
+
+#define NEED_PROTOTYPES
+#include <thing/properties.h>
+#include <properties.h>
+#include <new_skills.h>
+#include <wizlevels.h>
+#include <questmaster.h>
+
+#define DEBUG(x) if (find_player("zesstra")) tell_object(find_player("zesstra"),x)
+
+// erweitert um das <pl> argument und die extra-Argument, die bereits in <fun>
+// angegeben wurden. (*grummel*)
+protected mixed execute_anything(mixed fun, object pl, varargs mixed args)
+{
+  //DEBUG(sprintf("ex_any(): Fun: %O, Ob: %O, args: %O\n",fun,pl,args));
+  // wenn in fun schon extraargumente stehen, dann pl einfuegen und args
+  // dranhaengen.
+  if (pointerp(fun) && sizeof(fun) > 2)
+  {
+    // args kann ({}) sein, wenn keine Extraargumente uebergeben wurden, macht
+    // aber nix.
+    args = ({pl}) + fun[2..] + args;
+    fun = fun[0..1];
+    return ::execute_anything(fun, args...);
+  }
+  // s.o.
+  return ::execute_anything(fun, pl, args...);
+}
+
+mapping race_modifier(object pl, mapping map_ldfied) {
+  mapping rmap,help;
+
+  if (mappingp(map_ldfied) && member(map_ldfied,SM_RACE) && objectp(pl) &&
+      mappingp(rmap=map_ldfied[SM_RACE]))
+//    if (mappingp(help=rmap[pl->_query_real_race()]))
+    if (mappingp(help=rmap[pl->QueryProp(P_REAL_RACE)]))
+        return map_ldfied+help;
+    else if(member(rmap,"*") && mappingp(help=rmap["*"]))
+        return map_ldfied+help;
+  return map_ldfied;
+}
+
+string
+check_restrictions(object pl, mapping restr) {
+  /* Folgende Einschraenkungen koennen geprueft werden:
+   * - Mindestwerte bei allen Attributen und Properties Level, QP, XP
+   * - bestimmte Rassen koennen ausgeschlossen werden bzw. erlaubt werden
+   *   (SR_EXCLUDE_RACE ist ein Array von ausgeschlossenen Rassen,
+   *    SR_INCLUDE_RACE eines mit eingeschlossenen)
+   * - SR_RACE kann ein Mapping sein, dass Rassen ein eigenes
+   *   Restriction-mapping zuordnet. "*" steht fuer alle anderen Rassen.
+   */
+  closure cl,cl2;
+  string race, guild;
+
+  if (!mappingp(restr) || !sizeof(restr)) return 0; // Keine Einschraenkungen
+  if (!objectp(pl)) return "";
+  if (pl->QueryDisguise())
+    return "Zieh erst mal den Tarnhelm aus.\n";
+
+  restr=race_modifier(&pl,&restr);
+
+  cl=symbol_function("QueryProp",pl);
+  cl2=symbol_function("QueryAttribute",pl);
+
+  foreach(string to_check, mixed condition: restr)
+  {
+    switch(to_check)
+    {
+      case P_LEVEL:
+        if (funcall(cl,P_LEVEL) < condition)
+          return "Deine Stufe reicht dafuer nicht aus.\n";
+        break;
+      case P_GUILD_LEVEL:
+        if (funcall(cl,P_GUILD_LEVEL) < condition)
+          return "Deine Gildenstufe reicht dafuer nicht aus.\n";
+        break;
+      case SR_SEER: // das macht nun wahrlich nur bei interactives sinn!!!
+        if (condition && query_once_interactive(pl) && !IS_SEER(pl))
+          return "Du musst dazu erst Seher werden.\n";
+        break;
+      case P_XP:
+        if (funcall(cl,P_XP) < condition)
+          return "Du hast nicht genuegend Erfahrung dafuer.\n";
+        break;
+      case P_QP:
+        if (funcall(cl,P_QP) < condition)
+          return "Du hast nicht genuegend Aufgaben geloest.\n";
+        break;
+      case P_ALCOHOL:
+        if (funcall(cl,P_ALCOHOL) >= condition)
+          return "Du bist zu besoffen.\n";
+        break;
+      case P_DRINK:
+        if (funcall(cl,P_DRINK) >= condition)
+          return "Du hast zuviel getrunken.\n";
+        break;
+      case P_FOOD:
+        if (funcall(cl,P_FOOD) >= condition)
+          return "Du hast zuviel gegessen.\n";
+        break;
+      case P_DEAF:
+        if (funcall(cl,P_DEAF))
+          return "Du kannst nichts hoeren.\n";
+        break;
+      case P_BLIND:
+        if (funcall(cl,P_BLIND))
+          return "Du kannst nichts sehen.\n";
+        break;
+      case P_FROG:
+        if (funcall(cl,P_FROG))
+          return "Als Frosch kannst Du das leider nicht.\n";
+        break;
+      case A_INT:
+        if (funcall(cl2,A_INT) < condition)
+          return "Deine Intelligenz reicht dafuer nicht aus.\n";
+        break;
+      case A_DEX:
+        if (funcall(cl2,A_DEX) < condition)
+          return "Deine Geschicklichkeit reicht dafuer nicht aus.\n";
+        break;
+      case A_CON:
+        if (funcall(cl2,A_CON) < condition)
+          return "Deine Ausdauer reicht dafuer nicht aus.\n";
+        break;
+      case A_STR:
+        if (funcall(cl2,A_STR) < condition)
+          return "Deine Staerke reicht dafuer nicht aus.\n";
+        break;
+      case SR_BAD:
+        if (funcall(cl,P_ALIGN) < condition)
+          return "Du bist zu boese.\n";
+        break;
+      case SR_GOOD:
+        if (funcall(cl,P_ALIGN) > condition)
+          return "Du bist nicht boese genug.\n";
+        break;
+      case SR_MIN_SIZE:
+        if (funcall(cl,P_SIZE) < condition)
+          return "Du bist dafuer zu klein.\n";
+        break;
+      case SR_MAX_SIZE:
+        if (funcall(cl,P_SIZE) > condition)
+          return "Du bist dafuer zu gross.\n";
+        break;
+      case SR_FREE_HANDS:
+        if (condition > (funcall(cl,P_MAX_HANDS)-funcall(cl,P_USED_HANDS)))
+          return "Du hast nicht genug freie Haende dafuer.\n";
+        break;
+      case SR_EXCLUDE_RACE:
+        if (IS_LEARNER(pl))
+          race=funcall(cl,P_RACE);
+        else
+          race=funcall(cl,P_REAL_RACE); //race=pl->_query_real_race();
+        if ( pointerp(condition) && member(condition,race)>=0 )
+          return ("Als "+race+" kannst Du das nicht.\n");
+        break;
+     case SR_INCLUDE_RACE:
+        if (IS_LEARNER(pl))
+          race=funcall(cl,P_RACE);
+        else
+          race=funcall(cl,P_REAL_RACE); //race=pl->_query_real_race();
+        if (pointerp(condition) && member(condition,race)<0)
+          return ("Als "+race+" kannst Du das nicht.\n");
+        break;
+     case SR_EXCLUDE_GUILD:
+        guild=funcall(cl,P_GUILD);
+        if (pointerp(condition) && member(condition,guild)>=0)
+          return ("Mit Deiner Gildenzugehoerigkeit kannst Du das nicht.\n");
+        break;
+      case SR_INCLUDE_GUILD:
+        guild=funcall(cl,P_GUILD);
+        if (pointerp(condition) && member(condition,guild)<0)
+          return ("Mit Deiner Gildenzugehoerigkeit kannst Du das nicht.\n");
+        break;
+     case SR_FUN:
+        string res=execute_anything(condition, pl);
+        if (stringp(res))
+          return res;
+        break;
+     case SR_PROP:
+        foreach ( string propname, mixed value, string msg: condition ) {
+          if ( funcall(cl, propname) != value )
+            return ( stringp(msg) && sizeof(msg) ? msg :
+              "Koennte es sein, dass Du vergessen hast, etwas zu "
+              "erledigen?\n");
+        }
+        break;
+     case SR_QUEST:
+        if (pointerp(condition))
+        {
+          // geloeste Quests aus der Liste der Bedingungen entfernen
+          condition -= filter(condition, "QueryQuest", pl);
+          if ( sizeof(condition) )
+            return ("Du musst zuerst das Abenteuer '"+condition[0]+
+              "' loesen.\n");
+        }
+        break;
+     case SR_MINIQUEST:
+        if (pointerp(condition))
+        {
+          closure unsolved_MQs = function int (mixed mq_num)
+            { return !(QM)->HasMiniQuest(pl, mq_num); };
+          if ( sizeof(filter(condition, unsolved_MQs)) )
+            return "Du hast eine benoetigte Miniquest noch nicht geloest.\n";
+            // Der Name der MQ wird absichtlich nicht explizit ausgegeben.
+        }
+        break;
+    } // switch
+  } // foreach
+  return 0;
+}
+
+varargs mixed
+GetData(string dname, mapping map_ldfied, object pl) {
+  mixed dat,res;
+
+  if (!dname || !mappingp(map_ldfied)) return 0;
+  if (closurep(dat=map_ldfied[dname]) && (res=funcall(dat,pl,map_ldfied)))
+        return res;
+  return dat;
+
+}
+
+varargs int
+GetValue(string vname, mapping map_ldfied, object pl) {
+  mixed dat,res;
+
+  // printf("GetValue(%O): %O\n",vname,map_ldfied);
+  if (!vname || !map_ldfied) return 0;
+  if ((dat=map_ldfied[vname]) && (res=execute_anything(dat,pl,map_ldfied)))
+        return res;
+  // printf("Value: %O\n",dat);
+  return intp(dat) ? dat : 0;
+}
+
+varargs int
+GetFactor(string fname, mapping map_ldfied, object pl) {
+  mixed res;
+
+  // printf("GetFactor(%O):\n",fname);
+  if (!fname  || !(res=GetValue(FACTOR(fname),map_ldfied,pl)))
+        return 100;
+  if (res<10) res=10;
+  else if (res>1000) res=1000;
+  // printf("Factor: %O\n",res);
+  return res;
+}
+
+varargs int
+GetOffset(string oname, mapping map_ldfied, object pl) {
+  mixed res;
+
+  // printf("GetOffset(%O):\n",oname);
+  if (!oname  || !(res=GetValue(OFFSET(oname),map_ldfied,pl)))
+        return 0;
+  if (res<-10000) res=-10000;
+  else if (res>10000) res=10000;
+  // printf("Offset: %O\n",res);
+  return res;
+}
+
+varargs int
+GetFValue(string vname, mapping map_ldfied, object pl) {
+  return (GetValue(vname,map_ldfied,pl)*GetFactor(vname,map_ldfied,pl))/100;
+}
+
+varargs int
+GetValueO(string vname, mapping map_ldfied, object pl) {
+  return GetValue(vname,map_ldfied,pl)+GetOffset(vname,map_ldfied,pl);
+}
+
+varargs int
+GetFValueO(string vname, mapping map_ldfied, object pl) {
+  return ((GetValue(vname,map_ldfied,pl)*GetFactor(vname,map_ldfied,pl))/100
+                  + GetOffset(vname,map_ldfied,pl));
+}
+
+varargs int
+GetRandFValueO(string vname, mapping map_ldfied, object pl) {
+  return (random(GetValue(vname,map_ldfied,pl)*GetFactor(vname,map_ldfied,pl))/100
+          + GetOffset(vname,map_ldfied,pl));
+}
+
+mapping AddSkillMappings(mapping oldmap, mapping newmap) {
+  mapping res,t1,t2;
+  mixed *inx,ind;
+  int i;
+
+  if (!mappingp(oldmap)) return newmap;
+  if (!mappingp(newmap)) return oldmap;
+  inx=({SI_SKILLRESTR_LEARN,SI_SKILLRESTR_USE,SM_RACE});
+  res=oldmap+newmap;
+  for (i=sizeof(inx);i--;) {
+        ind=inx[i];
+        t1=oldmap[ind];
+        t2=newmap[ind];
+        if (t1) {
+          if (t2)
+                res[ind]=t1+t2;
+          else
+                res[ind]=t1;
+        } else {
+          if (t2)
+                res[ind]=t2;
+        }
+  }
+  return res;
+}
+
