Index: /trunk/src/shared/Database/DBCfmt.cpp
===================================================================
--- /trunk/src/shared/Database/DBCfmt.cpp (revision 102)
+++ /trunk/src/shared/Database/DBCfmt.cpp (revision 230)
@@ -56,5 +56,5 @@
 const char LockEntryfmt[]="niiiiixxxiiiiixxxiixxxxxxxxxxxxxx";
 const char MailTemplateEntryfmt[]="nxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
-const char MapEntryfmt[]="nxixssssssssssssssssxxxxxxxixxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxixxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxixxiixxi";
+const char MapEntryfmt[]="nxixssssssssssssssssxxxxxxxixxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxixxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxiffiixxi";
 const char QuestSortEntryfmt[]="nxxxxxxxxxxxxxxxxx";
 const char RandomPropertiesPointsfmt[]="niiiiiiiiiiiiiii";
Index: /trunk/src/shared/Database/SqlOperations.cpp
===================================================================
--- /trunk/src/shared/Database/SqlOperations.cpp (revision 102)
+++ /trunk/src/shared/Database/SqlOperations.cpp (revision 230)
@@ -103,5 +103,6 @@
     if(m_queries[index].first != NULL)
     {
-        sLog.outError("Attempt assign query to holder index (%u) where other query stored (Old: [%s] New: [%s])",index,m_queries.size(),m_queries[index].first,sql);
+        sLog.outError("Attempt assign query to holder index (%u) where other query stored (Old: [%s] New: [%s])",
+            index,m_queries[index].first,sql);
         return false;
     }
Index: /trunk/src/shared/Database/DBCStructure.h
===================================================================
--- /trunk/src/shared/Database/DBCStructure.h (revision 102)
+++ /trunk/src/shared/Database/DBCStructure.h (revision 230)
@@ -465,7 +465,7 @@
     //chat*     unknownText2                                // 100-115 unknown empty text fields
                                                             // 116 text flags
-    int32       parent_map;                                 // 117 map_id of parent map
-    //float start_x                                         // 118 enter x coordinate (if exist single entry)
-    //float start_y                                         // 119 enter y coordinate (if exist single entry)
+    int32       entrance_map;                               // 117 map_id of entrance map
+    float       entrance_x;                                 // 118 entrance x coordinate (if exist single entry)
+    float       entrance_y;                                 // 119 entrance y coordinate (if exist single entry)
     uint32 resetTimeRaid;                                   // 120
     uint32 resetTimeHeroic;                                 // 121
Index: /trunk/src/game/Level3.cpp
===================================================================
--- /trunk/src/game/Level3.cpp (revision 229)
+++ /trunk/src/game/Level3.cpp (revision 230)
@@ -3581,11 +3581,4 @@
     }
 
-    if(graveyard->map_id != areaEntry->mapid && g_team != 0)
-    {
-        SendSysMessage(LANG_COMMAND_GRAVEYARDWRONGTEAM);
-        SetSentErrorMessage(true);
-        return false;
-    }
-
     if(objmgr.AddGraveYardLink(g_id,player->GetZoneId(),g_team))
         PSendSysMessage(LANG_COMMAND_GRAVEYARDLINKED, g_id,zoneId);
Index: /trunk/src/game/GameObject.h
===================================================================
--- /trunk/src/game/GameObject.h (revision 145)
+++ /trunk/src/game/GameObject.h (revision 230)
@@ -446,4 +446,7 @@
         void Whisper(int32 textId, uint64 receiver) { MonsterWhisper(textId,receiver); }
 
+        // overwrite WorldObject function for proper name localization
+        const char* GetNameForLocaleIdx(int32 locale_idx) const;
+
         void SaveToDB();
         void SaveToDB(uint32 mapid, uint8 spawnMask);
Index: /trunk/src/game/Object.h
===================================================================
--- /trunk/src/game/Object.h (revision 221)
+++ /trunk/src/game/Object.h (revision 230)
@@ -400,4 +400,6 @@
         void SetName(std::string newname) { m_name=newname; }
 
