Index: trunk/src/game/SpellEffects.cpp
===================================================================
--- trunk/src/game/SpellEffects.cpp (revision 141)
+++ trunk/src/game/SpellEffects.cpp (revision 142)
@@ -1972,41 +1972,26 @@
         return;
 
-    switch (m_spellInfo->EffectImplicitTargetB[i])
-    {
-        case TARGET_INNKEEPER_COORDINATES:
-        {
-            // Only players can teleport to innkeeper
-            if (unitTarget->GetTypeId() != TYPEID_PLAYER)
-                return;
-
-            ((Player*)unitTarget)->TeleportTo(((Player*)unitTarget)->m_homebindMapId,((Player*)unitTarget)->m_homebindX,((Player*)unitTarget)->m_homebindY,((Player*)unitTarget)->m_homebindZ,unitTarget->GetOrientation(),unitTarget==m_caster ? TELE_TO_SPELL : 0);
-            return;
-        }
-        default:
-        {
-            // If not exist data for dest location - return
-            if(!m_targets.HasDest())
-            {
-                sLog.outError( "Spell::EffectTeleportUnits - unknown EffectImplicitTargetB[%u] = %u for spell ID %u\n", i, m_spellInfo->EffectImplicitTargetB[i], m_spellInfo->Id );
-                return;
-            }
-            // Init dest coordinates
-            uint32 mapid = m_caster->GetMapId();
-            float x = m_targets.m_destX;
-            float y = m_targets.m_destY;
-            float z = m_targets.m_destZ;
-            float orientation = unitTarget->GetOrientation();
-            // Teleport
-            if(unitTarget->GetTypeId() == TYPEID_PLAYER)
-                ((Player*)unitTarget)->TeleportTo(mapid, x, y, z, orientation, TELE_TO_NOT_LEAVE_COMBAT | TELE_TO_NOT_UNSUMMON_PET | (unitTarget==m_caster ? TELE_TO_SPELL : 0));
-            else
-            {
-                MapManager::Instance().GetMap(mapid, m_caster)->CreatureRelocation((Creature*)unitTarget, x, y, z, orientation);
-                WorldPacket data;
-                unitTarget->BuildTeleportAckMsg(&data, x, y, z, orientation);
-                unitTarget->SendMessageToSet(&data, false);
-            }
-            return;
-        }
+    // If not exist data for dest location - return
+    if(!m_targets.HasDest())
+    {
+        sLog.outError( "Spell::EffectTeleportUnits - does not have destination for spell ID %u\n", m_spellInfo->Id );
+        return;
+    }
+    // Init dest coordinates
+    uint32 mapid = m_targets.m_mapId;
+    float x = m_targets.m_destX;
+    float y = m_targets.m_destY;
+    float z = m_targets.m_destZ;
+    float orientation = unitTarget->GetOrientation();
+    sLog.outDebug("Spell::EffectTeleportUnits - teleport unit to %u %f %f %f\n", mapid, x, y, z);
+    // Teleport
+    if(unitTarget->GetTypeId() == TYPEID_PLAYER)
+        ((Player*)unitTarget)->TeleportTo(mapid, x, y, z, orientation, TELE_TO_NOT_LEAVE_COMBAT | TELE_TO_NOT_UNSUMMON_PET | (unitTarget==m_caster ? TELE_TO_SPELL : 0));
+    else
+    {
+        MapManager::Instance().GetMap(mapid, m_caster)->CreatureRelocation((Creature*)unitTarget, x, y, z, orientation);
+        WorldPacket data;
+        unitTarget->BuildTeleportAckMsg(&data, x, y, z, orientation);
+        unitTarget->SendMessageToSet(&data, false);
     }
 
@@ -3490,5 +3475,5 @@
         {
             // Reveal action + get attack
-            m_caster->RemoveSpellsCausingAura(SPELL_AURA_MOD_STEALTH);
+            m_caster->RemoveInterruptableAura(AURA_INTERRUPT_FLAG_STEALTH);
             if (((Creature*)unitTarget)->AI())
                 ((Creature*)unitTarget)->AI()->AttackStart(m_caster);
Index: trunk/src/game/Unit.h
===================================================================
--- trunk/src/game/Unit.h (revision 141)
+++ trunk/src/game/Unit.h (revision 142)
@@ -72,4 +72,5 @@
     AURA_INTERRUPT_FLAG_UNK12               = 0x00001000,   // 12   removed by attack?
     AURA_INTERRUPT_FLAG_UNK13               = 0x00002000,   // 13
+    AURA_INTERRUPT_FLAG_STEALTH             = 0x00003C00,
     AURA_INTERRUPT_FLAG_UNK14               = 0x00004000,   // 14
     AURA_INTERRUPT_FLAG_UNK15               = 0x00008000,   // 15   removed by casting a spell?
@@ -1004,4 +1005,5 @@
 
         void RemoveSpellsCausingAura(AuraType auraType);
+        void RemoveInterruptableAura(uint32 flag);
         void RemoveRankAurasDueToSpell(uint32 spellId);
         bool RemoveNoStackAurasDueToAura(Aura *Aur);
@@ -1301,4 +1303,5 @@
 
         AuraList m_modAuras[TOTAL_AURAS];
+        AuraList m_interruptableAuras;
         float m_auraModifiersGroup[UNIT_MOD_END][MODIFIER_TYPE_END];
         float m_weaponDamage[MAX_ATTACK][2];
Index: trunk/src/game/Unit.cpp
===================================================================
--- trunk/src/game/Unit.cpp (revision 141)
+++ trunk/src/game/Unit.cpp (revision 142)
@@ -455,4 +455,24 @@
 }
 
+void Unit::RemoveInterruptableAura(uint32 flag)
+{
+    AuraList::iterator iter, next;
+    for (iter = m_interruptableAuras.begin(); iter != m_interruptableAuras.end(); iter = next)
+    {
+        next = iter;
+        ++next;
+
+        //sLog.outDetail("auraflag:%u flag:%u = %u",(*iter)->GetSpellProto()->AuraInterruptFlags,flag,(*iter)->GetSpellProto()->AuraInterruptFlags & flag);
+        if(*iter && ((*iter)->GetSpellProto()->AuraInterruptFlags & flag) == flag)
+        {
+            RemoveAurasDueToSpell((*iter)->GetId());
+            if (!m_interruptableAuras.empty())
+                next = m_interruptableAuras.begin();
+            else
+                return;
+        }
+    }
+}
+
 bool Unit::HasAuraType(AuraType auraType) const
 {
@@ -475,12 +495,11 @@
 
     // remove affects from victim (including from 0 damage and DoTs)
-    if(pVictim != this)
-        pVictim->RemoveSpellsCausingAura(SPELL_AURA_MOD_STEALTH);
+    //if(pVictim != this)
+    //    pVictim->RemoveSpellsCausingAura(SPELL_AURA_MOD_STEALTH);
 
     // remove affects from attacker at any non-DoT damage (including 0 damage)
     if( damagetype != DOT)
     {
-        RemoveSpellsCausingAura(SPELL_AURA_MOD_STEALTH);
-        RemoveSpellsCausingAura(SPELL_AURA_FEIGN_DEATH);
+        RemoveInterruptableAura(AURA_INTERRUPT_FLAG_STEALTH);
 
         if(pVictim->GetTypeId() == TYPEID_PLAYER && !pVictim->IsStandState() && !pVictim->hasUnitState(UNIT_STAT_STUNNED))
@@ -3739,4 +3758,6 @@
     {
         m_modAuras[Aur->GetModifier()->m_auraname].push_back(Aur);
+        if(Aur->GetSpellProto()->AuraInterruptFlags)
+            m_interruptableAuras.push_back(Aur);
     }
 
@@ -4111,4 +4132,6 @@
     {
         m_modAuras[(*i).second->GetModifier()->m_auraname].remove((*i).second);
+        if((*i).second->GetSpellProto()->AuraInterruptFlags)
+            m_interruptableAuras.remove((*i).second);
     }
 
Index: trunk/src/game/Spell.h
===================================================================
--- trunk/src/game/Spell.h (revision 139)
+++ trunk/src/game/Spell.h (revision 142)
@@ -112,4 +112,5 @@
             //m_srcZ = target.m_srcZ;
 
+            m_mapId = 0;
             m_destX = target.m_destX;
             m_destY = target.m_destY;
@@ -127,5 +128,5 @@
         Unit *getUnitTarget() const { return m_unitTarget; }
         void setUnitTarget(Unit *target);
-        void setDestination(float x, float y, float z, bool send = true);
+        void setDestination(float x, float y, float z, bool send = true, uint32 mapId = 0);
         void setDestination(Unit *target, bool send = true);
 
@@ -155,4 +156,5 @@
 
         float m_srcX, m_srcY, m_srcZ;
+        uint32 m_mapId;
         float m_destX, m_destY, m_destZ;
         bool m_hasDest;
@@ -549,5 +551,5 @@
         float i_radius;
         SpellTargets i_TargetType;
-        Unit* i_originalCaster;
+        Unit* i_caster;
         uint32 i_entry;
 
@@ -556,5 +558,5 @@
             : i_data(&data), i_spell(spell), i_push_type(type), i_radius(radius), i_TargetType(TargetType), i_entry(entry)
         {
-            i_originalCaster = spell.GetCaster();
+            i_caster = spell.GetCaster();
         }
 
@@ -563,5 +565,5 @@
             assert(i_data);
 
-            if(!i_originalCaster)
+            if(!i_caster)
                 return;
 
@@ -574,5 +576,5 @@
                 {
                     case SPELL_TARGETS_FRIENDLY:
-                        if (!itr->getSource()->isTargetableForAttack() || !i_originalCaster->IsFriendlyTo( itr->getSource() ))
+                        if (!itr->getSource()->isTargetableForAttack() || !i_caster->IsFriendlyTo( itr->getSource() ))
                             continue;
                         break;
@@ -584,5 +586,5 @@
                             continue;
 
-                        Unit* check = i_originalCaster->GetCharmerOrOwnerOrSelf();
+                        Unit* check = i_caster->GetCharmerOrOwnerOrSelf();
 
                         if( check->GetTypeId()==TYPEID_PLAYER )
@@ -608,17 +610,17 @@
                 {
                     case PUSH_IN_FRONT:
-                        if(i_spell.GetCaster()->isInFront((Unit*)(itr->getSource()), i_radius, M_PI/3 ))
+                        if(i_caster->isInFront((Unit*)(itr->getSource()), i_radius, M_PI/3 ))
                             i_data->push_back(itr->getSource());
                         break;
                     case PUSH_IN_BACK:
-                        if(i_spell.GetCaster()->isInBack((Unit*)(itr->getSource()), i_radius, M_PI/3 ))
+                        if(i_caster->isInBack((Unit*)(itr->getSource()), i_radius, M_PI/3 ))
                             i_data->push_back(itr->getSource());
                         break;
                     case PUSH_IN_LINE:
-                        if(i_spell.GetCaster()->isInLine((Unit*)(itr->getSource()), i_radius ))
+                        if(i_caster->isInLine((Unit*)(itr->getSource()), i_radius ))
                             i_data->push_back(itr->getSource());
                         break;
                     case PUSH_SELF_CENTER:
-                        if(i_spell.GetCaster()->IsWithinDistInMap((Unit*)(itr->getSource()), i_radius))
+                        if(i_caster->IsWithinDistInMap((Unit*)(itr->getSource()), i_radius))
                             i_data->push_back(itr->getSource());
                         break;
Index: trunk/src/game/Player.cpp
===================================================================
--- trunk/src/game/Player.cpp (revision 136)
+++ trunk/src/game/Player.cpp (revision 142)
@@ -16604,5 +16604,5 @@
 
     // prevent stealth flight
-    RemoveSpellsCausingAura(SPELL_AURA_MOD_STEALTH);
+    RemoveInterruptableAura(AURA_INTERRUPT_FLAG_STEALTH);
 
     WorldPacket data(SMSG_ACTIVATETAXIREPLY, 4);
Index: trunk/src/game/Spell.cpp
===================================================================
--- trunk/src/game/Spell.cpp (revision 141)
+++ trunk/src/game/Spell.cpp (revision 142)
@@ -95,5 +95,5 @@
 }
 
-void SpellCastTargets::setDestination(float x, float y, float z, bool send)
+void SpellCastTargets::setDestination(float x, float y, float z, bool send, uint32 mapId)
 {
     m_destX = x;
@@ -103,4 +103,6 @@
     if(send)
         m_targetMask |= TARGET_FLAG_DEST_LOCATION;
+    if(mapId)
+        m_mapId = mapId;
 }
 
@@ -1007,5 +1009,6 @@
             //if(!IsPositiveSpell(m_spellInfo->Id))
             {
-                unit->RemoveSpellsCausingAura(SPELL_AURA_MOD_STEALTH);
+                //do not remove feign death
+                unit->RemoveInterruptableAura(AURA_INTERRUPT_FLAG_STEALTH + AURA_INTERRUPT_FLAG_DAMAGE);
             }
         }
@@ -1013,4 +1016,5 @@
         {
             // for delayed spells ignore negative spells (after duel end) for friendly targets
+            // TODO: this cause soul transfer bugged
             if(m_spellInfo->speed > 0.0f && !IsPositiveSpell(m_spellInfo->Id))
             {
@@ -1250,11 +1254,22 @@
 void Spell::SearchAreaTarget(std::list<Unit*> &TagUnitMap, float radius, const uint32 &type, SpellTargets TargetType, uint32 entry)
 {
-    if(type == PUSH_DEST_CENTER && !m_targets.HasDest())
-    {
-        sLog.outError( "SPELL: cannot find destination for spell ID %u\n", m_spellInfo->Id );
-        return;
-    }
-
-    CellPair p(Trinity::ComputeCellPair(m_targets.m_destX, m_targets.m_destY));
+    float x, y;
+    if(type == PUSH_DEST_CENTER)
+    {
+        if(!m_targets.HasDest())
+        {
+            sLog.outError( "SPELL: cannot find destination for spell ID %u\n", m_spellInfo->Id );
+            return;
+        }
+        x = m_targets.m_destX;
+        y = m_targets.m_destY;
+    }
+    else
+    {
+        x = m_caster->GetPositionX();
+        y = m_caster->GetPositionY();
+    }
+
+    CellPair p(Trinity::ComputeCellPair(x, y));
     Cell cell(p);
     cell.data.Part.reserved = ALL_DISTRICT;
@@ -1436,9 +1451,18 @@
             if(SpellTargetPosition const* st = spellmgr.GetSpellTargetPosition(m_spellInfo->Id))
             {
-                if (st->target_mapId == m_caster->GetMapId())
+                //TODO: fix this check
+                if(m_spellInfo->Effect[0] == SPELL_EFFECT_TELEPORT_UNITS
+                    || m_spellInfo->Effect[1] == SPELL_EFFECT_TELEPORT_UNITS
+                    || m_spellInfo->Effect[2] == SPELL_EFFECT_TELEPORT_UNITS)
+                    m_targets.setDestination(st->target_X, st->target_Y, st->target_Z, true, st->target_mapId);
+                else if(st->target_mapId == m_caster->GetMapId())
                     m_targets.setDestination(st->target_X, st->target_Y, st->target_Z);
             }
             else
                 sLog.outError( "SPELL: unknown target coordinates for spell ID %u\n", m_spellInfo->Id );
+            break;
+        case TARGET_INNKEEPER_COORDINATES:
+            if(m_caster->GetTypeId() == TYPEID_PLAYER)
+                m_targets.setDestination(((Player*)m_caster)->m_homebindX,((Player*)m_caster)->m_homebindY,((Player*)m_caster)->m_homebindZ, true, ((Player*)m_caster)->m_homebindMapId);
             break;
 
@@ -1481,5 +1505,4 @@
         case TARGET_IN_FRONT_OF_CASTER:
         case TARGET_UNIT_CONE_ENEMY_UNKNOWN:
-        {
             switch(spellmgr.GetSpellExtraAttr(m_spellInfo->Id, SPELL_EXTRA_ATTR_CONE_TYPE))
             {
@@ -1494,10 +1517,8 @@
                     SearchAreaTarget(TagUnitMap, radius, PUSH_IN_LINE, SPELL_TARGETS_AOE_DAMAGE);
                     break;
-            }
-        }break;
+            }break;
         case TARGET_UNIT_CONE_ALLY:
-        {
             SearchAreaTarget(TagUnitMap, radius, PUSH_IN_FRONT, SPELL_TARGETS_FRIENDLY);
-        }break;
+            break;
 
         // nearby target
@@ -2000,5 +2021,5 @@
         case TARGET_DEST_DEST_RANDOM:
         {
-            if(!(m_targets.m_targetMask & TARGET_FLAG_DEST_LOCATION))
+            if(!m_targets.HasDest())
             {
                 sLog.outError("SPELL: no destination for spell ID %u\n", m_spellInfo->Id);
@@ -2014,5 +2035,9 @@
         }break;
         case TARGET_SELF2:
-            m_targets.m_hasDest = true;
+            if(!m_targets.HasDest())
+            {
+                sLog.outError("SPELL: no destination for spell ID %u\n", m_spellInfo->Id);
+                break;
+            }
             break;
         default:
@@ -2124,6 +2149,5 @@
     if ( !m_IsTriggeredSpell && isSpellBreakStealth(m_spellInfo) )
     {
-        m_caster->RemoveSpellsCausingAura(SPELL_AURA_MOD_STEALTH);
-        m_caster->RemoveSpellsCausingAura(SPELL_AURA_FEIGN_DEATH);
+        m_caster->RemoveInterruptableAura(AURA_INTERRUPT_FLAG_STEALTH);
     }
 
