diff --git a/indra/llui/lllayoutstack.h b/indra/llui/lllayoutstack.h
index d32caec5f92ac3a40a5c3c7237624264c71e1b93..58643868e8d3ae92948abfd9587e5e5e4fc12136 100644
--- a/indra/llui/lllayoutstack.h
+++ b/indra/llui/lllayoutstack.h
@@ -177,6 +177,8 @@ friend class LLUICtrlFactory;
 	F32 getVisibleAmount() const;
 	S32 getVisibleDim() const;
 
+	bool isCollapsed() const { return mCollapsed;}
+
 	void setOrientation(LLLayoutStack::ELayoutOrientation orientation);
 	void storeOriginalDim();
 
diff --git a/indra/llui/llmultifloater.cpp b/indra/llui/llmultifloater.cpp
index f3a48835b1ecb8cc282871145d5a26178f0a6adc..540ac74aee740a2ae00233c95e72bb54e9613add 100644
--- a/indra/llui/llmultifloater.cpp
+++ b/indra/llui/llmultifloater.cpp
@@ -468,23 +468,12 @@ BOOL LLMultiFloater::postBuild()
 
 void LLMultiFloater::updateResizeLimits()
 {
-	static LLUICachedControl<S32> tabcntr_close_btn_size ("UITabCntrCloseBtnSize", 0);
-	const LLFloater::Params& default_params = LLFloater::getDefaultParams();
-	S32 floater_header_size = default_params.header_height;
-	S32 tabcntr_header_height = LLPANEL_BORDER_WIDTH + tabcntr_close_btn_size;
 	// initialize minimum size constraint to the original xml values.
 	S32 new_min_width = mOrigMinWidth;
 	S32 new_min_height = mOrigMinHeight;
-	// possibly increase minimum size constraint due to children's minimums.
-	for (S32 tab_idx = 0; tab_idx < mTabContainer->getTabCount(); ++tab_idx)
-	{
-		LLFloater* floaterp = (LLFloater*)mTabContainer->getPanelByIndex(tab_idx);
-		if (floaterp)
-		{
-			new_min_width = llmax(new_min_width, floaterp->getMinWidth() + LLPANEL_BORDER_WIDTH * 2);
-			new_min_height = llmax(new_min_height, floaterp->getMinHeight() + floater_header_size + tabcntr_header_height);
-		}
-	}
+
+	computeResizeLimits(new_min_width, new_min_height);
+
 	setResizeLimits(new_min_width, new_min_height);
 
 	S32 cur_height = getRect().getHeight();
@@ -510,3 +499,22 @@ void LLMultiFloater::updateResizeLimits()
 		gFloaterView->adjustToFitScreen(this, TRUE);
 	}
 }
+
+void LLMultiFloater::computeResizeLimits(S32& new_min_width, S32& new_min_height)
+{
+	static LLUICachedControl<S32> tabcntr_close_btn_size ("UITabCntrCloseBtnSize", 0);
+	const LLFloater::Params& default_params = LLFloater::getDefaultParams();
+	S32 floater_header_size = default_params.header_height;
+	S32 tabcntr_header_height = LLPANEL_BORDER_WIDTH + tabcntr_close_btn_size;
+
+	// possibly increase minimum size constraint due to children's minimums.
+	for (S32 tab_idx = 0; tab_idx < mTabContainer->getTabCount(); ++tab_idx)
+	{
+		LLFloater* floaterp = (LLFloater*)mTabContainer->getPanelByIndex(tab_idx);
+		if (floaterp)
+		{
+			new_min_width = llmax(new_min_width, floaterp->getMinWidth() + LLPANEL_BORDER_WIDTH * 2);
+			new_min_height = llmax(new_min_height, floaterp->getMinHeight() + floater_header_size + tabcntr_header_height);
+		}
+	}
+}
diff --git a/indra/llui/llmultifloater.h b/indra/llui/llmultifloater.h
index 9fa917eca1883325d3cc8377a0b0e937137bfef9..f299ae5dd323e0cc037655de041a94895541604d 100644
--- a/indra/llui/llmultifloater.h
+++ b/indra/llui/llmultifloater.h
@@ -93,6 +93,9 @@ class LLMultiFloater : public LLFloater
 	LLTabContainer::TabPosition mTabPos;
 	BOOL				mAutoResize;
 	S32					mOrigMinWidth, mOrigMinHeight;  // logically const but initialized late
