diff --git a/indra/newview/app_settings/settings_per_account.xml b/indra/newview/app_settings/settings_per_account.xml
index 4ff494fbfb3aa4ed419ea719c94e8e4b813f0557..68643283398f1d9fbf4d1d4d26808bd192a84f0c 100644
--- a/indra/newview/app_settings/settings_per_account.xml
+++ b/indra/newview/app_settings/settings_per_account.xml
@@ -270,7 +270,18 @@
         <key>Value</key>
             <integer>0</integer>
         </map>
-      <key>ShowFavoritesOnLogin</key>
+    <key>TranslatingEnabled</key>
+        <map>
+        <key>Comment</key>
+            <string>Translation prefs are set</string>
+        <key>Persist</key>
+            <integer>1</integer>
+        <key>Type</key>
+            <string>Boolean</string>
+        <key>Value</key>
+            <integer>0</integer>
+        </map>
+    <key>ShowFavoritesOnLogin</key>
         <map>
         <key>Comment</key>
              <string>Determines whether favorites of last logged in user will be saved on exit from viewer and shown on login screen</string>
diff --git a/indra/newview/llfloaterimcontainer.cpp b/indra/newview/llfloaterimcontainer.cpp
index a17b89af0dec3d712a60d19f5241c34a7035446c..8264a90325ea7f160d3022f8c21231fb149819bd 100644
--- a/indra/newview/llfloaterimcontainer.cpp
+++ b/indra/newview/llfloaterimcontainer.cpp
@@ -238,6 +238,9 @@ BOOL LLFloaterIMContainer::postBuild()
 	// Init the sort order now that the root had been created
 	setSortOrder(LLConversationSort(gSavedSettings.getU32("ConversationSortOrder")));
 	
+	// Keep the xml set title around for when we have to overwrite it
+	mGeneralTitle = getTitle();
+	
 	mInitialized = true;
 
 	// Add callbacks:
@@ -502,10 +505,10 @@ void LLFloaterIMContainer::draw()
 		collapseMessagesPane(true);
 	}
 	
-	//Update moderator options visibility
 	const LLConversationItem *current_session = getCurSelectedViewModelItem();
 	if (current_session)
 	{
+		// Update moderator options visibility
 		LLFolderViewModelItemCommon::child_list_t::const_iterator current_participant_model = current_session->getChildrenBegin();
 		LLFolderViewModelItemCommon::child_list_t::const_iterator end_participant_model = current_session->getChildrenEnd();
 		while (current_participant_model != end_participant_model)
@@ -515,6 +518,9 @@ void LLFloaterIMContainer::draw()
 
 			current_participant_model++;
 		}
+		// Update floater's title as required by the currently selected session or use the default title
+		LLFloaterIMSession * conversation_floaterp = LLFloaterIMSession::findInstance(current_session->getUUID());
+		setTitle(conversation_floaterp && conversation_floaterp->needsTitleOverwrite() ? conversation_floaterp->getTitle() : mGeneralTitle);
 	}
 
 	LLFloater::draw();
@@ -893,7 +899,18 @@ void LLFloaterIMContainer::getSelectedUUIDs(uuid_vec_t& selected_uuids)
     for (; it != it_end; ++it)
     {
         conversationItem = static_cast<LLConversationItem *>((*it)->getViewModelItem());
-        selected_uuids.push_back(conversationItem->getUUID());
+      
+		//When a one-on-one conversation exists, retrieve the participant id from the conversation floater
+		if(conversationItem->getType() == LLConversationItem::CONV_SESSION_1_ON_1)
+		{
+			LLFloaterIMSession * conversation_floaterp = LLFloaterIMSession::findInstance(conversationItem->getUUID());
+			LLUUID participant_id = conversation_floaterp->getOtherParticipantUUID();
+			selected_uuids.push_back(participant_id);
+		}
+		else
+		{
+			selected_uuids.push_back(conversationItem->getUUID());
+		}
     }
 }
 
@@ -929,17 +946,7 @@ void LLFloaterIMContainer::getParticipantUUIDs(uuid_vec_t& selected_uuids)
 		return;
 	}
 
