diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index b0f782622ced7c21c2c3a54069dd0db7b9ff18a9..76def8120f233912473e6d61983a8bf583dcc5f5 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -1385,6 +1385,17 @@
       <key>Value</key>
       <integer>1</integer>
     </map>
+    <key>ChatWindow</key>
+    <map>
+      <key>Comment</key>
+      <string>Show chat in multiple windows(by default) or in one multi-tabbed window(requires restart)</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>S32</string>
+      <key>Value</key>
+      <integer>0</integer>
+    </map>
     <key>CheesyBeacon</key>
     <map>
       <key>Comment</key>
diff --git a/indra/newview/llimfloater.cpp b/indra/newview/llimfloater.cpp
index 5e9ffdf4100b4e529b3807e6271bf15b5874e03a..3315d5b18d80984d6e9dc86607238a5d1c16e266 100644
--- a/indra/newview/llimfloater.cpp
+++ b/indra/newview/llimfloater.cpp
@@ -44,6 +44,7 @@
 #include "llchiclet.h"
 #include "llfloaterchat.h"
 #include "llfloaterreg.h"
+#include "llimfloatercontainer.h" // to replace separate IM Floaters with multifloater container
 #include "lllineeditor.h"
 #include "lllogchat.h"
 #include "llpanelimcontrolpanel.h"
@@ -55,10 +56,6 @@
 #include "lltransientfloatermgr.h"
 #include "llinventorymodel.h"
 
-#ifdef USE_IM_CONTAINER
-	#include "llimfloatercontainer.h" // to replace separate IM Floaters with multifloater container
-#endif
-
 
 
 LLIMFloater::LLIMFloater(const LLUUID& session_id)
@@ -263,11 +260,14 @@ BOOL LLIMFloater::postBuild()
 	//*TODO if session is not initialized yet, add some sort of a warning message like "starting session...blablabla"
 	//see LLFloaterIMPanel for how it is done (IB)
 
-#ifdef USE_IM_CONTAINER
-	return LLFloater::postBuild();
-#else
-	return LLDockableFloater::postBuild();
-#endif
+	if(isChatMultiTab())
+	{
+		return LLFloater::postBuild();
+	}
+	else
+	{
+		return LLDockableFloater::postBuild();
+	}
 }
 
 // virtual
