diff --git a/doc/sphinx/lfun/AddSpell.rst b/doc/sphinx/lfun/AddSpell.rst
index c4f8dbb..2ac4932 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|<int|spell>* TextForEnemy, string|<int|string>* TextForOthers,
-    string|string* dam_type, string|closure func, int|mapping spellarg)
+    varargs int AddSpell(int rate, int damage, string TextForEnemy,
+                         string TextForOthers, string|string* dam_type,
+                         string|closure func, int|mapping spellarg)
 
 DEFINIERT IN
 ------------
@@ -25,13 +25,7 @@
                     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
@@ -176,4 +170,5 @@
      Abwehr:     Defend, Defend_bsp, SpellDefend
      Methoden:   modifiers
 
-Letzte Aenderung: 15.02.2018, Bugfix
+Zuletzt geaendert: 20.11.2016, Bugfix
+
diff --git a/std/npc/combat.c b/std/npc/combat.c
index 47d6769..f49a3c2 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|<int|string>* TextForEnemy, string|<int|string>* TextForOthers,
-  string|string* dam_type, string|closure func, int|mapping spellarg)
+varargs int AddSpell(int rate, int damage, string TextForEnemy,
+                     string TextForOthers, string|string* dam_type, 
+                     string|closure func, int|mapping spellarg)
 {
   mixed *spells;
   int total_rates;
@@ -201,39 +201,6 @@
     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 )
@@ -362,27 +329,16 @@
   r=random(Query("npc:total_rates"));
   for (i=sizeof(spells)-1;(i>0 && spells[i-1][SPELL_TOTALRATE]>r);i--)
     ;
-  <int|string>* akt_spell_mess=spells[i][SPELL_TEXT_FOR_ENEMY];
+  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];
   // Nur, wenn ueberhaupt eine Meldung gesetzt wurde, muss diese verarbeitet
   // werden.
-  if(pointerp(akt_spell_mess))
+  if (stringp(akt_spell_mess) && sizeof(akt_spell_mess))
   {
-    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());
+    akt_spell_mess = replace_personal(akt_spell_mess, ({enemy}), 1);
+    say(break_string(akt_spell_mess, 78),({enemy, this_object()}));
   }
   sinfo = deep_copy(spells[i][SPELL_ARG]);
   if(!mappingp(sinfo))
@@ -392,16 +348,9 @@
   if(!sinfo[SP_PHYSICAL_ATTACK] &&
      (enemy->SpellDefend(this_object(),sinfo) >
       random(MAX_ABILITY+QueryProp(P_LEVEL)*50))){
-    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()}));
+    tell_object(enemy,"Du wehrst den Spruch ab.\n");
+    say(enemy->Name(WER,1)+" wehrt den Spruch ab.\n",
+        ({ enemy, this_object()}));
     return ;
   }
   int damage;