+
+private:
+	virtual void computeResizeLimits(S32& new_min_width, S32& new_min_height);
 };
 
 #endif  // LL_MULTI_FLOATER_H
diff --git a/indra/newview/app_settings/settings_per_account.xml b/indra/newview/app_settings/settings_per_account.xml
index 8cdd8ed838084dce4e1ff7a53f6fe2fa945d5d3b..fdc52b739413a909bcdd141bcdb5739c8badbefd 100644
--- a/indra/newview/app_settings/settings_per_account.xml
+++ b/indra/newview/app_settings/settings_per_account.xml
@@ -22,6 +22,61 @@
         <key>Value</key>
             <string>The Resident you messaged is in &apos;busy mode&apos; which means they have requested not to be disturbed.  Your message will still be shown in their IM panel for later viewing.</string>
         </map>
+    <key>ConversationsExpandMessagePaneFirst</key>
+    <map>
+        <key>Comment</key>
+            <string>Expand either messages or conversations list pane from Conversations compact mode.</string>
+        <key>Persist</key>
+            <integer>1</integer>
+        <key>Type</key>
+            <string>Boolean</string>
+        <key>Value</key>
+            <integer>1</integer>
+    </map>
+    <key>ConversationsListPaneCollapsed</key>
+    <map>
+        <key>Comment</key>
+            <string>Stores the expanded/collapsed state of the conversations list pane in Conversations floater.</string>
+        <key>Persist</key>
+            <integer>1</integer>
+        <key>Type</key>
+            <string>Boolean</string>
+        <key>Value</key>
+            <integer>0</integer>
+    </map>
+    <key>ConversationsListPaneWidth</key>
+    <map>
+        <key>Comment</key>
+            <string>Conversations floater list pane width.</string>
+        <key>Persist</key>
+            <integer>1</integer>
+        <key>Type</key>
+            <string>S32</string>
+        <key>Value</key>
+            <integer>268</integer>
+    </map>
+    <key>ConversationsMessagePaneCollapsed</key>
+    <map>
+        <key>Comment</key>
+            <string>Stores the expanded/collapsed state of Conversations floater message pane.</string>
+        <key>Persist</key>
+            <integer>1</integer>
+        <key>Type</key>
+            <string>Boolean</string>
+        <key>Value</key>
+            <integer>0</integer>
+    </map>
+    <key>ConversationsMessagePaneWidth</key>
+    <map>
+        <key>Comment</key>
+            <string>Conversations floater message pane width.</string>
+        <key>Persist</key>
+            <integer>1</integer>
+        <key>Type</key>
+            <string>S32</string>
+        <key>Value</key>
+            <integer>412</integer>
+    </map>
     <key>InstantMessageLogPath</key>
         <map>
         <key>Comment</key>
diff --git a/indra/newview/llimfloater.cpp b/indra/newview/llimfloater.cpp
index 1ca3545aae7761dd30b86d8c61caedc55444c6f2..051bb395401266b4aade9226b3fc950dd86e978e 100644
--- a/indra/newview/llimfloater.cpp
+++ b/indra/newview/llimfloater.cpp
@@ -188,7 +188,7 @@ void LLIMFloater::onOpen(const LLSD& key)
 	if (host_floater)
 	{
 		// Show the messages pane when opening a floater hosted in the Conversations
-		host_floater->toggleMessagesPane(true);
+		host_floater->collapseMessagesPane(false);
 	}
 }
 
