diff --git a/indra/llui/llmenugl.cpp b/indra/llui/llmenugl.cpp
index e0e86ae228f90593dea75e65230549568b740ee9..b77126996e6aeb294757dde50e16fbf951c3d99a 100644
--- a/indra/llui/llmenugl.cpp
+++ b/indra/llui/llmenugl.cpp
@@ -3420,6 +3420,12 @@ BOOL LLMenuHolderGL::handleKey(KEY key, MASK mask, BOOL called_from_parent)
 			
 	if (pMenu)
 	{
+		//eat TAB key - EXT-7000
+		if (key == KEY_TAB && mask == MASK_NONE)
+		{
+			return TRUE;
+		}
+
 		//handle ESCAPE and RETURN key
 		handled = LLPanel::handleKey(key, mask, called_from_parent);
 		if (!handled)
@@ -3726,10 +3732,14 @@ void LLContextMenuBranch::buildDrawLabel( void )
 
 void	LLContextMenuBranch::showSubMenu()
 {
-	S32 center_x;
-	S32 center_y;
-	localPointToScreen(getRect().getWidth(), getRect().getHeight() , &center_x, &center_y);
-	mBranch->show(	center_x, center_y);
+	LLMenuItemGL* menu_item = mBranch->getParentMenuItem();
+	if (menu_item != NULL && menu_item->getVisible())
+	{
+		S32 center_x;
+		S32 center_y;
+		localPointToScreen(getRect().getWidth(), getRect().getHeight() , &center_x, &center_y);
+		mBranch->show(center_x, center_y);
+	}
 }
 
 // onCommit() - do the primary funcationality of the menu item.
diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index 4e4c0274e7752a1eab4f5bea850ca5d08de1f2e9..f71662a7c805ad34aa6a6194fa5ad81a53c81ee6 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -3578,6 +3578,17 @@
       <key>Value</key>
       <integer>1024</integer>
     </map>
+    <key>GesturesMarketplaceURL</key>
+    <map>
+      <key>Comment</key>
+      <string>URL to the Gestures Marketplace</string>
+      <key>Persist</key>
+      <integer>0</integer>
+      <key>Type</key>
+      <string>String</string>
+      <key>Value</key>
+      <string>https://www.xstreetsl.com/modules.php?name=Marketplace&amp;CategoryID=233</string>
+    </map>
     <key>GridCrossSections</key>
     <map>
       <key>Comment</key>
diff --git a/indra/newview/llavatarlist.cpp b/indra/newview/llavatarlist.cpp
index 47ec5270c3ed33c3cff2cd1ed6ac0947f7b7f112..72ee289c91d565d4433b25f0dd0fa5fde55ffafa 100644
--- a/indra/newview/llavatarlist.cpp
+++ b/indra/newview/llavatarlist.cpp
@@ -399,6 +399,15 @@ BOOL LLAvatarList::handleRightMouseDown(S32 x, S32 y, MASK mask)
 	return handled;
 }
 
+void LLAvatarList::setVisible(BOOL visible)
+{
+	if ( visible == FALSE && mContextMenu )
+	{
+		mContextMenu->hide();
+	}
+	LLFlatListViewEx::setVisible(visible);
+}
+
 void LLAvatarList::computeDifference(
 	const uuid_vec_t& vnew_unsorted,
 	uuid_vec_t& vadded,
diff --git a/indra/newview/llavatarlist.h b/indra/newview/llavatarlist.h
index ff090f3a341c8399a7da3a1c64c8d2aa6d95c081..a9320055ca350f382e28b62527b1c88eea58b0d1 100644
--- a/indra/newview/llavatarlist.h
+++ b/indra/newview/llavatarlist.h
@@ -70,6 +70,8 @@ class LLAvatarList : public LLFlatListViewEx
 
 	virtual void clear();
 
+	virtual void setVisible(BOOL visible);
+
 	void setNameFilter(const std::string& filter);
 	void setDirty(bool val = true, bool force_refresh = false);
 	uuid_vec_t& getIDs() 							{ return mIDs; }
diff --git a/indra/newview/llavatarlistitem.h b/indra/newview/llavatarlistitem.h
index 3ba2c7a3e3d4aba4553ef15a04ea816209c81c95..c6fac7a9f1cc749f0595c78aeaafce38f48a9335 100644
--- a/indra/newview/llavatarlistitem.h
+++ b/indra/newview/llavatarlistitem.h
@@ -71,6 +71,7 @@ class LLAvatarListItem : public LLPanel, public LLFriendObserver
 	{
 	public:
 		virtual void show(LLView* spawning_view, const uuid_vec_t& selected_uuids, S32 x, S32 y) = 0;
+		virtual void hide() = 0;
 	};
 
 	/**
diff --git a/indra/newview/llbottomtray.cpp b/indra/newview/llbottomtray.cpp
index 226d5593c9ac3358b6f396ac003747fd44fabf69..7f528c88b2e37c258f408003d4e4e5a759ad4e3b 100644
--- a/indra/newview/llbottomtray.cpp
+++ b/indra/newview/llbottomtray.cpp
@@ -479,6 +479,10 @@ BOOL LLBottomTray::postBuild()
 
 	initResizeStateContainers();
 
+	setButtonsControlsAndListeners();
+
+	initButtonsVisibility();
+
 	// update wells visibility:
 	showWellButton(RS_IM_WELL, !LLIMWellWindow::getInstance()->isWindowEmpty());
 	showWellButton(RS_NOTIFICATION_WELL, !LLNotificationWellWindow::getInstance()->isWindowEmpty());
@@ -1091,52 +1095,108 @@ void LLBottomTray::processExtendButton(EResizeState processed_object_type, S32&
 
 bool LLBottomTray::canButtonBeShown(EResizeState processed_object_type) const
 {
+	// 0. Check if passed button was previously hidden on resize
 	bool can_be_shown = mResizeState & processed_object_type;
 	if (can_be_shown)
 	{
-		static MASK MOVEMENT_PREVIOUS_BUTTONS_MASK = RS_BUTTON_GESTURES;
-		static MASK CAMERA_PREVIOUS_BUTTONS_MASK = RS_BUTTON_GESTURES | RS_BUTTON_MOVEMENT;
-		static MASK SNAPSHOT_PREVIOUS_BUTTONS_MASK = RS_BUTTON_GESTURES | RS_BUTTON_MOVEMENT | RS_BUTTON_CAMERA;
+		// Yes, it was. Lets now check that all buttons before it (that can be hidden on resize)
+		// are already shown
+
+		// process buttons in direct order (from left to right)
+		resize_state_vec_t::const_iterator it = mButtonsProcessOrder.begin();
+		const resize_state_vec_t::const_iterator it_end = mButtonsProcessOrder.end();
 
-		switch(processed_object_type)
+		// 1. Find and accumulate all buttons types before one passed into the method.
+		MASK buttons_before_mask = RS_NORESIZE;
+		for (; it != it_end; ++it)
 		{
-		case RS_BUTTON_GESTURES: // Gestures should be shown first
-			break;
-		case RS_BUTTON_MOVEMENT: // Move only if gesture is shown
-			can_be_shown = !(MOVEMENT_PREVIOUS_BUTTONS_MASK & mResizeState);
-			break;
-		case RS_BUTTON_CAMERA:
-			can_be_shown = !(CAMERA_PREVIOUS_BUTTONS_MASK & mResizeState);
-			break;
-		case RS_BUTTON_SNAPSHOT:
-			can_be_shown = !(SNAPSHOT_PREVIOUS_BUTTONS_MASK & mResizeState);
-			break;
-		default: // nothing to do here
-			break;
+			const EResizeState button_type = *it;
+			if (button_type == processed_object_type) break;
+
+			buttons_before_mask |= button_type;
 		}
+
+		// 2. Check if some previous buttons are still hidden on resize
+		can_be_shown = !(buttons_before_mask & mResizeState);
 	}
 	return can_be_shown;
 }
 
 void LLBottomTray::initResizeStateContainers()
 {
+	// *TODO: get rid of mGesturePanel, mMovementPanel, mCamPanel, mSnapshotPanel instance members
 	// init map with objects should be processed for each type
 	mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_GESTURES, mGesturePanel));
 	mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_MOVEMENT, mMovementPanel));
 	mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_CAMERA, mCamPanel));
 	mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_SNAPSHOT, mSnapshotPanel));
-
-	// init default widths
-	mObjectDefaultWidthMap[RS_BUTTON_GESTURES] = mGesturePanel->getRect().getWidth();
-	mObjectDefaultWidthMap[RS_BUTTON_MOVEMENT] = mMovementPanel->getRect().getWidth();
-	mObjectDefaultWidthMap[RS_BUTTON_CAMERA]   = mCamPanel->getRect().getWidth();
-	mObjectDefaultWidthMap[RS_BUTTON_SPEAK]	   = mSpeakPanel->getRect().getWidth();
+	mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_BUILD, getChild<LLPanel>("build_btn_panel")));
+	mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_SEARCH, getChild<LLPanel>("search_btn_panel")));
+	mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_WORLD_MAP, getChild<LLPanel>("world_map_btn_panel")));
+	mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_MINI_MAP, getChild<LLPanel>("mini_map_btn_panel")));
 
 	// init an order of processed buttons
 	mButtonsProcessOrder.push_back(RS_BUTTON_GESTURES);
 	mButtonsProcessOrder.push_back(RS_BUTTON_MOVEMENT);
 	mButtonsProcessOrder.push_back(RS_BUTTON_CAMERA);
 	mButtonsProcessOrder.push_back(RS_BUTTON_SNAPSHOT);
+	mButtonsProcessOrder.push_back(RS_BUTTON_BUILD);
+	mButtonsProcessOrder.push_back(RS_BUTTON_SEARCH);
+	mButtonsProcessOrder.push_back(RS_BUTTON_WORLD_MAP);
+	mButtonsProcessOrder.push_back(RS_BUTTON_MINI_MAP);
+
+	// init default widths
+
+	// process buttons that can be hidden on resize...
+	resize_state_vec_t::const_iterator it = mButtonsProcessOrder.begin();
+	const resize_state_vec_t::const_iterator it_end = mButtonsProcessOrder.end();
+
+	for (; it != it_end; ++it)
+	{
+		const EResizeState button_type = *it;
+		// is there an appropriate object?
+		if (0 == mStateProcessedObjectMap.count(button_type)) continue;
+
+		// set default width for it.
+		mObjectDefaultWidthMap[button_type] = mStateProcessedObjectMap[button_type]->getRect().getWidth();
+	}
+
+	// ... and add Speak button because it also can be shrunk.
+	mObjectDefaultWidthMap[RS_BUTTON_SPEAK]	   = mSpeakPanel->getRect().getWidth();
+
+}
+
+void LLBottomTray::initButtonsVisibility()
+{
+	// *TODO: move control settings of other buttons here
+	setTrayButtonVisibleIfPossible(RS_BUTTON_BUILD, gSavedSettings.getBOOL("ShowBuildButton"));
+	setTrayButtonVisibleIfPossible(RS_BUTTON_SEARCH, gSavedSettings.getBOOL("ShowSearchButton"));
+	setTrayButtonVisibleIfPossible(RS_BUTTON_WORLD_MAP, gSavedSettings.getBOOL("ShowWorldMapButton"));
+	setTrayButtonVisibleIfPossible(RS_BUTTON_MINI_MAP, gSavedSettings.getBOOL("ShowMiniMapButton"));
+}
+
+void LLBottomTray::setButtonsControlsAndListeners()
+{
+	// *TODO: move control settings of other buttons here
+	gSavedSettings.declareBOOL("ShowBuildButton", TRUE, "Shows/Hides Build button in the bottom tray. (Declared in code)");
+	gSavedSettings.declareBOOL("ShowSearchButton", TRUE, "Shows/Hides Search button in the bottom tray. (Declared in code)");
+	gSavedSettings.declareBOOL("ShowWorldMapButton", TRUE, "Shows/Hides Map button in the bottom tray. (Declared in code)");
+	gSavedSettings.declareBOOL("ShowMiniMapButton", TRUE, "Shows/Hides Mini-Map button in the bottom tray. (Declared in code)");
+
+
+	gSavedSettings.getControl("ShowBuildButton")->getSignal()->connect(boost::bind(&LLBottomTray::toggleShowButton, RS_BUTTON_BUILD, _2));
+	gSavedSettings.getControl("ShowSearchButton")->getSignal()->connect(boost::bind(&LLBottomTray::toggleShowButton, RS_BUTTON_SEARCH, _2));
+	gSavedSettings.getControl("ShowWorldMapButton")->getSignal()->connect(boost::bind(&LLBottomTray::toggleShowButton, RS_BUTTON_WORLD_MAP, _2));
+	gSavedSettings.getControl("ShowMiniMapButton")->getSignal()->connect(boost::bind(&LLBottomTray::toggleShowButton, RS_BUTTON_MINI_MAP, _2));
+}
+
+bool LLBottomTray::toggleShowButton(LLBottomTray::EResizeState button_type, const LLSD& new_visibility)
+{
+	if (LLBottomTray::instanceExists())
+	{
+		LLBottomTray::getInstance()->setTrayButtonVisibleIfPossible(button_type, new_visibility.asBoolean());
+	}
+	return true;
 }
 
 void LLBottomTray::setTrayButtonVisible(EResizeState shown_object_type, bool visible)
diff --git a/indra/newview/llbottomtray.h b/indra/newview/llbottomtray.h
index e9d59e82ba284434f069d9c0470e6fd9b96c4f64..5588aefb42489742190e873de2d1abeb50228c2d 100644
--- a/indra/newview/llbottomtray.h
+++ b/indra/newview/llbottomtray.h
@@ -120,12 +120,24 @@ class LLBottomTray
 		, RS_BUTTON_SPEAK		= 0x0040
 		, RS_IM_WELL			= 0x0080
 		, RS_NOTIFICATION_WELL	= 0x0100
+		, RS_BUTTON_BUILD		= 0x0200
+		, RS_BUTTON_SEARCH		= 0x0400
+		, RS_BUTTON_WORLD_MAP	= 0x0800
+		, RS_BUTTON_MINI_MAP	= 0x1000
+
+		/*
+		Once new button that can be hidden on resize is added don't forget to update related places:
+			- RS_BUTTONS_CAN_BE_HIDDEN enum value below.
+			- initResizeStateContainers(): mStateProcessedObjectMap and mButtonsProcessOrder
+		*/
 
 		/**
 		 * Specifies buttons which can be hidden when bottom tray is shrunk.
 		 * They are: Gestures, Movement (Move), Camera (View), Snapshot
+		 *		new: Build, Search, Map, World Map, Mini-Map.
 		 */
 		, RS_BUTTONS_CAN_BE_HIDDEN = RS_BUTTON_SNAPSHOT | RS_BUTTON_CAMERA | RS_BUTTON_MOVEMENT | RS_BUTTON_GESTURES
+									| RS_BUTTON_BUILD | RS_BUTTON_SEARCH | RS_BUTTON_WORLD_MAP | RS_BUTTON_MINI_MAP
 	}EResizeState;
 
 	/**
@@ -271,6 +283,28 @@ class LLBottomTray
 	 */
 	void initResizeStateContainers();
 
