diff --git a/std/shells/magier/comm.c b/std/shells/magier/comm.c
new file mode 100644
index 0000000..0cbd266
--- /dev/null
+++ b/std/shells/magier/comm.c
@@ -0,0 +1,149 @@
+// MorgenGrauen MUDlib
+//
+// comm.c
+//
+// $Id: comm.c 8755 2014-04-26 13:13:40Z Zesstra $
+#pragma strict_types
+#pragma save_types
+#pragma range_check
+#pragma no_clone
+#pragma pedantic
+
+#include <wizlevels.h>
+#include <magier.h>
+#define NEED_PROTOTYPES
+#include <thing/properties.h>
+#include <thing/description.h>
+#include <player.h>
+#include <properties.h>
+
+
+//                           ###########
+//############################ ECHOALL ################################
+//                           ###########
+
+static int _echoall(string str)
+{
+  if (!(str=_unparsed_args()))
+    return USAGE("echoall <text>\n");
+  str=break_string(str);
+  shout(str);
+  printf(str);
+  return 1;
+}
+
+//                           ##########
+//############################ ECHOTO #################################
+//                           ##########
+
+static int _echoto(string str)
+{
+  object ob;
+  string who;
+  string msg;
+
+  if (!(str=_unparsed_args())||sscanf(str, "%s %s", who, msg) != 2)
+    return USAGE("echoto <spieler> <text>\n");
+  ob = find_player(lower_case(who));
+  if (!ob)
+  {
+    printf("echoto: Es ist kein Spieler '%s' eingeloggt.\n",who);
+    return 1;
+  }
+  msg=break_string(msg,78);
+  tell_object(ob,msg);
+  printf("%s->%s",ob->Name(WEN),msg);
+  return 1;
+}
+
+//                           #########
+//############################ MECHO ##################################
+//                           #########
+
+static int _mecho(string str)  {
+  object *who;
+  int i;
+
+  if (!sizeof(str=_unparsed_args()))
+    return USAGE("mecho <text>\n");
+  who=users();
+  i=sizeof(who);
+  while(i--)if (IS_LEARNER(who[i]))
+      tell_object(who[i], break_string(str,78));
+  return 1;
+}
+
+//                            ########
+//############################# PING ##################################
+//                            ########
+
+static int _ping(string str)
+{
+  object pl;
+
+  if (!sizeof(str))
+    return USAGE("ping <spielername>\n");
+  if (!(pl=find_player(lower_case(str))))
+    return
+      _notify_fail(sprintf("ping: Spieler %s nicht gefunden.\n",
+                           capitalize(str))),0;
+  tell_object(pl,sprintf("%s pingt Dich an.\a\n",capitalize(getuid())));
+  return printf("PINGGGGGGG! DAS sollte %s auf Dich aufmerksam "
+                "gemacht haben.\n",capitalize(getuid(pl))),1;
+}
+
+//                           ##########
+//############################ OROPAX #################################
+//                           ##########
+
+int _oropax(string cmdline)
+{
+  int level,old,new;
+
+  cmdline=_unparsed_args();
+  old=QueryProp(P_EARMUFFS);
+  if (!sizeof(cmdline)||cmdline=="0")
+  {
+    if (old)
+    {
+      printf("Du nimmst das Oropax aus Deinen Ohren und hoerst "
+             "wieder allen anderen zu.\n");
+      SetProp(P_EARMUFFS, 0);
+    }
+    else
+      printf("Du hast doch gar kein Oropax in den Ohren.\n");
+    return 1;
+  }
+  if (sscanf(cmdline, "%d", level) == 0 || level < 1)
+    return USAGE("oropax [<magierlevel>]\n");
+  if ((new=SetProp(P_EARMUFFS, level))==level)
+  {
+    if (new==old)
+      return printf("Du hattest Deine Oropaxmenge schon auf Magierlevel "
+                    "%d angepasst.\n",level),1;
+    if (new>old)
+      return printf("Du stopfst Dir soviel Oropax in die Ohren, dass "
+                    "Du nur noch %s ab\nLevel %d hoerst.\n",
+                    level>=LEARNER_LVL?"Magier":"Seher",level),1;
+    return printf("Du nimmst soviel Oropax aus den Ohren, dass Du ab "
+                  "sofort wieder %s ab\nLevel %d verstehst.\n",
+                  level>=LEARNER_LVL?"Magier":"Seher",level),1;
+  }
+  return printf("Du stopfst und stopfst, bis Dir das Oropax wieder zur "
+                "Nase herauskommt.\nLeider musst Du damit Magier ab Level "
+                "%d weiterhin hoeren.\n",new),1;
+}
+
+//                         ###################
+//########################## INITIALISIERUNG #############################
+//                         ###################
+
+static mixed _query_localcmds()
+{
+  return
+    ({({"oropax","_oropax",0,LEARNER_LVL}),
+      ({"echoto","_echoto",0,LEARNER_LVL}),
+      ({"echoall","_echoall",0,LEARNER_LVL}),
+      ({"mecho","_mecho",0,LEARNER_LVL}),
+      ({"ping","_ping",0,LEARNER_LVL})});
+}