+        virtual const char* GetNameForLocaleIdx(int32 /*locale_idx*/) const { return GetName(); }
+
         float GetDistance( const WorldObject* obj ) const;
         float GetDistance(const float x, const float y, const float z) const;
Index: /trunk/src/game/Corpse.cpp
===================================================================
--- /trunk/src/game/Corpse.cpp (revision 102)
+++ /trunk/src/game/Corpse.cpp (revision 230)
@@ -82,5 +82,6 @@
     if(!IsPositionValid())
     {
-        sLog.outError("ERROR: Corpse (guidlow %d, owner %s) not created. Suggested coordinates isn't valid (X: %d Y: ^%d)",guidlow,owner->GetName(),x,y);
+        sLog.outError("ERROR: Corpse (guidlow %d, owner %s) not created. Suggested coordinates isn't valid (X: %f Y: %f)",
+            guidlow,owner->GetName(),x,y);
         return false;
     }
@@ -199,5 +200,6 @@
     if(!IsPositionValid())
     {
-        sLog.outError("ERROR: Corpse (guidlow %d, owner %d) not created. Suggested coordinates isn't valid (X: %d Y: ^%d)",GetGUIDLow(),GUID_LOPART(GetOwnerGUID()),GetPositionX(),GetPositionY());
+        sLog.outError("ERROR: Corpse (guidlow %d, owner %d) not created. Suggested coordinates isn't valid (X: %f Y: %f)",
+            GetGUIDLow(),GUID_LOPART(GetOwnerGUID()),GetPositionX(),GetPositionY());
         return false;
     }
Index: /trunk/src/game/MotionMaster.cpp
===================================================================
--- /trunk/src/game/MotionMaster.cpp (revision 102)
+++ /trunk/src/game/MotionMaster.cpp (revision 230)
@@ -189,4 +189,5 @@
     {
         DEBUG_LOG("Player (GUID: %u) chase to %s (GUID: %u)",
+            i_owner->GetGUIDLow(),
             target->GetTypeId()==TYPEID_PLAYER ? "player" : "creature",
             target->GetTypeId()==TYPEID_PLAYER ? i_owner->GetGUIDLow() : ((Creature*)i_owner)->GetDBTableGUIDLow() );
Index: /trunk/src/game/BattleGround.cpp
===================================================================
--- /trunk/src/game/BattleGround.cpp (revision 102)
+++ /trunk/src/game/BattleGround.cpp (revision 230)
@@ -1285,5 +1285,5 @@
     if(!cr)
     {
-        sLog.outError("Can't find creature guid: %u",m_BgCreatures[type]);
+        sLog.outError("Can't find creature guid: %u",GUID_LOPART(m_BgCreatures[type]));
         return false;
     }
@@ -1299,5 +1299,5 @@
     if(!obj)
     {
-        sLog.outError("Can't find gobject guid: %u",m_BgObjects[type]);
+        sLog.outError("Can't find gobject guid: %u",GUID_LOPART(m_BgObjects[type]));
         return false;
     }
Index: /trunk/src/game/World.cpp
===================================================================
--- /trunk/src/game/World.cpp (revision 229)
+++ /trunk/src/game/World.cpp (revision 230)
@@ -203,11 +203,14 @@
     }
 
-    WorldSession* old = m_sessions[s->GetAccountId ()];
-    m_sessions[s->GetAccountId ()] = s;
-
     // if session already exist, prepare to it deleting at next world update
     // NOTE - KickPlayer() should be called on "old" in RemoveSession()
-    if (old)
-        m_kicked_sessions.insert (old);
+    {
+      SessionMap::const_iterator old = m_sessions.find(s->GetAccountId ());
+
+      if(old != m_sessions.end())
+        m_kicked_sessions.insert (old->second);
+    }
+
+    m_sessions[s->GetAccountId ()] = s;
 
     uint32 Sessions = GetActiveAndQueuedSessionCount ();
