Index: /trunk/src/trinityrealm/AuthSocket.h
===================================================================
--- /trunk/src/trinityrealm/AuthSocket.h (revision 170)
+++ /trunk/src/trinityrealm/AuthSocket.h (revision 178)
@@ -11,10 +11,10 @@
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  * GNU General Public License for more details.
  *
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  */
 
@@ -76,6 +76,5 @@
         std::string _login;
         std::string _safelogin;
-        
-        
+
         // Since GetLocaleByName() is _NOT_ bijective, we have to store the locale as a string. Otherwise we can't differ
         // between enUS and enGB, which is important for the patch system
Index: /trunk/src/trinityrealm/AuthCodes.h
===================================================================
--- /trunk/src/trinityrealm/AuthCodes.h (revision 102)
+++ /trunk/src/trinityrealm/AuthCodes.h (revision 178)
@@ -11,10 +11,10 @@
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  * GNU General Public License for more details.
  *
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  */
 
Index: /trunk/src/trinityrealm/Main.cpp
===================================================================
--- /trunk/src/trinityrealm/Main.cpp (revision 102)
+++ /trunk/src/trinityrealm/Main.cpp (revision 178)
@@ -11,10 +11,10 @@
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  * GNU General Public License for more details.
  *
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  */
 
@@ -341,5 +341,4 @@
     signal(SIGBREAK, 0);
     #endif
-
 }
 
Index: /trunk/src/trinityrealm/RealmList.cpp
===================================================================
--- /trunk/src/trinityrealm/RealmList.cpp (revision 102)
+++ /trunk/src/trinityrealm/RealmList.cpp (revision 178)
@@ -11,10 +11,10 @@
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  * GNU General Public License for more details.
  *
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  */
 
Index: /trunk/src/game/SpellEffects.cpp
===================================================================
--- /trunk/src/game/SpellEffects.cpp (revision 174)
+++ /trunk/src/game/SpellEffects.cpp (revision 178)
@@ -3577,4 +3577,11 @@
     }
 
+    // trigger
+    if(m_spellInfo->Id == 40276)
+    {
+        EffectSummonWild(i);
+        return;
+    }
+
     // set timer for unsummon
     int32 duration = GetSpellDuration(m_spellInfo);
Index: /trunk/src/game/Unit.h
===================================================================
--- /trunk/src/game/Unit.h (revision 174)
+++ /trunk/src/game/Unit.h (revision 178)
@@ -438,6 +438,6 @@
     VISIBILITY_ON                 = 1,
     VISIBILITY_GROUP_STEALTH      = 2,                      // detect chance, seen and can see group members
-    VISIBILITY_GROUP_INVISIBILITY = 3,                      // invisibility, can see and can be seen only another invisible unit or invisible detection unit, set only if not stealthed, and in checks not used (mask used instead)
-    VISIBILITY_GROUP_NO_DETECT    = 4,                      // state just at stealth apply for update Grid state. Don't remove, otherwise stealth spells will break
+    //VISIBILITY_GROUP_INVISIBILITY = 3,                      // invisibility, can see and can be seen only another invisible unit or invisible detection unit, set only if not stealthed, and in checks not used (mask used instead)
+    //VISIBILITY_GROUP_NO_DETECT    = 4,                      // state just at stealth apply for update Grid state. Don't remove, otherwise stealth spells will break
     VISIBILITY_RESPAWN            = 5                       // special totally not detectable visibility for force delete object at respawn command
 };
@@ -1136,11 +1136,13 @@
 
         // common function for visibility checks for player/creatures with detection code
+        virtual bool canSeeOrDetect(Unit const* u, bool detect, bool inVisibleList) const;
         bool isVisibleForOrDetect(Unit const* u, bool detect, bool inVisibleList = false) const;
         bool canDetectInvisibilityOf(Unit const* u) const;
+        bool canDetectStealthOf(Unit const* u, float distance) const;
 
         // virtual functions for all world objects types
         bool isVisibleForInState(Player const* u, bool inVisibleList) const;
         // function for low level grid visibility checks in player/creature cases
-        virtual bool IsVisibleInGridForPlayer(Player* pl) const = 0;
+        virtual bool IsVisibleInGridForPlayer(Player const* pl) const = 0;
 
         bool waterbreath;
Index: /trunk/src/game/SpellAuras.cpp
===================================================================
--- /trunk/src/game/SpellAuras.cpp (revision 174)
+++ /trunk/src/game/SpellAuras.cpp (revision 178)
@@ -3231,5 +3231,6 @@
             if(m_target->GetVisibility()!=VISIBILITY_OFF)
             {
-                m_target->SetVisibility(VISIBILITY_GROUP_NO_DETECT);
+                //m_target->SetVisibility(VISIBILITY_GROUP_NO_DETECT);
+                m_target->SetVisibility(VISIBILITY_OFF);
                 m_target->SetVisibility(VISIBILITY_GROUP_STEALTH);
             }
@@ -3259,6 +3260,7 @@
                 if(m_target->HasAuraType(SPELL_AURA_MOD_INVISIBILITY))
                 {
-                    m_target->SetVisibility(VISIBILITY_GROUP_NO_DETECT);
-                    m_target->SetVisibility(VISIBILITY_GROUP_INVISIBILITY);
+                    //m_target->SetVisibility(VISIBILITY_GROUP_NO_DETECT);
+                    //m_target->SetVisibility(VISIBILITY_GROUP_INVISIBILITY);
+                    m_target->SetVisibility(VISIBILITY_ON);
                 }
                 else
@@ -3315,6 +3317,7 @@
         {
             // Aura not added yet but visibility code expect temporary add aura
-            m_target->SetVisibility(VISIBILITY_GROUP_NO_DETECT);
-            m_target->SetVisibility(VISIBILITY_GROUP_INVISIBILITY);
+            //m_target->SetVisibility(VISIBILITY_GROUP_NO_DETECT);
+            //m_target->SetVisibility(VISIBILITY_GROUP_INVISIBILITY);
+            m_target->SetVisibility(VISIBILITY_ON);
         }
     }
Index: /trunk/src/game/OutdoorPvPObjectiveAI.cpp
===================================================================
--- /trunk/src/game/OutdoorPvPObjectiveAI.cpp (revision 102)
+++ /trunk/src/game/OutdoorPvPObjectiveAI.cpp (revision 178)
@@ -51,11 +51,11 @@
 void OutdoorPvPObjectiveAI::AttackStart(Unit *)
 {
-    EnterEvadeMode();
+    //EnterEvadeMode();
 }
 
 void OutdoorPvPObjectiveAI::EnterEvadeMode()
 {
-    i_creature.DeleteThreatList();
-    i_creature.CombatStop();
+//    i_creature.DeleteThreatList();
+//    i_creature.CombatStop();
 }
 
Index: /trunk/src/game/Creature.cpp
===================================================================
--- /trunk/src/game/Creature.cpp (revision 174)
+++ /trunk/src/game/Creature.cpp (revision 178)
@@ -319,4 +319,8 @@
     m_spells[2] = GetCreatureInfo()->spell3;
     m_spells[3] = GetCreatureInfo()->spell4;
+
+    // HACK: trigger creature is always not selectable
+    if(GetCreatureInfo()->flags_extra & CREATURE_FLAG_EXTRA_TRIGGER)
+        SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
 
     return true;
@@ -1488,4 +1492,45 @@
 }
 
+bool Creature::canSeeOrDetect(Unit const* u, bool detect, bool inVisibleList) const
+{
+    // not in world
+    if(!IsInWorld() || !u->IsInWorld())
+        return false;
+
+    // all dead creatures/players not visible for any creatures
+    if(!u->isAlive() || !isAlive())
+        return false;
+
+    // Always can see self
+    if (u == this)
+        return true;
+
+    // always seen by owner
+    if(GetGUID() == u->GetCharmerOrOwnerGUID())
+        return true;
+
+    if(u->GetVisibility() == VISIBILITY_OFF) //GM
+        return false;
+
+    // invisible aura
+    if((m_invisibilityMask || u->m_invisibilityMask) && !canDetectInvisibilityOf(u))
+        return false;
+
+    // unit got in stealth in this moment and must ignore old detected state
+    //if (m_Visibility == VISIBILITY_GROUP_NO_DETECT)
+    //    return false;
+
+    // GM invisibility checks early, invisibility if any detectable, so if not stealth then visible
+    if(u->GetVisibility() == VISIBILITY_GROUP_STEALTH)
+    {
+        //do not know what is the use of this detect
+        if(!detect || !canDetectStealthOf(u, GetDistance(u)))
+            return false;
+    }
+
+    // Now check is target visible with LoS
+    return u->IsWithinLOS(GetPositionX(),GetPositionY(),GetPositionZ());
+}
+
 float Creature::GetAttackDistance(Unit const* pl) const
 {
@@ -1699,5 +1744,5 @@
 }
 
-bool Creature::IsVisibleInGridForPlayer(Player* pl) const
+bool Creature::IsVisibleInGridForPlayer(Player const* pl) const
 {
     // gamemaster in GM mode see all, including ghosts
Index: /trunk/src/game/Object.cpp
===================================================================
--- /trunk/src/game/Object.cpp (revision 174)
+++ /trunk/src/game/Object.cpp (revision 178)
@@ -1487,5 +1487,5 @@
         if(GetTypeId() == TYPEID_UNIT || GetTypeId() == TYPEID_PLAYER)
             pCreature->setFaction(((Unit*)this)->getFaction());
-        pCreature->CastSpell(pCreature, pCreature->m_spells[0], true, 0, 0, GetGUID());
+        pCreature->CastSpell(pCreature, pCreature->m_spells[0], false, 0, 0, GetGUID());
     }
 
Index: /trunk/src/game/Creature.h
===================================================================
--- /trunk/src/game/Creature.h (revision 174)
+++ /trunk/src/game/Creature.h (revision 178)
@@ -548,4 +548,5 @@
         uint32 m_GlobalCooldown;
 
+        bool canSeeOrDetect(Unit const* u, bool detect, bool inVisibleList) const;
         float GetAttackDistance(Unit const* pl) const;
 
@@ -561,5 +562,5 @@
         void SetCurrentCell(Cell const& cell) { m_currentCell = cell; }
 
-        bool IsVisibleInGridForPlayer(Player* pl) const;
+        bool IsVisibleInGridForPlayer(Player const* pl) const;
 
         void RemoveCorpse();
Index: /trunk/src/game/Player.h
===================================================================
--- /trunk/src/game/Player.h (revision 177)
+++ /trunk/src/game/Player.h (revision 178)
@@ -1993,7 +1993,8 @@
         ClientGUIDs m_clientGUIDs;
 
