diff --git a/secure/lepmaster.c b/secure/lepmaster.c
new file mode 100644
index 0000000..3d7cb79
--- /dev/null
+++ b/secure/lepmaster.c
@@ -0,0 +1,408 @@
+// MorgenGrauen MUDlib
+//
+// lepmaster.c -- Master, welcher aus scoremaster, explorationmaster,
+//                questmaster und dem Spielerobjekt Informationen
+//                ausliest und aus diesen die Levelpunkte des Spieler
+//                berechnet
+//                Weiters derjenige, der die Seheranforderungen 
+//                prueft. 
+//
+// $Id: lepmaster.c 9168 2015-03-05 00:04:22Z Zesstra $
+
+// Hier kommen Funktionen fuer die Levelpunkte
+#pragma strict_types
+#pragma no_clone
+#pragma no_shadow
+#pragma no_inherit
+#pragma verbose_errors
+#pragma combine_strings
+//#pragma pedantic
+//#pragma range_check
+#pragma warn_deprecated
+
+#include <config.h>
+#include <properties.h>
+#include <new_skills.h>
+#include <exploration.h>
+#include <questmaster.h>
+#include <scoremaster.h>
+#include <wizlevels.h>
+
+#include "lepmaster.h"
+
+// Das Programm zur Foerderung der kleinen Level aktivieren. ;-)
+#define __PFOERKL__ 1
+
+// die ersten 8 Level, d.h. Level 1 bis 8 entsprechen diesen LEPs.
+int *LOW_LEVEL_LEP_LIST = ({100,120,140,180,220,300,360,420}); // 9. Level: 500 LEP
+
+#define REQ_TEXT1  ([0:"unglaublich viel", \
+                  1:"unglaublich viel", \
+		  2:"enorm viel", \
+		  3:"sehr viel", \
+		  4:"viel", \
+		  5:"einiges", \
+		  6:"etwas", \
+		  7:"wenig", \
+                  8:"sehr wenig", \
+                  9:"kaum etwas" ])
+
+#define REQ_TEXT2  ([0:"unglaublich viele", \
+                  1:"unglaublich viele", \
+		  2:"enorm viele", \
+		  3:"sehr viele", \
+		  4:"viele", \
+		  5:"einige", \
+		  6:"ein paar", \
+		  7:"wenige", \
+                  8:"sehr wenige", \
+                  9:"kaum" ])
+
+#define DEBUG(x,y)
+//#define DEBUG(x,y) if (find_player("zook")) tell_object(find_player("zook"),sprintf(x,y))
+
+
+void create()
+{
+  seteuid(getuid());
+}
+
+int QueryLEPForPlayer(object pl)
+{
+  int ret, val, i, l;
+
+  if (extern_call() && !IS_ARCH(geteuid(previous_object())))
+    return -1;
+  if (!pl || !query_once_interactive(pl))
+    return -2;
+
+  //  Grundoffset 100, da man mit Level 1 statt 0 startet
+  ret = 100;
+
+  // Beitrag A: Stupse von NPC-Erstkills
+  ret += (int)SCOREMASTER->QueryKillPoints(pl);
+
+  DEBUG("Nach KP: ret = %d\n", ret);
+
+  // Beitrag B: Stupse von geloesten Miniquests
+  ret += (int)QM->QueryMiniQuestPoints(pl);
+
+  DEBUG("Nach MQP: ret = %d\n", ret);
+
+  // Beitrag C: Questpunkte
+  //  werden 1:1 uebernommen;
+  ret += (int)pl->QueryProp(P_QP);
+
+  DEBUG("Nach QP: ret = %d\n", ret);
+
+  // Beitrag D: Erfahrungspunkte
+  //  Stupse = XPs ^ 0.32
+  val = (int)pl->QueryProp(P_XP);
+
+  if (val<1) l=0;
+  else l=to_int(exp(log(to_float(val))*0.32));
+
+  ret += l;
+
+  DEBUG("Nach XP: ret = %d\n", ret);
+
+  // Beitrag E: Zaubertraenke
+  //  Gefundene Traenke geben 5 LEP
+  //  Die Heiltraenke geben zusaetzlich 10+20+30+40 LEP
+  i = 80 - (val = sizeof((int *)pl->QueryProp(P_POTIONROOMS)));
+
+  ret += 5*i + ([ 0: 100, 1: 60, 2: 30, 3: 10])[val];
+
+  // Beitrag F: Forscherpunkte
+  //  Pro FP gibt es 6 Stufenpunkte
+  ret += 6 * (int)EPMASTER->QueryExplorationPoints(pl);
+
+  DEBUG("Nach FP: ret = %d\n", ret);
+
+  // Beitrag G: Gildeneinstufung
+  //  Maximale Gildeneinstufung (10000) entspricht vier Leveln
+  ret += ((int)pl->QueryProp(P_GUILD_RATING))/25;
+
+  DEBUG("Nach GR: ret = %d\n", ret);
+
+  // Ausgabe gibt es nur in 20er-Schritten
+  ret -= ret%20;
+
+  return (ret > 100) ? ret : 100;
+
+}
+
+nomask int QueryLEP()
+{
+  if (!previous_object())
+    return 0;
+  return QueryLEPForPlayer(previous_object());
+}
+
+nomask int QueryLevel(int lep) {
+  if (lep<=0)
+    lep=QueryLEP();
+
+  if (lep<=0)
+    return 0;
+
+#ifdef __PFOERKL__
+  // normale Level alle 100 LEP
+  if (lep >= 500)
+    return lep/100 + 4;
+  else {
+    // level mit weniger LEP am Anfang (1-8)
+    // Level aus der LOW_LEVEL_LEP_LIST raussuchen.
+    int lev = sizeof(LOW_LEVEL_LEP_LIST) - 1;
+    for ( ; lev >= 0; --lev) {
+      if (LOW_LEVEL_LEP_LIST[lev] <= lep)
+        break;  // gefunden
+    }
+    return lev+1;
+  }
+#else
+  return lep/100;
+#endif // __PFOERKL__
+  return 0;
+}
+
+// Wieviele LEP fehlen zum naechsten Level?
+nomask int QueryNextLevelLEP(int lvl, int lep) {
+  int needed;
+
+  if (QueryLevel(lep) > lvl)
+    return 0;
+
+#ifdef __PFOERKL__
+  if (lvl < sizeof(LOW_LEVEL_LEP_LIST))
+    needed = LOW_LEVEL_LEP_LIST[lvl];
+  else
+    needed = (lvl-3) * 100; // (lvl + 1 - 4) * 100
+#else
+  needed = (lvl+1) * 100;
+#endif // __PFOERKL__
+
+  // needed sind jetzt die insgesamt benoetigten LEP. Vorhandene abziehen.
+  needed -= lep;
+  // nix < 0 zurueckliefern
+  return max(needed,0);
+}
+
+string QueryForschung()
+{
+  int max, my, avg;
+  string ret;
+
+  if ((my=(int)EPMASTER->QueryExplorationPoints(getuid(previous_object()))) < MIN_EP)
+    return "Du kennst Dich im "MUDNAME" so gut wie gar nicht aus.\n";
+
+  my *= 100;
+  max = my/(int)EPMASTER->QueryMaxEP();
+  avg = my/(int)EPMASTER->QueryAverage();
+
+  ret = "Verglichen mit Deinen Mitspielern, kennst Du Dich im "MUDNAME" ";
+  switch(avg) {
+  case 0..10:
+    ret += "kaum";
+    break;
+  case 11..40:
+    ret += "aeusserst schlecht";
+    break;
+  case 41..56:
+    ret += "sehr schlecht";
+    break;
+  case 57..72:
+    ret += "schlecht";
+    break;
+  case 73..93:
+    ret += "unterdurchschnittlich";
+    break;
+  case 94..109:
+    ret += "durchschnittlich gut";
+    break;
+  case 110..125:
+    ret += "besser als der Durchschnitt";
+    break;
+  case 126..145:
+    ret += "recht gut";
+    break;
+  case 146..170:
+    ret += "ziemlich gut";
+    break;
+  case 171..210:
+    ret += "gut";
+    break;
+  case 211..300:
+    ret += "sehr gut";
+    break;
+  case 301..400:
+    ret += "ausserordentlich gut";
+    break;
+  case 401..500:
+    ret += "unheimlich gut";
+    break;
+  default:
+    ret += "einfach hervorragend";
+    break;
+  }
+  ret += " aus.\nAbsolut gesehen ";
+
+  switch(max) {
+  case 0..5:
+    ret += "kennst Du nur wenig vom "MUDNAME".";
+    break;
+  case 6..10:
+    ret += "solltest Du Dich vielleicht noch genauer umsehen.";
+    break;
+  case 11..17:
+    ret += "bist Du durchaus schon herumgekommen.";
+    break;
+  case 18..25:
+    ret += "hast Du schon einiges gesehen.";
+    break;
+  case 26..35:
+    ret += "bist Du schon weit herumgekommen.";
+    break;
+  case 36..50:
+    ret += "koenntest Du eigentlich einen Reisefuehrer herausbringen.";
+    break;
+  case 51..75:
+    ret += "hast Du schon sehr viel gesehen.";
+    break;
+  default:
+    ret += "besitzt Du eine hervorragende Ortskenntnis.";
+  }
+  return break_string(ret, 78, 0, 1);
+}
+
+
+nomask mixed QueryWizardRequirements(object player)
+{
+  // Diese Funktion gibt ein 2-elementiges Array zurueck, in dem im ersten
+  // Element steht, ob der Spieler Seher werden kann (1) oder
+  // nicht (0) und im zweiten Element steht, was genau ihm noch 
+  // fehlt. 
+  // Fehlercode ist ({-1, ""})
+
+  // Die Umrechnungsfaktoren wurden einfach aus QueryLEP uebernommen; ggf.
+  // kann man das einmal in Unterfunktionen auslagern. 
+
+  mixed ret;
+  string s; 
+  int i,z,val; 
+
+  ret = ({-1, "Hier ist etwas schief gelaufen. Bitte einen Erzmagier\n"
+	    +"benachrichtigen.\n"});
+  s = "";
+  i = 0; 
+
+  if(!player || !objectp(player))
+    player=(this_player()?this_player():this_interactive());
+
+  if(!player)
+    return ({-1,""});
+
+  DEBUG("Es geht um: %O\n", player);
+
+  // Abenteuerpunkte
+  DEBUG("Abenteuerpunkte: %d ("+REQ_QP+")\n", player->QueryProp(P_QP));
+  if (player->QueryProp(P_QP) < REQ_QP) {
+    s += sprintf(" * Dir fehlen noch mindestens %d Abenteuerpunkte.\n", 
+		 REQ_QP - (int)player->QueryProp(P_QP));
+    i--;
+  }
+
+  // Forscherpunkte
+  z = 6 * (int)EPMASTER->QueryExplorationPoints(player);
+  DEBUG("Forscherpunkte: %d ("+REQ_EP+")\n", z);
+  if (z < REQ_EP) {
+    s += sprintf(" * Du kennst Dich im "MUDNAME" noch nicht genug aus, "
+		 +"genau genommen\n   musst Du Dir noch %s ansehen.\n", 
+		 REQ_TEXT1[(z*10/REQ_EP)] );
+    i--;
+  }
+
+  // Zaubertraenke
+  z = 80 - (val = sizeof((int*)player->QueryProp(P_POTIONROOMS)));
+  z = z*5 + ([0:100, 1:60, 2:30, 3:10])[val];
+  DEBUG("Zaubertraenke: %d ("+REQ_P+")\n", z);
+  if (z < REQ_P) {
+    s += sprintf(" * Du musst noch einige Zaubertraenke (ca. %d) suchen.\n",
+		 (REQ_P - z)/5 );
+    i--;
+  }
+
+  // Erstkills
+  z = (int)SCOREMASTER->QueryKillPoints(player);
+  DEBUG("Erstkills: %d ("+REQ_K+")\n", z);
+  if (z < REQ_K) {
+        s += sprintf(" * Du hast noch nicht genuegend wuerdige Gegner erlegt, genau "
+    	 +"genommen\n   musst Du noch %s wuerdige Monster toeten.\n",
+    	 REQ_TEXT2[(z*10/REQ_K)] );;
+    i--;
+  }
+
+  int minlevel = QueryLevel(REQ_LEP);
+
+  // Restliche Stufenpunkte 
+  DEBUG("Stufenpunkte: %d ("+REQ_LEP+")\n", player->QueryProp(P_LEP));
+  if ((int)(player->QueryProp(P_LEP)) < REQ_LEP) {
+    s += sprintf(" * Du musst mindestens %d Stufenpunkte, entspricht Stufe %d, "
+        "erreichen.\n", REQ_LEP, minlevel);
+    i--;
+  }
+  
+  // Demnach mindestens REQ/100-Level 
+  DEBUG("Level: %d ("+REQ_LEP/100+")\n", player->QueryProp(P_LEVEL));
+  if ((int)player->QueryProp(P_LEVEL) < minlevel) {
+    s += sprintf(" * Du musst mindestens Stufe %d erreichen.\n", minlevel);
+    i--;
+  }
+  
+  if(i<0) {
+    ret = ({-1, 
+	 sprintf("Du hast noch nicht alle Seher-Anforderungen erfuellt.\n"
+		+"Im einzelnen fehlt Dir folgendes:\n\n%s\n"
+		 +break_string("Falls Du Dir nun dennoch unsicher bist, "
+  +"welche Anforderungen Du erfuellen musst, dann "
+  +"schaue bei 'hilfe seher' und 'hilfe stufenpunkte' doch einfach noch "
+  +"einmal nach. Sind dann "
+  +"immer noch Dinge offen oder unklar, so sprich einfach einen "
+				  +"der Erzmagier an.", 78,0,1),s) });
+  } 
+    
+  if (i==0) {
+    ret = ({1, break_string(
+	       "Du hast alle Seher-Anforderungen erfuellt. Wende Dich doch "
+	       +"einmal an Merlin und frage ihn, ob er Dich befoerdert.", 
+	       78,0,1) });
+  }
+
+  return ret; 
+}
+
+nomask int QueryReadyForWiz(object player)
+{
+  mixed r;
+  
+  r = QueryWizardRequirements(player);
+  
+  if (!pointerp(r) && sizeof(r)!=2 && !intp(r[0]))
+    return -1;
+
+  return r[0];
+}
+
+nomask string QueryReadyForWizText(object player)
+{
+  mixed r;
+
+  r = QueryWizardRequirements(player);
+
+  if (!pointerp(r) && sizeof(r)!=2 && !stringp(r[1]))
+    return "Hier ist etwas schief gegangen, bitte verstaendige einen "
+      +"Erzmagier.";
+
+  return r[1];
+}
+