@@ -292,7 +295,5 @@
         if(*iter==sess)
         {
-            Queue::iterator iter2 = iter;
-            ++iter;
-            m_QueuedPlayer.erase(iter2);
+            iter = m_QueuedPlayer.erase(iter);
             decrease_session = false;                       // removing queued session
             break;
Index: /trunk/src/game/CharacterHandler.cpp
===================================================================
--- /trunk/src/game/CharacterHandler.cpp (revision 173)
+++ /trunk/src/game/CharacterHandler.cpp (revision 230)
@@ -754,5 +754,6 @@
 
     std::string IP_str = GetRemoteAddress();
-    sLog.outChar("Account: %d (IP: %s) Login Character:[%s] (guid:%u)",GetAccountId(),IP_str.c_str(),pCurrChar->GetName() ,pCurrChar->GetGUID());
+    sLog.outChar("Account: %d (IP: %s) Login Character:[%s] (guid:%u)",
+        GetAccountId(),IP_str.c_str(),pCurrChar->GetName() ,pCurrChar->GetGUIDLow());
 
     m_playerLoading = false;
Index: /trunk/src/game/SharedDefines.h
===================================================================
--- /trunk/src/game/SharedDefines.h (revision 229)
+++ /trunk/src/game/SharedDefines.h (revision 230)
@@ -1904,4 +1904,6 @@
 #define SPELL_ID_PASSIVE_BATTLE_STANCE           2457
 #define SPELL_ID_PASSIVE_RESURRECTION_SICKNESS   15007
+#define SPELL_ID_WEAPON_SWITCH_COOLDOWN_1_5s     6119
+#define SPELL_ID_WEAPON_SWITCH_COOLDOWN_1_0s     6123
 
 enum WeatherType
Index: /trunk/src/game/BattleGroundMgr.cpp
===================================================================
--- /trunk/src/game/BattleGroundMgr.cpp (revision 229)
+++ /trunk/src/game/BattleGroundMgr.cpp (revision 230)
@@ -867,5 +867,5 @@
 /*********************************************************/
 
-bool BGQueueInviteEvent::Execute(uint64 /*e_time*/, uint32 p_time)
+bool BGQueueInviteEvent::Execute(uint64 /*e_time*/, uint32 /*p_time*/)
 {
     Player* plr = objmgr.GetPlayer( m_PlayerGuid );
Index: /trunk/src/game/Creature.cpp
===================================================================
--- /trunk/src/game/Creature.cpp (revision 229)
+++ /trunk/src/game/Creature.cpp (revision 230)
@@ -2183,2 +2183,18 @@
     return objmgr.GetNpcTrainerSpells(GetEntry());
 }
+
+// overwrite WorldObject function for proper name localization
+const char* Creature::GetNameForLocaleIdx(int32 loc_idx) const
+{
+    if (loc_idx >= 0)
+    {
+        CreatureLocale const *cl = objmgr.GetCreatureLocale(GetEntry());
+        if (cl)
+        {
+            if (cl->Name.size() > loc_idx && !cl->Name[loc_idx].empty())
+                return cl->Name[loc_idx].c_str();
+        }
+    }
+
+    return GetName();
+}
Index: /trunk/src/game/Language.h
===================================================================
--- /trunk/src/game/Language.h (revision 177)
+++ /trunk/src/game/Language.h (revision 230)
@@ -389,5 +389,5 @@
     LANG_COMMAND_GRAVEYARDLINKED        = 451,
     LANG_COMMAND_GRAVEYARDWRONGZONE     = 452,
-    LANG_COMMAND_GRAVEYARDWRONGTEAM     = 453,
+    //                                  = 453,
     LANG_COMMAND_GRAVEYARDERROR         = 454,
     LANG_COMMAND_GRAVEYARD_NOTEAM       = 455,
Index: /trunk/src/game/Object.cpp
===================================================================
--- /trunk/src/game/Object.cpp (revision 203)
+++ /trunk/src/game/Object.cpp (revision 230)
@@ -1281,5 +1281,5 @@
 
                     // TODO: i_object.GetName() also must be localized?
-                    i_object.BuildMonsterChat(data,i_msgtype,text,i_language,i_object.GetName(),i_targetGUID);
+                    i_object.BuildMonsterChat(data,i_msgtype,text,i_language,i_object.GetNameForLocaleIdx(loc_idx),i_targetGUID);
 
                     i_data_cache[cache_idx] = data;
Index: /trunk/src/game/Creature.h
===================================================================
--- /trunk/src/game/Creature.h (revision 186)
+++ /trunk/src/game/Creature.h (revision 230)
@@ -523,4 +523,7 @@
         void Whisper(int32 textId, uint64 receiver, bool IsBossWhisper = false) { MonsterWhisper(textId,receiver,IsBossWhisper); }
 
+        // overwrite WorldObject function for proper name localization
+        const char* GetNameForLocaleIdx(int32 locale_idx) const;
+    
         void setDeathState(DeathState s);                   // overwrite virtual Unit::setDeathState
 
Index: /trunk/src/game/BattleGroundRL.cpp
===================================================================
--- /trunk/src/game/BattleGroundRL.cpp (revision 102)
+++ /trunk/src/game/BattleGroundRL.cpp (revision 230)
@@ -119,5 +119,5 @@
 }
 
