diff --git a/indra/llui/llflatlistview.cpp b/indra/llui/llflatlistview.cpp
index 70558f8eb81bc8807da5ee47f0fb006ebecb2fc7..8de44455de05a18e192e310034f0c340bac877ab 100644
--- a/indra/llui/llflatlistview.cpp
+++ b/indra/llui/llflatlistview.cpp
@@ -669,6 +669,14 @@ BOOL LLFlatListView::handleKeyHere(KEY key, MASK mask)
 			}
 			break;
 		}
+		case KEY_ESCAPE:
+		{
+			if (mask == MASK_NONE)
+			{
+				setFocus(FALSE); // pass focus to the game area (EXT-8357)
+			}
+			break;
+		}
 		default:
 			break;
 	}
diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp
index cd35ec5d39cd4410ca4b6603593aa094ae95c71a..41e505cc58b7aa36312836b0fd118bf78c3b5dbc 100644
--- a/indra/newview/llimview.cpp
+++ b/indra/newview/llimview.cpp
@@ -1021,19 +1021,6 @@ void LLIMModel::sendMessage(const std::string& utf8_text,
 
 	if (is_not_group_id)
 	{
-			
-#if 0
-		//use this code to add only online members	
-		LLIMSpeakerMgr* speaker_mgr = LLIMModel::getInstance()->getSpeakerManager(im_session_id);
-		LLSpeakerMgr::speaker_list_t speaker_list;
-		speaker_mgr->getSpeakerList(&speaker_list, true);
-		for(LLSpeakerMgr::speaker_list_t::iterator it = speaker_list.begin(); it != speaker_list.end(); it++)
-		{
-			const LLPointer<LLSpeaker>& speakerp = *it;
-
-			LLRecentPeople::instance().add(speakerp->mID);
-		}
-#else
 		LLIMModel::LLIMSession* session = LLIMModel::getInstance()->findIMSession(im_session_id);
 		if( session == 0)//??? shouldn't really happen
 		{
@@ -1048,16 +1035,20 @@ void LLIMModel::sendMessage(const std::string& utf8_text,
 			// Concrete participants will be added into this list once they sent message in chat.
 			if (IM_SESSION_INVITE == dialog) return;
 
-			// implemented adding of all participants of an outgoing to Recent People List. See EXT-5694.
-			for(uuid_vec_t::iterator it = session->mInitialTargetIDs.begin();
-				it!=session->mInitialTargetIDs.end();++it)
+			// Add only online members to recent (EXT-8658)
+			LLIMSpeakerMgr* speaker_mgr = LLIMModel::getInstance()->getSpeakerManager(im_session_id);
+			LLSpeakerMgr::speaker_list_t speaker_list;
+			if(speaker_mgr != NULL)
+			{
+				speaker_mgr->getSpeakerList(&speaker_list, true);
+			}
+			for(LLSpeakerMgr::speaker_list_t::iterator it = speaker_list.begin(); it != speaker_list.end(); it++)
 			{
-				const LLUUID id = *it;
+				const LLPointer<LLSpeaker>& speakerp = *it;
 
-				LLRecentPeople::instance().add(id);
+				LLRecentPeople::instance().add(speakerp->mID);
 			}
 		}
-#endif
 	}
 
 	
diff --git a/indra/newview/llpanelwearing.cpp b/indra/newview/llpanelwearing.cpp
index b8852890add436d15c71aa3b512c33af940ebb00..fd7ca39c72a9cbf84c0665851fb3c8e55b06b073 100644
--- a/indra/newview/llpanelwearing.cpp
+++ b/indra/newview/llpanelwearing.cpp
@@ -87,9 +87,58 @@ protected:
 	{
 		LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar;
 
+		functor_t take_off = boost::bind(&LLAppearanceMgr::removeItemFromAvatar, LLAppearanceMgr::getInstance(), _1);
+
 		registrar.add("Wearing.Edit", boost::bind(&edit_outfit));
+		registrar.add("Wearing.TakeOff", boost::bind(handleMultiple, take_off, mUUIDs));
+		registrar.add("Wearing.Detach", boost::bind(handleMultiple, take_off, mUUIDs));
+
+		LLContextMenu* menu = createFromFile("menu_wearing_tab.xml");
+
+		updateMenuItemsVisibility(menu);
 
-		return createFromFile("menu_wearing_tab.xml");
+		return menu;
+	}
+
+	void updateMenuItemsVisibility(LLContextMenu* menu)
+	{
+		bool bp_selected			= false;	// true if body parts selected
+		bool clothes_selected		= false;
+		bool attachments_selected	= false;
+
+		// See what types of wearables are selected.
+		for (uuid_vec_t::const_iterator it = mUUIDs.begin(); it != mUUIDs.end(); ++it)
+		{
+			LLViewerInventoryItem* item = gInventory.getItem(*it);
+
+			if (!item)
+			{
+				llwarns << "Invalid item" << llendl;
+				continue;
+			}
+
+			LLAssetType::EType type = item->getType();
+			if (type == LLAssetType::AT_CLOTHING)
+			{
+				clothes_selected = true;
+			}
+			else if (type == LLAssetType::AT_BODYPART)
+			{
+				bp_selected = true;
+			}
+			else if (type == LLAssetType::AT_OBJECT)
+			{
+				attachments_selected = true;
+			}
+		}
+
+		// Enable/disable some menu items depending on the selection.
+		bool allow_detach = !bp_selected && !clothes_selected && attachments_selected;
+		bool allow_take_off = !bp_selected && clothes_selected && !attachments_selected;
+
+		menu->setItemVisible("take_off",	allow_take_off);
+		menu->setItemVisible("detach",		allow_detach);
+		menu->setItemVisible("edit_outfit_separator", allow_take_off || allow_detach);
 	}
 };
 
diff --git a/indra/newview/llwearableitemslist.cpp b/indra/newview/llwearableitemslist.cpp
index abe629ffe4b2e399481afa660c0d64f70f0adea9..9f7ea68e870c518938a21dc90b9c17cc111e5c70 100644
--- a/indra/newview/llwearableitemslist.cpp
+++ b/indra/newview/llwearableitemslist.cpp
@@ -636,6 +636,7 @@ LLWearableItemsList::LLWearableItemsList(const LLWearableItemsList::Params& p)
 		setRightMouseDownCallback(boost::bind(&LLWearableItemsList::onRightClick, this, _2, _3));
 	}
 	mWornIndicationEnabled = p.worn_indication_enabled;