+	/**
+	 * Initializes buttons' visibility depend on stored Control Settings.
+	 */
+	void initButtonsVisibility();
+
+	/**
+	 * Initializes listeners of Control Settings to toggle appropriate buttons' visibility.
+	 *
+	 * @see toggleShowButton()
+	 */
+	void setButtonsControlsAndListeners();
+
+	/**
+	 * Toggles visibility of specified button depend on passed value.
+	 *
+	 * @param button_type - type of button to be toggled
+	 * @param new_visibility - new visibility of the button
+	 *
+	 * @see setButtonsControlsAndListeners()
+	 */
+	static bool toggleShowButton(EResizeState button_type, const LLSD& new_visibility);
+
 	/**
 	 * Sets passed visibility to object specified by resize type.
 	 */
diff --git a/indra/newview/llchatitemscontainerctrl.cpp b/indra/newview/llchatitemscontainerctrl.cpp
index 5b6a99e793c10d80736a54229514c72de82a6004..35a244c4616a9a70e32b17d6157198494d6eea46 100644
--- a/indra/newview/llchatitemscontainerctrl.cpp
+++ b/indra/newview/llchatitemscontainerctrl.cpp
@@ -326,12 +326,14 @@ void LLNearbyChatToastPanel::draw()
 		if(icon)
 		{
 			icon->setDrawTooltip(mSourceType == CHAT_SOURCE_AGENT);
-			if(mSourceType == CHAT_SOURCE_AGENT)
-				icon->setValue(mFromID);
+			if(mSourceType == CHAT_SOURCE_OBJECT)
+				icon->setValue(LLSD("OBJECT_Icon"));
 			else if(mSourceType == CHAT_SOURCE_SYSTEM)
 				icon->setValue(LLSD("SL_Logo"));
-			else
-				icon->setValue(LLSD("OBJECT_Icon"));
+			else if(mSourceType == CHAT_SOURCE_AGENT)
+				icon->setValue(mFromID);
+			else if(!mFromID.isNull())
+				icon->setValue(mFromID);
 		}
 		mIsDirty = false;
 	}
diff --git a/indra/newview/llfolderview.cpp b/indra/newview/llfolderview.cpp
index 2ae11aa2b54fe04bc8afde597bcd60cda93541b0..a87f7288fa9f1e20b9335ea8b0692f941aa2a67a 100644
--- a/indra/newview/llfolderview.cpp
+++ b/indra/newview/llfolderview.cpp
@@ -1744,6 +1744,8 @@ BOOL LLFolderView::handleMouseDown( S32 x, S32 y, MASK mask )
 
 	mParentPanel->setFocus(TRUE);
 
+	LLEditMenuHandler::gEditMenuHandler = this;
+
 	return LLView::handleMouseDown( x, y, mask );
 }
 
diff --git a/indra/newview/llinventoryitemslist.cpp b/indra/newview/llinventoryitemslist.cpp
index 2d1d401cd403b0b709ef794eb29f79b48902f4d7..9b592e79aff156735ed759ab8e377fa6d2b67fc8 100644
--- a/indra/newview/llinventoryitemslist.cpp
+++ b/indra/newview/llinventoryitemslist.cpp
@@ -322,7 +322,7 @@ LLInventoryItemsList::Params::Params()
 LLInventoryItemsList::LLInventoryItemsList(const LLInventoryItemsList::Params& p)
 :	LLFlatListViewEx(p)
 ,	mNeedsRefresh(false)