@@ -536,7 +536,7 @@ void LLIMFloater::onSlide()
 	if (host_floater)
 	{
 		// Hide the messages pane if a floater is hosted in the Conversations
-		host_floater->toggleMessagesPane(false);
+		host_floater->collapseMessagesPane(true);
 	}
 	else ///< floater is torn off
 	{
diff --git a/indra/newview/llimfloatercontainer.cpp b/indra/newview/llimfloatercontainer.cpp
index c8b8cb208d4d3fd63ba3d4d5198335b0bcf64866..b051440589475060566eb54a21edada0053cb232 100644
--- a/indra/newview/llimfloatercontainer.cpp
+++ b/indra/newview/llimfloatercontainer.cpp
@@ -28,19 +28,23 @@
 #include "llviewerprecompiledheaders.h"
 
 #include "llimfloatercontainer.h"
+
 #include "llfloaterreg.h"
-#include "llimview.h"
+#include "lllayoutstack.h"
+
+#include "llagent.h"
 #include "llavatariconctrl.h"
 #include "llgroupiconctrl.h"
-#include "llagent.h"
+#include "llimview.h"
 #include "lltransientfloatermgr.h"
+#include "llviewercontrol.h"
 
 //
 // LLIMFloaterContainer
 //
 LLIMFloaterContainer::LLIMFloaterContainer(const LLSD& seed)
 :	LLMultiFloater(seed)
-    ,mMessagesPaneWidth(0)
+	,mExpandCollapseBtn(NULL)
 {
 	mAutoResize = FALSE;
 	LLTransientFloaterMgr::getInstance()->addControlView(LLTransientFloaterMgr::IM, this);
@@ -50,6 +54,9 @@ LLIMFloaterContainer::~LLIMFloaterContainer()
 {
 	mNewMessageConnection.disconnect();
 	LLTransientFloaterMgr::getInstance()->removeControlView(LLTransientFloaterMgr::IM, this);
+
+	gSavedPerAccountSettings.setBOOL("ConversationsListPaneCollapsed", mConversationsPane->isCollapsed());
+	gSavedPerAccountSettings.setBOOL("ConversationsMessagePaneCollapsed", mMessagesPane->isCollapsed());
 }
 
 BOOL LLIMFloaterContainer::postBuild()
@@ -60,6 +67,16 @@ BOOL LLIMFloaterContainer::postBuild()
 	
 	setTabContainer(getChild<LLTabContainer>("im_box_tab_container"));
 
+	mConversationsStack = getChild<LLLayoutStack>("conversations_stack");
+	mConversationsPane = getChild<LLLayoutPanel>("conversations_layout_panel");
+	mMessagesPane = getChild<LLLayoutPanel>("messages_layout_panel");
+
+	mExpandCollapseBtn = getChild<LLButton>("expand_collapse_btn");
+	mExpandCollapseBtn->setClickedCallback(boost::bind(&LLIMFloaterContainer::onExpandCollapseButtonClicked, this));
+
+	collapseMessagesPane(gSavedPerAccountSettings.getBOOL("ConversationsMessagePaneCollapsed"));
+	collapseConversationsPane(gSavedPerAccountSettings.getBOOL("ConversationsListPaneCollapsed"));
+
 	return TRUE;
 }
 
@@ -146,6 +163,37 @@ void LLIMFloaterContainer::onCloseFloater(LLUUID& id)
 	mSessions.erase(id);
 }
 
+// virtual
+void LLIMFloaterContainer::computeResizeLimits(S32& new_min_width, S32& new_min_height)
+{
+	bool is_left_pane_expanded = !mConversationsPane->isCollapsed();
+	bool is_right_pane_expanded = !mMessagesPane->isCollapsed();
+
+	S32 conversations_pane_min_dim = mConversationsPane->getMinDim();
+
+	if (is_right_pane_expanded)
+	{
+		S32 conversations_pane_width =
+				(is_left_pane_expanded ? gSavedPerAccountSettings.getS32("ConversationsListPaneWidth") : conversations_pane_min_dim);
+
+		// possibly increase minimum size constraint due to children's minimums.
+		for (S32 tab_idx = 0; tab_idx < mTabContainer->getTabCount(); ++tab_idx)
+		{
+			LLFloater* floaterp = dynamic_cast<LLFloater*>(mTabContainer->getPanelByIndex(tab_idx));
+			if (floaterp)
+			{
+				new_min_width = llmax(new_min_width,
+						floaterp->getMinWidth() + conversations_pane_width + LLPANEL_BORDER_WIDTH * 2);
+				new_min_height = llmax(new_min_height, floaterp->getMinHeight());
+			}
+		}
+	}
+	else
+	{
+		new_min_width = conversations_pane_min_dim;
+	}
+}
+
 void LLIMFloaterContainer::onNewMessageReceived(const LLSD& data)
 {
 	LLUUID session_id = data["session_id"].asUUID();
@@ -160,6 +208,21 @@ void LLIMFloaterContainer::onNewMessageReceived(const LLSD& data)
 	}
 }
 