+	setNoItemsCommentText(LLTrans::getString("LoadingData"));
 }
 
 // virtual
@@ -677,6 +678,11 @@ void LLWearableItemsList::updateList(const LLUUID& category_id)
 		LLInventoryModel::EXCLUDE_TRASH,
 		collector);
 
+	if(item_array.empty() && gInventory.isCategoryComplete(category_id))
+	{
+		setNoItemsCommentText(LLTrans::getString("EmptyOutfitText"));
+	}
+
 	refreshList(item_array);
 }
 
diff --git a/indra/newview/skins/default/xui/en/menu_wearing_tab.xml b/indra/newview/skins/default/xui/en/menu_wearing_tab.xml
index 85505f9972748c0dc4eff2c974ff7876ef3b15f4..2d54e6960139d5115a6db9dc011874ad0c3cc2b4 100644
--- a/indra/newview/skins/default/xui/en/menu_wearing_tab.xml
+++ b/indra/newview/skins/default/xui/en/menu_wearing_tab.xml
@@ -2,6 +2,24 @@
 <context_menu
  layout="topleft"
  name="Wearing">
+    <menu_item_call
+     label="Take Off"
+     layout="topleft"
+     name="take_off">
+        <on_click
+         function="Wearing.TakeOff" />
+    </menu_item_call>
+    <menu_item_call
+     label="Detach"
+     layout="topleft"
+     name="detach">
+        <on_click
+         function="Wearing.Detach"
+         parameter="detach"/>
+    </menu_item_call>
+    <menu_item_separator
+     layout="topleft"
+     name="edit_outfit_separator" />
     <menu_item_call
      label="Edit Outfit"
      layout="topleft"
diff --git a/indra/newview/skins/default/xui/en/panel_topinfo_bar.xml b/indra/newview/skins/default/xui/en/panel_topinfo_bar.xml
index d8f4297e0ccbbad71ac5ca8ebc0d8e737ba05cbe..30d3064e143db7a716577268daa3da1193dbdb2e 100644
--- a/indra/newview/skins/default/xui/en/panel_topinfo_bar.xml
+++ b/indra/newview/skins/default/xui/en/panel_topinfo_bar.xml
@@ -36,7 +36,7 @@
     enabled="true"
     follows="right|top"
     height="18"
-    image_name="Parcel_VoiceNo_Light"
+    image_name="Parcel_VoiceNo_Dark"
     name="voice_icon"
     top="1"
     visible="false"
@@ -45,7 +45,7 @@
   <icon
     follows="right|top"
     height="18"
-    image_name="Parcel_FlyNo_Light"
+    image_name="Parcel_FlyNo_Dark"
     name="fly_icon"
     top="1"
     visible="false"
@@ -54,7 +54,7 @@
   <icon
     follows="right|top"
     height="18"
-    image_name="Parcel_PushNo_Light"
+    image_name="Parcel_PushNo_Dark"
     name="push_icon"
     top="1"
     visible="false"
@@ -63,7 +63,7 @@
   <icon
     follows="right|top"
     height="18"
-    image_name="Parcel_BuildNo_Light"
+    image_name="Parcel_BuildNo_Dark"
     name="build_icon"
     top="1"
     visible="false"
@@ -72,7 +72,7 @@
   <icon
     follows="right|top"
     height="18"
-    image_name="Parcel_ScriptsNo_Light"
+    image_name="Parcel_ScriptsNo_Dark"
     name="scripts_icon"
     top="1"
     visible="false"
diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml
index 04d8c53d97adb27962830fd21f810ffbcfcf0261..676bef2d0be736242a364a42d14c28dcd8fc4cce 100644
--- a/indra/newview/skins/default/xui/en/strings.xml
+++ b/indra/newview/skins/default/xui/en/strings.xml
@@ -3265,4 +3265,6 @@ Abuse Report</string>
   <string name="DeleteItems">Delete selected items?</string>
   <string name="DeleteItem">Delete selected item?</string>
 
+  <string name="EmptyOutfitText">There are no items in this outfit</string>
+
   </strings>