diff --git a/indra/llui/llfolderviewitem.cpp b/indra/llui/llfolderviewitem.cpp
index 7c63cad1b76218b7c9c94a243504b022e51297ee..21fb9bff909899df9eec0420aeb92a1e10f9266f 100755
--- a/indra/llui/llfolderviewitem.cpp
+++ b/indra/llui/llfolderviewitem.cpp
@@ -410,8 +410,8 @@ void LLFolderViewItem::selectItem(void)
 {
 	if (mIsSelected == FALSE)
 	{
-		getViewModelItem()->selectItem();
 		mIsSelected = TRUE;
+		getViewModelItem()->selectItem();
 	}
 }
 
diff --git a/indra/newview/llconversationview.cpp b/indra/newview/llconversationview.cpp
index 2d3a008bf40c1d57f4a52a4c2248c1ce1d1172c5..34b5976e3ee95ade027581724d600713bf2efd3f 100755
--- a/indra/newview/llconversationview.cpp
+++ b/indra/newview/llconversationview.cpp
@@ -203,6 +203,17 @@ void LLConversationViewSession::draw()
 	LLView::draw();
 }
 
+BOOL LLConversationViewSession::handleMouseDown( S32 x, S32 y, MASK mask )
+{
+	LLConversationItem* item = dynamic_cast<LLConversationItem *>(getViewModelItem());
+    LLUUID session_id = item? item->getUUID() : LLUUID();
+
+	(LLFloaterReg::getTypedInstance<LLIMFloaterContainer>("im_container"))->
+    		selectConversationPair(session_id, false);
+
+	return LLFolderViewFolder::handleMouseDown(x, y, mask);
+}
+
 // virtual
 S32 LLConversationViewSession::arrange(S32* width, S32* height)
 {
@@ -233,29 +244,6 @@ void LLConversationViewSession::toggleOpen()
 	}
 }
 
-void LLConversationViewSession::selectItem()
-{
-	
-	LLConversationItem* item = dynamic_cast<LLConversationItem*>(mViewModelItem);
-	LLFloater* session_floater = LLIMConversation::getConversation(item->getUUID());
-	LLMultiFloater* host_floater = session_floater->getHost();
-	
-	if (host_floater == mContainer)
-	{
-		// Always expand the message pane if the panel is hosted by the container
-		mContainer->collapseMessagesPane(false);
-		// Switch to the conversation floater that is being selected
-		mContainer->selectFloater(session_floater);
-	}
-	
-	// Set the focus on the selected floater
-	session_floater->setFocus(TRUE);
-    // Store the active session
-    LLIMFloaterContainer::getInstance()->setSelectedSession(item->getUUID());
-
-
-	LLFolderViewItem::selectItem();
-}
 
 void LLConversationViewSession::toggleMinimizedMode(bool is_minimized)
 {
@@ -441,31 +429,6 @@ void LLConversationViewParticipant::draw()
     LLView::draw();
 }
 
-void LLConversationViewParticipant::selectItem()
-{
-    LLConversationItem* vmi = this->getParentFolder() ? static_cast<LLConversationItem*>(this->getParentFolder()->getViewModelItem()) : NULL;
-    LLIMFloaterContainer* container = LLIMFloaterContainer::getInstance();
-    LLFloater* session_floater;
-
-    if(vmi)
-    {
-        session_floater = LLIMConversation::getConversation(vmi->getUUID());
-
-        //Only execute when switching floaters (conversations)
-        if(vmi->getUUID() != container->getSelectedSession())
-        {
-            container->selectFloater(session_floater);
-            // Store the active session
-            container->setSelectedSession(vmi->getUUID());
-        }
-
-        //Redirect focus to the conversation floater
-        session_floater->setFocus(TRUE);
-    }
-
-    LLFolderViewItem::selectItem();
-}
-
 void LLConversationViewParticipant::refresh()
 {
 	// Refresh the participant view from its model data
@@ -514,6 +477,23 @@ void LLConversationViewParticipant::onMouseLeave(S32 x, S32 y, MASK mask)
     LLFolderViewItem::onMouseLeave(x, y, mask);
 }
 
