diff --git a/obj/tools/explorer.c b/obj/tools/explorer.c
new file mode 100644
index 0000000..72da8ac
--- /dev/null
+++ b/obj/tools/explorer.c
@@ -0,0 +1,445 @@
+// MorgenGrauen MUDlib
+//
+// explorer.c -- Tool zur FP-Verwaltung
+//
+// $Id: explorer.c 8357 2013-02-09 11:16:14Z Zesstra $
+
+inherit "/std/secure_thing";
+
+#include <properties.h>
+#include <exploration.h>
+#include <wizlevels.h>
+
+create()
+{
+  if (!clonep(this_object())) return;
+  ::create();
+  SetProp(P_SHORT, "Der Erforscher");
+  SetProp(P_NAME, "Erforscher");
+  SetProp(P_GENDER, MALE);
+  SetProp(P_LONG, "Dies ist der beruehmte Erforscher des MorgenGrauens. Er\n"
+	  +"stellt folgende Befehle zur Verfuegung:\n"
+	  +"  epadd <was>: <bonus> <typ> <keys>\n"
+	  +"  epchange <was>: <wie> <neu>\n"
+	  +"  epdel <was>\n"
+	  +"  epinfo <was>\n"
+	  +"  epcount <spielername>                   - Anzahl der EPs des Spielers\n"
+	  +"  epscan <spielername> [filenamenpattern] - Zeige dessen EPs gefiltert an\n"
+	  +"  eppladd <spielername> <ep-anzahl>       - Gib ihm ep-anzahl EPs (zufaellig)\n"
+	  +"  eppldel <spielername> <ep-anzahl>       - Loesche ihm ep-anzahl EPs (zufael.)\n"
+	  +"  epplset <spielername> <ep-nummer>       - Setze ihm EP ep-nummer\n"
+	  +"  epplclr <spielername> <ep-nummer>       - Loesche ihm EP ep-nummer\n"
+	  +"Dabei bedeutet:\n"
+	  +"<was>   - Das Objekt (eine ID bei Objekten in der Naehe, hier oder\n"
+	  +"          here fuer den aktuellen Raum, oder ein Dateiname)\n"
+	  +"<bonus> - n fuer normale EPs, b fuer Bonus-EPs (z.B. Para-EPs)\n"
+	  +"<typ>   - detail, rdetail, exit/ausgang, cmd/befehl/kommando, info, pub, misc,\n"
+	  +"          smell/geruch, sound/noise, taste/touch\n"
+	  +"<key>   - Liste der Schluesselwoerter, mit Kommata getrennt\n"
+	  +"<wie>   - obj, key, bonus oder typ 1\n"
+	  +"<neu>   - Je nach <wie>; siehe <was>, <key>, <typ>\n"
+	  );
+  SetProp(P_NODROP, 1);
+  SetProp(P_NEVERDROP, 1);
+  SetProp(P_AUTOLOADOBJ,1);
+  AddId(({"explorer","erforscher"}));
+
+  AddCmd(({"epadd"}), "add");
+  AddCmd(({"epchange"}), "change");
+  AddCmd(({"epdel"}), "del");
+  AddCmd(({"epinfo"}), "info");
+  AddCmd(({"epcount"}), "epcount");
+  AddCmd(({"epscan"}), "epscan");
+  AddCmd(({"eppladd"}), "eppladd");
+  AddCmd(({"eppldel"}), "eppldel");
+  AddCmd(({"epplset"}), "epplset");
+  AddCmd(({"epplclr"}), "epplclr");
+}
+
+static string strArr(string *s)
+{
+  string ret;
+  int i;
+
+  ret = ("\"" + s[<1] + "\"");
+  for (i=sizeof(s)-2; i>=0; i--)
+    ret += (", \""+s[i]+"\"");
+
+  return ret;
+}
+
+static int getType(string s)
+{
+  switch(s[0..2]) {
+  case "det":
+    return EP_DETAIL;
+  case "rde":
+    return EP_RDET;
+  case "aus":
+  case "exi":
+    return EP_EXIT;
+  case "cmd":
+  case "bef":
+  case "kom":
+    return EP_CMD;
+  case "inf":
+    return EP_INFO;
+  case "pub":
+    return EP_PUB;
+  case "mis":
+  case "ver":
+    return EP_MISC;
+  case "sme":
+  case "ger":
+    return EP_SMELL;
+  case "sou":
+  case "noi":
+    return EP_SOUND;
+  case "tas":
+  case "tou":
+    return EP_TOUCH;
+  }
+  return -1;
+}
+
+static object getOb(string str)
+{
+  object ob;
+
+  if (str == "hier" || str == "here" )
+    return environment(this_player());
+
+  ob = present(str, environment(this_player()));
+  if (!ob)
+    ob = present(str, this_player());
+
+  if (!ob) {
+    str = "/secure/master"->_get_path(str, getuid(this_player()));
+    catch(call_other(str, "???"));
+    ob = find_object(str);
+  }
+  return ob;
+}
+
+static string *getKeys(string str)
+{
+  int i;
+  string *t1, *t2;
+
+  t1 = regexplode(str, ", *");
+  for (t2 = ({}), i=sizeof(t1)-1; i>=0; i-=2)
+    t2 = ({ t1[i] }) + t2;
+  return t2;
+}
+
+static string errMsg(int code)
+{
+  if (code >= 0 || code < EPERR_INVALID_ARG)
+    return "Unbekannter Fehler";
+
+  code = -(code+1);
+  return ({ "Du bist kein Erzmagier", "Ungueltiges Objekt",
+	    "Objekt steht nicht in der Liste", "Ungueltiges Argument"})[code];
+}
+
+static int add(string str)
+{
+  string was, t, k, *keys, b;
+  int type, bonus;
+  object ob;
+
+  if( !ARCH_SECURITY ) {
+    notify_fail("Du bist kein Erzmagier!\n");
+    return 0;
+  }
+  notify_fail("Syntax: epadd <was>: <typ>\n");
+  if (!(str = this_player()->_unparsed_args()))
+    return 0;
+
+  if (sscanf(str, "%s: %s %s %s", was, b, t, k) !=4)
+    return 0;
+
+  if (!(ob = getOb(was))) {
+    printf("Kann '%s' nicht finden!\n", was);
+    return 1;
+  }
+  if ((type = getType(t)) < 0) {
+    write("Ungueltiger Typ!\n");
+    return 1;
+  }
+  if (b=="n") bonus=0; else if (b=="b") bonus=1;
+  else {
+    write("Ungueltige Bonusart!\n");
+    return 1;
+  }
+  keys = getKeys(k);
+
+  type = EPMASTER->AddEPObject(ob, keys, type, bonus);
+  if (type < 0)
+    printf("Fehler: %s\n", errMsg(type));
+  return 1;
+}
+
+static int change(string str)
+{
+  string was, wie, neu;
+  object ob;
+  int type;
+  mixed new;
+
+  if( !ARCH_SECURITY ) {
+    notify_fail("Du bist kein Erzmagier!\n");
+    return 0;
+  }
+
+  notify_fail("Syntax: epchange <was>: <wie> <neu>\n");
+  if (!(str = this_player()->_unparsed_args()))
+    return 0;
+
+  if (sscanf(str, "%s: %s %s", was, wie, neu) != 3)
+    return 0;
+
+  if (!(ob = getOb(was))) {
+    printf( "Kann '%s' nicht finden!\n", was);
+    return 1;
+  }
+  switch(wie[0..2]) {
+  case "obj":
+    type = CHANGE_OB;
+    new = getOb(neu);
+    if (!new) {
+      printf( "Kann '%s' nicht finden!\n", neu);
+      return 1;
+    }
+    break;
+  case "key":
+    type = CHANGE_KEY;
+    new = getKeys(neu);
+    break;
+  case "typ":
+    type = CHANGE_TYPE;
+    if ((new = getType(neu)) < 0) {
+      write("Ungueltiger Typ!\n");
+      return 1;
+    }
+    break;
+  case "bon":
+    type = CHANGE_BONUS;
+    if (neu=="n") new=0; else if (neu=="b") new=1;
+    else {
+      write("Ungueltige Bonusart!\n");
+      return 1;
+    }
+    break;
+  default:
+    write("Das laesst sich nicht aendern...\n");
+    return 1;
+    break;
+  }
+  type = EPMASTER->ChangeEPObject( ob, type, new );
+  if (type < 0)
+    printf("Fehler: %s\n",errMsg(type));
+
+  return 1;
+}
+
+static int del(string str)
+{
+  object ob;
+  int ret;
+
+  if( !ARCH_SECURITY ) {
+    notify_fail("Du bist kein Erzmagier!\n");
+    return 0;
+  }
+  if (!str) {
+    notify_fail("Syntax: epdel <was>\n");
+    return 0;
+  }
+  if (!(ob = getOb(str))) {
+    write("Kann das Objekt nicht finden!\n");
+    return 1;
+  }
+  ret = EPMASTER->RemoveEPObject(ob);
+  if (ret < 0)
+    printf("Fehler: %s\n", errMsg(ret));
+
+  return 1;
+}
+
+static int info(string str)
+{
+  object ob;
+  mixed info;
+
+  if( !ARCH_SECURITY ) {
+    notify_fail("Du bist kein Erzmagier!\n");
+    return 0;
+  }
+
+  if (!str) {
+    notify_fail("Syntax: epinfo <was>\n");
+    return 0;
+  }
+
+  if (!(ob = getOb(str))) {
+    write("Das finde ich leider nicht...\n");
+    return 1;
+  }
+  if (!(info = EPMASTER->QueryEPObject(ob)))
+    write ("Das Objekt ist nicht eingetragen!\n");
+  else
+    printf("Nummer: %d\nBonus: %d\nTyp: %s\nSchluessel: %s\n",
+	   info[MPOS_NUM],
+	   info[MPOS_TYPE+1],
+	   ({ "Detail", "Ausgang", "Kommando", "Info", "Misc", "ReadDetail",
+         "Kneipe", "Geruch", "Geraeusch", "Tastdetail"})[info[MPOS_TYPE]],
+	   strArr(info[MPOS_KEY] ));
+
+  return 1;
+}
+
+static object find_playerob( string name ) {
+  return find_player(name)||find_netdead(name);
+}
+
+static int epcount( string str ) {
+  object pl,epm;
+  
+  if( !ARCH_SECURITY ) {
+    notify_fail("Du bist kein Erzmagier!\n");
+    return 0;
+  }
+  
+  if (!str || str=="") {
+    notify_fail("Syntax: epcount <spielername>\n");
+    return 0;
+  }
+
+  printf( "%s hat %d von %d FPs. (Durchschnitt = %d)\n",
+	  capitalize(str),
+	  EPMASTER->QueryExplorationPoints(str),
+	  EPMASTER->QueryMaxEP(),
+	  EPMASTER->QueryAverage()
+	  );
+  return 1;
+}
+
+static int epscan( string str ) {
+  object pl;
+  int erg;
+  string *astr;
+
+  if( !ARCH_SECURITY ) {
+    notify_fail("Du bist kein Erzmagier!\n");
+    return 0;
+  }
+  
+  if (!str || str=="") {
+    notify_fail("Syntax: epscan <spielername> [Teil des Filenamens]\n");
+    return 0;
+  }
+
+  astr=old_explode(this_player()->_unparsed_args()," ");
+  
+  if (sizeof(astr)<2)
+    erg = EPMASTER->ShowPlayerEPs(astr[0]);
+  else
+    erg = EPMASTER->ShowPlayerEPs(astr[0],astr[1]);
+  if (erg < 0)
+    printf("Fehler: %s\n",errMsg(erg));
+  return 1;
+}
+
+static eppldel( string str ) {
+	string player, rest;
+	int epnum;
+	object tmp;
+
+	if( !ARCH_SECURITY ) {
+	  notify_fail("Du bist kein Erzmagier!\n");
+	  return 0;
+	}
+
+	notify_fail( "eppldel <spieler> <anzahl_eps> <grund>\n" );
+	if( !str || sscanf( str, "%s %d %s", player, epnum, rest )<2 )
+		return 0;
+
+	if( epnum <= 0 ) {
+		write( "Anzahl der FPs <= 0 ?\n" );
+		return 1;
+	}
+	if( !rest || rest=="" ) {
+		write( "Bitte Grund angeben!\n" );
+		return 1;
+	}
+
+	printf( "%O %O %O\n", epnum, player, secure_level() );
+	epnum =	"/secure/explorationmaster"->RemoveFP( epnum, player, rest );
+	printf( "Ergebnis (abgezogene EPs) = %O\n", epnum );
+	return 1;
+
+}
+
+static eppladd( string str ) {
+	string player, rest;
+	int epnum;
+	object pl,tmp;
+
+	if( !ARCH_SECURITY ) {
+	  notify_fail("Du bist kein Erzmagier!\n");
+	  return 0;
+	}
+
+	notify_fail( "eppladd <spieler> <anzahl_eps>\n" );
+	if( !str || sscanf( str, "%s %d", player, epnum )<2 )
+		return 0;
+
+	if( epnum <= 0 ) {
+		write( "Anzahl der FPs <= 0 ?\n" );
+		return 1;
+	}
+
+	epnum =	"/secure/explorationmaster"->AddFP( epnum, player );
+	printf( "Ergebnis (hinzugefuegte FPs) = %O\n", epnum );
+	return 1;
+
+}
+
+static epplset( string str ) {
+  string player, rest;
+  int epnum;
+  object pl,tmp;
+  
+  if( !ARCH_SECURITY ) {
+    notify_fail("Du bist kein Erzmagier!\n");
+    return 0;
+  }
+  
+  notify_fail( "epplset <spieler> <ep-nummer>\n" );
+  if( !str || sscanf( str, "%s %d", player, epnum )<2 )
+    return 0;
+  
+  epnum = "/secure/explorationmaster"->SetFP( epnum, player );
+  printf( "Ergebnis (gesetzter FP) = %O\n", epnum );
+  return 1;
+}
+
+static epplclr( string str ) {
+  string player, rest;
+  int epnum;
+  object pl,tmp;
+  
+  if( !ARCH_SECURITY ) {
+    notify_fail("Du bist kein Erzmagier!\n");
+    return 0;
+  }
+  
+  notify_fail( "epplclr <spieler> <ep-nummer>\n" );
+  if( !str || sscanf( str, "%s %d", player, epnum )<2 )
+    return 0;
+  
+  epnum = "/secure/explorationmaster"->ClearFP( epnum, player );
+  printf( "Ergebnis (geloeschter FP) = %O\n", epnum );
+  return 1;
+}
