Index: trunk/src/game/SpellEffects.cpp
===================================================================
--- trunk/src/game/SpellEffects.cpp (revision 149)
+++ trunk/src/game/SpellEffects.cpp (revision 157)
@@ -2119,5 +2119,5 @@
     // Now Reduce spell duration using data received at spell hit
     int32 duration = Aur->GetAuraMaxDuration();
-    unitTarget->ApplyDiminishingToDuration(m_diminishGroup,duration,m_caster,m_diminishLevel);
+    unitTarget->ApplyDiminishingToDuration(m_diminishGroup,duration,caster,m_diminishLevel);
     Aur->setDiminishGroup(m_diminishGroup);
 
Index: trunk/src/game/SpellMgr.h
===================================================================
--- trunk/src/game/SpellMgr.h (revision 131)
+++ trunk/src/game/SpellMgr.h (revision 157)
@@ -649,10 +649,5 @@
 typedef std::map<uint32, SpellExtraAttribute> SpellExtraAttrMap;
 
-struct SpellLinkedSpell
-{
-    int32 spell;
-    uint32 type;
-};
-typedef std::map<int32, SpellLinkedSpell> SpellLinkedMap;
+typedef std::map<int32, std::vector<int32> > SpellLinkedMap;
 
 class SpellMgr
@@ -863,11 +858,8 @@
         }
 
-        int32 GetSpellLinked(int32 spell_id, uint32 type) const
+        const std::vector<int32> *GetSpellLinked(int32 spell_id) const
         {
             SpellLinkedMap::const_iterator itr = mSpellLinkedMap.find(spell_id);
-            if(itr != mSpellLinkedMap.end())
-                return itr->second.type == type ? itr->second.spell : 0;
-            else
-                return 0;
+            return itr != mSpellLinkedMap.end() ? &(itr->second) : NULL;
         }
 
Index: trunk/src/game/Unit.cpp
===================================================================
--- trunk/src/game/Unit.cpp (revision 155)
+++ trunk/src/game/Unit.cpp (revision 157)
@@ -4155,13 +4155,13 @@
 
 
-    if(int32 spell_triggered = spellmgr.GetSpellLinked(-(int32)Aur->GetSpellProto()->Id, 0))
-    {
-        if(spell_triggered > 0)
-        {
-            if(Unit* caster = Aur->GetCaster())
-                CastSpell(this, spell_triggered, true, 0, 0, caster->GetGUID());
-        }
-        else
-            RemoveAurasDueToSpell(-spell_triggered);
+    if(const std::vector<int32> *spell_triggered = spellmgr.GetSpellLinked(-(int32)Aur->GetSpellProto()->Id))
+    {
+        for(std::vector<int32>::const_iterator i = spell_triggered->begin(); i != spell_triggered->end(); ++i)
+        {
+            if(spell_triggered < 0)
+                RemoveAurasDueToSpell(-(*i));
+            else if(Unit* caster = Aur->GetCaster())
+                CastSpell(this, *i, true, 0, 0, caster->GetGUID());
+        }
     }
 
Index: trunk/src/game/Spell.cpp
===================================================================
--- trunk/src/game/Spell.cpp (revision 148)
+++ trunk/src/game/Spell.cpp (revision 157)
@@ -1056,10 +1056,13 @@
         ((Creature*)m_caster)->AI()->SpellHitTarget(unit, m_spellInfo);
 
-    if(int32 spell_triggered = spellmgr.GetSpellLinked(m_spellInfo->Id, 1))
-    {
-        if(spell_triggered > 0)
-            unit->CastSpell(unit, spell_triggered, true, 0, 0, m_caster->GetGUID());
-        else
-            unit->RemoveAurasDueToSpell(-spell_triggered);
+    if(const std::vector<int32> *spell_triggered = spellmgr.GetSpellLinked(m_spellInfo->Id + 1000000))
+    {
+        for(std::vector<int32>::const_iterator i = spell_triggered->begin(); i != spell_triggered->end(); ++i)
+        {
+            if(spell_triggered < 0)
+                unit->RemoveAurasDueToSpell(-(*i));
+            else
+                unit->CastSpell(unit, *i, true, 0, 0, m_caster->GetGUID());
+        }
     }
 }
@@ -2253,10 +2256,13 @@
     }
 
-    if(int32 spell_triggered = spellmgr.GetSpellLinked(m_spellInfo->Id, 0))
-    {
-        if(spell_triggered > 0)
-            m_caster->CastSpell(m_targets.getUnitTarget() ? m_targets.getUnitTarget() : m_caster, spell_triggered, true);
-        else
-            m_caster->RemoveAurasDueToSpell(-spell_triggered);
+    if(const std::vector<int32> *spell_triggered = spellmgr.GetSpellLinked(m_spellInfo->Id))
+    {
+        for(std::vector<int32>::const_iterator i = spell_triggered->begin(); i != spell_triggered->end(); ++i)
+        {
+            if(spell_triggered < 0)
+                m_caster->RemoveAurasDueToSpell(-(*i));
+            else
+                m_caster->CastSpell(m_targets.getUnitTarget() ? m_targets.getUnitTarget() : m_caster, *i, true);
+        }
     }
 
Index: trunk/src/game/SpellMgr.cpp
===================================================================
--- trunk/src/game/SpellMgr.cpp (revision 155)
+++ trunk/src/game/SpellMgr.cpp (revision 157)
@@ -2088,8 +2088,7 @@
         }
 
-        SpellLinkedSpell linkedSpell;
-        linkedSpell.spell = effect;
-        linkedSpell.type = type;
-        mSpellLinkedMap[trigger] = linkedSpell;
+        if(type) //we will find a better way when more types are needed
+            trigger += 1000000;
+        mSpellLinkedMap[trigger].push_back(effect);
 
         ++count;