@@ -328,59 +328,72 @@ void LLIMFloater::onSlide()
 //static
 LLIMFloater* LLIMFloater::show(const LLUUID& session_id)
 {
-#ifdef USE_IM_CONTAINER
-	LLIMFloater* target_floater = findInstance(session_id);
-	bool not_existed = NULL == target_floater;
+	bool not_existed = true;
 
-#else
-	//hide all
-	LLFloaterReg::const_instance_list_t& inst_list = LLFloaterReg::getFloaterList("impanel");
-	for (LLFloaterReg::const_instance_list_t::const_iterator iter = inst_list.begin();
-		 iter != inst_list.end(); ++iter)
+	if(isChatMultiTab())
 	{
-		LLIMFloater* floater = dynamic_cast<LLIMFloater*>(*iter);
-		if (floater && floater->isDocked())
+		LLIMFloater* target_floater = findInstance(session_id);
+		not_existed = NULL == target_floater;
+	}
+	else
+	{
+		//hide all
+		LLFloaterReg::const_instance_list_t& inst_list = LLFloaterReg::getFloaterList("impanel");
+		for (LLFloaterReg::const_instance_list_t::const_iterator iter = inst_list.begin();
+			 iter != inst_list.end(); ++iter)
 		{
-			floater->setVisible(false);
+			LLIMFloater* floater = dynamic_cast<LLIMFloater*>(*iter);
+			if (floater && floater->isDocked())
+			{
+				floater->setVisible(false);
+			}
 		}
 	}
-#endif
 
 	LLIMFloater* floater = LLFloaterReg::showTypedInstance<LLIMFloater>("impanel", session_id);
 
 	floater->updateMessages();
 	floater->mInputEditor->setFocus(TRUE);
 
-#ifdef USE_IM_CONTAINER
-	// do not add existed floaters to avoid adding torn off instances
-	if (not_existed)
+	if(isChatMultiTab())
 	{
-		//		LLTabContainer::eInsertionPoint i_pt = user_initiated ? LLTabContainer::RIGHT_OF_CURRENT : LLTabContainer::END;
-		// TODO: mantipov: use LLTabContainer::RIGHT_OF_CURRENT if it exists
-		LLTabContainer::eInsertionPoint i_pt = LLTabContainer::END;
+		// do not add existed floaters to avoid adding torn off instances
+		if (not_existed)
+		{
+			//		LLTabContainer::eInsertionPoint i_pt = user_initiated ? LLTabContainer::RIGHT_OF_CURRENT : LLTabContainer::END;
+			// TODO: mantipov: use LLTabContainer::RIGHT_OF_CURRENT if it exists
+			LLTabContainer::eInsertionPoint i_pt = LLTabContainer::END;
 
-		LLIMFloaterContainer* floater_container = LLFloaterReg::showTypedInstance<LLIMFloaterContainer>("im_container");
-		floater_container->addFloater(floater, TRUE, i_pt);
+			LLIMFloaterContainer* floater_container = LLFloaterReg::showTypedInstance<LLIMFloaterContainer>("im_container");
+			floater_container->addFloater(floater, TRUE, i_pt);
+		}
 	}
-#else
-	if (floater->getDockControl() == NULL)
+	else
 	{
-		LLChiclet* chiclet =
-				LLBottomTray::getInstance()->getChicletPanel()->findChiclet<LLChiclet>(
-						session_id);
-		if (chiclet == NULL)
-		{
-			llerror("Dock chiclet for LLIMFloater doesn't exists", 0);
-		}
-		else
+		// Docking may move chat window, hide it before moving, or user will see how window "jumps"
+		floater->setVisible(false);
+
+		if (floater->getDockControl() == NULL)
 		{
-			LLBottomTray::getInstance()->getChicletPanel()->scrollToChiclet(chiclet);
+			LLChiclet* chiclet =
+					LLBottomTray::getInstance()->getChicletPanel()->findChiclet<LLChiclet>(
+							session_id);
+			if (chiclet == NULL)
+			{
+				llerror("Dock chiclet for LLIMFloater doesn't exists", 0);
+			}
+			else
+			{
+				LLBottomTray::getInstance()->getChicletPanel()->scrollToChiclet(chiclet);
+			}
+
+			floater->setDockControl(new LLDockControl(chiclet, floater, floater->getDockTongue(),
+					LLDockControl::TOP,  boost::bind(&LLIMFloater::getAllowedRect, floater, _1)));
 		}
 
-		floater->setDockControl(new LLDockControl(chiclet, floater, floater->getDockTongue(),
-				LLDockControl::TOP,  boost::bind(&LLIMFloater::getAllowedRect, floater, _1)));
+		// window is positioned, now we can show it.
+		floater->setVisible(true);
 	}
-#endif
 
 	return floater;
 }
@@ -397,9 +410,10 @@ void LLIMFloater::setDocked(bool docked, bool pop_on_undock)
 		(LLNotificationsUI::LLChannelManager::getInstance()->
 											findChannelByID(LLUUID(gSavedSettings.getString("NotificationChannelUUID"))));
 	
-#ifndef USE_IM_CONTAINER
-	LLTransientDockableFloater::setDocked(docked, pop_on_undock);
-#endif
+	if(!isChatMultiTab())
+	{
+		LLTransientDockableFloater::setDocked(docked, pop_on_undock);
+	}
 
 	// update notification channel state
 	if(channel)
@@ -425,28 +439,27 @@ void LLIMFloater::setVisible(BOOL visible)
 //static
 bool LLIMFloater::toggle(const LLUUID& session_id)
 {
-#ifndef USE_IM_CONTAINER
-	LLIMFloater* floater = LLFloaterReg::findTypedInstance<LLIMFloater>("impanel", session_id);
-	if (floater && floater->getVisible() && floater->isDocked())
+	if(!isChatMultiTab())
 	{
-		// clicking on chiclet to close floater just hides it to maintain existing
-		// scroll/text entry state
-		floater->setVisible(false);
-		return false;
-	}
-	else if(floater && !floater->isDocked())
-	{
-		floater->setVisible(TRUE);
-		floater->setFocus(TRUE);
-		return true;
-	}
-	else
-#endif
-	{
-		// ensure the list of messages is updated when floater is made visible
-		show(session_id);
-		return true;
+		LLIMFloater* floater = LLFloaterReg::findTypedInstance<LLIMFloater>("impanel", session_id);
+		if (floater && floater->getVisible() && floater->isDocked())
+		{
+			// clicking on chiclet to close floater just hides it to maintain existing
+			// scroll/text entry state
+			floater->setVisible(false);
+			return false;
+		}
+		else if(floater && !floater->isDocked())
+		{
+			floater->setVisible(TRUE);
+			floater->setFocus(TRUE);
+			return true;
+		}
 	}
+
+	// ensure the list of messages is updated when floater is made visible
+	show(session_id);
+	return true;
 }
 
 //static