+void LLIMFloaterContainer::onExpandCollapseButtonClicked()
+{
+	if (mConversationsPane->isCollapsed() && mMessagesPane->isCollapsed()
+			&& gSavedPerAccountSettings.getBOOL("ConversationsExpandMessagePaneFirst"))
+	{
+		// Expand the messages pane from ultra minimized state
+		// if it was collapsed last in order.
+		collapseMessagesPane(false);
+	}
+	else
+	{
+		collapseConversationsPane(!mConversationsPane->isCollapsed());
+	}
+}
+
 LLIMFloaterContainer* LLIMFloaterContainer::findInstance()
 {
 	return LLFloaterReg::findTypedInstance<LLIMFloaterContainer>("im_container");
@@ -186,29 +249,67 @@ void LLIMFloaterContainer::setMinimized(BOOL b)
 	}
 }
 
-void LLIMFloaterContainer::toggleMessagesPane(bool expand)
+void LLIMFloaterContainer::collapseMessagesPane(bool collapse)
 {
-	LLView* messages_pane = getChild<LLView>("im_box_tab_container");
-	bool is_expanded = messages_pane->getVisible();
-	if (is_expanded == expand)
+	if (mMessagesPane->isCollapsed() == collapse)
 	{
 		return;
 	}
 
-	// Store the messages pane width before collapsing it.
-	if (!expand)
+	if (collapse)
 	{
-		LLView* conversations_pane = getChild<LLView>("conversations_pane");
-		S32 horizontal_pad = messages_pane->getRect().mLeft - conversations_pane->getRect().mRight;
-		mMessagesPaneWidth = messages_pane->getRect().getWidth() + horizontal_pad;
+		// Save the messages pane width before collapsing it.
+		gSavedPerAccountSettings.setS32("ConversationsMessagePaneWidth", mMessagesPane->getRect().getWidth());
+
+		// Save the order in which the panels are closed to reverse user's last action.
+		gSavedPerAccountSettings.setBOOL("ConversationsExpandMessagePaneFirst", mConversationsPane->isCollapsed());
 	}
 
 	// Show/hide the messages pane.
-	messages_pane->setVisible(expand);
+	mConversationsStack->collapsePanel(mMessagesPane, collapse);
+
+	updateState(collapse, gSavedPerAccountSettings.getS32("ConversationsMessagePaneWidth"));
+}
+
+void LLIMFloaterContainer::collapseConversationsPane(bool collapse)
+{
+	if (mConversationsPane->isCollapsed() == collapse)
+	{
+		return;
+	}
+
+	LLView* button_panel = getChild<LLView>("conversations_pane_buttons_expanded");
+	button_panel->setVisible(!collapse);
+	mExpandCollapseBtn->setImageOverlay(getString(collapse ? "expand_icon" : "collapse_icon"));
+
+	if (collapse)
+	{
+		// Save the conversations pane width before collapsing it.
+		gSavedPerAccountSettings.setS32("ConversationsListPaneWidth", mConversationsPane->getRect().getWidth());
+
+		// Save the order in which the panels are closed to reverse user's last action.
+		gSavedPerAccountSettings.setBOOL("ConversationsExpandMessagePaneFirst", !mMessagesPane->isCollapsed());
+	}
+
+	mConversationsStack->collapsePanel(mConversationsPane, collapse);
+
+	S32 collapsed_width = mConversationsPane->getMinDim();
+	updateState(collapse, gSavedPerAccountSettings.getS32("ConversationsListPaneWidth") - collapsed_width);
+}
+
+void LLIMFloaterContainer::updateState(bool collapse, S32 delta_width)
+{
+	LLRect floater_rect = getRect();
+	floater_rect.mRight += ((collapse ? -1 : 1) * delta_width);
+	setShape(floater_rect);
+
+	updateResizeLimits();
+
+	bool is_left_pane_expanded = !mConversationsPane->isCollapsed();
+	bool is_right_pane_expanded = !mMessagesPane->isCollapsed();
 
-	S32 floater_width = getRect().getWidth();
-	floater_width += (expand ? mMessagesPaneWidth : -mMessagesPaneWidth);
-	reshape(floater_width, getRect().getHeight());
+	setCanResize(is_left_pane_expanded || is_right_pane_expanded);
+	setCanMinimize(is_left_pane_expanded || is_right_pane_expanded);
 }
 
 // EOF
