diff --git a/res/eressea/races.xml b/res/eressea/races.xml
index 69eda95..804b7e8 100644
--- a/res/eressea/races.xml
+++ b/res/eressea/races.xml
@@ -1172,7 +1172,7 @@
     <familiar race="wolf"/>
     <familiar race="rat"/>
   </race>
-  <race name="orc" magres="-5" maxaura="1.000000" regaura="1.000000" recruitcost="70" maintenance="10" weight="1000" capacity="540" speed="1.000000" hp="24" damage="1d5" unarmedattack="-2" unarmeddefense="-2" playerrace="yes" walk="yes" giveperson="yes" giveunit="yes" getitem="yes" equipment="yes">
+  <race name="orc" studyspeed="-5" magres="-5" maxaura="1.000000" regaura="1.000000" recruitcost="70" maintenance="10" weight="1000" capacity="540" speed="1.000000" hp="24" damage="1d5" unarmedattack="-2" unarmeddefense="-2" playerrace="yes" walk="yes" giveperson="yes" giveunit="yes" getitem="yes" equipment="yes">
     <ai splitsize="10000" moverandom="yes" learn="yes"/>
     <param name="recruit_multi" value="0.5"/>
     <skill name="alchemy" modifier="1"/>
diff --git a/res/races/orc.xml b/res/races/orc.xml
index 4f4d96e..a003375 100644
--- a/res/races/orc.xml
+++ b/res/races/orc.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" ?>
-<race name="orc" magres="-5" maxaura="1.000000" regaura="1.000000" recruitcost="70" maintenance="10" weight="1000" capacity="540" speed="1.000000" hp="24" damage="1d5" unarmedattack="-2" unarmeddefense="-2" playerrace="yes" walk="yes" giveperson="yes" giveunit="yes" getitem="yes" equipment="yes">
+<race name="orc" studyspeed="-5" magres="-5" maxaura="1.000000" regaura="1.000000" recruitcost="70" maintenance="10" weight="1000" capacity="540" speed="1.000000" hp="24" damage="1d5" unarmedattack="-2" unarmeddefense="-2" playerrace="yes" walk="yes" giveperson="yes" giveunit="yes" getitem="yes" equipment="yes">
     <ai splitsize="10000" moverandom="yes" learn="yes"/>
     <param name="recruit_multi" value="0.5"/>
     <skill name="alchemy" modifier="1"/>