-,	mPrevVisibility(false)
+,	mForceRefresh(false)
 {
 	// TODO: mCommitOnSelectionChange is set to "false" in LLFlatListView
 	// but reset to true in all derived classes. This settings might need to
@@ -356,14 +356,13 @@ boost::signals2::connection LLInventoryItemsList::setRefreshCompleteCallback(con
 
 void LLInventoryItemsList::doIdle()
 {
-	bool cur_visibility = getVisible();
-	if(cur_visibility != mPrevVisibility || mNeedsRefresh)
+	if (!mNeedsRefresh) return;
+
+	if (isInVisibleChain() || mForceRefresh)
 	{
 		refresh();
 
 		mRefreshCompleteSignal(this, LLSD());
-
-		mPrevVisibility = getVisible();
 	}
 }
 
@@ -414,6 +413,7 @@ void LLInventoryItemsList::refresh()
 
 	bool needs_refresh = add_limit_exceeded;
 	setNeedsRefresh(needs_refresh);
+	setForceRefresh(needs_refresh);
 }
 
 void LLInventoryItemsList::computeDifference(
diff --git a/indra/newview/llinventoryitemslist.h b/indra/newview/llinventoryitemslist.h
index 60cccc0f4f4f02f562763ebd7adc29d45615ecfc..a3863b511cb3be38cac112fe561004ff6366d165 100644
--- a/indra/newview/llinventoryitemslist.h
+++ b/indra/newview/llinventoryitemslist.h
@@ -221,6 +221,12 @@ class LLInventoryItemsList : public LLFlatListViewEx
 
 	bool getNeedsRefresh(){ return mNeedsRefresh; }
 
+	/**
+	 * Sets the flag indicating that the list needs to be refreshed even if it is
+	 * not currently visible.
+	 */
+	void setForceRefresh(bool force_refresh){ mForceRefresh = force_refresh; }
+
 	/**
 	 * Idle routine used to refresh the list regardless of the current list
 	 * visibility, unlike draw() which is called only for the visible list.
@@ -259,7 +265,7 @@ class LLInventoryItemsList : public LLFlatListViewEx
 					 // Will be used in refresh() to determine added and removed ids
 	bool mNeedsRefresh;
 
-	bool mPrevVisibility;
+	bool mForceRefresh;
 
 	commit_signal_t mRefreshCompleteSignal;
 };
diff --git a/indra/newview/llinventoryobserver.cpp b/indra/newview/llinventoryobserver.cpp
index c24d2ee0eaf0f2271405e6805f32784d19737313..85575488879111aa9679103ce767f3685c16d912 100644
--- a/indra/newview/llinventoryobserver.cpp
+++ b/indra/newview/llinventoryobserver.cpp
@@ -493,7 +493,7 @@ void LLInventoryExistenceObserver::changed(U32 mask)
 	}
 }
 
-void LLInventoryMoveFromWorldObserver::changed(U32 mask)
+void LLInventoryAddItemByAssetObserver::changed(U32 mask)
 {
 	if(!(mask & LLInventoryObserver::ADD))
 	{
@@ -535,7 +535,7 @@ void LLInventoryMoveFromWorldObserver::changed(U32 mask)
 	}
 }
 
-void LLInventoryMoveFromWorldObserver::watchAsset(const LLUUID& asset_id)
+void LLInventoryAddItemByAssetObserver::watchAsset(const LLUUID& asset_id)
 {
 	if(asset_id.notNull())
 	{
@@ -551,7 +551,7 @@ void LLInventoryMoveFromWorldObserver::watchAsset(const LLUUID& asset_id)
 	}
 }
 
-bool LLInventoryMoveFromWorldObserver::isAssetWatched( const LLUUID& asset_id )
+bool LLInventoryAddItemByAssetObserver::isAssetWatched( const LLUUID& asset_id )
 {
 	return std::find(mWatchedAssets.begin(), mWatchedAssets.end(), asset_id) != mWatchedAssets.end();
 }
diff --git a/indra/newview/llinventoryobserver.h b/indra/newview/llinventoryobserver.h
index 036e6ca40da2d46a297acdee707f447212ea4e9f..6d5a86a6fca9763148b9d807cff34ffa23e6934c 100644
--- a/indra/newview/llinventoryobserver.h
+++ b/indra/newview/llinventoryobserver.h
@@ -180,10 +180,10 @@ class LLInventoryExistenceObserver : public LLInventoryObserver
 // something useful.
 //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
-class LLInventoryMoveFromWorldObserver : public LLInventoryObserver
+class LLInventoryAddItemByAssetObserver : public LLInventoryObserver
 {
 public:
-	LLInventoryMoveFromWorldObserver() : mIsDirty(false) {}
+	LLInventoryAddItemByAssetObserver() : mIsDirty(false) {}
 	virtual void changed(U32 mask);
 
 	void watchAsset(const LLUUID& asset_id);
diff --git a/indra/newview/llnearbychatbar.cpp b/indra/newview/llnearbychatbar.cpp
index 1507b7d324bc86a455889bd7e4d67d7f9e1a86da..bd504906d54ddb53efa743e9ea1a8cdde284fb2f 100644
--- a/indra/newview/llnearbychatbar.cpp
+++ b/indra/newview/llnearbychatbar.cpp
@@ -79,6 +79,7 @@ LLGestureComboList::LLGestureComboList(const LLGestureComboList::Params& p)
 :	LLUICtrl(p)
 	, mLabel(p.label)
 	, mViewAllItemIndex(0)
+	, mGetMoreItemIndex(0)
 {
 	LLButton::Params button_params = p.combo_button;
 	button_params.follows.flags(FOLLOWS_LEFT|FOLLOWS_BOTTOM|FOLLOWS_RIGHT);
@@ -260,9 +261,12 @@ void LLGestureComboList::refreshGestures()
 
 	sortByName();
 
-	// store index followed by the last added Gesture and add View All item at bottom
-	mViewAllItemIndex = idx;
-	
+	// store indices for Get More and View All items (idx is the index followed by the last added Gesture)
+	mGetMoreItemIndex = idx;
+	mViewAllItemIndex = idx + 1;
+
+	// add Get More and View All items at the bottom
+	mList->addSimpleElement(LLTrans::getString("GetMoreGestures"), ADD_BOTTOM, LLSD(mGetMoreItemIndex));
 	mList->addSimpleElement(LLTrans::getString("ViewAllGestures"), ADD_BOTTOM, LLSD(mViewAllItemIndex));
 
 	// Insert label after sorting, at top, with separator below it
@@ -318,6 +322,12 @@ void LLGestureComboList::onCommitGesture()
 			return;
 		}
 
+		if (mGetMoreItemIndex == index)
+		{
+			LLWeb::loadURLExternal(gSavedSettings.getString("GesturesMarketplaceURL"));
+			return;
+		}
+
 		LLMultiGesture* gesture = mGestures.at(index);
 		if(gesture)
 		{
diff --git a/indra/newview/llnearbychatbar.h b/indra/newview/llnearbychatbar.h
index dd467d79780e4c73b39ff4f2f017643df2863678..5af3152662f9fbd2894d0bf2290421a6648802d0 100644
--- a/indra/newview/llnearbychatbar.h
+++ b/indra/newview/llnearbychatbar.h
@@ -62,6 +62,7 @@ class LLGestureComboList
 	std::vector<LLMultiGesture*> mGestures;
 	std::string mLabel;
 	LLSD::Integer mViewAllItemIndex;
+	LLSD::Integer mGetMoreItemIndex;
 
 public:
 
diff --git a/indra/newview/lloutfitslist.cpp b/indra/newview/lloutfitslist.cpp
index 12d520342996f081fe56f2ff716b9ca09a2d4f31..43b7e15977089ca17e58d20501b907c3f5c4c84f 100644
--- a/indra/newview/lloutfitslist.cpp
+++ b/indra/newview/lloutfitslist.cpp
@@ -170,7 +170,7 @@ void LLOutfitsList::refreshList(const LLUUID& category_id)
 		list->setCommitCallback(boost::bind(&LLOutfitsList::onSelectionChange, this, _1));
 
 		// Setting list refresh callback to apply filter on list change.
-		list->setRefreshCompleteCallback(boost::bind(&LLOutfitsList::onWearableItemsListRefresh, this, _1));
+		list->setRefreshCompleteCallback(boost::bind(&LLOutfitsList::onFilteredWearableItemsListRefresh, this, _1));
 
 		// Fetch the new outfit contents.
 		cat->fetch();
@@ -178,6 +178,21 @@ void LLOutfitsList::refreshList(const LLUUID& category_id)
 		// Refresh the list of outfit items after fetch().
 		// Further list updates will be triggered by the category observer.
 		list->updateList(cat_id);
+
+		// If filter is currently applied we store the initial tab state and
+		// open it to show matched items if any.
+		if (!mFilterSubString.empty())
+		{
+			tab->notifyChildren(LLSD().with("action","store_state"));
+			tab->setDisplayChildren(true);
+
+			// Setting mForceRefresh flag will make the list refresh its contents
+			// even if it is not currently visible. This is required to apply the
+			// filter to the newly added list.
+			list->setForceRefresh(true);
+
+			list->setFilterSubString(mFilterSubString);
+		}
 	}
 
 	// Handle removed tabs.
@@ -327,7 +342,7 @@ void LLOutfitsList::changeOutfitSelection(LLWearableItemsList* list, const LLUUI
 	mSelectedOutfitUUID = category_id;
 }
 
-void LLOutfitsList::onWearableItemsListRefresh(LLUICtrl* ctrl)
+void LLOutfitsList::onFilteredWearableItemsListRefresh(LLUICtrl* ctrl)
 {
 	if (!ctrl || mFilterSubString.empty())
 		return;
@@ -338,7 +353,7 @@ void LLOutfitsList::onWearableItemsListRefresh(LLUICtrl* ctrl)
 		 iter != iter_end; ++iter)
 	{
 		LLAccordionCtrlTab* tab = iter->second;
-		if (tab) continue;
+		if (!tab) continue;
 
 		LLWearableItemsList* list = dynamic_cast<LLWearableItemsList*>(tab->getAccordionView());
 		if (list != ctrl) continue;
@@ -395,8 +410,6 @@ void LLOutfitsList::applyFilter(const std::string& new_filter_substring)
 
 		if (!new_filter_substring.empty())
 		{
-			tab->setDisplayChildren(true);
-
 			std::string title = tab->getTitle();
 			LLStringUtil::toUpper(title);
 
@@ -413,6 +426,18 @@ void LLOutfitsList::applyFilter(const std::string& new_filter_substring)
 			{
 				tab->setTitle(tab->getTitle(), cur_filter);
 			}
+
+			if (tab->getVisible())
+			{
+				// Open tab if it has passed the filter.
+				tab->setDisplayChildren(true);
+			}
+			else
+			{
+				// Set force refresh flag to refresh not visible list
+				// when some changes occur in it.
+				list->setForceRefresh(true);
+			}
 		}
 		else
 		{
diff --git a/indra/newview/lloutfitslist.h b/indra/newview/lloutfitslist.h
index bcb393b12a0ca4d08826c3327077968ac0ad1d50..8eaa39e6f1f96693f567b996517099b45198fd1c 100644
--- a/indra/newview/lloutfitslist.h
+++ b/indra/newview/lloutfitslist.h
@@ -98,7 +98,7 @@ class LLOutfitsList : public LLPanel, public LLInventoryObserver
 	 * Called upon list refresh event to update tab visibility depending on
 	 * the results of applying filter to the title and list items of the tab.
 	 */
-	void onWearableItemsListRefresh(LLUICtrl* ctrl);
+	void onFilteredWearableItemsListRefresh(LLUICtrl* ctrl);
 
 	/**
 	 * Highlights filtered items and hides tabs which haven't passed filter.
diff --git a/indra/newview/llpanelgroupgeneral.cpp b/indra/newview/llpanelgroupgeneral.cpp
index ddd41a179196db9af431e3576b187934ec16368c..555248e31ab1f75481d245522bb25567ae0eea7d 100644
--- a/indra/newview/llpanelgroupgeneral.cpp
+++ b/indra/newview/llpanelgroupgeneral.cpp
@@ -212,7 +212,6 @@ void LLPanelGroupGeneral::setupCtrls(LLPanel* panel_group)
 	if (mInsignia)
 	{
 		mInsignia->setCommitCallback(onCommitAny, this);
-		mDefaultIconID = mInsignia->getImageAssetID();
 	}
 	mFounderName = getChild<LLNameBox>("founder_name");
 
@@ -656,7 +655,7 @@ void LLPanelGroupGeneral::update(LLGroupChange gc)
 		}
 		else
 		{
-			mInsignia->setImageAssetID(mDefaultIconID);
+			mInsignia->setImageAssetName(mInsignia->getDefaultImageName());
 		}
 	}
 
@@ -846,16 +845,7 @@ void LLPanelGroupGeneral::reset()
 	
 	mInsignia->setEnabled(true);
 
-	LLPointer<LLUIImage> imagep = LLUI::getUIImage(mInsignia->getDefaultImageName());
-	if(imagep)
-	{
-		LLViewerFetchedTexture* pTexture = dynamic_cast<LLViewerFetchedTexture*>(imagep->getImage().get());
-		if(pTexture)
-		{
-			LLUUID id = pTexture->getID();
-			mInsignia->setImageAssetID(id);
-		}
-	}
+	mInsignia->setImageAssetName(mInsignia->getDefaultImageName());
 
 	{
 		std::string empty_str = "";
diff --git a/indra/newview/llpanelgroupgeneral.h b/indra/newview/llpanelgroupgeneral.h
index 624501887121019f141600c8f33a414f12aca8e7..6f4fa994da8f87ac3ec42aed708e33b199afc51d 100644
--- a/indra/newview/llpanelgroupgeneral.h
+++ b/indra/newview/llpanelgroupgeneral.h
@@ -95,7 +95,6 @@ class LLPanelGroupGeneral : public LLPanelGroupTab
 	BOOL			mChanged;
 	BOOL			mFirstUse;
 	std::string		mIncompleteMemberDataStr;
-	LLUUID			mDefaultIconID;
 
 	// Group information (include any updates in updateChanged)
 	LLLineEditor		*mGroupNameEditor;
diff --git a/indra/newview/llpanelgrouproles.cpp b/indra/newview/llpanelgrouproles.cpp
index a77ba0c69c526e187659836f60cba48ce360eafb..93fbecfd3f15a08003ac5c9091fd555d6ee5fb32 100644
--- a/indra/newview/llpanelgrouproles.cpp
+++ b/indra/newview/llpanelgrouproles.cpp
@@ -118,8 +118,7 @@ LLPanelGroupRoles::LLPanelGroupRoles()
 	mCurrentTab(NULL),
 	mRequestedTab( NULL ),
 	mSubTabContainer( NULL ),
-	mFirstUse( TRUE ),
-	mIgnoreTransition( FALSE )
+	mFirstUse( TRUE )
 {
 }
 
@@ -153,8 +152,8 @@ BOOL LLPanelGroupRoles::postBuild()
 
 		//subtabp->addObserver(this);
 	}
-	// Add click callbacks to all the tabs.
-	mSubTabContainer->setCommitCallback(boost::bind(&LLPanelGroupRoles::handleClickSubTab, this));
+	// Add click callbacks to tab switching.
+	mSubTabContainer->setValidateBeforeCommit(boost::bind(&LLPanelGroupRoles::handleSubTabSwitch, this, _1));
 
 	// Set the current tab to whatever is currently being shown.
 	mCurrentTab = (LLPanelGroupTab*) mSubTabContainer->getCurrentPanel();
@@ -196,30 +195,20 @@ BOOL LLPanelGroupRoles::isVisibleByAgent(LLAgent* agentp)
 								   
 }
 
-void LLPanelGroupRoles::handleClickSubTab()
+bool LLPanelGroupRoles::handleSubTabSwitch(const LLSD& data)
 {
-	// If we are already handling a transition,
-	// ignore this.
-	if (mIgnoreTransition)
-	{
-		return;
-	}
-
-	mRequestedTab = (LLPanelGroupTab*) mSubTabContainer->getCurrentPanel();
+	std::string panel_name = data.asString();
+	
+	LLPanelGroupTab* activating_tab = static_cast<LLPanelGroupTab*>(mSubTabContainer->getPanelByName(panel_name));
 
-	// Make sure they aren't just clicking the same tab...
-	if (mRequestedTab == mCurrentTab)
+	if(activating_tab == mCurrentTab
+		|| activating_tab == mRequestedTab)
 	{
-		return;
+		return true;
 	}
 
-	// Try to switch from the current panel to the panel the user selected.
-	attemptTransition();
-}
-
-BOOL LLPanelGroupRoles::attemptTransition()
-{
-	// Check if the current tab needs to be applied.
+	mRequestedTab = activating_tab;
+	
 	std::string mesg;
 	if (mCurrentTab && mCurrentTab->needsApply(mesg))
 	{
@@ -235,16 +224,10 @@ BOOL LLPanelGroupRoles::attemptTransition()
 		LLNotificationsUtil::add("PanelGroupApply", args, LLSD(),
 			boost::bind(&LLPanelGroupRoles::handleNotifyCallback, this, _1, _2));
 		mHasModal = TRUE;
-		// We need to reselect the current tab, since it isn't finished.
-		if (mSubTabContainer)
-		{
-			mIgnoreTransition = TRUE;
-			mSubTabContainer->selectTabPanel( mCurrentTab );
-			mIgnoreTransition = FALSE;
-		}
+		
 		// Returning FALSE will block a close action from finishing until
 		// we get a response back from the user.
-		return FALSE;
+		return false;
 	}
 	else
 	{
@@ -253,7 +236,7 @@ BOOL LLPanelGroupRoles::attemptTransition()
 		{
 			transitionToTab();
 		}
-		return TRUE;
+		return true;
 	}
 }
 
@@ -271,6 +254,7 @@ void LLPanelGroupRoles::transitionToTab()
 		// This is now the current tab;
 		mCurrentTab = mRequestedTab;
 		mCurrentTab->activate();
+		mRequestedTab = 0;
 	}
 }
 
@@ -278,6 +262,7 @@ bool LLPanelGroupRoles::handleNotifyCallback(const LLSD& notification, const LLS
 {
 	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
 	mHasModal = FALSE;
+	LLPanelGroupTab* transition_tab = mRequestedTab;
 	switch (option)
 	{
 	case 0: // "Apply Changes"
@@ -297,26 +282,20 @@ bool LLPanelGroupRoles::handleNotifyCallback(const LLSD& notification, const LLS
 			// Skip switching tabs.
 			break;
 		}
-
-		// This panel's info successfully applied.
-		// Switch to the next panel.
-		// No break!  Continue into 'Ignore Changes' which just switches tabs.
-		mIgnoreTransition = TRUE;
-		mSubTabContainer->selectTabPanel( mRequestedTab );
-		mIgnoreTransition = FALSE;
 		transitionToTab();
+		mSubTabContainer->selectTabPanel( transition_tab );
+		
 		break;
 	}
 	case 1: // "Ignore Changes"
 		// Switch to the requested panel without applying changes
 		cancel();
-		mIgnoreTransition = TRUE;
-		mSubTabContainer->selectTabPanel( mRequestedTab );
-		mIgnoreTransition = FALSE;
 		transitionToTab();
+		mSubTabContainer->selectTabPanel( transition_tab );
 		break;
 	case 2: // "Cancel"
 	default:
+		mRequestedTab = NULL;
 		// Do nothing.  The user is canceling the action.
 		break;
 	}
diff --git a/indra/newview/llpanelgrouproles.h b/indra/newview/llpanelgrouproles.h
index 98cebe9882bd801d539ec2f6668eb8da27a55df4..a877402041479ff425de86cc3cbdd462facf918f 100644
--- a/indra/newview/llpanelgrouproles.h
+++ b/indra/newview/llpanelgrouproles.h
@@ -65,7 +65,7 @@ class LLPanelGroupRoles : public LLPanelGroupTab
 	virtual BOOL isVisibleByAgent(LLAgent* agentp);
 
 	
-	void handleClickSubTab();
+	bool handleSubTabSwitch(const LLSD& data);
 
 	// Checks if the current tab needs to be applied, and tries to switch to the requested tab.
 	BOOL attemptTransition();
@@ -93,7 +93,6 @@ class LLPanelGroupRoles : public LLPanelGroupTab
 	LLPanelGroupTab*		mRequestedTab;
 	LLTabContainer*	mSubTabContainer;
 	BOOL					mFirstUse;
-	BOOL					mIgnoreTransition;
 
 	std::string				mDefaultNeedsApplyMesg;
 	std::string				mWantApplyMesg;
diff --git a/indra/newview/llpaneloutfitedit.cpp b/indra/newview/llpaneloutfitedit.cpp
index c04be851743683d14b65d7bf42e285ece6108d58..44832ac496025d011d3d56d0db505e94baf3561d 100644
--- a/indra/newview/llpaneloutfitedit.cpp
+++ b/indra/newview/llpaneloutfitedit.cpp
@@ -169,14 +169,48 @@ class LLCOFObserver : public LLInventoryObserver
 	S32 mBaseOutfitLastVersion;
 };
 
+class LLCOFDragAndDropObserver : public LLInventoryAddItemByAssetObserver
+{
+public:
+	LLCOFDragAndDropObserver(LLInventoryModel* model);
+
+	virtual ~LLCOFDragAndDropObserver();
+
+	virtual void done();
+
+private:
+	LLInventoryModel* mModel;
+};
+
+inline LLCOFDragAndDropObserver::LLCOFDragAndDropObserver(LLInventoryModel* model):
+		mModel(model)
+{
+	if (model != NULL)
+	{
+		model->addObserver(this);
+	}
+}
+
+inline LLCOFDragAndDropObserver::~LLCOFDragAndDropObserver()
+{
+	if (mModel != NULL && mModel->containsObserver(this))
+	{
+		mModel->removeObserver(this);
+	}
+}
 
+void LLCOFDragAndDropObserver::done()
+{
+	LLAppearanceMgr::instance().updateAppearanceFromCOF();
+}
 
 LLPanelOutfitEdit::LLPanelOutfitEdit()
 :	LLPanel(), 
 	mSearchFilter(NULL),
 	mCOFWearables(NULL),
 	mInventoryItemsPanel(NULL),
-	mCOFObserver(NULL)
+	mCOFObserver(NULL),
+	mCOFDragAndDropObserver(NULL)
 {
 	mSavedFolderState = new LLSaveFolderState();
 	mSavedFolderState->setApply(FALSE);
@@ -197,6 +231,7 @@ LLPanelOutfitEdit::~LLPanelOutfitEdit()
 	delete mSavedFolderState;
 
 	delete mCOFObserver;
+	delete mCOFDragAndDropObserver;
 }
 
 BOOL LLPanelOutfitEdit::postBuild()
@@ -234,6 +269,8 @@ BOOL LLPanelOutfitEdit::postBuild()
 	mInventoryItemsPanel->setSelectCallback(boost::bind(&LLPanelOutfitEdit::onInventorySelectionChange, this, _1, _2));
 	mInventoryItemsPanel->getRootFolder()->setReshapeCallback(boost::bind(&LLPanelOutfitEdit::onInventorySelectionChange, this, _1, _2));
 	
+	mCOFDragAndDropObserver = new LLCOFDragAndDropObserver(mInventoryItemsPanel->getModel());
+
 	LLComboBox* type_filter = getChild<LLComboBox>("filter_wearables_combobox");
 	type_filter->setCommitCallback(boost::bind(&LLPanelOutfitEdit::onTypeFilterChanged, this, _1));
 	type_filter->removeall();
@@ -522,6 +559,56 @@ void LLPanelOutfitEdit::update()
 	updateVerbs();
 }
 
+BOOL LLPanelOutfitEdit::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
+										  EDragAndDropType cargo_type,
+										  void* cargo_data,
+										  EAcceptance* accept,
+										  std::string& tooltip_msg)
+{
+	if (cargo_data == NULL)
+	{
+		llwarns << "cargo_data is NULL" << llendl;
+		return TRUE;
+	}
+
+	switch (cargo_type)
+	{
+	case DAD_BODYPART:
+	case DAD_CLOTHING:
+	case DAD_OBJECT:
+	case DAD_LINK:
+		*accept = ACCEPT_YES_MULTI;
+		break;
+	default:
+		*accept = ACCEPT_NO;
+	}
+
+	if (drop)
+	{
+		LLInventoryItem* item = static_cast<LLInventoryItem*>(cargo_data);
+
+		if (LLAssetType::lookupIsAssetIDKnowable(item->getType()))
+		{
+			mCOFDragAndDropObserver->watchAsset(item->getAssetUUID());
+
+			/*
+			 * Adding request to wear item. If the item is a link, then getLinkedUUID() will
+			 * return the ID of the linked item. Otherwise it will return the item's ID. The
+			 * second argument is used to delay the appearance update until all dragged items
+			 * are added to optimize user experience.
+			 */
+			LLAppearanceMgr::instance().addCOFItemLink(item->getLinkedUUID(), false);
+		}
+		else
+		{
+			// if asset id is not available for the item we must wear it immediately (attachments only)
+			LLAppearanceMgr::instance().addCOFItemLink(item->getLinkedUUID(), true);
+		}
+	}
+
+	return TRUE;
+}
+
 void LLPanelOutfitEdit::displayCurrentOutfit()
 {
 	if (!getVisible())
diff --git a/indra/newview/llpaneloutfitedit.h b/indra/newview/llpaneloutfitedit.h
index cb8283fca38375e40676b1fe3212756ab526fe50..953a70785c11f6bd76f5962ce0958e72f68d6723 100644
--- a/indra/newview/llpaneloutfitedit.h
+++ b/indra/newview/llpaneloutfitedit.h
@@ -50,6 +50,7 @@ class LLCOFWearables;
 class LLTextBox;
 class LLInventoryCategory;
 class LLCOFObserver;
+class LLCOFDragAndDropObserver;
 class LLInventoryPanel;
 class LLSaveFolderState;
 class LLFolderViewItem;
@@ -114,6 +115,12 @@ class LLPanelOutfitEdit : public LLPanel
 	 */
 	bool switchPanels(LLPanel* switch_from_panel, LLPanel* switch_to_panel);
 
+	virtual BOOL	handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
+									  EDragAndDropType cargo_type,
+									  void* cargo_data,
+									  EAcceptance* accept,
+									  std::string& tooltip_msg);
+
 private:
 
 
