diff --git a/std/player/base.c b/std/player/base.c
index 2b7d6fb..7f616d0 100644
--- a/std/player/base.c
+++ b/std/player/base.c
@@ -1338,7 +1338,7 @@
       if ( input_segments[1] == "" &&
            implode(input_segments[1..],"") == "" )
       {
-        _notify("Du hast hinter dem : nix eingegeben, bitte nochmal "
+        ReceiveNotify("Du hast hinter dem : nix eingegeben, bitte nochmal "
           "versuchen.\n", MA_UNKNOWN);
         // Eine neue Eingabe wird aber nur angefordert, wenn der aktuelle
         // Input ohnehin schon aus einem input_to()-Durchlauf stammte.
@@ -1384,7 +1384,7 @@
     smart_log(error_type, player_input, obj);
   }
   else
-    _notify("Eingabe abgebrochen.\n", MA_UNKNOWN);
+    ReceiveNotify("Eingabe abgebrochen.\n", MA_UNKNOWN);
   return 1;
 }
 
@@ -1438,12 +1438,12 @@
 {
   if (answer != "j" && answer != "ja")
   {
-    _notify("Eingabe abgebrochen.\n", MA_UNKNOWN);
+    ReceiveNotify("Eingabe abgebrochen.\n", MA_UNKNOWN);
     return;
   }
   if (!obj)
   {
-    _notify(sprintf("Leider existiert das Objekt nicht mehr, an dem Du "
+    ReceiveNotify(sprintf("Leider existiert das Objekt nicht mehr, an dem Du "
             "D%s melden wolltest.", desc), MA_UNKNOWN);
     return;
   }
@@ -1451,7 +1451,7 @@
   // ggf. will das Objekte selber loggen, dann wird nicht zentral geloggt.
   if (obj->SmartLog(0, myname, str, strftime("%d. %b %Y")))
   {
-    _notify(sprintf(
+    ReceiveNotify(sprintf(
        "Du hast an %s erfolgreich %s abgesetzt.\n"
        "Hinweis: Das Objekt selber hat die Meldung protokolliert.",
        (obj->IsRoom() ? "diesem Raum" : obj->name(WEM,1)),desc),
@@ -1461,14 +1461,14 @@
   {
     // Eintragung in die Fehler-DB
     string hashkey = ({string})ERRORD->LogReportedError(err);
-    _notify(sprintf(
+    ReceiveNotify(sprintf(
           "Ein kleiner Fehlerteufel hat D%s an %s unter der ID %s "
           "notiert.", desc,
           (obj->IsRoom() ? "diesem Raum" : obj->name(WEM,1)),
           hashkey || "N/A"),
         MA_UNKNOWN);
   }
-  _notify("Vielen Dank fuer die Hilfe.\n", MA_UNKNOWN);
+  ReceiveNotify("Vielen Dank fuer die Hilfe.\n", MA_UNKNOWN);
 }
 
 /** Loggt eine Spielermeldung an Magier.
@@ -1507,7 +1507,7 @@
       err[F_TYPE]=T_REPORTED_SYNTAX;
       break;
   }
-  _notify(sprintf(
+  ReceiveNotify(sprintf(
           "Du hast %s an %s mit der Beschreibung \"%s\" eingegeben. "
           "Wurde das richtige Zielobjekt ausgewaehlt und moechtest Du "
           "speichern?", desc,
diff --git a/std/player/comm.c b/std/player/comm.c
index 135d10e..a04200c 100644
--- a/std/player/comm.c
+++ b/std/player/comm.c
@@ -107,21 +107,13 @@
   report_cache = 0;
 }
 
-// uebermittelt eine MT_NOTIFICATION an this_object(), welche nicht ignoriert
-// werden kann und auch nicht gespeichert wird.
-protected void _notify(string msg, string action) {
-  ReceiveMsg(msg,
-             MT_NOTIFICATION|MSG_DONT_BUFFER|MSG_DONT_IGNORE|MSG_DONT_STORE,
-             action, 0, this_object());
-}
-
 protected void updates_after_restore(int newflag) {
   // Altes Ignoriere loeschen...
   mixed ign = Query(P_IGNORE,F_VALUE);
   if (!mappingp(ign))
   {
     if (pointerp(ign))
-      _notify(break_string(
+      ReceiveNotify(break_string(
         "Deine Ignoriere-Einstellungen wurden soeben geloescht, "
         "weil es eine Aktualisierung der Ignorierefunktion gab, "
         "bei der eine Konversion der Daten leider nicht "
@@ -980,7 +972,7 @@
   }
 
   beep_interval=({int})QueryProp(P_MESSAGE_BEEP);
-  _notify("Ton bei Mitteilungen: "+
+  ReceiveNotify("Ton bei Mitteilungen: "+
         (beep_interval ? "aller "+beep_interval+" Sekunden." : "aus."),
         query_verb());
   return 1;
@@ -996,7 +988,7 @@
     else return 0;
   }
 
-  _notify("Senderwiederholung bei Mitteilungen: "+ 
+  ReceiveNotify("Senderwiederholung bei Mitteilungen: "+ 
           (({int})QueryProp(P_MESSAGE_PREPEND) ?  "aus" : "ein")+".",
           query_verb());
 
@@ -1015,7 +1007,7 @@
   if(stringp(verb) && verb[0] == '\'') str = verb[1..] + " " + str;
   if (str==""||str==" "||!str)
   {
-    _notify("Was willst Du sagen?",MA_SAY);
+    ReceiveNotify("Was willst Du sagen?",MA_SAY);
     return 1;
   }
   msg=permutate(str);
@@ -1045,7 +1037,7 @@
 
   if (!(str=_unparsed_args()))
   {
-    _notify("Was willst Du rufen?",MA_SHOUT);
+    ReceiveNotify("Was willst Du rufen?",MA_SHOUT);
     return 1;
   }
   chars=sizeof(str)/2;
@@ -1073,15 +1065,15 @@
   if(!IS_LEARNER(this_player()))
   {
     if(QueryProp(P_GHOST)) {
-        _notify("So ganz ohne Koerper bekommst Du keinen Ton heraus.",
+        ReceiveNotify("So ganz ohne Koerper bekommst Du keinen Ton heraus.",
                 MA_SHOUT);
         return 1;
     }
     if (QueryProp(P_SP) <(chars+20))
     {
-      _notify("Du musst erst wieder magische Kraefte sammeln.",
+      ReceiveNotify("Du musst erst wieder magische Kraefte sammeln.",
               MA_SHOUT);
-      _notify("Tip: Benutz doch mal die Ebenen (Hilfe dazu mit 'hilfe "
+      ReceiveNotify("Tip: Benutz doch mal die Ebenen (Hilfe dazu mit 'hilfe "
               "Ebenen').", MA_SHOUT);
       return 1;
     }
@@ -1112,7 +1104,7 @@
 
   if (extern_call() && this_interactive()!=ME) return 1;
   if (!who || !msg) {
-    _notify("Was willst Du mitteilen?",MA_TELL);
+    ReceiveNotify("Was willst Du mitteilen?",MA_TELL);
     return 1;
   }
 
@@ -1152,7 +1144,7 @@
                                        SENDER:    getuid(ME),
                                        DATA:     msg ]), 1))
       {
-        _notify(ret, MA_TELL);
+        ReceiveNotify(ret, MA_TELL);
       }
       else
       {
@@ -1173,15 +1165,15 @@
     if (!stringp(it))
       switch(it) {
       case -1:
-        _notify("Das war nicht eindeutig!",MA_TELL);
+        ReceiveNotify("Das war nicht eindeutig!",MA_TELL);
         return 1;
       case -2:
-        _notify("Kein solcher Spieler!",MA_TELL);
+        ReceiveNotify("Kein solcher Spieler!",MA_TELL);
         return 1;
       }
     ob = find_player(it) || find_living(it);
     if(!ob) {
-      _notify("Kein solcher Spieler!",MA_TELL);
+      ReceiveNotify("Kein solcher Spieler!",MA_TELL);
       return 1;
     }
   }
@@ -1207,7 +1199,7 @@
     _recv(ob, msg, MSGFLAG_TELL, "Du teilst " + capitalize(it) + " mit: ");
   // oder irgendwas anderes an den Absender ausgeben...
   if (!visflag && interactive(ob))
-      _notify("Kein solcher Spieler!",MA_TELL);
+      ReceiveNotify("Kein solcher Spieler!",MA_TELL);
   else if (away = ({string})ob->QueryProp(P_AWAY))
       ReceiveMsg( break_string( away, 78, capitalize(it)
                            + " ist gerade nicht da: ", BS_INDENT_ONCE ),
@@ -1220,7 +1212,7 @@
       else
         away=time2string("%h %H und %m %M",i);
 
-      _notify(sprintf("%s ist seit %s voellig untaetig.",
+      ReceiveNotify(sprintf("%s ist seit %s voellig untaetig.",
               capitalize(it),away),
               MA_TELL);
     }
@@ -1269,12 +1261,12 @@
   if (!(str=_unparsed_args()) ||
        (sscanf(str, "%s zu %s", who, msg) != 2 &&
         sscanf(str, "%s %s", who, msg) !=2 )) {
-    _notify("Was willst Du wem zufluestern?",MA_SAY);
+    ReceiveNotify("Was willst Du wem zufluestern?",MA_SAY);
     return 1;
   }
   who = lower_case(who);
   if (!(ob = present(who, environment(this_player()))) || !living(ob)) {
-    _notify(capitalize(who)+" ist nicht in diesem Raum.",MA_SAY);
+    ReceiveNotify(capitalize(who)+" ist nicht in diesem Raum.",MA_SAY);
     return 1;
   }
 
@@ -1308,7 +1300,7 @@
   if (!(str=_unparsed_args()) ||
        (sscanf(str, "%s zu %s", who, msg) != 2 &&
         sscanf(str, "%s %s", who, msg) !=2 )) {
-    _notify("Was willst Du wem aus der Ferne zufluestern?",MA_EMOTE);
+    ReceiveNotify("Was willst Du wem aus der Ferne zufluestern?",MA_EMOTE);
     return 1;
   }
 
@@ -1318,21 +1310,21 @@
     if (!stringp(it))
       switch(it){
       case -1:
-        _notify("Das war nicht eindeutig!",MA_EMOTE);
+        ReceiveNotify("Das war nicht eindeutig!",MA_EMOTE);
         return 1;
       case -2:
-        _notify("Kein solcher Spieler!",MA_EMOTE);
+        ReceiveNotify("Kein solcher Spieler!",MA_EMOTE);
         return 1;
       }
     ob = find_player(it);
     if(!ob) ob = find_living(it);
     if(!ob){
-      _notify("Kein solcher Spieler!",MA_EMOTE);
+      ReceiveNotify("Kein solcher Spieler!",MA_EMOTE);
       return 1;
     }
   }
   if (environment(ob) == environment()) {
-    _notify("Wenn jemand neben Dir steht, nimm fluester.",MA_EMOTE);
+    ReceiveNotify("Wenn jemand neben Dir steht, nimm fluester.",MA_EMOTE);
     return 1;
   }
 
@@ -1347,7 +1339,7 @@
 
   // wenn Empfaenger invis und wir kein Magier , ggf. fakefehler ausgeben.
   if (ob->QueryProp(P_INVIS) && !IS_LEARNER(this_player())) {
-    _notify("Kein solcher Spieler!",MA_EMOTE);
+    ReceiveNotify("Kein solcher Spieler!",MA_EMOTE);
     return 1;
   }
   // sonst eigene Meldung via _recv() ausgeben.
@@ -1360,7 +1352,7 @@
 
 static int _converse(string arg)
 {
-  _notify("Mit '**' wird das Gespraech beendet.",MA_SAY);
+  ReceiveNotify("Mit '**' wird das Gespraech beendet.",MA_SAY);
   if (stringp(arg) && strstr(arg, "-s") == 0)
     input_to("_converse_more", INPUT_PROMPT, "]", 1);
   else
@@ -1371,7 +1363,7 @@
 static int _converse_more(mixed str, int silent)
 {
   if (str == "**") {
-    _notify("Ok.",MA_SAY);
+    ReceiveNotify("Ok.",MA_SAY);
     return 0;
   }
 
@@ -1390,7 +1382,7 @@
 
   str = _unparsed_args();
   if (!str||!sizeof(str)) {
-    _notify("Was willst Du den Magiern zurufen?",MA_SHOUT);
+    ReceiveNotify("Was willst Du den Magiern zurufen?",MA_SHOUT);
     return 1;
   }
   // Kontrollzeichen rausfiltern.
@@ -1413,7 +1405,7 @@
     return 0;
 
   if (!(str=_unparsed_args())) {
-    _notify("Was moechtest Du 'echoen'?", 0);
+    ReceiveNotify("Was moechtest Du 'echoen'?", 0);
     return 1;
   }
 
diff --git a/std/player/command.c b/std/player/command.c
index d342e90..30d1bf0 100644
--- a/std/player/command.c
+++ b/std/player/command.c
@@ -1101,27 +1101,27 @@
 {
   if (!stringp(cmd))
   {
-    _notify("Mit diesem Befehl kannst Du mithelfen, Syntaxen im MG zu "
+    ReceiveNotify("Mit diesem Befehl kannst Du mithelfen, Syntaxen im MG zu "
             "verbessern. Wenn Du einverstanden bist, speichern wir "
             "anonym (d.h. ohne Deinen Charnamen), welche Deiner Befehle "
             "erfolgreich und nicht erfolgreich waren. Uebliche "
             "Kommunikationsbefehle werden dabei nicht gespeichert.",
             0);
-    _notify("Mit 'syntaxsammlung ja' kannst Du die Speicherung einschalten, "
+    ReceiveNotify("Mit 'syntaxsammlung ja' kannst Du die Speicherung einschalten, "
             "mit 'syntaxsammlung nein' kannst Du sie ausschalten.",0);
-    _notify("Deine Befehle werden zur Zeit"
+    ReceiveNotify("Deine Befehle werden zur Zeit"
             + (QueryProp("_syntaxdb") ? " " : " NICHT ")
             + "gespeichert.", 0);
   }
   else if (cmd == "ja")
   {
     SetProp("_syntaxdb", 1);
-    _notify("Ab jetzt werden Deine Befehle gespeichert. Vielen Dank!", 0);
+    ReceiveNotify("Ab jetzt werden Deine Befehle gespeichert. Vielen Dank!", 0);
   }
   else
   {
     SetProp("_syntaxdb", 0);
-    _notify("Ab jetzt werden Deine Befehle NICHT gespeichert.", 0);
+    ReceiveNotify("Ab jetzt werden Deine Befehle NICHT gespeichert.", 0);
   }
   return 1;
 }