diff --git a/src/battle.c b/src/battle.c
index 343bd75..568e810 100644
--- a/src/battle.c
+++ b/src/battle.c
@@ -958,12 +958,12 @@ void drain_exp(struct unit *u, int n)
         skill *sv = unit_skill(u, sk);
         if (sv) {
             while (n > 0) {
-                if (n >= 30 * u->number) {
+                if (n >= STUDYDAYS * u->number) {
                     reduce_skill(u, sv, 1);
-                    n -= 30;
+                    n -= STUDYDAYS;
                 }
                 else {
-                    if (rng_int() % (30 * u->number) < n)
+                    if (rng_int() % (STUDYDAYS * u->number) < n)
                         reduce_skill(u, sv, 1);
                     n = 0;
                 }
diff --git a/src/kernel/skills.c b/src/kernel/skills.c
index b951b77..e6d3723 100644
--- a/src/kernel/skills.c
+++ b/src/kernel/skills.c
@@ -153,7 +153,7 @@ int rc_skillmod(const struct race *rc, const region * r, skill_t sk)
 
 int level_days(int level)
 {
-    return 30 * ((level + 1) * level / 2);
+    return STUDYDAYS * ((level + 1) * level / 2);
 }
 
 int level(int days)
diff --git a/src/kernel/xmlreader.c b/src/kernel/xmlreader.c
index a9d3879..423f166 100644
--- a/src/kernel/xmlreader.c
+++ b/src/kernel/xmlreader.c
@@ -1320,6 +1320,12 @@ static void parse_ai(race * rc, xmlNodePtr node)
         rc->flags |= RCF_ATTACK_MOVED;
 }
 
+static void set_study_speed(race *rc, skill_t sk, int modifier){
+    if (!rc->study_speed)
+        rc->study_speed = calloc(1, MAXSKILLS);
+    rc->study_speed[sk] = (char)modifier;
+}
+
 static int parse_races(xmlDocPtr doc)
 {
     xmlXPathContextPtr xpath = xmlXPathNewContext(doc);
@@ -1338,6 +1344,7 @@ static int parse_races(xmlDocPtr doc)
         xmlXPathObjectPtr result;
         int k, study_speed_base, attacks;
         struct att *attack;
+        skill_t sk;
 
         propValue = xmlGetProp(node, BAD_CAST "name");
         assert(propValue != NULL);
@@ -1467,11 +1474,15 @@ static int parse_races(xmlDocPtr doc)
         xpath->node = node;
         result = xmlXPathEvalExpression(BAD_CAST "skill", xpath);
         memset(rc->bonus, 0, sizeof(rc->bonus));
+        if (study_speed_base != 0) {
+          for (sk = 0; sk < MAXSKILLS; ++sk) {
+            set_study_speed(rc, sk, study_speed_base);
+          }
+        }
         for (k = 0; k != result->nodesetval->nodeNr; ++k) {
             xmlNodePtr node = result->nodesetval->nodeTab[k];
             int mod = xml_ivalue(node, "modifier", 0);
             int speed = xml_ivalue(node, "speed", study_speed_base);
-            skill_t sk;
 
             propValue = xmlGetProp(node, BAD_CAST "name");
             assert(propValue != NULL);
@@ -1479,9 +1490,7 @@ static int parse_races(xmlDocPtr doc)
             if (sk != NOSKILL) {
                 rc->bonus[sk] = (char)mod;
                 if (speed) {
-                    if (!rc->study_speed)
-                        rc->study_speed = calloc(1, MAXSKILLS);
-                    rc->study_speed[sk] = (char)speed;
+                    set_study_speed(rc, sk, speed);
                 }
             }
             else {
diff --git a/src/study.c b/src/study.c
index 9ea0a86..f05e1a9 100644
--- a/src/study.c
+++ b/src/study.c
@@ -176,13 +176,13 @@ const attrib_type at_learning = {
 
 static int study_days(unit * student, skill_t sk)
 {
-    int speed = 30;
+    int speed = STUDYDAYS;
     if (u_race(student)->study_speed) {
         speed += u_race(student)->study_speed[sk];
-        if (speed < 30) {
+        if (speed < STUDYDAYS) {
             skill *sv = unit_skill(student, sk);
             if (sv == 0) {
-                speed = 30;
+                speed = STUDYDAYS;
             }
         }
     }
@@ -209,7 +209,7 @@ teach_unit(unit * teacher, unit * student, int nteaching, skill_t sk,
         return 0;
     }
 
-    n = 30 * student->number;
+    n = STUDYDAYS * student->number;
     a = a_find(student->attribs, &at_learning);
     if (a != NULL) {
         teach = (teaching_info *)a->data.v;
@@ -231,7 +231,7 @@ teach_unit(unit * teacher, unit * student, int nteaching, skill_t sk,
              * Student auch in unterschiedlichen Gebaeuden stehen duerfen */
             if (academy_can_teach(teacher, student, sk)) {
                 /* Jeder Schueler zusaetzlich +10 Tage wenn in Uni. */
-                teach->value += (n / 30) * 10;  /* learning erhoehen */
+                teach->value += (n / STUDYDAYS) * EXPERIENCEDAYS;  /* learning erhoehen */
                                                 /* Lehrer zusaetzlich +1 Tag pro Schueler. */
                 if (academy) {
                     *academy += n;
@@ -268,7 +268,7 @@ teach_unit(unit * teacher, unit * student, int nteaching, skill_t sk,
          * die Talentaenderung (enno).
          */
 
-        nteaching = MAX(0, nteaching - student->number * 30);
+        nteaching = MAX(0, nteaching - student->number * STUDYDAYS);
 
     }
     return n;
@@ -301,14 +301,14 @@ int teach_cmd(unit * u, struct order *ord)
         return 0;
     }
 
-    teaching = u->number * 30 * TEACHNUMBER;
+    teaching = u->number * STUDYDAYS * TEACHNUMBER;
 
     if ((i = get_effect(u, oldpotiontype[P_FOOL])) > 0) { /* Trank "Dumpfbackenbrot" */
         i = MIN(i, u->number * TEACHNUMBER);
         /* Trank wirkt pro Schueler, nicht pro Lehrer */
-        teaching -= i * 30;
+        teaching -= i * STUDYDAYS;
         change_effect(u, oldpotiontype[P_FOOL], -i);
-        j = teaching / 30;
+        j = teaching / STUDYDAYS;
         ADDMSG(&u->faction->msgs, msg_message("teachdumb", "teacher amount", u, j));
     }
     if (teaching == 0)
@@ -747,12 +747,12 @@ int study_cmd(unit * u, order * ord)
 
     if (get_effect(u, oldpotiontype[P_WISE])) {
         l = MIN(u->number, get_effect(u, oldpotiontype[P_WISE]));
-        teach->value += l * 10;
+        teach->value += l * EXPERIENCEDAYS;
         change_effect(u, oldpotiontype[P_WISE], -l);
     }
     if (get_effect(u, oldpotiontype[P_FOOL])) {
         l = MIN(u->number, get_effect(u, oldpotiontype[P_FOOL]));
-        teach->value -= l * 30;
+        teach->value -= l * STUDYDAYS;
         change_effect(u, oldpotiontype[P_FOOL], -l);
     }
 
@@ -761,11 +761,11 @@ int study_cmd(unit * u, order * ord)
         /* p ist Kosten ohne Uni, studycost mit; wenn
          * p!=studycost, ist die Einheit zwangsweise
          * in einer Uni */
-        teach->value += u->number * 10;
+        teach->value += u->number * EXPERIENCEDAYS;
     }
 
     if (is_cursed(r->attribs, C_BADLEARN, 0)) {
-        teach->value -= u->number * 10;
+        teach->value -= u->number * EXPERIENCEDAYS;
     }
 
     multi *= study_speedup(u, sk, speed_rule);
@@ -828,7 +828,7 @@ int study_cmd(unit * u, order * ord)
 static int produceexp_days(void) {
     static int config, rule;
     if (config_changed(&config)) {
-        rule = config_get_int("study.produceexp", 10);
+        rule = config_get_int("study.produceexp", EXPERIENCEDAYS);
     }
     return rule;
 }
diff --git a/src/study.h b/src/study.h
index 0f8ae70..8362f7c 100644
--- a/src/study.h
+++ b/src/study.h
@@ -39,6 +39,7 @@ extern "C" {
     typedef void(*learn_fun)(struct unit *u, skill_t sk, int days);
 
 #define STUDYDAYS 30
+#define EXPERIENCEDAYS 10
     void learn_skill(struct unit *u, skill_t sk, int days);
 
     void produceexp(struct unit *u, skill_t sk, int n);
