diff --git a/doc/sphinx/lfun/AddSpell.rst b/doc/sphinx/lfun/AddSpell.rst
index 2ac4932..c4f8dbb 100644
--- a/doc/sphinx/lfun/AddSpell.rst
+++ b/doc/sphinx/lfun/AddSpell.rst
@@ -5,9 +5,9 @@
 --------
 ::
 
-    varargs int AddSpell(int rate, int damage, string TextForEnemy,
-                         string TextForOthers, string|string* dam_type,
-                         string|closure func, int|mapping spellarg)
+  varargs int AddSpell(int rate, int damage,
+    string|<int|spell>* TextForEnemy, string|<int|string>* TextForOthers,
+    string|string* dam_type, string|closure func, int|mapping spellarg)
 
 DEFINIERT IN
 ------------
@@ -25,7 +25,13 @@
                     muss >= 0 sein. Bei Schaden von 0 MUSS eine Funktion
                     eingetragen werden.
     TextForEnemy  - Text, den der Feind erhalten soll
+                    String <text> oder
+                    Array der Form ({<text>,<messagetype>})
+                    (Siehe ReceiveMsg())
     TextForOthers - Text, den andere im Raum erhalten sollen
+                    String <text> oder
+                    Array der Form ({<text>,<messagetype>})
+                    (Siehe ReceiveMsg())
     dam_type      - Schadenstyp(en) fuer Defend(),
                     (Default: ({DT_MAGIC}) )
     func          - Funktionsname oder Closure, die nach Anwendung
@@ -170,5 +176,4 @@
      Abwehr:     Defend, Defend_bsp, SpellDefend
      Methoden:   modifiers
 
-Zuletzt geaendert: 20.11.2016, Bugfix
-
+Letzte Aenderung: 15.02.2018, Bugfix
diff --git a/std/npc/combat.c b/std/npc/combat.c
index f49a3c2..de0200d 100644
--- a/std/npc/combat.c
+++ b/std/npc/combat.c
@@ -132,9 +132,9 @@
 #define SPELL_FUNC 5
 #define SPELL_ARG 6
 
-varargs int AddSpell(int rate, int damage, string TextForEnemy,
-                     string TextForOthers, string|string* dam_type, 
-                     string|closure func, int|mapping spellarg)
+varargs int AddSpell(int rate, int damage,
+  string|<int|string>* TextForEnemy, string|<int|string>* TextForOthers,
+  string|string* dam_type, string|closure func, int|mapping spellarg)
 {
   mixed *spells;
   int total_rates;
@@ -201,18 +201,51 @@
     return 0;
   }
 
+  if(!sizeof(TextForEnemy) ||
+    (pointerp(TextForEnemy) && !sizeof(TextForEnemy[0])))
+  {
+    TextForEnemy=0;
+  }
+  else if(stringp(TextForEnemy))
+  {
+    TextForEnemy=({TextForEnemy,MT_LOOK});
+  }
+  else if(pointerp(TextForEnemy) && 
+    (!stringp(TextForEnemy[0]) || !intp(TextForEnemy[1])))
+  {
+    raise_error(
+      "AddSpell(): Falsche Datentypen fuer TextForEnemy");
+  }
+  
+  if(!sizeof(TextForOthers) || 
+    (pointerp(TextForOthers) && !sizeof(TextForOthers[0])))
+  {
+    TextForOthers=0;
+  }
+  else if(stringp(TextForOthers))
+  {
+    TextForOthers=({TextForOthers,MT_LOOK});
+  }
+  else if(pointerp(TextForOthers) && 
+    (!stringp(TextForOthers[0]) || !intp(TextForOthers[1])))
+  {
+    raise_error(
+      "AddSpell(): Falsche Datentypen fuer TextForOthers");
+  }
+  
+
   // Falls vorhanden, alte Syntax auf die von replace_personal() anpassen,
   // die im heart_beat() beim Ausgeben der Meldung verwendet wird.