+BOOL LLConversationViewParticipant::handleMouseDown( S32 x, S32 y, MASK mask )
+{
+	LLConversationItem* item = NULL;
+	LLConversationViewSession* session_widget =
+			dynamic_cast<LLConversationViewSession *>(this->getParentFolder());
+	if (session_widget)
+	{
+	    item = dynamic_cast<LLConversationItem*>(session_widget->getViewModelItem());
+	}
+    LLUUID session_id = item? item->getUUID() : LLUUID();
+
+	(LLFloaterReg::getTypedInstance<LLIMFloaterContainer>("im_container"))->
+    		selectConversationPair(session_id, false);
+
+	return LLFolderViewItem::handleMouseDown(x, y, mask);
+}
+
 S32 LLConversationViewParticipant::getLabelXPos()
 {
     return mAvatarIcon->getRect().mRight + mIconPad;
diff --git a/indra/newview/llconversationview.h b/indra/newview/llconversationview.h
index aeca74726096aa183efb35e04e3b71df32de759f..ac91d2d26f87d95f50ac120b136050256145566b 100755
--- a/indra/newview/llconversationview.h
+++ b/indra/newview/llconversationview.h
@@ -60,10 +60,10 @@ class LLConversationViewSession : public LLFolderViewFolder
 	
 public:
 	virtual ~LLConversationViewSession();
-	virtual void selectItem();	
 
 	/*virtual*/ BOOL postBuild();
 	/*virtual*/ void draw();
+	/*virtual*/ BOOL handleMouseDown( S32 x, S32 y, MASK mask );
 
 	/*virtual*/ S32 arrange(S32* width, S32* height);
 
@@ -117,11 +117,13 @@ class LLConversationViewParticipant : public LLFolderViewItem
 	};
 	
     virtual ~LLConversationViewParticipant( void ) { }
-    void selectItem();	
+
     bool hasSameValue(const LLUUID& uuid) { return (uuid == mUUID); }
     virtual void refresh();
     void addToFolder(LLFolderViewFolder* folder);
 
+    /*virtual*/ BOOL handleMouseDown( S32 x, S32 y, MASK mask );
+
     void onMouseEnter(S32 x, S32 y, MASK mask);
     void onMouseLeave(S32 x, S32 y, MASK mask);
 
diff --git a/indra/newview/llimconversation.cpp b/indra/newview/llimconversation.cpp
index 833feff3c45f7a63d9e549c42c56b18cff3eb5af..51e4fbfe19c20afa4ff1aa5750bfd4cd6990a631 100644
--- a/indra/newview/llimconversation.cpp
+++ b/indra/newview/llimconversation.cpp
@@ -128,6 +128,22 @@ void LLIMConversation::setVisible(BOOL visible)
     setFocus(visible);
 }
 
+/*virtual*/
+void LLIMConversation::setFocus(BOOL focus)
+{
+	LLTransientDockableFloater::setFocus(focus);
+
+    //Redirect focus to input editor
+    if (focus)
+	{
+    	updateMessages();
+
+        if (mInputEditor)
+        {
+    	    mInputEditor->setFocus(TRUE);
+        }
+	}
+}
 
 
 void LLIMConversation::addToHost(const LLUUID& session_id)
@@ -203,10 +219,6 @@ BOOL LLIMConversation::postBuild()
 
 	if (isChatMultiTab())
 	{
-		if (mIsNearbyChat)
-		{
-			setCanClose(FALSE);
-		}
 		result = LLFloater::postBuild();
 	}
 	else
@@ -247,7 +259,6 @@ void LLIMConversation::enableDisableCallBtn()
     		&& mSession->mCallBackEnabled);
 }
 
-
 void LLIMConversation::onFocusReceived()
 {
 	setBackgroundOpaque(true);
@@ -258,6 +269,12 @@ void LLIMConversation::onFocusReceived()
 	}
 
 	LLTransientDockableFloater::onFocusReceived();
+
+	LLIMFloaterContainer* container = LLFloaterReg::getTypedInstance<LLIMFloaterContainer>("im_container");
+	if (container)
+	{
+		container->selectConversationPair(mSessionID, true);
+	}
 }
 
 void LLIMConversation::onFocusLost()
