diff --git a/indra/newview/llvoicevivox.cpp b/indra/newview/llvoicevivox.cpp
index a27afef052f38be86ae37f1913ceaf7ea35c402a..ff7d1efce481b5fb5f74f430218b19864a4001a4 100755
--- a/indra/newview/llvoicevivox.cpp
+++ b/indra/newview/llvoicevivox.cpp
@@ -268,6 +268,10 @@ void LLVivoxVoiceClient::init(LLPumpIO *pump)
 {
 	// constructor will set up LLVoiceClient::getInstance()
 	LLVivoxVoiceClient::getInstance()->mPump = pump;
+
+    LLCoros::instance().launch("LLVivoxVoiceClient::voiceControlCoro();",
+        boost::bind(&LLVivoxVoiceClient::voiceControlCoro, LLVivoxVoiceClient::getInstance()));
+
 }
 
 void LLVivoxVoiceClient::terminate()
@@ -508,8 +512,8 @@ void LLVivoxVoiceClient::setLoginInfo(
 
 void LLVivoxVoiceClient::idle(void* user_data)
 {
-	LLVivoxVoiceClient* self = (LLVivoxVoiceClient*)user_data;
-	self->stateMachine();
+// 	LLVivoxVoiceClient* self = (LLVivoxVoiceClient*)user_data;
+// 	self->stateMachine();
 }
 
 std::string LLVivoxVoiceClient::state2string(LLVivoxVoiceClient::state inState)
@@ -1695,6 +1699,9 @@ bool LLVivoxVoiceClient::runSession(sessionState *session)
             mVoiceFontExpiryTimer.setTimerExpirySec(VOICE_FONT_EXPIRY_INTERVAL);
         }
 
+        // send any requests to adjust mic and speaker settings if they have changed
+        sendLocalAudioUpdates();
+
         // Send an update only if the ptt or mute state has changed (which shouldn't be able to happen that often
         // -- the user can only click so fast) or every 10hz, whichever is sooner.
         // Sending for every volume update causes an excessive flood of messages whenever a volume slider is dragged.
@@ -4395,7 +4402,8 @@ bool LLVivoxVoiceClient::switchChannel(
 			mNextAudioSession->mIsP2P = is_p2p;
 		}
 		
-		if(getState() >= stateRetrievingParcelVoiceInfo)
+// 		if(getState() >= stateRetrievingParcelVoiceInfo)
+        if (mAudioSession)
 		{
 			// If we're already in a channel, or if we're joining one, terminate
 			// so we can rejoin with the new session data.
@@ -4409,16 +4417,23 @@ bool LLVivoxVoiceClient::switchChannel(
 void LLVivoxVoiceClient::joinSession(sessionState *session)
 {
 	mNextAudioSession = session;
-	
-	if(getState() <= stateNoChannel)
-	{
-		// We're already set up to join a channel, just needed to fill in the session handle
-	}
-	else
-	{
-		// State machine will come around and rejoin if uri/handle is not empty.
-		sessionTerminate();
-	}
+
+    if (mAudioSession)
+    {
+        // If we're already in a channel, or if we're joining one, terminate
+        // so we can rejoin with the new session data.
+        sessionTerminate();
+    }
+
+// 	if(getState() <= stateNoChannel)
+// 	{
+// 		// We're already set up to join a channel, just needed to fill in the session handle
+// 	}
+// 	else
+// 	{
+// 		// State machine will come around and rejoin if uri/handle is not empty.
+// 		sessionTerminate();
+// 	}
 }
 
 void LLVivoxVoiceClient::setNonSpatialChannel(