Index: /trunk/src/bindings/scripts/include/sc_creature.cpp
===================================================================
--- /trunk/src/bindings/scripts/include/sc_creature.cpp (revision 130)
+++ /trunk/src/bindings/scripts/include/sc_creature.cpp (revision 153)
@@ -15,4 +15,52 @@
     uint8 Effects;                                          // set of enum SelectEffect
 } *SpellSummary;
+
+void SummonList::Despawn(Creature *summon)
+{
+    uint64 guid = summon->GetGUID();
+    for(iterator i = begin(); i != end(); ++i)
+    {
+        if(*i == guid)
+        {
+            erase(i);
+            return;
+        }
+    }
+}
+
+void SummonList::DespawnEntry(uint32 entry)
+{
+    for(iterator i = begin(); i != end(); ++i)
+    {
+        if(Creature *summon = (Creature*)Unit::GetUnit(*m_creature, *i))
+        {
+            if(summon->GetEntry() == entry)
+            {
+                summon->setDeathState(JUST_DIED);
+                summon->RemoveCorpse();
+                i = erase(i);
+                --i;
+            }
+        }
+        else
+        {
+            i = erase(i);
+            --i;
+        }
+    }
+}
+
+void SummonList::DespawnAll()
+{
+    for(iterator i = begin(); i != end(); ++i)
+    {
+        if(Creature *summon = (Creature*)Unit::GetUnit(*m_creature, *i))
+        {
+            summon->setDeathState(JUST_DIED);
+            summon->RemoveCorpse();
+        }
+    }
+    clear();
+}
 
 bool ScriptedAI::IsVisible(Unit* who) const
Index: /trunk/src/bindings/scripts/include/sc_creature.h
===================================================================
--- /trunk/src/bindings/scripts/include/sc_creature.h (revision 130)
+++ /trunk/src/bindings/scripts/include/sc_creature.h (revision 153)
@@ -11,4 +11,16 @@
 #include "CreatureAI.h"
 #include "Creature.h"
+
+class SummonList : std::list<uint64>
+{
+public:
+    SummonList(Creature* creature) : m_creature(creature) {}
+    void Summon(Creature *summon) {push_back(summon->GetGUID());}
+    void Despawn(Creature *summon);
+    void DespawnEntry(uint32 entry);
+    void DespawnAll();
+private:
+    Creature *m_creature;
+};
 
 struct TRINITY_DLL_DECL ScriptedAI : public CreatureAI
Index: /trunk/src/bindings/scripts/scripts/zone/zulaman/boss_zuljin.cpp
===================================================================
--- /trunk/src/bindings/scripts/scripts/zone/zulaman/boss_zuljin.cpp (revision 117)
+++ /trunk/src/bindings/scripts/scripts/zone/zulaman/boss_zuljin.cpp (revision 153)
@@ -23,5 +23,4 @@
 #include "precompiled.h"
 #include "def_zulaman.h"
-//#include "spell.h"
 
 //Speech
@@ -143,16 +142,7 @@
 struct TRINITY_DLL_DECL boss_zuljinAI : public ScriptedAI
 {
-    boss_zuljinAI(Creature *c) : ScriptedAI(c)
+    boss_zuljinAI(Creature *c) : ScriptedAI(c), Summons(m_creature)
     {
         pInstance = ((ScriptedInstance*)c->GetInstanceData());
-        // wait for core patch be accepted
-        SpellEntry *TempSpell = (SpellEntry*)GetSpellStore()->LookupEntry(SPELL_CLAW_RAGE_DAMAGE);
-        if(TempSpell)
-        {
-            //if(TempSpell->DmgClass != SPELL_DAMAGE_CLASS_MELEE)
-            //    TempSpell->DmgClass = SPELL_DAMAGE_CLASS_MELEE;
-            if(TempSpell->EffectApplyAuraName[2] != SPELL_AURA_MOD_STUN)
-                TempSpell->EffectApplyAuraName[2] = SPELL_AURA_MOD_STUN;
-        }
         Reset();
     }
@@ -184,4 +174,6 @@
     uint32 Pillar_Of_Fire_Timer;
 
+    SummonList Summons;
+
     void Reset()
     {
@@ -214,7 +206,5 @@
         TankGUID = 0;        
 
-        DespawnAdds();
-        DespawnSummons(CREATURE_FEATHER_VORTEX);
-        DespawnSummons(CREATURE_COLUMN_OF_FIRE);
+        Summons.DespawnAll();
 
         m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_DISPLAY, 47174);
@@ -261,5 +251,5 @@
         DoYell(YELL_DEATH, LANG_UNIVERSAL, NULL);
         DoPlaySoundToSet(m_creature, SOUND_DEATH);
-        DespawnSummons(CREATURE_COLUMN_OF_FIRE);
+        Summons.DespawnEntry(CREATURE_COLUMN_OF_FIRE);
 
         if(Unit *Temp = Unit::GetUnit(*m_creature, SpiritGUID[3]))
@@ -329,30 +319,12 @@
     }
 
-    void DespawnSummons(uint32 entry)
-    {
-        std::list<Creature*> templist;
-        float x, y, z;
-        m_creature->GetPosition(x, y, z);
-
-        {
-            CellPair pair(Trinity::ComputeCellPair(x, y));
-            Cell cell(pair);
-            cell.data.Part.reserved = ALL_DISTRICT;
-            cell.SetNoCreate();
-
-            Trinity::AllCreaturesOfEntryInRange check(m_creature, entry, 100);
-            Trinity::CreatureListSearcher<Trinity::AllCreaturesOfEntryInRange> searcher(templist, check);
-
-            TypeContainerVisitor<Trinity::CreatureListSearcher<Trinity::AllCreaturesOfEntryInRange>, GridTypeMapContainer> cSearcher(searcher);
-
-            CellLock<GridReadGuard> cell_lock(cell, pair);
-            cell_lock->Visit(cell_lock, cSearcher, *(m_creature->GetMap()));
-        }
-
-        for(std::list<Creature*>::iterator i = templist.begin(); i != templist.end(); ++i)
-        {
-            (*i)->SetVisibility(VISIBILITY_OFF);
-            (*i)->setDeathState(JUST_DIED);
-        }
+    void JustSummoned(Creature *summon)
+    {
+        Summons.Summon(summon);
+    }
+
+    void SummonedCreatureDespawn(Creature *summon)
+    {
+        Summons.Despawn(summon);
     }
 
@@ -405,5 +377,5 @@
             {
                 m_creature->RemoveAurasDueToSpell(SPELL_ENERGY_STORM);
-                DespawnSummons(CREATURE_FEATHER_VORTEX);
+                Summons.DespawnEntry(CREATURE_FEATHER_VORTEX);
                 m_creature->GetMotionMaster()->MoveChase(m_creature->getVictim());
             }