-  if ( strstr(TextForOthers, "@", 0) != -1 )
+  if ( strstr(TextForOthers[0], "@", 0) != -1 )
   {
     // Zeichen nach @WER & Co in runde Klammern einschliessen, damit es als
     // Sub-Pattern im Ausgabestring wiederholt werden kann. Ansonsten wuerde
     // es mit ersetzt.
-    TextForOthers = regreplace(TextForOthers, "@WER([^1-9QU])", "@WER1\\1", 1);
-    TextForOthers = regreplace(TextForOthers, "@WESSEN([^1-9QU])",
+    TextForOthers[0] = regreplace(TextForOthers[0], "@WER([^1-9QU])", "@WER1\\1", 1);
+    TextForOthers[0] = regreplace(TextForOthers[0], "@WESSEN([^1-9QU])",
                                "@WESSEN1\\1", 1);
-    TextForOthers = regreplace(TextForOthers, "@WEM([^1-9QU])", "@WEM1\\1", 1);
-    TextForOthers = regreplace(TextForOthers, "@WEN([^1-9QU])", "@WEN1\\1", 1);
+    TextForOthers[0] = regreplace(TextForOthers[0], "@WEM([^1-9QU])", "@WEM1\\1", 1);
+    TextForOthers[0] = regreplace(TextForOthers[0], "@WEN([^1-9QU])", "@WEN1\\1", 1);
   }
   total_rates=Query("npc:total_rates")+rate;
   spells=Query(P_SPELLS);
@@ -329,16 +362,27 @@
   r=random(Query("npc:total_rates"));
   for (i=sizeof(spells)-1;(i>0 && spells[i-1][SPELL_TOTALRATE]>r);i--)
     ;
-  string akt_spell_mess = spells[i][SPELL_TEXT_FOR_ENEMY];
-  if ( sizeof(akt_spell_mess) )
-    tell_object(enemy, break_string(akt_spell_mess, 78));
-  akt_spell_mess = spells[i][SPELL_TEXT_FOR_OTHERS];
+  <int|string>* akt_spell_mess=spells[i][SPELL_TEXT_FOR_ENEMY];
   // Nur, wenn ueberhaupt eine Meldung gesetzt wurde, muss diese verarbeitet
   // werden.
-  if (stringp(akt_spell_mess) && sizeof(akt_spell_mess))
+  if(pointerp(akt_spell_mess))
   {
-    akt_spell_mess = replace_personal(akt_spell_mess, ({enemy}), 1);
-    say(break_string(akt_spell_mess, 78),({enemy, this_object()}));
+    enemy->ReceiveMsg(
+      akt_spell_mess[0],
+      akt_spell_mess[1],
+      MA_SPELL);
+  }
+  akt_spell_mess=spells[i][SPELL_TEXT_FOR_OTHERS];
+  if(pointerp(akt_spell_mess))
+  {
+    akt_spell_mess[0]=replace_personal(akt_spell_mess[0], ({enemy}), 1);
+    send_room(environment(),
+      akt_spell_mess[0],
+      akt_spell_mess[1],
+      MA_SPELL,
+      0,
+      ({enemy,this_object()}),
+      this_object());
   }
   sinfo = deep_copy(spells[i][SPELL_ARG]);
   if(!mappingp(sinfo))
@@ -348,9 +392,16 @@
   if(!sinfo[SP_PHYSICAL_ATTACK] &&
      (enemy->SpellDefend(this_object(),sinfo) >
       random(MAX_ABILITY+QueryProp(P_LEVEL)*50))){
-    tell_object(enemy,"Du wehrst den Spruch ab.\n");
-    say(enemy->Name(WER,1)+" wehrt den Spruch ab.\n",
-        ({ enemy, this_object()}));
+    enemy->ReceiveMsg(
+      "Du wehrst den Spruch ab.",
+      MT_NOTIFICATION,
+      MA_SPELL);
+    send_room(environment(),
+      enemy->Name(WER,1)+" wehrt den Spruch ab.",
+      MT_LOOK,
+      MA_SPELL,
+      0,
+      ({ enemy, this_object()}));
     return ;
   }
   int damage;
