diff --git a/std/shells/magier/moving.c b/std/shells/magier/moving.c
new file mode 100644
index 0000000..3095a3f
--- /dev/null
+++ b/std/shells/magier/moving.c
@@ -0,0 +1,232 @@
+// MorgenGrauen MUDlib
+//
+// moving.c
+//
+// $Id: moving.c 9142 2015-02-04 22:17:29Z Zesstra $
+#pragma strict_types
+#pragma save_types
+#pragma range_check
+#pragma no_clone
+#pragma pedantic
+
+#define NEED_PROTOTYPES
+#include <magier.h>
+#include <thing/properties.h>
+#include <living/moving.h>
+#include <player.h>
+#undef NEED_PROTOTYPES
+#include <wizlevels.h>
+#include <moving.h>
+#include <properties.h>
+
+private mixed verfolger()
+{
+  mixed *pur;
+
+  if (!pointerp(pur=QueryProp(P_PURSUERS))) return 0;
+  else return pur[0];
+}
+
+//                         #########
+//########################## IN+AT ############################
+//                         #########
+
+static int _move_base(object target, object old_room, string cmd)
+{
+  if (environment()!=target)
+    if (IS_ARCH(this_object()))
+    {
+      __set_environment(this_object(),target);
+      printf("%s: Bewegung hat nicht geklappt. Versuche es mit "
+             "set_environment... %s.\n.",query_verb(),
+             environment()==target?"hat geklappt":"erfolglos");
+    }
+  else
+    printf("%s: Bewegung hat nicht geklappt.\n",query_verb());
+  if (environment()!=target) return 1;
+  command(cmd);
+  if (old_room) move_object(old_room);
+  else
+    return printf("%s: Ursprungsraum wurde zerstoert.\n",query_verb()),1;  
+  if (environment()!=old_room)
+  {
+    if (IS_ARCH(this_object()))
+    {
+      __set_environment(this_object(),old_room);
+      printf("%s: Zurueckbewegen hat nicht geklappt. Versuche es mit "
+             "set_environment ... %s.\n",query_verb(),
+             environment()==old_room?"hat geklappt":"erfolglos");
+    }
+    else
+      printf("at: Zurueckbewegen hat nicht geklappt.\n");
+  }
+  return 1;
+}
+
+static int _in_room(string str)
+{
+  string room;int size;
+  object old_room;
+  string cmd,err;
+
+  if (!sizeof(str=_unparsed_args()) ||
+      !sizeof(str=regreplace(str,"^ *","",1)) ||
+      sscanf(str, "%s %s", room, cmd) != 2)
+    return USAGE("in <raum> <befehl>\n");
+  old_room = environment();
+  room=(string)call_other(master(),"_get_path",room,getuid());
+  if (err=catch(move_object(room)))
+  {
+    if (catch(size=file_size(room+".c"))||size<1)
+      printf("%s: %s.c: Datei nicht vorhanden.\n",query_verb(),room);
+    else
+      printf("%s: Bewegung nach %s hat nicht funktioniert: %s\n",
+             query_verb(),room,err);
+    return 1;
+  }
+  return _move_base(find_object(room),old_room,cmd);
+}
+
+static int _at_player(string dest)
+{
+  object ob,old_room;
+  mixed tmp;
+  string cmd;
+
+  if (!sizeof(dest=_unparsed_args()) ||
+      !sizeof(dest=regreplace(dest,"^ *","",1)) ||
+      sscanf(dest, "%s %s", dest, cmd) != 2)
+    return USAGE("at <lebewesen> <befehl>\n");
+  if (!(ob=find_living(dest)))
+  {
+    tmp=match_living(dest,1);
+    if (stringp(tmp)) ob = find_living(tmp);
+  }
+  if (!ob||!(ob=environment(ob)))
+    return _notify_fail(sprintf("at: Lebewesen \'%s\' nicht gefunden.\n",
+                                dest)),0;
+  old_room=environment();
+  move_object(ob);
+  return _move_base(ob,old_room,cmd);
+}
+
+//                           ########
+//############################ GOTO ############################
+//                           ########
+
+static object find_living_nr(string str)
+{ string name,check;
+  int nr;
+  object*livings;
+  if(sscanf(str,"%s %d%s",name,nr,check)<2||sizeof(check))
+    return find_living(str);
+  if(!sizeof(livings=filter((find_livings(name)||({})),#'environment))
+     ||nr<1||sizeof(livings)<nr)
+    return 0;
+  return livings[nr-1];
+}
+
+static int _goto(string dest){
+  mixed target;
+  string target2,err;
+
+  if (!sizeof(dest=_unparsed_args()))
+    return USAGE("goto [lebewesen|filename]\n");
+  if (!((target=find_living_nr(dest)) && (target=environment(target))))
+  {
+     target2=target=(mixed)call_other(master(),"_get_path",dest,getuid());
+     if (!find_object(target))
+     {
+       if (target2[<1]=='.') target2+="c";
+       if (target2[<2..<1]!=".c") target2+=".c";
+       notify_fail(sprintf("goto: Datei %O nicht vorhanden.\n",target));
+       if (!(file_size(target2)>-1||
+           file_size(implode(explode(target,"/")[0..<2],"/")+
+               "/virtual_compiler.c")>-1)||(err=catch(call_other(target,"?"))))
+       {
+         if (err)
+              notify_fail(sprintf("goto: Fehler beim Teleport nach %O:\n%s\n",
+                      dest,implode(explode(err,"\n")," ")));
+         target=match_living(dest,1);
+         if (!(stringp(target)&&(target=find_living(target))&&
+               (target=environment(target))))
+           return 0;
+       }
+     }
+  }
+  if (verfolger()) _verfolge("");
+  if (move(target,M_TPORT|M_NOCHECK)<0)
+    printf("Bewegung fehlgeschlagen!\n");
+  return 1;
+}
+
+//                           ########
+//############################ HOME ############################
+//                           ########
+
+static int _home()
+{
+  string dest;
+  if (verfolger()) _verfolge("");
+  dest="/players/" + getuid() + "/workroom";
+  if (file_size(dest+".c")<1||catch(call_other(dest,"???")))
+  {
+    printf("Fehler beim Laden Deines Workrooms.\n"
+           "Gehe zum Magiertreff.\n");
+    dest="/secure/merlin";
+  }
+  
+  if (move(dest,M_TPORT|M_NOCHECK)<0)
+    printf("Bewegung fehlgeschlagen!\n");
+  return 1;
+}
+
+//                        ###############
+//######################### +MAGIERNAME ##########################
+//                        ###############
+
+static int _go_wiz_home(string str)
+{
+  _notify_fail("Syntax: '+magiername'\n");
+  if(sizeof(query_verb())>1) str=query_verb()[1..];
+  if(!sizeof(str)) return 0;
+  if(query_verb()[0]!='+') return 0;
+  str=(old_explode(str," ")-({0}))[0];
+  if(!sizeof(str)) return 0;
+  str=lower_case(str);
+  if (str=="merlin")
+  {
+    move("/secure/merlin",M_TPORT|M_NOCHECK);
+    return 1;
+  }
+  if ((!call_other(master(),"get_userinfo",str))||
+      !IS_LEARNER(str))
+  {
+    printf("Es gibt keinen Magier namens %s.\n",
+           capitalize(str));
+    return 1;
+  }
+  if (file_size("/players/"+str+"/workroom.c")<1)
+  {
+    printf("%s hat keinen Workroom.\n",capitalize(str));
+    return 1;
+  }
+  if (catch(call_other("/players/"+str+"/workroom","???")))
+  {
+    printf("Der Workroom von %s hat Fehler.\n",capitalize(str));
+    return 1;
+  }
+  move("/players/"+str+"/workroom",M_TPORT|M_NOCHECK);
+  return 1;
+}
+
+
+static mixed _query_localcmds()
+{
+  return
+    ({({"goto","_goto",0,LEARNER_LVL}),
+      ({"in","_in_room",0,LEARNER_LVL}),
+      ({"at","_at_player",0,LEARNER_LVL}),
+      ({"home","_home",0,WIZARD_LVL}),
+      ({"+","_go_wiz_home",1,LEARNER_LVL})});
+}
