diff --git a/std/shells/magier.c b/std/shells/magier.c
new file mode 100644
index 0000000..dc2a150
--- /dev/null
+++ b/std/shells/magier.c
@@ -0,0 +1,326 @@
+// MorgenGrauen MUDlib
+//
+// shells/magier.c -- magier shell
+//
+// $Id: magier.c 9231 2015-05-27 21:53:32Z Zesstra $
+
+//
+// Magiershell Basisfile
+//
+// Ueberarbeitung abgeschlossen am 18.12.2002
+//
+// Dank an Zwirch@PK, Rikus@MG, Zoran@PK, Vanion@MG
+// und viele andere, die ich vergessen habe.
+//
+// Fragen und Bughinweise an Mandragon@MG oder einen
+// Erzmagier Deiner Wahl.
+//
+// Zur Shell gehoeren ausser dieser Datei:
+// admin.c:      Administrative Befehle
+// comm.c:       Kommunikationsbefehle
+// fileedit.c:   Befehle zum Veraendern von Dateien
+// fileview.c:   Befehle zum Lesen von Dateien
+// magier_ext.c: Generelle Magierbefehle
+// moving.c:     Bewegungsbefehle
+// objects.c:    Erzeugen und zerstoeren von Objekten
+// parsing.c     Auswertung von Pfadangaben und Wildcards
+// players.c:    Befehle zur Beeinflussung von Spielern
+// todo.c:       Implementation der Todoliste
+// upd.c:        Der Befehl upd
+// magier.h      Generelle Header-Datei
+//
+
+#pragma strict_types,save_types
+
+inherit "/std/player/base";
+inherit "/std/shells/magier/magier_ext";
+
+#include <wizlevels.h>
+#include <moving.h>
+#include <properties.h>
+#include <new_skills.h>
+#include <config.h>
+
+protected void create()
+{
+  if (!clonep() || object_name(this_object()) == __FILE__[0..<3]) {
+      set_next_reset(-1);
+      return;
+  }
+
+  base::create();
+
+  Set(P_RACE, SAVE, F_MODE);
+  Set(P_ZAP_MSG, SAVE, F_MODE);
+  Set(P_TRANK_FINDEN, SAVE, F_MODE);
+  Set(P_HANDS, SAVE, F_MODE);
+  Set(P_RACESTRING, SAVE, F_MODE);
+  SetDefaultHome("/gilden/abenteurer");
+  SetProp(P_ENEMY_DEATH_SEQUENCE,
+    ([17:"Der Tod schuettelt verstaendnislos den Kopf.\n\n",
+      18:"Der Tod sagt: WIESO MUSSTEST DU DICH AUCH UNBEDINGT "
+      "MIT EINEM MAGIER ANLEGEN?\n\n"]));
+  SetProp(P_ATTRIBUTES_OFFSETS,([]));
+  SetProp(P_AVERAGE_SIZE,185);
+  if(!QueryProp(P_DEFAULT_GUILD)) SetProp(P_DEFAULT_GUILD,"abenteurer");
+}
+
+protected void create_super() {
+  set_next_reset(-1);
+}
+
+
+protected void heart_beat()
+{
+  mixed *en;
+
+  if (!QueryProp(P_WANTS_TO_LEARN)||((en=QueryEnemies())&&sizeof(en[0])))
+    base::heart_beat();
+  else if (!CheckTelnetKeepAlive()) {
+    // Wenn der Magier kein Telnet Keep-Alive wuenscht, kann der HB ganz
+    // abgeschaltet werden. Sonst muss er aber weiterlaufen, damit
+    // CheckTelnetKeepAlive() regelmaessig gerufen wird.
+    set_heart_beat(0);
+  }
+}
+
+
+public varargs int remove(int silent)
+{
+  string workroom;
+
+  if (IS_WIZARD(this_object()))
+    workroom = "/players/"+getuid()+"/workroom";
+  else
+    workroom = "/secure/merlin";
+  if( !environment() || object_name(environment()) != workroom )
+    catch(move(workroom, M_GO, "nach Hause"));
+  return base::remove(silent);
+}
+
+public string NotifyDestruct(object caller) {
+
+  if (previous_object() != master()
+      || object_name(this_object()) == __FILE__[..<3])
+    return 0;
+  
+  // Nicht-EMs sollen keine EMs zerstoeren koennen, woraufhin auch evtl.
+  // EM-Tools rumliegen koennten.
+  if ( IS_ARCH(this_object()) && caller != this_object() 
+      && getuid(caller) != ROOTID
+      && (process_call() || !ARCH_SECURITY) )
+    return "Das Zerstoeren von EMs ist ein Fehler. ;-)\n";
+
+  return ::NotifyDestruct(caller);
+}
+
+void reset()
+{
+  if (!interactive(this_object()))
+  {
+    quit();
+    if (this_object())
+      remove();
+    if (this_object())
+        destruct(this_object());
+    return;
+  }
+}
+
+//                ####################
+//################# Query-Funktionen ##################
+//                ####################
+
+varargs int id (string str) {
+  if (QueryProp(P_INVIS) &&
+      (!this_interactive() ||!IS_LEARNER(this_interactive())))
+    return 0;
+  return ::id(str);
+}
+
+
+static string *_query_racestring()
+{
+  if (pointerp(Query(P_RACESTRING)))
+    return Query(P_RACESTRING);
+  else
+    return
+    ({QueryProp(P_RACE),QueryProp(P_RACE),
+      QueryProp(P_RACE),QueryProp(P_RACE)});
+}
+
+
+static string _query_default_guild()
+{
+    return (Query(P_DEFAULT_GUILD)||"abenteurer");
+}
+
+
+static string _query_racedescr()
+{
+  return "Magier koennen einfach alles. Aber manche Magier koennen mehr.\n";
+}
+
+
+static string _query_race()
+{
+  if (previous_object() && previous_object()->query_login_object())
+    return 0;
+
+  return Query(P_RACE) ? Query(P_RACE) : Set(P_RACE, "Magier");
+}
+
+
+static mixed _query_localcmds()
+{
+  return
+    base::_query_localcmds()
+    +magier_ext::_query_localcmds();
+}
+
+
+static void upd_my_age()
+{
+  age=_age+absolute_hb_count()-_hbstop;
+  _age=age;
+  _hbstop=absolute_hb_count();
+  return;
+}
+
+
+static int _query_age()
+{
+  upd_my_age();
+  return age;
+}
+
+static int _set_earmuffs(int level)
+{
+  int maxl=1+query_wiz_level(this_object());
+  maxl = max(maxl,99);
+  return Set(P_EARMUFFS,min(maxl,level));
+}
+
+
+//                   ############################
+//#################### Interne Shell-Funktionen ####################
+//                   ############################
+
+int MayAddWeight(int w) { return 0;}
+int MayAddObject(object ob) { return 1; }
+
+
+static void initialize()
+{
+  magier_ext::initialize();
+  return;
+}
+
+
+static void FinalSetup()
+{
+  SetProp(P_CURRENTDIR,"/players/"+getuid());
+  initialize();
+  if (IS_LEARNER(this_player())) cat("/etc/WIZNEWS");
+  _age=age;
+  _hbstop=absolute_hb_count();
+  return;
+}
+
+
+void save_me(int i)
+{
+  upd_my_age();
+  base::save_me(i);
+  return;
+}
+
+
+varargs void Reconnect(int silent,string my_ip)
+{
+  base::Reconnect(silent,my_ip);
+  magier_ext::reconnect();
+  return;
+}
+
+
+void notify_player_change(string who, int rein, int invis)
+{
+  string *list,name;
+  mixed mlist;
+  int vis_change;
+
+  if (invis) name="("+who+")";
+    else name=who;
+
+  if(query_verb() && (query_verb()=="vis" || query_verb()=="invis"))
+    vis_change=1;
+
+  if (Query(P_INFORMME) && !vis_change)
+  {
+    if (rein) 
+      tell_object(this_object(),
+                  sprintf("%s ist gerade ins "MUDNAME" gekommen.\n",name));
+    else
+      tell_object(this_object(),
+                  sprintf("%s hat gerade das "MUDNAME" verlassen.\n",name));
+  }
+
+  if(Query(P_WAITFOR_FLAGS) & (0x01))return ;
+
+  if (pointerp(list=Query(P_WAITFOR))&&sizeof(list))
+    if (member(list,who)!=-1)
+      delayed_write(
+         ({
+           ({sprintf("%s%s   I S T   J E T Z T   %s !!!\n",
+                     (QueryProp(P_VISUALBELL) ? "" : sprintf("%c",7)),
+                     name,
+                     (vis_change?
+                       (rein?"S I C H T B A R":"U N S I C H T B A R"):
+                       (rein?"D A":"N I C H T   M E H R   D A"))),
+           0})
+         }));
+
+  if (rein && (sizeof(mlist=QueryProp(P_WAITFOR_REASON))) &&
+     (mappingp(mlist)) && (mlist[who]))
+        Show_WaitFor_Reason(who,invis);
+  return;
+}
+
+mixed modify_command(string str) {
+  if (previous_object() &&
+      (previous_object()!=this_object() || process_call()) )
+  {
+    if (IS_ARCH(this_object()))
+      tell_object(this_object(),
+        sprintf("Illegal modify_command(%s) from %O\n",
+        str, previous_object()));
+    return 0;
+  }
+  //////////////////////////////////////////////////////////////////////
+  // Magier-Escape-Kommandos werden behandelt 
+  if (str=="\\ESCAPE" && IS_LORD(this_object()))
+  {
+    __set_environment(this_object(),"/room/void");
+    environment()->init();
+    printf("You escaped.\n");
+    return "";
+  }
+  if (str[0..2]=="\\\\\\" && IS_LORD(this_object()))
+  {
+    str = _return_args(str);
+    string* input = explode(str[3..]," ");
+    string verb = input[0];
+    if (verb && verb!="")
+    {
+      string cmd = implode(input[1..]," ");
+      if (!__auswerten(cmd,verb))
+        SoulComm(cmd,verb);
+    }
+    return 1;
+  }
+  //////////////////////////////////////////////////////////////////////
+
+  return ::modify_command(str);
+}
+