-        bool HaveAtClient(WorldObject const* u) { return u==this || m_clientGUIDs.find(u->GetGUID())!=m_clientGUIDs.end(); }
-
-        bool IsVisibleInGridForPlayer(Player* pl) const;
+        bool HaveAtClient(WorldObject const* u) const { return u==this || m_clientGUIDs.find(u->GetGUID())!=m_clientGUIDs.end(); }
+
+        bool canSeeOrDetect(Unit const* u, bool detect, bool inVisibleList) const;
+        bool IsVisibleInGridForPlayer(Player const* pl) const;
         bool IsVisibleGloballyFor(Player* pl) const;
 
Index: /trunk/src/game/Unit.cpp
===================================================================
--- /trunk/src/game/Unit.cpp (revision 174)
+++ /trunk/src/game/Unit.cpp (revision 178)
@@ -8507,7 +8507,4 @@
         return false;
 
-    if(GetTypeId()==TYPEID_UNIT && (((Creature *)this)->GetCreatureInfo()->flags_extra & CREATURE_FLAG_EXTRA_TRIGGER))
-        return false;
-
     return isAlive() && !hasUnitState(UNIT_STAT_DIED)&& !isInFlight() /*&& !isStealth()*/;
 }
@@ -8581,257 +8578,21 @@
     if(!u)
         return false;
