<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array"/>
  <modified type="array">
    <modified>
      <diff>@@ -1084,7 +1084,7 @@ void BattleGround::RemovePlayerAtLeave(uint64 guid, bool Transport, bool SendPac
         {
             // a player has left the battleground, so there are free slots -&gt; add to queue
             AddToBGFreeSlotQueue();
-            sBattleGroundMgr.m_BattleGroundQueues[bgQueueTypeId].Update(bgTypeId, GetQueueId());
+            sBattleGroundMgr.ScheduleQueueUpdate(0, 0, bgQueueTypeId, bgTypeId, GetQueueId());
         }
 
         // Let others know</diff>
      <filename>src/game/BattleGround.cpp</filename>
    </modified>
    <modified>
      <diff>@@ -148,8 +148,9 @@ void WorldSession::HandleBattlemasterJoinOpcode( WorldPacket &amp; recv_data )
     // if we're here, then the conditions to join a bg are met. We can proceed in joining.
 
     // _player-&gt;GetGroup() was already checked, grp is already initialized
-    GroupQueueInfo * ginfo = sBattleGroundMgr.m_BattleGroundQueues[bgQueueTypeId].AddGroup(_player, bgTypeId, 0, false, isPremade, 0);
-    uint32 avgTime = sBattleGroundMgr.m_BattleGroundQueues[bgQueueTypeId].GetAverageQueueWaitTime(ginfo, _player-&gt;GetBattleGroundQueueIdFromLevel());
+    BattleGroundQueue&amp; bgQueue = sBattleGroundMgr.m_BattleGroundQueues[bgQueueTypeId];
+    GroupQueueInfo * ginfo = bgQueue.AddGroup(_player, bgTypeId, 0, false, isPremade, 0);
+    uint32 avgTime = bgQueue.GetAverageQueueWaitTime(ginfo, _player-&gt;GetBattleGroundQueueIdFromLevel());
     if (joinAsGroup /* &amp;&amp; _player-&gt;GetGroup()*/)
     {
         sLog.outDebug(&quot;Battleground: the following players are joining as group:&quot;);
@@ -166,7 +167,7 @@ void WorldSession::HandleBattlemasterJoinOpcode( WorldPacket &amp; recv_data )
             member-&gt;GetSession()-&gt;SendPacket(&amp;data);
             sBattleGroundMgr.BuildGroupJoinedBattlegroundPacket(&amp;data, bgTypeId);
             member-&gt;GetSession()-&gt;SendPacket(&amp;data);
-            sBattleGroundMgr.m_BattleGroundQueues[bgQueueTypeId].AddPlayer(member, ginfo);
+            bgQueue.AddPlayer(member, ginfo);
             sLog.outDebug(&quot;Battleground: player joined queue for bg queue type %u bg type %u: GUID %u, NAME %s&quot;,bgQueueTypeId,bgTypeId,member-&gt;GetGUIDLow(), member-&gt;GetName());
         }
         sLog.outDebug(&quot;Battleground: group end&quot;);
@@ -181,12 +182,11 @@ void WorldSession::HandleBattlemasterJoinOpcode( WorldPacket &amp; recv_data )
         sBattleGroundMgr.BuildBattleGroundStatusPacket(&amp;data, bg, queueSlot, STATUS_WAIT_QUEUE, avgTime, 0, ginfo-&gt;ArenaType);
         SendPacket(&amp;data);
 
-        sBattleGroundMgr.m_BattleGroundQueues[bgQueueTypeId].AddPlayer(_player, ginfo);
+        bgQueue.AddPlayer(_player, ginfo);
         sLog.outDebug(&quot;Battleground: player joined queue for bg queue type %u bg type %u: GUID %u, NAME %s&quot;,bgQueueTypeId,bgTypeId,_player-&gt;GetGUIDLow(), _player-&gt;GetName());
     }
-    sBattleGroundMgr.m_BattleGroundQueues[bgQueueTypeId].Update(bgTypeId, _player-&gt;GetBattleGroundQueueIdFromLevel());
-    if (!ginfo-&gt;IsInvitedToBGInstanceGUID)
-        sBattleGroundMgr.m_BattleGroundQueues[bgQueueTypeId].AnnounceWorld(ginfo, _player-&gt;GetGUID(), true);
+    sBattleGroundMgr.ScheduleQueueUpdate(0, 0, bgQueueTypeId, bgTypeId, _player-&gt;GetBattleGroundQueueIdFromLevel());
+    //we should announce queue status here, if we want
 }
 
 void WorldSession::HandleBattleGroundPlayerPositionsOpcode( WorldPacket &amp; /*recv_data*/ )
@@ -303,7 +303,6 @@ void WorldSession::HandleBattleFieldPortOpcode( WorldPacket &amp;recv_data )
 
     uint8 type;                                             // arenatype if arena
     uint8 unk2;                                             // unk, can be 0x0 (may be if was invited?) and 0x1
-    uint32 instanceId;
     uint32 bgTypeId_;                                       // type id from dbc
     uint16 unk;                                             // 0x1F90 constant?
     uint8 action;                                           // enter battle 0x1, leave queue 0x0