-    if (conversation_item->getType() == LLConversationItem::CONV_PARTICIPANT)
-    {
-        getSelectedUUIDs(selected_uuids);
-    }
-    //When a one-on-one conversation exists, retrieve the participant id from the conversation floater
-    else if(conversation_item->getType() == LLConversationItem::CONV_SESSION_1_ON_1)
-    {
-        LLFloaterIMSession * conversation_floaterp = LLFloaterIMSession::findInstance(conversation_item->getUUID());
-        LLUUID participant_id = conversation_floaterp->getOtherParticipantUUID();
-        selected_uuids.push_back(participant_id);
-    }    
+	getSelectedUUIDs(selected_uuids);  
 }
 
 void LLFloaterIMContainer::doToParticipants(const std::string& command, uuid_vec_t& selectedIDS)
diff --git a/indra/newview/llfloaterimcontainer.h b/indra/newview/llfloaterimcontainer.h
index 85d950c58bfbe873774159fb3ae80e1a1b2da4b6..06af6c7b516e5fc1f0606e7e49b88872cd9f6fe5 100644
--- a/indra/newview/llfloaterimcontainer.h
+++ b/indra/newview/llfloaterimcontainer.h
@@ -169,6 +169,7 @@ class LLFloaterIMContainer
 	bool mInitialized;
 
 	LLUUID mSelectedSession;
+	std::string mGeneralTitle;
 
 	// Conversation list implementation
 public:
diff --git a/indra/newview/llfloaterimsession.cpp b/indra/newview/llfloaterimsession.cpp
index d36b138c21de693f8de5ecb6dacd5af445725428..a09dc1914f3308641c23ab5c33cf7cba690a637e 100644
--- a/indra/newview/llfloaterimsession.cpp
+++ b/indra/newview/llfloaterimsession.cpp
@@ -70,6 +70,7 @@ LLFloaterIMSession::LLFloaterIMSession(const LLUUID& session_id)
 	mShouldSendTypingState(false),
 	mMeTyping(false),
 	mOtherTyping(false),
+	mSessionNameUpdatedForTyping(false),
 	mTypingTimer(),
 	mTypingTimeoutTimer(),
 	mPositioned(false),
@@ -556,6 +557,7 @@ void LLFloaterIMSession::updateSessionName(const std::string& name)
 		LLFloaterIMSessionTab::updateSessionName(name);
 		mTypingStart.setArg("[NAME]", name);
 		setTitle (mOtherTyping ? mTypingStart.getString() : name);
+		mSessionNameUpdatedForTyping = mOtherTyping;
 	}
 }
 
@@ -705,7 +707,7 @@ BOOL LLFloaterIMSession::getVisible()
 		// getVisible() returns TRUE when Tabbed IM window is minimized.
 			visible = is_active && !im_container->isMinimized()
 						&& im_container->getVisible();
-	}
+		}
 	}
 	else
 	{
diff --git a/indra/newview/llfloaterimsession.h b/indra/newview/llfloaterimsession.h
index 6a2f4b29eb78a3aaf14ea363e169b1c3685e4dd0..2049cedfd7906557957195386afbe2d507e6642a 100644
--- a/indra/newview/llfloaterimsession.h
+++ b/indra/newview/llfloaterimsession.h
@@ -132,6 +132,7 @@ class LLFloaterIMSession
 	static boost::signals2::connection setIMFloaterShowedCallback(const floater_showed_signal_t::slot_type& cb);
 	static floater_showed_signal_t sIMFloaterShowedSignal;
 
+	bool needsTitleOverwrite() { return mSessionNameUpdatedForTyping && mOtherTyping; }
 private:
 
 	/*virtual*/ void refresh();
@@ -182,6 +183,7 @@ class LLFloaterIMSession
 	bool mShouldSendTypingState;
 	LLFrameTimer mTypingTimer;
 	LLFrameTimer mTypingTimeoutTimer;
+	bool mSessionNameUpdatedForTyping;
 
 	bool mSessionInitialized;
 	LLSD mQueuedMsgsForInit;
diff --git a/indra/newview/llfloaterimsessiontab.cpp b/indra/newview/llfloaterimsessiontab.cpp
index d4eb03f95d113d5c87213d1ff432e0f68c8d00b5..06a79836db12e1afc58499101c9c912a3b6231d4 100644
--- a/indra/newview/llfloaterimsessiontab.cpp
+++ b/indra/newview/llfloaterimsessiontab.cpp
@@ -72,6 +72,12 @@ LLFloaterIMSessionTab::LLFloaterIMSessionTab(const LLSD& session_id)
 			boost::bind(&LLFloaterIMSessionTab::onIMShowModesMenuItemCheck,   this, _2));
 	mEnableCallbackRegistrar.add("IMSession.Menu.ShowModes.Enable",
 			boost::bind(&LLFloaterIMSessionTab::onIMShowModesMenuItemEnable,  this, _2));