@@ -134,6 +141,8 @@ class LLPanelOutfitEdit : public LLPanel
 	LLPanel*						mWearableItemsPanel;
 
 	LLCOFObserver*	mCOFObserver;
+	LLCOFDragAndDropObserver* mCOFDragAndDropObserver;
+
 	std::vector<LLLookItemType> mLookItemTypes;
 
 	LLCOFWearables*		mCOFWearables;
diff --git a/indra/newview/llpaneloutfitsinventory.cpp b/indra/newview/llpaneloutfitsinventory.cpp
index 660615df5a78a5b8bc05550cdbf0d2e351b6d086..ea75c16c566c41a30ae2856c3ab9e2b2b3fe040f 100644
--- a/indra/newview/llpaneloutfitsinventory.cpp
+++ b/indra/newview/llpaneloutfitsinventory.cpp
@@ -134,11 +134,6 @@ void LLPanelOutfitsInventory::onOpen(const LLSD& key)
 
 void LLPanelOutfitsInventory::updateVerbs()
 {
-	if (mParent)
-	{
-		mParent->updateVerbs();
-	}
-
 	if (mListCommands)
 	{
 		updateListCommands();
diff --git a/indra/newview/llparticipantlist.cpp b/indra/newview/llparticipantlist.cpp
index daf116d2558939da700a00d87e650c5b5bbb9102..1117ae05d72dd4a2165d78b16650173b3538b3dc 100644
--- a/indra/newview/llparticipantlist.cpp
+++ b/indra/newview/llparticipantlist.cpp
@@ -655,6 +655,7 @@ LLContextMenu* LLParticipantList::LLParticipantListMenu::createMenu()
 	bool is_sort_visible = (mParent.mAvatarList && mParent.mAvatarList->size() > 1);
 	main_menu->setItemVisible("SortByName", is_sort_visible);
 	main_menu->setItemVisible("SortByRecentSpeakers", is_sort_visible);
+	main_menu->setItemVisible("Moderator Options Separator", isGroupModerator());
 	main_menu->setItemVisible("Moderator Options", isGroupModerator());
 	main_menu->setItemVisible("View Icons Separator", mParent.mAvatarListToggleIconsConnection.connected());
 	main_menu->setItemVisible("View Icons", mParent.mAvatarListToggleIconsConnection.connected());
diff --git a/indra/newview/llsidepanelappearance.cpp b/indra/newview/llsidepanelappearance.cpp
index 0086c6aec4c30c7527dc4e48879a15c4f05375ca..658a7b52e3bc622568c21ae50cdd6ed902d9bd3e 100644
--- a/indra/newview/llsidepanelappearance.cpp
+++ b/indra/newview/llsidepanelappearance.cpp
@@ -118,9 +118,6 @@ BOOL LLSidepanelAppearance::postBuild()
 
 	childSetAction("edit_outfit_btn", boost::bind(&LLSidepanelAppearance::onEditOutfitButtonClicked, this));
 
-	mEditBtn = getChild<LLButton>("edit_btn");
-	mEditBtn->setClickedCallback(boost::bind(&LLSidepanelAppearance::onEditButtonClicked, this));
-
 	mNewOutfitBtn = getChild<LLButton>("newlook_btn");
 	mNewOutfitBtn->setClickedCallback(boost::bind(&LLSidepanelAppearance::onNewOutfitButtonClicked, this));
 	mNewOutfitBtn->setEnabled(false);
@@ -172,24 +169,24 @@ void LLSidepanelAppearance::onOpen(const LLSD& key)
 {
 	fetchInventory();
 	refreshCurrentOutfitName();
-	updateVerbs();
 
 	if (mPanelOutfitsInventory)
 	{
 		mPanelOutfitsInventory->onOpen(key);
 	}
 
-	if(key.size() == 0)
+	if (!key.has("type"))
 		return;
-	
-	toggleOutfitEditPanel(TRUE);
-	updateVerbs();
-	
-	mLookInfoType = key["type"].asString();
 
-	if (mLookInfoType == "edit_outfit")
+	// Switch to the requested panel.
+	std::string type = key["type"].asString();
+	if (type == "my_outfits")
 	{
-		mOutfitEdit->displayCurrentOutfit();
+		showOutfitsInventoryPanel();
+	}
+	else if (type == "edit_outfit")
+	{
+		showOutfitEditPanel(/*update = */ true);
 	}
 }
 
@@ -233,6 +230,7 @@ void LLSidepanelAppearance::onOpenOutfitButtonClicked()
 	}
 }
 