@@ -312,182 +311,130 @@ void WorldSession::HandleBattleFieldPortOpcode( WorldPacket &amp;recv_data )
 
     if (!sBattlemasterListStore.LookupEntry(bgTypeId_))
     {
-        sLog.outError(&quot;Battleground: invalid bgtype (%u) received.&quot;, bgTypeId_);
-        // update battleground slots for the player to fix his UI and sent data.
-        // this is a HACK, I don't know why the client starts sending invalid packets in the first place.
-        // it usually happens with extremely high latency (if debugging / stepping in the code for example)
-        if (_player-&gt;InBattleGroundQueue())
-        {
-            // update all queues, send invitation info if player is invited, queue info if queued
-            for (uint32 i = 0; i &lt; PLAYER_MAX_BATTLEGROUND_QUEUES; ++i)
-            {
-                BattleGroundQueueTypeId bgQueueTypeId = _player-&gt;GetBattleGroundQueueTypeId(i);
-                if (!bgQueueTypeId)
-                    continue;
-                BattleGroundTypeId bgTypeId = BattleGroundMgr::BGTemplateId(bgQueueTypeId);
-                BattleGroundQueue::QueuedPlayersMap&amp; qpMap = sBattleGroundMgr.m_BattleGroundQueues[bgQueueTypeId].m_QueuedPlayers;
-                BattleGroundQueue::QueuedPlayersMap::iterator itrPlayerStatus = qpMap.find(_player-&gt;GetGUID());
-                // if the player is not in queue, continue or no group information - this should never happen
-                if (itrPlayerStatus == qpMap.end() || !itrPlayerStatus-&gt;second.GroupInfo)
-                    continue;
-
-                BattleGround * bg = NULL;
-                // get possibly needed data from groupinfo
-                uint8 arenatype = itrPlayerStatus-&gt;second.GroupInfo-&gt;ArenaType;
-                uint8 status = 0;
-
-                if (!itrPlayerStatus-&gt;second.GroupInfo-&gt;IsInvitedToBGInstanceGUID)
-                {
-                    // not invited to bg, get template
-                    bg = sBattleGroundMgr.GetBattleGroundTemplate(bgTypeId);
-                    status = STATUS_WAIT_QUEUE;
-                }
-                else
-                {
-                    // get the bg we're invited to
-                    bg = sBattleGroundMgr.GetBattleGround(itrPlayerStatus-&gt;second.GroupInfo-&gt;IsInvitedToBGInstanceGUID, bgTypeId);
-                    status = STATUS_WAIT_JOIN;
-                }
-
-                // if bg not found, then continue, don't invite if already in the instance
-                if (!bg || (_player-&gt;InBattleGround() &amp;&amp; _player-&gt;GetBattleGround() &amp;&amp; _player-&gt;GetBattleGround()-&gt;GetInstanceID() == bg-&gt;GetInstanceID()))
-                    continue;
-
-                // re - invite player with proper data
-                WorldPacket data;
-                sBattleGroundMgr.BuildBattleGroundStatusPacket(&amp;data, bg, i, status, INVITE_ACCEPT_WAIT_TIME, 0, arenatype);
-                SendPacket(&amp;data);
-            }
-        }
+        sLog.outError(&quot;BattlegroundHandler: invalid bgtype (%u) received.&quot;, bgTypeId_);
+        return;
+    }
+    if (!_player-&gt;InBattleGroundQueue())
+    {
+        sLog.outError(&quot;BattlegroundHandler: Invalid CMSG_BATTLEFIELD_PORT received from player (%u), he is not in bg_queue.&quot;, _player-&gt;GetGUIDLow());
         return;
     }
 
     //get GroupQueueInfo from BattleGroundQueue
     BattleGroundTypeId bgTypeId = BattleGroundTypeId(bgTypeId_);
     BattleGroundQueueTypeId bgQueueTypeId = BattleGroundMgr::BGQueueTypeId(bgTypeId, type);
-    BattleGroundQueue::QueuedPlayersMap&amp; qpMap = sBattleGroundMgr.m_BattleGroundQueues[bgQueueTypeId].m_QueuedPlayers;
-    BattleGroundQueue::QueuedPlayersMap::iterator itrPlayerStatus = qpMap.find(_player-&gt;GetGUID());
-    if (itrPlayerStatus == qpMap.end())
+    BattleGroundQueue&amp; bgQueue = sBattleGroundMgr.m_BattleGroundQueues[bgQueueTypeId];
+    //we must use temporary variable, because GroupQueueInfo pointer can be deleted in BattleGroundQueue::RemovePlayer() function
+    GroupQueueInfo ginfo;
+    if (!bgQueue.GetPlayerGroupInfoData(_player-&gt;GetGUID(), &amp;ginfo))
     {
-        sLog.outError(&quot;Battleground: itrplayerstatus not found.&quot;);
+        sLog.outError(&quot;BattlegroundHandler: itrplayerstatus not found.&quot;);
         return;
     }
-
-    instanceId = itrPlayerStatus-&gt;second.GroupInfo-&gt;IsInvitedToBGInstanceGUID;
     // if action == 1, then instanceId is required
-    if (!instanceId &amp;&amp; action == 1)
+    if (!ginfo.IsInvitedToBGInstanceGUID &amp;&amp; action == 1)
     {
-        sLog.outError(&quot;Battleground: instance not found.&quot;);
+        sLog.outError(&quot;BattlegroundHandler: instance not found.&quot;);
         return;
     }
 
-    BattleGround *bg = sBattleGroundMgr.GetBattleGround(instanceId, bgTypeId);
+    BattleGround *bg = sBattleGroundMgr.GetBattleGround(ginfo.IsInvitedToBGInstanceGUID, bgTypeId);
 
     // bg template might and must be used in case of leaving queue, when instance is not created yet
     if (!bg &amp;&amp; action == 0)
         bg = sBattleGroundMgr.GetBattleGroundTemplate(bgTypeId);
     if (!bg)
     {
-        sLog.outError(&quot;Battleground: bg_template not found for type id %u.&quot;, bgTypeId);
+        sLog.outError(&quot;BattlegroundHandler: bg_template not found for type id %u.&quot;, bgTypeId);
         return;
     }
 