diff --git a/indra/newview/llimconversation.h b/indra/newview/llimconversation.h
index bff4cb4a31c9c7e3ac4c1718bd8c578b57360fd3..d1e2bfff55e3ba8265c3d36f68fc58ece746641b 100644
--- a/indra/newview/llimconversation.h
+++ b/indra/newview/llimconversation.h
@@ -79,7 +79,9 @@ class LLIMConversation
 	/*virtual*/ BOOL postBuild();
 	/*virtual*/ void draw();
 	/*virtual*/ void setVisible(BOOL visible);
+	/*virtual*/ void setFocus(BOOL focus);
 
+	virtual void updateMessages() {}
 
 protected:
 
diff --git a/indra/newview/llimfloater.cpp b/indra/newview/llimfloater.cpp
index 3545b8ff183d538b579c861df378ee2f77af5c01..2ff883da6737e5396fa3355efdb32585bd2afe83 100644
--- a/indra/newview/llimfloater.cpp
+++ b/indra/newview/llimfloater.cpp
@@ -671,19 +671,6 @@ void LLIMFloater::setDocked(bool docked, bool pop_on_undock)
 	}
 }
 
-void LLIMFloater::setFocus(BOOL focusFlag)
-{
-    LLTransientDockableFloater::setFocus(focusFlag);
-
-    //Redirect focus to input editor
-    if (focusFlag)
-    {
-        updateMessages();
-        mInputEditor->setFocus(TRUE);
-    }
-    
-}
-
 void LLIMFloater::setVisible(BOOL visible)
 {
 	LLNotificationsUI::LLScreenChannel* channel = static_cast<LLNotificationsUI::LLScreenChannel*>
diff --git a/indra/newview/llimfloater.h b/indra/newview/llimfloater.h
index 6c69ed34625d3f3622b896b627e0f85a883f69a0..1fae3cff50de4537f52e5a7595293f1745733969 100644
--- a/indra/newview/llimfloater.h
+++ b/indra/newview/llimfloater.h
@@ -65,7 +65,6 @@ class LLIMFloater
 
 	// LLView overrides
 	/*virtual*/ BOOL postBuild();
-    /*virtual*/ void setFocus(BOOL focusFlag);
 	/*virtual*/ void setVisible(BOOL visible);
 	/*virtual*/ BOOL getVisible();
 	// Check typing timeout timer.
@@ -86,7 +85,7 @@ class LLIMFloater
 	void sessionInitReplyReceived(const LLUUID& im_session_id);
 
 	// get new messages from LLIMModel
-	void updateMessages();
+	/*virtual*/ void updateMessages();
 	void reloadMessages();
 	static void onSendMsg(LLUICtrl*, void*);
 	void sendMsgFromInputEditor();
diff --git a/indra/newview/llimfloatercontainer.cpp b/indra/newview/llimfloatercontainer.cpp
index af43b1ac38d03448fefc914f240de5f946276696..df2491acbd323b6187df4ef4e07a772004346bfe 100644
--- a/indra/newview/llimfloatercontainer.cpp
+++ b/indra/newview/llimfloatercontainer.cpp
@@ -1091,6 +1091,47 @@ void LLIMFloaterContainer::selectConversation(const LLUUID& session_id)
 	}
 }
 
+// Synchronous select the conversation item and the conversation floater
+BOOL LLIMFloaterContainer::selectConversationPair(const LLUUID& session_id, bool select_widget)
+{
+    BOOL handled = TRUE;
+
+    /* widget processing */
+    if (select_widget)
+    {
+    	LLFolderViewItem* widget = mConversationsWidgets[session_id];
+    	if (widget && widget->getParentFolder())
+    	{
+    		widget->getParentFolder()->setSelection(widget, FALSE, FALSE);
+    	}
+    }
+
+    /* floater processing */
+
+    if (session_id != getSelectedSession())
+    {
+        // Store the active session
+        setSelectedSession(session_id);
+
+		LLIMConversation* session_floater = LLIMConversation::getConversation(session_id);
+
+		if (session_floater->getHost())
+		{
+			// Always expand the message pane if the panel is hosted by the container
+			collapseMessagesPane(false);
+			// Switch to the conversation floater that is being selected
+			selectFloater(session_floater);
+		}
+
+		// Set the focus on the selected floater
+		if (!session_floater->hasFocus())
+		{
+			session_floater->setFocus(TRUE);
+		}
+    }
+
+    return handled;
+}
 
 void LLIMFloaterContainer::setTimeNow(const LLUUID& session_id, const LLUUID& participant_id)
 {
@@ -1487,4 +1528,11 @@ void LLIMFloaterContainer::openNearbyChat()
 	}
 }
 