+// *TODO: obsolete?
 void LLSidepanelAppearance::onEditAppearanceButtonClicked()
 {
 	if (gAgentWearables.areWearablesLoaded())
@@ -248,19 +246,6 @@ void LLSidepanelAppearance::onEditOutfitButtonClicked()
 	LLSideTray::getInstance()->showPanel("sidepanel_appearance", key);
 }
 
-void LLSidepanelAppearance::onEditButtonClicked()
-{
-	toggleOutfitEditPanel(FALSE);
-	toggleWearableEditPanel(TRUE, NULL);
-	/*if (mOutfitEdit->getVisible())
-	  {
-	  }
-	  else
-	  {
-	  mPanelOutfitsInventory->onEdit();
-	  }*/
-}
-
 void LLSidepanelAppearance::onNewOutfitButtonClicked()
 {
 	if (!mOutfitEdit->getVisible())
@@ -271,33 +256,27 @@ void LLSidepanelAppearance::onNewOutfitButtonClicked()
 
 void LLSidepanelAppearance::onEditWearBackClicked()
 {
-	mEditWearable->saveChanges();
-	toggleWearableEditPanel(FALSE, NULL);
-	toggleOutfitEditPanel(TRUE);
+	showOutfitEditPanel(/* update = */ false);
 }
 
 void LLSidepanelAppearance::showOutfitsInventoryPanel()
 {
-	mOutfitEdit->setVisible(FALSE);
-
-	mPanelOutfitsInventory->setVisible(TRUE);
-
-	mFilterEditor->setVisible(TRUE);
-	mEditBtn->setVisible(TRUE);
-	mNewOutfitBtn->setVisible(TRUE);
-	mCurrOutfitPanel->setVisible(TRUE);
+	toggleWearableEditPanel(FALSE);
+	toggleOutfitEditPanel(FALSE);
 }
 
-void LLSidepanelAppearance::showOutfitEditPanel()
+void LLSidepanelAppearance::showOutfitEditPanel(bool update)
 {
-	mOutfitEdit->setVisible(TRUE);
-	
-	mPanelOutfitsInventory->setVisible(FALSE);
+	if (!mOutfitEdit)
+		return;
+
+	toggleWearableEditPanel(FALSE);
+	toggleOutfitEditPanel(TRUE);
 
-	mFilterEditor->setVisible(FALSE);
-	mEditBtn->setVisible(FALSE);
-	mNewOutfitBtn->setVisible(FALSE);
-	mCurrOutfitPanel->setVisible(FALSE);
+	if (update)
+	{
+		mOutfitEdit->displayCurrentOutfit();
+	}
 }
 
 void LLSidepanelAppearance::toggleOutfitEditPanel(BOOL visible)
@@ -305,16 +284,27 @@ void LLSidepanelAppearance::toggleOutfitEditPanel(BOOL visible)
 	if (!mOutfitEdit)
 		return;
 
+	if (mOutfitEdit->getVisible() == visible)
+	{
+		// visibility isn't changing, hence nothing to do
+		return;
+	}
+
 	mOutfitEdit->setVisible(visible);
 	if (mPanelOutfitsInventory) mPanelOutfitsInventory->setVisible(!visible);
 	mFilterEditor->setVisible(!visible);
-	mEditBtn->setVisible(!visible);
 	mNewOutfitBtn->setVisible(!visible);
 	mCurrOutfitPanel->setVisible(!visible);
 }
 
 void LLSidepanelAppearance::toggleWearableEditPanel(BOOL visible, LLWearable *wearable)
 {
+	if (mEditWearable->getVisible() == visible)
+	{
+		// visibility isn't changing, hence nothing to do
+		return;
+	}
+
 	if (!wearable)
 	{
 		wearable = gAgentWearables.getWearable(LLWearableType::WT_SHAPE, 0);
@@ -324,6 +314,13 @@ void LLSidepanelAppearance::toggleWearableEditPanel(BOOL visible, LLWearable *we
 		return;
 	}
 
+	// Save changes if closing.
+	if (!visible)
+	{
+		mEditWearable->saveChanges();
+	}
+
+	// Toggle panel visibility.
 	mCurrOutfitPanel->setVisible(!visible);
 
 	mEditWearable->setVisible(visible);
@@ -332,21 +329,6 @@ void LLSidepanelAppearance::toggleWearableEditPanel(BOOL visible, LLWearable *we
 	mPanelOutfitsInventory->setVisible(!visible);
 }
 
-void LLSidepanelAppearance::updateVerbs()
-{
-	bool is_look_info_visible = mOutfitEdit->getVisible();
-
-	if (mPanelOutfitsInventory && !is_look_info_visible)
-	{
-//		const bool is_correct_type = (mPanelOutfitsInventory->getCorrectListenerForAction() != NULL);
-//		mEditBtn->setEnabled(is_correct_type);
-	}
-	else
-	{
-		mEditBtn->setEnabled(FALSE);
-	}
-}
-
 void LLSidepanelAppearance::refreshCurrentOutfitName(const std::string& name)
 {
 	// Set current outfit status (wearing/unsaved).
diff --git a/indra/newview/llsidepanelappearance.h b/indra/newview/llsidepanelappearance.h
index 2900831099687fe005e9e3c814b35f319aca28f9..a919b07ed69e131f883566d3c0652172aeb526d1 100644
--- a/indra/newview/llsidepanelappearance.h
+++ b/indra/newview/llsidepanelappearance.h
@@ -60,11 +60,10 @@ class LLSidepanelAppearance : public LLPanel
 
 	void fetchInventory();
 	void inventoryFetched();
-	void updateVerbs();
 	void onNewOutfitButtonClicked();
 
 	void showOutfitsInventoryPanel();
-	void showOutfitEditPanel();
+	void showOutfitEditPanel(bool update);
 	void setWearablesLoading(bool val);
 
 private:
@@ -73,12 +72,11 @@ class LLSidepanelAppearance : public LLPanel
 	void onOpenOutfitButtonClicked();
 	void onEditAppearanceButtonClicked();
 	void onEditOutfitButtonClicked();
-	void onEditButtonClicked();
 	void onEditWearBackClicked();
 
 	//@deprecated use showXXX() methods instead
 	void toggleOutfitEditPanel(BOOL visible);
-	void toggleWearableEditPanel(BOOL visible, LLWearable* wearable);
+	void toggleWearableEditPanel(BOOL visible, LLWearable* wearable = NULL);
 
 	LLFilterEditor*			mFilterEditor;
 	LLPanelOutfitsInventory* mPanelOutfitsInventory;
@@ -87,7 +85,6 @@ class LLSidepanelAppearance : public LLPanel
 
 	LLButton*					mOpenOutfitBtn;
 	LLButton*					mEditAppearanceBtn;
-	LLButton*					mEditBtn;
 	LLButton*					mNewOutfitBtn;
 	LLPanel*					mCurrOutfitPanel;
 
@@ -103,10 +100,6 @@ class LLSidepanelAppearance : public LLPanel
 	// Search string for filtering landmarks and teleport
 	// history locations
 	std::string					mFilterSubString;
-
-	// Information type currently shown in Look Information panel
-	std::string					mLookInfoType;
-
 };
 
 #endif //LL_LLSIDEPANELAPPEARANCE_H
diff --git a/indra/newview/llsidetray.h b/indra/newview/llsidetray.h
index 140a9c818a7a7b6f8b6e021091aeedad3e5ffd70..e8fdee94307f1c179719c4473a053f9775696134 100644
--- a/indra/newview/llsidetray.h
+++ b/indra/newview/llsidetray.h
@@ -94,7 +94,7 @@ class LLSideTray : public LLPanel, private LLDestroyClass<LLSideTray>
 	 * if no such tab - return NULL, otherwise a pointer to the panel
 	 * Pass params as array, or they may be overwritten(example - params["name"]="nearby")
 	 */
-	LLPanel*	showPanel		(const std::string& panel_name, const LLSD& params);
+	LLPanel*	showPanel		(const std::string& panel_name, const LLSD& params = LLSD());
 
 	/**
 	 * Toggling Side Tray tab which contains "sub_panel" child of "panel_name" panel.
@@ -102,7 +102,7 @@ class LLSideTray : public LLPanel, private LLDestroyClass<LLSideTray>
 	 * otherwise Side Tray is collapsed.
 	 * params are passed to "panel_name" panel onOpen().
 	 */
-	void		togglePanel		(LLPanel* &sub_panel, const std::string& panel_name, const LLSD& params);
+	void		togglePanel		(LLPanel* &sub_panel, const std::string& panel_name, const LLSD& params = LLSD());
 
 	/*
 	 * get the panel (don't show it or do anything else with it)
diff --git a/indra/newview/lltexturectrl.cpp b/indra/newview/lltexturectrl.cpp
index f6479bd004f02a075d7680ba2d9be67805865bbe..07db3e0cef511f1f4cf435f45376e1ba1bbd248b 100644
--- a/indra/newview/lltexturectrl.cpp
+++ b/indra/newview/lltexturectrl.cpp
@@ -1137,6 +1137,20 @@ void LLTextureCtrl::onFloaterCommit(ETexturePickOp op)
 	}
 }
 
+void	LLTextureCtrl::setImageAssetName(const std::string& name)
+{
+	LLPointer<LLUIImage> imagep = LLUI::getUIImage(name);
+	if(imagep)
+	{
+		LLViewerFetchedTexture* pTexture = dynamic_cast<LLViewerFetchedTexture*>(imagep->getImage().get());
+		if(pTexture)
+		{
+			LLUUID id = pTexture->getID();
+			setImageAssetID(id);
+		}
+	}
+}
+
 void LLTextureCtrl::setImageAssetID( const LLUUID& asset_id )
 {
 	if( mImageAssetID != asset_id )
diff --git a/indra/newview/lltexturectrl.h b/indra/newview/lltexturectrl.h
index 837f837430155f6a772b3135b279ddd57ec133f0..bcd0a083f2be6f12d096bd6f30da2a8bcd60b124 100644
--- a/indra/newview/lltexturectrl.h
+++ b/indra/newview/lltexturectrl.h
@@ -128,7 +128,7 @@ class LLTextureCtrl
 	virtual void	clear();
 
 	// Takes a UUID, wraps get/setImageAssetID
-	virtual void	setValue(const LLSD& value );
+	virtual void	setValue(const LLSD& value);
 	virtual LLSD	getValue() const;
 
 	// LLTextureCtrl interface
@@ -142,6 +142,8 @@ class LLTextureCtrl
 
 	const LLUUID&	getImageItemID() { return mImageItemID; }
 
+	virtual void	setImageAssetName(const std::string& name);
+	
 	void			setImageAssetID(const LLUUID &image_asset_id);
 	const LLUUID&	getImageAssetID() const						{ return mImageAssetID; }
 
diff --git a/indra/newview/llurldispatcher.cpp b/indra/newview/llurldispatcher.cpp
index a31c3a0f1be779709d193d3d2f9537fc7722ff52..9efa6c410838fa998e1d1003a5645dfe582d8cd6 100644
--- a/indra/newview/llurldispatcher.cpp
+++ b/indra/newview/llurldispatcher.cpp
@@ -151,8 +151,9 @@ bool LLURLDispatcherImpl::dispatchApp(const LLSLURL& slurl,
 									  bool trusted_browser)
 {
 	llinfos << "cmd: " << slurl.getAppCmd() << " path: " << slurl.getAppPath() << " query: " << slurl.getAppQuery() << llendl;
+	const LLSD& query_map = LLURI::queryMap(slurl.getAppQuery());
 	bool handled = LLCommandDispatcher::dispatch(
-			slurl.getAppCmd(), slurl.getAppPath(), slurl.getAppQuery(), web, trusted_browser);
+			slurl.getAppCmd(), slurl.getAppPath(), query_map, web, trusted_browser);
 
 	// alert if we didn't handle this secondlife:///app/ SLURL
 	// (but still return true because it is a valid app SLURL)
diff --git a/indra/newview/llviewerinventory.cpp b/indra/newview/llviewerinventory.cpp
index ac70be029a26a6d7cfbdbe36660d9516cf05c02e..a2331bd69abe8d075ca656a5e385b477217f905a 100644
--- a/indra/newview/llviewerinventory.cpp
+++ b/indra/newview/llviewerinventory.cpp
@@ -95,6 +95,41 @@ class LLLocalizedInventoryItemsDictionary : public LLSingleton<LLLocalizedInvent
 		mInventoryItemsDict["New Script"]		= LLTrans::getString("New Script");
 		mInventoryItemsDict["New Folder"]		= LLTrans::getString("New Folder");
 		mInventoryItemsDict["Contents"]			= LLTrans::getString("Contents");
+
+		mInventoryItemsDict["Gesture"]			= LLTrans::getString("Gesture");
+		mInventoryItemsDict["Male Gestures"]	= LLTrans::getString("Male Gestures");
+		mInventoryItemsDict["Female Gestures"]	= LLTrans::getString("Female Gestures");
+		mInventoryItemsDict["Other Gestures"]	= LLTrans::getString("Other Gestures");
+		mInventoryItemsDict["Speech Gestures"]	= LLTrans::getString("Speech Gestures");
+
+		//predefined gestures
+
+		//male
+		mInventoryItemsDict["Male - Excuse me"]			= LLTrans::getString("Male - Excuse me");
+		mInventoryItemsDict["Male - Get lost"]			= LLTrans::getString("Male - Get lost");
+		mInventoryItemsDict["Male - Blow kiss"]			= LLTrans::getString("Male - Blow kiss");
+		mInventoryItemsDict["Male - Boo"]				= LLTrans::getString("Male - Boo");
+		mInventoryItemsDict["Male - Bored"]				= LLTrans::getString("Male - Bored");
+		mInventoryItemsDict["Male - Hey"]				= LLTrans::getString("Male - Hey");
+		mInventoryItemsDict["Male - Laugh"]				= LLTrans::getString("Male - Laugh");
+		mInventoryItemsDict["Male - Repulsed"]			= LLTrans::getString("Male - Repulsed");
+		mInventoryItemsDict["Male - Shrug"]				= LLTrans::getString("Male - Shrug");
+		mInventoryItemsDict["Male - Stick tougue out"]	= LLTrans::getString("Male - Stick tougue out");
+		mInventoryItemsDict["Male - Wow"]				= LLTrans::getString("Male - Wow");
+
+		//female
+		mInventoryItemsDict["FeMale - Excuse me"]		= LLTrans::getString("FeMale - Excuse me");
+		mInventoryItemsDict["FeMale - Get lost"]		= LLTrans::getString("FeMale - Get lost");
+		mInventoryItemsDict["FeMale - Blow kiss"]		= LLTrans::getString("FeMale - Blow kiss");
+		mInventoryItemsDict["FeMale - Boo"]				= LLTrans::getString("FeMale - Boo");
+		mInventoryItemsDict["Female - Bored"]			= LLTrans::getString("Female - Bored");
+		mInventoryItemsDict["Female - Hey"]				= LLTrans::getString("Female - Hey");
+		mInventoryItemsDict["Female - Laugh"]			= LLTrans::getString("Female - Laugh");
+		mInventoryItemsDict["Female - Repulsed"]		= LLTrans::getString("Female - Repulsed");
+		mInventoryItemsDict["Female - Shrug"]			= LLTrans::getString("Female - Shrug");
+		mInventoryItemsDict["Female - Stick tougue out"]= LLTrans::getString("Female - Stick tougue out");
+		mInventoryItemsDict["Female - Wow"]				= LLTrans::getString("Female - Wow");
+		
 	}
 };
 
diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp
index 42428bab037f48472a23be31b2b5542bffb22b64..c245650d5136f85bdcfba00f892b9b33be2cb330 100644
--- a/indra/newview/llviewermenu.cpp
+++ b/indra/newview/llviewermenu.cpp
@@ -5597,10 +5597,7 @@ void handle_viewer_disable_message_log(void*)
 
 void handle_customize_avatar()
 {
-	if (gAgentWearables.areWearablesLoaded())
-	{
-		gAgentCamera.changeCameraToCustomizeAvatar();
-	}
+	LLSideTray::getInstance()->showPanel("sidepanel_appearance", LLSD().with("type", "my_outfits"));
 }
 
 void handle_report_abuse()
diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp
index 86e040692ccf5156a4b6471c79fcac5b87dc9172..fb87e2d3b9b98a8b05c09df08752e8fa25b50a14 100644
--- a/indra/newview/llviewermessage.cpp
+++ b/indra/newview/llviewermessage.cpp
@@ -774,11 +774,11 @@ class LLOpenAgentOffer : public LLInventoryFetchItemsObserver
  * We can't create it each time items are moved because "drop" event is sent separately for each
  * element even while multi-dragging. We have to have the only instance of the observer. See EXT-4347.
  */
-class LLViewerInventoryMoveFromWorldObserver : public LLInventoryMoveFromWorldObserver
+class LLViewerInventoryMoveFromWorldObserver : public LLInventoryAddItemByAssetObserver
 {
 public:
 	LLViewerInventoryMoveFromWorldObserver()
-		: LLInventoryMoveFromWorldObserver()
+		: LLInventoryAddItemByAssetObserver()
 		, mActivePanel(NULL)
 	{
 
diff --git a/indra/newview/skins/default/xui/en/menu_attachment_self.xml b/indra/newview/skins/default/xui/en/menu_attachment_self.xml
index 5c30b9ee94d82ac6e7f24c95af5e849246eb2657..dc51ae8b92dd9d09106ccc47b71012a4d52aed3a 100644
--- a/indra/newview/skins/default/xui/en/menu_attachment_self.xml
+++ b/indra/newview/skins/default/xui/en/menu_attachment_self.xml
@@ -68,8 +68,8 @@
          function="Self.EnableStandUp" />
     </menu_item_call>
      <menu_item_call
-     label="My Appearance"
-     name="Appearance...">
+     label="Change Outfit"
+     name="Change Outfit">
         <menu_item_call.on_click
          function="CustomizeAvatar" />
         <menu_item_call.on_enable
diff --git a/indra/newview/skins/default/xui/en/menu_avatar_self.xml b/indra/newview/skins/default/xui/en/menu_avatar_self.xml
index a21c1ac44ba9e08acc3e9d7d6f3c26512e8ed238..0efe598243b5036bf3b974bcab2af42e72d41b04 100644
--- a/indra/newview/skins/default/xui/en/menu_avatar_self.xml
+++ b/indra/newview/skins/default/xui/en/menu_avatar_self.xml
@@ -183,9 +183,9 @@
         </menu_item_call>
     </context_menu>
      <menu_item_call
-     label="My Appearance"
+     label="Change Outfit"
      layout="topleft"
-     name="Appearance...">
+     name="Chenge Outfit">
         <menu_item_call.on_click
          function="CustomizeAvatar" />
         <menu_item_call.on_enable
diff --git a/indra/newview/skins/default/xui/en/menu_bottomtray.xml b/indra/newview/skins/default/xui/en/menu_bottomtray.xml
index 7ef91a1d852ac01cade6d3650896341f9351b5c4..5beafef4e4b91714bb81175a5748dfc2d5838215 100644
--- a/indra/newview/skins/default/xui/en/menu_bottomtray.xml
+++ b/indra/newview/skins/default/xui/en/menu_bottomtray.xml
@@ -52,6 +52,50 @@
              function="CheckControl"
              parameter="ShowSnapshotButton" />
     </menu_item_check>        
+    <menu_item_check
+     label="Build button"
+     layout="topleft"
+     name="ShowBuildButton">
+        <menu_item_check.on_click
+         function="ToggleControl"
+         parameter="ShowBuildButton" />
+        <menu_item_check.on_check
+         function="CheckControl"
+         parameter="ShowBuildButton" />
+    </menu_item_check>
+    <menu_item_check
+     label="Search button"
+     layout="topleft"
+     name="ShowSearchButton">
+        <menu_item_check.on_click
+         function="ToggleControl"
+         parameter="ShowSearchButton" />
+        <menu_item_check.on_check
+         function="CheckControl"
+         parameter="ShowSearchButton" />
+    </menu_item_check>
+    <menu_item_check
+     label="Map button"
+     layout="topleft"
+     name="ShowWorldMapButton">
+        <menu_item_check.on_click
+         function="ToggleControl"
+         parameter="ShowWorldMapButton" />
+        <menu_item_check.on_check
+         function="CheckControl"
+         parameter="ShowWorldMapButton" />
+    </menu_item_check>
+    <menu_item_check
+     label="Mini-Map button"
+     layout="topleft"
+     name="ShowMiniMapButton">
+        <menu_item_check.on_click
+         function="ToggleControl"
+         parameter="ShowMiniMapButton" />
+        <menu_item_check.on_check
+         function="CheckControl"
+         parameter="ShowMiniMapButton" />
+    </menu_item_check>
     <menu_item_separator
      name="Separator" />
     <menu_item_call
diff --git a/indra/newview/skins/default/xui/en/menu_inspect_self_gear.xml b/indra/newview/skins/default/xui/en/menu_inspect_self_gear.xml
index 03bd93e271b5a4f5cd1d3528f8dcc08f5742a30f..ea18e02ca1e770c2d7d29da9e48d5f2ba3c0721f 100644
--- a/indra/newview/skins/default/xui/en/menu_inspect_self_gear.xml
+++ b/indra/newview/skins/default/xui/en/menu_inspect_self_gear.xml
@@ -16,8 +16,8 @@
      function="Self.EnableStandUp" />
   </menu_item_call>
   <menu_item_call
-   label="My Appearance"
-   name="my_appearance">
+   label="Change Outfit"
+   name="change_outfit">
     <menu_item_call.on_click
      function="CustomizeAvatar" />
     <menu_item_call.on_enable
diff --git a/indra/newview/skins/default/xui/en/menu_participant_list.xml b/indra/newview/skins/default/xui/en/menu_participant_list.xml
index f126431263dcc6796215e3366f503596cd9e7315..4ed5807808a6f471cb6547a503374d4fae2d440d 100644
--- a/indra/newview/skins/default/xui/en/menu_participant_list.xml
+++ b/indra/newview/skins/default/xui/en/menu_participant_list.xml
@@ -127,7 +127,8 @@
          parameter="can_mute_text" />
     </menu_item_check>
     <menu_item_separator
-     layout="topleft" />
+     layout="topleft" 
+     name="Moderator Options Separator"/>
     <context_menu
      label="Moderator Options &gt;"
      layout="topleft"
diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml
index c9ebeb60fb255b71cac09aee6527aa9b59a24386..16c2581d63f4cc51f8068d188a7b76c3ed2f9f32 100644
--- a/indra/newview/skins/default/xui/en/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/en/menu_viewer.xml
@@ -38,8 +38,8 @@
              parameter="agent" />
         </menu_item_call>
         <menu_item_call
-         label="My Appearance"
-         name="Appearance">
+         label="Change Outfit"
+         name="ChangeOutfit">
             <menu_item_call.on_click
              function="CustomizeAvatar" />
             <menu_item_call.on_enable
diff --git a/indra/newview/skins/default/xui/en/panel_bottomtray.xml b/indra/newview/skins/default/xui/en/panel_bottomtray.xml
index 7b11538cccbbc835b3dcb33b54b8cb9dd8322867..620aabeeb8baaec8b920c4f3f9f4311ecdcf3ded 100644
--- a/indra/newview/skins/default/xui/en/panel_bottomtray.xml
+++ b/indra/newview/skins/default/xui/en/panel_bottomtray.xml
@@ -10,7 +10,7 @@
  left="0"
  name="bottom_tray"
  top="28"
- width="1000">
+ width="1310">
     <string
      name="SpeakBtnToolTip"
      value="Turns microphone on/off" />
@@ -28,7 +28,7 @@
      name="toolbar_stack"
      orientation="horizontal"
      top="0"
-     width="1000">
+     width="1310">
         <icon
          auto_resize="false"
          follows="left|right"
@@ -210,6 +210,134 @@
                  parameter="snapshot" />
             </button>
         </layout_panel>
+        <layout_panel
+         auto_resize="false"
+         follows="left|right"
+         height="28"
+         layout="topleft"
+         min_height="28"
+         min_width="52"
+         mouse_opaque="false"
+         name="build_btn_panel"
+         user_resize="false"
+         width="83">
+<!--*FIX: Build Floater is not opened with default registration. Will be fixed soon.
+Disabled for now.
+-->
+            <button
+enabled="false"
+             follows="left|right"
+             height="23"
+             image_pressed="PushButton_Press"
+             image_pressed_selected="PushButton_Selected_Press"
+             image_selected="PushButton_Selected_Press"
+             is_toggle="true"
+             label="Build"
+             layout="topleft"
+             left="0"
+             name="build_btn"
+             tool_tip="Shows/hides Build Tools"
+             top="5"
+             use_ellipses="true"
+             width="80">
+                <init_callback
+                 function="Button.SetFloaterToggle"
+                 parameter="build" />
+            </button>
+        </layout_panel>
+        <layout_panel
+         auto_resize="false"
+         follows="left|right"
+         height="28"
+         layout="topleft"
+         min_height="28"
+         min_width="52"
+         mouse_opaque="false"
+         name="search_btn_panel"
+         user_resize="false"
+         width="83">
+            <button
+             follows="left|right"
+             height="23"
+             image_pressed="PushButton_Press"
+             image_pressed_selected="PushButton_Selected_Press"
+             image_selected="PushButton_Selected_Press"
+             is_toggle="true"
+             label="Search"
+             layout="topleft"
+             left="0"
+             name="search_btn"
+             tool_tip="Shows/hides Search"
+             top="5"
+             use_ellipses="true"
+             width="80">
+                <init_callback
+                 function="Button.SetFloaterToggle"
+                 parameter="search" />
+            </button>
+        </layout_panel>
+        <layout_panel
+         auto_resize="false"
+         follows="left|right"
+         height="28"
+         layout="topleft"
+         min_height="28"
+         min_width="52"
+         mouse_opaque="false"
+         name="world_map_btn_panel"
+         user_resize="false"
+         width="83">
+            <button
+             follows="left|right"
+             height="23"
+             image_pressed="PushButton_Press"
+             image_pressed_selected="PushButton_Selected_Press"
+             image_selected="PushButton_Selected_Press"
+             is_toggle="true"
+             label="Map"
+             layout="topleft"
+             left="0"
+             name="world_map_btn"
+             tool_tip="Shows/hides World Map"
+             top="5"
+             use_ellipses="true"
+             width="80">
+                <init_callback
+                 function="Button.SetFloaterToggle"
+                 parameter="world_map" />
+            </button>
+        </layout_panel>
+        <layout_panel
+         auto_resize="false"
+         follows="left|right"
+         height="28"
+         layout="topleft"
+         min_height="28"
+         min_width="52"
+         mouse_opaque="false"
+         name="mini_map_btn_panel"
+         user_resize="false"
+         width="83">
+            <button
+             follows="left|right"
+             height="23"
+             image_pressed="PushButton_Press"
+             image_pressed_selected="PushButton_Selected_Press"
+             image_selected="PushButton_Selected_Press"
+             is_toggle="true"
+             label="Mini-Map"
+             layout="topleft"
+             left="0"
+             name="mini_map_btn"
+             tool_tip="Shows/hides Mini-Map"
+             top="5"
+             use_ellipses="true"
+             width="80">
+                <init_callback
+                 function="Button.SetFloaterToggle"
+                 parameter="mini_map" />
+            </button>
+        </layout_panel>
         <layout_panel
          follows="left|right"
          height="30"
diff --git a/indra/newview/skins/default/xui/en/panel_outfit_edit.xml b/indra/newview/skins/default/xui/en/panel_outfit_edit.xml
index 79616645164ac2a8f0628ab84f62c4001ac7b291..907241832945fcbacec538f68694f874e61f9093 100644
--- a/indra/newview/skins/default/xui/en/panel_outfit_edit.xml
+++ b/indra/newview/skins/default/xui/en/panel_outfit_edit.xml
@@ -260,7 +260,7 @@
              top_pad="5"
              left="0">
                 <layout_panel
-                 auto_resize="true"
+                 auto_resize="false"
                  layout="topleft"
                  follows="left|top|right"
                  height="30"
@@ -292,7 +292,7 @@
                  width="311"
                  user_resize="true">
                     <inventory_panel
-		             allow_multi_select="false"
+		             allow_multi_select="true"
 		             border="false"
 		             follows="left|top|right|bottom"
 		             height="130"
diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml
index 6d80b17ac6fa84c699fbe8622aae8abc52d68b96..bf28e78cf6ca1eee32e36e95d0aef6320ce1409a 100644
--- a/indra/newview/skins/default/xui/en/strings.xml
+++ b/indra/newview/skins/default/xui/en/strings.xml
@@ -1894,6 +1894,7 @@ Clears (deletes) the media and all params from the given face.
 	<string name="Wave"          value=" Wave " />
 	<string name="HelloAvatar"   value=" Hello, avatar! " />
 	<string name="ViewAllGestures"  value="  View All &gt;&gt;" />
+	<string name="GetMoreGestures"  value="  Get More &gt;&gt;" />
 
 	<!-- inventory filter -->
     <!-- use value="" because they have preceding spaces -->
@@ -3136,6 +3137,36 @@ Abuse Report</string>
   <string name="New Script">New Script</string>
   <string name="New Folder">New Folder</string>
   <string name="Contents">Contents</string>
+  <string name="Gesture">Gesture</string>
+  <string name="Male Gestures">Male Gestures</string>
+  <string name="Female Gestures">Female Gestures</string>
+  <string name="Other Gestures">Other Gestures</string>
+  <string name="Speech Gestures">Speech Gestures</string>
+
+  <!-- gestures -->
+  <string name="Male - Excuse me">Male - Excuse me</string>
+  <string name="Male - Get lost">Male - Get lost</string>
+  <string name="Male - Blow kiss">Male - Blow kiss</string>
+  <string name="Male - Boo">Male - Boo</string>
+  <string name="Male - Bored">Male - Bored</string>
+  <string name="Male - Hey">Male - Hey</string>
+  <string name="Male - Laugh">Male - Laugh</string>
+  <string name="Male - Repulsed">Male - Repulsed</string>
+  <string name="Male - Shrug">Male - Shrug</string>
+  <string name="Male - Stick tougue out">Male - Stick tougue out</string>
+  <string name="Male - Wow">Male - Wow</string>
+
+  <string name="FeMale - Excuse me">FeMale - Excuse me</string>
+  <string name="FeMale - Get lost">FeMale - Get lost</string>
+  <string name="FeMale - Blow kiss">FeMale - Blow kiss</string>
+  <string name="FeMale - Boo">FeMale - Boo</string>
+  <string name="Female - Bored">Female - Bored</string>
+  <string name="Female - Hey">Female - Hey</string>
+  <string name="Female - Laugh">Female - Laugh</string>
+  <string name="Female - Repulsed">Female - Repulsed</string>
+  <string name="Female - Shrug">Female - Shrug</string>
+  <string name="Female - Stick tougue out">Female - Stick tougue out</string>
+  <string name="Female - Wow">Female - Wow</string>
 
   <!-- birth date format shared by avatar inspector and profile panels -->
   <string name="AvatarBirthDateFormat">[mthnum,datetime,slt]/[day,datetime,slt]/[year,datetime,slt]</string>
diff --git a/indra/newview/skins/default/xui/en/widgets/expandable_text.xml b/indra/newview/skins/default/xui/en/widgets/expandable_text.xml
index 6190ea787221c236b9c258ee1a901bb6246dfc8b..216c4dea95cf0abad0b35bbdb6050c447d4af267 100644
--- a/indra/newview/skins/default/xui/en/widgets/expandable_text.xml
+++ b/indra/newview/skins/default/xui/en/widgets/expandable_text.xml
@@ -11,6 +11,7 @@
   read_only="true"
   use_ellipses="true"
   word_wrap="true"
+  show_context_menu="true"
   tab_stop="true"
   v_pad="3"
   h_pad="4" >