-
-    // Always can see self
-    if (u==this)
+    return u->canSeeOrDetect(this, detect, inVisibleList);
+}
+
+bool Unit::canSeeOrDetect(Unit const* u, bool detect, bool inVisibleList) const
+{
+    return true;
+}
+
+bool Unit::canDetectInvisibilityOf(Unit const* u) const
+{
+    if(m_invisibilityMask & u->m_invisibilityMask) // same group
         return true;
-
-    // player visible for other player if not logout and at same transport
-    // including case when player is out of world
-    bool at_same_transport =
-        GetTypeId() == TYPEID_PLAYER &&  u->GetTypeId()==TYPEID_PLAYER &&
-        !((Player*)this)->GetSession()->PlayerLogout() && !((Player*)u)->GetSession()->PlayerLogout() &&
-        !((Player*)this)->GetSession()->PlayerLoading() && !((Player*)u)->GetSession()->PlayerLoading() &&
-        ((Player*)this)->GetTransport() && ((Player*)this)->GetTransport() == ((Player*)u)->GetTransport();
-
-    // not in world
-    if(!at_same_transport && (!IsInWorld() || !u->IsInWorld()))
-        return false;
-
-    // forbidden to seen (at GM respawn command)
-    if(m_Visibility==VISIBILITY_RESPAWN)
-        return false;
-
-    // always seen by owner
-    if(GetCharmerOrOwnerGUID()==u->GetGUID())
-        return true;
-
-    // Grid dead/alive checks
-    if( u->GetTypeId()==TYPEID_PLAYER)
-    {
-        // non visible at grid for any stealth state
-        if(!IsVisibleInGridForPlayer((Player *)u))
-            return false;
-
-        // if player is dead then he can't detect anyone in anycases
-        if(!u->isAlive())
-            detect = false;
-    }
-    else
-    {
-        // all dead creatures/players not visible for any creatures
-        if(!u->isAlive() || !isAlive())
-            return false;
-    }
-
-    // If the player is currently possessing, update visibility from the possessed unit's location
-    const Unit* target = u->GetTypeId() == TYPEID_PLAYER && u->isPossessing() ? u->GetCharm() : u;
-
-    // different visible distance checks
-    if(u->isInFlight())                                     // what see player in flight
-    {
-        // use object grey distance for all (only see objects any way)
-        if (!IsWithinDistInMap(target,World::GetMaxVisibleDistanceInFlight()+(inVisibleList ? World::GetVisibleObjectGreyDistance() : 0.0f)))
-            return false;
-    }
-    else if(!isAlive())                                     // distance for show body
-    {
-        if (!IsWithinDistInMap(target,World::GetMaxVisibleDistanceForObject()+(inVisibleList ? World::GetVisibleObjectGreyDistance() : 0.0f)))
-            return false;
-    }
-    else if(GetTypeId()==TYPEID_PLAYER)                     // distance for show player
-    {
-        if(u->GetTypeId()==TYPEID_PLAYER)
-        {
-            // Players far than max visible distance for player or not in our map are not visible too
-            if (!at_same_transport && !IsWithinDistInMap(target,World::GetMaxVisibleDistanceForPlayer()+(inVisibleList ? World::GetVisibleUnitGreyDistance() : 0.0f)))
-                return false;
-        }
-        else
-        {
-            // Units far than max visible distance for creature or not in our map are not visible too
-            // Active unit should always be visibile
-            if (!IsWithinDistInMap(target, target->isActive() 
-                ? (MAX_VISIBILITY_DISTANCE - (inVisibleList ? 0.0f : World::GetVisibleUnitGreyDistance()))
-                : (World::GetMaxVisibleDistanceForCreature() + (inVisibleList ? World::GetVisibleUnitGreyDistance() : 0.0f))))
-                return false;
-        }
-    }
-    else if(GetCharmerOrOwnerGUID())                        // distance for show pet/charmed
-    {
-        // Pet/charmed far than max visible distance for player or not in our map are not visible too
-        if (!IsWithinDistInMap(target,World::GetMaxVisibleDistanceForPlayer()+(inVisibleList ? World::GetVisibleUnitGreyDistance() : 0.0f)))
-            return false;
-    }
-    else                                                    // distance for show creature
-    {
-        // Units far than max visible distance for creature or not in our map are not visible too
-        if (!IsWithinDistInMap(target,World::GetMaxVisibleDistanceForCreature()+(inVisibleList ? World::GetVisibleUnitGreyDistance() : 0.0f)))
-            return false;
-    }
-
-    // Visible units, always are visible for all units, except for units under invisibility
-    if (m_Visibility == VISIBILITY_ON && u->m_invisibilityMask==0)
-        return true;
-
-    // GMs see any players, not higher GMs and all units
-    if (u->GetTypeId() == TYPEID_PLAYER && ((Player *)u)->isGameMaster())
-    {
-        if(GetTypeId() == TYPEID_PLAYER)
-            return ((Player *)this)->GetSession()->GetSecurity() <= ((Player *)u)->GetSession()->GetSecurity();
-        else
+    AuraList const& auras = GetAurasByType(SPELL_AURA_MOD_STALKED); // Hunter mark
+    for(AuraList::const_iterator iter = auras.begin(); iter != auras.end(); ++iter)
+        if((*iter)->GetCasterGUID()==u->GetGUID())
             return true;
-    }
-
-    // non faction visibility non-breakable for non-GMs
-    if (m_Visibility == VISIBILITY_OFF)
-        return false;
-
-    // raw invisibility
-    bool invisible = (m_invisibilityMask != 0 || u->m_invisibilityMask !=0);
-
-    // detectable invisibility case
-    if( invisible && (
-        // Invisible units, always are visible for units under same invisibility type
-        (m_invisibilityMask & u->m_invisibilityMask)!=0 ||
-        // Invisible units, always are visible for unit that can detect this invisibility (have appropriate level for detect)
-        u->canDetectInvisibilityOf(this) ||
-        // Units that can detect invisibility always are visible for units that can be detected
-        canDetectInvisibilityOf(u) ))
-    {
-        invisible = false;
-    }
-
-    // special cases for always overwrite invisibility/stealth
-    if(invisible || m_Visibility == VISIBILITY_GROUP_STEALTH)
-    {
-        // non-hostile case
-        if (!u->IsHostileTo(this))
-        {
-            // player see other player with stealth/invisibility only if he in same group or raid or same team (raid/team case dependent from conf setting)
-            if(GetTypeId()==TYPEID_PLAYER && u->GetTypeId()==TYPEID_PLAYER)
-            {
-                if(((Player*)this)->IsGroupVisibleFor(((Player*)u)))
-                    return true;
-
-                // else apply same rules as for hostile case (detecting check for stealth)
-            }
-        }
-        // hostile case
-        else
-        {
-            // Hunter mark functionality
-            AuraList const& auras = GetAurasByType(SPELL_AURA_MOD_STALKED);
-            for(AuraList::const_iterator iter = auras.begin(); iter != auras.end(); ++iter)
-                if((*iter)->GetCasterGUID()==u->GetGUID())
-                    return true;
-
-            // else apply detecting check for stealth
-        }
-
-        // none other cases for detect invisibility, so invisible
-        if(invisible)
-            return false;
-
-        // else apply stealth detecting check
-    }
-
-    // unit got in stealth in this moment and must ignore old detected state
-    if (m_Visibility == VISIBILITY_GROUP_NO_DETECT)
-        return false;
-
-    // GM invisibility checks early, invisibility if any detectable, so if not stealth then visible
-    if (m_Visibility != VISIBILITY_GROUP_STEALTH)
-        return true;
-
-    // NOW ONLY STEALTH CASE
-
-    // stealth and detected and visible for some seconds
-    if (u->GetTypeId() == TYPEID_PLAYER  && ((Player*)u)->m_DetectInvTimer > 300 && ((Player*)u)->HaveAtClient(this))
-        return true;
-
-    //if in non-detect mode then invisible for unit
-    if (!detect)
-        return false;
-
-    // Special cases
-
-    // If is attacked then stealth is lost, some creature can use stealth too
-    if( !getAttackers().empty() )
-        return true;
-
-    // If there is collision rogue is seen regardless of level difference
-    // TODO: check sizes in DB
-    float distance = GetDistance(u);
-    if (distance < 0.24f)
-        return true;
-
-    //If a mob or player is stunned he will not be able to detect stealth
-    if (u->hasUnitState(UNIT_STAT_STUNNED) && (u != this))
-        return false;
-
-    // Creature can detect target only in aggro radius
-    if(u->GetTypeId() != TYPEID_PLAYER)
-    {
-        //Always invisible from back and out of aggro range
-        bool isInFront = u->isInFront(this,((Creature const*)u)->GetAttackDistance(this));
-        if(!isInFront)
-            return false;
-    }
-    else
-    {
-        //Always invisible from back
-        bool isInFront = u->isInFront(this,(GetTypeId()==TYPEID_PLAYER || GetCharmerOrOwnerGUID()) ? World::GetMaxVisibleDistanceForPlayer() : World::GetMaxVisibleDistanceForCreature());
-        if(!isInFront)
-            return false;
-    }
-
-    // if doesn't have stealth detection (Shadow Sight), then check how stealthy the unit is, otherwise just check los
-    if(!u->HasAuraType(SPELL_AURA_DETECT_STEALTH))
-    {
-        //Calculation if target is in front
-
-        //Visible distance based on stealth value (stealth rank 4 300MOD, 10.5 - 3 = 7.5)
-        float visibleDistance = 10.5f - (GetTotalAuraModifier(SPELL_AURA_MOD_STEALTH)/100.0f);
-
-        //Visible distance is modified by
-        //-Level Diff (every level diff = 1.0f in visible distance)
-        visibleDistance += int32(u->getLevelForTarget(this)) - int32(this->getLevelForTarget(u));
-
-        //This allows to check talent tree and will add addition stealth dependent on used points)
-        int32 stealthMod = GetTotalAuraModifier(SPELL_AURA_MOD_STEALTH_LEVEL);
-        if(stealthMod < 0)
-            stealthMod = 0;
-
-        //-Stealth Mod(positive like Master of Deception) and Stealth Detection(negative like paranoia)
-        //based on wowwiki every 5 mod we have 1 more level diff in calculation
-        visibleDistance += (int32(u->GetTotalAuraModifier(SPELL_AURA_MOD_DETECT)) - stealthMod)/5.0f;
-
-        if(distance > visibleDistance)
-            return false;
-    }
-
-    // Now check is target visible with LoS
-    float ox,oy,oz;
-    u->GetPosition(ox,oy,oz);
-    return IsWithinLOS(ox,oy,oz);
-}
-
-void Unit::SetVisibility(UnitVisibility x)
-{
-    m_Visibility = x;
-
-    if(IsInWorld())
-    {
-        Map *m = MapManager::Instance().GetMap(GetMapId(), this);
-
-        if(GetTypeId()==TYPEID_PLAYER)
-            m->PlayerRelocation((Player*)this,GetPositionX(),GetPositionY(),GetPositionZ(),GetOrientation());
-        else
-            m->CreatureRelocation((Creature*)this,GetPositionX(),GetPositionY(),GetPositionZ(),GetOrientation());
-    }
-}
-
-bool Unit::canDetectInvisibilityOf(Unit const* u) const
-{
+
     if(uint32 mask = (m_detectInvisibilityMask & u->m_invisibilityMask))
     {
@@ -8850,12 +8611,14 @@
             // find invisibility detect level
             uint32 detectLevel = 0;
-            Unit::AuraList const& dAuras = GetAurasByType(SPELL_AURA_MOD_INVISIBILITY_DETECTION);
-            for(Unit::AuraList::const_iterator itr = dAuras.begin(); itr != dAuras.end(); ++itr)
-                if(((*itr)->GetModifier()->m_miscvalue)==i && detectLevel < (*itr)->GetModifier()->m_amount)
-                    detectLevel = (*itr)->GetModifier()->m_amount;
-
             if(i==6 && GetTypeId()==TYPEID_PLAYER)          // special drunk detection case
             {
                 detectLevel = ((Player*)this)->GetDrunkValue();
+            }
+            else
+            {
+                Unit::AuraList const& dAuras = GetAurasByType(SPELL_AURA_MOD_INVISIBILITY_DETECTION);
+                for(Unit::AuraList::const_iterator itr = dAuras.begin(); itr != dAuras.end(); ++itr)
+                    if(((*itr)->GetModifier()->m_miscvalue)==i && detectLevel < (*itr)->GetModifier()->m_amount)
+                        detectLevel = (*itr)->GetModifier()->m_amount;
             }
 
@@ -8866,4 +8629,41 @@
 
     return false;
+}
+
+bool Unit::canDetectStealthOf(Unit const* target, float distance) const
+{
+    if(hasUnitState(UNIT_STAT_STUNNED))
+        return false;
+    if(distance < 0.24f) //collision
+        return true;
+    if(!HasInArc(M_PI, target)) //behind
+        return false;
+    if(HasAuraType(SPELL_AURA_DETECT_STEALTH))
+        return true;
+
+    //Visible distance based on stealth value (stealth rank 4 300MOD, 10.5 - 3 = 7.5)
+    float visibleDistance = 10.5f - target->GetTotalAuraModifier(SPELL_AURA_MOD_STEALTH) / 100.0f;
+    //Visible distance is modified by -Level Diff (every level diff = 1.0f in visible distance)
+    visibleDistance += int32(getLevelForTarget(target)) - int32(target->getLevelForTarget(this));
+    //-Stealth Mod(positive like Master of Deception) and Stealth Detection(negative like paranoia)
+    //based on wowwiki every 5 mod we have 1 more level diff in calculation
+    visibleDistance += (float)(GetTotalAuraModifier(SPELL_AURA_MOD_DETECT) - target->GetTotalAuraModifier(SPELL_AURA_MOD_STEALTH_LEVEL)) / 5.0f;
+
+    return distance < visibleDistance;
+}
+
+void Unit::SetVisibility(UnitVisibility x)
+{
+    m_Visibility = x;
+
+    if(IsInWorld())
+    {
+        Map *m = MapManager::Instance().GetMap(GetMapId(), this);
+
+        if(GetTypeId()==TYPEID_PLAYER)
+            m->PlayerRelocation((Player*)this,GetPositionX(),GetPositionY(),GetPositionZ(),GetOrientation());
+        else
+            m->CreatureRelocation((Creature*)this,GetPositionX(),GetPositionY(),GetPositionZ(),GetOrientation());
+    }
 }
 
Index: /trunk/src/game/Player.cpp
===================================================================
--- /trunk/src/game/Player.cpp (revision 177)
+++ /trunk/src/game/Player.cpp (revision 178)
@@ -2001,6 +2001,6 @@
         if(HasAuraType(SPELL_AURA_MOD_STEALTH))
             SetVisibility(VISIBILITY_GROUP_STEALTH);
-        else if(HasAuraType(SPELL_AURA_MOD_INVISIBILITY))
-            SetVisibility(VISIBILITY_GROUP_INVISIBILITY);
+        //else if(HasAuraType(SPELL_AURA_MOD_INVISIBILITY))
+        //    SetVisibility(VISIBILITY_GROUP_INVISIBILITY);
         else
             SetVisibility(VISIBILITY_ON);
@@ -16396,5 +16396,4 @@
         if ((*i)->isVisibleForOrDetect(this,true))
         {
-
             (*i)->SendUpdateToPlayer(this);
             m_clientGUIDs.insert((*i)->GetGUID());
@@ -17189,5 +17188,106 @@
 }
 
-bool Player::IsVisibleInGridForPlayer( Player* pl ) const
+bool Player::canSeeOrDetect(Unit const* u, bool detect, bool inVisibleList) const
+{
+    // Always can see self
+    if (u == this)
+        return true;
+
+    // player visible for other player if not logout and at same transport
+    // including case when player is out of world
+    bool at_same_transport =
+        GetTransport() && u->GetTypeId() == TYPEID_PLAYER
+        && !GetSession()->PlayerLogout() && !((Player*)u)->GetSession()->PlayerLogout()
+        && !GetSession()->PlayerLoading() && !((Player*)u)->GetSession()->PlayerLoading()
+        && GetTransport() == ((Player*)u)->GetTransport();
+
+    // not in world
+    if(!at_same_transport && (!IsInWorld() || !u->IsInWorld()))
+        return false;
+
+    // forbidden to seen (at GM respawn command)
+    if(u->GetVisibility() == VISIBILITY_RESPAWN)
+        return false;
+
+    // always seen by owner
+    if(GetGUID() == u->GetCharmerOrOwnerGUID())
+        return true;
+
+    // Grid dead/alive checks
+    // non visible at grid for any stealth state
+    if(!u->IsVisibleInGridForPlayer(this))
+        return false;
+
+    // If the player is currently possessing, update visibility from the possessed unit's location
+    const Unit* target = isPossessing() ? GetCharm() : this;
+
+    // different visible distance checks
+    if(isInFlight())                                     // what see player in flight
+    {
+        if (!target->IsWithinDistInMap(u,World::GetMaxVisibleDistanceInFlight()+(inVisibleList ? World::GetVisibleObjectGreyDistance() : 0.0f)))
+            return false;
+    }
+    else if(!u->isAlive())                                     // distance for show body
+    {
+        if (!target->IsWithinDistInMap(u,World::GetMaxVisibleDistanceForObject()+(inVisibleList ? World::GetVisibleObjectGreyDistance() : 0.0f)))
+            return false;
+    }
+    else if(u->GetTypeId()==TYPEID_PLAYER)                     // distance for show player
+    {
+        // Players far than max visible distance for player or not in our map are not visible too
+        if (!at_same_transport && !target->IsWithinDistInMap(u,World::GetMaxVisibleDistanceForPlayer()+(inVisibleList ? World::GetVisibleUnitGreyDistance() : 0.0f)))
+            return false;
+    }
+    else if(u->GetCharmerOrOwnerGUID())                        // distance for show pet/charmed
+    {
+        // Pet/charmed far than max visible distance for player or not in our map are not visible too
+        if (!target->IsWithinDistInMap(u,World::GetMaxVisibleDistanceForPlayer()+(inVisibleList ? World::GetVisibleUnitGreyDistance() : 0.0f)))
+            return false;
+    }
+    else                                                    // distance for show creature
+    {
+        // Units far than max visible distance for creature or not in our map are not visible too
+        if (!target->IsWithinDistInMap(u, target->isActive() 
+                ? (MAX_VISIBILITY_DISTANCE - (inVisibleList ? 0.0f : World::GetVisibleUnitGreyDistance()))
+                : (World::GetMaxVisibleDistanceForCreature() + (inVisibleList ? World::GetVisibleUnitGreyDistance() : 0.0f))))
+            return false;
+    }
+
+    // GMs see any players, not higher GMs and all units
+    if(isGameMaster())
+    {
+        if(u->GetTypeId() == TYPEID_PLAYER)
+            return ((Player *)u)->GetSession()->GetSecurity() <= GetSession()->GetSecurity();
+        else
+            return true;
+    }
+
+    if(u->GetVisibility() == VISIBILITY_OFF)
+        return false;
+
+    // player see other player with stealth/invisibility only if he in same group or raid or same team (raid/team case dependent from conf setting)
+    if((m_invisibilityMask || u->m_invisibilityMask) && !canDetectInvisibilityOf(u))
+        if(!(u->GetTypeId()==TYPEID_PLAYER && !IsHostileTo(u) && IsGroupVisibleFor(((Player*)u))))
+            return false;
+
+    // GM invisibility checks early, invisibility if any detectable, so if not stealth then visible
+    if(u->GetVisibility() == VISIBILITY_GROUP_STEALTH)
+    {
+        // if player is dead then he can't detect anyone in anycases
+        //do not know what is the use of this detect
+        // stealth and detected and visible for some seconds
+        if(!isAlive())
+            detect = false;
+        if(m_DetectInvTimer < 300 || !HaveAtClient(u))
+            if(!(u->GetTypeId()==TYPEID_PLAYER && !IsHostileTo(u) && IsGroupVisibleFor(((Player*)u))))
+                if(!detect || !canDetectStealthOf(u, GetDistance(u)))
+                    return false;
+    }
+
+    // Now check is target visible with LoS
+    return u->IsWithinLOS(GetPositionX(),GetPositionY(),GetPositionZ());
+}
+
+bool Player::IsVisibleInGridForPlayer( Player const * pl ) const
 {
     // gamemaster in GM mode see all, including ghosts
Index: /trunk/src/bindings/scripts/scripts/zone/black_temple/boss_illidan.cpp
===================================================================
--- /trunk/src/bindings/scripts/scripts/zone/black_temple/boss_illidan.cpp (revision 158)
+++ /trunk/src/bindings/scripts/scripts/zone/black_temple/boss_illidan.cpp (revision 178)
@@ -1,17 +1,17 @@
 /* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
+* This program is free software; you can redistribute it and/or modify
+* it under the terms of the GNU General Public License as published by
+* the Free Software Foundation; either version 2 of the License, or
+* (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program; if not, write to the Free Software
+* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+*/
 
 /* ScriptData
@@ -383,6 +383,4 @@
     uint64 GlaiveGUID[2];
 
-    std::list<uint64> ParasiteTargets; // for safety, do not use Unit*
-
     void Reset();
 
@@ -434,4 +432,5 @@
     void Aggro(Unit *who)
     {
+        m_creature->setActive(true);
         DoZoneInCombat();
     }
@@ -502,17 +501,4 @@
             m_creature->SetByteValue(UNIT_FIELD_BYTES_2, 0, SHEATH_STATE_MELEE );
         }
-    }
-
-    void AddParasiteTarget(uint64 targetGUID)
-    {
-        for(std::list<uint64>::iterator tIter = ParasiteTargets.begin(); tIter != ParasiteTargets.end(); tIter++)
-        {
-            if(*tIter == targetGUID)
-                return;
-        }
-        ParasiteTargets.push_back(targetGUID);
-
-        if(Phase == PHASE_NORMAL || Phase == PHASE_NORMAL_2 || Phase == PHASE_NORMAL_MAIEV)
-            Timer[EVENT_PARASITE_CHECK] += 1000;
     }
 
@@ -563,7 +549,5 @@
         case 1://lift off
             m_creature->HandleEmoteCommand(EMOTE_ONESHOT_LIFTOFF);
-            //m_creature->GetMotionMaster()->Clear(false);
             m_creature->SetUnitMovementFlags(MOVEMENTFLAG_LEVITATING + MOVEMENTFLAG_ONTRANSPORT);
-            //m_creature->GetMotionMaster()->MovePoint(0, m_creature->GetPositionX(),m_creature->GetPositionY(),m_creature->GetPositionZ());
             m_creature->StopMoving();
             DoYell(SAY_TAKEOFF, LANG_UNIVERSAL, NULL);
@@ -572,8 +556,5 @@
             break;
         case 2://move to center
-            //m_creature->GetMotionMaster()->Clear(false);
-            //m_creature->AddUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT);
             m_creature->GetMotionMaster()->MovePoint(0, CENTER_X + 5, CENTER_Y, CENTER_Z); //+5, for SPELL_THROW_GLAIVE bug
-            //m_creature->RemoveUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT);
             Timer[EVENT_FLIGHT_SEQUENCE] = 0;
             break;
@@ -615,13 +596,9 @@
             break;
         case 6://fly to hover point
-            //m_creature->AddUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT);
             m_creature->GetMotionMaster()->MovePoint(0, HoverPosition[HoverPoint].x, HoverPosition[HoverPoint].y, HoverPosition[HoverPoint].z);
-            //m_creature->RemoveUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT);
             Timer[EVENT_FLIGHT_SEQUENCE] = 0;
             break;
         case 7://return to center
-            //m_creature->AddUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT);
             m_creature->GetMotionMaster()->MovePoint(0, CENTER_X, CENTER_Y, CENTER_Z);
-            //m_creature->RemoveUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT);
             Timer[EVENT_FLIGHT_SEQUENCE] = 0;
             break;
@@ -642,7 +619,5 @@
             break;
         case 9://land
-            //m_creature->GetMotionMaster()->Clear(false);
             m_creature->RemoveUnitMovementFlag(MOVEMENTFLAG_LEVITATING + MOVEMENTFLAG_ONTRANSPORT);
-            //m_creature->GetMotionMaster()->MovePoint(0, m_creature->GetPositionX(),m_creature->GetPositionY(),m_creature->GetPositionZ());
             m_creature->StopMoving();
             m_creature->HandleEmoteCommand(EMOTE_ONESHOT_LAND);
@@ -664,5 +639,4 @@
             DoResetThreat();
             m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE + UNIT_FLAG_NOT_SELECTABLE);
-            //m_creature->GetMotionMaster()->Clear();
             m_creature->SetByteValue(UNIT_FIELD_BYTES_2, 0, SHEATH_STATE_MELEE );
             EnterPhase(PHASE_NORMAL_2);
@@ -724,9 +698,10 @@
     void UpdateAI(const uint32 diff)
     {
-        if((!m_creature->SelectHostilTarget() || !m_creature->getVictim()) && Phase < PHASE_TALK_SEQUENCE)
+        if((!m_creature->SelectHostilTarget() && !m_creature->getVictim()) && Phase < PHASE_TALK_SEQUENCE)
             return;
 
         Event = EVENT_NULL;
         for(uint32 i = 1; i <= MaxTimer[Phase]; i++)
+        {
             if(Timer[i])
                 if(Timer[i] <= diff)
@@ -736,221 +711,185 @@
                 }
                 else Timer[i] -= diff;
-
-                switch(Phase)
+        }
+
+        switch(Phase)
+        {
+        case PHASE_NORMAL:
+            if(HPPCT(m_creature) < 65)
+                EnterPhase(PHASE_FLIGHT_SEQUENCE);
+            break;
+
+        case PHASE_NORMAL_2:
+            if(m_creature->GetHealth()*100 / m_creature->GetMaxHealth() < 30)
+                EnterPhase(PHASE_TALK_SEQUENCE);
+            break;
+
+        case PHASE_NORMAL_MAIEV:
+            if(m_creature->GetHealth()*100 / m_creature->GetMaxHealth() < 1)
+                EnterPhase(PHASE_TALK_SEQUENCE);
+            break;
+
+        case PHASE_TALK_SEQUENCE:
+            if(Event == EVENT_TALK_SEQUENCE)
+                HandleTalkSequence();
+            break;
+
+        case PHASE_FLIGHT_SEQUENCE:
+            if(Event == EVENT_FLIGHT_SEQUENCE)
+                HandleFlightSequence();
+            break;
+
+        case PHASE_TRANSFORM_SEQUENCE:
+            if(Event == EVENT_TRANSFORM_SEQUENCE)
+                HandleTransformSequence();
+            break;
+        }
+
+        if(m_creature->IsNonMeleeSpellCasted(false))
+            return;
+
+        if(Phase == PHASE_NORMAL || Phase == PHASE_NORMAL_2 || Phase == PHASE_NORMAL_MAIEV && !m_creature->HasAura(SPELL_CAGED, 0))
+        {
+            switch(Event)
+            {
+                //PHASE_NORMAL
+            case EVENT_BERSERK:
+                DoYell(SAY_ENRAGE, LANG_UNIVERSAL, NULL);
+                DoPlaySoundToSet(m_creature, SOUND_ENRAGE);
+                DoCast(m_creature, SPELL_BERSERK, true);
+                Timer[EVENT_BERSERK] = 5000;//The buff actually lasts forever.
+                break;
+
+            case EVENT_TAUNT:
                 {
-                case PHASE_NORMAL:
-                    if(HPPCT(m_creature) < 65)
-                        EnterPhase(PHASE_FLIGHT_SEQUENCE);
-                    break;
-
-                case PHASE_NORMAL_2:
-                    if(m_creature->GetHealth()*100 / m_creature->GetMaxHealth() < 30)
-                        EnterPhase(PHASE_TALK_SEQUENCE);
-                    break;
-
-                case PHASE_NORMAL_MAIEV:
-                    if(m_creature->GetHealth()*100 / m_creature->GetMaxHealth() < 1)
-                        EnterPhase(PHASE_TALK_SEQUENCE);
-                    break;
-
-                case PHASE_TALK_SEQUENCE:
-                    if(Event == EVENT_TALK_SEQUENCE)
-                        HandleTalkSequence();
-                    break;
-
-                case PHASE_FLIGHT_SEQUENCE:
-                    if(Event == EVENT_FLIGHT_SEQUENCE)
-                        HandleFlightSequence();
-                    break;
-
-                case PHASE_TRANSFORM_SEQUENCE:
-                    if(Event == EVENT_TRANSFORM_SEQUENCE)
-                        HandleTransformSequence();
-                    break;
+                    uint32 random = rand()%4;
+                    char* yell = RandomTaunts[random].text;
+                    uint32 soundid = RandomTaunts[random].sound;
+                    if(yell)
+                        DoYell(yell, LANG_UNIVERSAL, NULL);
+                    if(soundid)
+                        DoPlaySoundToSet(m_creature, soundid);
                 }
-
-                if(m_creature->IsNonMeleeSpellCasted(false))
-                    return;
-
-                if(Phase == PHASE_NORMAL || Phase == PHASE_NORMAL_2 || Phase == PHASE_NORMAL_MAIEV && !m_creature->HasAura(SPELL_CAGED, 0))
+                Timer[EVENT_TAUNT] = 32000;
+                break;
+
+            case EVENT_SHEAR:
+                DoCast(m_creature->getVictim(), SPELL_SHEAR);
+                Timer[EVENT_SHEAR] = 25000 + (rand()%16 * 1000);
+                break;
+
+            case EVENT_FLAME_CRASH:
+                DoCast(m_creature->getVictim(), SPELL_FLAME_CRASH);
+                Timer[EVENT_FLAME_CRASH] = 35000;
+                break;
+
+            case EVENT_PARASITIC_SHADOWFIEND:
                 {
-                    switch(Event)
-                    {
-                        //PHASE_NORMAL
-                    case EVENT_BERSERK:
-                        DoYell(SAY_ENRAGE, LANG_UNIVERSAL, NULL);
-                        DoPlaySoundToSet(m_creature, SOUND_ENRAGE);
-                        DoCast(m_creature, SPELL_BERSERK, true);
-                        Timer[EVENT_BERSERK] = 5000;//The buff actually lasts forever.
-                        break;
-
-                    case EVENT_TAUNT:
-                        {
-                            uint32 random = rand()%4;
-                            char* yell = RandomTaunts[random].text;
-                            uint32 soundid = RandomTaunts[random].sound;
-                            if(yell)
-                                DoYell(yell, LANG_UNIVERSAL, NULL);
-                            if(soundid)
-                                DoPlaySoundToSet(m_creature, soundid);
-                        }
-                        Timer[EVENT_TAUNT] = 32000;
-                        break;
-
-                    case EVENT_SHEAR:
-                        DoCast(m_creature->getVictim(), SPELL_SHEAR);
-                        Timer[EVENT_SHEAR] = 25000 + (rand()%16 * 1000);
-                        break;
-
-                    case EVENT_FLAME_CRASH:
-                        DoCast(m_creature->getVictim(), SPELL_FLAME_CRASH);
-                        Timer[EVENT_FLAME_CRASH] = 35000;
-                        break;
-
-                    case EVENT_PARASITIC_SHADOWFIEND:
-                        {
-                            Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 1);
-                            if(!target) target = m_creature->getVictim();
-                            if(target->GetTypeId() == TYPEID_PLAYER && !target->HasAura(SPELL_PARASITIC_SHADOWFIEND, 0))
-                            {
-                                target->CastSpell(target, SPELL_PARASITIC_SHADOWFIEND, true); // do not miss
-                                ParasiteTargets.push_back(target->GetGUID());
-                                Timer[EVENT_PARASITE_CHECK] += 1000; // do not check immediately
-                            }
-                            Timer[EVENT_PARASITIC_SHADOWFIEND] = 40000;
-                        }
-                        break;
-
-                    case EVENT_PARASITE_CHECK:
-                        for(std::list<uint64>::iterator tIter = ParasiteTargets.begin(); tIter != ParasiteTargets.end();)
-                        {
-                            Unit* target = Unit::GetUnit((*m_creature), *tIter);
-                            if(!target || !target->HasAura(SPELL_PARASITIC_SHADOWFIEND, 0))
-                            {
-                                if(target && target->isAlive())
-                                    target->CastSpell(target, SPELL_SUMMON_PARASITICS, true);
-                                std::list<uint64>::iterator tIter2 = tIter;
-                                ++tIter;
-                                ParasiteTargets.erase(tIter2);
-                            }
-                            else
-                                ++tIter;
-                        }
-                        if(ParasiteTargets.empty())
-                            Timer[EVENT_PARASITE_CHECK] = 0;
-                        else
-                            Timer[EVENT_PARASITE_CHECK] = 1000;
-                        break;
-
-                    case EVENT_DRAW_SOUL:
-                        DoCast(m_creature->getVictim(), SPELL_DRAW_SOUL);
-                        Timer[EVENT_DRAW_SOUL] = 55000;          
-                        break;
-
-                        //PHASE_NORMAL_2
-                    case EVENT_AGONIZING_FLAMES:
-                        DoCast(SelectUnit(SELECT_TARGET_RANDOM,0), SPELL_AGONIZING_FLAMES);
-                        Timer[EVENT_AGONIZING_FLAMES] = 0;
-                        break;
-
-                    case EVENT_TRANSFORM_NORMAL:
-                        EnterPhase(PHASE_TRANSFORM_SEQUENCE);
-                        break;
-
-                        //PHASE_NORMAL_MAIEV
-                    case EVENT_ENRAGE:
-                        DoCast(m_creature, SPELL_ENRAGE);
-                        Timer[EVENT_ENRAGE] = 0;
-                        break;
-
-                    default:
-                        break;
-                    }
-                    DoMeleeAttackIfReady();
+                    Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 1, 200, true);
+                    if(!target) target = m_creature->getVictim();
+                    if(target)
+                        m_creature->CastSpell(target, SPELL_PARASITIC_SHADOWFIEND, true);
+                }break;
+
+            case EVENT_PARASITE_CHECK:
+                Timer[EVENT_PARASITE_CHECK] = 0;
+                break;
+
+            case EVENT_DRAW_SOUL:
+                DoCast(m_creature->getVictim(), SPELL_DRAW_SOUL);
+                Timer[EVENT_DRAW_SOUL] = 55000;          
+                break;
+
+                //PHASE_NORMAL_2
+            case EVENT_AGONIZING_FLAMES:
+                DoCast(SelectUnit(SELECT_TARGET_RANDOM,0), SPELL_AGONIZING_FLAMES);
+                Timer[EVENT_AGONIZING_FLAMES] = 0;
+                break;
+
+            case EVENT_TRANSFORM_NORMAL:
+                EnterPhase(PHASE_TRANSFORM_SEQUENCE);
+                break;
+
+                //PHASE_NORMAL_MAIEV
+            case EVENT_ENRAGE:
+                DoCast(m_creature, SPELL_ENRAGE);
+                Timer[EVENT_ENRAGE] = 0;
+                break;
+
+            default:
+                break;
+            }
+            DoMeleeAttackIfReady();
+        }
+
+        if(Phase == PHASE_FLIGHT)
+        {
+            switch(Event)
+            {
+            case EVENT_FIREBALL:
+                DoCast(SelectUnit(SELECT_TARGET_RANDOM, 0), SPELL_FIREBALL);
+                Timer[EVENT_FIREBALL] = 3000;
+                break;
+
+            case EVENT_DARK_BARRAGE:
+                DoCast(SelectUnit(SELECT_TARGET_RANDOM, 0), SPELL_DARK_BARRAGE);
+                Timer[EVENT_DARK_BARRAGE] = 0;
+                break;
+
+            case EVENT_EYE_BLAST:
+                CastEyeBlast(); 
+                Timer[EVENT_EYE_BLAST] = 0;
+                break;
+
+            case EVENT_MOVE_POINT:
+                Phase = PHASE_FLIGHT_SEQUENCE;
+                Timer[EVENT_FLIGHT_SEQUENCE] = 0;//do not start Event when changing hover point
+                for (uint8 i = 0; i <= rand()%3; i++)
+                {
+                    HoverPoint++;
+                    if(HoverPoint > 3)
+                        HoverPoint = 0;
                 }
-
-                if(Phase == PHASE_FLIGHT)
-                {
-                    switch(Event)
-                    {
-                    case EVENT_FIREBALL:
-                        DoCast(SelectUnit(SELECT_TARGET_RANDOM, 0), SPELL_FIREBALL);
-                        Timer[EVENT_FIREBALL] = 3000;
-                        break;
-
-                    case EVENT_DARK_BARRAGE:
-                        DoCast(SelectUnit(SELECT_TARGET_RANDOM, 0), SPELL_DARK_BARRAGE);
-                        Timer[EVENT_DARK_BARRAGE] = 0;
-                        break;
-
-                    case EVENT_EYE_BLAST:
-                        CastEyeBlast(); 
-                        Timer[EVENT_EYE_BLAST] = 0;
-                        break;
-
-                    case EVENT_MOVE_POINT:
-                        Phase = PHASE_FLIGHT_SEQUENCE;
-                        Timer[EVENT_FLIGHT_SEQUENCE] = 0;//do not start Event when changing hover point
-                        for (uint8 i = 0; i <= rand()%3; i++)
-                        {
-                            HoverPoint++;
-                            if(HoverPoint > 3)
-                                HoverPoint = 0;
-                        }
-                        m_creature->AddUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT);
-                        m_creature->GetMotionMaster()->MovePoint(0, HoverPosition[HoverPoint].x, HoverPosition[HoverPoint].y, HoverPosition[HoverPoint].z);
-                        m_creature->RemoveUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT);
-                        break;
-
-                    default:
-                        break;
-                    }
-                }
-
-                if(Phase == PHASE_DEMON)
-                {
-                    switch(Event)
-                    {
-                    case EVENT_SHADOW_BLAST:
-                        m_creature->GetMotionMaster()->Clear(false);
-                        if(!m_creature->IsWithinDistInMap(m_creature->getVictim(), 50)||!m_creature->IsWithinLOSInMap(m_creature->getVictim()))
-                            m_creature->GetMotionMaster()->MoveChase(m_creature->getVictim(), 30);
-                        else
-                            m_creature->GetMotionMaster()->MoveIdle();
-                        DoCast(m_creature->getVictim(), SPELL_SHADOW_BLAST);
-                        Timer[EVENT_SHADOW_BLAST] = 4000;
-                        break;
-                    case EVENT_SHADOWDEMON:
-                        DoCast(m_creature, SPELL_SUMMON_SHADOWDEMON);
-                        Timer[EVENT_SHADOWDEMON] = 0;
-                        Timer[EVENT_FLAME_BURST] += 10000;
-                        break;
-                    case EVENT_FLAME_BURST:
-                        DoCast(m_creature, SPELL_FLAME_BURST);
-                        Timer[EVENT_FLAME_BURST] = 15000;
-                        break;
-                    case EVENT_TRANSFORM_DEMON:
-                        EnterPhase(PHASE_TRANSFORM_SEQUENCE);
-                        break;
-                    default:
-                        break;
-                    }
-                }
+                m_creature->GetMotionMaster()->MovePoint(0, HoverPosition[HoverPoint].x, HoverPosition[HoverPoint].y, HoverPosition[HoverPoint].z);
+                break;
+
+            default:
+                break;
+            }
+        }
+
+        if(Phase == PHASE_DEMON)
+        {
+            switch(Event)
+            {
+            case EVENT_SHADOW_BLAST:
+                m_creature->GetMotionMaster()->Clear(false);
+                if(!m_creature->IsWithinDistInMap(m_creature->getVictim(), 50)||!m_creature->IsWithinLOSInMap(m_creature->getVictim()))
+                    m_creature->GetMotionMaster()->MoveChase(m_creature->getVictim(), 30);
+                else
+                    m_creature->GetMotionMaster()->MoveIdle();
+                DoCast(m_creature->getVictim(), SPELL_SHADOW_BLAST);
+                Timer[EVENT_SHADOW_BLAST] = 4000;
+                break;
+            case EVENT_SHADOWDEMON:
+                DoCast(m_creature, SPELL_SUMMON_SHADOWDEMON);
+                Timer[EVENT_SHADOWDEMON] = 0;
+                Timer[EVENT_FLAME_BURST] += 10000;
+                break;
+            case EVENT_FLAME_BURST:
+                DoCast(m_creature, SPELL_FLAME_BURST);
+                Timer[EVENT_FLAME_BURST] = 15000;
+                break;
+            case EVENT_TRANSFORM_DEMON:
+                EnterPhase(PHASE_TRANSFORM_SEQUENCE);
+                break;
+            default:
+                break;
+            }
+        }
     }
 };
 
 /********************************** End of Illidan AI ******************************************/
-
-//This is used to sort the players by distance in preparation for being charged by the flames.
-struct TargetDistanceOrder : public std::binary_function<const Unit, const Unit, bool>
-{
-    const Unit* MainTarget;
-    TargetDistanceOrder(const Unit* Target) : MainTarget(Target) {};
-    // functor for operator ">"
-    bool operator()(const Unit* _Left, const Unit* _Right) const
-    {
-        return (MainTarget->GetDistance(_Left) > MainTarget->GetDistance(_Right));
-    }
-};
 
 struct TRINITY_DLL_DECL flame_of_azzinothAI : public ScriptedAI
@@ -973,27 +912,5 @@
     void ChargeCheck()
     {        
-        // Get the Threat List
-        std::list<HostilReference *> m_threatlist = m_creature->getThreatManager().getThreatList();
-
-        if(!m_threatlist.size()) return; // He doesn't have anyone in his threatlist, useless to continue
-
-        std::list<Unit *> targets;
-        std::list<HostilReference *>::iterator itr = m_threatlist.begin();
-        for( ; itr!= m_threatlist.end(); ++itr) //store the threat list in a different container
-        {
-            Unit *target = Unit::GetUnit(*m_creature, (*itr)->getUnitGuid());
-            if(target && target->isAlive() && target->GetTypeId() == TYPEID_PLAYER && target->GetPositionZ()>350) //only on alive players
-                targets.push_back(target);
-        }
-
-        if (!targets.size())
-            return;
-
-        //Sort the list of players
-        targets.sort(TargetDistanceOrder(m_creature));
-        //Resize so we only get the furthest target
-        targets.resize(1);
-
-        Unit* target = (*targets.begin());
+        Unit* target = SelectUnit(SELECT_TARGET_FARTHEST, 0, 200, false);
         if(target && (!m_creature->IsWithinDistInMap(target, FLAME_CHARGE_DISTANCE)))
         {
@@ -1129,4 +1046,5 @@
         m_creature->SetUInt32Value(UNIT_NPC_FLAGS, 0); // Database sometimes has strange values..
         m_creature->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
+        m_creature->setActive(false);
     }
 
@@ -1185,4 +1103,6 @@
     void BeginChannel()
     {
+        m_creature->setActive(true);
+
         float x, y, z;
         if(GETGO(Gate, GateGUID))
@@ -1528,5 +1448,4 @@
             m_creature->InterruptNonMeleeSpells(false);
             m_creature->GetMotionMaster()->Clear(false);
-            //m_creature->GetMotionMaster()->MoveIdle();
             m_creature->AttackStop();
             m_creature->SetUInt64Value(UNIT_FIELD_TARGET, IllidanGUID);
@@ -1558,5 +1477,4 @@
         m_creature->InterruptNonMeleeSpells(false);
         m_creature->GetMotionMaster()->Clear(false);
-        //m_creature->GetMotionMaster()->MoveIdle();
         m_creature->Relocate(x, y, z);
         m_creature->SendMonsterMove(x, y, z, 0, 0, 0);
@@ -1840,7 +1758,5 @@
             if(!m_creature->getVictim()->HasAura(SPELL_PARASITIC_SHADOWFIEND, 0))
             {
-                m_creature->getVictim()->CastSpell(m_creature->getVictim(), SPELL_PARASITIC_SHADOWFIEND, true); //do not stack
-                if(GETCRE(Illidan, IllidanGUID))
-                    ((boss_illidan_stormrageAI*)Illidan->AI())->AddParasiteTarget(m_creature->getVictim()->GetGUID());
+                m_creature->getVictim()->CastSpell(m_creature->getVictim(), SPELL_PARASITIC_SHADOWFIEND, true, 0, 0, IllidanGUID); //do not stack
             }
             m_creature->AttackerStateUpdate(m_creature->getVictim());
@@ -1937,65 +1853,4 @@
 };
 
-struct TRINITY_DLL_DECL blazeAI : public ScriptedAI
-{
-    blazeAI(Creature *c) : ScriptedAI(c) {Reset();}
-
-    uint32 BlazeTimer;
-    uint32 DespawnTimer;
-
-    void Reset()
-    {
-        BlazeTimer = 3000;  
-        DespawnTimer = 60000; // Spell duration = 1 min
-        //((TemporarySummon*)m_creature)->Summon(TEMPSUMMON_TIMED_DESPAWN, 0, false);
-    }
-
-    void Aggro(Unit *who) {}
-    void AttackStart(Unit* who) { }
-    void MoveInLineOfSight(Unit *who){ }
-
-    void UpdateAI(const uint32 diff)
-    {
-        if(BlazeTimer)
-            if(BlazeTimer <= diff)
-            {
-                DoCast(m_creature, SPELL_BLAZE_EFFECT);//duration 60s
-                BlazeTimer = 0;
-            }else BlazeTimer -= diff;
-
-        if(DespawnTimer < diff)
-        {
-            m_creature->SetVisibility(VISIBILITY_OFF);
-            m_creature->setDeathState(JUST_DIED);
-        }else DespawnTimer -= diff;
-    }
-};
-
-struct TRINITY_DLL_DECL flamecrashAI : public ScriptedAI
-{
-    flamecrashAI(Creature *c) : ScriptedAI(c) {Reset();}
-
-    uint32 DespawnTimer;
-
-    void Reset()
-    {
-        DoCast(m_creature, SPELL_FLAME_CRASH_EFFECT);//duration inf
-        DespawnTimer = 120000; // summon spell duration
-    }
-
-    void Aggro(Unit *who) {}
-    void AttackStart(Unit *who) { }
-    void MoveInLineOfSight(Unit *who){ }
-
-    void UpdateAI(const uint32 diff)
-    {
-        if(DespawnTimer < diff)
-        {
-            m_creature->SetVisibility(VISIBILITY_OFF);
-            m_creature->setDeathState(JUST_DIED);
-        }else DespawnTimer -= diff;
-    }
-};
-
 struct TRINITY_DLL_DECL blade_of_azzinothAI : public ScriptedAI
 {
@@ -2070,6 +1925,4 @@
     FlightCount = 0;
     TransformCount = 0;
-
-    ParasiteTargets.clear();
 
     m_creature->SetUInt32Value(UNIT_FIELD_DISPLAYID, 21135);
@@ -2081,4 +1934,5 @@
 
     m_creature->CastSpell(m_creature, SPELL_DUAL_WIELD, true);
+    m_creature->setActive(false);
 }
 
@@ -2378,17 +2232,7 @@
 }
 
-CreatureAI* GetAI_flamecrash(Creature *_Creature)
-{
-    return new flamecrashAI (_Creature);
-}
-
 CreatureAI* GetAI_demonfire(Creature *_Creature)
 {
     return new demonfireAI (_Creature);
-}
-
-CreatureAI* GetAI_blaze(Creature *_Creature)
-{
-    return new blazeAI (_Creature);
 }
 
@@ -2450,16 +2294,6 @@
 
     newscript = new Script;
-    newscript->Name="mob_flame_crash";
-    newscript->GetAI = GetAI_flamecrash;
-    m_scripts[nrscripts++] = newscript;
-
-    newscript = new Script;
     newscript->Name="mob_demon_fire";
     newscript->GetAI = GetAI_demonfire;
-    m_scripts[nrscripts++] = newscript;
-
-    newscript = new Script;
-    newscript->Name="mob_blaze";
-    newscript->GetAI = GetAI_blaze;
     m_scripts[nrscripts++] = newscript;
 
Index: /trunk/src/bindings/scripts/scripts/zone/black_temple/instance_black_temple.cpp
===================================================================
--- /trunk/src/bindings/scripts/scripts/zone/black_temple/instance_black_temple.cpp (revision 90)
+++ /trunk/src/bindings/scripts/scripts/zone/black_temple/instance_black_temple.cpp (revision 178)
@@ -1,17 +1,17 @@
 /* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
+* This program is free software; you can redistribute it and/or modify
+* it under the terms of the GNU General Public License as published by
+* the Free Software Foundation; either version 2 of the License, or
+* (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program; if not, write to the Free Software
+* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+*/
 
 /* ScriptData
@@ -56,19 +56,18 @@
     uint64 IllidanStormrage;
 
-       uint16 BossKilled;
+    uint16 BossKilled;
 
     uint64 NajentusGate;
     uint64 MainTempleDoors;
-       uint64 ShadeOfAkamaDoor;
-       uint64 CommonDoor;//Teron
-       uint64 TeronDoor;
-       uint64 GuurtogDoor;
-       uint64 MotherDoor;
-       uint64 TempleDoor;//Befor mother
-       uint64 CouncilDoor;
-       uint64 SimpleDoor;//council
+    uint64 ShadeOfAkamaDoor;
+    uint64 CommonDoor;//Teron
+    uint64 TeronDoor;
+    uint64 GuurtogDoor;
+    uint64 MotherDoor;
+    uint64 TempleDoor;//Befor mother
+    uint64 CouncilDoor;
+    uint64 SimpleDoor;//council
     uint64 IllidanGate;
     uint64 IllidanDoor[2];
-
 
     uint32 Encounters[ENCOUNTERS];
@@ -89,16 +88,16 @@
         IllidanStormrage = 0;
 
-               BossKilled = 0;
+        BossKilled = 0;
 
         NajentusGate    = 0;
         MainTempleDoors = 0;
-               ShadeOfAkamaDoor= 0;
-               CommonDoor              = 0;//teron
-               TeronDoor               = 0;
-               GuurtogDoor             = 0;
-               MotherDoor              = 0;
-               TempleDoor              = 0;
-               SimpleDoor              = 0;//Bycouncil
-               CouncilDoor             = 0;
+        ShadeOfAkamaDoor= 0;
+        CommonDoor              = 0;//teron
+        TeronDoor               = 0;
+        GuurtogDoor             = 0;
+        MotherDoor              = 0;
+        TempleDoor              = 0;
+        SimpleDoor              = 0;//Bycouncil
+        CouncilDoor             = 0;
         IllidanGate     = 0;
         IllidanDoor[0]  = 0;
@@ -119,19 +118,13 @@
     void OpenDoor(uint64 DoorGUID, bool open)
     {
-        if(((InstanceMap*)instance)->GetPlayers().size())
-            if(Player* first = ((InstanceMap*)instance)->GetPlayers().front())
-                if(GameObject *Door = GameObject::GetGameObject(*first, DoorGUID))
-                    Door->SetUInt32Value(GAMEOBJECT_STATE, open ? 0 : 1);
-    }
-
-       void CloseDoor(uint64 DoorGUID, bool close)
-       {
-               if(((InstanceMap*)instance)->GetPlayers().size())
-            if(Player* first = ((InstanceMap*)instance)->GetPlayers().front())
-                if(GameObject *Door = GameObject::GetGameObject(*first, DoorGUID))
-                    Door->SetUInt32Value(GAMEOBJECT_STATE, close ? 1 : 0);
-       }
-
-
+        if(GameObject *Door = instance->GetGameObjectInMap(DoorGUID))
+            Door->SetUInt32Value(GAMEOBJECT_STATE, open ? 0 : 1);
+    }
+
+    void CloseDoor(uint64 DoorGUID, bool close)
+    {
+        if(GameObject *Door = instance->GetGameObjectInMap(DoorGUID))
+            Door->SetUInt32Value(GAMEOBJECT_STATE, close ? 1 : 0);
+    }
 
     void OnCreatureCreate(Creature *creature, uint32 creature_entry)
@@ -139,16 +132,16 @@
         switch(creature_entry)
         {
-            case 22887:    Najentus = creature->GetGUID();                  break;
-            case 23089:    Akama = creature->GetGUID();                     break;
-            case 22990:    Akama_Shade = creature->GetGUID();               break;
-            case 22841:    ShadeOfAkama = creature->GetGUID();              break;
-            case 22898:    Supremus = creature->GetGUID();                  break;
-            case 22917:    IllidanStormrage = creature->GetGUID();          break;
-            case 22949:    GathiosTheShatterer = creature->GetGUID();       break;
-            case 22950:    HighNethermancerZerevor = creature->GetGUID();   break;
-            case 22951:    LadyMalande = creature->GetGUID();               break;
-            case 22952:    VerasDarkshadow = creature->GetGUID();           break;
-            case 23426:    IllidariCouncil = creature->GetGUID();           break;
-            case 23499:    BloodElfCouncilVoice = creature->GetGUID();      break;
+        case 22887:    Najentus = creature->GetGUID();                  break;
+        case 23089:    Akama = creature->GetGUID();                     break;
+        case 22990:    Akama_Shade = creature->GetGUID();               break;
+        case 22841:    ShadeOfAkama = creature->GetGUID();              break;
+        case 22898:    Supremus = creature->GetGUID();                  break;
+        case 22917:    IllidanStormrage = creature->GetGUID();          break;
+        case 22949:    GathiosTheShatterer = creature->GetGUID();       break;
+        case 22950:    HighNethermancerZerevor = creature->GetGUID();   break;
+        case 22951:    LadyMalande = creature->GetGUID();               break;
+        case 22952:    VerasDarkshadow = creature->GetGUID();           break;
+        case 23426:    IllidariCouncil = creature->GetGUID();           break;
+        case 23499:    BloodElfCouncilVoice = creature->GetGUID();      break;
         }
     }
@@ -158,36 +151,36 @@
         switch(go->GetEntry())
         {
-            case 185483:                                    // Gate past Naj'entus (at the entrance to Supermoose's courtyards)
-                NajentusGate = go->GetGUID();break;
-                       case 185882:                                    // Main Temple Doors - right past Supermoose (Supremus)
-                MainTempleDoors = go->GetGUID();break;
-                       case 185478:
-                               ShadeOfAkamaDoor = go->GetGUID();break;
-                       case 185480: 
-                                       CommonDoor = go->GetGUID();break;
-                       case 186153:
-                               TeronDoor = go->GetGUID();break;
-                       case 185892:
-                               GuurtogDoor = go->GetGUID();break;
-                       case 185479:
-                               TempleDoor = go->GetGUID();break;
-                       case 185482:
-                               MotherDoor = go->GetGUID();break;
-                       case 185481:
-                               CouncilDoor = go->GetGUID();break;
-                       case 186152://used by council
-                               SimpleDoor = go->GetGUID();break;
-                       case 185905:                                    // Gate leading to Temple Summit
-                IllidanGate = go->GetGUID();
-                go->SetUInt32Value(GAMEOBJECT_FLAGS,GO_FLAG_NODESPAWN+GO_FLAG_INTERACT_COND);
-                break;
-                       case 186261:                                    // Right door at Temple Summit
-                IllidanDoor[0] = go->GetGUID();
-                go->SetUInt32Value(GAMEOBJECT_FLAGS,GO_FLAG_NODESPAWN+GO_FLAG_INTERACT_COND);
-                break;
-                       case 186262:                                    // Left door at Temple Summit
-                IllidanDoor[1] = go->GetGUID();
-                go->SetUInt32Value(GAMEOBJECT_FLAGS,GO_FLAG_NODESPAWN+GO_FLAG_INTERACT_COND);
-                break;
+        case 185483:                                    // Gate past Naj'entus (at the entrance to Supermoose's courtyards)
+            NajentusGate = go->GetGUID();break;
+        case 185882:                                    // Main Temple Doors - right past Supermoose (Supremus)
+            MainTempleDoors = go->GetGUID();break;
+        case 185478:
+            ShadeOfAkamaDoor = go->GetGUID();break;
+        case 185480: 
+            CommonDoor = go->GetGUID();break;
+        case 186153:
+            TeronDoor = go->GetGUID();break;
+        case 185892:
+            GuurtogDoor = go->GetGUID();break;
+        case 185479:
+            TempleDoor = go->GetGUID();break;
+        case 185482:
+            MotherDoor = go->GetGUID();break;
+        case 185481:
+            CouncilDoor = go->GetGUID();break;
+        case 186152://used by council
+            SimpleDoor = go->GetGUID();break;
+        case 185905:                                    // Gate leading to Temple Summit
+            IllidanGate = go->GetGUID();
+            go->SetUInt32Value(GAMEOBJECT_FLAGS,GO_FLAG_NODESPAWN+GO_FLAG_INTERACT_COND);
+            break;
+        case 186261:                                    // Right door at Temple Summit
+            IllidanDoor[0] = go->GetGUID();
+            go->SetUInt32Value(GAMEOBJECT_FLAGS,GO_FLAG_NODESPAWN+GO_FLAG_INTERACT_COND);
+            break;
+        case 186262:                                    // Left door at Temple Summit
+            IllidanDoor[1] = go->GetGUID();
+            go->SetUInt32Value(GAMEOBJECT_FLAGS,GO_FLAG_NODESPAWN+GO_FLAG_INTERACT_COND);
+            break;
         }
     }
@@ -197,21 +190,21 @@
         switch(identifier)
         {
-            case DATA_HIGHWARLORDNAJENTUS:         return Najentus;
-            case DATA_AKAMA:                       return Akama;
-            case DATA_AKAMA_SHADE:                 return Akama_Shade;
-            case DATA_SHADEOFAKAMA:                return ShadeOfAkama;
-            case DATA_SUPREMUS:                    return Supremus;
-            case DATA_ILLIDANSTORMRAGE:            return IllidanStormrage;
-            case DATA_GATHIOSTHESHATTERER:         return GathiosTheShatterer;
-            case DATA_HIGHNETHERMANCERZEREVOR:     return HighNethermancerZerevor;
-            case DATA_LADYMALANDE:                 return LadyMalande;
-            case DATA_VERASDARKSHADOW:             return VerasDarkshadow;
-            case DATA_ILLIDARICOUNCIL:             return IllidariCouncil;
-            case DATA_GAMEOBJECT_NAJENTUS_GATE:    return NajentusGate;
-            case DATA_GAMEOBJECT_ILLIDAN_GATE:     return IllidanGate;
-            case DATA_GAMEOBJECT_ILLIDAN_DOOR_R:   return IllidanDoor[0];
-            case DATA_GAMEOBJECT_ILLIDAN_DOOR_L:   return IllidanDoor[1];
-            case DATA_GAMEOBJECT_SUPREMUS_DOORS:   return MainTempleDoors;
-            case DATA_BLOOD_ELF_COUNCIL_VOICE:     return BloodElfCouncilVoice;
+        case DATA_HIGHWARLORDNAJENTUS:         return Najentus;
+        case DATA_AKAMA:                       return Akama;
+        case DATA_AKAMA_SHADE:                 return Akama_Shade;
+        case DATA_SHADEOFAKAMA:                return ShadeOfAkama;
+        case DATA_SUPREMUS:                    return Supremus;
+        case DATA_ILLIDANSTORMRAGE:            return IllidanStormrage;
+        case DATA_GATHIOSTHESHATTERER:         return GathiosTheShatterer;
+        case DATA_HIGHNETHERMANCERZEREVOR:     return HighNethermancerZerevor;
+        case DATA_LADYMALANDE:                 return LadyMalande;
+        case DATA_VERASDARKSHADOW:             return VerasDarkshadow;
+        case DATA_ILLIDARICOUNCIL:             return IllidariCouncil;
+        case DATA_GAMEOBJECT_NAJENTUS_GATE:    return NajentusGate;
+        case DATA_GAMEOBJECT_ILLIDAN_GATE:     return IllidanGate;
+        case DATA_GAMEOBJECT_ILLIDAN_DOOR_R:   return IllidanDoor[0];
+        case DATA_GAMEOBJECT_ILLIDAN_DOOR_L:   return IllidanDoor[1];
+        case DATA_GAMEOBJECT_SUPREMUS_DOORS:   return MainTempleDoors;
+        case DATA_BLOOD_ELF_COUNCIL_VOICE:     return BloodElfCouncilVoice;
         }
 
@@ -223,53 +216,53 @@
         switch(type)
         {
-            case DATA_HIGHWARLORDNAJENTUSEVENT:   Encounters[0] = data;                        break;
-            case DATA_SUPREMUSEVENT:              Encounters[1] = data;         break;
-            case DATA_SHADEOFAKAMAEVENT:          Encounters[2] = data;         break;
-            case DATA_TERONGOREFIENDEVENT:        Encounters[3] = data;         break;
-            case DATA_GURTOGGBLOODBOILEVENT:      Encounters[4] = data;         break;
-            case DATA_RELIQUARYOFSOULSEVENT:      Encounters[5] = data;         break;
-            case DATA_MOTHERSHAHRAZEVENT:         Encounters[6] = data;         break;
-            case DATA_ILLIDARICOUNCILEVENT:       Encounters[7] = data;         break;
-            case DATA_ILLIDANSTORMRAGEEVENT:      Encounters[8] = data;         break;
+        case DATA_HIGHWARLORDNAJENTUSEVENT:   Encounters[0] = data;                        break;
+        case DATA_SUPREMUSEVENT:              Encounters[1] = data;         break;
+        case DATA_SHADEOFAKAMAEVENT:          Encounters[2] = data;         break;
+        case DATA_TERONGOREFIENDEVENT:        Encounters[3] = data;         break;
+        case DATA_GURTOGGBLOODBOILEVENT:      Encounters[4] = data;         break;
+        case DATA_RELIQUARYOFSOULSEVENT:      Encounters[5] = data;         break;
+        case DATA_MOTHERSHAHRAZEVENT:         Encounters[6] = data;         break;
+        case DATA_ILLIDARICOUNCILEVENT:       Encounters[7] = data;         break;
+        case DATA_ILLIDANSTORMRAGEEVENT:      Encounters[8] = data;         break;
         }
 
         if(data == DONE)
-               {
+        {
             SaveToDB();
-                       BossKilled++;
-               }
-               CheckInstanceStatus();
-    }
-
-       void CheckInstanceStatus()
-       {
-               if(BossKilled >= 6)
-                       OpenDoor(TempleDoor, true);
-               if(Encounters[0] == DONE)
-                       OpenDoor(NajentusGate, true);
-               if(Encounters[2] == IN_PROGRESS)
-                       CloseDoor(ShadeOfAkamaDoor, true);
-               else OpenDoor(ShadeOfAkamaDoor, true);
-               if(Encounters[3] == IN_PROGRESS)
-               {
-                       CloseDoor(TeronDoor, true);
-                       CloseDoor(CommonDoor, true);
-               }else{ 
-                       OpenDoor(TeronDoor, true);
-                       OpenDoor(CommonDoor, true);
-               }
-               if(Encounters[4] == DONE)
-                       OpenDoor(GuurtogDoor, true);
-               if(Encounters[6] == DONE)
-                       OpenDoor(MotherDoor, true);
-               if(Encounters[7] == IN_PROGRESS)
-               {
-                       CloseDoor(CouncilDoor, true);
-                       CloseDoor(SimpleDoor, true);
-               }else{
-                       OpenDoor(CouncilDoor, true);
-                       OpenDoor(SimpleDoor, true);                     
-               }
-       }
+            BossKilled++;
+        }
+        CheckInstanceStatus();
+    }
+
+    void CheckInstanceStatus()
+    {
+        if(BossKilled >= 6)
+            OpenDoor(TempleDoor, true);
+        if(Encounters[0] == DONE)
+            OpenDoor(NajentusGate, true);
+        if(Encounters[2] == IN_PROGRESS)
+            CloseDoor(ShadeOfAkamaDoor, true);
+        else OpenDoor(ShadeOfAkamaDoor, true);
+        if(Encounters[3] == IN_PROGRESS)
+        {
+            CloseDoor(TeronDoor, true);
+            CloseDoor(CommonDoor, true);
+        }else{ 
+            OpenDoor(TeronDoor, true);
+            OpenDoor(CommonDoor, true);
+        }
+        if(Encounters[4] == DONE)
+            OpenDoor(GuurtogDoor, true);
+        if(Encounters[6] == DONE)
+            OpenDoor(MotherDoor, true);
+        if(Encounters[7] == IN_PROGRESS)
+        {
+            CloseDoor(CouncilDoor, true);
+            CloseDoor(SimpleDoor, true);
+        }else{
+            OpenDoor(CouncilDoor, true);
+            OpenDoor(SimpleDoor, true);                     
+        }
+    }
 
     uint32 GetData(uint32 type)
@@ -277,13 +270,13 @@
         switch(type)
         {
-            case DATA_HIGHWARLORDNAJENTUSEVENT:         return Encounters[0];
-            case DATA_SUPREMUSEVENT:                    return Encounters[1];
-            case DATA_SHADEOFAKAMAEVENT:                return Encounters[2];
-            case DATA_TERONGOREFIENDEVENT:              return Encounters[3];
-            case DATA_GURTOGGBLOODBOILEVENT:            return Encounters[4];
-            case DATA_RELIQUARYOFSOULSEVENT:            return Encounters[5];
-            case DATA_MOTHERSHAHRAZEVENT:               return Encounters[6];
-            case DATA_ILLIDARICOUNCILEVENT:             return Encounters[7];
-            case DATA_ILLIDANSTORMRAGEEVENT:            return Encounters[8];
+        case DATA_HIGHWARLORDNAJENTUSEVENT:         return Encounters[0];
+        case DATA_SUPREMUSEVENT:                    return Encounters[1];
+        case DATA_SHADEOFAKAMAEVENT:                return Encounters[2];
+        case DATA_TERONGOREFIENDEVENT:              return Encounters[3];
+        case DATA_GURTOGGBLOODBOILEVENT:            return Encounters[4];
+        case DATA_RELIQUARYOFSOULSEVENT:            return Encounters[5];
+        case DATA_MOTHERSHAHRAZEVENT:               return Encounters[6];
+        case DATA_ILLIDARICOUNCILEVENT:             return Encounters[7];
+        case DATA_ILLIDANSTORMRAGEEVENT:            return Encounters[8];
         }
 
@@ -320,6 +313,6 @@
         std::istringstream stream(in);
         stream >> Encounters[0] >> Encounters[1] >> Encounters[2] >> Encounters[3]
-            >> Encounters[4] >> Encounters[5] >> Encounters[6] >> Encounters[7]
-            >> Encounters[8];
+        >> Encounters[4] >> Encounters[5] >> Encounters[6] >> Encounters[7]
+        >> Encounters[8];
         for(uint8 i = 0; i < ENCOUNTERS; ++i)
             if(Encounters[i] == IN_PROGRESS)                // Do not load an encounter as "In Progress" - reset it instead.
Index: /trunk/src/bindings/scripts/scripts/zone/black_temple/boss_reliquary_of_souls.cpp
===================================================================
--- /trunk/src/bindings/scripts/scripts/zone/black_temple/boss_reliquary_of_souls.cpp (revision 90)
+++ /trunk/src/bindings/scripts/scripts/zone/black_temple/boss_reliquary_of_souls.cpp (revision 178)
@@ -635,43 +635,4 @@
     }
 
-    void SelectSpiteTarget(uint32 num, float max_range = 999)
-    {
-        if(!num) return;
-
-        CellPair p(Trinity::ComputeCellPair(m_creature->GetPositionX(), m_creature->GetPositionY()));
-        Cell cell(p);
-        cell.data.Part.reserved = ALL_DISTRICT;
-        cell.SetNoCreate();
-
-        std::list<Unit *> tempUnitMap;
-
-        {
-            Trinity::AnyAoETargetUnitInObjectRangeCheck u_check(m_creature, m_creature, max_range);
-            Trinity::UnitListSearcher<Trinity::AnyAoETargetUnitInObjectRangeCheck> searcher(tempUnitMap, u_check);
-
-            TypeContainerVisitor<Trinity::UnitListSearcher<Trinity::AnyAoETargetUnitInObjectRangeCheck>, WorldTypeMapContainer > world_unit_searcher(searcher);
-            TypeContainerVisitor<Trinity::UnitListSearcher<Trinity::AnyAoETargetUnitInObjectRangeCheck>, GridTypeMapContainer >  grid_unit_searcher(searcher);
-
-            CellLock<GridReadGuard> cell_lock(cell, p);
-            cell_lock->Visit(cell_lock, world_unit_searcher, *(m_creature->GetMap()));
-            cell_lock->Visit(cell_lock, grid_unit_searcher, *(m_creature->GetMap()));
-        }
-
-        std::list<Unit*>::iterator itr;
-        while(tempUnitMap.size() && SpiteTargetGUID.size() < num)
-        {
-            itr = tempUnitMap.begin();
-            advance(itr, rand()%tempUnitMap.size());
-            SpiteTargetGUID.push_back((*itr)->GetGUID());
-            tempUnitMap.erase(itr);
-        }
-
-        for(itr = tempUnitMap.begin(); itr != tempUnitMap.end(); ++itr)
-            (*itr)->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
-        m_creature->CastSpell(m_creature, SPELL_SPITE_TARGET, true); // must true
-        for(itr = tempUnitMap.begin(); itr != tempUnitMap.end(); ++itr)
-            (*itr)->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
-    }
-
     void UpdateAI(const uint32 diff)
     {
@@ -701,5 +662,5 @@
         {
             DoCast(m_creature->getVictim(), SPELL_SOUL_SCREAM);
-            SoulScreamTimer = 10000;
+            SoulScreamTimer = 9000 + rand()%2000;
             if(!(rand()%3))
             {
@@ -711,24 +672,8 @@
         if(SpiteTimer < diff)
         {
-            if(!SpiteTargetGUID.empty())
-            {
-                for (std::list<uint64>::iterator itr = SpiteTargetGUID.begin(); itr != SpiteTargetGUID.end(); ++itr)
-                {
-                    if(Unit* target = Unit::GetUnit(*m_creature, *itr))
-                    {
-                        target->RemoveAurasDueToSpell(SPELL_SPITE_TARGET);
-                        m_creature->CastSpell(target, SPELL_SPITE_DAMAGE, true);
-                    }
-                }
-                SpiteTargetGUID.clear();
-                SpiteTimer = 24000;
-            }
-            else
-            {
-                SelectSpiteTarget(3);
-                SpiteTimer = 6000;
-                DoYell(ANGER_SAY_SPEC,LANG_UNIVERSAL,NULL);
-                DoPlaySoundToSet(m_creature, ANGER_SOUND_SPEC);
-            }
+            DoCast(m_creature, SPELL_SPITE_TARGET);
+            SpiteTimer = 30000;
+            DoYell(ANGER_SAY_SPEC,LANG_UNIVERSAL,NULL);
+            DoPlaySoundToSet(m_creature, ANGER_SOUND_SPEC);
         }else SpiteTimer -= diff;
 
Index: /trunk/sql/updates/146_world.sql
===================================================================
--- /trunk/sql/updates/146_world.sql (revision 161)
+++ /trunk/sql/updates/146_world.sql (revision 178)
@@ -1,4 +1,2 @@
-update creature_template set spell1 = 40836, flags_extra = 128, scriptname = '' where entry = 23336;
-
 DROP TABLE IF EXISTS `spell_linked_spell`;
 CREATE TABLE `spell_linked_spell` (
Index: /trunk/sql/updates/163_world.sql
===================================================================
--- /trunk/sql/updates/163_world.sql (revision 162)
+++ /trunk/sql/updates/163_world.sql (revision 178)
@@ -1,7 +1,15 @@
-DELETE FROM spell_linked_spell WHERE `spell_trigger` IN (39992, 39835, 42052, -41914, 41126);
+DELETE FROM spell_linked_spell WHERE `spell_trigger` IN (39992, 39835, 42052, -41914, 41126, 41376);
 -- INSERT INTO spell_linked_spell (`spell_trigger`, `spell_effect`, `type`, `comment`) VALUES (39992, 39835, 1, 'Needle Spine');
 INSERT INTO spell_linked_spell (`spell_trigger`, `spell_effect`, `type`, `comment`) VALUES (39835, 39968, 1, 'Needle Spine');
+INSERT INTO spell_linked_spell (`spell_trigger`, `spell_effect`, `type`, `comment`) VALUES (-41376, 41377, 0, 'Spite');
 INSERT INTO spell_linked_spell (`spell_trigger`, `spell_effect`, `type`, `comment`) VALUES (-41914, 41915, 0, 'Summon Parasitic Shadowfiend');
 INSERT INTO spell_linked_spell (`spell_trigger`, `spell_effect`, `type`, `comment`) VALUES (41126, 41131, 1, 'Flame Crash');
 
+-- molten_flame
 UPDATE creature_template SET flags_extra = 128, speed = 1.0 WHERE entry = 23095;
+-- volcano
+UPDATE creature_template SET spell1 = 40117, flags_extra = 128, scriptname = '' WHERE entry = 23085;
+-- flame crash
+update creature_template set spell1 = 40836, flags_extra = 128, scriptname = '' where entry = 23336;
+-- blaze
+update creature_template set spell1 = 40610, flags_extra = 128, scriptname = '' where entry = 23259;
