Index: /trunk/src/game/SpellHandler.cpp
===================================================================
--- /trunk/src/game/SpellHandler.cpp (revision 260)
+++ /trunk/src/game/SpellHandler.cpp (revision 267)
@@ -369,8 +369,9 @@
                 spellInfo->EffectApplyAuraName[i] == SPELL_AURA_BIND_SIGHT)
             {
+                // Fix me: creature may be killed during player aura cancel
                 _player->RemoveAurasDueToSpellByCancel(spellId);
                 if (_player->GetCharm())
                     _player->GetCharm()->RemoveAurasDueToSpellByCancel(spellId);
-                else if (_player->GetFarsightTarget()->GetTypeId() != TYPEID_DYNAMICOBJECT)
+                else if (_player->GetFarsightTarget() && _player->GetFarsightTarget()->GetTypeId() != TYPEID_DYNAMICOBJECT)
                     ((Unit*)_player->GetFarsightTarget())->RemoveAurasDueToSpellByCancel(spellId);
                 return;
Index: /trunk/src/game/GridNotifiers.h
===================================================================
--- /trunk/src/game/GridNotifiers.h (revision 266)
+++ /trunk/src/game/GridNotifiers.h (revision 267)
@@ -702,5 +702,5 @@
     {
         public:
-            explicit NearestHostileUnitInAttackDistanceCheck(Creature* creature, float dist = 0) : m_creature(creature) 
+            explicit NearestHostileUnitInAttackDistanceCheck(Creature const* creature, float dist = 0) : m_creature(creature) 
             {
                 m_range = (dist == 0 ? 9999 : dist);
@@ -709,19 +709,18 @@
             bool operator()(Unit* u)
             {
-                if(!u->isAlive() || !m_creature->IsHostileTo(u))
-                    return false;
-
-                float dist;
-                if(m_force) dist = m_range;
+                // TODO: addthreat for every enemy in range?
+                if(!m_creature->IsWithinDistInMap(u, m_range))
+                    return false;
+
+                if(m_force)
+                {
+                    if(!m_creature->canAttack(u))
+                        return false;
+                }
                 else
                 {
-                    dist = m_creature->GetAttackDistance(u);
-                    if(dist > m_range) dist = m_range;
+                    if(!m_creature->canStartAttack(u))
+                        return false;
                 }
-                if(!m_creature->IsWithinDistInMap(u, dist))
-                    return false;
-
-                if(!m_creature->canSeeOrDetect(u, true, false))
-                    return false;
 
                 m_range = m_creature->GetDistance(u);
@@ -730,5 +729,5 @@
             float GetLastRange() const { return m_range; }
         private:
-            Creature* const m_creature;
+            Creature const *m_creature;
             float m_range;
             bool m_force;
Index: /trunk/src/game/Creature.cpp
===================================================================
--- /trunk/src/game/Creature.cpp (revision 266)
+++ /trunk/src/game/Creature.cpp (revision 267)
@@ -1544,4 +1544,17 @@
 }
 
+bool Creature::canStartAttack(Unit const* who) const
+{
+    if(!who->isInAccessiblePlaceFor(this)
+        || !canFly() && GetDistanceZ(who) > CREATURE_Z_ATTACK_RANGE
+        || !IsWithinDistInMap(who, GetAttackDistance(who)))
+        return false;
+
+    if(!canAttack(who))
+        return false;
+
+    return IsWithinLOSInMap(who);
+}
+
 float Creature::GetAttackDistance(Unit const* pl) const
 {
@@ -1825,10 +1838,10 @@
 Unit* Creature::SelectNearestTarget(float dist) const
 {
-    /*CellPair p(Trinity::ComputeCellPair(GetPositionX(), GetPositionY()));
+    CellPair p(Trinity::ComputeCellPair(GetPositionX(), GetPositionY()));
     Cell cell(p);
     cell.data.Part.reserved = ALL_DISTRICT;
     cell.SetNoCreate();
 
-    Unit *target;
+    Unit *target = NULL;
 
     {
@@ -1840,8 +1853,9 @@
 
         CellLock<GridReadGuard> cell_lock(cell, p);
-        cell_lock->Visit(cell_lock, world_unit_searcher, GetMap());
-        cell_lock->Visit(cell_lock, grid_unit_searcher, GetMap());
-    }*/
-    return NULL;
+        cell_lock->Visit(cell_lock, world_unit_searcher, *GetMap());
+        cell_lock->Visit(cell_lock, grid_unit_searcher, *GetMap());
+    }
+
+    return target;
 }
 
Index: /trunk/src/game/Creature.h
===================================================================
--- /trunk/src/game/Creature.h (revision 266)
+++ /trunk/src/game/Creature.h (revision 267)
@@ -558,4 +558,5 @@
         bool canSeeOrDetect(Unit const* u, bool detect, bool inVisibleList) const;
         bool IsWithinSightDist(Unit const* u) const;
+        bool canStartAttack(Unit const* u) const;
         float GetAttackDistance(Unit const* pl) const;
 
Index: /trunk/src/game/Unit.cpp
===================================================================
--- /trunk/src/game/Unit.cpp (revision 266)
+++ /trunk/src/game/Unit.cpp (revision 267)
@@ -8543,4 +8543,7 @@
     assert(target);
 
+    if(!IsHostileTo(target))
+        return false;
+
     if(!target->isAttackableByAOE() || target->hasUnitState(UNIT_STAT_DIED))
         return false;
@@ -9127,4 +9130,11 @@
     }
 
+    // search nearby enemy before enter evade mode
+    if(Unit *target = ((Creature*)this)->SelectNearestTarget())
+    {
+        ((Creature*)this)->AI()->AttackStart(target);
+        return true;
+    }
+
     // enter in evade mode in other case
     ((Creature*)this)->AI()->EnterEvadeMode();
Index: /trunk/src/bindings/scripts/include/sc_creature.cpp
===================================================================
--- /trunk/src/bindings/scripts/include/sc_creature.cpp (revision 257)
+++ /trunk/src/bindings/scripts/include/sc_creature.cpp (revision 267)
@@ -74,15 +74,5 @@
 void ScriptedAI::MoveInLineOfSight(Unit *who)
 {
-    if(m_creature->getVictim() || !m_creature->IsHostileTo(who) || !who->isInAccessiblePlaceFor(m_creature))
-        return;
-
-    if(!m_creature->canFly() && m_creature->GetDistanceZ(who) > CREATURE_Z_ATTACK_RANGE)
-        return;
-
-    if(!m_creature->IsWithinDistInMap(who, m_creature->GetAttackDistance(who)) || !m_creature->IsWithinLOSInMap(who))
-        return;
-    
-    if(m_creature->canAttack(who))
-        //who->RemoveSpellsCausingAura(SPELL_AURA_MOD_STEALTH);
+    if(!m_creature->getVictim() && m_creature->canStartAttack(who))
         AttackStart(who);
 }
