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..47d6769 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,6 +201,39 @@
     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 )
@@ -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;