+void LLIMFloaterContainer::onNearbyChatClosed()
+{
+	// If nearby chat is the only remaining conversation and it is closed, close whole conversation floater as well
+	if (mConversationsItems.size() == 1)
+		closeFloater();
+}
+
 // EOF
diff --git a/indra/newview/llimfloatercontainer.h b/indra/newview/llimfloatercontainer.h
index 05ea94019bf84d84280db4d11a860313ff537871..691bc398119d46929c38568e41876c10eab691ae 100644
--- a/indra/newview/llimfloatercontainer.h
+++ b/indra/newview/llimfloatercontainer.h
@@ -68,6 +68,8 @@ class LLIMFloaterContainer
     
     void showConversation(const LLUUID& session_id);
     void selectConversation(const LLUUID& session_id);
+    BOOL selectConversationPair(const LLUUID& session_id, bool select_widget);
+
 	/*virtual*/ void tabClose();
 
 	static LLFloater* getCurrentVoiceFloater();
@@ -92,6 +94,8 @@ class LLIMFloaterContainer
     LLUUID getSelectedSession() { return mSelectedSession; }
     void setSelectedSession(LLUUID sessionID) { mSelectedSession = sessionID; }
 
+	void onNearbyChatClosed();
+
 private:
 	typedef std::map<LLUUID,LLFloater*> avatarID_panel_map_t;
 	avatarID_panel_map_t mSessions;
diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp
index 9b14a77c085f12b667810d15ce0abc175248c438..9f24a5372f79ad9651e710f2a2184123f2794b12 100644
--- a/indra/newview/llimview.cpp
+++ b/indra/newview/llimview.cpp
@@ -121,7 +121,14 @@ void toast_callback(const LLSD& msg){
 
     // Skip toasting if we have open window of IM with this session id
     LLIMFloater* open_im_floater = LLIMFloater::findInstance(msg["session_id"]);
-    if (open_im_floater && open_im_floater->isInVisibleChain() && open_im_floater->hasFocus())
+    if (
+           open_im_floater
+           && open_im_floater->isInVisibleChain()
+           && open_im_floater->hasFocus()
+           && !open_im_floater->isMinimized()
+           && !(open_im_floater->getHost()
+                   && open_im_floater->getHost()->isMinimized())
+       )
     {
         return;
     }
diff --git a/indra/newview/llnearbychat.cpp b/indra/newview/llnearbychat.cpp
index d1c7c6bfd7dd77f7f573dc3acd55ecd5ba7f2902..dbdf460785ae837fc3f98f48c3b104dfc25cbfb0 100644
--- a/indra/newview/llnearbychat.cpp
+++ b/indra/newview/llnearbychat.cpp
@@ -195,8 +195,13 @@ BOOL	LLNearbyChat::handleMouseDown(S32 x, S32 y, MASK mask)
 	//background opaque. This all happenn since NearByChat is "chrome" and didn't process focus change.
 
 	if(mChatHistory)
+	{
 		mChatHistory->setFocus(TRUE);
-	return LLPanel::handleMouseDown(x, y, mask);
+	}
+
+	BOOL handled = LLPanel::handleMouseDown(x, y, mask);
+	setFocus(handled);
+	return handled;
 }
 
 void LLNearbyChat::reloadMessages()
@@ -270,17 +275,6 @@ void LLNearbyChat::removeScreenChat()
 	}
 }
 
-void LLNearbyChat::setFocus(BOOL focusFlag)
-{
-    LLTransientDockableFloater::setFocus(focusFlag);
-    
-    //Redirect focus to input editor
-    if (focusFlag)
-    {
-        mInputEditor->setFocus(TRUE);
-    }
-    
-}
 
 void LLNearbyChat::setVisible(BOOL visible)
 {
@@ -293,7 +287,7 @@ void LLNearbyChat::setVisible(BOOL visible)
     setFocus(visible);
 }
 