diff --git a/indra/newview/llimfloatercontainer.h b/indra/newview/llimfloatercontainer.h
index 045f053b1c5de800e6658f669cbd063770207c56..92938ff4052663d23148ead5041c7303ae52ce7f 100644
--- a/indra/newview/llimfloatercontainer.h
+++ b/indra/newview/llimfloatercontainer.h
@@ -35,6 +35,9 @@
 #include "llavatarpropertiesprocessor.h"
 #include "llgroupmgr.h"
 
+class LLButton;
+class LLLayoutPanel;
+class LLLayoutStack;
 class LLTabContainer;
 
 class LLIMFloaterContainer : public LLMultiFloater
@@ -60,16 +63,27 @@ class LLIMFloaterContainer : public LLMultiFloater
 
 	virtual void setMinimized(BOOL b);
 
-	void toggleMessagesPane(bool expand);
+	void collapseMessagesPane(bool collapse);
 
 private:
 	typedef std::map<LLUUID,LLFloater*> avatarID_panel_map_t;
 	avatarID_panel_map_t mSessions;
 	boost::signals2::connection mNewMessageConnection;
 
+	/*virtual*/ void computeResizeLimits(S32& new_min_width, S32& new_min_height);
+
 	void onNewMessageReceived(const LLSD& data);
 
-	S32	mMessagesPaneWidth;
+	void onExpandCollapseButtonClicked();
+
+	void collapseConversationsPane(bool collapse);
+
+	void updateState(bool collapse, S32 delta_width);
+
+	LLButton* mExpandCollapseBtn;
+	LLLayoutPanel* mMessagesPane;
+	LLLayoutPanel* mConversationsPane;
+	LLLayoutStack* mConversationsStack;
 };
 
 #endif // LL_LLIMFLOATERCONTAINER_H
diff --git a/indra/newview/skins/default/xui/en/floater_im_container.xml b/indra/newview/skins/default/xui/en/floater_im_container.xml
index 8a0181bae472dce8f2582a11a44cb68eb591ab95..ce40f44a647157e05333f590ddbf412fcd622630 100644
--- a/indra/newview/skins/default/xui/en/floater_im_container.xml
+++ b/indra/newview/skins/default/xui/en/floater_im_container.xml
@@ -5,7 +5,7 @@
  can_resize="true"
  height="430"
  layout="topleft"
- min_width="510"
+ min_height="50"
  name="floater_im_box"
  help_topic="floater_im_box"
  save_rect="true"
@@ -13,62 +13,110 @@
  single_instance="true"
  title="CONVERSATIONS"
  width="680">