+	mEnableCallbackRegistrar.add("Translating.Enabled",
+				boost::bind(&LLFloaterIMSessionTab::isTranslatingEnabled,  this, _2));
+	mEnableCallbackRegistrar.add("Translating.On",
+					boost::bind(&LLFloaterIMSessionTab::isTranslationOn,  this, _2));
+	mCommitCallbackRegistrar.add("Translating.Toggle",
+				boost::bind(&LLFloaterIMSessionTab::toggleTranslation,  this, _2));
 
 	// Right click menu handling
     mEnableCallbackRegistrar.add("Avatar.CheckItem",  boost::bind(&LLFloaterIMSessionTab::checkContextMenuItem,	this, _2));
@@ -552,6 +558,10 @@ void LLFloaterIMSessionTab::onIMSessionMenuItemClicked(const LLSD& userdata)
 	LLFloaterIMSessionTab::processChatHistoryStyleUpdate();
 }
 
+void LLFloaterIMSessionTab::toggleTranslation(const LLSD& userdata)
+{
+	gSavedSettings.setBOOL("TranslateChat", !gSavedSettings.getBOOL("TranslateChat"));
+}
 
 bool LLFloaterIMSessionTab::onIMCompactExpandedMenuItemCheck(const LLSD& userdata)
 {
@@ -576,6 +586,16 @@ bool LLFloaterIMSessionTab::onIMShowModesMenuItemEnable(const LLSD& userdata)
 	return (plain_text && (is_not_names || mIsP2PChat));
 }
 
+bool LLFloaterIMSessionTab::isTranslatingEnabled(const LLSD& userdata)
+{
+	return gSavedPerAccountSettings.getBOOL("TranslatingEnabled");
+}
+
+bool LLFloaterIMSessionTab::isTranslationOn(const LLSD& userdata)
+{
+	return gSavedSettings.getBOOL("TranslateChat");
+}
+
 void LLFloaterIMSessionTab::hideOrShowTitle()
 {
 	const LLFloater::Params& default_params = LLFloater::getDefaultParams();
diff --git a/indra/newview/llfloaterimsessiontab.h b/indra/newview/llfloaterimsessiontab.h
index 0fa99a46bea6d02f5a57f4b74e5e1b7e8361ed72..05da0f98bc97c7b7b5ec5fd059ead087cd1038a2 100644
--- a/indra/newview/llfloaterimsessiontab.h
+++ b/indra/newview/llfloaterimsessiontab.h
@@ -109,8 +109,12 @@ class LLFloaterIMSessionTab
 	//
 	bool onIMShowModesMenuItemCheck(const LLSD& userdata);
 	bool onIMShowModesMenuItemEnable(const LLSD& userdata);
+	bool isTranslatingEnabled(const LLSD& userdata);
+	bool isTranslationOn(const LLSD& userdata);
 	static void onSlide(LLFloaterIMSessionTab *self);
 
+	void toggleTranslation(const LLSD& userdata);
+
 	// refresh a visual state of the Call button
 	void updateCallBtnState(bool callIsActive);
 
diff --git a/indra/newview/llfloatertranslationsettings.cpp b/indra/newview/llfloatertranslationsettings.cpp
index 6a9236ce0c11deab09750e48544645bfd50f089d..33f2c352398ee31e7546632001c6ad2809583658 100644
--- a/indra/newview/llfloatertranslationsettings.cpp
+++ b/indra/newview/llfloatertranslationsettings.cpp
@@ -225,11 +225,10 @@ void LLFloaterTranslationSettings::updateControlsEnabledState()
 	mGoogleVerifyBtn->setEnabled(on && google_selected &&
 		!mGoogleKeyVerified && !getEnteredGoogleKey().empty());
 
-	mOKBtn->setEnabled(
-		!on || (
-		(bing_selected && mBingKeyVerified) ||
-		(google_selected && mGoogleKeyVerified)
-	));
+	bool service_verified = (bing_selected && mBingKeyVerified) || (google_selected && mGoogleKeyVerified);
+	gSavedPerAccountSettings.setBOOL("TranslatingEnabled", service_verified);
+
+	mOKBtn->setEnabled(!on || service_verified);
 }
 
 void LLFloaterTranslationSettings::verifyKey(int service, const std::string& key, bool alert)