-void BattleGroundRL::RemovePlayer(Player *plr, uint64 guid)
+void BattleGroundRL::RemovePlayer(Player* /*plr*/, uint64 /*guid*/)
 {
     if(GetStatus() == STATUS_WAIT_LEAVE)
Index: /trunk/src/game/Player.h
===================================================================
--- /trunk/src/game/Player.h (revision 229)
+++ /trunk/src/game/Player.h (revision 230)
@@ -681,10 +681,4 @@
 typedef std::vector<ItemPosCount> ItemPosCountVec;
 
-enum SwitchWeapon
-{
-    DEFAULT_SWITCH_WEAPON       = 1500,                     //cooldown in ms
-    ROGUE_SWITCH_WEAPON         = 1000
-};
-
 enum TradeSlots
 {
Index: /trunk/src/game/BattleGroundEY.cpp
===================================================================
--- /trunk/src/game/BattleGroundEY.cpp (revision 102)
+++ /trunk/src/game/BattleGroundEY.cpp (revision 230)
@@ -575,5 +575,5 @@
         obj->Delete();
     else
-        sLog.outError("BattleGroundEY: Unknown dropped flag guid: %u",GetDroppedFlagGUID());
+        sLog.outError("BattleGroundEY: Unknown dropped flag guid: %u",GUID_LOPART(GetDroppedFlagGUID()));
 
     SetDroppedFlagGUID(0);
@@ -770,5 +770,6 @@
     sg = sWorldSafeLocsStore.LookupEntry(m_CapturingPointTypes[Point].GraveYardId);
     if(!sg || !AddSpiritGuide(Point, sg->x, sg->y, sg->z, 3.124139f, Team))
-        sLog.outError("BatteGroundEY: Failed to spawn spirit guide! point: %u, team: u, graveyard_id: %u", Point, Team, m_CapturingPointTypes[Point].GraveYardId);
+        sLog.outError("BatteGroundEY: Failed to spawn spirit guide! point: %u, team: %u, graveyard_id: %u",
+            Point, Team, m_CapturingPointTypes[Point].GraveYardId);
 
     UpdatePointsIcons(Team, Point);
Index: /trunk/src/game/MiscHandler.cpp
===================================================================
--- /trunk/src/game/MiscHandler.cpp (revision 229)
+++ /trunk/src/game/MiscHandler.cpp (revision 230)
@@ -137,5 +137,5 @@
         wstrToLower(str[i]);
 
-        sLog.outDebug("String %u: %s", i, str[i].c_str());
+        sLog.outDebug("String %u: %s", i, temp.c_str());
     }
 
Index: /trunk/src/game/GameObject.cpp
===================================================================
--- /trunk/src/game/GameObject.cpp (revision 229)
+++ /trunk/src/game/GameObject.cpp (revision 230)
@@ -1286,2 +1286,18 @@
     //trigger->RemoveCorpse();
 }
