diff --git a/std/living/comm.c b/std/living/comm.c
index b79915a..59749a3 100644
--- a/std/living/comm.c
+++ b/std/living/comm.c
@@ -139,45 +139,6 @@
 }
 
 // Wrapper fuer ReceiveMsg()
-public int* ReceiveSay(string msg, string prefix = 0,
-  struct wave_s* sense_blocked =
-    ({(<wave_s> 
-      msg: "@WER1 bewegt die Lippen, Du hoerst jedoch nichts.",
-      type: MT_LOOK)}))
-{
-  int* res = ({0, -1});
-
-  if(!prefix)
-  {
-    prefix = previous_object().Name(WER, 1) + " sagt: ";
-  }
-
-  res[0] = ReceiveMsg(
-    replace_personal(msg, ({previous_object(), this_player()}) - ({0}), 1),
-    MT_LISTEN | MSG_BS_LEAVE_LFS,
-    MA_SAY,
-    prefix);
-
-  if(res[0] == MSG_SENSE_BLOCK)
-  {
-    // Um eine Nummer zurueckzugeben, ist hier leider eine for-Schleife noetig.
-    for(int i = 0; i < sizeof(sense_blocked); ++i)
-    {
-      res[0] = ReceiveMsg(
-        replace_personal(sense_blocked[i].msg, ({previous_object(),
-                         this_player()}) - ({0}), 1),
-        sense_blocked[i].type | MSG_BS_LEAVE_LFS,
-        MA_SAY,
-        sense_blocked[i].prefix);
-      if(res[0] != MSG_SENSE_BLOCK)
-      {
-        res[1] = i;
-        break;
-      }
-    }
-  }
-  return res;
-}
 
 public int ReceiveNotify(string msg, string action)
 {
@@ -201,24 +162,36 @@
     previous_object().Name(WER, 1) + "teilt Dir mit: ");
 }
 
-public int* ReceiveMultisense(struct wave_s* msgs,
+public int ReceiveMultiSense(struct wave_s *msgs,
     string action = 0, int commontypes = 0)
 {
-  int* res = ({0, -1});
-
-  // Um eine Nummer zurueckzugeben, ist hier leider eine for-Schleife noetig.
-  for(int i = 0; i < sizeof(msgs); ++i)
+  int res;
+  foreach(struct wave_s wave : msgs)
   {
-    res[0] = ReceiveMsg(
-      replace_personal(msgs[i].msg, ({previous_object(), this_player()}), 1),
-      msgs[i].type | MSG_BS_LEAVE_LFS | commontypes,
-      action,
-      msgs[i].prefix);
-    if(res[0] == MSG_DELIVERED)
+    // Pruefung auf != MSG_SENSE_BLOCK statt Erfolg, weil ein anderer Fehler
+    // (insb. aufgrund ignoriere) fuer alle Alternativen ebenso auftritt.
+    res = ReceiveMsg(
+          replace_personal(wave.msg, ({previous_object(), this_player()}),1),
+          wave.type | MSG_BS_LEAVE_LFS | commontypes, action, wave.prefix);
+    if (res != MSG_SENSE_BLOCK)
     {
-      res[1] = i;
       break;
     }
   }
   return res;
 }
+
+public int ReceiveSay(string msg,
+    string prefix = previous_object().Name(WER, 1) + " sagt: ",
+    struct wave_s *alt =
+        ({(<wave_s>
+            msg: "@WER1 bewegt die Lippen, Du hoerst jedoch nichts.",
+            type: MT_LOOK)})
+        )
+{
+  // Nachricht in struct konvertieren, ans Anfang vom Array stellen
+  alt = ({(<wave_s> msg: msg, prefix: prefix, type: MT_LISTEN)}) + alt;
+  // Rest macht ReceiveMultiSense()
+  return ReceiveMultiSense(alt, MA_SAY, MSG_BS_LEAVE_LFS);
+}
+
