diff --git a/indra/llplugin/llpluginprocessparent.cpp b/indra/llplugin/llpluginprocessparent.cpp
index 8758895b903f2d61ea68d0f27d1817aed290dfa0..55e67715d93551d0f93385c1040f1b45fa0defa4 100644
--- a/indra/llplugin/llpluginprocessparent.cpp
+++ b/indra/llplugin/llpluginprocessparent.cpp
@@ -315,19 +315,24 @@ void LLPluginProcessParent::idle(void)
 	do
 	{
 		// process queued messages
-		mIncomingQueueMutex.lock();
-		while(!mIncomingQueue.empty())
+		if (!mIncomingQueue.empty())
 		{
-			LLPluginMessage message = mIncomingQueue.front();
-			mIncomingQueue.pop();
-			mIncomingQueueMutex.unlock();
-				
-			receiveMessage(message);
-			
-			mIncomingQueueMutex.lock();
-		}
+			LLMutexTrylock locked_mtx(&mIncomingQueueMutex);
+			if (locked_mtx.isLocked())
+			{
+				if (!mIncomingQueue.empty())
+				{
+					std::deque<LLPluginMessage> local_queue;
+					local_queue.swap(mIncomingQueue);
+
+					for(const auto& message : local_queue)
+					{
+						receiveMessage(message);
+					}
+				}
+			}
 
-		mIncomingQueueMutex.unlock();
+		}
 		
 		// Give time to network processing
 		if(mMessagePipe)
@@ -870,10 +875,9 @@ void LLPluginProcessParent::poll(F64 timeout)
 
                 if (that)
                 {
-                    that->mIncomingQueueMutex.lock();
+					LLMutexLock incoming_lock(&that->mIncomingQueueMutex);
                     that->servicePoll();
-                    that->mIncomingQueueMutex.unlock();
-                }
+                 }
 
 			}
 		}
@@ -978,7 +982,7 @@ void LLPluginProcessParent::receiveMessageEarly(const LLPluginMessage &message)
 	if(!handled)
 	{
 		// any message that wasn't handled early needs to be queued.
-		mIncomingQueue.push(message);
+		mIncomingQueue.push_back(message);
 	}
 }
 
diff --git a/indra/llplugin/llpluginprocessparent.h b/indra/llplugin/llpluginprocessparent.h
index 5dafac64b321ce78bb740c0b036b9b6530cdac3b..b2ac59774e0bbc29265e671da5315ee3d8001970 100644
--- a/indra/llplugin/llpluginprocessparent.h
+++ b/indra/llplugin/llpluginprocessparent.h
@@ -210,7 +210,7 @@ class LLPluginProcessParent : public LLPluginMessagePipeOwner
     bool pollTick();
 
 	LLMutex mIncomingQueueMutex;
-	std::queue<LLPluginMessage> mIncomingQueue;
+	std::deque<LLPluginMessage> mIncomingQueue;
 };
 
 #endif // LL_LLPLUGINPROCESSPARENT_H