+
+// overwrite WorldObject function for proper name localization
+const char* GameObject::GetNameForLocaleIdx(int32 loc_idx) const
+{
+    if (loc_idx >= 0)
+    {
+        GameObjectLocale const *cl = objmgr.GetGameObjectLocale(GetEntry());
+        if (cl)
+        {
+            if (cl->Name.size() > loc_idx && !cl->Name[loc_idx].empty())
+                return cl->Name[loc_idx].c_str();
+        }
+    }
+
+    return GetName();
+}
Index: /trunk/src/game/BattleGroundBE.cpp
===================================================================
--- /trunk/src/game/BattleGroundBE.cpp (revision 102)
+++ /trunk/src/game/BattleGroundBE.cpp (revision 230)
@@ -121,5 +121,5 @@
 }
 
-void BattleGroundBE::RemovePlayer(Player *plr, uint64 guid)
+void BattleGroundBE::RemovePlayer(Player* /*plr*/, uint64 /*guid*/)
 {
     if(GetStatus() == STATUS_WAIT_LEAVE)
Index: /trunk/src/game/Level2.cpp
===================================================================
--- /trunk/src/game/Level2.cpp (revision 207)
+++ /trunk/src/game/Level2.cpp (revision 230)
@@ -2823,10 +2823,5 @@
     uint32 Maxpoint;
 
-    sLog.outDebug("DEBUG: HandleWpShowCommand: lowguid: %u", lowguid);
-
-    sLog.outDebug("DEBUG: HandleWpShowCommand: Habe creature: %ld", target );
-
-    sLog.outDebug("DEBUG: HandleWpShowCommand: wpshow - show: %s", show_str);
-    //PSendSysMessage("wpshow - show: %s", show);
+    sLog.outDebug("DEBUG: HandleWpShowCommand: lowguid: %u show: %s", lowguid, show_str);
 
     // Show info for the selected waypoint
@@ -2849,5 +2844,5 @@
         QueryResult *result =
             WorldDatabase.PQuery( "SELECT id, point, waittime, emote, spell, text1, text2, text3, text4, text5, model1, model2 FROM creature_movement WHERE wpguid = %u",
-            target->GetGUID() );
+            target->GetGUIDLow() );
         if(!result)
         {
Index: /trunk/src/game/ItemPrototype.h
===================================================================
--- /trunk/src/game/ItemPrototype.h (revision 229)
+++ /trunk/src/game/ItemPrototype.h (revision 230)
@@ -539,4 +539,5 @@
             case INVTYPE_RELIC:
             case INVTYPE_SHIELD:
+            case INVTYPE_HOLDABLE:
                 return true;
         }
Index: /trunk/src/game/Player.cpp
===================================================================
--- /trunk/src/game/Player.cpp (revision 229)
+++ /trunk/src/game/Player.cpp (revision 230)
@@ -10257,7 +10257,24 @@
                 if(pProto && isInCombat()&& pProto->Class == ITEM_CLASS_WEAPON && m_weaponChangeTimer == 0)
                 {
-                    m_weaponChangeTimer = DEFAULT_SWITCH_WEAPON;
+                    uint32 cooldownSpell = SPELL_ID_WEAPON_SWITCH_COOLDOWN_1_5s;
+
                     if (getClass() == CLASS_ROGUE)
-                        m_weaponChangeTimer = ROGUE_SWITCH_WEAPON;
+                        cooldownSpell = SPELL_ID_WEAPON_SWITCH_COOLDOWN_1_0s;
+
+                    SpellEntry const* spellProto = sSpellStore.LookupEntry(cooldownSpell);
+
+                    if (!spellProto)
+                        sLog.outError("Weapon switch cooldown spell %u couldn't be found in Spell.dbc", cooldownSpell);
+                    else
+                    {
+                        m_weaponChangeTimer = spellProto->StartRecoveryTime;
+
+                        WorldPacket data(SMSG_SPELL_COOLDOWN, 8+1+4);
+                        data << uint64(GetGUID());
+                        data << uint8(1);
+                        data << uint32(cooldownSpell);
+                        data << uint32(0);
+                        GetSession()->SendPacket(&data);
+                    }
                 }
             }