-    if (_player-&gt;InBattleGroundQueue())
+    //some checks if player isn't cheating - it is not exactly cheating, but we cannot allow it
+    if (action == 1 &amp;&amp; ginfo.ArenaType == 0)
     {
-        //we must use temporary variables, because GroupQueueInfo pointer can be deleted in BattleGroundQueue::RemovePlayer() function!
-        uint32 team = itrPlayerStatus-&gt;second.GroupInfo-&gt;Team;
-        uint32 arenaType = itrPlayerStatus-&gt;second.GroupInfo-&gt;ArenaType;
-        uint32 isRated = itrPlayerStatus-&gt;second.GroupInfo-&gt;IsRated;
-        uint32 rating = itrPlayerStatus-&gt;second.GroupInfo-&gt;ArenaTeamRating;
-        uint32 opponentsRating = itrPlayerStatus-&gt;second.GroupInfo-&gt;OpponentsTeamRating;
-
-        //some checks if player isn't cheating - it is not exactly cheating, but we cannot allow it
-        if (action == 1 &amp;&amp; arenaType == 0)
+        //if player is trying to enter battleground (not arena!) and he has deserter debuff, we must just remove him from queue
+        if (!_player-&gt;CanJoinToBattleground())
         {
-            //if player is trying to enter battleground (not arena!) and he has deserter debuff, we must just remove him from queue
-            if (!_player-&gt;CanJoinToBattleground())
-            {
-                //send bg command result to show nice message
-                WorldPacket data2(SMSG_GROUP_JOINED_BATTLEGROUND, 4);
-                data2 &lt;&lt; uint32(0xFFFFFFFE);
-                _player-&gt;GetSession()-&gt;SendPacket(&amp;data2);
-                action = 0;
-                sLog.outDebug(&quot;Battleground: player %s (%u) has a deserter debuff, do not port him to battleground!&quot;, _player-&gt;GetName(), _player-&gt;GetGUIDLow());
-            }
-            //if player don't match battleground max level, then do not allow him to enter! (this might happen when player leveled up during his waiting in queue
-            if (_player-&gt;getLevel() &gt; bg-&gt;GetMaxLevel())
-            {
-                sLog.outError(&quot;Battleground: Player %s (%u) has level higher than maxlevel of battleground! Do not port him to battleground!&quot;, _player-&gt;GetName(), _player-&gt;GetGUIDLow());
-                action = 0;
-            }
+            //send bg command result to show nice message
+            WorldPacket data2(SMSG_GROUP_JOINED_BATTLEGROUND, 4);
+            data2 &lt;&lt; uint32(0xFFFFFFFE);
+            _player-&gt;GetSession()-&gt;SendPacket(&amp;data2);
+            action = 0;
+            sLog.outDebug(&quot;Battleground: player %s (%u) has a deserter debuff, do not port him to battleground!&quot;, _player-&gt;GetName(), _player-&gt;GetGUIDLow());
         }
-        uint32 queueSlot = _player-&gt;GetBattleGroundQueueIndex(bgQueueTypeId);
-        WorldPacket data;
-        switch( action )
+        //if player don't match battleground max level, then do not allow him to enter! (this might happen when player leveled up during his waiting in queue
+        if (_player-&gt;getLevel() &gt; bg-&gt;GetMaxLevel())
         {
-            case 1:                                         // port to battleground
-                if (!_player-&gt;IsInvitedForBattleGroundQueueType(bgQueueTypeId))
-                    return;                                 // cheating?
+            sLog.outError(&quot;Battleground: Player %s (%u) has level higher than maxlevel of battleground! Do not port him to battleground!&quot;, _player-&gt;GetName(), _player-&gt;GetGUIDLow());
+            action = 0;
+        }
+    }
+    uint32 queueSlot = _player-&gt;GetBattleGroundQueueIndex(bgQueueTypeId);
+    WorldPacket data;
+    switch( action )
+    {
+        case 1:                                         // port to battleground
+            if (!_player-&gt;IsInvitedForBattleGroundQueueType(bgQueueTypeId))
+                return;                                 // cheating?
 
-                _player-&gt;SetBattleGroundEntryPoint();
+            _player-&gt;SetBattleGroundEntryPoint();
 
-                // resurrect the player
-                if (!_player-&gt;isAlive())
-                {
-                    _player-&gt;ResurrectPlayer(1.0f);
-                    _player-&gt;SpawnCorpseBones();
-                }
-                // stop taxi flight at port
-                if (_player-&gt;isInFlight())
-                {
-                    _player-&gt;GetMotionMaster()-&gt;MovementExpired();
-                    _player-&gt;m_taxi.ClearTaxiDestinations();
-                }
+            // resurrect the player
+            if (!_player-&gt;isAlive())
+            {
+                _player-&gt;ResurrectPlayer(1.0f);
+                _player-&gt;SpawnCorpseBones();
+            }
+            // stop taxi flight at port
+            if (_player-&gt;isInFlight())
+            {
+                _player-&gt;GetMotionMaster()-&gt;MovementExpired();
+                _player-&gt;m_taxi.ClearTaxiDestinations();
+            }
 
-                sBattleGroundMgr.BuildBattleGroundStatusPacket(&amp;data, bg, queueSlot, STATUS_IN_PROGRESS, 0, bg-&gt;GetStartTime(), bg-&gt;GetArenaType());
-                _player-&gt;GetSession()-&gt;SendPacket(&amp;data);
-                // remove battleground queue status from BGmgr
-                sBattleGroundMgr.m_BattleGroundQueues[bgQueueTypeId].RemovePlayer(_player-&gt;GetGUID(), false);
-                // this is still needed here if battleground &quot;jumping&quot; shouldn't add deserter debuff
-                // also this is required to prevent stuck at old battleground after SetBattleGroundId set to new
-                if (BattleGround *currentBg = _player-&gt;GetBattleGround())
-                    currentBg-&gt;RemovePlayerAtLeave(_player-&gt;GetGUID(), false, true);
-
-                // set the destination instance id
-                _player-&gt;SetBattleGroundId(bg-&gt;GetInstanceID(), bgTypeId);
-                // set the destination team
-                _player-&gt;SetBGTeam(team);
-                // bg-&gt;HandleBeforeTeleportToBattleGround(_player);
-                sBattleGroundMgr.SendToBattleGround(_player, instanceId, bgTypeId);
-                // add only in HandleMoveWorldPortAck()
-                // bg-&gt;AddPlayer(_player,team);
-                sLog.outDebug(&quot;Battleground: player %s (%u) joined battle for bg %u, bgtype %u, queue type %u.&quot;, _player-&gt;GetName(), _player-&gt;GetGUIDLow(), bg-&gt;GetInstanceID(), bg-&gt;GetTypeID(), bgQueueTypeId);
-                break;
-            case 0:                                         // leave queue
-                // if player leaves rated arena match before match start, it is counted as he played but he lost
-                if (isRated)
+            sBattleGroundMgr.BuildBattleGroundStatusPacket(&amp;data, bg, queueSlot, STATUS_IN_PROGRESS, 0, bg-&gt;GetStartTime(), bg-&gt;GetArenaType());
+            _player-&gt;GetSession()-&gt;SendPacket(&amp;data);
+            // remove battleground queue status from BGmgr
+            bgQueue.RemovePlayer(_player-&gt;GetGUID(), false);
+            // this is still needed here if battleground &quot;jumping&quot; shouldn't add deserter debuff
+            // also this is required to prevent stuck at old battleground after SetBattleGroundId set to new
+            if (BattleGround *currentBg = _player-&gt;GetBattleGround())
+                currentBg-&gt;RemovePlayerAtLeave(_player-&gt;GetGUID(), false, true);
+
+            // set the destination instance id
+            _player-&gt;SetBattleGroundId(bg-&gt;GetInstanceID(), bgTypeId);
+            // set the destination team
+            _player-&gt;SetBGTeam(ginfo.Team);
+            // bg-&gt;HandleBeforeTeleportToBattleGround(_player);
+            sBattleGroundMgr.SendToBattleGround(_player, ginfo.IsInvitedToBGInstanceGUID, bgTypeId);
+            // add only in HandleMoveWorldPortAck()
+            // bg-&gt;AddPlayer(_player,team);
+            sLog.outDebug(&quot;Battleground: player %s (%u) joined battle for bg %u, bgtype %u, queue type %u.&quot;, _player-&gt;GetName(), _player-&gt;GetGUIDLow(), bg-&gt;GetInstanceID(), bg-&gt;GetTypeID(), bgQueueTypeId);
+            break;
+        case 0:                                         // leave queue
+            // if player leaves rated arena match before match start, it is counted as he played but he lost
+            if (ginfo.IsRated)
+            {
+                ArenaTeam * at = sObjectMgr.GetArenaTeamById(ginfo.Team);
+                if (at)
                 {
-                    ArenaTeam * at = sObjectMgr.GetArenaTeamById(team);
-                    if (at)
-                    {
-                        sLog.outDebug(&quot;UPDATING memberLost's personal arena rating for %u by opponents rating: %u, because he has left queue!&quot;, GUID_LOPART(_player-&gt;GetGUID()), opponentsRating);
-                        at-&gt;MemberLost(_player, opponentsRating);
-                        at-&gt;SaveToDB();
-                    }
+                    sLog.outDebug(&quot;UPDATING memberLost's personal arena rating for %u by opponents rating: %u, because he has left queue!&quot;, GUID_LOPART(_player-&gt;GetGUID()), ginfo.OpponentsTeamRating);
+                    at-&gt;MemberLost(_player, ginfo.OpponentsTeamRating);
+                    at-&gt;SaveToDB();
                 }
-                _player-&gt;RemoveBattleGroundQueueId(bgQueueTypeId);  // must be called this way, because if you move this call to queue-&gt;removeplayer, it causes bugs
-                sBattleGroundMgr.BuildBattleGroundStatusPacket(&amp;data, bg, queueSlot, STATUS_NONE, 0, 0, 0);
-                sBattleGroundMgr.m_BattleGroundQueues[bgQueueTypeId].RemovePlayer(_player-&gt;GetGUID(), true);
-                // player left queue, we should update it - do not update Arena Queue
-                if (!arenaType)
-                    sBattleGroundMgr.m_BattleGroundQueues[bgQueueTypeId].Update(bgTypeId, _player-&gt;GetBattleGroundQueueIdFromLevel(), arenaType, isRated, rating);
-                SendPacket(&amp;data);
-                sLog.outDebug(&quot;Battleground: player %s (%u) left queue for bgtype %u, queue type %u.&quot;, _player-&gt;GetName(), _player-&gt;GetGUIDLow(), bg-&gt;GetTypeID(), bgQueueTypeId);
-                break;
-            default:
-                sLog.outError(&quot;Battleground port: unknown action %u&quot;, action);
-                break;
-        }
+            }
+            _player-&gt;RemoveBattleGroundQueueId(bgQueueTypeId);  // must be called this way, because if you move this call to queue-&gt;removeplayer, it causes bugs
+            sBattleGroundMgr.BuildBattleGroundStatusPacket(&amp;data, bg, queueSlot, STATUS_NONE, 0, 0, 0);
+            bgQueue.RemovePlayer(_player-&gt;GetGUID(), true);
+            // player left queue, we should update it - do not update Arena Queue
+            if (!ginfo.ArenaType)
+                sBattleGroundMgr.ScheduleQueueUpdate(ginfo.ArenaTeamRating, ginfo.ArenaType, bgQueueTypeId, bgTypeId, _player-&gt;GetBattleGroundQueueIdFromLevel());
+            SendPacket(&amp;data);
+            sLog.outDebug(&quot;Battleground: player %s (%u) left queue for bgtype %u, queue type %u.&quot;, _player-&gt;GetName(), _player-&gt;GetGUIDLow(), bg-&gt;GetTypeID(), bgQueueTypeId);
+            break;
+        default:
+            sLog.outError(&quot;Battleground port: unknown action %u&quot;, action);
+            break;
     }
 }
 