@@ -285,7 +284,16 @@ void LLFloaterTranslationSettings::onBtnGoogleVerify()
 		verifyKey(LLTranslate::SERVICE_GOOGLE, key);
 	}
 }
+void LLFloaterTranslationSettings::onClose(bool app_quitting)
+{
+	std::string service = gSavedSettings.getString("TranslationService");
+	bool bing_selected = service == "bing";
+	bool google_selected = service == "google";
+
+	bool service_verified = (bing_selected && mBingKeyVerified) || (google_selected && mGoogleKeyVerified);
+	gSavedPerAccountSettings.setBOOL("TranslatingEnabled", service_verified);
 
+}
 void LLFloaterTranslationSettings::onBtnOK()
 {
 	gSavedSettings.setBOOL("TranslateChat", mMachineTranslationCB->getValue().asBoolean());
diff --git a/indra/newview/llfloatertranslationsettings.h b/indra/newview/llfloatertranslationsettings.h
index 9b47ad72ed20bc16b7300c4c999bd982768f63fc..b9bfd6265aff8f61845fd95ef8fe6dafca28f2c1 100644
--- a/indra/newview/llfloatertranslationsettings.h
+++ b/indra/newview/llfloatertranslationsettings.h
@@ -44,6 +44,7 @@ class LLFloaterTranslationSettings : public LLFloater
 
 	void setBingVerified(bool ok, bool alert);
 	void setGoogleVerified(bool ok, bool alert);
+	void onClose(bool app_quitting);
 
 private:
 	std::string getSelectedService() const;
diff --git a/indra/newview/skins/default/xui/en/menu_im_session_showmodes.xml b/indra/newview/skins/default/xui/en/menu_im_session_showmodes.xml
index 483f24afd06747aab5c66ece3b2dce11b9e02273..f2a8b39b046ba9e0b858792efd81ea59eff56ef8 100644
--- a/indra/newview/skins/default/xui/en/menu_im_session_showmodes.xml
+++ b/indra/newview/skins/default/xui/en/menu_im_session_showmodes.xml
@@ -44,7 +44,23 @@
          parameter="IMShowNamesForP2PConv" />
         <menu_item_check.on_enable
          function="IMSession.Menu.ShowModes.Enable"
-         parameter="IMShowNamesForP2PConv" />
-         
+         parameter="IMShowNamesForP2PConv" />    
     </menu_item_check>
+    <menu_item_separator layout="topleft" />
+    <menu_item_check name="Translate_chat" label="Translate chat">
+        <menu_item_check.on_click
+         function="Translating.Toggle" />
+        <menu_item_check.on_check
+         function="Translating.On" />
+        <menu_item_check.on_enable
+         function="Translating.Enabled" />
+    </menu_item_check>
+    <menu_item_check name="Translation_settings" label="Translation settings...">
+    <menu_item_check.on_check
+         function="Floater.Visible"
+         parameter="prefs_translation" />
+        <menu_item_check.on_click
+         function="Floater.Toggle"
+         parameter="prefs_translation" />
+    </menu_item_check>     
 </toggleable_menu>