diff --git a/std/shells/magier/admin.c b/std/shells/magier/admin.c
new file mode 100644
index 0000000..a41d1b7
--- /dev/null
+++ b/std/shells/magier/admin.c
@@ -0,0 +1,428 @@
+// MorgenGrauen MUDlib
+//
+// admin.c
+//
+// $Id: admin.c 8755 2014-04-26 13:13:40Z Zesstra $
+#pragma strict_types
+#pragma save_types
+#pragma range_check
+#pragma no_clone
+#pragma pedantic
+
+#include <udp.h>
+#include <wizlevels.h>
+#include <input_to.h>
+
+#define NEED_PROTOTYPES
+#include <magier.h>
+#include <player.h>
+
+inherit "/std/util/cidr";
+
+mixed _query_localcmds()
+{
+  return ({({"udpq","_udpq",0,LEARNER_LVL}),
+           ({"shutdown","shut_down_game",0,ARCH_LVL}),
+           ({"addmaster","_addmaster",0,GOD_LVL}),
+           ({"removemaster","_removemaster",0,GOD_LVL}),
+           ({"addguildmaster", "_addguildmaster", 0, GOD_LVL}),
+           ({"removeguildmaster", "_removeguildmaster", 0, GOD_LVL}),
+           ({"suender","sinners",0,WIZARD_LVL}),
+           ({"banish","banish", 0, WIZARD_LVL}),
+           ({"mbanish","mbanish", 0, WIZARD_LVL}),
+           ({"tbanish","tbanish", 0, WIZARD_LVL}),
+           ({"sbanish","sbanish", 0, WIZARD_LVL})});
+}
+
+static int _udpq(string str)
+{
+  string ret, mud, type;
+
+  if (!(str=_unparsed_args()) || str=="" || sscanf(str,"%s %s",mud,type)<2)
+  {
+    write("Syntax: udpq mud type\n");
+    return 1;
+  }
+  if (member(({"commands","email","hosts","inetd","list","mud_port","time",
+         "version"}),type)==-1)
+    write("TYPEs: commands, email, hosts, inetd, list, mud_port, time, version\n");
+  if (ret=(string)INETD->_send_udp(mud,([SENDER:getuid(), REQUEST:QUERY, DATA:type]),1))
+    write(ret);
+  else
+    write("Anfrage abgeschickt.\n");
+  return 1;
+}
+
+static int shut_down_game(string str)
+{
+  if (!IS_ARCH(this_object()) || this_object()!=this_interactive())
+    return 0;
+  _notify_fail("Du musst einen Grund dafuer angeben.\n");
+  if (!str) return 0;
+  write( "Direkter shutdown mit Grund \""+str+"\"?\n" );
+  input_to("shut_down_game_2",INPUT_PROMPT, "(ja/nein) :", str);
+  return 1;
+}
+
+static int shut_down_game_2(string arg,string str)
+{
+  if (!IS_ARCH(this_object()) || this_object()!=this_interactive())
+    return 0;
+  if( arg!="ja" ) {
+    write( "Shutdown abgebrochen.\n" );
+  } else {
+    shutdown(str);
+  }
+  return 1;
+}
+
+
+static int _addmaster(string str)
+{
+  string master, domain;
+
+  if (!GOD_SECURITY)
+  {
+    write("Das darfst Du nicht!\n");
+    return 1;
+  }
+  _notify_fail("Syntax: addmaster <user> <domain>\n");
+  if (!str) return 0;
+  if (sscanf(str,"%s %s",master,domain)!=2) return 0;
+  if (!master || !domain) return 0;
+  if (!"/secure/master"->add_domain_master(master,domain))
+    write("Hat nicht funktioniert.\n");
+  else
+    write("Ok.\n");
+  return 1;
+}
+
+static int _removemaster(string str)
+{
+  string master, domain;
+
+  if (!GOD_SECURITY)
+  {
+    write("Das darfst Du nicht!\n");
+    return 1;
+  }
+  _notify_fail("Syntax: removemaster <user> <domain>\n");
+  if (!str) return 0;
+  if (sscanf(str,"%s %s",master,domain)!=2) return 0;
+  if (!master || !domain) return 0;
+  if (!"/secure/master"->remove_domain_master(master,domain))
+    write("Hat nicht funktioniert.\n");
+  else
+    write("Ok.\n");
+  return 1;
+}
+
+static int _addguildmaster(string str)
+{
+  string master, guild;
+  
+  if (!GOD_SECURITY)
+  {
+    write ("Das darfst Du nicht!\n");
+    return 1;
+  }
+
+  _notify_fail("Synatx: addguildmaster <user> <guild>\n");
+  if (!str) return 0;
+  if (sscanf(str, "%s %s", master, guild)!=2) return 0;
+  if (!master || !guild) return 0;
+  if (!"/secure/master"->add_guild_master(master,guild))
+    write("Hat nicht funktioniert.\n");
+  else
+    write ("Ok.\n");
+  return 1;
+}
+
+static int _removeguildmaster(string str)
+{
+  string master, guild;
+  
+  if (!GOD_SECURITY)
+  {
+    write ("Das darfst Du nicht!\n");
+    return 1;
+  }
+  _notify_fail("Syntax: removeguildmaster <user> <guild>\n");
+  if (!str) return 0;
+  if (sscanf(str, "%s %s", master, guild)!=2) return 0;
+  if (!master || !guild) return 0;
+  if (!"/secure/master"->remove_guild_master(master,guild))
+    write("Hat nicht funktioniert.\n");
+  else
+    write("Ok.\n");
+  return 1;
+}
+
+static int sinners(string arg)
+{   string *parts;
+    int    i;
+
+    if ( !IS_DEPUTY(this_object()) )
+      return 0;
+
+    arg=_unparsed_args()||arg;
+
+    notify_fail(
+        "Syntax: suender ?              => Liste aller Eingetragenen\n"+
+        "        suender <name>         => Eintraege lesen\n"+
+        "        suender +<name> <text> => Eintrag hinzufuegen\n"+
+        "        suender -<name> <nr>   => Eintrag loeschen\n"+
+        "        suender !              => Alle Eintraege dumpen\n"+
+        "        suender *              => Alle Eintraege anzeigen\n");
+
+    if ( !stringp(arg) || (sizeof(arg)<1) )
+      return 0;
+
+    if ( arg=="?" )
+    {
+        write(call_other("/secure/sinmaster","ListSinners"));
+        return 1;
+    }
+    if ( arg=="!" )
+    {
+        write(call_other("/secure/sinmaster","Dump"));
+        return 1;
+    }
+    if ( arg=="*" )
+    {
+        More((string)call_other("/secure/sinmaster","Dump",1));
+        return 1;
+    }
+
+    if ( (i=sizeof(parts=explode(arg," ")))<1 )
+      return 0;
+
+    if ( parts[0][0..0]=="-" )
+    {
+      if ( i<2 )
+        return 0;
+      write(call_other("/secure/sinmaster","RemoveSin",
+            lowerstring(parts[0][1..]),
+            to_int(parts[1])));
+    }
+    else if ( parts[0][0..0]=="+" )
+    {
+      if ( i<2 )
+        return 0;
+      write(call_other("/secure/sinmaster","AddSin",
+            lowerstring(parts[0][1..]),
+            implode(parts[1..]," ")));
+    }
+    else
+    {
+      if ( i>1 )
+        return 0;
+      write(call_other("/secure/sinmaster","ListSins",
+            lowerstring(parts[0])));
+    }
+    return 1;
+}
+
+static int banish(string str)
+{
+  string grund, name;
+  int force;
+
+  if ( !LORD_SECURITY && !IS_DEPUTY(secure_euid()) )
+      return 0;
+
+  if ( !str || !stringp(str) || !sizeof(str) ) {
+      write("Syntax: banish [-f] <name> [<grund>]\n");
+      return 1;
+  }
+
+  str = _unparsed_args();
+
+  if ( explode(str, " ")[0] == "-f" ){
+      str = implode( explode(str, " ")[1..], " " );
+      force = 1;
+  }
+
+  if ( sscanf( str, "%s %s", name, grund ) != 2 )
+      name=str;
+
+  if ( !name || !sizeof(name) ){
+    write("Syntax: banish [-f] <name> [<grund>]\n");
+    return 1;
+  }
+
+  name=lower_case(name);
+  "/secure/master"->BanishName( name, grund, force );
+  return 1;
+}
+
+static int mbanish(string str)
+{
+    string grund, name, *namen, txt, *dummy;
+    mapping list;
+    int i;
+
+    if ( !IS_DEPUTY(secure_euid()) )
+        return 0;
+
+    _notify_fail( "Syntax: mbanish <name> [<grund>]\n" );
+
+    if ( !str || !stringp(str) || !sizeof(str) ){
+        if ( !mappingp(list = (mapping)"/secure/merlin"->MBanishList()) ||
+             !(i = sizeof(list)) ){
+            write( "Momentan ist kein Spieler auf der mbanish-Liste.\n" );
+            return 1;
+        }
+
+        txt = "      Name     | gebanisht von |                    Grund\n" +
+            "=============================================================" +
+            "==================\n";
+
+        namen = sort_array( m_indices(list), #'</*'*/ );
+
+        for ( ; i--; ){
+            dummy = explode( break_string( list[namen[i],0] ||
+                                                 "-- keine Begruendung --", 45 ),
+                                   "\n" ) - ({""});
+
+            txt += sprintf( "  %-11s  |  %-11s  |  %s\n",
+                            capitalize( namen[i] ),
+                            capitalize( list[namen[i],1] || "" ),
+                            capitalize( implode( dummy, "\n               |"
+                                                 "               |  " ) ) );
+        }
+
+        More(txt);
+
+        return 1;
+    }
+
+    if ( sscanf( str, "%s %s", name, grund ) !=2 )
+        name = str;
+
+    if ( !name || !sizeof(name) )
+        return 0;
+
+    name = lower_case(name);
+
+    if ( !grund || !stringp(grund) || lower_case(grund) != "loeschen" ){
+        "/secure/merlin"->MBanishInsert( name, grund, this_interactive() );
+        write( "Du setzt "+capitalize(name)+" auf die MBanish-Liste.\n" );
+    }
+    else{
+        if ( !ARCH_SECURITY ){
+            write( "Das duerfen nur Erzmagier.\n" );
+            return 1;
+        }
+        "/secure/merlin"->MBanishDelete( name );
+        write( "Du loescht "+capitalize(name)+" von der MBanish-Liste.\n" );
+    }
+
+    return 1;
+}
+
+
+static int tbanish( string str )
+{
+  string name;
+  int days;
+
+  if ( !IS_DEPUTY(secure_euid()) )
+      return 0;
+
+  _notify_fail("Syntax: tbanish <name> <tage>\n");
+
+  if ( !str || !stringp(str) || !sizeof(str) )
+    return 0;
+
+  if ( sscanf(str,"%s %d",name,days) != 2 )
+      return 0;
+
+  if ( !name || !sizeof(name) )
+    return 0;
+
+  name = lower_case(name);
+
+  if ( !"/secure/master"->TBanishName( name, days ) )
+      return 1;
+
+  if ( !days )
+      write( "Okay, keine Spielpause fuer "+capitalize(name)+" mehr.\n" );
+  else
+      write( "Du verpasst "+capitalize(name)+" eine Spielpause fuer "+
+             (days>0 ? days+" Tage" : "laaaange Zeit")+".\n" );
+  return 1;
+}
+
+static int sbanish( string str )
+{
+    string ip;
+    int days;
+    mapping sites;
+
+    // Mindestens L26 fuer diesen Befehl
+    if ( secure_level() <= DOMAINMEMBER_LVL )
+        return 0;
+
+    if ( !str || !stringp(str) || !sizeof(str) ){
+        if ( !sizeof(sites = (mapping)MASTER->SiteBanish( 0, 0 )) ){
+            write( "Es sind zur Zeit keine Adressen gesperrt!\n" );
+            return 1;
+        }
+
+        ip = "      Adresse      |  gesperrt bis                 |  gesperrt "
+            + "durch\n========================================================"
+            + "==============\n";
+
+        int *keys = sort_array( m_indices(sites), #'</*'*/ );
+
+        foreach(int key : keys) {
+            ip += sprintf( "  %:15-s  |  %:27-s  |  %-s\n",
+                           IPv4_int2addr(key),
+                           sites[key] > 0 ? dtime(sites[key]) :
+                           "St. Nimmerleinstag", 
+                           capitalize(sites[key, 1]) );
+        }
+        write( ip + "\n" );
+        return 1;
+    }
+
+    _notify_fail("Syntax: sbanish <numerische ip> <tage>\n");
+
+    if ( sscanf( this_player()->_unparsed_args(), "%s %d", ip, days ) != 2 )
+        return 0;
+
+    if ( !ip || !sizeof(ip) )
+        return 0;
+
+//    _notify_fail( "Ungueltiges Adress-Format!\n" );
+
+    if ( !days ){
+        int res=(int)MASTER->SiteBanish(ip, 0);
+        if ( res == 1 )
+             printf( "Die Adresse '%s' ist jetzt nicht mehr gesperrt.\n",
+                     ip );
+        else if ( res == 0 )
+             printf( "Die Adresse '%s' war gar nicht gesperrt!\n",
+                     ip );
+        else
+            printf( "Du darfst nur eigene Sperrungen wieder aufheben!\n" );
+    }
+    else {
+        int res;
+        if ( days != 1 && !IS_DEPUTY(secure_euid()) )
+            write( "Du darfst Adressen nur fuer einen Tag sperren!\n" );
+        else if ( (res = (int)MASTER->SiteBanish(ip, days)) == 1 )
+             printf( "Die Adresse '%s' ist jetzt fuer %s gesperrt.\n",
+                     ip, (days > 1 ? sprintf( "%d Tage", days ) :
+                      (days > 0 ? "einen Tag" : "immer")) );
+        else if ( res == -1 )
+            write( "Du darfst " + (LORD_SECURITY ? "255 IP-Adressen"
+                                   : "nur einzelne IP-Adressen") + " sperren!\n" );
+        else if ( res == -2 )
+            write( "Du hast schon genug Adressen gesperrt!\n" );
+    }
+
+    return 1;
+}
+