@@ -544,16 +491,16 @@ void WorldSession::HandleBattlefieldStatusOpcode( WorldPacket &amp; /*recv_data*/ )
         }
         //we are sending update to player about queue - he can be invited there!
         //get GroupQueueInfo for queue status
-        BattleGroundQueue::QueuedPlayersMap&amp; qpMap = sBattleGroundMgr.m_BattleGroundQueues[bgQueueTypeId].m_QueuedPlayers;
-        BattleGroundQueue::QueuedPlayersMap::iterator itrPlayerStatus = qpMap.find(_player-&gt;GetGUID());
-        if (itrPlayerStatus == qpMap.end())
+        BattleGroundQueue&amp; bgQueue = sBattleGroundMgr.m_BattleGroundQueues[bgQueueTypeId];
+        GroupQueueInfo ginfo;
+        if (!bgQueue.GetPlayerGroupInfoData(_player-&gt;GetGUID(), &amp;ginfo))
             continue;
-        if (itrPlayerStatus-&gt;second.GroupInfo-&gt;IsInvitedToBGInstanceGUID)
+        if (ginfo.IsInvitedToBGInstanceGUID)
         {
-            bg = sBattleGroundMgr.GetBattleGround(itrPlayerStatus-&gt;second.GroupInfo-&gt;IsInvitedToBGInstanceGUID, bgTypeId);
+            bg = sBattleGroundMgr.GetBattleGround(ginfo.IsInvitedToBGInstanceGUID, bgTypeId);
             if (!bg)
                 continue;
-            uint32 remainingTime = getMSTimeDiff(getMSTime(), itrPlayerStatus-&gt;second.GroupInfo-&gt;RemoveInviteTime);
+            uint32 remainingTime = getMSTimeDiff(getMSTime(), ginfo.RemoveInviteTime);
             // send status invited to BattleGround
             sBattleGroundMgr.BuildBattleGroundStatusPacket(&amp;data, bg, i, STATUS_WAIT_JOIN, remainingTime, 0, arenaType);
             SendPacket(&amp;data);
@@ -563,9 +510,9 @@ void WorldSession::HandleBattlefieldStatusOpcode( WorldPacket &amp; /*recv_data*/ )
             bg = sBattleGroundMgr.GetBattleGroundTemplate(bgTypeId);
             if (!bg)
                 continue;
-            uint32 avgTime = sBattleGroundMgr.m_BattleGroundQueues[bgQueueTypeId].GetAverageQueueWaitTime(itrPlayerStatus-&gt;second.GroupInfo, _player-&gt;GetBattleGroundQueueIdFromLevel());
+            uint32 avgTime = bgQueue.GetAverageQueueWaitTime(&amp;ginfo, _player-&gt;GetBattleGroundQueueIdFromLevel());
             // send status in BattleGround Queue
-            sBattleGroundMgr.BuildBattleGroundStatusPacket(&amp;data, bg, i, STATUS_WAIT_QUEUE, avgTime, getMSTimeDiff(itrPlayerStatus-&gt;second.GroupInfo-&gt;JoinTime, getMSTime()), arenaType);
+            sBattleGroundMgr.BuildBattleGroundStatusPacket(&amp;data, bg, i, STATUS_WAIT_QUEUE, avgTime, getMSTimeDiff(ginfo.JoinTime, getMSTime()), arenaType);
             SendPacket(&amp;data);
         }
     }
