diff --git a/secure/master/userinfo.c b/secure/master/userinfo.c
new file mode 100644
index 0000000..5d8f4ff
--- /dev/null
+++ b/secure/master/userinfo.c
@@ -0,0 +1,1119 @@
+// MorgenGrauen MUDlib
+//
+// master/userinfo.c -- Cache mit Spielerinfos
+//
+// $Id: userinfo.c 9467 2016-02-19 19:48:24Z Zesstra $
+
+#pragma strict_types
+
+#include "/secure/master.h"
+#include "/sys/files.h"
+#include "/sys/object_info.h"
+
+// Makro aus wizlevels.h ersetzen, da secure_level ne sefun ist. *seufz*
+#undef ARCH_SECURITY
+#define ARCH_SECURITY (call_sefun("secure_level") >= ARCH_LVL)
+
+private string*  ExpandUIDAlias(string alias, int rec);
+
+nosave mapping userlist;
+string name, password;
+string ektips;
+string fptips;
+int level;
+string shell;
+int creation_date;
+string ep, ek, mq;
+string *domains,*guilds, *uidstotakecare;
+nosave string* lateplayers;
+// hier wird ein Mapping von UID-zu-Magier-Zuordnungen gespeichert. Als Keys
+// werden UIDs verwendet, der Value ist jeweils ein Array mit den magiern, die
+// dafuer zustaendig sind.
+nosave private mapping userids = ([]);
+// Ein Cache fuer UID-Aliase, damit ExpandUIDAlias() nicht staendig ganze
+// Verzeichnisse einlesen muss, sondern der Master das nur im Reset machen
+// muss.
+nosave private mapping uidaliase = ([]);
+
+#ifdef _PUREFTPD_
+// Liste von FTP-berechtigten Usern
+nosave private mapping ftpuser = ([]);
+
+public void read_ftp_users() {
+  string str = read_file("/"SECUREDIR"/ARCH/pureftpd.passwd") || "";
+  string *data = explode(str, "\n");
+  if (!sizeof(data)) return;
+  ftpuser = m_allocate(sizeof(data), 1);
+  foreach(str : data) {
+    string *tmp=explode(str, ":");
+    if(sizeof(tmp) >= 2)
+      m_add(ftpuser, tmp[0], tmp[1]);
+  }
+}
+
+public int write_ftp_users() {
+  string *record = allocate(18,"");
+  mapping tmp = m_allocate(sizeof(ftpuser));
+  // set UID/GID of system user
+  record[2] = "1000";
+  record[3] = "1000";
+  foreach(string u, string pwhash : ftpuser) {
+    record[0] = u;  // UID
+    record[1] = pwhash;
+    record[5] = "/home/mud/mudlib/"WIZARDDIR"/" + u + "/./";
+    m_add(tmp, implode(record, ":"));
+  }
+  write_file("/"SECUREDIR"/ARCH/pureftpd.passwd", implode(m_indices(tmp),"\n"),1);
+  return sizeof(tmp);
+}
+
+// geloeschte Magier oder Magier, die 2 Wochen nicht da waren, expiren
+public void expire_ftp_user() {
+  foreach(string u : ftpuser) {
+    mixed uinfo = get_full_userinfo(u);
+    if (!uinfo) {
+      m_delete(ftpuser,u);
+      continue;
+    }
+    int zeit = call_sefun("file_time",
+                     "/"SECURESAVEPATH + u[0..0] + "/" + u + ".o");
+    if (zeit < time()-1209600) {
+      m_delete(ftpuser,u);
+      continue;
+    }
+  }
+  call_out(#'write_ftp_users, 2);
+}
+
+#endif // _PUREFTPD_
+
+// ********** oeffentliche Funktionen ***********************
+
+//Verantwortliche Magier fuer eine UID ausgeben
+public varargs string* QueryWizardsForUID(string uid, int recursive) {
+
+    if (!stringp(uid) || !sizeof(uid))
+        return(({}));
+
+    string *tolookup=({uid}); //diese spaeter in userids nachgucken.
+    string *wizards=({});
+    // Schauen, was automatisch ermittelt werden kann.
+    string *parts=explode(uid,".");
+    switch(sizeof(parts)) {
+         case 3:
+          // z.B. d.region.magier und p.service.magier
+          if (find_userinfo(parts[2]))
+              //Magier existiert, reinschreiben.
+              wizards+=({parts[2]});
+          if (parts[0]=="d")
+              // d.region noch nachgucken (RMs)
+              tolookup=({implode(parts[0..1],".")});
+          break;
+        //case 2:
+          // GUILD.gilde, p.project, d.region
+          // koennen nur in userids nachgeguckt werden (s.u. tolookup)
+          // muessen da als GUILD.*, d.* und p.* drinstehen!
+        case 1:
+          // kein Punkt drin. Entweder Magier-ID oder spezielle ID
+          // (letztere wird unten noch per tolookup nachgeguckt)
+          if (find_userinfo(parts[0]))
+              wizards+=({parts[0]});
+          break;
+    }
+    // jetzt in userids nachschlagen
+    foreach(uid: tolookup) {
+        if (member(userids,uid))
+            wizards+=userids[uid];
+    }
+    // so. Nun kann es aber noch sein, dass in userids sowas wie
+    // "d.wald.atamur":({atamur}) und "atamur":({"rumata"}) drinsteht, also
+    // ein Magier sozusagen fuer Kram eines anderen verantwortlich ist. D.h.
+    // nochmal durch QueryWizardsForUID() schicken (das ist dann allerdings nicht
+    // weiter rekursiv).
+    if (!recursive) {
+      foreach(uid: wizards) {
+        //es ist moeglich, in der Schleife wizards zu vergroessern, ohne dass
+        //es Einfluss auf die Schleife hat.        
+        wizards += QueryWizardsForUID(uid, 1) - ({uid});
+      }
+    }
+    return(m_indices(mkmapping(wizards)));
+}
+
+//das Define ist nicht sonderlich elegant, aber ich kann hier nicht das
+//newskills.h hier includen (1. zu viel, 2. ists nen Sicherheitsproblem)
+#define P_GUILD_DEFAULT_SPELLBOOK       "guild_sb"
+// dito fuer den Gildenmaster
+#define GUILDMASTER                 "/secure/gildenmaster"
+
+// Den Alias-Cache loeschen (normalerweise einmal am Tag)
+public void ResetUIDAliase() {
+  // RM+ duerfen den Cache loeschen (wenn sie z.B. nen neues Verzeichnis
+  // angelegt haben.)
+  if (extern_call() 
+      && call_sefun("secure_level") < LORD_LVL)
+      return;
+
+  uidaliase=([]);
+}
+
+// expandiert einige 'Aliase' in ein Array von allen UIDs, fuer die sie
+// stehen. Bsp: "region" -> d.region.* + region + d.region,
+// "zauberer" -> GUILD.zauberer, "p.service" -> p.service.*
+// Nutzt Eintrag aus dem uidalias-Cache, sofern vorhanden. 
+public varargs string* QueryUIDAlias(string alias, int rec) {
+  string *uids;
+  if (!stringp(alias) || !sizeof(alias))
+      return ({});
+  // Wen im cache, gehts schnell.
+  if (member(uidaliase, alias))
+      uids = uidaliase[alias];
+  else
+      uids = ExpandUIDAlias(alias, rec);
+
+  if (extern_call())
+    return copy(uids);
+  
+  return(uids);
+}
+
+// Fuer welche UIDs ist ein Magier verantwortlich? (Ist er RM,
+// Gildenmagier, in welchen Regionen hat er ein Verzeichnis, etc.)
+// recursive != 0 bedeutet, dass der Aufruf indirekt aus einem laufenden
+// QueryUIDsForWizard() erfolgt. In dem Fall soll QueryUIDAlias() keine
+// weitere Rekursion durchfuehren. Wird einfach durchgereicht.
+public varargs string* QueryUIDsForWizard(string wizuid, int recursive) {
+    string *uids, *tmp, *uidstoadd;
+    int i;
+
+    if (!stringp(wizuid) || !sizeof(wizuid) || !IS_LEARNER(wizuid))
+        return(({}));
+
+    if (!find_userinfo(wizuid))
+        return(({}));
+
+    uidstoadd=({}); //diese werden hinterher in userids gespeichert.
+
+    // als erstes die ratebaren UIDs. ;-)
+    uids=({wizuid});
+    // Regionen ermitteln, wo wizuid ein Verzeichnis hat und entsprechende
+    // UIDs anhaengen:
+    foreach(string region: get_domain_homes(wizuid)) {
+        uids+=({ sprintf(DOMAINDIR".%s.%s",region,wizuid) });
+    }
+    // Verzeichnis in /p/service?
+    if (file_size(PROJECTDIR"/service/"+wizuid) == FSIZE_DIR)
+        uids+=({PROJECTDIR".service."+wizuid});
+
+    // Gildenchef?
+    if (pointerp(userlist[wizuid,USER_GUILD])) {
+        foreach(string gilde: userlist[wizuid,USER_GUILD]) {
+          uidstoadd += QueryUIDAlias(gilde);
+        }
+    }
+    // Regionsmagier?
+    if (pointerp(userlist[wizuid,USER_DOMAIN])) {
+        foreach(string domain: userlist[wizuid,USER_DOMAIN]) {
+            //generelle Pseudo-UID 'd.region' und 'region' fuer geloeschte
+            //Magier dieser Region vormerken, um sie hinterher fuers
+            //Reverse-Lookup ins uid-Mapping zu schreiben.
+            string *pseudo=({DOMAINDIR"."+domain, domain});
+            uidstoadd += pseudo;
+            // Rest macht QueryUIDAlias, dabei aber die von der Funktion
+            // ebenfalls gelieferten Pseudo-UIDs wieder abziehen.
+            uids += QueryUIDAlias(domain) - pseudo;
+        }
+    }
+    // jetzt noch nachgucken, fuer welche UIDs dieser Magier explizit noch
+    // zustaendig ist.
+    if (pointerp(userlist[wizuid,USER_UIDS_TO_TAKE_CARE])) {
+    // dies koennte etwas a la "region" oder "anderermagier" sein, d.h. dieser
+    // Magier ist fuer alle UIDs von 'andermagier' auch zustaendig. Daher muss
+    // jedes davon durch QueryUIDAlias() (was im Falle von Spielern wiederum
+    // QueryUIDsForWizard() ruft, aber die Rekursion im Falle von Spielern ist
+    // auf 1 begrenzt).
+        foreach(string uid2: userlist[wizuid,USER_UIDS_TO_TAKE_CARE]) {        
+            uidstoadd += QueryUIDAlias(uid2, recursive);
+        }
+    }
+
+    // so, in uidstoadd stehen UIDs drin, die nicht Magiername selber,
+    // d.region.magier oder p.service.magier sind und bei welchen folglich das
+    // Mapping UIDs-nach-Magier nur mit einer Liste moeglich ist. In die
+    // werden die uids nun eingetragen. (z.B. d.region)
+    if (sizeof(uidstoadd)) {
+        // genug Platz in userids? Sonst welche rauswerfen. :-/ 
+        // (besser als bug) TODO: Auf 10k begrenzen -> max Arraygroesse!
+        if ( sizeof(userids)+(i=sizeof(uidstoadd))               
+            >= __MAX_MAPPING_KEYS__) {
+            foreach(string tmpuid: m_indices(userids)[0..i])        
+              m_delete(userids,tmpuid);  
+        }
+        foreach(string tmpuid: uidstoadd) {  
+            if (member(userids,tmpuid)) {  
+                //User dem Array hinzufuegen, wenn noch nicht drin.
+                if (member(userids[tmpuid],wizuid)==-1)
+                    userids[tmpuid]=userids[tmpuid]+({wizuid});              
+            }
+            //sonst neuen Eintragen hinzufuegen            
+            else
+                m_add(userids,tmpuid,({wizuid}));          
+        }
+    } // Ende spez. uids speichern
+    
+    return(uids+uidstoadd);
+}
+
+//Einen Magier als verantwortlich fuer eine bestimmte UID eintragen
+public string* AddWizardForUID(string uid, string wizuid) {
+    if (!stringp(wizuid) || !sizeof(wizuid)
+        || !IS_LEARNER(wizuid))
+        return(({}));
+
+    //Zugriff nur als EM oder jemand, der fuer die UID zustaendig ist.
+    if ( !ARCH_SECURITY
+        && member(
+            QueryUIDsForWizard(call_sefun("secure_euid")),
+            uid) == -1)
+        return(userlist[wizuid,USER_UIDS_TO_TAKE_CARE]);
+
+    if (!pointerp(userlist[wizuid,USER_UIDS_TO_TAKE_CARE]))
+        //Array neu anlegen
+        userlist[wizuid,USER_UIDS_TO_TAKE_CARE]=({uid});
+    else {
+        //Ein Array schon vorhanden
+        if (member(userlist[wizuid,USER_UIDS_TO_TAKE_CARE],uid)==-1)
+            //uid nicht drin
+            userlist[wizuid,USER_UIDS_TO_TAKE_CARE]=
+              userlist[wizuid,USER_UIDS_TO_TAKE_CARE]+({uid});
+    }
+    save_userinfo(wizuid);
+    // aus dem UID-Alias-Cache werfen
+    m_delete(uidaliase, wizuid);
+    // Aufruf, um userids und uidaliase zu aktualisieren
+    QueryUIDsForWizard(wizuid);
+    return(userlist[wizuid,USER_UIDS_TO_TAKE_CARE]);
+}
+
+// Einen Magier wieder austragen, wenn er nicht mehr zustaendig ist.
+public string* RemoveWizardFromUID(string uid, string wizuid) {
+    if (!stringp(wizuid) || !sizeof(wizuid)
+        || !find_userinfo(wizuid))
+        return(({}));
+
+    //Zugriff nur als EM oder jemand, der fuer die UID zustaendig ist.
+    if ( !ARCH_SECURITY
+        && member(
+            QueryUIDsForWizard(call_sefun("secure_euid")),
+            uid)==-1)
+        return copy(userlist[wizuid,USER_UIDS_TO_TAKE_CARE]);
+
+    // jetzt muss diese wizuid aus allen UIDs in userids geloescht werden, die
+    // sie bisher enthalten. Hierzu sollte QueryUIDAlias die potentiell
+    // drinstehenden UIDs liefern.
+    foreach(string tuid: QueryUIDAlias(wizuid,0)) {
+        if (member(userids, tuid) &&
+            member(userids[tuid],wizuid)!=-1 )
+            userids[tuid] -= ({wizuid});
+    }
+    // wenn es eine UID war, fuer die der Magier explizit zustaendig war,
+    // entsprechend loeschen. Sonst ist hier Ende.
+    if (!pointerp(userlist[wizuid,USER_UIDS_TO_TAKE_CARE]))
+        return ({});
+    if (member(userlist[wizuid,USER_UIDS_TO_TAKE_CARE],uid)==-1)
+        return copy(userlist[wizuid,USER_UIDS_TO_TAKE_CARE]);
+
+    // Jetzt aus userlist loeschen.
+    userlist[wizuid,USER_UIDS_TO_TAKE_CARE] -= ({uid});
+    save_userinfo(wizuid);
+    // und userids/uidaliase aktualisieren.
+    QueryUIDsForWizard(wizuid);
+    return copy(userlist[wizuid,USER_UIDS_TO_TAKE_CARE]);
+}
+
+//entfernt einen user aus dem usercache
+void RemoveFromCache(string user) {
+  m_delete(userlist,user);
+}
+
+//loescht den gesamten Usercache
+int clear_cache() {
+  userlist=m_allocate(0,widthof(userlist));
+  update_late_players();
+  return 1;
+}
+
+// Loescht UID->Magier Lookuptabelle. Sollte nicht gerufen werden, wenn man 
+// nicht genau weiss, was man damit kaputtmacht.
+// als Nebeneffekt wird clear_cache() gerufen.
+int ResetUIDCache() {
+  // da diese Funktion auch das UID<->Magier-Lookup loescht, darf das nicht
+  // jeder rufen.
+  if (extern_call() &&
+      call_sefun("secure_level") < ELDER_LVL)
+      return -1;
+  userids=([]);
+  clear_cache();
+  return 1;
+}
+
+//verstorbene Spieler auflisten
+string list_late_players()
+{
+  string ret;
+  int size,i;
+  
+  ret= "************************************\n";
+  ret+="*       Verstorbene Spieler        *\n";
+  ret+="************************************\n";
+  
+  if(!lateplayers || (size=sizeof(lateplayers))==0)
+  {
+    return ret;
+  }
+  
+  for(i=0;i<size;i++)
+  {
+    ret+=lateplayers[i]+"\n";
+  }
+  
+  return ret;
+}
+
+// ist der Spieler gestorben?
+int check_late_player(string str)
+{
+  if(!lateplayers || !str || str=="")
+  {
+    return 0;
+  }
+  
+  if(member(lateplayers,str)!=-1)
+  {
+    return 1;
+  }
+  
+  return 0;
+}
+
+// alle Eintraege im usercache ausgeben
+public mixed *show_cache() {
+    return m_indices(userlist);
+}
+
+// gibt es so einen User? Anfrage ausserdem immer in den Cache eintragen
+public int find_userinfo(string user) {
+  string file;
+  int i;
+  if (!stringp(user) || !sizeof(user) 
+      || member(user,' ')!=-1 || member(user,':')!=-1)
+    return 0;
+  if (!member(userlist,user)) {
+      //erstmal schauen, ob wir mit einem neuen Eintrag nicht die max.
+      //Mapping-Groessen ueberschreiten, wenn ja, einen Eintrag loeschen
+      //BTW: widthof()+1 ist richtig so.
+      //BTW2: Ich hoffe, die max. Arraygroesse ist immer gross genug, sollte 
+      //sie aber sein bei ner Mappingbreite von 10.
+      // BTW3: Dieses Rausloeschen von einem Eintrag bei Erreichen der Grenze
+      // erhoeht die benoetigten Ticks fuer diese Funktion um das 5-6fache und
+      // die noetige Zeit um das 70fache. Daher wird der Cache bei Erreichen
+      // der Grenze jetzt einfach geloescht.
+      if ( ( (i=sizeof(userlist)+1) >= __MAX_MAPPING_KEYS__) 
+          || (( i * (widthof(userlist)+1)) >
+                 __MAX_MAPPING_SIZE__))    
+          //m_delete(userlist,m_indices(userlist)[0]);
+          userlist=m_allocate(1,widthof(userlist));
+
+      // Usersavefile finden
+      if ((file=secure_savefile(user))=="") {
+        // User gibt es nicht, aber Anfrage cachen
+          userlist+=([user: "NP"; -1; ({}); "LOCKED"; -1; time(); ""; ""; "";
+          ({});"";""; 0 ]);
+          return 0;
+      }
+      password="";
+      ep="";
+      ek="";
+      mq="";
+      guilds=({});
+      ektips="";
+      fptips="";
+      uidstotakecare=0;
+      if (!restore_object(file)) return 0;
+      userlist+=([user: password; level; domains; shell; creation_date; 
+          time();ep; ek; mq; guilds; ektips; fptips; uidstotakecare]);
+      // die speziellen UIDs, fuer die dieser Magier zustaendig ist, ermitten
+      // und gleichzeitig im entsprechenden Mapping fuers Reverse-Loopup
+      // speichern.
+      if (level >= LEARNER_LVL)
+        QueryUIDsForWizard(user);
+  }
+  userlist[user,USER_TOUCH]=time();
+  if (userlist[user,USER_LEVEL]==-1) return 0;
+  return 1;
+}
+
+// Daten aus der Userlist fuer diesen User liefern. Macht ggf. find_userinfo()
+public mixed *get_userinfo(string user) {
+  if(!user||user=="")
+    return 0;
+  user=explode(user,".")[0];
+  if (!member(userlist,user) && !find_userinfo(user))
+    return 0;
+
+  if (userlist[user,USER_LEVEL]==-1) return 0;
+
+  return({user,"##"+user,userlist[user,USER_LEVEL],
+      userlist[user,USER_DOMAIN], userlist[user,USER_OBJECT],
+      userlist[user,USER_CREATION_DATE], 0, 0,
+      userlist[user,USER_GUILD],
+      userlist[user,USER_EKTIPS],userlist[user,USER_FPTIPS],
+      userlist[user,USER_UIDS_TO_TAKE_CARE]});
+}
+
+// liefert das Objekt des users aus der Userlist zurueck.
+public string query_player_object( string name )
+{
+  mixed *userentry;
+  if( !find_userinfo(name) ) return "";
+  return userlist[name,USER_OBJECT];
+}
+
+// Passwort ok?
+public int good_password( string str, string name )
+{
+    string rts;
+    int i, n;
+
+    if ( str[0] == '!' ){
+        tell_object( this_player() || this_object(), "Ein Ausrufungszeichen "
+                     "('!') als erster Buchstabe des Passwortes wuerde zu\n"
+                     "Problemen fuehren. Such Dir bitte ein anderes Passwort "
+                     "aus.\n" );
+        return 0;
+    }
+
+    if ( sizeof(str) < 6 ){
+        tell_object( this_player() || this_object(),
+                     "Das Passwort muss wenigstens 6 Zeichen lang sein.\n" );
+        return 0;
+    }
+
+    str = lower_case(str);
+    rts = "";
+
+    // Zahlen/Sonderzeichen am Anfang oder Ende des Passwortes
+    // (z.B. "merlin99") sind nicht wirklich einfallsreich.
+    while ( sizeof(str) && (str[0] > 'z' || str[0] < 'a') ){
+        rts += str[0..0];
+        str = str[1..];
+    }
+
+    while ( sizeof(str) && (str[<1] > 'z' || str[<1] < 'a') ){
+        rts += str[<1..];
+        str = str[0..<2];
+    }
+
+    // Anzahl unterschiedlicher Zeichen merken, die herausgeschnitten wurden
+    n = sizeof( mkmapping(efun::explode( rts, "" )) );
+    rts = "";
+
+    for ( i = sizeof(str); i--; )
+        rts += str[i..i];
+
+    // Eigener Name als Passwort bzw. eigener Name rueckwaerts
+    if ( str == lower_case(name) || rts == lower_case(name) ||
+         // Name eines anderen Mudders (Erstie?)
+         secure_savefile(str) != "" || secure_savefile(rts) != "" ||
+         // Name von der Banish-Liste
+         QueryBanished(str) || QueryBanished(rts) ||
+         // Name eines vorhandenen NPC o.ae.
+         call_sefun("find_living", str ) ||
+         call_sefun("find_living", rts ) ||
+         // Zuwenig verschiedene Zeichen
+         sizeof( mkmapping(efun::explode( str, "" )) ) + n < 4 ){
+        tell_object( this_player() || this_object(),
+                     "Das Passwort waere zu einfach zu erraten. Nimm bitte "
+                     "ein anderes.\n" );
+        return 0;
+    }
+
+    return 1;
+}
+
+// User-ID fuer ein File ermitteln.
+public string get_wiz_name(string file) {
+    return creator_file(file);
+}
+
+// Wizlevel aus dem Userinfo-Cache holen
+public int get_wiz_level(string user) {
+  if (user && find_userinfo(user)) 
+    return userlist[user,USER_LEVEL];
+  //return 0 if no user given (return type needed)
+  return(0);
+}
+
+// Wizlevel fuer eine UID ermitteln.
+public int query_wiz_level( mixed player )
+{
+    if ( objectp(player) && efun::object_info(player, OI_ONCE_INTERACTIVE) )
+        return get_wiz_level( getuid(player) );
+    else {
+        // erstmal UID ermitteln, falls Objekt
+        //if (objectp(player))
+        //    player=getuid(player);
+        if ( stringp(player) ) {
+            if( player[0..1]==DOMAINDIR"." ) return 25;
+            if( player[0..5]==GUILDID"." ) 
+                return WIZLVLS[GUILDID];
+            if( player[0..1]==PROJECTDIR"." ) return 21;
+            // die alte Loesung mit || verhaelt sich falsch, wenn ein UID ne
+            // spezielle ist, der Level 0 zugeordnet wurde und es einen
+            // Spieler mit diesem namen gibt.
+            if (member(WIZLVLS,player)) 
+                return(WIZLVLS[player]);
+            return get_wiz_level(player);
+        }
+    }
+    return 0;
+}
+
+// Savefile aus /secure/save* zurueckliefern
+public string secure_savefile(string name)
+{
+  if(!name||name=="")
+    return "";
+  name=explode(name,".")[0];
+  if (file_size(SECURESAVEPATH+name[0..0]+"/"+name+".o")>=0)
+    return SECURESAVEPATH+name[0..0]+"/"+name;
+
+  return "";
+}
+
+// *************** 'halb-oeffentliche Funktionen *********************
+#ifdef _PUREFTPD_
+// FTP-Berechtigung fuer Magier
+int update_ftp_access(string user, int state) {
+  // wenn nicht EM+ oder ROOT, darf nur fuer this_interactive geaendert
+  // werden.
+  if (getuid(PO) != ROOTID && extern_call()
+      && !ARCH_SECURITY) {
+    if (this_interactive())
+      user = getuid(this_interactive());
+    else
+      user = 0;
+  }
+  if (!user || !sizeof(user))
+    return -1;
+
+  if (!find_userinfo(user))
+    return 0;
+
+  // Passwort muss manuell vom Magier neu gesetzt werden, da es keine
+  // Moeglichkeit gibt, an das aktuelle im Klartext heranzukommen.
+  if (state) {
+    if (!member(ftpuser,user))
+      m_add(ftpuser, user, "*");
+  }
+  else
+    m_delete(ftpuser, user);
+  
+  call_out(#'write_ftp_users, 4);
+  return state;
+}
+#endif
+
+// Spieler ein neues Wizlevel verpassen.
+int update_wiz_level(string user,int lev) {
+  object ob;
+
+  if (getuid(PO) != ROOTID && extern_call()) return 0;
+  if (!find_userinfo(user)) return 0;
+  userlist[user,USER_LEVEL] = lev;
+  save_userinfo(user);
+  return 1;
+}
+
+// neue Forscherpunkte fuer den User abspeichern.
+int update_ep(string user,string ep_neu) {
+  if (getuid(PO) != ROOTID) return 0;
+  if (!find_userinfo(user)) return 0;
+  userlist[user,USER_EP] = ep_neu;
+  save_userinfo(user);
+  return 1;
+}
+
+// neue Erstkills fuer den User abspeichern.
+int update_ek(string user,string ek_neu) {
+  if (getuid(PO) != ROOTID) return 0;
+  if (!find_userinfo(user)) return 0;
+  userlist[user,USER_EK] = ek_neu;
+  save_userinfo(user);
+  return 1;
+}
+
+// Miniquestdaten speichern.
+int update_mq(string user,string mq_neu) {
+  if (getuid(PO) != ROOTID) return 0;
+  if (!find_userinfo(user)) return 0;
+  userlist[user,USER_MQ] = mq_neu;
+  save_userinfo(user);
+  return 1;
+}
+
+// Erstkillpunkt-Tips speichern.
+int update_ektips(string user,string ek_neu) {
+  if (getuid(PO) != ROOTID) return 0;
+  if (!find_userinfo(user)) return 0;
+  userlist[user,USER_EKTIPS] = ek_neu;
+  save_userinfo(user);
+  return 1;
+}
+
+// Forscherpunkttips abspeichern.
+int update_fptips(string user,string fp_neu) {
+  if (getuid(PO) != ROOTID) return 0;
+  if (!find_userinfo(user)) return 0;
+  userlist[user,USER_FPTIPS] = fp_neu;
+  save_userinfo(user);
+  return 1;
+}
+
+// forscherpunkte abfragen.
+string query_ep(string user) {
+  if (getuid(PO) != ROOTID) return 0;
+  if (!find_userinfo(user)) return 0;
+  return userlist[user,USER_EP];
+}
+
+// Erstkills abfragen
+string query_ek(string user) {
+  if (getuid(PO) != ROOTID) return 0;
+  if (!find_userinfo(user)) return 0;
+  return userlist[user,USER_EK];
+}
+
+// Miniquests abfragen.
+string query_mq(string user) {
+  if (getuid(PO) != ROOTID) return 0;
+  if (!find_userinfo(user)) return 0;
+  return userlist[user,USER_MQ];
+}
+
+// EK-Tips abfragen.
+string query_ektips(string user) {
+  if (getuid(PO) != ROOTID) return 0;
+  if (!find_userinfo(user)) return 0;
+  return userlist[user,USER_EKTIPS];
+}
+
+// FP-Tips abfragen.
+string query_fptips(string user) {
+  if (getuid(PO) != ROOTID) return 0;
+  if (!find_userinfo(user)) return 0;
+  return userlist[user,USER_FPTIPS];
+}
+
+#define PLAYERSHELLS ({"/std/shells/darkelf", "/std/shells/dwarf", \
+    "/std/shells/elf", "/std/shells/feline", "/std/shells/hobbit", \
+    "/std/shells/human" })
+
+// Aendert die Shells eines Users.
+int set_player_object( string user, string objectname )
+{
+    mixed *path;
+    string prev;
+
+    // nur EM und ROOT duerfen die Shell eines Charakters aendern
+    if ( !ARCH_SECURITY &&
+         (!previous_object() || getuid(previous_object()) != ROOTID) ) {
+        return -1;
+    }
+
+    if ( objectname == "" )
+        objectname = 0;
+
+    if ( !stringp(user) || user == "" )
+        return -6;
+
+    if ( !stringp(objectname) ){
+        if ( !find_userinfo(user) )
+            return -4;
+
+        userlist[user, USER_OBJECT] = 0;
+        save_userinfo(user);
+        return 1;
+    }
+
+    if ( catch(load_object(objectname);publish) ) {
+        write( "Fehler in " + objectname + "!\n" );
+        return -2;
+    }
+
+    objectname = _get_path( objectname, 0 );
+    path = (efun::explode( objectname, "/" ) - ({ "", 0 }));
+
+    if ( sizeof(path) < 3 || path[0] != "std" || path[1] != "shells" )
+        return -3;
+
+    if ( !find_userinfo(user) )
+        return -4;
+
+    prev = userlist[user, USER_OBJECT];
+    userlist[user, USER_OBJECT] = objectname;
+    save_userinfo(user);
+
+    // Loggen, falls die Aenderung nicht von Login beim Anlegen des Chars
+    // erfolgt.
+    if (load_name(this_interactive()) != "/secure/login"
+        || prev != "") {
+      if (prev == "") prev ="<keine>";
+      call_sefun("log_file", "ARCH/SHELL_AENDERUNGEN",
+        sprintf( "%s: %O aendert die Shell von %s von %s auf %s (PO: %O)\n",
+          strftime("%Y%m%d-%H%M%S"), 
+          this_interactive(), capitalize(user), prev, objectname,
+          previous_object()) );
+    }
+
+    return 1;
+}
+
+// Passwort aktualisieren.
+int update_password( string old, string new )
+{
+    string user;
+
+    // nanu, kein user?
+    if ( !find_userinfo(user = getuid(PO)) )
+        return 0;
+
+    // wenn das neue PW unterschiedlich ist, schauen, ob das neue PW ok ist.
+    if ( old != new && !good_password( new, user ) )
+        return 0;
+
+    string pwhash = userlist[user, USER_PASSWORD];
+    string oldpwhash;
+    if (sizeof(pwhash) > 13) {
+        // MD5-Hash
+        oldpwhash = md5_crypt(old, pwhash);
+    }
+    else if (sizeof(pwhash) > 2) {
+        // Crypt-Hash
+        oldpwhash = crypt(old, pwhash[0..1]);
+    }
+
+    // wenn es einen PW-hash gibt, also ein PW gesetzt wird, muss der Hash von
+    // old mit dem pwhash uebereinstimmen. Leerer Hash oder gar kein Hash
+    // erlaubt jedes beliebige PW.
+    if ( stringp(pwhash) && sizeof(pwhash) && pwhash != oldpwhash)
+        return 0;
+    // an dieser Stelle stimmt 'old' wohl mit dem gesetzten Passwort ueberein.
+    // Wenn allerdings die Funktion mit old==new aufgerufen wurde, wird hier
+    // nur 1 zurueckgeben und sonst an sich nix gemacht. Kann nicht weiter
+    // oben schon gemacht werden, die Shells dies als PW-Pruefung nutzen.
+    // *seufz*
+    if (old == new) return 1;
+
+    // dann mal neu setzen
+    userlist[ user, USER_PASSWORD ] = md5_crypt( new, 0 );
+    save_userinfo(user);
+#ifdef _PUREFTPD_
+    // Bedauerlicherweise versteht pureftpd unser md5_crypt nicht. :-(
+    if (member(ftpuser,user)) {
+      ftpuser[user] = crypt(new);
+      if (find_call_out(#'write_ftp_users) == -1)
+        call_out(#'write_ftp_users,4);
+    }
+#endif
+    return 1;
+}
+
+// Spieler loeschen.
+int delete_player(string passwd, string real_name)
+{
+  int wlevel;
+  string part_filename;
+
+  if (!PO || PO!=TP || PO!=TI || real_name != getuid(PO) ||
+      !find_userinfo(real_name))
+    return 0;
+  mixed erstie=(mixed)this_interactive()->QueryProp(P_SECOND);
+  password = userlist[real_name,USER_PASSWORD];
+  wlevel = get_wiz_level(real_name);
+  if (!update_password(passwd, passwd)) return 0;
+
+  // Spielpausen aufheben (sonst kann man als Spieler nen Namen sperren).
+  TBanishName(real_name, 0);
+
+  part_filename="/"+real_name[0..0]+"/"+real_name+".o";
+  rm("/"SECUREDIR"/save"+part_filename);
+  rm("/"LIBSAVEDIR"/"+part_filename);
+  rm("/"MAILDIR"/"+part_filename);
+  
+  m_delete(userlist,real_name);
+  
+  if (wlevel >= LEARNER_LVL)
+    TO->BanishName(real_name, "So hiess mal ein Magier hier");
+  else if (wlevel >= SEER_LVL)
+    TO->BanishName(real_name, "So hiess mal ein Seher hier");
+
+#ifdef _PUREFTPD_
+    if (member(ftpuser,real_name)) {
+      m_delete(ftpuser,real_name);
+      call_out(#'write_ftp_users,4);
+    }
+#endif
+
+  call_sefun("log_file", "USERDELETE",
+           sprintf("%s: %s %s(%s)\n",
+                   ctime(time()),real_name,
+                   (stringp(erstie)?sprintf("[Erstie: %s] ",erstie):""),
+                   call_sefun("query_ip_number",TI)));
+
+  return 1;
+}
+
+// ermittelt alle existierenden Spieler, die ein Savefile in /secure/save
+// haben.
+// ([ "a": ({...namen...}), "b": ({...namen...}), ... ]) 
+public mapping get_all_players() {
+  string *dirs=({"a","b","c","d","e","f","g","h","i","j","k","l","m","n","o",
+      "p","q","r","s","t","u","v","w","x","y","z"});
+  mapping allplayer=([]);
+  string *tmp;
+  foreach(string dir: dirs) {
+    tmp=get_dir("/secure/save/"+dir+"/*")
+      - ({".","..",".KEEP",".svn"});
+    allplayer[dir] = map(tmp,function string (string fn) 
+                     { return explode(fn,".")[0]; } );
+  }
+  return allplayer;
+}
+
+// *************** interne Funktionen ********************************
+protected void create()
+{
+  userlist=m_allocate(0,12);
+  update_late_players();
+#ifdef _PUREFTPD_
+  read_ftp_users();
+#endif
+}
+
+//verstorbene Spieler einlesen
+void update_late_players() {
+  string read;
+  string *tmp;
+  
+  lateplayers=0;
+  
+  read=read_file("/"SECUREDIR"/LATE_PLAYERS");
+  if(!read || read=="")
+  {
+    return;
+  }
+  
+  tmp=explode(read,"\n");
+  if(!sizeof(tmp))
+  {
+    return;
+  }         
+  
+  lateplayers=tmp; 
+}
+
+
+// Daten aus der Userlist inkl. Passworthash zurueckliefern. Macht ggf.
+// find_userinfo(). Nur masterintern aufrufbar.
+protected mixed *get_full_userinfo(string user) {
+  if(!user||user=="")
+    return 0;
+  user=explode(user,".")[0];
+  if (!member(userlist,user) && !find_userinfo(user))
+    return 0;
+
+  return({user,userlist[user,USER_PASSWORD],userlist[user,USER_LEVEL],
+      userlist[user,USER_DOMAIN], userlist[user,USER_OBJECT],
+      userlist[user,USER_CREATION_DATE], 0, 0, userlist[user,USER_GUILD],
+      userlist[user,USER_EKTIPS],userlist[user,USER_FPTIPS],
+      userlist[user,USER_UIDS_TO_TAKE_CARE]});
+}
+
+// Userdaten aus der Userlist im Savefile in /secure/save/ speichern.
+protected void save_userinfo(string user) {
+  if(!user||user=="")
+    return;
+  user=explode(user,".")[0];
+  if (!member(userlist,user)) return;
+  name = user;
+  level = userlist[name,USER_LEVEL];
+  domains = userlist[name,USER_DOMAIN];
+  shell = userlist[name,USER_OBJECT];
+  password = userlist[name,USER_PASSWORD];
+  creation_date = userlist[name,USER_CREATION_DATE];
+  if (!creation_date) creation_date = -1;
+  ep = userlist[name,USER_EP];
+  if (!ep) ep="";
+  ek = userlist[name,USER_EK];
+  if (!ek) ek="";
+  mq = userlist[name,USER_MQ];
+  if (!mq) mq="";
+  guilds = userlist[name,USER_GUILD];
+  ektips=userlist[name,USER_EKTIPS];
+  if(!ektips) ektips="";
+  fptips=userlist[name,USER_FPTIPS];
+  if(!fptips) fptips="";
+  uidstotakecare=userlist[name,USER_UIDS_TO_TAKE_CARE];
+
+  if (save_object(SECURESAVEPATH+name[0..0]+"/"+name) != 0) {
+    // autsch. Buggen damit dieser moeglichst schnell auffaellt, dass hier
+    // Savefiles in /secure/save/ nicht geschrieben wurden.
+    raise_error(sprintf(
+          "Savefile %O konnte nicht erstellt werden!\n",
+          SECURESAVEPATH+name[0..0]+"/"+name));
+  }
+}
+
+// In welchen Regionen ist der Spieler Regionsmagier?
+protected void set_domains(string player, string *domains)
+{
+  // wenn der Magier jetzt Domains nicht mehr hat, muessen die aus 'userids'
+  // entfernt werden, das uebernimmt RemoveWizardFromUID().
+  if (pointerp(userlist[player, USER_DOMAIN])) {
+    string *removeduids=
+      ((string*)userlist[player, USER_DOMAIN] | domains) - domains;
+    foreach(string uid: removeduids)
+      RemoveWizardFromUID(uid, player);
+  }
+  // gecachtes Alias fuer player loeschen
+  m_delete(uidaliase,player);
+  userlist[player, USER_DOMAIN]=domains;
+  save_userinfo(player);
+  // UID-zu-Magier-Mapping aktualisieren
+  QueryUIDsForWizard(player);
+}
+
+// In welche Gilden ist der Spieler Gildenmagier?
+protected void set_guilds(string player, string *guilds)
+{
+  // wenn der Magier jetzt Gilden nicht mehr hat, muessen die aus 'userids'
+  // entfernt werden, das uebernimmt RemoveWizardFromUID().
+  if (pointerp(userlist[player, USER_GUILD])) {
+    string *removeduids=
+      ((string*)userlist[player, USER_GUILD] | guilds) - guilds;
+    foreach(string uid: removeduids)
+      RemoveWizardFromUID(uid, player);
+  }
+  // gecachtes Alias fuer player loeschen
+  m_delete(uidaliase,player);
+  userlist[player, USER_GUILD]=guilds;
+  save_userinfo(player);
+  // UID-zu-Magier-Mapping aktualisieren
+  QueryUIDsForWizard(player);
+}
+
+// Userinfo-Cache expiren...
+protected void _cleanup_uinfo()
+{
+    foreach(string user: userlist) {
+        if ((time() - userlist[user,USER_TOUCH]) > 1800
+            && !call_sefun("find_player",user))
+          m_delete(userlist,user);
+    }
+}
+
+// expandiert einige 'Aliase' in ein Array von allen UIDs, fuer die sie
+// stehen. Bsp: "region" -> d.region.* + region + d.region,
+// "zauberer" -> GUILD.zauberer, "p.service" -> p.service.* oder auch
+// "magier" -> QueryUIDsForWizard().
+// Das erfolgt ueber Lookup der entsprechenden Verzeichnisse auf der PLatte.
+// Da zusaetzlich auch noch jede Menge find_userinfo() dazu kommen, ist das
+// recht aufwaendig. Damit das ganze nicht jedesmal erfolgen muss, wird das
+// Ergebnis gecacht und QueryUIDAlias() nutzt den Cache.
+private string* ExpandUIDAlias(string alias, int rec) {
+
+  string *uids=({});
+
+  // Regionsname?
+  if (file_size("/"DOMAINDIR"/"+alias) == FSIZE_DIR) {
+    //generelle Pseudo-UID 'd.region' und 'region' fuer geloeschte
+    //Magier dieser Region
+    uids += ({DOMAINDIR"."+alias, alias});
+    //alle Magier-Verzeichnisse ermitteln:
+    string tmpdir="/"DOMAINDIR"/"+alias+"/";
+    foreach(string dir: (get_dir(tmpdir+"*") || ({}))
+                          - ({".","..",".svn"})) {
+      // schauen, obs nen (sichtbares) Verzeichnis ist und ob der Magier
+      // existiert. Letzteres aber nur, falls die Rekursionstiefe min. 100
+      // ist, da beim Nachschauen eines Magiers mit (mehreren)
+      // RM-Posten, der in der Region RMs aus anderen Regionen hat, leicht
+      // Rekursionstiefen von 20 (*4) auftreten koennen, wenn noch gar
+      // keine UIDs im Cache sind (find_userinfo() ruft indirekt diese
+      // Funktion).
+      if (dir[0]!='.' 
+          && file_size(tmpdir+dir) == FSIZE_DIR
+#if __MAX_RECURSION__ > 99
+          && find_userinfo(dir)
+#endif
+          )
+          uids += ({DOMAINDIR"."+alias+"."+dir});
+    }
+  }
+  // Gildenname?
+  else if (GUILDMASTER->ValidGuild(alias)) {
+      uids += ({GUILDID"."+alias});
+      //hat die Gilde ein Projektverzeichnis?
+      if (file_size("/"PROJECTDIR"/"+alias) == FSIZE_DIR) {
+          uids += ({PROJECTDIR"."+alias});
+      }
+      // jetzt haben dummerweise die Spellbooks meist nicht den gleichen
+      // Namen wie die Gilde. D.h. die Gilde muss nun noch nach dem
+      // Namen des Spellbooks gefragt werden, weil dessen UID nicht
+      // unbedingt gleich dem der Gilde ist. *seufz*
+      string spbook;
+      object guild;
+      catch(guild=load_object(GUILDDIR"/"+alias));
+      if (objectp(guild) 
+          && (sizeof(spbook=(string)
+                 guild->QueryProp(P_GUILD_DEFAULT_SPELLBOOK)))
+                && spbook!=alias)
+          uids += ({GUILDID"."+spbook});
+  }
+  // Spieler/Magier-UID?
+  else if (find_userinfo(alias)) {
+    // wenn rec > 0, wird eine Spieler-UID als Alias aufgefasst und zu seinen
+    // UIDs expandiert. Hierbei erfolgt aber nur eine Rekursion.
+    if (!rec) uids = QueryUIDsForWizard(alias, 1);
+    else uids = ({alias});
+  }
+  // Projektkrams? -> alle Subdirs von /p/ ausser /p/service selber.
+  else if (alias==PROJECTDIR) {
+    foreach(string dir: (get_dir("/"PROJECTDIR"/*") || ({}))
+                         - ({".","..",".svn","service"})) {
+      if (dir[0]!='.' &&
+          file_size("/"PROJECTDIR"/"+dir) == FSIZE_DIR)
+          uids += ({PROJECTDIR"."+dir});
+    }
+  }
+  // p.service? -> Alle Subdirs von /p/service.
+  else if (alias==PROJECTDIR".service") {
+    foreach(string dir: (get_dir("/"PROJECTDIR"/service/*") || ({}))
+                         - ({".","..",".svn"})) {
+      if (dir[0]!='.' &&
+          file_size("/"PROJECTDIR"/service/"+dir) == FSIZE_DIR)
+          uids += ({PROJECTDIR".service."+dir});
+    }
+  }
+  // wenn nix zutrifft -> unexpandiert zurueckgeben
+  else
+    uids = ({alias});
+
+  // im Cache vermerken
+  if (sizeof(uidaliase) >= __MAX_MAPPING_KEYS__)
+      uidaliase=m_allocate(1);
+  // auch vermerken, wenn keine UIDs ermittelt wurden.
+  uidaliase += ([alias: uids]);
+  return uids;
+}
+