Index: /trunk/src/game/NPCHandler.cpp
===================================================================
--- /trunk/src/game/NPCHandler.cpp (revision 221)
+++ /trunk/src/game/NPCHandler.cpp (revision 230)
@@ -140,5 +140,5 @@
     if (!ci)
     {
-        sLog.outDebug( "WORLD: SendTrainerList - (%u) NO CREATUREINFO! (GUID: %u)", uint32(GUID_LOPART(guid)), guid );
+        sLog.outDebug( "WORLD: SendTrainerList - (GUID: %u) NO CREATUREINFO!",GUID_LOPART(guid) );
         return;
     }
@@ -147,5 +147,6 @@
     if(!trainer_spells)
     {
-        sLog.outDebug( "WORLD: SendTrainerList - Training spells not found for creature (GUID: %u Entry: %u)", guid, unit->GetEntry());
+        sLog.outDebug( "WORLD: SendTrainerList - Training spells not found for creature (GUID: %u Entry: %u)",
+            GUID_LOPART(guid), unit->GetEntry());
         return;
     }
Index: /trunk/src/game/LootMgr.cpp
===================================================================
--- /trunk/src/game/LootMgr.cpp (revision 229)
+++ /trunk/src/game/LootMgr.cpp (revision 230)
@@ -272,5 +272,6 @@
         if( chance != 0 && chance < 0.000001f )             // loot with low chance
         {
-            sLog.outErrorDb("Table '%s' entry %d item %d: low chance (%d) - skipped", store.GetName(), entry, itemid, chance);
+            sLog.outErrorDb("Table '%s' entry %d item %d: low chance (%f) - skipped",
+                store.GetName(), entry, itemid, chance);
             return false;
         }
Index: /trunk/src/game/BattleGroundWS.cpp
===================================================================
--- /trunk/src/game/BattleGroundWS.cpp (revision 102)
+++ /trunk/src/game/BattleGroundWS.cpp (revision 230)
@@ -230,5 +230,5 @@
         obj->Delete();
     else
-        sLog.outError("unknown droped flag bg, guid: %u",GetDroppedFlagGUID(team));
+        sLog.outError("unknown droped flag bg, guid: %u",GUID_LOPART(GetDroppedFlagGUID(team)));
 
     SetDroppedFlagGUID(0,team);
Index: /trunk/src/game/ObjectMgr.cpp
===================================================================
--- /trunk/src/game/ObjectMgr.cpp (revision 229)
+++ /trunk/src/game/ObjectMgr.cpp (revision 230)
@@ -4828,10 +4828,4 @@
         }
 
-        if(entry->map_id != areaEntry->mapid && team != 0)
-        {
-            sLog.outErrorDb("Table `game_graveyard_zone` has record for ghost zone (%u) at map %u and graveyard (%u) at map %u for team %u, but in case maps are different, player faction setting is ignored. Use faction 0 instead.",zoneId,areaEntry->mapid, safeLocId, entry->map_id, team);
-            team = 0;
-        }
-
         if(!AddGraveYardLink(safeLocId,zoneId,team,false))
             sLog.outErrorDb("Table `game_graveyard_zone` has a duplicate record for Graveyard (ID: %u) and Zone (ID: %u), skipped.",safeLocId,zoneId);
@@ -4855,5 +4849,5 @@
     //     then check faction
     //   if mapId != graveyard.mapId (ghost in instance) and search any graveyard associated
-    //     then skip check faction
+    //     then check faction
     GraveYardMap::const_iterator graveLow  = mGraveYardMap.lower_bound(zoneId);
     GraveYardMap::const_iterator graveUp   = mGraveYardMap.upper_bound(zoneId);