@@ -725,8 +672,9 @@ void WorldSession::HandleBattlemasterJoinArena( WorldPacket &amp; recv_data )
             arenaRating = avg_pers_rating;
     }
 
-    GroupQueueInfo * ginfo = sBattleGroundMgr.m_BattleGroundQueues[bgQueueTypeId].AddGroup(_player, bgTypeId, arenatype, isRated, false, arenaRating, ateamId);
-    uint32 avgTime = sBattleGroundMgr.m_BattleGroundQueues[bgQueueTypeId].GetAverageQueueWaitTime(ginfo, _player-&gt;GetBattleGroundQueueIdFromLevel());
+    BattleGroundQueue &amp;bgQueue = sBattleGroundMgr.m_BattleGroundQueues[bgQueueTypeId];
+    GroupQueueInfo * ginfo = bgQueue.AddGroup(_player, bgTypeId, arenatype, isRated, false, arenaRating, ateamId);
+    uint32 avgTime = bgQueue.GetAverageQueueWaitTime(ginfo, _player-&gt;GetBattleGroundQueueIdFromLevel());
     if (asGroup)
     {
         sLog.outDebug(&quot;Battleground: arena join as group start&quot;);
@@ -745,12 +693,11 @@ void WorldSession::HandleBattlemasterJoinArena( WorldPacket &amp; recv_data )
             member-&gt;GetSession()-&gt;SendPacket(&amp;data);
             sBattleGroundMgr.BuildGroupJoinedBattlegroundPacket(&amp;data, bgTypeId);
             member-&gt;GetSession()-&gt;SendPacket(&amp;data);
-            sBattleGroundMgr.m_BattleGroundQueues[bgQueueTypeId].AddPlayer(member, ginfo);
+            bgQueue.AddPlayer(member, ginfo);
             sLog.outDebug(&quot;Battleground: player joined queue for arena as group bg queue type %u bg type %u: GUID %u, NAME %s&quot;,bgQueueTypeId,bgTypeId,member-&gt;GetGUIDLow(), member-&gt;GetName());
         }
         sLog.outDebug(&quot;Battleground: arena join as group end&quot;);
-        if (isRated)
-            sBattleGroundMgr.m_BattleGroundQueues[bgQueueTypeId].AnnounceWorld(ginfo, _player-&gt;GetGUID(), true);
+        //announce to world ... removed
     }
     else
     {
@@ -760,10 +707,10 @@ void WorldSession::HandleBattlemasterJoinArena( WorldPacket &amp; recv_data )
         // send status packet (in queue)
         sBattleGroundMgr.BuildBattleGroundStatusPacket(&amp;data, bg, queueSlot, STATUS_WAIT_QUEUE, avgTime, 0, arenatype);
         SendPacket(&amp;data);
-        sBattleGroundMgr.m_BattleGroundQueues[bgQueueTypeId].AddPlayer(_player, ginfo);
+        bgQueue.AddPlayer(_player, ginfo);
         sLog.outDebug(&quot;Battleground: player joined queue for arena, skirmish, bg queue type %u bg type %u: GUID %u, NAME %s&quot;,bgQueueTypeId,bgTypeId,_player-&gt;GetGUIDLow(), _player-&gt;GetName());
     }