-
+// virtual
 void LLNearbyChat::onTearOffClicked()
 {
 	LLIMConversation::onTearOffClicked();
@@ -311,6 +305,26 @@ void LLNearbyChat::onOpen(const LLSD& key)
 	showTranslationCheckbox(LLTranslate::isTranslationConfigured());
 }
 
+// virtual
+void LLNearbyChat::onClose(bool app_quitting)
+{
+	// Override LLIMConversation::onClose() so that Nearby Chat is not removed from the conversation floater
+}
+
+// virtual
+void LLNearbyChat::onClickCloseBtn()
+{
+	if (!isTornOff())
+		return;
+	onTearOffClicked();
+	
+	LLIMFloaterContainer *im_box = LLIMFloaterContainer::findInstance();
+	if (im_box)
+	{
+		im_box->onNearbyChatClosed();
+	}
+}
+
 void LLNearbyChat::onChatFontChange(LLFontGL* fontp)
 {
 	// Update things with the new font whohoo
diff --git a/indra/newview/llnearbychat.h b/indra/newview/llnearbychat.h
index b155fd3c26ef5d2b9a2a1d020946f2c03efb02f4..c6a2637e8fe2ca71f66216fc96db2916d45995c9 100644
--- a/indra/newview/llnearbychat.h
+++ b/indra/newview/llnearbychat.h
@@ -52,7 +52,7 @@ class LLNearbyChat
 
 	/*virtual*/ BOOL postBuild();
 	/*virtual*/ void onOpen(const LLSD& key);
-    /*virtual*/ void setFocus(BOOL focusFlag);
+	/*virtual*/ void onClose(bool app_quitting);
 	/*virtual*/ void setVisible(BOOL visible);
 
 	void loadHistory();
@@ -96,6 +96,7 @@ class LLNearbyChat
 	void onChatFontChange(LLFontGL* fontp);
 
 	/*virtual*/ void onTearOffClicked();
+	/*virtual*/ void onClickCloseBtn();
 
 	static LLWString stripChannelNumber(const LLWString &mesg, S32* channel);
 	EChatType processChatTypeTriggers(EChatType type, std::string &str);
diff --git a/indra/newview/llspeakers.cpp b/indra/newview/llspeakers.cpp
index 46fd8c12904e852f1f9bdb52630c02b8ea03731f..726199b7aa9ec2b5988c3ba15c9d4b0b52ebf765 100644
--- a/indra/newview/llspeakers.cpp
+++ b/indra/newview/llspeakers.cpp
@@ -504,7 +504,7 @@ void LLSpeakerMgr::update(BOOL resort_ok)
 void LLSpeakerMgr::updateSpeakerList()
 {
 	// are we bound to the currently active voice channel?
-	if ((!mVoiceChannel && LLVoiceClient::getInstance()->inProximalChannel()) || (mVoiceChannel && mVoiceChannel->isActive()))
+	if ((!mVoiceChannel && LLVoiceClient::getInstance()->inProximalChannel()) || (mVoiceChannel))
 	{
 	        std::set<LLUUID> participants;
 	        LLVoiceClient::getInstance()->getParticipantList(participants);
diff --git a/indra/newview/llvoicevivox.cpp b/indra/newview/llvoicevivox.cpp
index 71006d38d2db545ebfafef8256ae6078a46cd144..412e4593bc70a044290e583b095e6fd201f8b2d2 100644
--- a/indra/newview/llvoicevivox.cpp
+++ b/indra/newview/llvoicevivox.cpp
@@ -291,6 +291,7 @@ LLVivoxVoiceClient::LLVivoxVoiceClient() :
 	mCaptureDeviceDirty(false),
 	mRenderDeviceDirty(false),
 	mSpatialCoordsDirty(false),
+	mIsInitialized(false),
 
 	mMuteMic(false),
 	mMuteMicDirty(false),
@@ -520,7 +521,7 @@ void LLVivoxVoiceClient::requestVoiceAccountProvision(S32 retries)
 {
 	LLViewerRegion *region = gAgent.getRegion();
 	
-	if ( region && mVoiceEnabled )
+	if ( region && (mVoiceEnabled || !mIsInitialized))
 	{
 		std::string url = 
 		region->getCapability("ProvisionVoiceAccountRequest");
@@ -691,7 +692,7 @@ void LLVivoxVoiceClient::stateMachine()
 		setVoiceEnabled(false);
 	}
 	
-	if(mVoiceEnabled)
+	if(mVoiceEnabled || !mIsInitialized)
 	{
 		updatePosition();
 	}
@@ -736,7 +737,7 @@ void LLVivoxVoiceClient::stateMachine()
 		
 		//MARK: stateDisabled
 		case stateDisabled:
-			if(mTuningMode || (mVoiceEnabled && !mAccountName.empty()))
+			if(mTuningMode || ((mVoiceEnabled || !mIsInitialized) && !mAccountName.empty()))
 			{
 				setState(stateStart);
 			}
@@ -891,7 +892,7 @@ void LLVivoxVoiceClient::stateMachine()
 				mTuningExitState = stateIdle;
 				setState(stateMicTuningStart);
 			}
-			else if(!mVoiceEnabled)
+			else if(!mVoiceEnabled && mIsInitialized)
 			{
 				// We never started up the connector.  This will shut down the daemon.
 				setState(stateConnectorStopped);
@@ -1085,7 +1086,7 @@ void LLVivoxVoiceClient::stateMachine()
 
 			//MARK: stateConnectorStart
 		case stateConnectorStart:
-			if(!mVoiceEnabled)
+			if(!mVoiceEnabled && mIsInitialized)
 			{
 				// We were never logged in.  This will shut down the connector.
 				setState(stateLoggedOut);
@@ -1103,7 +1104,7 @@ void LLVivoxVoiceClient::stateMachine()
 		
 		//MARK: stateConnectorStarted
 		case stateConnectorStarted:		// connector handle received
-			if(!mVoiceEnabled)
+			if(!mVoiceEnabled && mIsInitialized)
 			{
 				// We were never logged in.  This will shut down the connector.
 				setState(stateLoggedOut);
@@ -1247,7 +1248,7 @@ void LLVivoxVoiceClient::stateMachine()
 		
 		//MARK: stateCreatingSessionGroup
 		case stateCreatingSessionGroup:
-			if(mSessionTerminateRequested || !mVoiceEnabled)
+			if(mSessionTerminateRequested || !mVoiceEnabled && mIsInitialized)
 			{
 				// *TODO: Question: is this the right way out of this state
 				setState(stateSessionTerminated);
@@ -1263,7 +1264,7 @@ void LLVivoxVoiceClient::stateMachine()
 		//MARK: stateRetrievingParcelVoiceInfo
 		case stateRetrievingParcelVoiceInfo: 
 			// wait until parcel voice info is received.
-			if(mSessionTerminateRequested || !mVoiceEnabled)
+			if(mSessionTerminateRequested || !mVoiceEnabled && mIsInitialized)
 			{
 				// if a terminate request has been received,
 				// bail and go to the stateSessionTerminated
@@ -1283,7 +1284,7 @@ void LLVivoxVoiceClient::stateMachine()
 			// Otherwise, if you log in but don't join a proximal channel (such as when your login location has voice disabled), your friends list won't sync.
 			sendFriendsListUpdates();
 			
-			if(mSessionTerminateRequested || !mVoiceEnabled)
+			if(mSessionTerminateRequested || !mVoiceEnabled && mIsInitialized)
 			{
 				// TODO: Question: Is this the right way out of this state?
 				setState(stateSessionTerminated);
@@ -1364,7 +1365,7 @@ void LLVivoxVoiceClient::stateMachine()
 		    }
 			
 			// joinedAudioSession() will transition from here to stateSessionJoined.
-			if(!mVoiceEnabled)
+			if(!mVoiceEnabled && mIsInitialized)
 			{
 				// User bailed out during connect -- jump straight to teardown.
 				setState(stateSessionTerminated);
@@ -1411,7 +1412,7 @@ void LLVivoxVoiceClient::stateMachine()
 				notifyStatusObservers(LLVoiceClientStatusObserver::STATUS_JOINED);
 
 			}
-			else if(!mVoiceEnabled)
+			else if(!mVoiceEnabled && mIsInitialized)
 			{
 				// User bailed out during connect -- jump straight to teardown.
 				setState(stateSessionTerminated);
@@ -1431,7 +1432,7 @@ void LLVivoxVoiceClient::stateMachine()
 		//MARK: stateRunning
 		case stateRunning:				// steady state
 			// Disabling voice or disconnect requested.
-			if(!mVoiceEnabled || mSessionTerminateRequested)
+			if(!mVoiceEnabled && mIsInitialized || mSessionTerminateRequested)
 			{
 				leaveAudioSession();
 			}
@@ -1478,6 +1479,8 @@ void LLVivoxVoiceClient::stateMachine()
 					mUpdateTimer.setTimerExpirySec(UPDATE_THROTTLE_SECONDS);
 					sendPositionalUpdate();
 				}
+
+				mIsInitialized = true;
 			}
 		break;
 		
@@ -1511,7 +1514,7 @@ void LLVivoxVoiceClient::stateMachine()
 			// Always reset the terminate request flag when we get here.
 			mSessionTerminateRequested = false;
 
-			if(mVoiceEnabled && !mRelogRequested)
+			if((mVoiceEnabled || !mIsInitialized) && !mRelogRequested)
 			{				
 				// Just leaving a channel, go back to stateNoChannel (the "logged in but have no channel" state).
 				setState(stateNoChannel);
@@ -1539,7 +1542,7 @@ void LLVivoxVoiceClient::stateMachine()
 			mAccountHandle.clear();
 			cleanUp();
 
-			if(mVoiceEnabled && !mRelogRequested)
+			if((mVoiceEnabled || !mIsInitialized) && !mRelogRequested)
 			{
 				// User was logged out, but wants to be logged in.  Send a new login request.
 				setState(stateNeedsLogin);
diff --git a/indra/newview/llvoicevivox.h b/indra/newview/llvoicevivox.h
index 1142a1a49c7583a281eea990da63f136090ee030..f2a3a7d3ddf5ddbfe8951dcf9c8eee5952a71c6e 100644
--- a/indra/newview/llvoicevivox.h
+++ b/indra/newview/llvoicevivox.h
@@ -741,6 +741,8 @@ class LLVivoxVoiceClient :	public LLSingleton<LLVivoxVoiceClient>,
 	std::string mRenderDevice;
 	bool mCaptureDeviceDirty;
 	bool mRenderDeviceDirty;
+
+	bool mIsInitialized;
 	
 	
 	bool checkParcelChanged(bool update = false);
diff --git a/indra/newview/skins/default/textures/icons/Conv_toolbar_add_person.png b/indra/newview/skins/default/textures/icons/Conv_toolbar_add_person.png
index f024c733f34e1075e243b6cb64290b7407f3be6c..0631f16f3bffdbb399a3f0a8fb4294c860e5824e 100755
Binary files a/indra/newview/skins/default/textures/icons/Conv_toolbar_add_person.png and b/indra/newview/skins/default/textures/icons/Conv_toolbar_add_person.png differ
diff --git a/indra/newview/skins/default/textures/icons/Conv_toolbar_arrow_ne.png b/indra/newview/skins/default/textures/icons/Conv_toolbar_arrow_ne.png
index a19e720d421a7f358234a8809ebd92f2d577825c..578482f5ed786c49c02e66f05a4e73dd1b4b1a8c 100755
Binary files a/indra/newview/skins/default/textures/icons/Conv_toolbar_arrow_ne.png and b/indra/newview/skins/default/textures/icons/Conv_toolbar_arrow_ne.png differ
diff --git a/indra/newview/skins/default/textures/icons/Conv_toolbar_arrow_sw.png b/indra/newview/skins/default/textures/icons/Conv_toolbar_arrow_sw.png
index 7f3f42639d1582bda22dd1174973f79dd173063a..767613179099fb9f2691a309776412fafad36a27 100755
Binary files a/indra/newview/skins/default/textures/icons/Conv_toolbar_arrow_sw.png and b/indra/newview/skins/default/textures/icons/Conv_toolbar_arrow_sw.png differ
diff --git a/indra/newview/skins/default/textures/icons/Conv_toolbar_close.png b/indra/newview/skins/default/textures/icons/Conv_toolbar_close.png
index 25a939d7f5fd05a2b6bc035c5df7d17004284090..d009c8f446936f9e8513ebba7c3a9b7d2203ca90 100755
Binary files a/indra/newview/skins/default/textures/icons/Conv_toolbar_close.png and b/indra/newview/skins/default/textures/icons/Conv_toolbar_close.png differ
diff --git a/indra/newview/skins/default/textures/icons/Conv_toolbar_collapse.png b/indra/newview/skins/default/textures/icons/Conv_toolbar_collapse.png
index 82baabde471104747028481346d268a9b51bc8fc..8d82960e28c9b103b5c36fad0718254759da3c51 100755
Binary files a/indra/newview/skins/default/textures/icons/Conv_toolbar_collapse.png and b/indra/newview/skins/default/textures/icons/Conv_toolbar_collapse.png differ
diff --git a/indra/newview/skins/default/textures/icons/Conv_toolbar_expand.png b/indra/newview/skins/default/textures/icons/Conv_toolbar_expand.png
index 7d64abb042b7a5bf99a67014d936038aa669fb83..f718d3fc60580b56998b8c89965a19d962bb8881 100755
Binary files a/indra/newview/skins/default/textures/icons/Conv_toolbar_expand.png and b/indra/newview/skins/default/textures/icons/Conv_toolbar_expand.png differ
diff --git a/indra/newview/skins/default/textures/icons/Conv_toolbar_hang_up.png b/indra/newview/skins/default/textures/icons/Conv_toolbar_hang_up.png
index f0da962c2d432e2712693bb9e638b53df726c62f..315e2c581ad6c04b6e98c62fa28a677ce04a493a 100755
Binary files a/indra/newview/skins/default/textures/icons/Conv_toolbar_hang_up.png and b/indra/newview/skins/default/textures/icons/Conv_toolbar_hang_up.png differ
diff --git a/indra/newview/skins/default/textures/icons/Conv_toolbar_open_call.png b/indra/newview/skins/default/textures/icons/Conv_toolbar_open_call.png
index 0db001dcdb9a011d4f18d0023d8756d2d2fae259..732ab02a20cd8a99956bbda9a34547e4546d1a3f 100755
Binary files a/indra/newview/skins/default/textures/icons/Conv_toolbar_open_call.png and b/indra/newview/skins/default/textures/icons/Conv_toolbar_open_call.png differ
diff --git a/indra/newview/skins/default/textures/icons/Conv_toolbar_plus.png b/indra/newview/skins/default/textures/icons/Conv_toolbar_plus.png
index 0cf7edc2d467712a380f3a9d4fc58a401598f94f..25a32cb2ba94265a73a9a09342cba71f60dcfb95 100755
Binary files a/indra/newview/skins/default/textures/icons/Conv_toolbar_plus.png and b/indra/newview/skins/default/textures/icons/Conv_toolbar_plus.png differ
diff --git a/indra/newview/skins/default/textures/icons/Conv_toolbar_sort.png b/indra/newview/skins/default/textures/icons/Conv_toolbar_sort.png
index a0c15a6d3e5785fe7f5b3311ca1a9e545b383667..08debeb91f58d0219054a58632e227ac4cfc6335 100755
Binary files a/indra/newview/skins/default/textures/icons/Conv_toolbar_sort.png and b/indra/newview/skins/default/textures/icons/Conv_toolbar_sort.png differ
diff --git a/indra/newview/skins/default/textures/icons/nearby_chat_icon.png b/indra/newview/skins/default/textures/icons/nearby_chat_icon.png
index 48c2379133b56705efab04f8bf29762aa48c6864..5ac4258b9da117d316a5abf15c405d136a19fd48 100644
Binary files a/indra/newview/skins/default/textures/icons/nearby_chat_icon.png and b/indra/newview/skins/default/textures/icons/nearby_chat_icon.png differ