diff --git a/.hgtags b/.hgtags
index fdfa29210f7e5277ee70df935b366258d5969d9c..1e97bd34c0a42411e9b6c51b353c8fc72050d2f3 100755
--- a/.hgtags
+++ b/.hgtags
@@ -427,3 +427,7 @@ a49c715243a36a8a380504d14cb7416b3039c956 3.4.5-release
 c6b3561c7d7ad365eeba669db54eb57b5149ce75 3.5.0-beta2
 6d91ffd77bf2a20f18a2175eb7579da880ae12ac DRTVWR-302
 f6ca5bb75bca975ff0bc77e71e615f6478c4559c 3.5.0-beta3
+910b5fad950e343b58229f5a0aefa7729b9308b3 DRTVWR-303
+53cffdde0b3cc367ba9bb6abd5c83ae14df5e882 3.5.0-beta4
+4d5f6234dc59a0fb6ead5e02c7d343a0610e0488 DRTVWR-304
+dd058a6093c493120d67c8e02c812c0f7b2d3db0 3.5.0-beta5
diff --git a/indra/llrender/llgl.cpp b/indra/llrender/llgl.cpp
index 58bd346c15a5cbc0b3f78b654e567b8d7437ca60..faed0b3a155ef2a1544d55169cc6cfd82df2dd21 100644
--- a/indra/llrender/llgl.cpp
+++ b/indra/llrender/llgl.cpp
@@ -603,11 +603,6 @@ bool LLGLManager::initGL()
 	if (mGLVendor.substr(0,4) == "ATI ")
 	{
 		mGLVendorShort = "ATI";
-		BOOL mobile = FALSE;
-		if (mGLRenderer.find("MOBILITY") != std::string::npos)
-		{
-			mobile = TRUE;
-		}
 		mIsATI = TRUE;
 
 #if LL_WINDOWS && !LL_MESA_HEADLESS
@@ -1502,9 +1497,7 @@ void assert_glerror()
 
 void clear_glerror()
 {
-	//  Create or update texture to be used with this data 
-	GLenum error;
-	error = glGetError();
+	glGetError();
 }
 
 ///////////////////////////////////////////////////////////////
diff --git a/indra/llui/lltabcontainer.cpp b/indra/llui/lltabcontainer.cpp
index 0c43a571b8ca7399adf800d11da0419bdeef575c..6f895ed939a54dc369d2be2a400127f1d0a5c6d4 100644
--- a/indra/llui/lltabcontainer.cpp
+++ b/indra/llui/lltabcontainer.cpp
@@ -1483,16 +1483,22 @@ BOOL LLTabContainer::setTab(S32 which)
 		for(tuple_list_t::iterator iter = mTabList.begin(); iter != mTabList.end(); ++iter)
 		{
 			LLTabTuple* tuple = *iter;
-			if (!tuple)
-				continue;
 			BOOL is_selected = ( tuple == selected_tuple );
-			tuple->mButton->setUseEllipses(mUseTabEllipses);
-			tuple->mButton->setHAlign(mFontHalign);
-			tuple->mTabPanel->setVisible( is_selected );
-// 			tuple->mTabPanel->setFocus(is_selected); // not clear that we want to do this here.
-			tuple->mButton->setToggleState( is_selected );
-			// RN: this limits tab-stops to active button only, which would require arrow keys to switch tabs
-			tuple->mButton->setTabStop( is_selected );
+            
+            // Although the selected tab must be complete, we may have hollow LLTabTuple tucked in the list
+            if (tuple->mButton)
+            {
+                tuple->mButton->setUseEllipses(mUseTabEllipses);
+                tuple->mButton->setHAlign(mFontHalign);
+                tuple->mButton->setToggleState( is_selected );
+                // RN: this limits tab-stops to active button only, which would require arrow keys to switch tabs
+                tuple->mButton->setTabStop( is_selected );
+            }
+            if (tuple->mTabPanel)
+            {
+                tuple->mTabPanel->setVisible( is_selected );
+                //tuple->mTabPanel->setFocus(is_selected); // not clear that we want to do this here.
+            }
 			
 			if (is_selected)
 			{
@@ -1563,8 +1569,7 @@ BOOL LLTabContainer::selectTabByName(const std::string& name)
 	LLPanel* panel = getPanelByName(name);
 	if (!panel)
 	{
-		llwarns << "LLTabContainer::selectTabByName("
-			<< name << ") failed" << llendl;
+		llwarns << "LLTabContainer::selectTabByName(" << name << ") failed" << llendl;
 		return FALSE;
 	}
 
diff --git a/indra/llui/lltoolbar.cpp b/indra/llui/lltoolbar.cpp
index eb6b2fc56a73331dbbd5e03817b2a93c16da290c..8f7a4ab62f4d0e4b78d099b59d5c53de7e2165fc 100644
--- a/indra/llui/lltoolbar.cpp
+++ b/indra/llui/lltoolbar.cpp
@@ -1057,10 +1057,9 @@ BOOL LLToolBar::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
 	// Convert drag position into insert position and rank 
 	if (!isReadOnly() && handled && !drop)
 	{
-		LLInventoryItem* inv_item = (LLInventoryItem*)cargo_data;
-		LLAssetType::EType type = inv_item->getType();
-		if (type == LLAssetType::AT_WIDGET)
+		if (cargo_type == DAD_WIDGET)
 		{
+			LLInventoryItem* inv_item = (LLInventoryItem*)cargo_data;
 			LLCommandId dragged_command(inv_item->getUUID());
 			int orig_rank = getRankFromPosition(dragged_command);
 			mDragRank = getRankFromPosition(x, y);
diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index 21c278fd3bb29706f2c2dc8bd2af2c857bf3d270..384e83a2a0a5f573136877b6202b225e3fc707af 100755
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -1716,17 +1716,6 @@
       <key>Value</key>
       <integer>131073</integer>
     </map>
-    <key>NearbyChatIsNotTornOff</key>
-    <map>
-      <key>Comment</key>
-      <string>saving torn-off state of the nearby chat between sessions</string>
-      <key>Persist</key>
-      <integer>1</integer>
-      <key>Type</key>
-      <string>Boolean</string>
-      <key>Value</key>
-      <integer>1</integer>
-    </map>
     <key>CloseChatOnReturn</key>
     <map>
       <key>Comment</key>
@@ -4281,6 +4270,17 @@
       <string>Boolean</string>
       <key>Value</key>
       <integer>1</integer>
+    </map>
+     <key>IMShowContentPanel</key>
+    <map>
+      <key>Comment</key>
+      <string>Show Toolbar and Body Panels</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>Boolean</string>
+      <key>Value</key>
+      <integer>1</integer>
     </map>
     <key>IgnoreAllNotifications</key>
     <map>
diff --git a/indra/newview/app_settings/settings_per_account.xml b/indra/newview/app_settings/settings_per_account.xml
index 363713f2f4fca8efd1569d23f2ebfa1471762364..ada374f892d7e500a2c527e4bccf18885f8ab0b4 100644
--- a/indra/newview/app_settings/settings_per_account.xml
+++ b/indra/newview/app_settings/settings_per_account.xml
@@ -281,6 +281,17 @@
       	<key>Value</key>
       		<integer>2</integer>
     	</map>    
+    <key>NearbyChatIsNotTornOff</key>
+    <map>
+      <key>Comment</key>
+      <string>saving torn-off state of the nearby chat between sessions</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>Boolean</string>
+      <key>Value</key>
+      <integer>1</integer>
+    </map>
     <key>ShowFavoritesOnLogin</key>
         <map>
         <key>Comment</key>
diff --git a/indra/newview/llchiclet.cpp b/indra/newview/llchiclet.cpp
index 3dbb43c657407c8b559d8ae68c2dd742ee6affca..b221daf9365283c724366b9551b2b0c5419ff39c 100644
--- a/indra/newview/llchiclet.cpp
+++ b/indra/newview/llchiclet.cpp
@@ -427,6 +427,8 @@ LLChicletPanel::~LLChicletPanel()
 
 void LLChicletPanel::onMessageCountChanged(const LLSD& data)
 {
+    // *TODO : we either suppress this method or return a value. Right now, it servers no purpose.
+    /*
 	LLUUID session_id = data["session_id"].asUUID();
 	S32 unread = data["participant_unread"].asInteger();
 
@@ -435,6 +437,7 @@ void LLChicletPanel::onMessageCountChanged(const LLSD& data)
 	{
 		unread = 0;
 	}
+    */
 }
 
 void LLChicletPanel::objectChicletCallback(const LLSD& data)
diff --git a/indra/newview/llconversationlog.cpp b/indra/newview/llconversationlog.cpp
index dd20ca15aebbad66e686c7b23cdd6bf6086825a0..7883e4cb894c0c4eead6a694be438b2ce0d4e761 100644
--- a/indra/newview/llconversationlog.cpp
+++ b/indra/newview/llconversationlog.cpp
@@ -194,14 +194,17 @@ LLConversationLog::LLConversationLog() :
 	mAvatarNameCacheConnection(),
 	mLoggingEnabled(false)
 {
-	LLControlVariable * keep_log_ctrlp = gSavedPerAccountSettings.getControl("KeepConversationLogTranscripts").get();
-	S32 log_mode = keep_log_ctrlp->getValue();
-	keep_log_ctrlp->getSignal()->connect(boost::bind(&LLConversationLog::enableLogging, this, _2));
-	if (log_mode > 0)
+	if(gSavedPerAccountSettings.controlExists("KeepConversationLogTranscripts"))
 	{
-		loadFromFile(getFileName());
+		LLControlVariable * keep_log_ctrlp = gSavedPerAccountSettings.getControl("KeepConversationLogTranscripts").get();
+		S32 log_mode = keep_log_ctrlp->getValue();
+		keep_log_ctrlp->getSignal()->connect(boost::bind(&LLConversationLog::enableLogging, this, _2));
+		if (log_mode > 0)
+		{
+			loadFromFile(getFileName());
 
-		enableLogging(log_mode);
+			enableLogging(log_mode);
+		}
 	}
 }
 
diff --git a/indra/newview/llconversationloglist.cpp b/indra/newview/llconversationloglist.cpp
index b202cfc9d3f46b1abac996f8ce69e573c7532bc7..5ab108b39fbc3279120a71c3933d9bdcd2c44ca2 100644
--- a/indra/newview/llconversationloglist.cpp
+++ b/indra/newview/llconversationloglist.cpp
@@ -390,7 +390,7 @@ bool LLConversationLogList::isActionEnabled(const LLSD& userdata)
 	{
 		return is_p2p && LLAvatarActions::canOfferTeleport(selected_id);
 	}
-	else if ("can_show_on_map")
+	else if ("can_show_on_map" == command_name)
 	{
 		return is_p2p && ((LLAvatarTracker::instance().isBuddyOnline(selected_id) && is_agent_mappable(selected_id)) || gAgent.isGodlike());
 	}
diff --git a/indra/newview/llconversationmodel.cpp b/indra/newview/llconversationmodel.cpp
index 009fce0a92a4d35c4ef59c5830a9f58c299db29e..c74ce24872f87d9125f7720f7f015cba4ac6c31b 100644
--- a/indra/newview/llconversationmodel.cpp
+++ b/indra/newview/llconversationmodel.cpp
@@ -139,6 +139,8 @@ void LLConversationItem::buildParticipantMenuOptions(menuentry_vec_t& items, U32
 		items.push_back(std::string("remove_friend"));
 		items.push_back(std::string("invite_to_group"));
 		items.push_back(std::string("separator_invite_to_group"));
+		if (static_cast<LLConversationItem*>(mParent)->getType() == CONV_SESSION_NEARBY)
+			items.push_back(std::string("zoom_in"));
 		items.push_back(std::string("map"));
 		items.push_back(std::string("share"));
 		items.push_back(std::string("pay"));
diff --git a/indra/newview/lldelayedgestureerror.cpp b/indra/newview/lldelayedgestureerror.cpp
index 80e7c9f1b2df9734df8bac2f093af25c5b63a329..ef1b644ad4d7ffefa41e015b1e94d955e897cb86 100644
--- a/indra/newview/lldelayedgestureerror.cpp
+++ b/indra/newview/lldelayedgestureerror.cpp
@@ -113,9 +113,11 @@ bool LLDelayedGestureError::doDialog(const LLErrorEntry &ent, bool uuid_ok)
 		}
 	}
 	 
-
-	LLNotificationsUtil::add(ent.mNotifyName, args);
-
+	if(!LLApp::isQuitting())
+	{
+		LLNotificationsUtil::add(ent.mNotifyName, args);
+	}
+	
 	return true;
 }
 
diff --git a/indra/newview/lldonotdisturbnotificationstorage.cpp b/indra/newview/lldonotdisturbnotificationstorage.cpp
index 22f35752bd302339830584742589a661667a4520..be20adeb8a10f647ce7cd675ac584da1e667fbbe 100644
--- a/indra/newview/lldonotdisturbnotificationstorage.cpp
+++ b/indra/newview/lldonotdisturbnotificationstorage.cpp
@@ -33,6 +33,7 @@
 #include "lldir.h"
 #include "llerror.h"
 #include "llfloaterreg.h"
+#include "llimview.h"
 #include "llnotifications.h"
 #include "llnotificationhandler.h"
 #include "llnotificationstorage.h"
@@ -145,6 +146,8 @@ void LLDoNotDisturbNotificationStorage::loadNotifications()
 	
 	LLNotifications& instance = LLNotifications::instance();
     bool imToastExists = false;
+	bool group_ad_hoc_toast_exists = false;
+	S32 toastSessionType;
     bool offerExists = false;
 	
 	for (LLSD::array_const_iterator notification_it = data.beginArray();
@@ -158,7 +161,20 @@ void LLDoNotDisturbNotificationStorage::loadNotifications()
 
         if(notificationName == toastName)
         {
-            imToastExists = true;
+			toastSessionType = notification_params["payload"]["SESSION_TYPE"];
+			if(toastSessionType == LLIMModel::LLIMSession::P2P_SESSION)
+			{
+				imToastExists = true;
+			}
+			//Don't add group/ad-hoc messages to the notification system because
+			//this means the group/ad-hoc session has to be re-created
+			else if(toastSessionType == LLIMModel::LLIMSession::GROUP_SESSION 
+					|| toastSessionType == LLIMModel::LLIMSession::ADHOC_SESSION)
+			{
+				//Just allows opening the conversation log for group/ad-hoc messages upon startup
+				group_ad_hoc_toast_exists = true;
+				continue;
+			}
         }
         else if(notificationName == offerName)
         {
@@ -197,7 +213,12 @@ void LLDoNotDisturbNotificationStorage::loadNotifications()
         LLFloaterReg::showInstance("im_container");
     }
 
-    if(imToastExists || offerExists)
+	if(group_ad_hoc_toast_exists)
+	{
+		LLFloaterReg::showInstance("conversation");
+	}
+
+    if(imToastExists || group_ad_hoc_toast_exists || offerExists)
     {
 		make_ui_sound_deferred("UISndNewIncomingIMSession");
     }
diff --git a/indra/newview/llfloaterimcontainer.cpp b/indra/newview/llfloaterimcontainer.cpp
index 7437dd8cda73f0b73f38597d73aa481e77633c40..5e0cd8ef78ce35989e3519bfdce18077fb067892 100644
--- a/indra/newview/llfloaterimcontainer.cpp
+++ b/indra/newview/llfloaterimcontainer.cpp
@@ -53,6 +53,7 @@
 #include "llcallbacklist.h"
 #include "llworld.h"
 #include "llsdserialize.h"
+#include "llviewerobjectlist.h"
 
 //
 // LLFloaterIMContainer
@@ -62,8 +63,7 @@ LLFloaterIMContainer::LLFloaterIMContainer(const LLSD& seed, const Params& param
 	mExpandCollapseBtn(NULL),
 	mConversationsRoot(NULL),
 	mConversationsEventStream("ConversationsEvents"),
-	mInitialized(false),
-	mIsFirstLaunch(false)
+	mInitialized(false)
 {
     mEnableCallbackRegistrar.add("IMFloaterContainer.Check", boost::bind(&LLFloaterIMContainer::isActionChecked, this, _2));
 	mCommitCallbackRegistrar.add("IMFloaterContainer.Action", boost::bind(&LLFloaterIMContainer::onCustomAction,  this, _2));
@@ -245,7 +245,6 @@ BOOL LLFloaterIMContainer::postBuild()
 	mGeneralTitle = getTitle();
 	
 	mInitialized = true;
-	mIsFirstLaunch = true;
 
 	// Add callbacks:
 	// We'll take care of view updates on idle
@@ -280,12 +279,6 @@ void LLFloaterIMContainer::addFloater(LLFloater* floaterp,
 
 	LLUUID session_id = floaterp->getKey();
 	
-	// Make sure the message panel is open when adding a floater or it stays mysteriously hidden
-	if (!mIsFirstLaunch)
-	{
-		collapseMessagesPane(false);
-	}
-
 	// Add the floater
 	LLMultiFloater::addFloater(floaterp, select_added_floater, insertion_point);
 
@@ -646,8 +639,6 @@ void LLFloaterIMContainer::collapseMessagesPane(bool collapse)
 		return;
 	}
 
-	mIsFirstLaunch = false;
-
 	// Save current width of panels before collapsing/expanding right pane.
 	S32 conv_pane_width = mConversationsPane->getRect().getWidth();
     S32 msg_pane_width = mMessagesPane->getRect().getWidth();
@@ -1036,6 +1027,10 @@ void LLFloaterIMContainer::doToParticipants(const std::string& command, uuid_vec
 		{
 			LLAvatarActions::inviteToGroup(userID);
 		}
+		else if ("zoom_in" == command)
+		{
+			handle_zoom_to_object(userID);
+		}
 		else if ("map" == command)
 		{
 			LLAvatarActions::showOnMap(userID);
@@ -1257,6 +1252,10 @@ bool LLFloaterIMContainer::enableContextMenuItem(const std::string& item, uuid_v
     {
         return LLAvatarActions::canCall();
     }
+	else if ("can_zoom_in" == item)
+	{
+		return is_single_select && gObjectList.findObject(single_id);
+	}
     else if ("can_show_on_map" == item)
     {
         return (is_single_select ? (LLAvatarTracker::instance().isBuddyOnline(single_id) && is_agent_mappable(single_id)) || gAgent.isGodlike() : false);
@@ -1330,6 +1329,9 @@ void LLFloaterIMContainer::showConversation(const LLUUID& session_id)
 {
     setVisibleAndFrontmost(false);
     selectConversationPair(session_id, true);
+
+    LLFloaterIMSessionTab* session_floater = LLFloaterIMSessionTab::findConversation(session_id);
+    session_floater->restoreFloater();
 }
 
 void LLFloaterIMContainer::clearAllFlashStates()
@@ -1419,7 +1421,7 @@ BOOL LLFloaterIMContainer::selectConversationPair(const LLUUID& session_id, bool
 			session_floater->setMinimized(is_minimized);
 		}
 	}
-
+	flashConversationItemWidget(session_id,false);
     return handled;
 }
 
diff --git a/indra/newview/llfloaterimcontainer.h b/indra/newview/llfloaterimcontainer.h
index 5139651d8d0b8b4458883f57610e2283dbb3c11c..2cbc1e99f9a511217450eee0d8269f36959998c5 100644
--- a/indra/newview/llfloaterimcontainer.h
+++ b/indra/newview/llfloaterimcontainer.h
@@ -174,7 +174,6 @@ class LLFloaterIMContainer
 	LLLayoutStack* mConversationsStack;
 	
 	bool mInitialized;
-	bool mIsFirstLaunch;
 
 	LLUUID mSelectedSession;
 	std::string mGeneralTitle;
diff --git a/indra/newview/llfloaterimnearbychat.cpp b/indra/newview/llfloaterimnearbychat.cpp
index cfee5001a6d30e9348681fb9edc1deee7402fc80..b287950c21979f856b0b14c07d0ae0c39ed03bb8 100644
--- a/indra/newview/llfloaterimnearbychat.cpp
+++ b/indra/newview/llfloaterimnearbychat.cpp
@@ -274,8 +274,8 @@ void LLFloaterIMNearbyChat::onTearOffClicked()
 	LLFloaterIMSessionTab::onTearOffClicked();
 
 	// see CHUI-170: Save torn-off state of the nearby chat between sessions
-	BOOL in_the_multifloater = !isTornOff();
-	gSavedSettings.setBOOL("NearbyChatIsNotTornOff", in_the_multifloater);
+	BOOL in_the_multifloater = (BOOL)getHost();
+	gSavedPerAccountSettings.setBOOL("NearbyChatIsNotTornOff", in_the_multifloater);
 }
 
 
@@ -290,6 +290,7 @@ void LLFloaterIMNearbyChat::onOpen(const LLSD& key)
 void LLFloaterIMNearbyChat::onClose(bool app_quitting)
 {
 	// Override LLFloaterIMSessionTab::onClose() so that Nearby Chat is not removed from the conversation floater
+	LLFloaterIMSessionTab::restoreFloater();
 	onClickCloseBtn();
 }
 
@@ -297,8 +298,10 @@ void LLFloaterIMNearbyChat::onClose(bool app_quitting)
 void LLFloaterIMNearbyChat::onClickCloseBtn()
 {
 	if (!isTornOff())
+	{
 		return;
-	onTearOffClicked();
+	}
+	LLFloaterIMSessionTab::onTearOffClicked();
 	
 	LLFloaterIMContainer *im_box = LLFloaterIMContainer::findInstance();
 	if (im_box)
@@ -334,7 +337,7 @@ bool LLFloaterIMNearbyChat::isChatVisible() const
 	if (im_box != NULL)
 	{
 		isVisible =
-				isChatMultiTab() && gSavedSettings.getBOOL("NearbyChatIsNotTornOff")?
+				isChatMultiTab() && gSavedPerAccountSettings.getBOOL("NearbyChatIsNotTornOff")?
 						im_box->getVisible() && !im_box->isMinimized() :
 						getVisible() && !isMinimized();
 	}
@@ -345,6 +348,11 @@ bool LLFloaterIMNearbyChat::isChatVisible() const
 void LLFloaterIMNearbyChat::showHistory()
 {
 	openFloater();
+	if(!isMessagePaneExpanded())
+	{
+		restoreFloater();
+		setFocus(true);
+	}
 	setResizeLimits(getMinWidth(), EXPANDED_MIN_HEIGHT);
 }
 
@@ -417,6 +425,12 @@ BOOL LLFloaterIMNearbyChat::matchChatTypeTrigger(const std::string& in_str, std:
 
 void LLFloaterIMNearbyChat::onChatBoxKeystroke()
 {
+	LLFloaterIMContainer* im_box = LLFloaterIMContainer::findInstance();
+	if (im_box)
+	{
+		im_box->flashConversationItemWidget(mSessionID,false);
+	}
+
 	LLFirstUse::otherAvatarChatFirst(false);
 
 	LLWString raw_text = mInputEditor->getWText();
@@ -725,7 +739,14 @@ void LLFloaterIMNearbyChat::startChat(const char* line)
 	LLFloaterIMNearbyChat* nearby_chat = LLFloaterReg::getTypedInstance<LLFloaterIMNearbyChat>("nearby_chat");
 	if (nearby_chat)
 	{
-		nearby_chat->show();
+		if(!nearby_chat->isTornOff())
+		{
+			nearby_chat->show();
+		}
+		if(nearby_chat->isMinimized())
+		{
+			nearby_chat->setMinimized(false);
+		}
 		nearby_chat->setVisible(TRUE);
 		nearby_chat->setFocus(TRUE);
 		nearby_chat->mInputEditor->setFocus(TRUE);
diff --git a/indra/newview/llfloaterimnearbychathandler.cpp b/indra/newview/llfloaterimnearbychathandler.cpp
index 8870d54cd2ba126a81585264d616a9467254d28b..7afcf288ce55445b75133ff726d63c225e4f3340 100644
--- a/indra/newview/llfloaterimnearbychathandler.cpp
+++ b/indra/newview/llfloaterimnearbychathandler.cpp
@@ -559,12 +559,14 @@ void LLFloaterIMNearbyChatHandler::processChat(const LLChat& chat_msg,
 
     LLFloaterIMContainer* im_box = LLFloaterReg::getTypedInstance<LLFloaterIMContainer>("im_container");
 
-	if( nearby_chat->hasFocus() 
+	if(( nearby_chat->hasFocus()
         || im_box->hasFocus()
 		|| ( chat_msg.mSourceType == CHAT_SOURCE_AGENT
 			&& gSavedSettings.getBOOL("UseChatBubbles") )
 		|| mChannel.isDead()
-		|| !mChannel.get()->getShowToasts() ) // to prevent toasts in Do Not Disturb mode
+		|| !mChannel.get()->getShowToasts() )
+		&& nearby_chat->isMessagePaneExpanded())
+		// to prevent toasts in Do Not Disturb mode
 		return;//no need in toast if chat is visible or if bubble chat is enabled
 
 	// arrange a channel on a screen
@@ -606,7 +608,7 @@ void LLFloaterIMNearbyChatHandler::processChat(const LLChat& chat_msg,
 
 		//Don't show nearby toast, if conversation is visible but not focused
 		LLFloaterIMSessionTab* session_floater = LLFloaterIMSessionTab::getConversation(LLUUID());
-		if (session_floater
+		if (session_floater && session_floater->isMessagePaneExpanded()
 		    && session_floater->isInVisibleChain() && !session_floater->isMinimized()
 		    && !(session_floater->getHost() && session_floater->getHost()->isMinimized()))
 		{
@@ -614,7 +616,7 @@ void LLFloaterIMNearbyChatHandler::processChat(const LLChat& chat_msg,
 		}
 
         //Will show toast when chat preference is set        
-        if(gSavedSettings.getString("NotificationNearbyChatOptions") == "toast")
+        if((gSavedSettings.getString("NotificationNearbyChatOptions") == "toast") || !session_floater->isMessagePaneExpanded())
         {
             // Add a nearby chat toast.
             LLUUID id;
diff --git a/indra/newview/llfloaterimsession.cpp b/indra/newview/llfloaterimsession.cpp
index 50b2ed8c51b97b64387f0b2a6ee42ec19823a49c..73adfd0edaf24d125f75037cc1820f2ec6352349 100644
--- a/indra/newview/llfloaterimsession.cpp
+++ b/indra/newview/llfloaterimsession.cpp
@@ -618,7 +618,7 @@ void LLFloaterIMSession::onClose(bool app_quitting)
 	// Last change:
 	// EXT-3516 X Button should end IM session, _ button should hide
 	gIMMgr->leaveSession(mSessionID);
-
+	LLFloaterIMSessionTab::restoreFloater();
 	// Clean up the conversation *after* the session has been ended
 	LLFloaterIMSessionTab::onClose(app_quitting);
 }
@@ -892,6 +892,11 @@ void LLFloaterIMSession::onInputEditorFocusLost(LLFocusableElement* caller, void
 void LLFloaterIMSession::onInputEditorKeystroke(LLTextEditor* caller, void* userdata)
 {
 	LLFloaterIMSession* self = (LLFloaterIMSession*)userdata;
+	LLFloaterIMContainer* im_box = LLFloaterIMContainer::findInstance();
+	if (im_box)
+	{
+		im_box->flashConversationItemWidget(self->mSessionID,false);
+	}
 	std::string text = self->mInputEditor->getText();
 
 		// Deleting all text counts as stopping typing.
diff --git a/indra/newview/llfloaterimsessiontab.cpp b/indra/newview/llfloaterimsessiontab.cpp
index 9fd22b15372ebabf148f66bfc965ffe9235aacf1..eab2ce7798cb11f3628455632b3956518f96b46b 100644
--- a/indra/newview/llfloaterimsessiontab.cpp
+++ b/indra/newview/llfloaterimsessiontab.cpp
@@ -30,6 +30,7 @@
 #include "llfloaterimsessiontab.h"
 
 #include "llagent.h"
+#include "llagentcamera.h"
 #include "llavataractions.h"
 #include "llchatentry.h"
 #include "llchathistory.h"
@@ -57,11 +58,12 @@ LLFloaterIMSessionTab::LLFloaterIMSessionTab(const LLSD& session_id)
   , mSpeakingIndicator(NULL)
   , mChatHistory(NULL)
   , mInputEditor(NULL)
-  , mInputEditorTopPad(0)
+  , mInputEditorPad(0)
   , mRefreshTimer(new LLTimer())
   , mIsHostAttached(false)
   , mHasVisibleBeenInitialized(false)
   , mIsParticipantListExpanded(true)
+  , mChatLayoutPanel(NULL)
 {
     setAutoFocus(FALSE);
 	mSession = LLIMModel::getInstance()->findIMSession(mSessionID);
@@ -125,8 +127,12 @@ void LLFloaterIMSessionTab::setVisible(BOOL visible)
 	if(visible && !mHasVisibleBeenInitialized)
 	{
 		mHasVisibleBeenInitialized = true;
-		LLFloaterReg::getTypedInstance<LLFloaterIMContainer>("im_container")->setVisible(true);
+		if(!gAgentCamera.cameraMouselook())
+		{
+			LLFloaterReg::getTypedInstance<LLFloaterIMContainer>("im_container")->setVisible(true);
+		}
 		LLFloaterIMSessionTab::addToHost(mSessionID);
+		mInputButtonPanel->setVisible(isTornOff());
 	}
 
 	LLTransientDockableFloater::setVisible(visible);
@@ -170,7 +176,7 @@ void LLFloaterIMSessionTab::addToHost(const LLUUID& session_id)
 			conversp->setHostAttached(true);
 
 			if (!conversp->isNearbyChat()
-					|| gSavedSettings.getBOOL("NearbyChatIsNotTornOff"))
+					|| gSavedPerAccountSettings.getBOOL("NearbyChatIsNotTornOff"))
 			{
 				floater_container->addFloater(conversp, false, LLTabContainer::RIGHT_OF_CURRENT);
 			}
@@ -190,23 +196,51 @@ void LLFloaterIMSessionTab::addToHost(const LLUUID& session_id)
 	}
 }
 
+void LLFloaterIMSessionTab::assignResizeLimits()
+{
+	bool is_participants_pane_collapsed = mParticipantListPanel->isCollapsed();
+
+    // disable a layoutstack's functionality when participant list panel is collapsed
+	mRightPartPanel->setIgnoreReshape(is_participants_pane_collapsed);
+
+    S32 participants_pane_target_width = is_participants_pane_collapsed?
+    		0 : (mParticipantListPanel->getRect().getWidth() + LLPANEL_BORDER_WIDTH);
+
+    S32 new_min_width = participants_pane_target_width + mRightPartPanel->getExpandedMinDim() + mFloaterExtraWidth;
+
+	setResizeLimits(new_min_width, getMinHeight());
+
+	this->mParticipantListAndHistoryStack->updateLayout();
+}
+
 BOOL LLFloaterIMSessionTab::postBuild()
 {
 	BOOL result;
 
+	mBodyStack = getChild<LLLayoutStack>("main_stack");
+    mParticipantListAndHistoryStack = getChild<LLLayoutStack>("im_panels");
+
 	mCloseBtn = getChild<LLButton>("close_btn");
 	mCloseBtn->setCommitCallback(boost::bind(&LLFloater::onClickClose, this));
 
 	mExpandCollapseBtn = getChild<LLButton>("expand_collapse_btn");
 	mExpandCollapseBtn->setClickedCallback(boost::bind(&LLFloaterIMSessionTab::onSlide, this));
 
+	mExpandCollapseLineBtn = getChild<LLButton>("minz_btn");
+	mExpandCollapseLineBtn->setClickedCallback(boost::bind(&LLFloaterIMSessionTab::onCollapseToLine, this));
+
 	mTearOffBtn = getChild<LLButton>("tear_off_btn");
 	mTearOffBtn->setCommitCallback(boost::bind(&LLFloaterIMSessionTab::onTearOffClicked, this));
 
 	mGearBtn = getChild<LLButton>("gear_btn");
 
 	mParticipantListPanel = getChild<LLLayoutPanel>("speakers_list_panel");
-	
+	mRightPartPanel = getChild<LLLayoutPanel>("right_part_holder");
+
+	mToolbarPanel = getChild<LLLayoutPanel>("toolbar_panel");
+	mContentPanel = getChild<LLLayoutPanel>("body_panel");
+	mInputButtonPanel = getChild<LLLayoutPanel>("input_button_layout_panel");
+	mInputButtonPanel->setVisible(false);
 	// Add a scroller for the folder (participant) view
 	LLRect scroller_view_rect = mParticipantListPanel->getRect();
 	scroller_view_rect.translate(-scroller_view_rect.mLeft, -scroller_view_rect.mBottom);
@@ -223,17 +257,20 @@ BOOL LLFloaterIMSessionTab::postBuild()
 	mChatHistory = getChild<LLChatHistory>("chat_history");
 
 	mInputEditor = getChild<LLChatEntry>("chat_editor");
-	mInputEditor->setTextExpandedCallback(boost::bind(&LLFloaterIMSessionTab::reshapeChatHistory, this));
+
+	mChatLayoutPanel = getChild<LLLayoutPanel>("chat_layout_panel");
+	
+	mInputEditor->setTextExpandedCallback(boost::bind(&LLFloaterIMSessionTab::reshapeChatLayoutPanel, this));
 	mInputEditor->setCommitOnFocusLost( FALSE );
 	mInputEditor->setPassDelete(TRUE);
 	mInputEditor->setFont(LLViewerChat::getChatFont());
 
-	mInputEditorTopPad = mChatHistory->getRect().mBottom - mInputEditor->getRect().mTop;
+	mInputEditorPad = mChatLayoutPanel->getRect().getHeight() - mInputEditor->getRect().getHeight();
 
 	setOpenPositioning(LLFloaterEnums::POSITIONING_RELATIVE);
 
 	mSaveRect = isNearbyChat()
-					&&  !gSavedSettings.getBOOL("NearbyChatIsNotTornOff");
+					&&  !gSavedPerAccountSettings.getBOOL("NearbyChatIsNotTornOff");
 	initRectControl();
 
 	if (isChatMultiTab())
@@ -264,6 +301,8 @@ BOOL LLFloaterIMSessionTab::postBuild()
 	mConversationsRoot->setFollowsAll();
 	mConversationsRoot->addChild(mConversationsRoot->mStatusTextBox);
 
+	setMessagePaneExpanded(true);
+
 	buildConversationViewParticipant();
 	refreshConversation();
 
@@ -277,6 +316,15 @@ BOOL LLFloaterIMSessionTab::postBuild()
 		LLFloaterIMSessionTab::onSlide(this);
 	}
 
+	// The resize limits for LLFloaterIMSessionTab should be updated, based on current values of width of conversation and message panels
+	mParticipantListPanel->getResizeBar()->setResizeListener(boost::bind(&LLFloaterIMSessionTab::assignResizeLimits, this));
+	mFloaterExtraWidth =
+			getRect().getWidth()
+			- mParticipantListAndHistoryStack->getRect().getWidth()
+			- (mParticipantListPanel->isCollapsed()? 0 : LLPANEL_BORDER_WIDTH);
+
+	assignResizeLimits();
+
 	return result;
 }
 
@@ -649,7 +697,7 @@ void LLFloaterIMSessionTab::updateHeaderAndToolbar()
 			&& mIsParticipantListExpanded
 			&& !mIsP2PChat;
 
-	mParticipantListPanel->setVisible(is_participant_list_visible);
+	mParticipantListAndHistoryStack->collapsePanel(mParticipantListPanel, !is_participant_list_visible);
 
 	// Display collapse image (<<) if the floater is hosted
 	// or if it is torn off but has an open control panel.
@@ -674,6 +722,7 @@ void LLFloaterIMSessionTab::updateHeaderAndToolbar()
 	mTearOffBtn->setImageOverlay(getString(is_not_torn_off? "tear_off_icon" : "return_icon"));
 	mTearOffBtn->setToolTip(getString(is_not_torn_off? "tooltip_to_separate_window" : "tooltip_to_main_window"));
 
+
 	mCloseBtn->setVisible(is_not_torn_off && !mIsNearbyChat);
 
 	enableDisableCallBtn();
@@ -690,15 +739,11 @@ void LLFloaterIMSessionTab::forceReshape()
 }
 
 
-void LLFloaterIMSessionTab::reshapeChatHistory()
+void LLFloaterIMSessionTab::reshapeChatLayoutPanel()
 {
-	LLRect chat_rect  = mChatHistory->getRect();
+	LLRect chat_layout_panel_rect = mChatLayoutPanel->getRect();
 	LLRect input_rect = mInputEditor->getRect();
-
-	int delta_height = chat_rect.mBottom - (input_rect.mTop + mInputEditorTopPad);
-
-	chat_rect.setLeftTopAndSize(chat_rect.mLeft, chat_rect.mTop, chat_rect.getWidth(), chat_rect.getHeight() + delta_height);
-	mChatHistory->setShape(chat_rect);
+	mChatLayoutPanel->reshape(chat_layout_panel_rect.getWidth(), input_rect.getHeight() + mInputEditorPad, FALSE);
 }
 
 void LLFloaterIMSessionTab::showTranslationCheckbox(BOOL show)
@@ -773,14 +818,74 @@ void LLFloaterIMSessionTab::onSlide(LLFloaterIMSessionTab* self)
 	{
 		if (!self->mIsP2PChat)
 		{
-			bool expand = !self->mParticipantListPanel->getVisible();
+            bool should_be_expanded = self->mParticipantListPanel->isCollapsed();
+
+			// Expand/collapse the participant list panel
+            self->mParticipantListAndHistoryStack->collapsePanel(self->mParticipantListPanel, !should_be_expanded);
+            self->mParticipantListPanel->setVisible(should_be_expanded);
+            gSavedSettings.setBOOL("IMShowControlPanel", should_be_expanded);
+            self->mIsParticipantListExpanded = should_be_expanded;
+			self->mExpandCollapseBtn->setImageOverlay(self->getString(should_be_expanded ? "collapse_icon" : "expand_icon"));
+		}
+	}
+
+	self->assignResizeLimits();
+}
+
+void LLFloaterIMSessionTab::onCollapseToLine(LLFloaterIMSessionTab* self)
+{
+	LLFloaterIMContainer* host_floater = dynamic_cast<LLFloaterIMContainer*>(self->getHost());
+	if (!host_floater)
+	{
+		bool expand = self->isMessagePaneExpanded();
+		self->mExpandCollapseLineBtn->setImageOverlay(self->getString(expand ? "collapseline_icon" : "expandline_icon"));
+		self->mContentPanel->setVisible(!expand);
+		self->mToolbarPanel->setVisible(!expand);
+		self->reshapeFloater(expand);
+		self->setMessagePaneExpanded(!expand);
+	}
+}
 
-			// Expand/collapse the IM control panel
-			self->mParticipantListPanel->setVisible(expand);
-            gSavedSettings.setBOOL("IMShowControlPanel", expand);
-            self->mIsParticipantListExpanded = expand;
-			self->mExpandCollapseBtn->setImageOverlay(self->getString(expand ? "collapse_icon" : "expand_icon"));
+void LLFloaterIMSessionTab::reshapeFloater(bool collapse)
+{
+	LLRect floater_rect = getRect();
+
+	if(collapse)
+	{
+		mFloaterHeight = floater_rect.getHeight();
+		S32 height = mContentPanel->getRect().getHeight() + mToolbarPanel->getRect().getHeight();
+		floater_rect.mTop -= height;
+		enableResizeCtrls(true, true, false);
+	}
+	else
+	{
+		floater_rect.mTop = floater_rect.mBottom + mFloaterHeight;
+		enableResizeCtrls(true, true, true);
+
+	}
+
+	setShape(floater_rect, true);
+	mBodyStack->updateLayout();
+
+}
+
+void LLFloaterIMSessionTab::restoreFloater()
+{
+	if(!isMessagePaneExpanded())
+	{
+		if(isMinimized())
+		{
+			setMinimized(false);
 		}
+		mContentPanel->setVisible(true);
+		mToolbarPanel->setVisible(true);
+		LLRect floater_rect = getRect();
+		floater_rect.mTop = floater_rect.mBottom + mFloaterHeight;
+		setShape(floater_rect, true);
+		mBodyStack->updateLayout();
+		mExpandCollapseLineBtn->setImageOverlay(getString("expandline_icon"));
+		setMessagePaneExpanded(true);
+		enableResizeCtrls(true, true, true);
 	}
 }
 
@@ -793,12 +898,15 @@ void LLFloaterIMSessionTab::onOpen(const LLSD& key)
 		// Show the messages pane when opening a floater hosted in the Conversations
 		host_floater->collapseMessagesPane(false);
 	}
+
+	mInputButtonPanel->setVisible(isTornOff());
 }
 
 
 void LLFloaterIMSessionTab::onTearOffClicked()
 {
-    setFollows(isTornOff()? FOLLOWS_ALL : FOLLOWS_NONE);
+	restoreFloater();
+	setFollows(isTornOff()? FOLLOWS_ALL : FOLLOWS_NONE);
     mSaveRect = isTornOff();
     initRectControl();
 	LLFloater::onClickTearOff(this);
@@ -813,7 +921,10 @@ void LLFloaterIMSessionTab::onTearOffClicked()
 	else
 	{
 		container->selectConversation(mSessionID);
+
 	}
+	mInputButtonPanel->setVisible(isTornOff());
+
 	refreshConversation();
 	updateGearBtn();
 }
diff --git a/indra/newview/llfloaterimsessiontab.h b/indra/newview/llfloaterimsessiontab.h
index e8ae5574127fba3cd1999002cefdd9bff60064aa..f0899a3c0934ae0d1fa6ded9c02c18880c69efc4 100644
--- a/indra/newview/llfloaterimsessiontab.h
+++ b/indra/newview/llfloaterimsessiontab.h
@@ -98,6 +98,9 @@ class LLFloaterIMSessionTab
 	LLConversationItem* getCurSelectedViewModelItem();
 	void forceReshape();
 	virtual BOOL handleKeyHere( KEY key, MASK mask );
+	bool isMessagePaneExpanded(){return mMessagePaneExpanded;}
+	void setMessagePaneExpanded(bool expanded){mMessagePaneExpanded = expanded;}
+	void restoreFloater();
 
 protected:
 
@@ -111,6 +114,8 @@ class LLFloaterIMSessionTab
 	bool onIMShowModesMenuItemCheck(const LLSD& userdata);
 	bool onIMShowModesMenuItemEnable(const LLSD& userdata);
 	static void onSlide(LLFloaterIMSessionTab *self);
+	static void onCollapseToLine(LLFloaterIMSessionTab *self);
+	void reshapeFloater(bool collapse);
 
 	// refresh a visual state of the Call button
 	void updateCallBtnState(bool callIsActive);
@@ -135,18 +140,30 @@ class LLFloaterIMSessionTab
 	void appendMessage(const LLChat& chat, const LLSD &args = 0);
 
 	std::string appendTime();
+	void assignResizeLimits();
+
+	S32  mFloaterExtraWidth;
 
 	bool mIsNearbyChat;
 	bool mIsP2PChat;
+
+	bool mMessagePaneExpanded;
 	bool mIsParticipantListExpanded;
 
+
 	LLIMModel::LLIMSession* mSession;
 
 	// Participants list: model and view
 	LLConversationViewParticipant* createConversationViewParticipant(LLConversationItem* item);
 	
 	LLUUID mSessionID; 
+	LLLayoutStack* mBodyStack;
+	LLLayoutStack* mParticipantListAndHistoryStack;
 	LLLayoutPanel* mParticipantListPanel;	// add the widgets to that see mConversationsListPanel
+	LLLayoutPanel* mRightPartPanel;
+	LLLayoutPanel* mContentPanel;
+	LLLayoutPanel* mToolbarPanel;
+	LLLayoutPanel* mInputButtonPanel;
 	LLParticipantList* getParticipantList();
 	conversations_widgets_map mConversationsWidgets;
 	LLConversationViewModel mConversationViewModel;
@@ -156,13 +173,17 @@ class LLFloaterIMSessionTab
     LLOutputMonitorCtrl* mSpeakingIndicator;
 	LLChatHistory* mChatHistory;
 	LLChatEntry* mInputEditor;
-	int mInputEditorTopPad; // padding between input field and chat history
+	LLLayoutPanel * mChatLayoutPanel;
+	int mInputEditorPad; // padding between input field and chat history
 
+	LLButton* mExpandCollapseLineBtn;
 	LLButton* mExpandCollapseBtn;
 	LLButton* mTearOffBtn;
 	LLButton* mCloseBtn;
 	LLButton* mGearBtn;
 
+	S32 mFloaterHeight;
+
 
 private:
 	// Handling selection and contextual menu
@@ -180,7 +201,7 @@ class LLFloaterIMSessionTab
 	 * and avoid overlapping, since input chat field can be vertically expanded.
 	 * Implementation: chat history bottom "follows" top+top_pad of input chat field
 	 */
-	void reshapeChatHistory();
+	void reshapeChatLayoutPanel();
 
 	bool checkIfTornOff();
     bool mIsHostAttached;
diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp
index b308a820b2e1c5b26c42065c1a8781383b1efdb1..a28af2101b8e1a4ac021ed799ff7595c860f7443 100755
--- a/indra/newview/llfloaterpreference.cpp
+++ b/indra/newview/llfloaterpreference.cpp
@@ -443,6 +443,8 @@ BOOL LLFloaterPreference::postBuild()
 	std::string cache_location = gDirUtilp->getExpandedFilename(LL_PATH_CACHE, "");
 	setCacheLocation(cache_location);
 
+	getChild<LLUICtrl>("log_path_string")->setEnabled(FALSE); // make it read-only but selectable
+
 	getChild<LLComboBox>("language_combobox")->setCommitCallback(boost::bind(&LLFloaterPreference::onLanguageChange, this));
 
 	getChild<LLComboBox>("FriendIMOptions")->setCommitCallback(boost::bind(&LLFloaterPreference::onNotificationsChange, this,"FriendIMOptions"));
@@ -1572,7 +1574,6 @@ void LLFloaterPreference::setPersonalInfo(const std::string& visibility, bool im
 	getChildView("send_im_to_email")->setEnabled(TRUE);
 	getChild<LLUICtrl>("send_im_to_email")->setValue(im_via_email);
 	getChildView("favorites_on_login_check")->setEnabled(TRUE);
-	getChildView("log_path_string")->setEnabled(FALSE);// LineEditor becomes readonly in this case.
 	getChildView("log_path_button")->setEnabled(TRUE);
 	getChildView("chat_font_size")->setEnabled(TRUE);
 }
diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp
index 37f5888e8c0135c37d742e4c47858364bcb13e50..8c862548bbc5ac2bdb3f986cd2c27200324722b3 100644
--- a/indra/newview/llimview.cpp
+++ b/indra/newview/llimview.cpp
@@ -154,6 +154,7 @@ static void on_avatar_name_cache_toast(const LLUUID& agent_id,
 	args["FROM"] = av_name.getCompleteName();
 	args["FROM_ID"] = msg["from_id"];
 	args["SESSION_ID"] = msg["session_id"];
+	args["SESSION_TYPE"] = msg["session_type"];
 	LLNotificationsUtil::add("IMToast", args, args, boost::bind(&LLFloaterIMContainer::showConversation, LLFloaterIMContainer::getInstance(), msg["session_id"].asUUID()));
 }
 
@@ -199,13 +200,13 @@ void on_new_message(const LLSD& msg)
     // execution of the action
 
     LLFloaterIMContainer* im_box = LLFloaterReg::getTypedInstance<LLFloaterIMContainer>("im_container");
-
-	if (im_box->isFrontmost() && im_box->getSelectedSession() == session_id)
+	LLFloaterIMSessionTab* session_floater = LLFloaterIMSessionTab::getConversation(session_id);
+	
+	if (im_box->isFrontmost() && im_box->getSelectedSession() == session_id
+		&& !(session_floater->getHost() ? im_box->isMinimized() : session_floater->isMinimized()))
 	{
 		return;
 	}
-
-	LLFloaterIMSessionTab* session_floater = LLFloaterIMSessionTab::getConversation(session_id);
 	
     //session floater not focused (visible or not)
     bool session_floater_not_focused = session_floater && !session_floater->hasFocus();
@@ -226,17 +227,18 @@ void on_new_message(const LLSD& msg)
             && !session_floater->isMinimized()
             && !(session_floater->getHost() && session_floater->getHost()->isMinimized());
 
-    if ("toast" == action && !session_floater_is_open)
+    bool conversation_floater_collapsed = !session_floater->isMessagePaneExpanded();
+    if (("toast" == action && !session_floater_is_open) || conversation_floater_collapsed)
     {
         //User is not focused on conversation containing the message
-        if(session_floater_not_focused)
+        if(session_floater_not_focused || conversation_floater_collapsed)
         {
         	if(!LLMuteList::getInstance()->isMuted(participant_id))
         	{
         		im_box->flashConversationItemWidget(session_id, true);
         	}
             //The conversation floater isn't focused/open
-            if(conversation_floater_not_focused)
+            if(conversation_floater_not_focused || conversation_floater_collapsed)
             {
             	if(!LLMuteList::getInstance()->isMuted(participant_id) 
                     && !gAgent.isDoNotDisturb())
@@ -285,10 +287,23 @@ void on_new_message(const LLSD& msg)
             {
 				//Surface conversations floater
 				LLFloaterReg::showInstance("im_container");
-
-				if (session_floater && session_floater->isMinimized())
+				im_box->collapseMessagesPane(false);
+				if (session_floater)
 				{
-					LLFloater::onClickMinimize(session_floater);
+					if (session_floater->getHost())
+					{
+						if (NULL != im_box && im_box->isMinimized())
+						{
+							LLFloater::onClickMinimize(im_box);
+						}
+					}
+					else
+					{
+						if (session_floater->isMinimized())
+						{
+							LLFloater::onClickMinimize(session_floater);
+						}
+					}
 				}
 			}
 
@@ -641,8 +656,7 @@ void LLIMModel::LLIMSession::loadHistory()
 
 LLIMModel::LLIMSession* LLIMModel::findIMSession(const LLUUID& session_id) const
 {
-	return get_if_there(mId2SessionMap, session_id,
-		(LLIMModel::LLIMSession*) NULL);
+	return get_if_there(mId2SessionMap, session_id, (LLIMModel::LLIMSession*) NULL);
 }
 
 //*TODO consider switching to using std::set instead of std::list for holding LLUUIDs across the whole code
@@ -995,6 +1009,7 @@ bool LLIMModel::addMessage(const LLUUID& session_id, const std::string& from, co
 	arg["from"] = from;
 	arg["from_id"] = from_id;
 	arg["time"] = LLLogChat::timestamp(false);
+	arg["session_type"] = session->mSessionType;
 	mNewMsgSignal(arg);
 
 	return true;
@@ -2638,7 +2653,7 @@ void LLIMMgr::addMessage(
 	if (gSavedSettings.getBOOL("VoiceCallsFriendsOnly"))
 	{
 		// Evaluate if we need to skip this message when that setting is true (default is false)
-		LLIMModel::LLIMSession* session = LLIMModel::instance().findIMSession(session_id);
+		LLIMModel::LLIMSession* session = LLIMModel::instance().findIMSession(new_session_id);
 		skip_message = (LLAvatarTracker::instance().getBuddyInfo(other_participant_id) == NULL);	// Skip non friends...
 		skip_message &= !session->isGroupSessionType();			// Do not skip group chats...
 		skip_message &= !(other_participant_id == gAgentID);	// You are your best friend... Don't skip yourself
@@ -2654,7 +2669,7 @@ void LLIMMgr::addMessage(
     {
         LLFloaterReg::showInstance("im_container");
 	    LLFloaterReg::getTypedInstance<LLFloaterIMContainer>("im_container")->
-	    		flashConversationItemWidget(session_id, true);
+	    		flashConversationItemWidget(new_session_id, true);
     }
 }
 
@@ -2809,7 +2824,7 @@ LLUUID LLIMMgr::addSession(
 		}
 	}
 
-	bool new_session = !LLIMModel::getInstance()->findIMSession(session_id);
+	bool new_session = (LLIMModel::getInstance()->findIMSession(session_id) == NULL);
 
 	//works only for outgoing ad-hoc sessions
 	if (new_session && IM_SESSION_CONFERENCE_START == dialog && ids.size())
diff --git a/indra/newview/llpanelpeople.cpp b/indra/newview/llpanelpeople.cpp
index c5283404f13e64ce8f1429873201fbdda8fc1152..4138558bad150b4414f45eceb37845ab78a49c6c 100644
--- a/indra/newview/llpanelpeople.cpp
+++ b/indra/newview/llpanelpeople.cpp
@@ -611,10 +611,10 @@ BOOL LLPanelPeople::postBuild()
 	mGroupList->setNoItemsMsg(getString("no_groups_msg"));
 	mGroupList->setNoFilteredItemsMsg(getString("no_filtered_groups_msg"));
 
-	mNearbyList->setContextMenu(&LLPanelPeopleMenus::gNearbyMenu);
-	mRecentList->setContextMenu(&LLPanelPeopleMenus::gNearbyMenu);
-	mAllFriendList->setContextMenu(&LLPanelPeopleMenus::gNearbyMenu);
-	mOnlineFriendList->setContextMenu(&LLPanelPeopleMenus::gNearbyMenu);
+	mNearbyList->setContextMenu(&LLPanelPeopleMenus::gNearbyPeopleContextMenu);
+	mRecentList->setContextMenu(&LLPanelPeopleMenus::gPeopleContextMenu);
+	mAllFriendList->setContextMenu(&LLPanelPeopleMenus::gPeopleContextMenu);
+	mOnlineFriendList->setContextMenu(&LLPanelPeopleMenus::gPeopleContextMenu);
 
 	setSortOrder(mRecentList,		(ESortOrder)gSavedSettings.getU32("RecentPeopleSortOrder"),	false);
 	setSortOrder(mAllFriendList,	(ESortOrder)gSavedSettings.getU32("FriendsSortOrder"),		false);
@@ -1143,7 +1143,10 @@ void LLPanelPeople::onGearButtonClicked(LLUICtrl* btn)
 	uuid_vec_t selected_uuids;
 	getCurrentItemIDs(selected_uuids);
 	// Spawn at bottom left corner of the button.
-	LLPanelPeopleMenus::gNearbyMenu.show(btn, selected_uuids, 0, 0);
+	if (getActiveTabName() == NEARBY_TAB_NAME)
+		LLPanelPeopleMenus::gNearbyPeopleContextMenu.show(btn, selected_uuids, 0, 0);
+	else
+		LLPanelPeopleMenus::gPeopleContextMenu.show(btn, selected_uuids, 0, 0);
 }
 
 void LLPanelPeople::onImButtonClicked()
diff --git a/indra/newview/llpanelpeoplemenus.cpp b/indra/newview/llpanelpeoplemenus.cpp
index 47d6b49a50606cc6558118d7999f72dc51eba4b1..49f7361c4ad78dc217cc7be84381c3c2b2a5159d 100644
--- a/indra/newview/llpanelpeoplemenus.cpp
+++ b/indra/newview/llpanelpeoplemenus.cpp
@@ -39,15 +39,18 @@
 #include "llcallingcard.h"			// for LLAvatarTracker
 #include "lllogchat.h"
 #include "llviewermenu.h"			// for gMenuHolder
+#include "llconversationmodel.h"
+#include "llviewerobjectlist.h"
 
 namespace LLPanelPeopleMenus
 {
 
-NearbyMenu gNearbyMenu;
+PeopleContextMenu gPeopleContextMenu;
+NearbyPeopleContextMenu gNearbyPeopleContextMenu;
 
-//== NearbyMenu ===============================================================
+//== PeopleContextMenu ===============================================================
 
-LLContextMenu* NearbyMenu::createMenu()
+LLContextMenu* PeopleContextMenu::createMenu()
 {
 	// set up the callbacks for all of the avatar menu items
 	LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar;
@@ -64,7 +67,8 @@ LLContextMenu* NearbyMenu::createMenu()
 		registrar.add("Avatar.RemoveFriend",	boost::bind(&LLAvatarActions::removeFriendDialog, 		id));
 		registrar.add("Avatar.IM",				boost::bind(&LLAvatarActions::startIM,					id));
 		registrar.add("Avatar.Call",			boost::bind(&LLAvatarActions::startCall,				id));
-		registrar.add("Avatar.OfferTeleport",	boost::bind(&NearbyMenu::offerTeleport,					this));
+		registrar.add("Avatar.OfferTeleport",	boost::bind(&PeopleContextMenu::offerTeleport,			this));
+		registrar.add("Avatar.ZoomIn",			boost::bind(&handle_zoom_to_object,						id));
 		registrar.add("Avatar.ShowOnMap",		boost::bind(&LLAvatarActions::showOnMap,				id));
 		registrar.add("Avatar.Share",			boost::bind(&LLAvatarActions::share,					id));
 		registrar.add("Avatar.Pay",				boost::bind(&LLAvatarActions::pay,						id));
@@ -72,33 +76,72 @@ LLContextMenu* NearbyMenu::createMenu()
 		registrar.add("Avatar.InviteToGroup",	boost::bind(&LLAvatarActions::inviteToGroup,			id));
 		registrar.add("Avatar.Calllog",			boost::bind(&LLAvatarActions::viewChatHistory,			id));
 
-		enable_registrar.add("Avatar.EnableItem", boost::bind(&NearbyMenu::enableContextMenuItem,	this, _2));
-		enable_registrar.add("Avatar.CheckItem",  boost::bind(&NearbyMenu::checkContextMenuItem,	this, _2));
+		enable_registrar.add("Avatar.EnableItem", boost::bind(&PeopleContextMenu::enableContextMenuItem, this, _2));
+		enable_registrar.add("Avatar.CheckItem",  boost::bind(&PeopleContextMenu::checkContextMenuItem,	this, _2));
 
 		// create the context menu from the XUI
 		menu = createFromFile("menu_people_nearby.xml");
+		buildContextMenu(*menu, 0x0);
 	}
 	else
 	{
 		// Set up for multi-selected People
 
 		// registrar.add("Avatar.AddFriend",	boost::bind(&LLAvatarActions::requestFriendshipDialog,	mUUIDs)); // *TODO: unimplemented
-		registrar.add("Avatar.IM",			boost::bind(&LLAvatarActions::startConference,			mUUIDs, LLUUID::null));
-		registrar.add("Avatar.Call",		boost::bind(&LLAvatarActions::startAdhocCall,			mUUIDs, LLUUID::null));
-		registrar.add("Avatar.OfferTeleport",	boost::bind(&NearbyMenu::offerTeleport,					this));
-		registrar.add("Avatar.RemoveFriend",boost::bind(&LLAvatarActions::removeFriendsDialog,		mUUIDs));
+		registrar.add("Avatar.IM",				boost::bind(&LLAvatarActions::startConference,			mUUIDs, LLUUID::null));
+		registrar.add("Avatar.Call",			boost::bind(&LLAvatarActions::startAdhocCall,			mUUIDs, LLUUID::null));
+		registrar.add("Avatar.OfferTeleport",	boost::bind(&PeopleContextMenu::offerTeleport,			this));
+		registrar.add("Avatar.RemoveFriend",	boost::bind(&LLAvatarActions::removeFriendsDialog,		mUUIDs));
 		// registrar.add("Avatar.Share",		boost::bind(&LLAvatarActions::startIM,					mUUIDs)); // *TODO: unimplemented
-		// registrar.add("Avatar.Pay",		boost::bind(&LLAvatarActions::pay,						mUUIDs)); // *TODO: unimplemented
-		enable_registrar.add("Avatar.EnableItem",	boost::bind(&NearbyMenu::enableContextMenuItem,	this, _2));
+		// registrar.add("Avatar.Pay",			boost::bind(&LLAvatarActions::pay,						mUUIDs)); // *TODO: unimplemented
+		
+		enable_registrar.add("Avatar.EnableItem",	boost::bind(&PeopleContextMenu::enableContextMenuItem, this, _2));
 
 		// create the context menu from the XUI
 		menu = createFromFile("menu_people_nearby_multiselect.xml");
+		buildContextMenu(*menu, ITEM_IN_MULTI_SELECTION);
 	}
 
     return menu;
 }
 
-bool NearbyMenu::enableContextMenuItem(const LLSD& userdata)
+void PeopleContextMenu::buildContextMenu(class LLMenuGL& menu, U32 flags)
+{
+    menuentry_vec_t items;
+    menuentry_vec_t disabled_items;
+	
+	if (flags & ITEM_IN_MULTI_SELECTION)
+	{
+		items.push_back(std::string("add_friends"));
+		items.push_back(std::string("remove_friends"));
+		items.push_back(std::string("im"));
+		items.push_back(std::string("call"));
+		items.push_back(std::string("share"));
+		items.push_back(std::string("pay"));
+		items.push_back(std::string("offer_teleport"));
+	}
+	else 
+	{
+		items.push_back(std::string("view_profile"));
+		items.push_back(std::string("im"));
+		items.push_back(std::string("offer_teleport"));
+		items.push_back(std::string("voice_call"));
+		items.push_back(std::string("chat_history"));
+		items.push_back(std::string("separator_chat_history"));
+		items.push_back(std::string("add_friend"));
+		items.push_back(std::string("remove_friend"));
+		items.push_back(std::string("invite_to_group"));
+		items.push_back(std::string("separator_invite_to_group"));
+		items.push_back(std::string("map"));
+		items.push_back(std::string("share"));
+		items.push_back(std::string("pay"));
+		items.push_back(std::string("block_unblock"));
+	}
+
+    hide_context_entries(menu, items, disabled_items);
+}
+
+bool PeopleContextMenu::enableContextMenuItem(const LLSD& userdata)
 {
 	if(gAgent.getID() == mUUIDs.front())
 	{
@@ -170,6 +213,12 @@ bool NearbyMenu::enableContextMenuItem(const LLSD& userdata)
 	{
 		return LLAvatarActions::canCall();
 	}
+	else if (item == std::string("can_zoom_in"))
+	{
+		const LLUUID& id = mUUIDs.front();
+
+		return gObjectList.findObject(id);
+	}
 	else if (item == std::string("can_show_on_map"))
 	{
 		const LLUUID& id = mUUIDs.front();
@@ -193,7 +242,7 @@ bool NearbyMenu::enableContextMenuItem(const LLSD& userdata)
 	return false;
 }
 
-bool NearbyMenu::checkContextMenuItem(const LLSD& userdata)
+bool PeopleContextMenu::checkContextMenuItem(const LLSD& userdata)
 {
 	std::string item = userdata.asString();
 	const LLUUID& id = mUUIDs.front();
@@ -206,11 +255,50 @@ bool NearbyMenu::checkContextMenuItem(const LLSD& userdata)
 	return false;
 }
 
-void NearbyMenu::offerTeleport()
+void PeopleContextMenu::offerTeleport()
 {
 	// boost::bind cannot recognize overloaded method LLAvatarActions::offerTeleport(),
 	// so we have to use a wrapper.
 	LLAvatarActions::offerTeleport(mUUIDs);
 }
 
+//== NearbyPeopleContextMenu ===============================================================
+
+void NearbyPeopleContextMenu::buildContextMenu(class LLMenuGL& menu, U32 flags)
+{
+    menuentry_vec_t items;
+    menuentry_vec_t disabled_items;
+	
+	if (flags & ITEM_IN_MULTI_SELECTION)
+	{
+		items.push_back(std::string("add_friends"));
+		items.push_back(std::string("remove_friends"));
+		items.push_back(std::string("im"));
+		items.push_back(std::string("call"));
+		items.push_back(std::string("share"));
+		items.push_back(std::string("pay"));
+		items.push_back(std::string("offer_teleport"));
+	}
+	else 
+	{
+		items.push_back(std::string("view_profile"));
+		items.push_back(std::string("im"));
+		items.push_back(std::string("offer_teleport"));
+		items.push_back(std::string("voice_call"));
+		items.push_back(std::string("chat_history"));
+		items.push_back(std::string("separator_chat_history"));
+		items.push_back(std::string("add_friend"));
+		items.push_back(std::string("remove_friend"));
+		items.push_back(std::string("invite_to_group"));
+		items.push_back(std::string("separator_invite_to_group"));
+		items.push_back(std::string("zoom_in"));
+		items.push_back(std::string("map"));
+		items.push_back(std::string("share"));
+		items.push_back(std::string("pay"));
+		items.push_back(std::string("block_unblock"));
+	}
+
+    hide_context_entries(menu, items, disabled_items);
+}
+
 } // namespace LLPanelPeopleMenus
diff --git a/indra/newview/llpanelpeoplemenus.h b/indra/newview/llpanelpeoplemenus.h
index d51eaec7167a9b80c905796e6196a9fb5d999f63..0a1dcef303f65cc55096adb79d18f1858a3f0df3 100644
--- a/indra/newview/llpanelpeoplemenus.h
+++ b/indra/newview/llpanelpeoplemenus.h
@@ -33,19 +33,33 @@ namespace LLPanelPeopleMenus
 {
 
 /**
- * Menu used in the nearby people list.
+ * Menu used in the people lists.
  */
-class NearbyMenu : public LLListContextMenu
+class PeopleContextMenu : public LLListContextMenu
 {
 public:
 	/*virtual*/ LLContextMenu* createMenu();
+
+protected:
+	virtual void buildContextMenu(class LLMenuGL& menu, U32 flags);
+
 private:
 	bool enableContextMenuItem(const LLSD& userdata);
 	bool checkContextMenuItem(const LLSD& userdata);
 	void offerTeleport();
 };
 
-extern NearbyMenu gNearbyMenu;
+/**
+ * Menu used in the nearby people list.
+ */
+class NearbyPeopleContextMenu : public PeopleContextMenu
+{
+protected:
+	/*virtual*/ void buildContextMenu(class LLMenuGL& menu, U32 flags);
+};
+
+extern PeopleContextMenu gPeopleContextMenu;
+extern NearbyPeopleContextMenu gNearbyPeopleContextMenu;
 
 } // namespace LLPanelPeopleMenus
 
diff --git a/indra/newview/llviewerdisplay.cpp b/indra/newview/llviewerdisplay.cpp
index 9ffc64312d176718527a5edfee59ec48f38e9e80..e458b7dca8422c019fe345f7c18386744dbe7b69 100644
--- a/indra/newview/llviewerdisplay.cpp
+++ b/indra/newview/llviewerdisplay.cpp
@@ -1038,7 +1038,6 @@ void render_hud_attachments()
 	if (LLPipeline::sShowHUDAttachments && !gDisconnected && setup_hud_matrices())
 	{
 		LLCamera hud_cam = *LLViewerCamera::getInstance();
-		LLVector3 origin = hud_cam.getOrigin();
 		hud_cam.setOrigin(-1.f,0,0);
 		hud_cam.setAxes(LLVector3(1,0,0), LLVector3(0,1,0), LLVector3(0,0,1));
 		LLViewerCamera::updateFrustumPlanes(hud_cam, TRUE);
diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp
index 9a5fe0ff0268a624b8fef834d7ee17af8f107907..26b6c968f727b1758e79b637d94af633a536f92a 100755
--- a/indra/newview/llviewermessage.cpp
+++ b/indra/newview/llviewermessage.cpp
@@ -2388,7 +2388,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
 	    LLPostponedNotification::add<LLPostponedIMSystemTipNotification>(params, from_id, false);
 		break;
 
-	case IM_NOTHING_SPECIAL: 
+	case IM_NOTHING_SPECIAL:	// p2p IM
 		// Don't show dialog, just do IM
 		if (!gAgent.isGodlike()
 				&& gAgent.getRegion()->isPrelude() 
@@ -2789,47 +2789,6 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
 	}
 	break;
 	
-	case IM_SESSION_SEND:
-	{
-		if (is_do_not_disturb)
-		{
-			return;
-		}
-
-		// Only show messages if we have a session open (which
-		// should happen after you get an "invitation"
-		if ( !gIMMgr->hasSession(session_id) )
-		{
-			return;
-		}
-
-		// standard message, not from system
-		std::string saved;
-		if(offline == IM_OFFLINE)
-		{
-			saved = llformat("(Saved %s) ", formatted_time(timestamp).c_str());
-		}
-		buffer = saved + message;
-		BOOL is_this_agent = FALSE;
-		if(from_id == gAgentID)
-		{
-			is_this_agent = TRUE;
-		}
-		gIMMgr->addMessage(
-			session_id,
-			from_id,
-			name,
-			buffer,
-			IM_OFFLINE == offline,
-			ll_safe_string((char*)binary_bucket),
-			IM_SESSION_INVITE,
-			parent_estate_id,
-			region_id,
-			position,
-			true);
-	}
-	break;
-
 	case IM_FROM_TASK:
 		{
 			if (is_do_not_disturb && !is_owned_by_me)
@@ -2928,6 +2887,76 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
 			LLPostponedNotification::add<LLPostponedServerObjectNotification>(params, from_id, from_group);
 		}
 		break;
+
+	case IM_SESSION_SEND:		// ad-hoc or group IMs
+
+		// Only show messages if we have a session open (which
+		// should happen after you get an "invitation"
+		if ( !gIMMgr->hasSession(session_id) )
+		{
+			return;
+		}
+
+		else if (offline == IM_ONLINE && is_do_not_disturb)
+		{
+
+			// return a standard "do not disturb" message, but only do it to online IM 
+			// (i.e. not other auto responses and not store-and-forward IM)
+			if (!gIMMgr->hasSession(session_id))
+			{
+				// if there is not a panel for this conversation (i.e. it is a new IM conversation
+				// initiated by the other party) then...
+				send_do_not_disturb_message(msg, from_id, session_id);
+			}
+
+			// now store incoming IM in chat history
+
+			buffer = message;
+	
+			LL_INFOS("Messaging") << "process_improved_im: session_id( " << session_id << " ), from_id( " << from_id << " )" << LL_ENDL;
+
+			// add to IM panel, but do not bother the user
+			gIMMgr->addMessage(
+				session_id,
+				from_id,
+				name,
+				buffer,
+				IM_OFFLINE == offline,
+				ll_safe_string((char*)binary_bucket),
+				IM_SESSION_INVITE,
+				parent_estate_id,
+				region_id,
+				position,
+				true);
+		}
+		else
+		{
+			// standard message, not from system
+			std::string saved;
+			if(offline == IM_OFFLINE)
+			{
+				saved = llformat("(Saved %s) ", formatted_time(timestamp).c_str());
+			}
+
+			buffer = saved + message;
+
+			LL_INFOS("Messaging") << "process_improved_im: session_id( " << session_id << " ), from_id( " << from_id << " )" << LL_ENDL;
+
+			gIMMgr->addMessage(
+				session_id,
+				from_id,
+				name,
+				buffer,
+				IM_OFFLINE == offline,
+				ll_safe_string((char*)binary_bucket),
+				IM_SESSION_INVITE,
+				parent_estate_id,
+				region_id,
+				position,
+				true);
+		}
+		break;
+
 	case IM_FROM_TASK_AS_ALERT:
 		if (is_do_not_disturb && !is_owned_by_me)
 		{
diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp
index 3bd94413febed14af17d1bd12f8feabe0e48023b..1fba1d9282a009c2549d2f6cb4aed2b7429e40f9 100755
--- a/indra/newview/llviewerwindow.cpp
+++ b/indra/newview/llviewerwindow.cpp
@@ -2831,7 +2831,6 @@ void LLViewerWindow::updateUI()
 
 	BOOL handled = FALSE;
 
-	BOOL handled_by_top_ctrl = FALSE;
 	LLUICtrl* top_ctrl = gFocusMgr.getTopCtrl();
 	LLMouseHandler* mouse_captor = gFocusMgr.getMouseCapture();
 	LLView* captor_view = dynamic_cast<LLView*>(mouse_captor);
@@ -3016,7 +3015,6 @@ void LLViewerWindow::updateUI()
 				S32 local_x, local_y;
 				top_ctrl->screenPointToLocal( x, y, &local_x, &local_y );
 				handled = top_ctrl->pointInView(local_x, local_y) && top_ctrl->handleHover(local_x, local_y, mask);
-				handled_by_top_ctrl = TRUE;
 			}
 
 			if ( !handled )
diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp
index 76df6dc0ed0e1851db5356d02d7c3173c1030b32..9e5d44eb1f90117605af700a7b7783b42d15d7da 100755
--- a/indra/newview/llvoavatar.cpp
+++ b/indra/newview/llvoavatar.cpp
@@ -3107,6 +3107,7 @@ void LLVOAvatar::idleUpdateNameTagText(BOOL new_name)
 
 	// Rebuild name tag if state change detected
 	if (mNameString.empty()
+		|| (mNameString.size() == 2 && mNameString[0] == 10 && mNameString[1] == 10) // *TODO : find out why mNameString is sometimes ""
 		|| new_name
 		|| (!title && !mTitle.empty())
 		|| (title && mTitle != title->getString())
diff --git a/indra/newview/llworldmapview.cpp b/indra/newview/llworldmapview.cpp
index eeaa30aafb5a787b813059375ca189468dfe0bf8..8e68ecbc3ea300e4275e3aa980d03ad839364aa1 100644
--- a/indra/newview/llworldmapview.cpp
+++ b/indra/newview/llworldmapview.cpp
@@ -965,8 +965,6 @@ void LLWorldMapView::drawTracking(const LLVector3d& pos_global, const LLColor4&
 	S32 text_x = x;
 	S32 text_y = (S32)(y - sTrackCircleImage->getHeight()/2 - font->getLineHeight());
 
-	BOOL is_in_window = true;
-
 	if(    x < 0 
 		|| y < 0 
 		|| x >= getRect().getWidth() 
@@ -979,7 +977,6 @@ void LLWorldMapView::drawTracking(const LLVector3d& pos_global, const LLColor4&
 			text_x = sTrackingArrowX;
 			text_y = sTrackingArrowY;
 		}
-		is_in_window = false;
 	}
 	else if (LLTracker::getTrackingStatus() == LLTracker::TRACKING_LOCATION &&
 		LLTracker::getTrackedLocationType() != LLTracker::LOCATION_NOTHING)
diff --git a/indra/newview/skins/default/textures/icons/collapse_to_one_line.png b/indra/newview/skins/default/textures/icons/collapse_to_one_line.png
new file mode 100644
index 0000000000000000000000000000000000000000..d57144a64598d1dda5d40ab564fb9a2bdd7b98bd
Binary files /dev/null and b/indra/newview/skins/default/textures/icons/collapse_to_one_line.png differ
diff --git a/indra/newview/skins/default/textures/icons/expand_one_liner.png b/indra/newview/skins/default/textures/icons/expand_one_liner.png
new file mode 100644
index 0000000000000000000000000000000000000000..58b7d90131271665eb837e494ccf8b4156df3452
Binary files /dev/null and b/indra/newview/skins/default/textures/icons/expand_one_liner.png differ
diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml
index a07d7e48553cecbbc515d14767f1cff11c24ebb1..93c9cb02cb0e769c15c94a1b634c4193c2249530 100644
--- a/indra/newview/skins/default/textures/textures.xml
+++ b/indra/newview/skins/default/textures/textures.xml
@@ -171,6 +171,8 @@ with the same filename but different name
   <texture name="Conv_toolbar_call_log" file_name="icons/Conv_toolbar_call_log.png" preload="false" />
   <texture name="Conv_toolbar_close" file_name="icons/Conv_toolbar_close.png" preload="false" />
   <texture name="Conv_toolbar_collapse" file_name="icons/Conv_toolbar_collapse.png" preload="false" />
+  <texture name="Conv_collapse_to_one_line" file_name="icons/collapse_to_one_line.png" preload="false" />
+  <texture name="Conv_expand_one_line" file_name="icons/expand_one_liner.png" preload="false" />
   <texture name="Conv_toolbar_expand" file_name="icons/Conv_toolbar_expand.png" preload="false" />
   <texture name="Conv_toolbar_hang_up" file_name="icons/Conv_toolbar_hang_up.png" preload="false" />
   <texture name="Conv_toolbar_open_call" file_name="icons/Conv_toolbar_open_call.png" preload="false" />
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 12c16761275d617427102a82f81f77a418f448b4..65f623a47e88a7a86b233ef32c790a08a5e6c1e8 100644
--- a/indra/newview/skins/default/xui/en/floater_im_container.xml
+++ b/indra/newview/skins/default/xui/en/floater_im_container.xml
@@ -61,7 +61,7 @@
                      image_unselected="Toolbar_Middle_Off"
                      menu_filename="menu_participant_view.xml"
                      layout="topleft"
-                     left="10"
+                     left="5"
                      name="sort_btn"
                      tool_tip="View/sort options"
                      top="5"
@@ -75,7 +75,7 @@
                      image_unselected="Toolbar_Middle_Off"
                      layout="topleft"
                      top="5"
-                     left_pad="4"
+                     left_pad="2"
                      name="add_btn"
                      tool_tip="Start a new conversation"
                      width="31"/>
@@ -88,7 +88,7 @@
                      image_unselected="Toolbar_Middle_Off"
                      layout="topleft"
                      top="5"
-                     left_pad="4"
+                     left_pad="2"
                      name="speak_btn"
                      tool_tip="Speak with people using your microphone"
                      width="31"/>	
@@ -114,7 +114,7 @@
                 </layout_panel>
             </layout_stack>
             <panel
-             bottom="-5"
+             bottom="-1"
              follows="all"
              layout="topleft"
              name="conversations_list_panel"
@@ -129,7 +129,7 @@
          name="messages_layout_panel"
          expanded_min_dim="222">
             <panel_container
-             bottom="-5"
+             bottom="-1"
              follows="all"
              layout="topleft"
              left="0"
diff --git a/indra/newview/skins/default/xui/en/floater_im_session.xml b/indra/newview/skins/default/xui/en/floater_im_session.xml
index 8f0574177f3a97981505e2afbf31ae4a37fc8f8f..d8b085063f7bfd3445f110a8b16edaf1130901b6 100644
--- a/indra/newview/skins/default/xui/en/floater_im_session.xml
+++ b/indra/newview/skins/default/xui/en/floater_im_session.xml
@@ -14,11 +14,16 @@
  width="394"
  can_resize="true"
  can_tear_off="false"
- min_width="340"
  min_height="190"
  positioning="relative">
     <floater.string name="call_btn_start">Conv_toolbar_open_call</floater.string>
     <floater.string name="call_btn_stop">Conv_toolbar_hang_up</floater.string>
+    <floater.string
+     name="collapseline_icon"
+     value="Conv_collapse_to_one_line"/>
+    <floater.string
+     name="expandline_icon"
+     value="Conv_expand_one_line"/>
     <floater.string
      name="collapse_icon"
      value="Conv_toolbar_collapse"/>
@@ -65,14 +70,28 @@
         top="0"
         left="0"
         height="355"
-        width="394"> 
-     <panel
+        width="394">
+   <layout_stack
+   animate="false" 
+   default_tab_group="2"
+   follows="all"
+  height="355"
+  width="394"
+  layout="topleft"
+  orientation="vertical"
+   name="main_stack"
+  tab_group="1"
+  top="0"
+  left="0">
+  
+     <layout_panel
          follows="left|top|right"
          layout="topleft"
          name="toolbar_panel"
          top="0"
          left="0"
          height="35"
+         min_height="35"
          width="394">         
              <menu_button
                  menu_filename="menu_im_session_showmodes.xml"
@@ -98,7 +117,7 @@
 				 image_unselected="Toolbar_Middle_Off"
 				 layout="topleft"
 			 	 top="5"
-			 	 left_pad="4"
+			 	 left_pad="2"
 				 name="gear_btn"
 				 visible="false"
 				 tool_tip="Actions on selected person"
@@ -113,7 +132,7 @@
                  image_unselected="Toolbar_Middle_Off"
                  layout="topleft"
                  top="5"
-                 left_pad="4"
+                 left_pad="2"
                  name="add_btn"
                  tool_tip="Add someone to this conversation"
                  width="31"/>
@@ -126,7 +145,7 @@
                  image_unselected="Toolbar_Middle_Off"
                  layout="topleft"
                  top="5"
-                 left_pad="4"
+                 left_pad="2"
                  name="voice_call_btn"
                  tool_tip="Open voice connection"
                  width="31"/>
@@ -151,7 +170,7 @@
                  image_unselected="Toolbar_Middle_Off"
                  layout="topleft"
                  top="5"
-                 left="283"
+                 left="292"
                  name="close_btn"
                  tool_tip="End this conversation"
                  width="31" />
@@ -164,7 +183,7 @@
              	 image_unselected="Toolbar_Middle_Off"
                  layout="topleft"
                  top="5"
-                 left_pad="5"
+                 left_pad="2"
                  name="expand_collapse_btn"
                  tool_tip="Collapse/Expand this pane"
                  width="31" />
@@ -177,15 +196,22 @@
              	 image_unselected="Toolbar_Middle_Off"
                  layout="topleft"
                  top="5"
-                 left_pad="5"
+                 left_pad="2"
                  name="tear_off_btn"
                  width="31" />
-     </panel>
+     </layout_panel>
+     <layout_panel
+      name="body_panel"
+      follows="all"
+      width="394" 
+      height="235" 
+      user_resize="false"
+      auto_resize="true">
   <layout_stack
    animate="true" 
    default_tab_group="2"
   follows="all"
-  height="310"
+  height="275"
   width="394"
   layout="topleft"
   orientation="horizontal"
@@ -196,11 +222,12 @@
     <layout_panel
       name="speakers_list_panel"
       follows="all"
-      min_width="115"
+      expanded_min_dim="115"
+      min_dim="0"
       width="150" 
-      height="310" 
+      height="275"
       user_resize="true"
-      auto_resize="true">
+      auto_resize="false">
       </layout_panel>
     <layout_panel
        default_tab_group="3"
@@ -208,26 +235,26 @@
        tab_group="2"
        follows="all"
        top="0"
-       height="310"
+       height="275"
 	   width="244"
        layout="topleft"
        user_resize="true"
        auto_resize="true"
        visible="true"
-       name="left_part_holder"
+       name="right_part_holder"
        min_width="221">
         <panel
          name="trnsAndChat_panel"
          follows="all"
          layout="topleft"
          visible="true"
-         height="275"
+         height="240"
          width="244">
          <layout_stack
           animate="true" 
           default_tab_group="2"
           follows="all"
-          height="275"
+          height="240"
           width="244"
           layout="topleft"
           visible="true"
@@ -239,6 +266,7 @@
           left="0">
             <layout_panel
              auto_resize="false"
+             user_resize="false"
              height="26"
              layout="topleft"
              left_delta="0"
@@ -258,7 +286,6 @@
                  width="230" />
             </layout_panel>
             <layout_panel
-             height="248"
              width="210"
              layout="topleft"
              follows="all"
@@ -266,43 +293,109 @@
              top_delta="0"
              bottom="0"
              visible="true"
-             user_resize="true"
+             user_resize="false"
              auto_resize="true"
              name="chat_holder">      
                <chat_history
                 font="SansSerifSmall"
                 follows="all"
                 visible="true"
-                height="240"
                 name="chat_history"
                 parse_highlights="true"
                 parse_urls="true"
+                layout="topleft"
                 right="-5"
-                left="5">
+                left="5"
+                top="0"
+                bottom="1">
                </chat_history>
             </layout_panel>
            </layout_stack>
            </panel>
-            <chat_editor
+    </layout_panel>
+  </layout_stack>
+  </layout_panel>
+  <layout_panel
+             height="35"
+             layout="topleft"
+             follows="left|right|bottom"
+             left_delta="0"
+             right="0"
+             top_delta="0"
              bottom="0"
+             visible="true"
+             user_resize="false"
+             auto_resize="false"
+             name="chat_layout_panel">
+   <layout_stack
+   animate="true" 
+   default_tab_group="2"
+   follows="all"
+   height="35"
+   right="0"
+   layout="topleft"
+   orientation="horizontal"
+   name="input_panels"
+   top_pad="0"
+   left="0">
+     <layout_panel
+             height="35"
+             layout="topleft"
+             follows="left|right|bottom"
+             left_delta="0"
+             top_delta="0"
+             bottom="0"
+             visible="true"
+             user_resize="false"
+             auto_resize="true"
+             name="input_editor_layout_panel">
+              <chat_editor
              expand_lines_count="5"
              follows="left|right|bottom"
-	           font="SansSerifSmall"
+               font="SansSerifSmall"
              visible="true"
              height="20"
              is_expandable="true"
              label="To"
              text_tentative_color="TextFgTentativeColor"
-             layout="bottomleft"
+             layout="topleft"
              name="chat_editor"
              max_length="1023"
              spellcheck="true"
              tab_group="3"
-             width="220"
-             left="10"
+             width="160"
+             top="6"
+             left="5"
+             right="-5"
              wrap="true">
             </chat_editor>
-    </layout_panel>
+            </layout_panel>
+            <layout_panel             
+             height="35"
+             layout="topleft"
+             follows="left|right|bottom"
+             left_delta="0"
+             top_delta="0"
+             bottom="0"
+             width="35"
+             visible="true"
+             user_resize="false"
+             auto_resize="false"
+             name="input_button_layout_panel">
+            <button
+                 follows="left|right|bottom"
+                 height="25"
+                 image_hover_unselected="Toolbar_Middle_Over"
+                 image_overlay="Conv_expand_one_line"
+                 image_selected="Toolbar_Middle_Selected"
+                 image_unselected="Toolbar_Middle_Off"
+                 layout="topleft"
+                 name="minz_btn"
+                 tool_tip="Shows/hides message panel"
+                 width="28"/>
+           </layout_panel>
+  </layout_stack>
+  </layout_panel>
   </layout_stack>
     </view>
 </floater>
diff --git a/indra/newview/skins/default/xui/en/menu_conversation.xml b/indra/newview/skins/default/xui/en/menu_conversation.xml
index fd5c86b3cae38d7516e29e6d3fa679c15777e00d..5a13ef0a592f136d7e6c45845ac323a11e82a4fa 100644
--- a/indra/newview/skins/default/xui/en/menu_conversation.xml
+++ b/indra/newview/skins/default/xui/en/menu_conversation.xml
@@ -89,7 +89,14 @@
         <on_click function="Avatar.DoToSelected" parameter="invite_to_group" />
         <on_enable function="Avatar.EnableItem" parameter="can_invite" />
     </menu_item_call>
-    <menu_item_separator layout="topleft" name="separator_invite_to_group"/>		
+    <menu_item_separator layout="topleft" name="separator_invite_to_group"/>
+    <menu_item_call
+     label="Zoom In"
+     layout="topleft"
+     name="zoom_in">
+      <on_click function="Avatar.DoToSelected" parameter="zoom_in" />
+      <on_enable function="Avatar.EnableItem" parameter="can_zoom_in" />
+    </menu_item_call>
     <menu_item_call
      label="Map"
      layout="topleft"
diff --git a/indra/newview/skins/default/xui/en/menu_im_conversation.xml b/indra/newview/skins/default/xui/en/menu_im_conversation.xml
index 8882d0a7d8ed5ce8ff757c7c5dc6a698fe0b7d00..43287c6ec36e8fe6313c0f5c493d29a976232748 100644
--- a/indra/newview/skins/default/xui/en/menu_im_conversation.xml
+++ b/indra/newview/skins/default/xui/en/menu_im_conversation.xml
@@ -49,6 +49,13 @@
     </menu_item_call>
     <menu_item_separator
      layout="topleft"/>
+    <menu_item_call
+       label="Zoom In"
+       layout="topleft"
+       name="zoom_in">
+      <on_click function="Avatar.DoToSelected" parameter="zoom_in" />
+      <on_enable function="Avatar.EnableItem" parameter="can_zoom_in" />
+    </menu_item_call>
     <menu_item_call
      label="Map"
      layout="topleft"
diff --git a/indra/newview/skins/default/xui/en/menu_people_nearby.xml b/indra/newview/skins/default/xui/en/menu_people_nearby.xml
index 60a6c985147e9df58232d3b950fe9baf45caa200..3abb5f7bc8ca3a8a142da8c254d20a47e0de3475 100644
--- a/indra/newview/skins/default/xui/en/menu_people_nearby.xml
+++ b/indra/newview/skins/default/xui/en/menu_people_nearby.xml
@@ -1,18 +1,18 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes" ?>
 <context_menu
  layout="topleft"
- name="Avatar Context Menu">
+ name="Nearby People Context Menu">
     <menu_item_call
      label="View Profile"
      layout="topleft"
-     name="View Profile">
+     name="view_profile">
         <menu_item_call.on_click
          function="Avatar.Profile" />
     </menu_item_call>
     <menu_item_call
      label="IM"
      layout="topleft"
-     name="IM">
+     name="im">
         <menu_item_call.on_click
          function="Avatar.IM" />
         <menu_item_call.on_enable
@@ -21,7 +21,7 @@
     </menu_item_call>
     <menu_item_call
     label="Offer Teleport"
-    name="teleport">
+    name="offer_teleport">
       <menu_item_call.on_click
        function="Avatar.OfferTeleport"/>
       <menu_item_call.on_enable
@@ -31,7 +31,7 @@
     <menu_item_call
      label="Voice call"
      layout="topleft"
-     name="Call">
+     name="voice_call">
         <menu_item_call.on_click
          function="Avatar.Call" />
         <menu_item_call.on_enable
@@ -42,18 +42,18 @@
     <menu_item_call
      label="View chat history..."
      layout="topleft"
-     name="Chat history">
+     name="chat_history">
         <menu_item_call.on_click
          function="Avatar.Calllog" />
         <menu_item_call.on_enable
       	 function="Avatar.EnableItem"
          parameter="can_callog"/>
     </menu_item_call>
-    <menu_item_separator />
+    <menu_item_separator name="separator_chat_history"/>
     <menu_item_call
      label="Add Friend"
      layout="topleft"
-     name="Add Friend">
+     name="add_friend">
         <menu_item_call.on_click
          function="Avatar.AddFriend" />
         <menu_item_call.on_visible
@@ -63,7 +63,7 @@
     <menu_item_call
      label="Remove Friend"
      layout="topleft"
-     name="Remove Friend">
+     name="remove_friend">
         <menu_item_call.on_click
          function="Avatar.RemoveFriend" />
         <menu_item_call.on_enable
@@ -73,18 +73,28 @@
     <menu_item_call
      label="Invite to group..."
      layout="topleft"
-     name="Invite">
+     name="invite_to_group">
         <menu_item_call.on_click
          function="Avatar.InviteToGroup" />
         <menu_item_call.on_enable
       	 function="Avatar.EnableItem"
          parameter="can_invite"/>
     </menu_item_call>
-    <menu_item_separator />
+    <menu_item_separator name="separator_invite_to_group"/>
+    <menu_item_call
+     label="Zoom In"
+     layout="topleft"
+     name="zoom_in">
+      <menu_item_call.on_click
+       function="Avatar.ZoomIn" />
+      <menu_item_call.on_enable
+       function="Avatar.EnableItem"
+       parameter="can_zoom_in"/>
+    </menu_item_call>
     <menu_item_call
      label="Map"
      layout="topleft"
-     name="Map">
+     name="map">
         <menu_item_call.on_click
          function="Avatar.ShowOnMap" />
         <menu_item_call.on_enable
@@ -94,7 +104,7 @@
     <menu_item_call
      label="Share"
      layout="topleft"
-     name="Share">
+     name="share">
         <menu_item_call.on_click
          function="Avatar.Share" />
         <menu_item_call.on_enable
@@ -104,7 +114,7 @@
     <menu_item_call
      label="Pay"
      layout="topleft"
-     name="Pay">
+     name="pay">
         <menu_item_call.on_click
          function="Avatar.Pay" />
         <menu_item_call.on_enable
@@ -114,7 +124,7 @@
     <menu_item_check
      label="Block/Unblock"
      layout="topleft"
-     name="Block/Unblock">
+     name="block_unblock">
         <menu_item_check.on_click
          function="Avatar.BlockUnblock" />
         <menu_item_check.on_check
diff --git a/indra/newview/skins/default/xui/en/menu_people_nearby_multiselect.xml b/indra/newview/skins/default/xui/en/menu_people_nearby_multiselect.xml
index 5d58a9d28957813d94ef9cf42c71bbc375b03a65..5f973088fdda3ad89a31eee676b2945d4786fbb5 100644
--- a/indra/newview/skins/default/xui/en/menu_people_nearby_multiselect.xml
+++ b/indra/newview/skins/default/xui/en/menu_people_nearby_multiselect.xml
@@ -6,7 +6,7 @@
      enabled="false"
      label="Add Friends"
      layout="topleft"
-     name="Add Friends">
+     name="add_friends">
         <on_click
          function="Avatar.AddFriends" />
         <on_enable
@@ -16,7 +16,7 @@
     <menu_item_call
      label="Remove Friends"
      layout="topleft"
-     name="Remove Friend">
+     name="remove_friends">
         <menu_item_call.on_click
          function="Avatar.RemoveFriend" />
         <menu_item_call.on_enable
@@ -26,7 +26,7 @@
     <menu_item_call
      label="IM"
      layout="topleft"
-     name="IM">
+     name="im">
         <on_click
          function="Avatar.IM" />
     </menu_item_call>
@@ -34,7 +34,7 @@
      enabled="false"
      label="Call"
      layout="topleft"
-     name="Call">
+     name="call">
         <on_click
          function="Avatar.Call" />
         <on_enable
@@ -45,7 +45,7 @@
      enabled="false"
      label="Share"
      layout="topleft"
-     name="Share">
+     name="share">
         <on_click
          function="Avatar.Share" />
     </menu_item_call>
@@ -53,13 +53,13 @@
      enabled="false"
      label="Pay"
      layout="topleft"
-     name="Pay">
+     name="pay">
         <on_click
          function="Avatar.Pay" />
     </menu_item_call>
     <menu_item_call
     label="Offer Teleport"
-    name="teleport">
+    name="offer_teleport">
       <menu_item_call.on_click
        function="Avatar.OfferTeleport"/>
       <menu_item_call.on_enable
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 9db3816c92d2aade6bb67178946aa1da33977043..bd096ebb885c1b7055c28769a7c7dff28d644718 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_chat.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_chat.xml
@@ -429,7 +429,6 @@
     </text>
   
     <line_editor
-    	enabled="false"
         control_name="InstantMessageLogPath"
         border_style="line"
         border_thickness="1"