@@ -892,3 +905,18 @@ void LLIMFloater::removeTypingIndicator(const LLIMInfo* im_info)
 	}
 }
 
+// static
+bool LLIMFloater::isChatMultiTab()
+{
+	// Restart is required in order to change chat window type.
+	static bool is_single_window = gSavedSettings.getS32("ChatWindow") == 1;
+	return is_single_window;
+}
+
+// static
+void LLIMFloater::initIMFloater()
+{
+	// This is called on viewer start up
+	// init chat window type before user changed it in preferences
+	isChatMultiTab();
+}
diff --git a/indra/newview/llimfloater.h b/indra/newview/llimfloater.h
index 9e1330ff497ea4112b9cc0b72b18c697e9858862..2c762c4d9ab913b8684c9bc6aa7e963e5a8e8af2 100644
--- a/indra/newview/llimfloater.h
+++ b/indra/newview/llimfloater.h
@@ -33,11 +33,6 @@
 #ifndef LL_IMFLOATER_H
 #define LL_IMFLOATER_H
 
-// This variable is used to show floaters related to chiclets in a Multi Floater Container
-// So, this functionality does not require to have IM Floaters as Dockable & Transient
-// See EXT-2640.
-#define USE_IM_CONTAINER
-
 #include "lltransientdockablefloater.h"
 #include "lllogchat.h"
 #include "lltooldraganddrop.h"
@@ -105,6 +100,14 @@ class LLIMFloater : public LLTransientDockableFloater
 							   void *cargo_data, EAcceptance *accept,
 							   std::string& tooltip_msg);
 
+	/**
+	 * Returns true if chat is displayed in multi tabbed floater
+	 *         false if chat is displayed in multiple windows
+	 */
+	static bool isChatMultiTab();
+
+	static void initIMFloater();
+
 private:
 	// process focus events to set a currently active session
 	/* virtual */ void onFocusLost();
diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp
index db8bda008ebdb5b9c29a4d909eda88a6cd00273d..7f68c2e8f4fb235dd5ee7e8c778874d8ccb04f50 100644
--- a/indra/newview/llstartup.cpp
+++ b/indra/newview/llstartup.cpp
@@ -59,6 +59,7 @@
 #include "llfloaterreg.h"
 #include "llfocusmgr.h"
 #include "llhttpsender.h"
+#include "llimfloater.h"
 #include "lllocationhistory.h"
 #include "llimageworker.h"
 #include "llloginflags.h"
@@ -2085,6 +2086,8 @@ bool idle_startup()
 
 		LLAgentPicksInfo::getInstance()->requestNumberOfPicks();
 
+		LLIMFloater::initIMFloater();
+
 		return TRUE;
 	}
 
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_chat.xml b/indra/newview/skins/default/xui/en/panel_preferences_chat.xml
index fac0d5c60f0521a0b354bd72e2f87cac15a62bc2..3aa5d3fae423046223c9fdada0caf67f7f5dcee7 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_chat.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_chat.xml
@@ -318,4 +318,37 @@
      name="plain_text_chat_history"
      top_pad="5"
      width="400" />
+    <text
+     left="30"
+     height="20"
+     width="300"
+     top_pad="20">
+     Show IMs in:
+    </text>
+    <radio_group
+     height="30"
+     layout="topleft"
+     left="30"
+     control_name="ChatWindow"
+     name="chat_window"
+     top_pad="10"
+     tool_tip="Show chat in multiple windows(by default) or in one multi-tabbed window (requires restart)"
+     width="331">
+     <radio_item
+      height="16"
+      label="Multiple windows"
+      layout="topleft"
+      left="0"
+      name="radio"
+      top="0"
+      width="150" />
+     <radio_item
+      height="16"
+      label="One window"
+      layout="topleft"
+      left_delta="145"
+      name="radio2"
+      top_delta="0"
+      width="150" />
+    </radio_group>
 </panel>