@@ -4864,8 +4858,18 @@
     }
 
+    // at corpse map
     bool foundNear = false;
     float distNear;
     WorldSafeLocsEntry const* entryNear = NULL;
+
+    // at entrance map for corpse map
+    bool foundEntr = false;
+    float distEntr;
+    WorldSafeLocsEntry const* entryEntr = NULL;
+
+    // some where other
     WorldSafeLocsEntry const* entryFar = NULL;
+
+    MapEntry const* mapEntry = sMapStore.LookupEntry(MapId);
 
     for(GraveYardMap::const_iterator itr = graveLow; itr != graveUp; ++itr)
@@ -4880,37 +4884,66 @@
         }
 
-        // remember first graveyard at another map and ignore other
-        if(MapId != entry->map_id)
-        {
-            if(!entryFar)
-                entryFar = entry;
-            continue;
-        }
-
-        // skip enemy faction graveyard at same map (normal area, city, or battleground)
+        // skip enemy faction graveyard
         // team == 0 case can be at call from .neargrave
         if(data.team != 0 && team != 0 && data.team != team)
             continue;
 
+        // find now nearest graveyard at other map
+        if(MapId != entry->map_id)
+        {
+            // if find graveyard at different map from where entrance placed (or no entrance data), use any first
+            if (!mapEntry || mapEntry->entrance_map < 0 || mapEntry->entrance_map != entry->map_id ||
+                mapEntry->entrance_x == 0 && mapEntry->entrance_y == 0)
+            {
+                // not have any corrdinates for check distance anyway
+                entryFar = entry;
+                continue;
+            }
+
+            // at entrance map calculate distance (2D);
+            float dist2 = (entry->x - mapEntry->entrance_x)*(entry->x - mapEntry->entrance_x)
+                +(entry->y - mapEntry->entrance_y)*(entry->y - mapEntry->entrance_y);
+            if(foundEntr)
+            {
+                if(dist2 < distEntr)
+                {
+                    distEntr = dist2;
+                    entryEntr = entry;
+                }
+            }
+            else
+            {
+                foundEntr = true;
+                distEntr = dist2;
+                entryEntr = entry;
+            }
+        }
         // find now nearest graveyard at same map
-        float dist2 = (entry->x - x)*(entry->x - x)+(entry->y - y)*(entry->y - y)+(entry->z - z)*(entry->z - z);
-        if(foundNear)
-        {
-            if(dist2 < distNear)
-            {
+        else
+        {
+            float dist2 = (entry->x - x)*(entry->x - x)+(entry->y - y)*(entry->y - y)+(entry->z - z)*(entry->z - z);
+            if(foundNear)
+            {
+                if(dist2 < distNear)
+                {
+                    distNear = dist2;
+                    entryNear = entry;
+                }
+            }
+            else
+            {
+                foundNear = true;
                 distNear = dist2;
                 entryNear = entry;
             }
         }
-        else
-        {
-            foundNear = true;
-            distNear = dist2;
-            entryNear = entry;
-        }
-    }
-
+    }
+
+            // find now nearest graveyard at same map
     if(entryNear)
         return entryNear;
+
+    if(entryEntr)
+        return entryEntr;
 
     return entryFar;
@@ -5132,5 +5165,5 @@
     for (AreaTriggerMap::const_iterator itr = mAreaTriggers.begin(); itr != mAreaTriggers.end(); itr++)
     {
-        if(itr->second.target_mapId == mapEntry->parent_map)
+        if(itr->second.target_mapId == mapEntry->entrance_map)
         {
             AreaTriggerEntry const* atEntry = sAreaTriggerStore.LookupEntry(itr->first);
Index: /trunk/sql/updates/238_world.sql
===================================================================
--- /trunk/sql/updates/238_world.sql (revision 230)
+++ /trunk/sql/updates/238_world.sql (revision 230)
@@ -0,0 +1,1 @@
+DELETE FROM trinity_string WHERE entry IN (453);