-    sBattleGroundMgr.m_BattleGroundQueues[bgQueueTypeId].Update(bgTypeId, _player-&gt;GetBattleGroundQueueIdFromLevel(), arenatype, isRated, arenaRating);
+    sBattleGroundMgr.ScheduleQueueUpdate(arenaRating, arenatype, bgQueueTypeId, bgTypeId, _player-&gt;GetBattleGroundQueueIdFromLevel());
 }
 
 void WorldSession::HandleReportPvPAFK( WorldPacket &amp; recv_data )</diff>
      <filename>src/game/BattleGroundHandler.cpp</filename>
    </modified>
    <modified>
      <diff>@@ -177,6 +177,7 @@ GroupQueueInfo * BattleGroundQueue::AddGroup(Player *leader, BattleGroundTypeId
         index++;
     sLog.outDebug(&quot;Adding Group to BattleGroundQueue bgTypeId : %u, queue_id : %u, index : %u&quot;, BgTypeId, queue_id, index);
 
+    ACE_Guard&lt;ACE_Recursive_Thread_Mutex&gt; guard(m_Lock);
     m_QueuedGroups[queue_id][index].push_back(ginfo);
 
     // return ginfo, because it is needed to add players to this group info
@@ -186,6 +187,8 @@ GroupQueueInfo * BattleGroundQueue::AddGroup(Player *leader, BattleGroundTypeId
 //add player to playermap
 void BattleGroundQueue::AddPlayer(Player *plr, GroupQueueInfo *ginfo)
 {
+    ACE_Guard&lt;ACE_Recursive_Thread_Mutex&gt; guard(m_Lock);
+
     //if player isn't in queue, he is added, if already is, then values are overwritten, no memory leak
     PlayerQueueInfo&amp; info = m_QueuedPlayers[plr-&gt;GetGUID()];
     info.LastOnlineTime             = getMSTime();
@@ -248,6 +251,7 @@ uint32 BattleGroundQueue::GetAverageQueueWaitTime(GroupQueueInfo* ginfo, BGQueue
 void BattleGroundQueue::RemovePlayer(const uint64&amp; guid, bool decreaseInvitedCount)
 {
     //Player *plr = sObjectMgr.GetPlayer(guid);
+    ACE_Guard&lt;ACE_Recursive_Thread_Mutex&gt; guard(m_Lock);
 
     int32 queue_id = -1;                                     // signed for proper for-loop finish
     QueuedPlayersMap::iterator itr;
@@ -364,6 +368,26 @@ void BattleGroundQueue::RemovePlayer(const uint64&amp; guid, bool decreaseInvitedCou
     }
 }
 
+//returns true when player pl_guid is in queue and is invited to bgInstanceGuid
+bool BattleGroundQueue::IsPlayerInvited(const uint64&amp; pl_guid, const uint32 bgInstanceGuid, const uint32 removeTime)
+{
+    ACE_Guard&lt;ACE_Recursive_Thread_Mutex&gt; g(m_Lock);
+    QueuedPlayersMap::const_iterator qItr = m_QueuedPlayers.find(pl_guid);
+    return ( qItr != m_QueuedPlayers.end()
+        &amp;&amp; qItr-&gt;second.GroupInfo-&gt;IsInvitedToBGInstanceGUID == bgInstanceGuid
+        &amp;&amp; qItr-&gt;second.GroupInfo-&gt;RemoveInviteTime == removeTime );
+}
+
+bool BattleGroundQueue::GetPlayerGroupInfoData(const uint64&amp; guid, GroupQueueInfo* ginfo)
+{
+    ACE_Guard&lt;ACE_Recursive_Thread_Mutex&gt; g(m_Lock);
+    QueuedPlayersMap::const_iterator qItr = m_QueuedPlayers.find(guid);
+    if (qItr == m_QueuedPlayers.end())
+        return false;
+    *ginfo = *(qItr-&gt;second.GroupInfo);
+    return true;
+}
+
 //Announce world message
 void BattleGroundQueue::AnnounceWorld(GroupQueueInfo *ginfo, const uint64&amp; playerGUID, bool isAddedToQueue)
 {
@@ -461,7 +485,7 @@ bool BattleGroundQueue::InviteGroupToBG(GroupQueueInfo * ginfo, BattleGround * b
             plr-&gt;SetInviteForBattleGroundQueueType(bgQueueTypeId, ginfo-&gt;IsInvitedToBGInstanceGUID);
 
             // create remind invite events
-            BGQueueInviteEvent* inviteEvent = new BGQueueInviteEvent(plr-&gt;GetGUID(), ginfo-&gt;IsInvitedToBGInstanceGUID, bgTypeId, ginfo-&gt;RemoveInviteTime);
+            BGQueueInviteEvent* inviteEvent = new BGQueueInviteEvent(plr-&gt;GetGUID(), ginfo-&gt;IsInvitedToBGInstanceGUID, bgTypeId, ginfo-&gt;ArenaType, ginfo-&gt;RemoveInviteTime);
             plr-&gt;m_Events.AddEvent(inviteEvent, plr-&gt;m_Events.CalculateTime(INVITATION_REMIND_TIME));
             // create automatic remove events
             BGQueueRemoveEvent* removeEvent = new BGQueueRemoveEvent(plr-&gt;GetGUID(), ginfo-&gt;IsInvitedToBGInstanceGUID, bgTypeId, bgQueueTypeId, ginfo-&gt;RemoveInviteTime);
@@ -732,6 +756,7 @@ should be called from BattleGround::RemovePlayer function in some cases
 */
 void BattleGroundQueue::Update(BattleGroundTypeId bgTypeId, BGQueueIdBasedOnLevel queue_id, uint8 arenaType, bool isRated, uint32 arenaRating)
 {
+    ACE_Guard&lt;ACE_Recursive_Thread_Mutex&gt; guard(m_Lock);
     //if no players in queue - do nothing
     if( m_QueuedGroups[queue_id][BG_QUEUE_PREMADE_ALLIANCE].empty() &amp;&amp;
         m_QueuedGroups[queue_id][BG_QUEUE_PREMADE_HORDE].empty() &amp;&amp;
@@ -1021,17 +1046,15 @@ bool BGQueueInviteEvent::Execute(uint64 /*e_time*/, uint32 /*p_time*/)
 
     BattleGroundQueueTypeId bgQueueTypeId = BattleGroundMgr::BGQueueTypeId(bg-&gt;GetTypeID(), bg-&gt;GetArenaType());
     uint32 queueSlot = plr-&gt;GetBattleGroundQueueIndex(bgQueueTypeId);
-    if( queueSlot &lt; PLAYER_MAX_BATTLEGROUND_QUEUES )        // player is in queue or in battleground
+    if (queueSlot &lt; PLAYER_MAX_BATTLEGROUND_QUEUES)         // player is in queue or in battleground
     {
         // check if player is invited to this bg
-        BattleGroundQueue::QueuedPlayersMap const&amp; qpMap = sBattleGroundMgr.m_BattleGroundQueues[bgQueueTypeId].m_QueuedPlayers;
-        BattleGroundQueue::QueuedPlayersMap::const_iterator qItr = qpMap.find(m_PlayerGuid);
-        if( qItr != qpMap.end() &amp;&amp; qItr-&gt;second.GroupInfo-&gt;IsInvitedToBGInstanceGUID == m_BgInstanceGUID
-            &amp;&amp; qItr-&gt;second.GroupInfo-&gt;RemoveInviteTime == m_RemoveTime )
+        BattleGroundQueue &amp;bgQueue = sBattleGroundMgr.m_BattleGroundQueues[bgQueueTypeId];
+        if (bgQueue.IsPlayerInvited(m_PlayerGuid, m_BgInstanceGUID, m_RemoveTime))
         {
             WorldPacket data;
             //we must send remaining time in queue
-            sBattleGroundMgr.BuildBattleGroundStatusPacket(&amp;data, bg, queueSlot, STATUS_WAIT_JOIN, INVITE_ACCEPT_WAIT_TIME - INVITATION_REMIND_TIME, 0, qItr-&gt;second.GroupInfo-&gt;ArenaType);
+            sBattleGroundMgr.BuildBattleGroundStatusPacket(&amp;data, bg, queueSlot, STATUS_WAIT_JOIN, INVITE_ACCEPT_WAIT_TIME - INVITATION_REMIND_TIME, 0, m_ArenaType);
             plr-&gt;GetSession()-&gt;SendPacket(&amp;data);
         }
     }
@@ -1064,22 +1087,19 @@ bool BGQueueRemoveEvent::Execute(uint64 /*e_time*/, uint32 /*p_time*/)
     //bg pointer can be NULL! so use it carefully!
 
     uint32 queueSlot = plr-&gt;GetBattleGroundQueueIndex(m_BgQueueTypeId);
-    if( queueSlot &lt; PLAYER_MAX_BATTLEGROUND_QUEUES )        // player is in queue, or in Battleground
+    if (queueSlot &lt; PLAYER_MAX_BATTLEGROUND_QUEUES)         // player is in queue, or in Battleground
     {
         // check if player is in queue for this BG and if we are removing his invite event
-        BattleGroundQueue::QueuedPlayersMap&amp; qpMap = sBattleGroundMgr.m_BattleGroundQueues[m_BgQueueTypeId].m_QueuedPlayers;
-        BattleGroundQueue::QueuedPlayersMap::iterator qMapItr = qpMap.find(m_PlayerGuid);
-        if( qMapItr != qpMap.end() &amp;&amp; qMapItr-&gt;second.GroupInfo
-            &amp;&amp; qMapItr-&gt;second.GroupInfo-&gt;IsInvitedToBGInstanceGUID == m_BgInstanceGUID
-            &amp;&amp; qMapItr-&gt;second.GroupInfo-&gt;RemoveInviteTime == m_RemoveTime )
+        BattleGroundQueue &amp;bgQueue = sBattleGroundMgr.m_BattleGroundQueues[m_BgQueueTypeId];
+        if (bgQueue.IsPlayerInvited(m_PlayerGuid, m_BgInstanceGUID, m_RemoveTime))
         {
             sLog.outDebug(&quot;Battleground: removing player %u from bg queue for instance %u because of not pressing enter battle in time.&quot;,plr-&gt;GetGUIDLow(),m_BgInstanceGUID);
 
             plr-&gt;RemoveBattleGroundQueueId(m_BgQueueTypeId);
-            sBattleGroundMgr.m_BattleGroundQueues[m_BgQueueTypeId].RemovePlayer(m_PlayerGuid, true);
+            bgQueue.RemovePlayer(m_PlayerGuid, true);
             //update queues if battleground isn't ended
-            if (bg)
-                sBattleGroundMgr.ScheduleQueueUpdate(m_BgQueueTypeId, m_BgTypeId, bg-&gt;GetQueueId());
+            if (bg &amp;&amp; bg-&gt;isBattleGround() &amp;&amp; bg-&gt;GetStatus() != STATUS_WAIT_LEAVE)
+                sBattleGroundMgr.ScheduleQueueUpdate(0, 0, m_BgQueueTypeId, m_BgTypeId, bg-&gt;GetQueueId());
 
             WorldPacket data;
             sBattleGroundMgr.BuildBattleGroundStatusPacket(&amp;data, bg, queueSlot, STATUS_NONE, 0, 0, 0);
@@ -1167,18 +1187,24 @@ void BattleGroundMgr::Update(uint32 diff)
     // update scheduled queues
     if (!m_QueueUpdateScheduler.empty())
     {
-        //copy vector and clear the other
-        // TODO add lock
-        // TODO maybe std::list would be better and then unlock after end of cycle
-        std::vector&lt;uint32&gt; scheduled(m_QueueUpdateScheduler);
-        m_QueueUpdateScheduler.clear();
-        // TODO drop lock
+        std::vector&lt;uint64&gt; scheduled;
+        {
+            //create mutex
+            ACE_Guard&lt;ACE_Thread_Mutex&gt; guard(SchedulerLock);
+            //copy vector and clear the other
+            scheduled = std::vector&lt;uint64&gt;(m_QueueUpdateScheduler);
+            m_QueueUpdateScheduler.clear();
+            //release lock
+        }
+
         for (uint8 i = 0; i &lt; scheduled.size(); i++)
         {
-            BattleGroundQueueTypeId bgQueueTypeId = BattleGroundQueueTypeId(scheduled[i] &gt;&gt; 16);
+            uint32 arenaRating = scheduled[i] &gt;&gt; 32;
+            uint8 arenaType = scheduled[i] &gt;&gt; 24 &amp; 255;
+            BattleGroundQueueTypeId bgQueueTypeId = BattleGroundQueueTypeId(scheduled[i] &gt;&gt; 16 &amp; 255);
             BattleGroundTypeId bgTypeId = BattleGroundTypeId((scheduled[i] &gt;&gt; 8) &amp; 255);
             BGQueueIdBasedOnLevel queue_id = BGQueueIdBasedOnLevel(scheduled[i] &amp; 255);
-            m_BattleGroundQueues[bgQueueTypeId].Update(bgTypeId, queue_id);
+            m_BattleGroundQueues[bgQueueTypeId].Update(bgTypeId, queue_id, arenaType, arenaRating &gt; 0, arenaRating);
         }
     }
 
@@ -2008,11 +2034,11 @@ void BattleGroundMgr::ToggleArenaTesting()
         sWorld.SendWorldText(LANG_DEBUG_ARENA_OFF);
 }
 
-void BattleGroundMgr::ScheduleQueueUpdate(BattleGroundQueueTypeId bgQueueTypeId, BattleGroundTypeId bgTypeId, BGQueueIdBasedOnLevel queue_id)
+void BattleGroundMgr::ScheduleQueueUpdate(uint32 arenaRating, uint8 arenaType, BattleGroundQueueTypeId bgQueueTypeId, BattleGroundTypeId bgTypeId, BGQueueIdBasedOnLevel queue_id)
 {
-    //This method must be atomic, TODO add mutex
+    ACE_Guard&lt;ACE_Thread_Mutex&gt; guard(SchedulerLock);
     //we will use only 1 number created of bgTypeId and queue_id
-    uint32 schedule_id = (bgQueueTypeId &lt;&lt; 16) | (bgTypeId &lt;&lt; 8) | queue_id;
+    uint64 schedule_id = ((uint64)arenaRating &lt;&lt; 32) | (arenaType &lt;&lt; 24) | (bgQueueTypeId &lt;&lt; 16) | (bgTypeId &lt;&lt; 8) | queue_id;
     bool found = false;
     for (uint8 i = 0; i &lt; m_QueueUpdateScheduler.size(); i++)
     {</diff>
      <filename>src/game/BattleGroundMgr.cpp</filename>
    </modified>
    <modified>
      <diff>@@ -23,6 +23,7 @@
 #include &quot;Policies/Singleton.h&quot;
 #include &quot;Utilities/EventProcessor.h&quot;
 #include &quot;BattleGround.h&quot;
+#include &quot;ace/Recursive_Thread_Mutex.h&quot;
 
 typedef std::map&lt;uint32, BattleGround*&gt; BattleGroundSet;
 
@@ -83,12 +84,19 @@ class BattleGroundQueue
         GroupQueueInfo * AddGroup(Player * leader, BattleGroundTypeId bgTypeId, uint8 ArenaType, bool isRated, bool isPremade, uint32 ArenaRating, uint32 ArenaTeamId = 0);
         void AddPlayer(Player *plr, GroupQueueInfo *ginfo);
         void RemovePlayer(const uint64&amp; guid, bool decreaseInvitedCount);
+        bool IsPlayerInvited(const uint64&amp; pl_guid, const uint32 bgInstanceGuid, const uint32 removeTime);
+        bool GetPlayerGroupInfoData(const uint64&amp; guid, GroupQueueInfo* ginfo);
         void PlayerInvitedToBGUpdateAverageWaitTime(GroupQueueInfo* ginfo, BGQueueIdBasedOnLevel queue_id);
         uint32 GetAverageQueueWaitTime(GroupQueueInfo* ginfo, BGQueueIdBasedOnLevel queue_id);
 
         void DecreaseGroupLength(uint32 queueId, uint32 AsGroup);
         void AnnounceWorld(GroupQueueInfo *ginfo, const uint64&amp; playerGUID, bool isAddedToQueue);
 
+    private:
+        //mutex that should not allow changing private data, nor allowing to update Queue during private data change.
+        ACE_Recursive_Thread_Mutex  m_Lock;
+
+
         typedef std::map&lt;uint64, PlayerQueueInfo&gt; QueuedPlayersMap;
         QueuedPlayersMap m_QueuedPlayers;
 
@@ -123,8 +131,6 @@ class BattleGroundQueue
         //one selection pool for horde, other one for alliance
         SelectionPool m_SelectionPools[BG_TEAMS_COUNT];
 
-    private:
-
         bool InviteGroupToBG(GroupQueueInfo * ginfo, BattleGround * bg, uint32 side);
         uint32 m_WaitTimes[BG_TEAMS_COUNT][MAX_BATTLEGROUND_QUEUES][COUNT_OF_PLAYERS_TO_AVERAGE_WAIT_TIME];
         uint32 m_WaitTimeLastPlayer[BG_TEAMS_COUNT][MAX_BATTLEGROUND_QUEUES];
@@ -138,8 +144,8 @@ class BattleGroundQueue
 class BGQueueInviteEvent : public BasicEvent
 {
     public:
-        BGQueueInviteEvent(const uint64&amp; pl_guid, uint32 BgInstanceGUID, BattleGroundTypeId BgTypeId, uint32 removeTime) :
-          m_PlayerGuid(pl_guid), m_BgInstanceGUID(BgInstanceGUID), m_BgTypeId(BgTypeId), m_RemoveTime(removeTime)
+        BGQueueInviteEvent(const uint64&amp; pl_guid, uint32 BgInstanceGUID, BattleGroundTypeId BgTypeId, uint8 arenaType, uint32 removeTime) :
+          m_PlayerGuid(pl_guid), m_BgInstanceGUID(BgInstanceGUID), m_BgTypeId(BgTypeId), m_ArenaType(arenaType), m_RemoveTime(removeTime)
           {
           };
         virtual ~BGQueueInviteEvent() {};
@@ -150,6 +156,7 @@ class BGQueueInviteEvent : public BasicEvent
         uint64 m_PlayerGuid;
         uint32 m_BgInstanceGUID;
         BattleGroundTypeId m_BgTypeId;
+        uint8  m_ArenaType;
         uint32 m_RemoveTime;
 };
 
@@ -219,7 +226,7 @@ class BattleGroundMgr
 
         BGFreeSlotQueueType BGFreeSlotQueue[MAX_BATTLEGROUND_TYPE_ID];
 
-        void ScheduleQueueUpdate(BattleGroundQueueTypeId bgQueueTypeId, BattleGroundTypeId bgTypeId, BGQueueIdBasedOnLevel queue_id);
+        void ScheduleQueueUpdate(uint32 arenaRating, uint8 arenaType, BattleGroundQueueTypeId bgQueueTypeId, BattleGroundTypeId bgTypeId, BGQueueIdBasedOnLevel queue_id);
         uint32 GetMaxRatingDifference() const;
         uint32 GetRatingDiscardTimer()  const;
         uint32 GetPrematureFinishTime() const;
@@ -265,13 +272,14 @@ class BattleGroundMgr
 
         static bool IsBGWeekend(BattleGroundTypeId bgTypeId);
     private:
+        ACE_Thread_Mutex    SchedulerLock;
         BattleMastersMap    mBattleMastersMap;
         CreatureBattleEventIndexesMap m_CreatureBattleEventIndexMap;
         GameObjectBattleEventIndexesMap m_GameObjectBattleEventIndexMap;
 
         /* Battlegrounds */
         BattleGroundSet m_BattleGrounds[MAX_BATTLEGROUND_TYPE_ID];
-        std::vector&lt;uint32&gt;m_QueueUpdateScheduler;
+        std::vector&lt;uint64&gt; m_QueueUpdateScheduler;
         std::set&lt;uint32&gt; m_ClientBattleGroundIds[MAX_BATTLEGROUND_TYPE_ID][MAX_BATTLEGROUND_QUEUES]; //the instanceids just visible for the client
         uint32 m_NextRatingDiscardUpdate;
         time_t m_NextAutoDistributionTime;</diff>
      <filename>src/game/BattleGroundMgr.h</filename>
    </modified>
    <modified>
      <diff>@@ -1,4 +1,4 @@
 #ifndef __REVISION_NR_H__
 #define __REVISION_NR_H__
- #define REVISION_NR &quot;8798&quot;
+ #define REVISION_NR &quot;8799&quot;
 #endif // __REVISION_NR_H__</diff>
      <filename>src/shared/revision_nr.h</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>a52a94fa036e09bf7c1b1fad7476b77935b723c8</id>
    </parent>
  </parents>
  <author>
    <name>Triply</name>
    <email>triply@getmangos.com</email>
  </author>
  <url>http://github.com/mangos/mangos/commit/72f7a7ee56c63672faa7786b1d162a7a3b9ab406</url>
  <id>72f7a7ee56c63672faa7786b1d162a7a3b9ab406</id>
  <committed-date>2009-11-09T13:25:54-08:00</committed-date>
  <authored-date>2009-11-09T13:24:06-08:00</authored-date>
  <message>[8799] Implemented thread safe bg queue updates.

Signed-off-by: Triply &lt;triply@getmangos.com&gt;</message>
  <tree>bf723ad2f2bcdc13e83c3b5a2e192a9f32b28e92</tree>
  <committer>
    <name>Triply</name>
    <email>triply@getmangos.com</email>
  </committer>
</commit>