-    <panel
-         border="true"
-         follows="top|bottom|left"
-         layout="topleft"
-         name="conversations_pane"
-         opaque="true"
-         top="0"
-         left="5"
-         height="425"
-         width="263">
-             <menu_button
-                 follows="top|left"
-                 height="25"
-                 image_hover_unselected="Toolbar_Middle_Over"
-                 image_overlay="OptionsMenu_Off"
-                 image_selected="Toolbar_Middle_Selected"
-                 image_unselected="Toolbar_Middle_Off"
-                 layout="topleft"
-                 left="5"
-                 name="sort_btn"
-                 top="5"
-                 width="31" />
-             <button
-                 follows="top|left"
-                 height="25"
-                 image_hover_unselected="Toolbar_Middle_Over"
-                 image_overlay="AddItem_Off"
-                 image_selected="Toolbar_Middle_Selected"
-             	 image_unselected="Toolbar_Middle_Off"
-                 layout="topleft"
-                 top="5"
-                 left_pad="4"
-                 name="add_btn"
-                 tool_tip="Add button on the left panel"
-                 width="31">
-             </button>
-             <button
-                 follows="right|top"
-                 height="25"
-                 image_hover_unselected="Toolbar_Middle_Over"
-                 image_overlay="TabIcon_Open_Off"
-                 image_selected="Toolbar_Middle_Selected"
-                 image_unselected="Toolbar_Middle_Off"
-                 layout="topleft"
-                 top="5"
-                 left="228"
-                 name="expand_collapse_btn"
-                 width="31" />
-    </panel>
-    <panel_container
+    <string
+     name="collapse_icon"
+     value="TabIcon_Open_Off"/>
+    <string
+     name="expand_icon"
+     value="TabIcon_Close_Off"/>
+    <layout_stack
+     animate="true" 
      follows="all"
      height="430"
      layout="topleft"
-     left_pad="15"
-     min_width="290"
-     name="im_box_tab_container"
+     left="0"
+     name="conversations_stack"
+     orientation="horizontal"
      top="0"
-     width="389"/>
+     width="680">
+        <layout_panel
+         auto_resize="true"
+         height="430"
+         name="conversations_layout_panel"
+         min_dim="41"
+         width="268">
+            <layout_stack
+             animate="false" 
+             follows="left|top|right"
+             height="35"
+             layout="topleft"
+             left="0"
+             name="conversations_pane_buttons_stack"
+             orientation="horizontal"
+             top="0"
+             width="268">
+                <layout_panel
+                 auto_resize="true"
+                 height="35"
+                 name="conversations_pane_buttons_expanded">
+                    <menu_button
+                     follows="top|left"
+                     height="25"
+                     image_hover_unselected="Toolbar_Middle_Over"
+                     image_overlay="OptionsMenu_Off"
+                     image_selected="Toolbar_Middle_Selected"
+                     image_unselected="Toolbar_Middle_Off"
+                     layout="topleft"
+                     left="10"
+                     name="sort_btn"
+                     top="5"
+                     width="31" />
+                    <button
+                     follows="top|left"
+                     height="25"
+                     image_hover_unselected="Toolbar_Middle_Over"
+                     image_overlay="AddItem_Off"
+                     image_selected="Toolbar_Middle_Selected"
+                      image_unselected="Toolbar_Middle_Off"
+                     layout="topleft"
+                     top="5"
+                     left_pad="4"
+                     name="add_btn"
+                     tool_tip="Add button on the left panel"
+                     width="31"/>
+                </layout_panel>
+                <layout_panel
+                 auto_resize="false"
+                 height="35"
+                 name="conversations_pane_buttons_collapsed"
+                 width="41">
+                    <button
+                     follows="right|top"
+                     height="25"
+                     image_hover_unselected="Toolbar_Middle_Over"
+                     image_overlay="TabIcon_Open_Off"
+                     image_selected="Toolbar_Middle_Selected"
+                     image_unselected="Toolbar_Middle_Off"
+                     layout="topleft"
+                     top="5"
+                     left="5"
+                     name="expand_collapse_btn"
+                     width="31" />
+                </layout_panel>
+            </layout_stack>
+            <panel
+             follows="all"
+             layout="topleft"
+             name="conversations_list_panel"
+             opaque="true"
+             top_pad="0"
+             left="5"
+             height="390"
+             width="263"/>
+        </layout_panel>
+        <layout_panel
+         auto_resize="true"
+         height="430"
+         name="messages_layout_panel"
+         width="412">
+            <panel_container
+             follows="all"
+             height="430"
+             layout="topleft"
+             left="10"
+             name="im_box_tab_container"
+             top="0"
+             width="402"/>
+        </layout_panel>
+    </layout_stack>
 </multi_floater>