diff --git a/indra/llaudio/llstreamingaudio_fmod.cpp b/indra/llaudio/llstreamingaudio_fmod.cpp
index a71a87203c169c007e45241c92d31ebb604fead5..a4620fa13c5fe5331e0c587d7b1ea51f3616d9ff 100644
--- a/indra/llaudio/llstreamingaudio_fmod.cpp
+++ b/indra/llaudio/llstreamingaudio_fmod.cpp
@@ -174,7 +174,7 @@ void LLStreamingAudio_FMOD::update()
 		break;
 	case -3:
 		// failed to open, file not found, perhaps
-		llwarns << "InternetSteam - failed to open" << llendl;
+		llwarns << "InternetStream - failed to open" << llendl;
 		stop();
 		return;
 	case -4:
diff --git a/indra/llui/lldockablefloater.cpp b/indra/llui/lldockablefloater.cpp
index 6a5b475134be8401fdb0d4391a591277a52f0833..74438b184a8cc1aefac48c4150689c8c9246b63e 100644
--- a/indra/llui/lldockablefloater.cpp
+++ b/indra/llui/lldockablefloater.cpp
@@ -57,11 +57,20 @@ LLDockableFloater::LLDockableFloater(LLDockControl* dockControl,
 	, mOverlapsScreenChannel(false)
 {
 	init(this);
+	mUseTongue = true;
 }
 
 LLDockableFloater::LLDockableFloater(LLDockControl* dockControl, bool uniqueDocking,
 		const LLSD& key, const Params& params) :
 	LLFloater(key, params), mDockControl(dockControl), mUniqueDocking(uniqueDocking)
+{
+	init(this);
+	mUseTongue = true;
+}
+
+LLDockableFloater::LLDockableFloater(LLDockControl* dockControl, bool uniqueDocking,
+		bool useTongue, const LLSD& key, const Params& params) :
+	LLFloater(key, params), mDockControl(dockControl), mUseTongue(useTongue), mUniqueDocking(uniqueDocking)
 {
 	init(this);
 }
diff --git a/indra/llui/lldockablefloater.h b/indra/llui/lldockablefloater.h
index ae4f99e205090d9a95506a821dbf6490b820d457..2b1ce99ae2e823f4bd0a7391057068ee9bf21774 100644
--- a/indra/llui/lldockablefloater.h
+++ b/indra/llui/lldockablefloater.h
@@ -62,6 +62,20 @@ class LLDockableFloater : public LLFloater
 	 */
 	LLDockableFloater(LLDockControl* dockControl, bool uniqueDocking,
 			const LLSD& key, const Params& params = getDefaultParams());
+
+	/**
+	 * Constructor.
+	 * @param dockControl a pointer to the doc control instance
+	 * @param uniqueDocking - a flag defines is docking should work as tab(at one
+	 * moment only one docked floater can be shown).
+	 * @praram useTongue - a flag defines is dock tongue should be used.
+	 * @params key a floater key.
+ 	 * @params params a floater parameters
+	 */
+	LLDockableFloater(LLDockControl* dockControl, bool uniqueDocking,
+			bool useTongue, const LLSD& key,
+			const Params& params = getDefaultParams());
+
 	virtual ~LLDockableFloater();
 
 	static LLHandle<LLFloater> getInstanceHandle() { return sInstanceHandle; }
@@ -104,6 +118,7 @@ class LLDockableFloater : public LLFloater
 	virtual void setOverlapsScreenChannel(bool overlaps) { mOverlapsScreenChannel = overlaps; }
 
 	bool getUniqueDocking() { return mUniqueDocking;	}
+	bool getUseTongue() { return mUseTongue; }
 private:
 	/**
 	 * Provides unique of dockable floater.
@@ -125,6 +140,8 @@ class LLDockableFloater : public LLFloater
 	 */
 	bool mUniqueDocking;
 
+	bool mUseTongue;
+
 	bool mOverlapsScreenChannel;
 };
 
diff --git a/indra/llui/lldockcontrol.cpp b/indra/llui/lldockcontrol.cpp
index 1c3c8449c5fd8768e8db8a759ba4d5c8cd120533..0d8e54aa486dd42d6ad4349d756189fe9bae93cc 100644
--- a/indra/llui/lldockcontrol.cpp
+++ b/indra/llui/lldockcontrol.cpp
@@ -182,12 +182,12 @@ void LLDockControl::moveDockable()
 	LLRect rootRect;
 	mGetAllowedRectCallback(rootRect);
 
-	bool unique_docking = false;
+	bool use_tongue = false;
 	LLDockableFloater* dockable_floater =
 			dynamic_cast<LLDockableFloater*> (mDockableFloater);
 	if (dockable_floater != NULL)
 	{
-		unique_docking = dockable_floater->getUniqueDocking();
+		use_tongue = dockable_floater->getUseTongue();
 	}
 
 	LLRect dockableRect = mDockableFloater->calcScreenRect();
@@ -218,7 +218,7 @@ void LLDockControl::moveDockable()
 		x = dockRect.getCenterX() - dockableRect.getWidth() / 2;
 		y = dockRect.mTop + dockableRect.getHeight();
 		// unique docking used with dock tongue, so add tongue height o the Y coordinate
-		if (unique_docking)
+		if (use_tongue)
 		{
 			y += mDockTongue->getHeight();
 		}
@@ -287,15 +287,15 @@ void LLDockControl::forceRecalculatePosition()
 
 void LLDockControl::drawToungue()
 {
-	bool unique_docking = false;
+	bool use_tongue = false;
 	LLDockableFloater* dockable_floater =
 			dynamic_cast<LLDockableFloater*> (mDockableFloater);
 	if (dockable_floater != NULL)
 	{
-		unique_docking = dockable_floater->getUniqueDocking();
+		use_tongue = dockable_floater->getUseTongue();
 	}
 
-	if (mEnabled && unique_docking)
+	if (mEnabled && use_tongue)
 	{
 		mDockTongue->draw(mDockTongueX, mDockTongueY);
 	}
diff --git a/indra/llui/llflatlistview.cpp b/indra/llui/llflatlistview.cpp
index 3754d155cff3781004c6f633da5dc973fe9fe5ab..9cfc67af147edc69ec2f566e2165ebce0143d99e 100644
--- a/indra/llui/llflatlistview.cpp
+++ b/indra/llui/llflatlistview.cpp
@@ -906,7 +906,8 @@ void LLFlatListView::notifyParentItemsRectChanged()
 	params["width"] = req_rect.getWidth();
 	params["height"] = req_rect.getHeight();
 
-	getParent()->notifyParent(params);
+	if (getParent()) // dummy widgets don't have a parent
+		getParent()->notifyParent(params);
 }
 
 void LLFlatListView::setNoItemsCommentVisible(bool visible) const
diff --git a/indra/llui/lllayoutstack.h b/indra/llui/lllayoutstack.h
index cde383b047a7641971a4d30a1053918ffa27cc98..aba35773eeacc000ecfe765a61813edbb373b806 100644
--- a/indra/llui/lllayoutstack.h
+++ b/indra/llui/lllayoutstack.h
@@ -91,6 +91,9 @@ class LLLayoutStack : public LLView, public LLInstanceTracker<LLLayoutStack>
 	bool getPanelMinSize(const std::string& panel_name, S32* min_widthp, S32* min_heightp);
 	
 	void updateLayout(BOOL force_resize = FALSE);
+	
+	S32 getPanelSpacing() const { return mPanelSpacing; }
+	
 	static void updateClass();
 
 protected:
diff --git a/indra/media_plugins/webkit/media_plugin_webkit.cpp b/indra/media_plugins/webkit/media_plugin_webkit.cpp
index 4b6da552cfe13a5dca1c8b294a4f8f8fa3aea8c8..02f0045800d37e9d07f54d1b3cddb890c6dec8f3 100644
--- a/indra/media_plugins/webkit/media_plugin_webkit.cpp
+++ b/indra/media_plugins/webkit/media_plugin_webkit.cpp
@@ -84,6 +84,7 @@ class MediaPluginWebKit :
 		INIT_STATE_NAVIGATING,			// Browser instance has been set up and initial navigate to about:blank has been issued
 		INIT_STATE_NAVIGATE_COMPLETE,	// initial navigate to about:blank has completed
 		INIT_STATE_WAIT_REDRAW,			// First real navigate begin has been received, waiting for page changed event to start handling redraws
+		INIT_STATE_WAIT_COMPLETE,		// Waiting for first real navigate complete event
 		INIT_STATE_RUNNING				// All initialization gymnastics are complete.
 	};
 	int mBrowserWindowId;
@@ -122,7 +123,7 @@ class MediaPluginWebKit :
 			}
 		}
 		
-		if ( (mInitState == INIT_STATE_RUNNING) && mNeedsUpdate )
+		if ( (mInitState > INIT_STATE_WAIT_REDRAW) && mNeedsUpdate )
 		{
 			const unsigned char* browser_pixels = LLQtWebKit::getInstance()->grabBrowserWindow( mBrowserWindowId );
 
@@ -295,7 +296,7 @@ class MediaPluginWebKit :
 	{
 		if(mInitState == INIT_STATE_WAIT_REDRAW)
 		{
-			setInitState(INIT_STATE_RUNNING);
+			setInitState(INIT_STATE_WAIT_COMPLETE);
 		}
 		
 		// flag that an update is required
@@ -328,6 +329,14 @@ class MediaPluginWebKit :
 	{
 		if(mInitState >= INIT_STATE_NAVIGATE_COMPLETE)
 		{
+			if(mInitState < INIT_STATE_RUNNING)
+			{
+				setInitState(INIT_STATE_RUNNING);
+				
+				// Clear the history, so the "back" button doesn't take you back to "about:blank".
+				LLQtWebKit::getInstance()->clearHistory(mBrowserWindowId);
+			}
+			
 			LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "navigate_complete");
 			message.setValue("uri", event.getEventUri());
 			message.setValueS32("result_code", event.getIntValue());
diff --git a/indra/newview/app_settings/ignorable_dialogs.xml b/indra/newview/app_settings/ignorable_dialogs.xml
index ab18febcccc91213aa7902d8a0415c0504aaf585..e825f13e82995eb4457e17839ed684029f892c49 100644
--- a/indra/newview/app_settings/ignorable_dialogs.xml
+++ b/indra/newview/app_settings/ignorable_dialogs.xml
@@ -177,21 +177,10 @@
       <key>Value</key>
       <integer>1</integer>
     </map>
-    <key>FirstStreamingMusic</key>
+    <key>FirstStreamingMedia</key>
     <map>
       <key>Comment</key>
-      <string>Enables FirstStreamingMusic warning dialog</string>
-      <key>Persist</key>
-      <integer>1</integer>
-      <key>Type</key>
-      <string>Boolean</string>
-      <key>Value</key>
-      <integer>1</integer>
-    </map>
-    <key>FirstStreamingVideo</key>
-    <map>
-      <key>Comment</key>
-      <string>Enables FirstStreamingVideo warning dialog</string>
+      <string>Enables FirstStreamingMedia warning dialog</string>
       <key>Persist</key>
       <integer>1</integer>
       <key>Type</key>
diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index 8e25376265bb0db16385162ff4dc08130d76a469..79223a81e15a51d511150e0f7a6ed1786fa97a2e 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -276,7 +276,7 @@
       <key>Value</key>
       <real>0.5</real>
     </map>
-	<key>AudioSteamingMedia</key>
+	<key>AudioStreamingMedia</key>
     <map>
       <key>Comment</key>
       <string>Enable streaming</string>
@@ -408,6 +408,17 @@
       <key>Value</key>
       <integer>1</integer>
     </map>
+    <key>AvalinePhoneSeparator</key>
+    <map>
+      <key>Comment</key>
+      <string>Separator of phone parts to have Avaline numbers human readable in Voice Control Panel</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>String</string>
+      <key>Value</key>
+      <string>-</string>
+    </map>
     <key>AvatarAxisDeadZone0</key>
     <map>
       <key>Comment</key>
diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp
index d2a56f65dd705a20cd23963ea9d930da5798b499..5e2e374df65727a51af2d73023872ae1f211659b 100644
--- a/indra/newview/llagent.cpp
+++ b/indra/newview/llagent.cpp
@@ -2812,7 +2812,7 @@ void LLAgent::endAnimationUpdateUI()
 
 		LLToolMgr::getInstance()->setCurrentToolset(gBasicToolset);
 
-		LLFloaterCamera::toPrevModeIfInAvatarViewMode();
+		LLFloaterCamera::onLeavingMouseLook();
 
 		// Only pop if we have pushed...
 		if (TRUE == mViewsPushed)
@@ -2915,10 +2915,6 @@ void LLAgent::endAnimationUpdateUI()
 		// JC - Added for always chat in third person option
 		gFocusMgr.setKeyboardFocus(NULL);
 
-		//Making sure Camera Controls floater is in the right state 
-		//when entering Mouse Look using wheel scrolling
-		LLFloaterCamera::updateIfNotInAvatarViewMode();
-
 		LLToolMgr::getInstance()->setCurrentToolset(gMouselookToolset);
 
 		mViewsPushed = TRUE;
diff --git a/indra/newview/llagentwearables.cpp b/indra/newview/llagentwearables.cpp
index dc1598aacda6f6a14b704f3748fd0169233112e5..d21965568d252c5a44f5d71806134e97b43bda12 100644
--- a/indra/newview/llagentwearables.cpp
+++ b/indra/newview/llagentwearables.cpp
@@ -116,6 +116,39 @@ BOOL LLAgentWearables::mInitialWearablesUpdateReceived = FALSE;
 
 using namespace LLVOAvatarDefines;
 
+// HACK: For EXT-3923: Pants item shows in inventory with skin icon and messes with "current look"
+// Some db items are corrupted, have inventory flags = 0, implying wearable type = shape, even though
+// wearable type stored in asset is some other value.
+// Calling this function whenever a wearable is added to increase visibility if this problem
+// turns up in other inventories.
+void checkWearableAgainstInventory(LLWearable *wearable)
+{
+	if (wearable->getItemID().isNull())
+		return;
+	
+	// Check for wearable type consistent with inventory item wearable type.
+	LLViewerInventoryItem *item = gInventory.getItem(wearable->getItemID());
+	if (item)
+	{
+		if (!item->isWearableType())
+		{
+			llwarns << "wearable associated with non-wearable item" << llendl;
+		}
+		if (item->getWearableType() != wearable->getType())
+		{
+			llwarns << "type mismatch: wearable " << wearable->getName()
+					<< " has type " << wearable->getType()
+					<< " but inventory item " << item->getName()
+					<< " has type "  << item->getWearableType() << llendl;
+		}
+	}
+	else
+	{
+		llwarns << "wearable inventory item not found" << wearable->getName()
+				<< " itemID " << wearable->getItemID().asString() << llendl;
+	}
+}
+
 void LLAgentWearables::dump()
 {
 	llinfos << "LLAgentWearablesDump" << llendl;
@@ -657,6 +690,7 @@ LLWearable* LLAgentWearables::getWearable(const EWearableType type, U32 index)
 
 void LLAgentWearables::setWearable(const EWearableType type, U32 index, LLWearable *wearable)
 {
+
 	LLWearable *old_wearable = getWearable(type,index);
 	if (!old_wearable)
 	{
@@ -680,6 +714,7 @@ void LLAgentWearables::setWearable(const EWearableType type, U32 index, LLWearab
 		wearable_vec[index] = wearable;
 		old_wearable->setLabelUpdated();
 		wearableUpdated(wearable);
+		checkWearableAgainstInventory(wearable);
 	}
 }
 
@@ -695,6 +730,7 @@ U32 LLAgentWearables::pushWearable(const EWearableType type, LLWearable *wearabl
 	{
 		mWearableDatas[type].push_back(wearable);
 		wearableUpdated(wearable);
+		checkWearableAgainstInventory(wearable);
 		return mWearableDatas[type].size()-1;
 	}
 	return MAX_WEARABLES_PER_TYPE;
@@ -1360,6 +1396,7 @@ LLUUID LLAgentWearables::makeNewOutfitLinks(const std::string& new_folder_name)
 
 	LLPointer<LLInventoryCallback> cb = new LLAutoRenameFolder(folder_id);
 	LLAppearanceManager::instance().shallowCopyCategory(LLAppearanceManager::instance().getCOF(),folder_id, cb);
+	LLAppearanceManager::instance().createBaseOutfitLink(folder_id, NULL);
 	
 	return folder_id;
 }
@@ -1705,6 +1742,7 @@ void LLAgentWearables::setWearableFinal(LLInventoryItem* new_item, LLWearable* n
 		mWearableDatas[type].push_back(new_wearable);
 		llinfos << "Added additional wearable for type " << type
 				<< " size is now " << mWearableDatas[type].size() << llendl;
+		checkWearableAgainstInventory(new_wearable);
 	}
 	else
 	{
diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp
index 43b2f34ecd78ca3499df6c898b5a22310cd03871..1150d84febaa452f05f5bdabfcc41b5d3c54e735 100644
--- a/indra/newview/llappearancemgr.cpp
+++ b/indra/newview/llappearancemgr.cpp
@@ -364,7 +364,7 @@ LLUUID LLAppearanceManager::getCOF()
 }
 
 
-const LLViewerInventoryItem* LLAppearanceManager::getCurrentOutfitLink()
+const LLViewerInventoryItem* LLAppearanceManager::getBaseOutfitLink()
 {
 	const LLUUID& current_outfit_cat = getCOF();
 	LLInventoryModel::cat_array_t cat_array;
@@ -444,6 +444,28 @@ void LLAppearanceManager::shallowCopyCategory(const LLUUID& src_id, const LLUUID
 	}
 }
 
+void LLAppearanceManager::purgeBaseOutfitLink(const LLUUID& category)
+{
+	LLInventoryModel::cat_array_t cats;
+	LLInventoryModel::item_array_t items;
+	gInventory.collectDescendents(category, cats, items,
+								  LLInventoryModel::EXCLUDE_TRASH);
+	for (S32 i = 0; i < items.count(); ++i)
+	{
+		LLViewerInventoryItem *item = items.get(i);
+		if (item->getActualType() != LLAssetType::AT_LINK_FOLDER)
+			continue;
+		if (item->getIsLinkType())
+		{
+			LLViewerInventoryCategory* catp = item->getLinkedCategory();
+			if(catp && catp->getPreferredType() == LLFolderType::FT_OUTFIT)
+			{
+				gInventory.purgeObject(item->getUUID());
+			}
+		}
+	}
+}
+
 void LLAppearanceManager::purgeCategory(const LLUUID& category, bool keep_outfit_links)
 {
 	LLInventoryModel::cat_array_t cats;
@@ -578,17 +600,9 @@ void LLAppearanceManager::updateCOF(const LLUUID& category, bool append)
 	linkAll(cof, gest_items, link_waiter);
 
 	// Add link to outfit if category is an outfit. 
-	LLViewerInventoryCategory* catp = gInventory.getCategory(category);
 	if (!append)
 	{
-		std::string new_outfit_name = "";
-		if (catp && catp->getPreferredType() == LLFolderType::FT_OUTFIT)
-		{
-			link_inventory_item(gAgent.getID(), category, cof, catp->getName(),
-								LLAssetType::AT_LINK_FOLDER, link_waiter);
-			new_outfit_name = catp->getName();
-		}
-		updatePanelOutfitName(new_outfit_name);
+		createBaseOutfitLink(category, link_waiter);
 	}
 }
 
@@ -602,6 +616,22 @@ void LLAppearanceManager::updatePanelOutfitName(const std::string& name)
 	}
 }
 
+void LLAppearanceManager::createBaseOutfitLink(const LLUUID& category, LLPointer<LLInventoryCallback> link_waiter)
+{
+	const LLUUID cof = getCOF();
+	LLViewerInventoryCategory* catp = gInventory.getCategory(category);
+	std::string new_outfit_name = "";
+
+	purgeBaseOutfitLink(cof);
+
+	if (catp && catp->getPreferredType() == LLFolderType::FT_OUTFIT)
+	{
+		link_inventory_item(gAgent.getID(), category, cof, catp->getName(),
+							LLAssetType::AT_LINK_FOLDER, link_waiter);
+		new_outfit_name = catp->getName();
+	}
+	updatePanelOutfitName(new_outfit_name);
+}
 
 void LLAppearanceManager::updateAgentWearables(LLWearableHoldingPattern* holder, bool append)
 {
@@ -693,14 +723,30 @@ void LLAppearanceManager::updateAppearanceFromCOF()
 		LLDynamicArray<LLFoundData*> found_container;
 		for(S32 i = 0; i  < wear_items.count(); ++i)
 		{
-			found = new LLFoundData(wear_items.get(i)->getLinkedUUID(), // Wear the base item, not the link
-									wear_items.get(i)->getAssetUUID(),
-									wear_items.get(i)->getName(),
-									wear_items.get(i)->getType());
-			holder->mFoundList.push_front(found);
-			found_container.put(found);
+			LLViewerInventoryItem *item = wear_items.get(i);
+			LLViewerInventoryItem *linked_item = item ? item->getLinkedItem() : NULL;
+			if (item && linked_item)
+			{
+				found = new LLFoundData(linked_item->getUUID(),
+										linked_item->getAssetUUID(),
+										linked_item->getName(),
+										linked_item->getType());
+				holder->mFoundList.push_front(found);
+				found_container.put(found);
+			}
+			else
+			{
+				if (!item)
+				{
+					llwarns << "attempt to wear a null item " << llendl;
+				}
+				else if (!linked_item)
+				{
+					llwarns << "attempt to wear a broken link " << item->getName() << llendl;
+				}
+			}
 		}
-		for(S32 i = 0; i < wear_items.count(); ++i)
+		for(S32 i = 0; i < found_container.count(); ++i)
 		{
 			holder->append = false;
 			found = found_container.get(i);
diff --git a/indra/newview/llappearancemgr.h b/indra/newview/llappearancemgr.h
index b625d42a50fb0a7b6545f9050ad6a6e9ff09dc53..11b910ee1104fea8a4bc38d2bddb97be4718497c 100644
--- a/indra/newview/llappearancemgr.h
+++ b/indra/newview/llappearancemgr.h
@@ -62,11 +62,13 @@ class LLAppearanceManager: public LLSingleton<LLAppearanceManager>
 	LLUUID getCOF();
 
 	// Finds the folder link to the currently worn outfit
-	const LLViewerInventoryItem *getCurrentOutfitLink();
+	const LLViewerInventoryItem *getBaseOutfitLink();
 
 	// Update the displayed outfit name in UI.
 	void updatePanelOutfitName(const std::string& name);
 
+	void createBaseOutfitLink(const LLUUID& category, LLPointer<LLInventoryCallback> link_waiter);
+
 	void updateAgentWearables(LLWearableHoldingPattern* holder, bool append);
 
 	// For debugging - could be moved elsewhere.
@@ -114,6 +116,7 @@ class LLAppearanceManager: public LLSingleton<LLAppearanceManager>
 								   bool follow_folder_links);
 
 	void purgeCategory(const LLUUID& category, bool keep_outfit_links);
+	void purgeBaseOutfitLink(const LLUUID& category);
 
 	std::set<LLUUID> mRegisteredAttachments;
 	bool mAttachmentInvLinkEnabled;
diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp
index 6d07c34a5dd6986fd4a0e5ba229e8addbf22ea6f..0557c79894b058e05f38583bb1354c08ccf3061a 100644
--- a/indra/newview/llappviewer.cpp
+++ b/indra/newview/llappviewer.cpp
@@ -1949,8 +1949,7 @@ bool LLAppViewer::initConfiguration()
 	LLFirstUse::addConfigVariable("FirstSandbox");
 	LLFirstUse::addConfigVariable("FirstFlexible");
 	LLFirstUse::addConfigVariable("FirstDebugMenus");
-	LLFirstUse::addConfigVariable("FirstStreamingMusic");
-	LLFirstUse::addConfigVariable("FirstStreamingVideo");
+	LLFirstUse::addConfigVariable("FirstStreamingMedia");
 	LLFirstUse::addConfigVariable("FirstSculptedPrim");
 	LLFirstUse::addConfigVariable("FirstVoice");
 	LLFirstUse::addConfigVariable("FirstMedia");
diff --git a/indra/newview/llavataractions.cpp b/indra/newview/llavataractions.cpp
index 2a8c55e5dbf961e2c87bc5a6ba0bec20fbfc03ce..c3deb602eec9042cef8b426f72eabaabb23a8d16 100644
--- a/indra/newview/llavataractions.cpp
+++ b/indra/newview/llavataractions.cpp
@@ -168,8 +168,28 @@ void LLAvatarActions::offerTeleport(const LLUUID& invitee)
 // static
 void LLAvatarActions::offerTeleport(const std::vector<LLUUID>& ids) 
 {
-	if (ids.size() > 0)
-		handle_lure(ids);
+	if (ids.size() == 0)
+		return;
+
+	handle_lure(ids);
+
+	// Record the offer.
+	for (std::vector<LLUUID>::const_iterator it = ids.begin(); it != ids.end(); it++)
+	{
+		LLUUID target_id = *it;
+		std::string target_name;
+
+		gCacheName->getFullName(target_id, target_name);
+
+		LLSD args;
+		args["TO_NAME"] = target_name;
+
+		LLSD payload;
+		payload["from_id"] = target_id;
+		payload["SESSION_NAME"] = target_name;
+		payload["SUPPRESS_TOAST"] = true;
+		LLNotificationsUtil::add("TeleportOfferSent", args, payload);
+	}
 }
 
 // static
@@ -595,9 +615,11 @@ void LLAvatarActions::requestFriendship(const LLUUID& target_id, const std::stri
 
 	LLSD args;
 	args["TO_NAME"] = target_name;
+
 	LLSD payload;
+	payload["from_id"] = target_id;
 	payload["SESSION_NAME"] = target_name;
-	payload["SUPPRES_TOST"] = true;
+	payload["SUPPRESS_TOAST"] = true;
 	LLNotificationsUtil::add("FriendshipOffered", args, payload);
 }
 
diff --git a/indra/newview/llcallfloater.cpp b/indra/newview/llcallfloater.cpp
index a402f59fa11db96366c791853678970f3ed26a5c..1468f6d584f5b628f36cba6bbc4aa3f829956f94 100644
--- a/indra/newview/llcallfloater.cpp
+++ b/indra/newview/llcallfloater.cpp
@@ -47,6 +47,7 @@
 #include "llfloaterreg.h"
 #include "llparticipantlist.h"
 #include "llspeakers.h"
+#include "lltextutil.h"
 #include "lltransientfloatermgr.h"
 #include "llviewerwindow.h"
 #include "llvoicechannel.h"
@@ -76,6 +77,12 @@ class LLNonAvatarCaller : public LLAvatarListItem
 		return rv;
 	}
 
+	void setName(const std::string& name)
+	{
+		const std::string& formatted_phone = LLTextUtil::formatPhoneNumber(name);
+		LLAvatarListItem::setName(formatted_phone);
+	}
+
 	void setSpeakerId(const LLUUID& id) { mSpeakingIndicator->setSpeakerId(id); }
 };
 
@@ -270,6 +277,11 @@ void LLCallFloater::updateSession()
 		case IM_NOTHING_SPECIAL:
 		case IM_SESSION_P2P_INVITE:
 			mVoiceType = VC_PEER_TO_PEER;
+
+			if (!im_session->mOtherParticipantIsAvatar)
+			{
+				mVoiceType = VC_PEER_TO_PEER_AVALINE;
+			}
 			break;
 		case IM_SESSION_CONFERENCE_START:
 		case IM_SESSION_GROUP_START:
@@ -321,16 +333,13 @@ void LLCallFloater::updateSession()
 
 void LLCallFloater::refreshParticipantList()
 {
-	bool non_avatar_caller = false;
-	if (VC_PEER_TO_PEER == mVoiceType)
+	bool non_avatar_caller = VC_PEER_TO_PEER_AVALINE == mVoiceType;
+
+	if (non_avatar_caller)
 	{
 		LLIMModel::LLIMSession* session = LLIMModel::instance().findIMSession(mSpeakerManager->getSessionID());
-		non_avatar_caller = !session->mOtherParticipantIsAvatar;
-		if (non_avatar_caller)
-		{
-			mNonAvatarCaller->setSpeakerId(session->mOtherParticipantID);
-			mNonAvatarCaller->setName(session->mName);
-		}
+		mNonAvatarCaller->setSpeakerId(session->mOtherParticipantID);
+		mNonAvatarCaller->setName(session->mName);
 	}
 
 	mNonAvatarCaller->setVisible(non_avatar_caller);
@@ -390,9 +399,17 @@ void LLCallFloater::updateTitle()
 		title = getString("title_nearby");
 		break;
 	case VC_PEER_TO_PEER:
+	case VC_PEER_TO_PEER_AVALINE:
 		{
+			title = voice_channel->getSessionName();
+
+			if (VC_PEER_TO_PEER_AVALINE == mVoiceType)
+			{
+				title = LLTextUtil::formatPhoneNumber(title);
+			}
+
 			LLStringUtil::format_map_t args;
-			args["[NAME]"] = voice_channel->getSessionName();
+			args["[NAME]"] = title;
 			title = getString("title_peer_2_peer", args);
 		}
 		break;
diff --git a/indra/newview/llcallfloater.h b/indra/newview/llcallfloater.h
index 8aba93fc43ba0599cdc359194695d5d69949bc23..2b40225906a1f4067c1aef98aae4596b21ad5120 100644
--- a/indra/newview/llcallfloater.h
+++ b/indra/newview/llcallfloater.h
@@ -88,7 +88,8 @@ class LLCallFloater : public LLTransientDockableFloater, LLVoiceClientParticipan
 		VC_LOCAL_CHAT,
 		VC_GROUP_CHAT,
 		VC_AD_HOC_CHAT,
-		VC_PEER_TO_PEER
+		VC_PEER_TO_PEER,
+		VC_PEER_TO_PEER_AVALINE
 	}EVoiceControls;
 
 	typedef enum e_speaker_state
diff --git a/indra/newview/llchatitemscontainerctrl.cpp b/indra/newview/llchatitemscontainerctrl.cpp
index 92df28130734887db18a268f5372b48dd7943298..60a37ac4af96f923a6b3067ff72980b72542d2b8 100644
--- a/indra/newview/llchatitemscontainerctrl.cpp
+++ b/indra/newview/llchatitemscontainerctrl.cpp
@@ -252,11 +252,33 @@ void LLNearbyChatToastPanel::onMouseEnter				(S32 x, S32 y, MASK mask)
 }
 
 BOOL	LLNearbyChatToastPanel::handleMouseDown	(S32 x, S32 y, MASK mask)
+{
+	return LLPanel::handleMouseDown(x,y,mask);
+}
+
+BOOL	LLNearbyChatToastPanel::handleMouseUp	(S32 x, S32 y, MASK mask)
 {
 	if(mSourceType != CHAT_SOURCE_AGENT)
-		return LLPanel::handleMouseDown(x,y,mask);
+		return LLPanel::handleMouseUp(x,y,mask);
+
+	LLChatMsgBox* text_box = getChild<LLChatMsgBox>("msg_text", false);
+	S32 local_x = x - text_box->getRect().mLeft;
+	S32 local_y = y - text_box->getRect().mBottom;
+	
+	//if text_box process mouse up (ussually this is click on url) - we didn't show nearby_chat.
+	if (text_box->pointInView(local_x, local_y) )
+	{
+		if (text_box->handleMouseUp(local_x,local_y,mask) == TRUE)
+			return TRUE;
+		else
+		{
+			LLFloaterReg::showInstance("nearby_chat",LLSD());
+			return FALSE;
+		}
+	}
+
 	LLFloaterReg::showInstance("nearby_chat",LLSD());
-	return LLPanel::handleMouseDown(x,y,mask);
+	return LLPanel::handleMouseUp(x,y,mask);
 }
 
 void	LLNearbyChatToastPanel::setHeaderVisibility(EShowItemHeader e)
diff --git a/indra/newview/llchatitemscontainerctrl.h b/indra/newview/llchatitemscontainerctrl.h
index 0a85c524015f32cc513474f90762024b385a673f..f4b86550541fc96fd6baa07e581ba37179b2cad2 100644
--- a/indra/newview/llchatitemscontainerctrl.h
+++ b/indra/newview/llchatitemscontainerctrl.h
@@ -68,6 +68,7 @@ class LLNearbyChatToastPanel: public LLToastPanelBase
 	void	onMouseLeave	(S32 x, S32 y, MASK mask);
 	void	onMouseEnter	(S32 x, S32 y, MASK mask);
 	BOOL	handleMouseDown	(S32 x, S32 y, MASK mask);
+	BOOL	handleMouseUp	(S32 x, S32 y, MASK mask);
 
 	virtual BOOL postBuild();
 
diff --git a/indra/newview/llfavoritesbar.cpp b/indra/newview/llfavoritesbar.cpp
index 6ae6b4877a2313ffb80d1f043ffd394dc615cc98..4103ccf175a6c7c1949a63d3a5778e61e283fe19 100644
--- a/indra/newview/llfavoritesbar.cpp
+++ b/indra/newview/llfavoritesbar.cpp
@@ -644,7 +644,7 @@ LLXMLNodePtr LLFavoritesBarCtrl::getButtonXMLNode()
 	bool success = LLUICtrlFactory::getLayeredXMLNode("favorites_bar_button.xml", buttonXMLNode);
 	if (!success)
 	{
-		llwarns << "Unable to read xml file with button for Favorites Bar: favorites_bar_button.xml" << llendl;
+		llwarns << "Failed to create Favorites Bar button from favorites_bar_button.xml" << llendl;
 		buttonXMLNode = NULL;
 	}
 	return buttonXMLNode;
diff --git a/indra/newview/llfloatercamera.cpp b/indra/newview/llfloatercamera.cpp
index 764aff68c9156b94140af6329e729a953ff3475c..9496e947803d3d4db8f48dd419ab7928263337e4 100644
--- a/indra/newview/llfloatercamera.cpp
+++ b/indra/newview/llfloatercamera.cpp
@@ -144,6 +144,11 @@ void  LLPanelCameraZoom::onSliderValueChanged()
 	mSavedSliderVal = val;
 }
 
+void activate_camera_tool()
+{
+	LLToolMgr::getInstance()->setTransientTool(LLToolCamera::getInstance());
+};
+
 //
 // Member functions
 //
@@ -151,7 +156,7 @@ void  LLPanelCameraZoom::onSliderValueChanged()
 /*static*/ bool LLFloaterCamera::inFreeCameraMode()
 {
 	LLFloaterCamera* floater_camera = LLFloaterCamera::findInstance();
-	if (floater_camera && floater_camera->mCurrMode == CAMERA_CTRL_MODE_FREE_CAMERA)
+	if (floater_camera && floater_camera->mCurrMode == CAMERA_CTRL_MODE_FREE_CAMERA && gAgent.getCameraMode() != CAMERA_MODE_MOUSELOOK)
 	{
 		return true;
 	}
@@ -177,27 +182,17 @@ void LLFloaterCamera::update()
 }
 
 
-/*static*/ void LLFloaterCamera::updateIfNotInAvatarViewMode()
-{
-	LLFloaterCamera* floater_camera = LLFloaterCamera::findInstance();
-	if (floater_camera && !floater_camera->inAvatarViewMode()) 
-	{
-		floater_camera->update();
-	}
-}
-
-
 void LLFloaterCamera::toPrevMode()
 {
 	switchMode(mPrevMode);
 }
 
-/*static*/ void LLFloaterCamera::toPrevModeIfInAvatarViewMode()
+/*static*/ void LLFloaterCamera::onLeavingMouseLook()
 {
 	LLFloaterCamera* floater_camera = LLFloaterCamera::findInstance();
-	if (floater_camera && floater_camera->inAvatarViewMode())
+	if (floater_camera && floater_camera->inFreeCameraMode())
 	{
-		floater_camera->toPrevMode();
+		activate_camera_tool();
 	}
 }
 
@@ -325,7 +320,7 @@ void LLFloaterCamera::switchMode(ECameraControlMode mode)
 		break;
 
 	case CAMERA_CTRL_MODE_FREE_CAMERA:
-		LLToolMgr::getInstance()->setTransientTool(LLToolCamera::getInstance());
+		activate_camera_tool();
 		break;
 
 	case CAMERA_CTRL_MODE_AVATAR_VIEW:
diff --git a/indra/newview/llfloatercamera.h b/indra/newview/llfloatercamera.h
index 5d44b4944d0ac91ea768bb4c5e9e5744144a5fbd..45d5e9a845a8b9079d6aff94a79c4027df52f2f3 100644
--- a/indra/newview/llfloatercamera.h
+++ b/indra/newview/llfloatercamera.h
@@ -61,7 +61,7 @@ class LLFloaterCamera
 	/* callback for camera presets changing */
 	static void onClickCameraPresets(const LLSD& param);
 
-	static void toPrevModeIfInAvatarViewMode();
+	static void onLeavingMouseLook();
 
 	/** resets current camera mode to orbit mode */
 	static void resetCameraMode();
@@ -69,8 +69,6 @@ class LLFloaterCamera
 	/* determines actual mode and updates ui */
 	void update();
 	
-	static void updateIfNotInAvatarViewMode();
-
 	virtual void onOpen(const LLSD& key);
 	virtual void onClose(bool app_quitting);
 
diff --git a/indra/newview/llfloatertools.cpp b/indra/newview/llfloatertools.cpp
index 41bb239fda6a11535486af6a84ba956477e9b330..fd7d7b671a3367a9313bc43463ea7e97c0a1896f 100644
--- a/indra/newview/llfloatertools.cpp
+++ b/indra/newview/llfloatertools.cpp
@@ -1221,10 +1221,10 @@ void LLFloaterTools::getMediaState()
 			mNeedMediaTitle = false;
 		}
 		
-		childSetEnabled("media_tex",  bool_has_media & editable);
-		childSetEnabled( "edit_media", bool_has_media & editable );
-		childSetEnabled( "delete_media", bool_has_media & editable );
-		childSetEnabled( "add_media", ( ! bool_has_media ) & editable );
+		childSetEnabled("media_tex",  bool_has_media && editable);
+		childSetEnabled( "edit_media", bool_has_media && LLFloaterMediaSettings::getInstance()->mIdenticalHasMediaInfo && editable );
+		childSetEnabled( "delete_media", bool_has_media && editable );
+		childSetEnabled( "add_media", ( ! bool_has_media ) && editable );
 			// TODO: display a list of all media on the face - use 'identical' flag
 	}
 	else // not all face has media but at least one does.
@@ -1252,7 +1252,7 @@ void LLFloaterTools::getMediaState()
 		}
 		
 		childSetEnabled("media_tex",  TRUE);
-		childSetEnabled( "edit_media", TRUE);
+		childSetEnabled( "edit_media", LLFloaterMediaSettings::getInstance()->mIdenticalHasMediaInfo);
 		childSetEnabled( "delete_media", TRUE);
 		childSetEnabled( "add_media", FALSE );
 	}
@@ -1423,7 +1423,7 @@ void LLFloaterTools::updateMediaSettings()
             return mMediaEntry.getControls();
         };
 		
-		const LLMediaEntry & mMediaEntry;
+		const LLMediaEntry &mMediaEntry;
 		
     } func_controls(default_media_data);
     identical = selected_objects->getSelectedTEValue( &func_controls, value_u8 );
@@ -1446,7 +1446,7 @@ void LLFloaterTools::updateMediaSettings()
             return mMediaEntry.getFirstClickInteract();
         };
 		
-		const LLMediaEntry & mMediaEntry;
+		const LLMediaEntry &mMediaEntry;
 		
     } func_first_click(default_media_data);
     identical = selected_objects->getSelectedTEValue( &func_first_click, value_bool );
@@ -1469,7 +1469,7 @@ void LLFloaterTools::updateMediaSettings()
             return mMediaEntry.getHomeURL();
         };
 		
-		const LLMediaEntry &  mMediaEntry;
+		const LLMediaEntry &mMediaEntry;
 		
     } func_home_url(default_media_data);
     identical = selected_objects->getSelectedTEValue( &func_home_url, value_str );
@@ -1492,7 +1492,7 @@ void LLFloaterTools::updateMediaSettings()
             return mMediaEntry.getCurrentURL();
         };
 		
-		const LLMediaEntry &  mMediaEntry;
+		const LLMediaEntry &mMediaEntry;
 		
     } func_current_url(default_media_data);
     identical = selected_objects->getSelectedTEValue( &func_current_url, value_str );
@@ -1516,7 +1516,7 @@ void LLFloaterTools::updateMediaSettings()
             return mMediaEntry.getAutoZoom();
         };
 		
-		const LLMediaEntry &  mMediaEntry;
+		const LLMediaEntry &mMediaEntry;
 		
     } func_auto_zoom(default_media_data);
     identical = selected_objects->getSelectedTEValue( &func_auto_zoom, value_bool );
@@ -1539,7 +1539,7 @@ void LLFloaterTools::updateMediaSettings()
             return mMediaEntry.getAutoPlay();
         };
 		
-		const LLMediaEntry &  mMediaEntry;
+		const LLMediaEntry &mMediaEntry;
 		
     } func_auto_play(default_media_data);
     identical = selected_objects->getSelectedTEValue( &func_auto_play, value_bool );
@@ -1563,7 +1563,7 @@ void LLFloaterTools::updateMediaSettings()
             return mMediaEntry.getAutoScale();;
         };
 		
-		const LLMediaEntry &  mMediaEntry;
+		const LLMediaEntry &mMediaEntry;
 		
     } func_auto_scale(default_media_data);
     identical = selected_objects->getSelectedTEValue( &func_auto_scale, value_bool );
@@ -1586,7 +1586,7 @@ void LLFloaterTools::updateMediaSettings()
             return mMediaEntry.getAutoLoop();
         };
 		
-		const LLMediaEntry &  mMediaEntry;
+		const LLMediaEntry &mMediaEntry;
 		
     } func_auto_loop(default_media_data);
     identical = selected_objects->getSelectedTEValue( &func_auto_loop, value_bool );
@@ -1609,7 +1609,7 @@ void LLFloaterTools::updateMediaSettings()
             return mMediaEntry.getWidthPixels();
         };
 		
-		const LLMediaEntry &  mMediaEntry;
+		const LLMediaEntry &mMediaEntry;
 		
     } func_width_pixels(default_media_data);
     identical = selected_objects->getSelectedTEValue( &func_width_pixels, value_int );
@@ -1632,7 +1632,7 @@ void LLFloaterTools::updateMediaSettings()
             return mMediaEntry.getHeightPixels();
         };
 		
-		const LLMediaEntry &  mMediaEntry;
+		const LLMediaEntry &mMediaEntry;
 		
     } func_height_pixels(default_media_data);
     identical = selected_objects->getSelectedTEValue( &func_height_pixels, value_int );
@@ -1655,7 +1655,7 @@ void LLFloaterTools::updateMediaSettings()
             return mMediaEntry.getAltImageEnable();
         };
 		
-		const LLMediaEntry &  mMediaEntry;
+		const LLMediaEntry &mMediaEntry;
 		
     } func_enable_alt_image(default_media_data);
     identical = selected_objects->getSelectedTEValue( &func_enable_alt_image, value_bool );
@@ -1678,7 +1678,7 @@ void LLFloaterTools::updateMediaSettings()
             return 0 != ( mMediaEntry.getPermsInteract() & LLMediaEntry::PERM_OWNER );
         };
 		
-		const LLMediaEntry &  mMediaEntry;
+		const LLMediaEntry &mMediaEntry;
 		
     } func_perms_owner_interact(default_media_data);
     identical = selected_objects->getSelectedTEValue( &func_perms_owner_interact, value_bool );
@@ -1701,7 +1701,7 @@ void LLFloaterTools::updateMediaSettings()
             return 0 != ( mMediaEntry.getPermsControl() & LLMediaEntry::PERM_OWNER );
         };
 		
-		const LLMediaEntry &  mMediaEntry;
+		const LLMediaEntry &mMediaEntry;
 		
     } func_perms_owner_control(default_media_data);
     identical = selected_objects ->getSelectedTEValue( &func_perms_owner_control, value_bool );
@@ -1724,7 +1724,7 @@ void LLFloaterTools::updateMediaSettings()
             return 0 != ( mMediaEntry.getPermsInteract() & LLMediaEntry::PERM_GROUP );
         };
 		
-		const LLMediaEntry &  mMediaEntry;
+		const LLMediaEntry &mMediaEntry;
 		
     } func_perms_group_interact(default_media_data);
     identical = selected_objects->getSelectedTEValue( &func_perms_group_interact, value_bool );
@@ -1747,7 +1747,7 @@ void LLFloaterTools::updateMediaSettings()
             return 0 != ( mMediaEntry.getPermsControl() & LLMediaEntry::PERM_GROUP );
         };
 		
-		const LLMediaEntry &  mMediaEntry;
+		const LLMediaEntry &mMediaEntry;
 		
     } func_perms_group_control(default_media_data);
     identical = selected_objects->getSelectedTEValue( &func_perms_group_control, value_bool );
@@ -1770,7 +1770,7 @@ void LLFloaterTools::updateMediaSettings()
             return 0 != ( mMediaEntry.getPermsInteract() & LLMediaEntry::PERM_ANYONE );
         };
 		
-		const LLMediaEntry &  mMediaEntry;
+		const LLMediaEntry &mMediaEntry;
 		
     } func_perms_anyone_interact(default_media_data);
     identical = LLSelectMgr::getInstance()->getSelection()->getSelectedTEValue( &func_perms_anyone_interact, value_bool );
@@ -1793,7 +1793,7 @@ void LLFloaterTools::updateMediaSettings()
             return 0 != ( mMediaEntry.getPermsControl() & LLMediaEntry::PERM_ANYONE );
         };
 		
-		const LLMediaEntry &  mMediaEntry;
+		const LLMediaEntry &mMediaEntry;
 		
     } func_perms_anyone_control(default_media_data);
     identical = selected_objects->getSelectedTEValue( &func_perms_anyone_control, value_bool );
@@ -1816,7 +1816,7 @@ void LLFloaterTools::updateMediaSettings()
             return mMediaEntry.getWhiteListEnable();
         };
 		
-		const LLMediaEntry &  mMediaEntry;
+		const LLMediaEntry &mMediaEntry;
 		
     } func_whitelist_enable(default_media_data);
     identical = selected_objects->getSelectedTEValue( &func_whitelist_enable, value_bool );
@@ -1839,7 +1839,7 @@ void LLFloaterTools::updateMediaSettings()
             return mMediaEntry.getWhiteList();
         };
 		
-		const LLMediaEntry &  mMediaEntry;
+		const LLMediaEntry &mMediaEntry;
 		
     } func_whitelist_urls(default_media_data);
     identical = selected_objects->getSelectedTEValue( &func_whitelist_urls, value_vector_str );
diff --git a/indra/newview/llgrouplist.cpp b/indra/newview/llgrouplist.cpp
index 3ca459a40381ee6d79762365a3f7fb81db24378f..e75d35bea411f5665b5b98b69436a08cd1c3283c 100644
--- a/indra/newview/llgrouplist.cpp
+++ b/indra/newview/llgrouplist.cpp
@@ -210,7 +210,6 @@ void LLGroupList::addNewItem(const LLUUID& id, const std::string& name, const LL
 	item->setGroupID(id);
 	item->setName(name, mNameFilter);
 	item->setGroupIconID(icon_id);
-//	item->setContextMenu(mContextMenu);
 
 	item->childSetVisible("info_btn", false);
 	item->childSetVisible("profile_btn", false);
@@ -268,8 +267,9 @@ bool LLGroupList::onContextMenuItemEnable(const LLSD& userdata)
 	LLUUID selected_group_id = getSelectedUUID();
 	bool real_group_selected = selected_group_id.notNull(); // a "real" (not "none") group is selected
 
+	// each group including "none" can be activated
 	if (userdata.asString() == "activate")
-		return real_group_selected && gAgent.getGroupID() != selected_group_id;
+		return gAgent.getGroupID() != selected_group_id;
 
 	return real_group_selected;
 }
@@ -283,7 +283,6 @@ LLGroupListItem::LLGroupListItem()
 mGroupIcon(NULL),
 mGroupNameBox(NULL),
 mInfoBtn(NULL),
-//mContextMenu(NULL), //TODO:
 mGroupID(LLUUID::null)
 {
 	LLUICtrlFactory::getInstance()->buildPanel(this, "panel_group_list_item.xml");
diff --git a/indra/newview/llimfloater.cpp b/indra/newview/llimfloater.cpp
index 259f629bdd343a40bf8f1523c5b114a872c5eb08..fdc5d14d9763cb94b273ce4afa58b2861b99bb22 100644
--- a/indra/newview/llimfloater.cpp
+++ b/indra/newview/llimfloater.cpp
@@ -120,6 +120,12 @@ void LLIMFloater::onFocusLost()
 void LLIMFloater::onFocusReceived()
 {
 	LLIMModel::getInstance()->setActiveSessionID(mSessionID);
+
+	// return focus to the input field when active tab in the multitab container is clicked.
+	if (isChatMultiTab() && mInputEditor)
+	{
+		mInputEditor->setFocus(TRUE);
+	}
 }
 
 // virtual
@@ -618,6 +624,15 @@ void LLIMFloater::onInputEditorFocusReceived( LLFocusableElement* caller, void*
 		//in disconnected state IM input editor should be disabled
 		self->mInputEditor->setEnabled(!gDisconnected);
 	}
+
+	// when IM Floater is a part of the multitab container LLTabContainer set focus to the first
+	// child on tab button's mouse up. This leads input field lost focus. See EXT-3852.
+	if (isChatMultiTab())
+	{
+		// So, clear control captured mouse to prevent LLTabContainer set focus on the panel's first child.
+		// do not pass self->mInputEditor, this leads to have "Edit Text" mouse pointer wherever it is.
+		gFocusMgr.setMouseCapture(NULL);
+	}
 }
 
 // static
diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp
index 40227539d03efb47c04ef8c50d7ba5ff616e3adf..daabf1f7178361308155ca4232624ca673192c2f 100644
--- a/indra/newview/llimview.cpp
+++ b/indra/newview/llimview.cpp
@@ -82,6 +82,7 @@
 
 #include "llfirstuse.h"
 #include "llagentui.h"
+#include "lltextutil.h"
 
 const static std::string IM_TIME("time");
 const static std::string IM_TEXT("message");
@@ -92,6 +93,7 @@ const static std::string NO_SESSION("(IM Session Doesn't Exist)");
 const static std::string ADHOC_NAME_SUFFIX(" Conference");
 
 std::string LLCallDialogManager::sPreviousSessionlName = "";
+LLIMModel::LLIMSession::SType LLCallDialogManager::sPreviousSessionType = LLIMModel::LLIMSession::P2P_SESSION;
 std::string LLCallDialogManager::sCurrentSessionlName = "";
 LLIMModel::LLIMSession* LLCallDialogManager::sSession = NULL;
 LLVoiceChannel::EState LLCallDialogManager::sOldState = LLVoiceChannel::STATE_READY;
@@ -178,6 +180,7 @@ LLIMModel::LLIMSession::LLIMSession(const LLUUID& session_id, const std::string&
 	if (IM_NOTHING_SPECIAL == type || IM_SESSION_P2P_INVITE == type)
 	{
 		mVoiceChannel  = new LLVoiceChannelP2P(session_id, name, other_participant_id);
+		mOtherParticipantIsAvatar = LLVoiceClient::getInstance()->isParticipantAvatar(mSessionID);
 
 		// check if it was AVALINE call
 		if (!mOtherParticipantIsAvatar)
@@ -208,7 +211,10 @@ LLIMModel::LLIMSession::LLIMSession(const LLUUID& session_id, const std::string&
 	mSpeakers = new LLIMSpeakerMgr(mVoiceChannel);
 
 	// All participants will be added to the list of people we've recently interacted with.
-	mSpeakers->addListener(&LLRecentPeople::instance(), "add");
+
+	// we need to add only _active_ speakers...so comment this. 
+	// may delete this later on cleanup
+	//mSpeakers->addListener(&LLRecentPeople::instance(), "add");
 
 	//we need to wait for session initialization for outgoing ad-hoc and group chat session
 	//correct session id for initiated ad-hoc chat will be received from the server
@@ -224,7 +230,6 @@ LLIMModel::LLIMSession::LLIMSession(const LLUUID& session_id, const std::string&
 	{
 		mCallBackEnabled = LLVoiceClient::getInstance()->isSessionCallBackPossible(mSessionID);
 		mTextIMPossible = LLVoiceClient::getInstance()->isSessionTextIMPossible(mSessionID);
-		mOtherParticipantIsAvatar = LLVoiceClient::getInstance()->isParticipantAvatar(mSessionID);
 	}
 
 	if ( gSavedPerAccountSettings.getBOOL("LogShowHistory") )
@@ -377,6 +382,10 @@ void LLIMModel::LLIMSession::addMessage(const std::string& from, const LLUUID& f
 		mSpeakers->speakerChatted(from_id);
 		mSpeakers->setSpeakerTyping(from_id, FALSE);
 	}
+
+	if( mSessionType == P2P_SESSION ||
+		mSessionType == ADHOC_SESSION)
+		LLRecentPeople::instance().add(from_id);
 }
 
 void LLIMModel::LLIMSession::addMessagesFromHistory(const std::list<LLSD>& history)
@@ -781,7 +790,7 @@ LLIMSpeakerMgr* LLIMModel::getSpeakerManager( const LLUUID& session_id ) const
 	LLIMSession* session = findIMSession(session_id);
 	if (!session)
 	{
-		llwarns << "session " << session_id << "does not exist " << llendl;
+		llwarns << "session " << session_id << " does not exist " << llendl;
 		return NULL;
 	}
 
@@ -1360,6 +1369,13 @@ void LLCallDialogManager::onVoiceChannelChanged(const LLUUID &session_id)
 		sCurrentSessionlName = ""; // Empty string results in "Nearby Voice Chat" after substitution
 		return;
 	}
+	
+	if (sSession)
+	{
+		// store previous session type to process Avaline calls in dialogs
+		sPreviousSessionType = sSession->mSessionType;
+	}
+
 	sSession = session;
 	sSession->mVoiceChannel->setStateChangedCallback(LLCallDialogManager::onVoiceChannelStateChanged);
 	if(sCurrentSessionlName != session->mName)
@@ -1378,6 +1394,7 @@ void LLCallDialogManager::onVoiceChannelChanged(const LLUUID &session_id)
 		mCallDialogPayload["session_name"] = sSession->mName;
 		mCallDialogPayload["other_user_id"] = sSession->mOtherParticipantID;
 		mCallDialogPayload["old_channel_name"] = sPreviousSessionlName;
+		mCallDialogPayload["old_session_type"] = sPreviousSessionType;
 		mCallDialogPayload["state"] = LLVoiceChannel::STATE_CALL_STARTED;
 		mCallDialogPayload["disconnected_channel_name"] = sSession->mName;
 		mCallDialogPayload["session_type"] = sSession->mSessionType;
@@ -1407,6 +1424,7 @@ void LLCallDialogManager::onVoiceChannelStateChanged(const LLVoiceChannel::EStat
 	mCallDialogPayload["session_name"] = sSession->mName;
 	mCallDialogPayload["other_user_id"] = sSession->mOtherParticipantID;
 	mCallDialogPayload["old_channel_name"] = sPreviousSessionlName;
+	mCallDialogPayload["old_session_type"] = sPreviousSessionType;
 	mCallDialogPayload["state"] = new_state;
 	mCallDialogPayload["disconnected_channel_name"] = sSession->mName;
 	mCallDialogPayload["session_type"] = sSession->mSessionType;
@@ -1421,6 +1439,11 @@ void LLCallDialogManager::onVoiceChannelStateChanged(const LLVoiceChannel::EStat
 		}
 		break;
 
+	case LLVoiceChannel::STATE_HUNG_UP:
+		// this state is coming before session is changed, so, put it into payload map
+		mCallDialogPayload["old_session_type"] = sSession->mSessionType;
+		break;
+
 	case LLVoiceChannel::STATE_CONNECTED :
 		ocd = LLFloaterReg::findTypedInstance<LLOutgoingCallDialog>("outgoing_call", LLOutgoingCallDialog::OCD_KEY);
 		if (ocd)
@@ -1561,7 +1584,15 @@ void LLOutgoingCallDialog::show(const LLSD& key)
 	// tell the user which voice channel they are leaving
 	if (!mPayload["old_channel_name"].asString().empty())
 	{
-		childSetTextArg("leaving", "[CURRENT_CHAT]", mPayload["old_channel_name"].asString());
+		bool was_avaline_call = LLIMModel::LLIMSession::AVALINE_SESSION == mPayload["old_session_type"].asInteger();
+
+		std::string old_caller_name = mPayload["old_channel_name"].asString();
+		if (was_avaline_call)
+		{
+			old_caller_name = LLTextUtil::formatPhoneNumber(old_caller_name);
+		}
+
+		childSetTextArg("leaving", "[CURRENT_CHAT]", old_caller_name);
 	}
 	else
 	{
@@ -1575,10 +1606,18 @@ void LLOutgoingCallDialog::show(const LLSD& key)
 	}
 
 	std::string callee_name = mPayload["session_name"].asString();
+
+	LLUUID session_id = mPayload["session_id"].asUUID();
+	bool is_avatar = LLVoiceClient::getInstance()->isParticipantAvatar(session_id);
+
 	if (callee_name == "anonymous")
 	{
 		callee_name = getString("anonymous");
 	}
+	else if (!is_avatar)
+	{
+		callee_name = LLTextUtil::formatPhoneNumber(callee_name);
+	}
 	
 	setTitle(callee_name);
 
@@ -1728,16 +1767,21 @@ BOOL LLIncomingCallDialog::postBuild()
 		call_type = getString(mPayload["notify_box_type"]);
 	}
 		
+	
+	// check to see if this is an Avaline call
+	bool is_avatar = LLVoiceClient::getInstance()->isParticipantAvatar(session_id);
+	childSetVisible("Start IM", is_avatar); // no IM for avaline
+
 	if (caller_name == "anonymous")
 	{
 		caller_name = getString("anonymous");
 	}
-	
-	setTitle(caller_name + " " + call_type);
+	else if (!is_avatar)
+	{
+		caller_name = LLTextUtil::formatPhoneNumber(caller_name);
+	}
 
-	// check to see if this is an Avaline call
-	bool is_avatar = LLVoiceClient::getInstance()->isParticipantAvatar(session_id);
-	childSetVisible("Start IM", is_avatar); // no IM for avaline
+	setTitle(caller_name + " " + call_type);
 
 	LLUICtrl* caller_name_widget = getChild<LLUICtrl>("caller name");
 	caller_name_widget->setValue(caller_name + " " + call_type);
diff --git a/indra/newview/llimview.h b/indra/newview/llimview.h
index 11860d0efb8bc86970437e761ed7e65c8ba90d80..20d8e28392747d508de8f57efab7ace39611b901 100644
--- a/indra/newview/llimview.h
+++ b/indra/newview/llimview.h
@@ -475,6 +475,7 @@ class LLCallDialogManager : public LLInitClass<LLCallDialogManager>
 
 protected:
 	static std::string sPreviousSessionlName;
+	static LLIMModel::LLIMSession::SType sPreviousSessionType;
 	static std::string sCurrentSessionlName;
 	static LLIMModel::LLIMSession* sSession;
 	static LLVoiceChannel::EState sOldState;
diff --git a/indra/newview/llinspectavatar.cpp b/indra/newview/llinspectavatar.cpp
index dae980feb15769564036ce3524ad1f057d580785..7f206cb87310a0d5e211e9f67aeed4742ae61ea3 100644
--- a/indra/newview/llinspectavatar.cpp
+++ b/indra/newview/llinspectavatar.cpp
@@ -112,6 +112,7 @@ class LLInspectAvatar : public LLInspect
 	void onClickAddFriend();
 	void onClickViewProfile();
 	void onClickIM();
+	void onClickCall();
 	void onClickTeleport();
 	void onClickInviteToGroup();
 	void onClickPay();
@@ -204,6 +205,7 @@ LLInspectAvatar::LLInspectAvatar(const LLSD& sd)
 	mCommitCallbackRegistrar.add("InspectAvatar.AddFriend",	boost::bind(&LLInspectAvatar::onClickAddFriend, this));	
 	mCommitCallbackRegistrar.add("InspectAvatar.IM",
 		boost::bind(&LLInspectAvatar::onClickIM, this));	
+	mCommitCallbackRegistrar.add("InspectAvatar.Call",		boost::bind(&LLInspectAvatar::onClickCall, this));	
 	mCommitCallbackRegistrar.add("InspectAvatar.Teleport",	boost::bind(&LLInspectAvatar::onClickTeleport, this));	
 	mCommitCallbackRegistrar.add("InspectAvatar.InviteToGroup",	boost::bind(&LLInspectAvatar::onClickInviteToGroup, this));	
 	mCommitCallbackRegistrar.add("InspectAvatar.Pay",	boost::bind(&LLInspectAvatar::onClickPay, this));	
@@ -611,6 +613,12 @@ void LLInspectAvatar::onClickIM()
 	closeFloater();
 }
 
+void LLInspectAvatar::onClickCall()
+{ 
+	LLAvatarActions::startCall(mAvatarID);
+	closeFloater();
+}
+
 void LLInspectAvatar::onClickTeleport()
 {
 	LLAvatarActions::offerTeleport(mAvatarID);
diff --git a/indra/newview/llinspectobject.cpp b/indra/newview/llinspectobject.cpp
index cb35a287e9c10b06db1232919d884e7acae6d9ce..b3bac0453aee4cf77b2aa7b7a71c6c4bd2cc4fd9 100644
--- a/indra/newview/llinspectobject.cpp
+++ b/indra/newview/llinspectobject.cpp
@@ -41,6 +41,7 @@
 #include "llslurl.h"
 #include "llviewermenu.h"		// handle_object_touch(), handle_buy()
 #include "llviewermedia.h"
+#include "llviewermediafocus.h"
 #include "llviewerobjectlist.h"	// to select the requested object
 
 // Linden libraries
@@ -214,6 +215,10 @@ void LLInspectObject::onOpen(const LLSD& data)
 	LLViewerObject* obj = gObjectList.findObject( mObjectID );
 	if (obj)
 	{
+		// Media focus and this code fight over the select manager.  
+		// Make sure any media is unfocused before changing the selection here.
+		LLViewerMediaFocus::getInstance()->clearFocus();
+		
 		LLSelectMgr::instance().deselectAll();
 		mObjectSelection = LLSelectMgr::instance().selectObjectAndFamily(obj);
 
diff --git a/indra/newview/llnearbychat.cpp b/indra/newview/llnearbychat.cpp
index 2ad82d3e8e8ccd96f3f96070b24d433a7b16f2e9..e7043b2d00c742af4ba4ea94d7fce6f876d1cbef 100644
--- a/indra/newview/llnearbychat.cpp
+++ b/indra/newview/llnearbychat.cpp
@@ -63,7 +63,7 @@
 static const S32 RESIZE_BAR_THICKNESS = 3;
 
 LLNearbyChat::LLNearbyChat(const LLSD& key) 
-	: LLDockableFloater(NULL, false, key)
+	: LLDockableFloater(NULL, false, false, key)
 	,mChatHistory(NULL)
 {
 	
@@ -137,7 +137,7 @@ std::string appendTime()
 	time_t utc_time;
 	utc_time = time_corrected();
 	std::string timeStr ="["+ LLTrans::getString("TimeHour")+"]:["
-		+LLTrans::getString("TimeMin")+"] ";
+		+LLTrans::getString("TimeMin")+"]";
 
 	LLSD substitution;
 
diff --git a/indra/newview/llnotificationofferhandler.cpp b/indra/newview/llnotificationofferhandler.cpp
index dd66a6c5075a1d1ed70565ed1248a634dd672510..fad0c6a91e6dfdab523ba10e61c36512a77d72ea 100644
--- a/indra/newview/llnotificationofferhandler.cpp
+++ b/indra/newview/llnotificationofferhandler.cpp
@@ -112,8 +112,8 @@ bool LLOfferHandler::processNotification(const LLSD& notify)
 				LLHandlerUtil::spawnIMSession(name, from_id);
 			}
 
-			if (notification->getPayload().has("SUPPRES_TOST")
-						&& notification->getPayload()["SUPPRES_TOST"])
+			if (notification->getPayload().has("SUPPRESS_TOAST")
+						&& notification->getPayload()["SUPPRESS_TOAST"])
 			{
 				LLNotificationsUtil::cancel(notification);
 			}
diff --git a/indra/newview/llpanelgroup.cpp b/indra/newview/llpanelgroup.cpp
index fff257589381a39f76ba5364f1faab042569720a..94de17c17d8fd4f96cd0f3098d3f888975461a12 100644
--- a/indra/newview/llpanelgroup.cpp
+++ b/indra/newview/llpanelgroup.cpp
@@ -413,10 +413,13 @@ void LLPanelGroup::setGroupID(const LLUUID& group_id)
 			if(tab_land->getDisplayChildren())
 				tab_land->changeOpenClose(tab_land->getDisplayChildren());
 		}
+
+		LLGroupData agent_gdatap;
+		bool is_member = gAgent.getGroupData(mID,agent_gdatap);
 		
-		tab_roles->canOpenClose(true);
-		tab_notices->canOpenClose(true);
-		tab_land->canOpenClose(true);
+		tab_roles->canOpenClose(is_member);
+		tab_notices->canOpenClose(is_member);
+		tab_land->canOpenClose(is_member);
 
 		getChild<LLUICtrl>("group_name")->setVisible(true);
 		getChild<LLUICtrl>("group_name_editor")->setVisible(false);
diff --git a/indra/newview/llpanelimcontrolpanel.cpp b/indra/newview/llpanelimcontrolpanel.cpp
index 279818d52fb9de6b878850e9faf4ab1b8ca892ad..b547997e7aaf75854db77704e59e22fbfde69e19 100644
--- a/indra/newview/llpanelimcontrolpanel.cpp
+++ b/indra/newview/llpanelimcontrolpanel.cpp
@@ -70,9 +70,9 @@ void LLPanelChatControlPanel::onVoiceChannelStateChanged(const LLVoiceChannel::E
 
 void LLPanelChatControlPanel::updateButtons(bool is_call_started)
 {
-	childSetVisible("end_call_btn", is_call_started);
-	childSetVisible("voice_ctrls_btn", is_call_started);
-	childSetVisible("call_btn", ! is_call_started);
+	childSetVisible("end_call_btn_panel", is_call_started);
+	childSetVisible("voice_ctrls_btn_panel", is_call_started);
+	childSetVisible("call_btn_panel", ! is_call_started);
 }
 
 LLPanelChatControlPanel::~LLPanelChatControlPanel()
diff --git a/indra/newview/llpaneloutfitsinventory.cpp b/indra/newview/llpaneloutfitsinventory.cpp
index 8e14074de16e21adf9d741bd7dccc167fcb786c9..29fa4b319caea4e8f6b1a228e550413cb68b8c64 100644
--- a/indra/newview/llpaneloutfitsinventory.cpp
+++ b/indra/newview/llpaneloutfitsinventory.cpp
@@ -84,6 +84,14 @@ BOOL LLPanelOutfitsInventory::postBuild()
 	return TRUE;
 }
 
+// virtual
+void LLPanelOutfitsInventory::onOpen(const LLSD& key)
+{
+	// Make sure we know which tab is selected, update the filter,
+	// and update verbs.
+	onTabChange();
+}
+
 void LLPanelOutfitsInventory::updateVerbs()
 {
 	if (mParent)
@@ -94,6 +102,7 @@ void LLPanelOutfitsInventory::updateVerbs()
 	if (mListCommands)
 	{
 		mListCommands->childSetVisible("look_edit_btn",sShowDebugEditor);
+		updateListCommands();
 	}
 }
 
@@ -176,7 +185,6 @@ void LLPanelOutfitsInventory::onNew()
 
 void LLPanelOutfitsInventory::onSelectionChange(const std::deque<LLFolderViewItem*> &items, BOOL user_action)
 {
-	updateListCommands();
 	updateVerbs();
 	if (getRootFolder()->needsAutoRename() && items.size())
 	{
@@ -264,9 +272,11 @@ void LLPanelOutfitsInventory::updateListCommands()
 {
 	bool trash_enabled = isActionEnabled("delete");
 	bool wear_enabled = isActionEnabled("wear");
+	bool make_outfit_enabled = isActionEnabled("make_outfit");
 
 	mListCommands->childSetEnabled("trash_btn", trash_enabled);
 	mListCommands->childSetEnabled("wear_btn", wear_enabled);
+	mListCommands->childSetEnabled("make_outfit_btn", make_outfit_enabled);
 }
 
 void LLPanelOutfitsInventory::onGearButtonClick()
@@ -303,6 +313,8 @@ void LLPanelOutfitsInventory::onClipboardAction(const LLSD& userdata)
 {
 	std::string command_name = userdata.asString();
 	getActivePanel()->getRootFolder()->doToSelected(getActivePanel()->getModel(),command_name);
+	updateListCommands();
+	updateVerbs();
 }
 
 void LLPanelOutfitsInventory::onCustomAction(const LLSD& userdata)
@@ -323,6 +335,7 @@ void LLPanelOutfitsInventory::onCustomAction(const LLSD& userdata)
 	{
 		onWearButtonClick();
 	}
+	// Note: This option has been removed from the gear menu.
 	if (command_name == "add")
 	{
 		onAdd();
@@ -343,20 +356,22 @@ void LLPanelOutfitsInventory::onCustomAction(const LLSD& userdata)
 	{
 		onClipboardAction("delete");
 	}
+	updateListCommands();
+	updateVerbs();
 }
 
 BOOL LLPanelOutfitsInventory::isActionEnabled(const LLSD& userdata)
 {
 	const std::string command_name = userdata.asString();
-	if (command_name == "delete")
+	if (command_name == "delete" || command_name == "remove")
 	{
 		BOOL can_delete = FALSE;
 		LLFolderView *folder = getActivePanel()->getRootFolder();
 		if (folder)
 		{
-			can_delete = TRUE;
 			std::set<LLUUID> selection_set;
 			folder->getSelectionList(selection_set);
+			can_delete = (selection_set.size() > 0);
 			for (std::set<LLUUID>::iterator iter = selection_set.begin();
 				 iter != selection_set.end();
 				 ++iter)
@@ -375,9 +390,9 @@ BOOL LLPanelOutfitsInventory::isActionEnabled(const LLSD& userdata)
 		LLFolderView *folder = getActivePanel()->getRootFolder();
 		if (folder)
 		{
-			can_delete = TRUE;
 			std::set<LLUUID> selection_set;
 			folder->getSelectionList(selection_set);
+			can_delete = (selection_set.size() > 0);
 			for (std::set<LLUUID>::iterator iter = selection_set.begin();
 				 iter != selection_set.end();
 				 ++iter)
@@ -391,10 +406,24 @@ BOOL LLPanelOutfitsInventory::isActionEnabled(const LLSD& userdata)
 		}
 		return FALSE;
 	}
+	if (command_name == "rename" ||
+		command_name == "delete_outfit")
+	{
+		return (getCorrectListenerForAction() != NULL) && hasItemsSelected();
+	}
+	
+	if (command_name == "wear" ||
+		command_name == "make_outfit")
+	{
+		const BOOL is_my_outfits = (mActivePanel->getName() == "outfitslist_accordionpanel");
+		if (!is_my_outfits)
+		{
+			return FALSE;
+		}
+	}
+   
 	if (command_name == "edit" || 
-		command_name == "wear" ||
-		command_name == "add" ||
-		command_name == "remove"
+		command_name == "add"
 		)
 	{
 		return (getCorrectListenerForAction() != NULL);
@@ -402,6 +431,19 @@ BOOL LLPanelOutfitsInventory::isActionEnabled(const LLSD& userdata)
 	return TRUE;
 }
 
+bool LLPanelOutfitsInventory::hasItemsSelected()
+{
+	bool has_items_selected = false;
+	LLFolderView *folder = getActivePanel()->getRootFolder();
+	if (folder)
+	{
+		std::set<LLUUID> selection_set;
+		folder->getSelectionList(selection_set);
+		has_items_selected = (selection_set.size() > 0);
+	}
+	return has_items_selected;
+}
+
 bool LLPanelOutfitsInventory::handleDragAndDropToTrash(BOOL drop, EDragAndDropType cargo_type, EAcceptance* accept)
 {
 	*accept = ACCEPT_NO;
@@ -425,17 +467,17 @@ bool LLPanelOutfitsInventory::handleDragAndDropToTrash(BOOL drop, EDragAndDropTy
 void LLPanelOutfitsInventory::initTabPanels()
 {
 	mTabPanels.resize(2);
+
+	LLInventoryPanel *cof_panel = getChild<LLInventoryPanel>("cof_accordionpanel");
+	cof_panel->setShowFolderState(LLInventoryFilter::SHOW_NON_EMPTY_FOLDERS);
+	mTabPanels[0] = cof_panel;
 	
 	LLInventoryPanel *myoutfits_panel = getChild<LLInventoryPanel>("outfitslist_accordionpanel");
 	myoutfits_panel->setFilterTypes(1LL << LLFolderType::FT_OUTFIT, LLInventoryFilter::FILTERTYPE_CATEGORY);
 	myoutfits_panel->setShowFolderState(LLInventoryFilter::SHOW_NON_EMPTY_FOLDERS);
-	mTabPanels[0] = myoutfits_panel;
-	mActivePanel = myoutfits_panel;
+	mTabPanels[1] = myoutfits_panel;
 
-
-	LLInventoryPanel *cof_panel = getChild<LLInventoryPanel>("cof_accordionpanel");
-	cof_panel->setShowFolderState(LLInventoryFilter::SHOW_NON_EMPTY_FOLDERS);
-	mTabPanels[1] = cof_panel;
+	mActivePanel = mTabPanels[0];
 
 	for (tabpanels_vec_t::iterator iter = mTabPanels.begin();
 		 iter != mTabPanels.end();
@@ -479,9 +521,7 @@ void LLPanelOutfitsInventory::onTabChange()
 		return;
 	}
 	mActivePanel->setFilterSubString(mFilterSubString);
-
-	bool is_my_outfits = (mActivePanel->getName() == "outfitslist_accordionpanel");
-	mListCommands->childSetEnabled("make_outfit_btn", is_my_outfits);
+	updateVerbs();
 }
 
 LLInventoryPanel* LLPanelOutfitsInventory::getActivePanel()
diff --git a/indra/newview/llpaneloutfitsinventory.h b/indra/newview/llpaneloutfitsinventory.h
index 1e084750a09878021db5ec180ab18a33c03e2be5..b1173117753ffa096ae84164ee4134975033c6f5 100644
--- a/indra/newview/llpaneloutfitsinventory.h
+++ b/indra/newview/llpaneloutfitsinventory.h
@@ -53,6 +53,7 @@ class LLPanelOutfitsInventory : public LLPanel
 	virtual ~LLPanelOutfitsInventory();
 
 	/*virtual*/ BOOL postBuild();
+	/*virtual*/ void onOpen(const LLSD& key);
 	
 	void onSearchEdit(const std::string& string);
 	void onAdd();
@@ -114,6 +115,7 @@ class LLPanelOutfitsInventory : public LLPanel
 	BOOL isActionEnabled(const LLSD& command_name);
 	void onCustomAction(const LLSD& command_name);
 	bool handleDragAndDropToTrash(BOOL drop, EDragAndDropType cargo_type, EAcceptance* accept);
+	bool hasItemsSelected();
 private:
 	LLPanel*					mListCommands;
 	LLMenuGL*					mMenuGearDefault;
diff --git a/indra/newview/llpanelpicks.cpp b/indra/newview/llpanelpicks.cpp
index 751705dd577d69310ef230e1d0c4c0b223ceafaa..ada65c98a49a4d5f8a32060c714b3364f60b1152 100644
--- a/indra/newview/llpanelpicks.cpp
+++ b/indra/newview/llpanelpicks.cpp
@@ -411,6 +411,7 @@ BOOL LLPanelPicks::postBuild()
 
 	LLUICtrl::CommitCallbackRegistry::ScopedRegistrar plus_registar;
 	plus_registar.add("Picks.Plus.Action", boost::bind(&LLPanelPicks::onPlusMenuItemClicked, this, _2));
+	mEnableCallbackRegistrar.add("Picks.Plus.Enable", boost::bind(&LLPanelPicks::isActionEnabled, this, _2));
 	mPlusMenu = LLUICtrlFactory::getInstance()->createFromFile<LLToggleableMenu>("menu_picks_plus.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
 	
 	return TRUE;
@@ -430,6 +431,18 @@ void LLPanelPicks::onPlusMenuItemClicked(const LLSD& param)
 	}
 }
 
+bool LLPanelPicks::isActionEnabled(const LLSD& userdata) const
+{
+	std::string command_name = userdata.asString();
+
+	if (command_name == "new_pick" && LLAgentPicksInfo::getInstance()->isPickLimitReached())
+	{
+		return false;
+	}
+
+	return true;
+}
+
 void LLPanelPicks::onAccordionStateChanged(const LLAccordionCtrlTab* acc_tab)
 {
 	if(!mPicksAccTab->getDisplayChildren())
@@ -652,7 +665,6 @@ void LLPanelPicks::updateButtons()
 
 	if (getAvatarId() == gAgentID)
 	{
-		childSetEnabled(XML_BTN_NEW, !LLAgentPicksInfo::getInstance()->isPickLimitReached());
 		childSetEnabled(XML_BTN_DELETE, has_selected);
 	}
 
diff --git a/indra/newview/llpanelpicks.h b/indra/newview/llpanelpicks.h
index 1b2e35ca468339792d07a613232857716ba91a6e..3f757e482e1494abc08fe50338b8cc9431d409d2 100644
--- a/indra/newview/llpanelpicks.h
+++ b/indra/newview/llpanelpicks.h
@@ -97,6 +97,7 @@ class LLPanelPicks
 	void onClickMap();
 
 	void onPlusMenuItemClicked(const LLSD& param);
+	bool isActionEnabled(const LLSD& userdata) const;
 
 	void onListCommit(const LLFlatListView* f_list);
 	void onAccordionStateChanged(const LLAccordionCtrlTab* acc_tab);
diff --git a/indra/newview/llpanelprimmediacontrols.cpp b/indra/newview/llpanelprimmediacontrols.cpp
index 5cc9c1951b5e6608eb9f8fe324eb5fc759e29177..4f539f404d5ef06847f46cfc31123f55941259ff 100644
--- a/indra/newview/llpanelprimmediacontrols.cpp
+++ b/indra/newview/llpanelprimmediacontrols.cpp
@@ -127,7 +127,11 @@ LLPanelPrimMediaControls::LLPanelPrimMediaControls() :
 	mScrollState = SCROLL_NONE;
 
 	mPanelHandle.bind(this);
+	
+	mInactiveTimeout = gSavedSettings.getF32("MediaControlTimeout");
+	mControlFadeTime = gSavedSettings.getF32("MediaControlFadeTime");
 }
+
 LLPanelPrimMediaControls::~LLPanelPrimMediaControls()
 {
 }
@@ -172,6 +176,7 @@ BOOL LLPanelPrimMediaControls::postBuild()
 	LLStringUtil::convertToF32(getString("zoom_near_padding"), mZoomNearPadding);
 	LLStringUtil::convertToF32(getString("zoom_medium_padding"), mZoomMediumPadding);
 	LLStringUtil::convertToF32(getString("zoom_far_padding"), mZoomFarPadding);
+	LLStringUtil::convertToS32(getString("top_world_view_avoid_zone"), mTopWorldViewAvoidZone);
 
 	// These are currently removed...but getChild creates a "dummy" widget.
 	// This class handles them missing.
@@ -207,11 +212,9 @@ BOOL LLPanelPrimMediaControls::postBuild()
 	}
 		
 	mMediaAddress->setFocusReceivedCallback(boost::bind(&LLPanelPrimMediaControls::onInputURL, _1, this ));
-	mInactiveTimeout = gSavedSettings.getF32("MediaControlTimeout");
-	mControlFadeTime = gSavedSettings.getF32("MediaControlFadeTime");
-
+	
 	mCurrentZoom = ZOOM_NONE;
-	// clicks on HUD buttons do not remove keyboard focus from media
+	// clicks on buttons do not remove keyboard focus from media
 	setIsChrome(TRUE);
 	return TRUE;
 }
@@ -373,8 +376,8 @@ void LLPanelPrimMediaControls::updateShape()
 			mVolumeUpCtrl->setVisible(has_focus);
 			mVolumeDownCtrl->setVisible(has_focus);
 			mVolumeCtrl->setEnabled(has_focus);
-			mVolumeSliderCtrl->setEnabled(has_focus && mVolumeSliderVisible > 0);
-			mVolumeSliderCtrl->setVisible(has_focus && mVolumeSliderVisible > 0);
+			mVolumeSliderCtrl->setEnabled(has_focus && shouldVolumeSliderBeVisible());
+			mVolumeSliderCtrl->setVisible(has_focus && shouldVolumeSliderBeVisible());
 			
 			mWhitelistIcon->setVisible(false);
 			mSecureLockIcon->setVisible(false);
@@ -627,36 +630,45 @@ void LLPanelPrimMediaControls::updateShape()
 			update_min_max(min, max, LLVector3(screen_vert.v));
 		}
 		
+		// convert screenspace bbox to pixels (in screen coords)
+		LLRect window_rect = gViewerWindow->getWorldViewRectScaled();
 		LLCoordGL screen_min;
-		screen_min.mX = llround((F32)gViewerWindow->getWorldViewWidthScaled() * (min.mV[VX] + 1.f) * 0.5f);
-		screen_min.mY = llround((F32)gViewerWindow->getWorldViewHeightScaled() * (min.mV[VY] + 1.f) * 0.5f);
+		screen_min.mX = llround((F32)window_rect.getWidth() * (min.mV[VX] + 1.f) * 0.5f);
+		screen_min.mY = llround((F32)window_rect.getHeight() * (min.mV[VY] + 1.f) * 0.5f);
 		
 		LLCoordGL screen_max;
-		screen_max.mX = llround((F32)gViewerWindow->getWorldViewWidthScaled() * (max.mV[VX] + 1.f) * 0.5f);
-		screen_max.mY = llround((F32)gViewerWindow->getWorldViewHeightScaled() * (max.mV[VY] + 1.f) * 0.5f);
+		screen_max.mX = llround((F32)window_rect.getWidth() * (max.mV[VX] + 1.f) * 0.5f);
+		screen_max.mY = llround((F32)window_rect.getHeight() * (max.mV[VY] + 1.f) * 0.5f);
 		
-		// grow panel so that screenspace bounding box fits inside "media_region" element of HUD
-		LLRect media_controls_rect;
-		S32 volume_slider_height = mVolumeSliderCtrl->getRect().getHeight() - /*fudge*/ 2;
-		getParent()->screenRectToLocal(LLRect(screen_min.mX, screen_max.mY, screen_max.mX, screen_min.mY), &media_controls_rect);
-		media_controls_rect.mLeft -= mMediaRegion->getRect().mLeft;
-		media_controls_rect.mBottom -= mMediaRegion->getRect().mBottom - volume_slider_height;
-		media_controls_rect.mTop += getRect().getHeight() - mMediaRegion->getRect().mTop;
-		media_controls_rect.mRight += getRect().getWidth() - mMediaRegion->getRect().mRight;
+		// grow panel so that screenspace bounding box fits inside "media_region" element of panel
+		LLRect media_panel_rect;
+		// Get the height of the controls (less the volume slider)
+		S32 controls_height = mMediaControlsStack->getRect().getHeight() - mVolumeSliderCtrl->getRect().getHeight();
+		getParent()->screenRectToLocal(LLRect(screen_min.mX, screen_max.mY, screen_max.mX, screen_min.mY), &media_panel_rect);
+		media_panel_rect.mTop += controls_height;
 		
-		// keep all parts of HUD on-screen
-		LLRect window_rect = getParent()->getLocalRect();
-		media_controls_rect.intersectWith(window_rect);
+		// keep all parts of panel on-screen
+		// Area of the top of the world view to avoid putting the controls
+		window_rect.mTop -= mTopWorldViewAvoidZone;
+		// Don't include "spacing" bookends on left & right of the media controls
+		window_rect.mLeft -= mLeftBookend->getRect().getWidth();
+		window_rect.mRight += mRightBookend->getRect().getWidth();
+		// Don't include the volume slider
+		window_rect.mBottom -= mVolumeSliderCtrl->getRect().getHeight();
+		media_panel_rect.intersectWith(window_rect);
 		
 		// clamp to minimum size, keeping rect inside window
-		S32 centerX = media_controls_rect.getCenterX();
-		S32 centerY = media_controls_rect.getCenterY();
+		S32 centerX = media_panel_rect.getCenterX();
+		S32 centerY = media_panel_rect.getCenterY();
+		// Shrink screen rect by min width and height, to ensure containment
 		window_rect.stretch(-mMinWidth/2, -mMinHeight/2);
 		window_rect.clampPointToRect(centerX, centerY);
-		media_controls_rect.setCenterAndSize(centerX, centerY,
-											 llmax(mMinWidth, media_controls_rect.getWidth()), llmax(mMinHeight, media_controls_rect.getHeight()));
+		media_panel_rect.setCenterAndSize(centerX, centerY, 
+										  llmax(mMinWidth, media_panel_rect.getWidth()),
+										  llmax(mMinHeight, media_panel_rect.getHeight()));
 		
-		setShape(media_controls_rect, true);
+		// Finally set the size of the panel
+		setShape(media_panel_rect, true);
 		
 		// Test mouse position to see if the cursor is stationary
 		LLCoordWindow cursor_pos_window;
@@ -699,13 +711,13 @@ void LLPanelPrimMediaControls::updateShape()
 /*virtual*/
 void LLPanelPrimMediaControls::draw()
 {
-	F32 alpha = 1.f;
+	F32 alpha = getDrawContext().mAlpha;
 	if(mFadeTimer.getStarted())
 	{
 		F32 time = mFadeTimer.getElapsedTimeF32();
-		alpha = llmax(lerp(1.0, 0.0, time / mControlFadeTime), 0.0f);
+		alpha *= llmax(lerp(1.0, 0.0, time / mControlFadeTime), 0.0f);
 
-		if(mFadeTimer.getElapsedTimeF32() >= mControlFadeTime)
+		if(time >= mControlFadeTime)
 		{
 			if(mClearFaceOnFade)
 			{
@@ -726,27 +738,30 @@ void LLPanelPrimMediaControls::draw()
 	// Build rect for icon area in coord system of this panel
 	// Assumes layout_stack is a direct child of this panel
 	mMediaControlsStack->updateLayout();
-	LLRect icon_area = mMediaControlsStack->getRect();
-
+	
+	// adjust for layout stack spacing
+	S32 space = mMediaControlsStack->getPanelSpacing() + 1;
+	LLRect controls_bg_area = mMediaControlsStack->getRect();
+	
+	controls_bg_area.mTop += space;
+	
 	// adjust to ignore space from volume slider
-	icon_area.mTop -= mVolumeSliderCtrl->getRect().getHeight();
+	controls_bg_area.mBottom += mVolumeSliderCtrl->getRect().getHeight();
 	
 	// adjust to ignore space from left bookend padding
-	icon_area.mLeft += mLeftBookend->getRect().getWidth();
+	controls_bg_area.mLeft += mLeftBookend->getRect().getWidth() - space;
 	
 	// ignore space from right bookend padding
-	icon_area.mRight -= mRightBookend->getRect().getWidth();
+	controls_bg_area.mRight -= mRightBookend->getRect().getWidth() - space;
 		
 	// draw control background UI image
-	mBackgroundImage->draw( icon_area, UI_VERTEX_COLOR % alpha);
+	mBackgroundImage->draw( controls_bg_area, UI_VERTEX_COLOR % alpha);
 	
 	// draw volume slider background UI image
 	if (mVolumeSliderCtrl->getVisible())
 	{
-		LLRect volume_slider_rect = mVolumeSliderCtrl->getRect();
-		// For some reason the rect is not in the right place (??)
-		// This translates the bg to under the slider
-		volume_slider_rect.translate(mVolumeSliderCtrl->getParent()->getRect().mLeft, icon_area.getHeight());
+		LLRect volume_slider_rect;
+		screenRectToLocal(mVolumeSliderCtrl->calcScreenRect(), &volume_slider_rect);
 		mVolumeSliderBackgroundImage->draw(volume_slider_rect, UI_VERTEX_COLOR % alpha);
 	}
 	
@@ -1259,6 +1274,11 @@ void LLPanelPrimMediaControls::onToggleMute()
 		{
 			media_impl->setVolume(0.0);
 		}
+		else if (mVolumeSliderCtrl->getValueF32() == 0.0)
+		{
+			media_impl->setVolume(1.0);
+			mVolumeSliderCtrl->setValue(1.0);
+		}
 		else 
 		{
 			media_impl->setVolume(mVolumeSliderCtrl->getValueF32());
@@ -1271,8 +1291,12 @@ void LLPanelPrimMediaControls::showVolumeSlider()
 	mVolumeSliderVisible++;
 }
 
-
 void LLPanelPrimMediaControls::hideVolumeSlider()
 {
 	mVolumeSliderVisible--;
 }
+
+bool LLPanelPrimMediaControls::shouldVolumeSliderBeVisible()
+{
+	return mVolumeSliderVisible > 0;
+}
diff --git a/indra/newview/llpanelprimmediacontrols.h b/indra/newview/llpanelprimmediacontrols.h
index d899ee4473bc8955b935bd7732bd1b9f5734f9db..419f033628c9157c75f0df8c73cbb0056c4a8bca 100644
--- a/indra/newview/llpanelprimmediacontrols.h
+++ b/indra/newview/llpanelprimmediacontrols.h
@@ -111,6 +111,7 @@ class LLPanelPrimMediaControls : public LLPanel
 	void onToggleMute();
 	void showVolumeSlider();
 	void hideVolumeSlider();
+	bool shouldVolumeSliderBeVisible();
 	
 	static void onScrollUp(void* user_data);
 	static void onScrollUpHeld(void* user_data);
@@ -171,6 +172,7 @@ class LLPanelPrimMediaControls : public LLPanel
 	F32 mZoomNearPadding;
 	F32 mZoomMediumPadding;
 	F32 mZoomFarPadding;
+	S32 mTopWorldViewAvoidZone;
 	
 	LLUICtrl *mMediaPanelScroll;
 	LLButton *mScrollUpCtrl;
diff --git a/indra/newview/llpanelteleporthistory.cpp b/indra/newview/llpanelteleporthistory.cpp
index 245f694ac6a584a82b394e92953bb4cf5fd47d62..65a3d9d41b9fdc216d1c154fe02b7ef97c9e29ea 100644
--- a/indra/newview/llpanelteleporthistory.cpp
+++ b/indra/newview/llpanelteleporthistory.cpp
@@ -1045,4 +1045,11 @@ void LLTeleportHistoryPanel::onAccordionExpand(LLUICtrl* ctrl, const LLSD& param
 	bool expanded = param.asBoolean();
 	// Save accordion tab state to restore it in refresh()
 	setAccordionCollapsedByUser(ctrl, !expanded);
+
+	// Reset selection upon accordion being collapsed
+	// to disable "Teleport" and "Map" buttons for hidden item.
+	if (!expanded && mLastSelectedFlatlList)
+	{
+		mLastSelectedFlatlList->resetSelection();
+	}
 }
diff --git a/indra/newview/llsidepanelappearance.cpp b/indra/newview/llsidepanelappearance.cpp
index 30b0075c4b24c62a8f0d38d69cf42d7347f732e4..0aefebce10bbbac62c3d615e22cc66e3267a1bfd 100644
--- a/indra/newview/llsidepanelappearance.cpp
+++ b/indra/newview/llsidepanelappearance.cpp
@@ -166,6 +166,11 @@ void LLSidepanelAppearance::onOpen(const LLSD& key)
 	refreshCurrentOutfitName();
 	updateVerbs();
 
+	if (mPanelOutfitsInventory)
+	{
+		mPanelOutfitsInventory->onOpen(key);
+	}
+
 	if(key.size() == 0)
 		return;
 
@@ -198,7 +203,7 @@ void LLSidepanelAppearance::onFilterEdit(const std::string& search_string)
 
 void LLSidepanelAppearance::onOpenOutfitButtonClicked()
 {
-	const LLViewerInventoryItem *outfit_link = LLAppearanceManager::getInstance()->getCurrentOutfitLink();
+	const LLViewerInventoryItem *outfit_link = LLAppearanceManager::getInstance()->getBaseOutfitLink();
 	if (!outfit_link)
 		return;
 	if (!outfit_link->getIsLinkType())
@@ -313,7 +318,7 @@ void LLSidepanelAppearance::refreshCurrentOutfitName(const std::string& name)
 {
 	if (name == "")
 	{
-		const LLViewerInventoryItem *outfit_link = LLAppearanceManager::getInstance()->getCurrentOutfitLink();
+		const LLViewerInventoryItem *outfit_link = LLAppearanceManager::getInstance()->getBaseOutfitLink();
 		if (outfit_link)
 		{
 			const LLViewerInventoryCategory *cat = outfit_link->getLinkedCategory();
diff --git a/indra/newview/llsidepaneltaskinfo.cpp b/indra/newview/llsidepaneltaskinfo.cpp
index 50cec3184d38b66ac803d7f4f74c06223a8e6954..0b8f66c5f3af41dd0e1def576e0f41cf9d16f779 100644
--- a/indra/newview/llsidepaneltaskinfo.cpp
+++ b/indra/newview/llsidepaneltaskinfo.cpp
@@ -215,6 +215,10 @@ void LLSidepanelTaskInfo::disableAll()
 	childSetVisible("E:",								FALSE);
 	childSetVisible("N:",								FALSE);
 	childSetVisible("F:",								FALSE);
+	
+	mOpenBtn->setEnabled(FALSE);
+	mPayBtn->setEnabled(FALSE);
+	mBuyBtn->setEnabled(FALSE);
 }
 
 void LLSidepanelTaskInfo::refresh()
@@ -1119,6 +1123,8 @@ void LLSidepanelTaskInfo::updateVerbs()
 	*/
 
 	mOpenBtn->setEnabled(enable_object_open());
+	mPayBtn->setEnabled(enable_pay_object());
+	mBuyBtn->setEnabled(enable_buy_object());
 }
 
 void LLSidepanelTaskInfo::onOpenButtonClicked()
diff --git a/indra/newview/llsyswellwindow.cpp b/indra/newview/llsyswellwindow.cpp
index a46ca1f8ac4124cc1a110470b78a74cf7907ff98..44cf82540a08d6b711927439ca656164faaf13f7 100644
--- a/indra/newview/llsyswellwindow.cpp
+++ b/indra/newview/llsyswellwindow.cpp
@@ -349,7 +349,6 @@ LLIMWellWindow::RowPanel::RowPanel(const LLSysWellWindow* parent, const LLUUID&
 	}
 
 	// Initialize chiclet.
-	mChiclet->setRect(LLRect(5, 28, 30, 3)); // *HACK: workaround for (EXT-3599)
 	mChiclet->setChicletSizeChangedCallback(boost::bind(&LLIMWellWindow::RowPanel::onChicletSizeChanged, this, mChiclet, _2));
 	mChiclet->enableCounterControl(true);
 	mChiclet->setCounter(chicletCounter);
@@ -410,6 +409,11 @@ BOOL LLIMWellWindow::RowPanel::handleMouseDown(S32 x, S32 y, MASK mask)
 	return LLPanel::handleMouseDown(x, y, mask);
 }
 
+// virtual
+BOOL LLIMWellWindow::RowPanel::handleRightMouseDown(S32 x, S32 y, MASK mask)
+{
+	return mChiclet->handleRightMouseDown(x, y, mask);
+}
 /************************************************************************/
 /*         ObjectRowPanel implementation                                */
 /************************************************************************/
@@ -553,6 +557,12 @@ BOOL LLIMWellWindow::ObjectRowPanel::handleMouseDown(S32 x, S32 y, MASK mask)
 	return LLPanel::handleMouseDown(x, y, mask);
 }
 
+// virtual
+BOOL LLIMWellWindow::ObjectRowPanel::handleRightMouseDown(S32 x, S32 y, MASK mask)
+{
+	return mChiclet->handleRightMouseDown(x, y, mask);
+}
+
 /************************************************************************/
 /*         LLNotificationWellWindow implementation                      */
 /************************************************************************/
diff --git a/indra/newview/llsyswellwindow.h b/indra/newview/llsyswellwindow.h
index 833e4dd504ba06cfaa05f32c5dd1f87e908863a6..ded3abcbf400ad111fc08bd8565b1472ca618034 100644
--- a/indra/newview/llsyswellwindow.h
+++ b/indra/newview/llsyswellwindow.h
@@ -217,6 +217,8 @@ class LLIMWellWindow : public LLSysWellWindow, LLIMSessionObserver, LLInitClass<
 		void onMouseEnter(S32 x, S32 y, MASK mask);
 		void onMouseLeave(S32 x, S32 y, MASK mask);
 		BOOL handleMouseDown(S32 x, S32 y, MASK mask);
+		BOOL handleRightMouseDown(S32 x, S32 y, MASK mask);
+
 	private:
 		static const S32 CHICLET_HPAD = 10;
 		void onChicletSizeChanged(LLChiclet* ctrl, const LLSD& param);
@@ -245,6 +247,8 @@ class LLIMWellWindow : public LLSysWellWindow, LLIMSessionObserver, LLInitClass<
 		/*virtual*/ void onMouseEnter(S32 x, S32 y, MASK mask);
 		/*virtual*/ void onMouseLeave(S32 x, S32 y, MASK mask);
 		/*virtual*/ BOOL handleMouseDown(S32 x, S32 y, MASK mask);
+		/*virtual*/ BOOL handleRightMouseDown(S32 x, S32 y, MASK mask);
+
 	private:
 		void onClosePanel();
 		static EObjectType getObjectType(const LLNotificationPtr& notification);
diff --git a/indra/newview/lltoast.cpp b/indra/newview/lltoast.cpp
index 96d1624cd4036a199a3a0aa3783f8cdd025dd92c..110d158e2daa17b8da7a34560fc522718a058884 100644
--- a/indra/newview/lltoast.cpp
+++ b/indra/newview/lltoast.cpp
@@ -266,6 +266,8 @@ void LLToast::onMouseEnter(S32 x, S32 y, MASK mask)
 {
 	mOnToastHoverSignal(this, MOUSE_ENTER);
 
+	setBackgroundOpaque(TRUE);
+
 	//toasts fading is management by Screen Channel
 	
 	sendChildToFront(mHideBtn);
diff --git a/indra/newview/lltoolpie.cpp b/indra/newview/lltoolpie.cpp
index b1d09eccba194b7eae52a7304ce142155c058c69..5f66e6b40911b26c832bdb1d307b3c831ae554cb 100644
--- a/indra/newview/lltoolpie.cpp
+++ b/indra/newview/lltoolpie.cpp
@@ -101,16 +101,13 @@ BOOL LLToolPie::handleAnyMouseClick(S32 x, S32 y, MASK mask, EClickType clicktyp
 BOOL LLToolPie::handleMouseDown(S32 x, S32 y, MASK mask)
 {
 	//left mouse down always picks transparent
-	gViewerWindow->pickAsync(x, y, mask, leftMouseCallback, TRUE);
+	mPick = gViewerWindow->pickImmediate(x, y, TRUE);
+	mPick.mKeyMask = mask;
 	mGrabMouseButtonDown = TRUE;
-	return TRUE;
-}
+	
+	pickLeftMouseDownCallback();
 
-// static
-void LLToolPie::leftMouseCallback(const LLPickInfo& pick_info)
-{
-	LLToolPie::getInstance()->mPick = pick_info;
-	LLToolPie::getInstance()->pickLeftMouseDownCallback();
+	return TRUE;
 }
 
 // Spawn context menus on right mouse down so you can drag over and select
@@ -118,8 +115,13 @@ void LLToolPie::leftMouseCallback(const LLPickInfo& pick_info)
 BOOL LLToolPie::handleRightMouseDown(S32 x, S32 y, MASK mask)
 {
 	// don't pick transparent so users can't "pay" transparent objects
-	gViewerWindow->pickAsync(x, y, mask, rightMouseCallback, FALSE);
+	mPick = gViewerWindow->pickImmediate(x, y, FALSE);
+	mPick.mKeyMask = mask;
+
 	// claim not handled so UI focus stays same
+	
+	pickRightMouseDownCallback();
+	
 	return FALSE;
 }
 
@@ -134,13 +136,6 @@ BOOL LLToolPie::handleScrollWheel(S32 x, S32 y, S32 clicks)
 	return LLViewerMediaFocus::getInstance()->handleScrollWheel(x, y, clicks);
 }
 
-// static
-void LLToolPie::rightMouseCallback(const LLPickInfo& pick_info)
-{
-	LLToolPie::getInstance()->mPick = pick_info;
-	LLToolPie::getInstance()->pickRightMouseDownCallback();
-}
-
 // True if you selected an object.
 BOOL LLToolPie::pickLeftMouseDownCallback()
 {
diff --git a/indra/newview/lltoolpie.h b/indra/newview/lltoolpie.h
index 3660c685525d9436eaac30856acd182bb1d46708..5f0e28fa95e6c61d7b0565dc0045850951967f76 100644
--- a/indra/newview/lltoolpie.h
+++ b/indra/newview/lltoolpie.h
@@ -71,9 +71,6 @@ class LLToolPie : public LLTool, public LLSingleton<LLToolPie>
 	LLObjectSelection*	getLeftClickSelection() { return (LLObjectSelection*)mLeftClickSelection; }
 	void 				resetSelection();
 	
-	static void			leftMouseCallback(const LLPickInfo& pick_info);
-	static void			rightMouseCallback(const LLPickInfo& pick_info);
-
 	static void			selectionPropertiesReceived();
 
 	static void			showAvatarInspector(const LLUUID& avatar_id);
diff --git a/indra/newview/llviewermedia.cpp b/indra/newview/llviewermedia.cpp
index bf96472e7ee7fed2c26027fb71f65a5607fe6319..7e8c8eb92ed9079ce8943c2b15bf73cdc5f81b05 100644
--- a/indra/newview/llviewermedia.cpp
+++ b/indra/newview/llviewermedia.cpp
@@ -170,12 +170,15 @@ LOG_CLASS(LLMimeDiscoveryResponder);
 		//     accept this and go past it in the MIME type probe
 		// 302 means the resource can be found temporarily in a different place - added this for join.secondlife.com
 		// 499 is a code specifc to join.secondlife.com (????) apparently safe to ignore
-		if(	((status >= 200) && (status < 300))	||
-			((status >= 400) && (status < 499))	|| 
-			(status == 500) ||
-			(status == 302) ||
-			(status == 499) 
-			)
+//		if(	((status >= 200) && (status < 300))	||
+//			((status >= 400) && (status < 499))	|| 
+//			(status == 500) ||
+//			(status == 302) ||
+//			(status == 499) 
+//			)
+		// We now no longer check the error code returned from the probe.
+		// If we have a mime type, use it.  If not, default to the web plugin and let it handle error reporting.
+		if(1)
 		{
 			// The probe was successful.
 			if(mime_type.empty())
@@ -987,7 +990,7 @@ void LLViewerMediaImpl::emitEvent(LLPluginClassMedia* plugin, LLViewerMediaObser
 bool LLViewerMediaImpl::initializeMedia(const std::string& mime_type)
 {
 	bool mimeTypeChanged = (mMimeType != mime_type);
-	bool pluginChanged = (LLMIMETypes::implType(mMimeType) != LLMIMETypes::implType(mime_type));
+	bool pluginChanged = (LLMIMETypes::implType(mCurrentMimeType) != LLMIMETypes::implType(mime_type));
 	
 	if(!mMediaSource || pluginChanged)
 	{
@@ -1127,6 +1130,9 @@ bool LLViewerMediaImpl::initializePlugin(const std::string& media_type)
 	// If we got here, we want to ignore previous init failures.
 	mMediaSourceFailed = false;
 
+	// Save the MIME type that really caused the plugin to load
+	mCurrentMimeType = mMimeType;
+
 	LLPluginClassMedia* media_source = newSourceFromMediaType(mMimeType, this, mMediaWidth, mMediaHeight);
 	
 	if (media_source)
@@ -1563,6 +1569,7 @@ void LLViewerMediaImpl::unload()
 	mMediaURL.clear();
 	mMimeType.clear();
 	mCurrentMediaURL.clear();
+	mCurrentMimeType.clear();
 }
 
 //////////////////////////////////////////////////////////////////////////////////////////
@@ -2123,7 +2130,7 @@ void LLViewerMediaImpl::handleMediaEvent(LLPluginClassMedia* plugin, LLPluginCla
 			
 			// TODO: may want a different message for this case?
 			LLSD args;
-			args["PLUGIN"] = LLMIMETypes::implType(mMimeType);
+			args["PLUGIN"] = LLMIMETypes::implType(mCurrentMimeType);
 			LLNotificationsUtil::add("MediaPluginFailed", args);
 		}
 		break;
@@ -2137,7 +2144,7 @@ void LLViewerMediaImpl::handleMediaEvent(LLPluginClassMedia* plugin, LLPluginCla
 			resetPreviousMediaState();
 
 			LLSD args;
-			args["PLUGIN"] = LLMIMETypes::implType(mMimeType);
+			args["PLUGIN"] = LLMIMETypes::implType(mCurrentMimeType);
 			// SJB: This is getting called every frame if the plugin fails to load, continuously respawining the alert!
 			//LLNotificationsUtil::add("MediaPluginFailed", args);
 		}
@@ -2537,76 +2544,3 @@ void LLViewerMediaImpl::setTextureID(LLUUID id)
 	}
 }
 
-
-//////////////////////////////////////////////////////////////////////////////////////////
-//static
-void LLViewerMedia::toggleMusicPlay(void*)
-{
-// FIXME: This probably doesn't belong here
-#if 0
-	if (mMusicState != PLAYING)
-	{
-		mMusicState = PLAYING; // desired state
-		if (gAudiop)
-		{
-			LLParcel* parcel = LLViewerParcelMgr::getInstance()->getAgentParcel();
-			if ( parcel )
-			{
-				gAudiop->startInternetStream(parcel->getMusicURL());
-			}
-		}
-	}
-	else
-	{
-		mMusicState = STOPPED; // desired state
-		if (gAudiop)
-		{
-			gAudiop->stopInternetStream();
-		}
-	}
-#endif
-}
-
-//////////////////////////////////////////////////////////////////////////////////////////
-//static
-void LLViewerMedia::toggleMediaPlay(void*)
-{
-// FIXME: This probably doesn't belong here
-#if 0
-	if (LLViewerMedia::isMediaPaused())
-	{
-		LLViewerParcelMedia::start();
-	}
-	else if(LLViewerMedia::isMediaPlaying())
-	{
-		LLViewerParcelMedia::pause();
-	}
-	else
-	{
-		LLParcel* parcel = LLViewerParcelMgr::getInstance()->getAgentParcel();
-		if (parcel)
-		{
-			LLViewerParcelMedia::play(parcel);
-		}
-	}
-#endif
-}
-
-//////////////////////////////////////////////////////////////////////////////////////////
-//static
-void LLViewerMedia::mediaStop(void*)
-{
-// FIXME: This probably doesn't belong here
-#if 0
-	LLViewerParcelMedia::stop();
-#endif
-}
-
-//////////////////////////////////////////////////////////////////////////////////////////
-//static 
-bool LLViewerMedia::isMusicPlaying()
-{	
-// FIXME: This probably doesn't belong here
-// FIXME: make this work
-	return false;	
-}
diff --git a/indra/newview/llviewermedia.h b/indra/newview/llviewermedia.h
index 28fb379960cf09edc769a8f7164e27a41d0d10b2..5e4dd8ff304a317017cce2094e0dd7b4a4c3ebfc 100644
--- a/indra/newview/llviewermedia.h
+++ b/indra/newview/llviewermedia.h
@@ -99,14 +99,10 @@ class LLViewerMedia
 		static void setVolume(F32 volume);
 
 		static void updateMedia(void* dummy_arg = NULL);
-		static bool isMusicPlaying();
 
 		static void initClass();
 		static void cleanupClass();
 
-		static void toggleMusicPlay(void*);
-		static void toggleMediaPlay(void*);
-		static void mediaStop(void*);
 		static F32 getVolume();	
 		static void muteListChanged();
 		static void setInWorldMediaDisabled(bool disabled);
@@ -187,6 +183,7 @@ class LLViewerMediaImpl
 	std::string getMediaURL() const { return mMediaURL; }
 	std::string getCurrentMediaURL();
 	std::string getHomeURL() { return mHomeURL; }
+	std::string getMediaEntryURL() { return mMediaEntryURL; }
     void setHomeURL(const std::string& home_url) { mHomeURL = home_url; };
 	void clearCache();
 	std::string getMimeType() { return mMimeType; }
@@ -323,6 +320,7 @@ class LLViewerMediaImpl
 	std::string mHomeURL;
 	std::string mMimeType;
 	std::string mCurrentMediaURL;	// The most current media url from the plugin (via the "location changed" or "navigate complete" events).
+	std::string mCurrentMimeType;	// The MIME type that caused the currently loaded plugin to be loaded.
 	S32 mLastMouseX;	// save the last mouse coord we get, so when we lose capture we can simulate a mouseup at that point.
 	S32 mLastMouseY;
 	S32 mMediaWidth;
diff --git a/indra/newview/llviewermedia_streamingaudio.cpp b/indra/newview/llviewermedia_streamingaudio.cpp
index e9293ac5a476e052b96fcd992f84d0e2cd156d2c..67b051e536f43bc6e821c671aa6d575fffc9807c 100644
--- a/indra/newview/llviewermedia_streamingaudio.cpp
+++ b/indra/newview/llviewermedia_streamingaudio.cpp
@@ -62,7 +62,7 @@ void LLStreamingAudio_MediaPlugins::start(const std::string& url)
 	if (!mMediaPlugin) // lazy-init the underlying media plugin
 	{
 		mMediaPlugin = initializeMedia("audio/mpeg"); // assumes that whatever media implementation supports mp3 also supports vorbis.
-		llinfos << "steaming audio mMediaPlugin is now " << mMediaPlugin << llendl;
+		llinfos << "streaming audio mMediaPlugin is now " << mMediaPlugin << llendl;
 	}
 
 	if(!mMediaPlugin)
diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp
index 6fa9bfacfa3f2e9474b35a8b8831115753c4a98e..445c1060aaecc9ff9395682265063f7e1b924817 100644
--- a/indra/newview/llviewermenu.cpp
+++ b/indra/newview/llviewermenu.cpp
@@ -2466,7 +2466,7 @@ class LLViewJoystickFlycam : public view_listener_t
 class LLViewCheckJoystickFlycam : public view_listener_t
 {
 	bool handleEvent(const LLSD& userdata)
-		{
+	{
 		bool new_value = LLViewerJoystick::getInstance()->getOverrideCamera();
 		return new_value;
 	}
@@ -3704,6 +3704,7 @@ void reset_view_final( BOOL proceed )
 	}
 
 	gAgent.resetView(TRUE, TRUE);
+	gAgent.setLookAt(LOOKAT_TARGET_CLEAR);
 }
 
 class LLViewLookAtLastChatter : public view_listener_t
diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp
index 1fcf5e49939efeb2974409231d0bcb17f2538cc9..42c45589c084830374e105988735660dfba8e4e3 100644
--- a/indra/newview/llviewermessage.cpp
+++ b/indra/newview/llviewermessage.cpp
@@ -2644,9 +2644,6 @@ void process_chat_from_simulator(LLMessageSystem *msg, void **user_data)
 			LLNotificationsUI::LLNotificationManager::instance().onChat(
 					chat, LLNotificationsUI::NT_NEARBYCHAT);
 
-            // adding temporarily so that communications window chat bar 
-            // works until the new chat window is ready
-			chat.mText = from_name + ": " + chat.mText;
 			LLFloaterChat::addChat(chat, FALSE, FALSE);
 		}
 		else
diff --git a/indra/newview/llviewerparcelmedia.cpp b/indra/newview/llviewerparcelmedia.cpp
index 90a7ee98b924ec70b01428fb7648eda931b5bc0c..0f7903a7a536e2cb7bd6a9ff6842d386624387e6 100644
--- a/indra/newview/llviewerparcelmedia.cpp
+++ b/indra/newview/llviewerparcelmedia.cpp
@@ -34,6 +34,7 @@
 #include "llviewerparcelmedia.h"
 
 #include "llagent.h"
+#include "llaudioengine.h"
 #include "llviewercontrol.h"
 #include "llviewermedia.h"
 #include "llviewerregion.h"
@@ -109,7 +110,9 @@ void LLViewerParcelMedia::update(LLParcel* parcel)
 			std::string mediaCurrentUrl = std::string( parcel->getMediaCurrentURL());
 
 			// First use warning
-			if(	! mediaUrl.empty() && gWarningSettings.getBOOL("FirstStreamingVideo") )
+			if( (!mediaUrl.empty() ||
+			     !parcel->getMusicURL().empty())
+			    && gWarningSettings.getBOOL("FirstStreamingMedia") )
 			{
 				LLNotificationsUtil::add("ParcelCanPlayMedia", LLSD(), LLSD(),
 					boost::bind(callback_play_media, _1, _2, parcel));
@@ -182,7 +185,7 @@ void LLViewerParcelMedia::play(LLParcel* parcel)
 
 	if (!parcel) return;
 
-	if (!gSavedSettings.getBOOL("AudioSteamingMedia") || !gSavedSettings.getBOOL("AudioStreamingVideo"))
+	if (!gSavedSettings.getBOOL("AudioStreamingMedia") || !gSavedSettings.getBOOL("AudioStreamingVideo"))
 		return;
 
 	std::string media_url = parcel->getMediaURL();
@@ -593,16 +596,28 @@ bool callback_play_media(const LLSD& notification, const LLSD& response, LLParce
 	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
 	if (option == 0)
 	{
+		// user has elected to automatically play media.
+		gSavedSettings.setBOOL(LLViewerMedia::AUTO_PLAY_MEDIA_SETTING, TRUE);
 		gSavedSettings.setBOOL("AudioStreamingVideo", TRUE);
-		if(!gSavedSettings.getBOOL("AudioSteamingMedia")) 
-			gSavedSettings.setBOOL("AudioSteamingMedia", TRUE);
+		gSavedSettings.setBOOL("AudioStreamingMusic", TRUE);
+		if(!gSavedSettings.getBOOL("AudioStreamingMedia")) 
+			gSavedSettings.setBOOL("AudioStreamingMedia", TRUE);
+		// play media right now, if available
 		LLViewerParcelMedia::play(parcel);
+		// play music right now, if available
+		if (parcel)
+		{
+			std::string music_url = parcel->getMusicURL();
+			if (gAudiop && !music_url.empty())
+				gAudiop->startInternetStream(music_url);
+		}
 	}
 	else
 	{
 		gSavedSettings.setBOOL("AudioStreamingVideo", FALSE);
+		gSavedSettings.setBOOL("AudioStreamingMusic", FALSE);
 	}
-	gWarningSettings.setBOOL("FirstStreamingVideo", FALSE);
+	gWarningSettings.setBOOL("FirstStreamingMedia", FALSE);
 	return false;
 }
 
diff --git a/indra/newview/llviewerparcelmgr.cpp b/indra/newview/llviewerparcelmgr.cpp
index be68a2ef42e7674c74b9fb196ae8d609c0aef0e3..5a5c4e748063b3334d47f9b41e76a32e022ca535 100644
--- a/indra/newview/llviewerparcelmgr.cpp
+++ b/indra/newview/llviewerparcelmgr.cpp
@@ -44,6 +44,7 @@
 #include "llparcel.h"
 #include "llsecondlifeurls.h"
 #include "message.h"
+#include "llfloaterreg.h"
 
 // Viewer includes
 #include "llagent.h"
@@ -52,6 +53,7 @@
 #include "llfirstuse.h"
 #include "llfloaterbuyland.h"
 #include "llfloatergroups.h"
+#include "llfloaternearbymedia.h"
 #include "llfloatersellland.h"
 #include "llfloatertools.h"
 #include "llparcelselection.h"
@@ -1735,7 +1737,7 @@ void LLViewerParcelMgr::processParcelProperties(LLMessageSystem *msg, void **use
 					}
 					else if (!gAudiop->getInternetStreamURL().empty())
 					{
-						llinfos << "Stopping parcel music" << llendl;
+						llinfos << "Stopping parcel music (parcel stream URL is empty)" << llendl;
 						gAudiop->startInternetStream(LLStringUtil::null);
 					}
 				}
@@ -1754,15 +1756,19 @@ void LLViewerParcelMgr::processParcelProperties(LLMessageSystem *msg, void **use
 
 void optionally_start_music(const std::string& music_url)
 {
-	if (gSavedSettings.getBOOL("AudioStreamingMusic") && gSavedSettings.getBOOL("AudioSteamingMedia"))
-	{
-		// Make the user click the start button on the overlay bar. JC
-		//		llinfos << "Starting parcel music " << music_url << llendl;
-
-		// now only play music when you enter a new parcel if the control is in PLAY state
-		// changed as part of SL-4878
-		if ( gOverlayBar && gOverlayBar->musicPlaying())
+	if (gSavedSettings.getBOOL("AudioStreamingMusic") &&
+	    gSavedSettings.getBOOL("AudioStreamingMedia"))
+	{
+		// only play music when you enter a new parcel if the UI control for this
+		// was not *explicitly* stopped by the user. (part of SL-4878)
+		LLFloaterNearbyMedia *nearby_media_floater = LLFloaterReg::findTypedInstance<LLFloaterNearbyMedia>("nearby_media");
+		if ((nearby_media_floater &&
+		     nearby_media_floater->getParcelAudioAutoStart()) ||
+		    // or they have expressed no opinion in the UI, but have autoplay on...
+		    (!nearby_media_floater &&
+		     gSavedSettings.getBOOL(LLViewerMedia::AUTO_PLAY_MEDIA_SETTING)))
 		{
+			llinfos << "Starting parcel music " << music_url << llendl;
 			gAudiop->startInternetStream(music_url);
 		}
 	}
diff --git a/indra/newview/llviewertexture.cpp b/indra/newview/llviewertexture.cpp
index a8a51317006b687d927af90ddf81d2544c7c368f..79fffc05e7612e1346757e636710feeb93652992 100644
--- a/indra/newview/llviewertexture.cpp
+++ b/indra/newview/llviewertexture.cpp
@@ -2767,7 +2767,7 @@ void LLViewerMediaTexture::updateClass()
 
 #if 0
 	//force to play media.
-	gSavedSettings.setBOOL("AudioSteamingMedia", true) ;
+	gSavedSettings.setBOOL("AudioStreamingMedia", true) ;
 	gSavedSettings.setBOOL("AudioStreamingVideo", true) ;
 #endif
 
diff --git a/indra/newview/llvoicechannel.cpp b/indra/newview/llvoicechannel.cpp
index 18cdd23ed9f50b1e2de7c68c0570fb37d6814fa9..917d69fe16d7dd828ea38c3a073a926cb2e1c580 100644
--- a/indra/newview/llvoicechannel.cpp
+++ b/indra/newview/llvoicechannel.cpp
@@ -278,10 +278,14 @@ void LLVoiceChannel::deactivate()
 	if (callStarted())
 	{
 		setState(STATE_HUNG_UP);
-		// mute the microphone if required when returning to the proximal channel
-		if (gSavedSettings.getBOOL("AutoDisengageMic") && sCurrentVoiceChannel == this)
+		
+		//Default mic is OFF when leaving voice calls
+		if (gSavedSettings.getBOOL("AutoDisengageMic") && 
+			sCurrentVoiceChannel == this &&
+			gVoiceClient->getUserPTTState())
 		{
 			gSavedSettings.setBOOL("PTTCurrentlyEnabled", true);
+			gVoiceClient->inputUserControlState(true);
 		}
 	}
 
@@ -498,6 +502,13 @@ void LLVoiceChannelGroup::activate()
 				LLRecentPeople::instance().add(buddy_id);
 		}
 #endif
+
+		//Mic default state is OFF on initiating/joining Ad-Hoc/Group calls
+		if (gVoiceClient->getUserPTTState() && gVoiceClient->getPTTIsToggle())
+		{
+			gVoiceClient->inputUserControlState(true);
+		}
+		
 	}
 }
 
@@ -811,6 +822,12 @@ void LLVoiceChannelP2P::activate()
 
 		// Add the party to the list of people with which we've recently interacted.
 		LLRecentPeople::instance().add(mOtherUserID);
+
+		//Default mic is ON on initiating/joining P2P calls
+		if (!gVoiceClient->getUserPTTState() && gVoiceClient->getPTTIsToggle())
+		{
+			gVoiceClient->inputUserControlState(true);
+		}
 	}
 }
 
diff --git a/indra/newview/llvoiceclient.cpp b/indra/newview/llvoiceclient.cpp
index c2d26a19714f087df0d5820344f5260fd00081f0..423c46e14c75ce3204840189e240a8ec078cd3de 100644
--- a/indra/newview/llvoiceclient.cpp
+++ b/indra/newview/llvoiceclient.cpp
@@ -4445,7 +4445,7 @@ void LLVoiceClient::participantUpdatedEvent(
 			participant->mVolume = volume;
 
 			
-			// *HACH: mantipov: added while working on EXT-3544
+			// *HACK: mantipov: added while working on EXT-3544
 			/*
 			Sometimes LLVoiceClient::participantUpdatedEvent callback is called BEFORE 
 			LLViewerChatterBoxSessionAgentListUpdates::post() sometimes AFTER.
@@ -4462,7 +4462,9 @@ void LLVoiceClient::participantUpdatedEvent(
 			in LLCallFloater::draw()
 			*/
 			LLVoiceChannel* voice_cnl = LLVoiceChannel::getCurrentVoiceChannel();
-			if (voice_cnl)
+
+			// ignore session ID of local chat
+			if (voice_cnl && voice_cnl->getSessionID().notNull())
 			{
 				LLSpeakerMgr* speaker_manager = LLIMModel::getInstance()->getSpeakerManager(voice_cnl->getSessionID());
 				if (speaker_manager)
@@ -5883,6 +5885,10 @@ void LLVoiceClient::setPTTIsToggle(bool PTTIsToggle)
 	mPTTIsToggle = PTTIsToggle;
 }
 
+bool LLVoiceClient::getPTTIsToggle()
+{
+	return mPTTIsToggle;
+}
 
 void LLVoiceClient::setPTTKey(std::string &key)
 {
diff --git a/indra/newview/llvoiceclient.h b/indra/newview/llvoiceclient.h
index 347fae6156b9d45e571d0e49c8757c15d2b1d4ad..724179847dc2dcb97271e0e5ccbe3d660660a0e5 100644
--- a/indra/newview/llvoiceclient.h
+++ b/indra/newview/llvoiceclient.h
@@ -193,6 +193,7 @@ static	void updatePosition(void);
 		static bool voiceEnabled();
 		void setUsePTT(bool usePTT);
 		void setPTTIsToggle(bool PTTIsToggle);
+		bool getPTTIsToggle();
 		void setPTTKey(std::string &key);
 		void setEarLocation(S32 loc);
 		void setVoiceVolume(F32 volume);
diff --git a/indra/newview/skins/default/xui/en/favorites_bar_button.xml b/indra/newview/skins/default/xui/en/favorites_bar_button.xml
index 90105f92fd8410389fba0822aad55ff5e2a23d88..dcf9847adbab87184f1de27a7e50ed031feb9ded 100644
--- a/indra/newview/skins/default/xui/en/favorites_bar_button.xml
+++ b/indra/newview/skins/default/xui/en/favorites_bar_button.xml
@@ -23,8 +23,6 @@
  pad_left="11"
  pad_right="7"
  tab_stop="false"
- pad_right="10"
- pad_left="10" 
  top="0"
  use_ellipses="true"
  width="140" />
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 57e92cdeecd3b1f0175f72b6fbcc3ea8cddb3de0..243b63db0085bc596107a5f27fae2cec712117db 100644
--- a/indra/newview/skins/default/xui/en/floater_im_session.xml
+++ b/indra/newview/skins/default/xui/en/floater_im_session.xml
@@ -14,8 +14,8 @@
  visible="true"
  width="360"
  can_resize="true"
- min_width="360"
- min_height="350">
+ min_width="250"
+ min_height="190">
   <layout_stack
   follows="all"
   height="320"
diff --git a/indra/newview/skins/default/xui/en/floater_voice_controls.xml b/indra/newview/skins/default/xui/en/floater_voice_controls.xml
index 1fa613468f66050d1d3a9460bd92cf8f9899c74f..a4ef807f069117e696f81d666fcbeb8883a939b2 100644
--- a/indra/newview/skins/default/xui/en/floater_voice_controls.xml
+++ b/indra/newview/skins/default/xui/en/floater_voice_controls.xml
@@ -30,7 +30,7 @@
     </string>
     <string
      name="no_one_near">
-        No one near
+        No one near has voice enabled
     </string>
     <string
      name="max_visible_items">
diff --git a/indra/newview/skins/default/xui/en/inspect_avatar.xml b/indra/newview/skins/default/xui/en/inspect_avatar.xml
index 2f2964c42b13a2b8f7e08d34375ddfa6a4f738f4..a666b8a4273bc3ccc5198d7e1a81f9c983e7f0ee 100644
--- a/indra/newview/skins/default/xui/en/inspect_avatar.xml
+++ b/indra/newview/skins/default/xui/en/inspect_avatar.xml
@@ -65,7 +65,7 @@
     <slider
      follows="top|left"
      height="23"
-     increment="0.05"
+     increment="0.01"
      left="1"
      max_val="0.95"
      min_val="0.05"
diff --git a/indra/newview/skins/default/xui/en/menu_inspect_avatar_gear.xml b/indra/newview/skins/default/xui/en/menu_inspect_avatar_gear.xml
index 01df208850464c540cc2b93dfb87a4b7d5217ea9..dde92f23b6b5d94b89c9ae0ce3b88c0174e771c7 100644
--- a/indra/newview/skins/default/xui/en/menu_inspect_avatar_gear.xml
+++ b/indra/newview/skins/default/xui/en/menu_inspect_avatar_gear.xml
@@ -30,6 +30,8 @@
    label="Call"
    enabled="true"
    name="call">
+    <menu_item_call.on_click
+     function="InspectAvatar.Call"/>
   </menu_item_call>
   <menu_item_call
    label="Teleport"
diff --git a/indra/newview/skins/default/xui/en/menu_picks_plus.xml b/indra/newview/skins/default/xui/en/menu_picks_plus.xml
index 3065239615c595bcfb605d4011d26391c85c57a4..f3b207e36c750c7fa41a635a40c2e08330e26043 100644
--- a/indra/newview/skins/default/xui/en/menu_picks_plus.xml
+++ b/indra/newview/skins/default/xui/en/menu_picks_plus.xml
@@ -11,6 +11,9 @@
         <menu_item_call.on_click 
          function="Picks.Plus.Action" 
          userdata="new_pick" />
+        <menu_item_call.on_enable
+         function="Picks.Plus.Enable"
+         userdata="new_pick" />
         </menu_item_call>
     <menu_item_call 
      name="create_classified" 
diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml
index 59a55d3da2c9b31134b4ab514c5fbb5910b799bb..5e0ea8d650c9afd73f16210da189db7509feba31 100644
--- a/indra/newview/skins/default/xui/en/notifications.xml
+++ b/indra/newview/skins/default/xui/en/notifications.xml
@@ -5085,6 +5085,14 @@ An object named [OBJECTFROMNAME] owned by (an unknown Resident) has given you [O
     </form>
   </notification>
 
+  <notification
+   icon="notify.tga"
+   name="TeleportOfferSent"
+   type="offer">
+	Teleport offer sent to [TO_NAME]
+  </notification>
+
+
   <notification
    icon="notify.tga"
    name="GotoURL"
diff --git a/indra/newview/skins/default/xui/en/panel_adhoc_control_panel.xml b/indra/newview/skins/default/xui/en/panel_adhoc_control_panel.xml
index f3a2297151466f4e8c9c15c00a5264236322c831..6c54532a3a8d201191021265d589afe316cf668c 100644
--- a/indra/newview/skins/default/xui/en/panel_adhoc_control_panel.xml
+++ b/indra/newview/skins/default/xui/en/panel_adhoc_control_panel.xml
@@ -5,56 +5,94 @@
  height="215"
  name="panel_im_control_panel"
  width="180">
-    <avatar_list
-     color="DkGray2"
+    <layout_stack
+     mouse_opaque="false"
+     border_size="0"
+     clip="false"
      follows="all"
-     height="130"
-     ignore_online_status="true"
+     height="215"
      layout="topleft"
      left="3"
-     name="speakers_list"
-     opaque="false"
-     show_info_btn="false"
-     show_profile_btn="false"
-     show_speaking_indicator="false"
-     top="10"
-     width="180" />
-    <panel
-     background_visible="true"
-     bg_alpha_color="DkGray2"
-     border="false"
-     bottom="1"
-     follows="left|right|bottom"
-     height="70"
-     left="0"
-     left_pad="0"
-     name="panel_call_buttons"
-     top_pad="0"
-     width="180">
-        <button
-         bottom="10"
-         follows="all"
-         height="20"
-         label="Call"
-         left_delta="10"
-         name="call_btn"
-         width="160" />
-        <button
-         bottom="40"
-         follows="all"
-         height="20"
-         label="Leave Call"
-         name="end_call_btn"
-         visible="false"
-          />
-        <button
-         follows="all"
-         bottom="10"
-         height="20"
-         label="Voice Controls"
-         name="voice_ctrls_btn"
-         use_ellipses="true" 
-         visible="false"
-          />
-    </panel>
+     name="vertical_stack"
+     orientation="vertical"
+     top="0"
+     width="177">
+        <layout_panel
+         auto_resize="true"
+         follows="top|left"
+         height="130"
+         layout="topleft"
+         min_height="0"
+         mouse_opaque="false"
+         width="180"
+         top="0"
+         name="speakers_list_panel"
+         user_resize="false">
+            <avatar_list
+             color="DkGray2"
+             follows="all"
+             height="130"
+             ignore_online_status="true"
+             layout="topleft"
+             name="speakers_list"
+             opaque="false"
+             show_info_btn="false"
+             show_profile_btn="false"
+             show_speaking_indicator="false"
+             width="180" />
+        </layout_panel>
+        <layout_panel
+         auto_resize="false"
+         follows="top|left|right"
+         height="25"
+         layout="topleft"
+         min_height="25"
+         width="160"
+         name="call_btn_panel"
+         user_resize="false"
+         visible="false">
+            <button
+             follows="all"
+             height="20"
+             label="Call"
+             name="call_btn"
+             width="160"
+             top="5" />
+        </layout_panel>
+        <layout_panel
+         auto_resize="false"
+         follows="top|left|right"
+         height="25"
+         layout="topleft"
+         min_height="25"
+         width="160"
+         name="end_call_btn_panel"
+         user_resize="false"
+         visible="false">
+            <button
+             follows="all"
+             height="20"
+             label="Leave Call"
+             name="end_call_btn"
+             top="5"/>
+        </layout_panel>
+        <layout_panel
+         auto_resize="false"
+         follows="top|left|right"
+         height="25"
+         layout="topleft"
+         min_height="25"
+         width="160"
+         name="voice_ctrls_btn_panel"
+         user_resize="false"
+         visible="false">
+            <button
+             follows="all"
+             height="20"
+             label="Voice Controls"
+             name="voice_ctrls_btn"
+             top="5"
+             use_ellipses="true" />
+        </layout_panel>
+    </layout_stack>
 </panel>
diff --git a/indra/newview/skins/default/xui/en/panel_group_control_panel.xml b/indra/newview/skins/default/xui/en/panel_group_control_panel.xml
index 86b30ebfcee32b2a40e13d0c776e13d15dff967c..4073ef158bbc054363e793381d13c8769748ecb1 100644
--- a/indra/newview/skins/default/xui/en/panel_group_control_panel.xml
+++ b/indra/newview/skins/default/xui/en/panel_group_control_panel.xml
@@ -5,66 +5,110 @@
  height="238"
  name="panel_im_control_panel"
  width="180">
-    <avatar_list
-     color="DkGray2"
+    <layout_stack
+     mouse_opaque="false"
+     border_size="0"
+     clip="false"
      follows="all"
-     height="100"
-     ignore_online_status="true"
+     height="238"
      layout="topleft"
-     left="3"
-     name="speakers_list"
-     opaque="false"
-     show_info_btn="false"
-     show_profile_btn="false"
-     show_speaking_indicator="false"
-     top="10"
-     width="180" />
-    <button
-     bottom_pad="0"
-     follows="left|right|bottom"
-     height="23"
-     label="Group Profile"
-     left_delta="10"
-     name="group_info_btn"
-     use_ellipses="true" 
-     width="160" />
-    <panel
-     background_visible="true"
-     bg_alpha_color="DkGray2"
-     border="false"
-     follows="left|right|bottom"
-     height="70"
-     left="0"
-     left_pad="0"
-     name="panel_call_buttons"
-     top_pad="0"
-     width="180">
-        <button
-         bottom="10"
-         follows="all"
-         height="23"
-         label="Call Group"
-         left_delta="10"
-         name="call_btn"
-         use_ellipses="true" 
-         width="160" />
-        <button
-         bottom="40"
-         follows="all"
-         height="23"
-         label="Leave Call"
-         name="end_call_btn"
-         use_ellipses="true" 
-         visible="false"
-          />
-        <button
-         bottom="10"
-         follows="all"
-         height="23"
-         label="Open Voice Controls"
-         name="voice_ctrls_btn"
-         use_ellipses="true" 
-         visible="false"
-          />
-    </panel>
+     left="5"
+     name="vertical_stack"
+     orientation="vertical"
+     top="0"
+     width="175">
+        <layout_panel
+         auto_resize="true"
+         follows="top|left"
+         height="100"
+         layout="topleft"
+         min_height="0"
+         mouse_opaque="false"
+         width="180"
+         top="0"
+         name="speakers_list_panel"
+         user_resize="false">
+            <avatar_list
+             color="DkGray2"
+             follows="all"
+             height="100"
+             ignore_online_status="true"
+             layout="topleft"
+             name="speakers_list"
+             opaque="false"
+             show_info_btn="false"
+             show_profile_btn="false"
+             show_speaking_indicator="false"
+             width="180" />
+        </layout_panel>
+        <layout_panel
+         auto_resize="false"
+         follows="top|left|right"
+         height="28"
+         layout="topleft"
+         min_height="28"
+         width="160"
+         name="group_info_btn_panel"
+         user_resize="false">
+            <button
+             follows="left|right|bottom"
+             height="23"
+             label="Group Profile"
+             name="group_info_btn"
+             use_ellipses="true"
+             top="5"
+             width="160" />
+        </layout_panel>
+        <layout_panel
+         auto_resize="false"
+         follows="top|left|right"
+         height="28"
+         layout="topleft"
+         min_height="28"
+         width="160"
+         name="call_btn_panel"
+         user_resize="false">
+            <button
+             follows="all"
+             height="23"
+             label="Call Group"
+             name="call_btn"
+             use_ellipses="true" 
+             width="160" />
+        </layout_panel>
+        <layout_panel
+         auto_resize="false"
+         follows="top|left|right"
+         height="28"
+         layout="topleft"
+         min_height="28"
+         width="160"
+         name="end_call_btn_panel"
+         user_resize="false"
+         visible="false">
+            <button
+             follows="all"
+             height="23"
+             label="Leave Call"
+             name="end_call_btn"
+             use_ellipses="true" />
+        </layout_panel>
+        <layout_panel
+         auto_resize="false"
+         follows="top|left|right"
+         height="28"
+         layout="topleft"
+         min_height="28"
+         width="160"
+         name="voice_ctrls_btn_panel"
+         user_resize="false"
+         visible="false">
+            <button
+             follows="all"
+             height="23"
+             label="Open Voice Controls"
+             name="voice_ctrls_btn"
+             use_ellipses="true" />
+        </layout_panel>
+    </layout_stack>
 </panel>
diff --git a/indra/newview/skins/default/xui/en/panel_im_control_panel.xml b/indra/newview/skins/default/xui/en/panel_im_control_panel.xml
index 30e652befdb75b3be42e418da19682a1ab57fdb9..2e3d5a7320285a76b37572d66c3ced4907f770b0 100644
--- a/indra/newview/skins/default/xui/en/panel_im_control_panel.xml
+++ b/indra/newview/skins/default/xui/en/panel_im_control_panel.xml
@@ -6,84 +6,161 @@
  width="110">
     <avatar_icon
      follows="left|top"
-     height="100"
+     height="105"
      left_delta="5"
      name="avatar_icon"
      top="-5"
-     width="100"/>
+     width="105"/>
     <text
      follows="top|left|right"
      font="SansSerifLarge"
-     height="22"
+     height="19"
      layout="topleft"
      name="avatar_name"
      use_ellipses="true"
      value="Unknown"
-     width="100" />
-    <button
-     follows="left|top|right"
-     height="20"
-     label="Profile"
-     name="view_profile_btn"
-     width="100" />
-    <button
-     follows="left|top|right"
-     height="20"
-     label="Add Friend"
-     name="add_friend_btn"
-     width="100" />
-    <button
-     follows="left|top|right"
-     height="20"
-     label="Teleport"
-     name="teleport_btn"
-     width="100" />
-   <button
-     follows="left|top|right"
-     height="20"
-     label="Share"
-     name="share_btn"
-     width="100" />
-     <!--Removing pay button to save space - will update spec - verified by Erica/Steve -->
- <!--   <button
-     follows="left|top|right"
-     height="20"
-     label="Pay"
-     name="pay_btn"
-     width="100" />-->
-    <panel
-     background_visible="true"
-     bg_alpha_color="DkGray2"
-     border="false"
-     top_pad="10"
-     follows="left|bottom|right"
-     height="70"
-     left="1"
-     name="panel_call_buttons"
-     width="109">
-        <button
-         bottom="10"
-         follows="left|top|right"
-         height="20"
-         label="Call"
-         left_delta="5"
-         name="call_btn"
-         width="100" />
-        <button
-         bottom="35"
-         follows="left|top|right"
+     width="110" />
+    <layout_stack
+     mouse_opaque="false"
+     border_size="0"
+     clip="false"
+     follows="all"
+     height="168"
+     layout="topleft"
+     left="5"
+     name="button_stack"
+     orientation="vertical"
+     top_pad="0"
+     width="105">
+        <layout_panel
+         mouse_opaque="false"
+         auto_resize="true"
+         follows="top|left"
+         height="0"
+         layout="topleft"
+         left="2"
+         min_height="0"
+         width="100"
+         top="0"
+         name="spacer"
+         user_resize="false" />
+        <layout_panel
+         auto_resize="false"
+         follows="top|left|right"
          height="20"
-         label="Leave Call"
-         name="end_call_btn"
-         visible="false"
-         width="100" />
+         layout="topleft"
+         min_height="20"
+         width="100"
+         name="view_profile_btn_panel"
+         user_resize="false">
+            <button
+             follows="left|top|right"
+             height="20"
+             label="Profile"
+             name="view_profile_btn"
+             top="0"
+             width="100" />
+        </layout_panel>
+        <layout_panel
+         auto_resize="false"
+         follows="top|left|right"
+         height="25"
+         layout="topleft"
+         min_height="25"
+         width="100"
+         name="add_friend_btn_panel"
+         user_resize="false">
+            <button
+             follows="left|top|right"
+             height="20"
+             label="Add Friend"
+             name="add_friend_btn"
+             top="5"
+             width="100" />
+        </layout_panel>
+        <layout_panel
+         auto_resize="false"
+         follows="top|left|right"
+         height="25"
+         layout="topleft"
+         min_height="25"
+         width="100"
+         name="teleport_btn_panel"
+         user_resize="false">
         <button
-         bottom="10"
-         follows="left|top|right"
-         height="20"
-         label="Voice Controls"
-         name="voice_ctrls_btn"
-         visible="false"
-         width="100" />
-    </panel>
+             auto_resize="false"
+             follows="left|top|right"
+             height="20"
+             label="Teleport"
+             name="teleport_btn"
+             width="100" />
+        </layout_panel>
+        <layout_panel
+         auto_resize="false"
+         follows="top|left|right"
+         height="25"
+         layout="topleft"
+         min_height="25"
+         width="100"
+         name="share_btn_panel"
+         user_resize="false">
+           <button
+             auto_resize="true"
+             follows="left|top|right"
+             height="20"
+             label="Share"
+             name="share_btn"
+             width="100" />
+        </layout_panel>
+        <layout_panel
+         auto_resize="false"
+         follows="top|left|right"
+         height="25"
+         layout="topleft"
+         min_height="25"
+         width="100"
+         name="call_btn_panel"
+         user_resize="false">
+            <button
+             follows="left|top|right"
+             height="20"
+             label="Call"
+             name="call_btn"
+             width="100" />
+        </layout_panel>
+        <layout_panel
+         auto_resize="false"
+         follows="top|left|right"
+         height="25"
+         layout="topleft"
+         min_height="25"
+         width="100"
+         name="end_call_btn_panel"
+         user_resize="false"
+         visible="false">
+            <button
+             follows="left|top|right"
+             height="20"
+             label="Leave Call"
+             name="end_call_btn"
+             width="100" />
+        </layout_panel>
+        <layout_panel
+         auto_resize="false"
+         follows="top|left|right"
+         height="25"
+         layout="topleft"
+         min_height="25"
+         width="100"
+         name="voice_ctrls_btn_panel"
+         user_resize="false"
+         visible="false">
+            <button
+             follows="left|top|right"
+             height="20"
+             label="Voice Controls"
+             name="voice_ctrls_btn"
+             width="100" />
+        </layout_panel>
+    </layout_stack>
 </panel>
diff --git a/indra/newview/skins/default/xui/en/panel_instant_message.xml b/indra/newview/skins/default/xui/en/panel_instant_message.xml
index ccd754ac5e80a7a13841e444e9933c708c094fc3..7204e5747928c1232d87ccd4dd066a19185a26e5 100644
--- a/indra/newview/skins/default/xui/en/panel_instant_message.xml
+++ b/indra/newview/skins/default/xui/en/panel_instant_message.xml
@@ -21,6 +21,7 @@
      label="im_header"
      layout="topleft"
      left="5"
+     mouse_opaque="false"
      name="im_header"
      top="5"
      width="295">
@@ -30,7 +31,7 @@
          image_name="Generic_Person"
          layout="topleft"
          left="3"
-         mouse_opaque="true"
+         mouse_opaque="false"
          name="avatar_icon"
          top="3"
          width="18" />
diff --git a/indra/newview/skins/default/xui/en/panel_outfits_inventory.xml b/indra/newview/skins/default/xui/en/panel_outfits_inventory.xml
index d6d8e9562b0a1a31e67a8ec7d59a55d9da2c7b02..7e512f95947300b1f3a8d1c0e47002c742869d99 100644
--- a/indra/newview/skins/default/xui/en/panel_outfits_inventory.xml
+++ b/indra/newview/skins/default/xui/en/panel_outfits_inventory.xml
@@ -21,19 +21,6 @@
      tab_position="top"
      halign="center"
      width="313">
-      <inventory_panel
-        label="MY OUTFITS"
-        help_topic="my_outfits_tab"
-	    allow_multi_select="true"
-	    follows="all"
-	    border="false"
-	    left="0"
-        top="0"
-        height="500"
-        width="290"
- 		mouse_opaque="true"
- 	    name="outfitslist_accordionpanel"
- 		start_folder="My Outfits" /> 
          <inventory_panel
         label="WEARING"
         help_topic="now_wearing_tab"
@@ -46,6 +33,19 @@
         mouse_opaque="true"
         name="cof_accordionpanel"
         start_folder="Current Outfit" />
+         <inventory_panel
+           label="MY OUTFITS"
+           help_topic="my_outfits_tab"
+           allow_multi_select="true"
+           follows="all"
+           border="false"
+           left="0"
+           top="0"
+           height="500"
+           width="290"
+           mouse_opaque="true"
+           name="outfitslist_accordionpanel"
+           start_folder="My Outfits" /> 
    </tab_container>
 	<panel
 	  background_visible="true"
diff --git a/indra/newview/skins/default/xui/en/panel_outfits_inventory_gear_default.xml b/indra/newview/skins/default/xui/en/panel_outfits_inventory_gear_default.xml
index 7b88fca7c367135b07bce5db424ad8f3bb71d0a8..2c7a51f0e78f6921e56462d6f0558a1e0e9df614 100644
--- a/indra/newview/skins/default/xui/en/panel_outfits_inventory_gear_default.xml
+++ b/indra/newview/skins/default/xui/en/panel_outfits_inventory_gear_default.xml
@@ -17,17 +17,6 @@
 		 function="panel_outfits_inventory_gear_default.Enable"
 		 parameter="wear" />
     </menu_item_call>
-    <menu_item_call
-     label="Add To Current Outfit"
-     layout="topleft"
-     name="add">
-        <on_click
-         function="panel_outfits_inventory_gear_default.Custom.Action"
-         parameter="add" />
-        <on_enable
-		 function="panel_outfits_inventory_gear_default.Enable"
-		 parameter="add" />
-    </menu_item_call>
     <menu_item_call
      label="Remove From Current Outfit"
      layout="topleft"
@@ -54,7 +43,7 @@
 		 parameter="rename" />
     </menu_item_call>
     <menu_item_call
-     label="Remove"
+     label="Remove Link"
      layout="topleft"
      name="remove_link">
         <on_click
@@ -65,7 +54,7 @@
 		 parameter="remove_link" />
     </menu_item_call>
     <menu_item_call
-     label="Delete"
+     label="Delete Outfit"
      layout="topleft"
      name="delete">
         <on_click
@@ -73,6 +62,6 @@
          parameter="delete" />
         <on_enable
 		 function="panel_outfits_inventory_gear_default.Enable"
-		 parameter="delete" />
+		 parameter="delete_outfit" />
     </menu_item_call>
 </menu>
diff --git a/indra/newview/skins/default/xui/en/panel_prim_media_controls.xml b/indra/newview/skins/default/xui/en/panel_prim_media_controls.xml
index 677d0de2438e1c0b7d7f1581226c64cb4951ff4c..4cef1f9c608139e00b53b52120d7d2938e21a8c0 100644
--- a/indra/newview/skins/default/xui/en/panel_prim_media_controls.xml
+++ b/indra/newview/skins/default/xui/en/panel_prim_media_controls.xml
@@ -1,54 +1,99 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes" ?>
 <panel
 	follows="left|right|top|bottom"
-	name="MediaControls"
+	name="MediaControlsPanel"
 	background_visible="false"
 	height="200"
 	layout="topleft"
 	help_topic="prim_media_controls"
 	mouse_opaque="false"
+	min_width="300"
 	width="800">
   <string name="control_background_image_name">Inspector_Background</string>
   <string name="skip_step">0.2</string>
-  <string name="min_width">400</string>
-  <string name="min_height">120</string>
+  <string name="min_width">300</string>
+  <string name="min_height">75</string>
   <string name="zoom_near_padding">1.0</string>
   <string name="zoom_medium_padding">1.25</string>
   <string name="zoom_far_padding">1.5</string>
-  <panel
-	  name="media_region"
-	  height="100"
-	  follows="left|right|top|bottom"
+  <string name="top_world_view_avoid_zone">50</string>
+  <layout_stack
+	  name="progress_indicator_area"
+	  follows="left|right|top"
+	  height="8"
 	  layout="topleft"
-	  mouse_opaque="false"
-	  top="0" />
+	  animate="false"
+	  left="0"
+	  orientation="horizontal"
+	  top="22">
+	<!-- outer layout_panels center the inner one -->
+	<layout_panel
+		width="0"
+		name="left_bookend_bottom"
+		mouse_opaque="false"
+		layout="topleft"
+		user_resize="false" />
+	<panel
+		name="media_progress_indicator"
+		mouse_opaque="false"
+		follows="left|right|top"
+		height="8"
+		layout="topleft"
+		left="0"
+		top="0"
+		auto_resize="false"
+		user_resize="false"
+		min_width="100"
+		width="200">
+	  <progress_bar
+		  name="media_progress_bar"
+		  color_bg="1 1 1 1"
+		  color_bar="1 1 1 0.96"
+		  follows="left|right|top"
+		  height="8"
+		  layout="topleft"
+		  top="0"
+		  left="0"
+		  tool_tip="Media is Loading"/>
+	</panel>
+	<layout_panel
+		name="right_bookend_bottom"
+		width="0"
+		mouse_opaque="false"
+		layout="topleft"
+		user_resize="false" />
+  </layout_stack>
   <layout_stack
 	  name="media_controls"
-	  follows="left|right"
+	  follows="left|right|top"
 	  animate="false"
 	  height="75"
 	  layout="topleft"
+	  top="0"
 	  left="0"
+	  border_size="1"
 	  mouse_opaque="false"
-	  orientation="horizontal"
-	  top="100">
+	  orientation="horizontal">
 	<!-- outer layout_panels center the inner one -->
 	<layout_panel
 		name="left_bookend"
+		top="0"
 		width="0"
-	  mouse_opaque="false"
+		mouse_opaque="false"
 		layout="topleft"
 		user_resize="false" />
 	<layout_panel
 		name="back"
+		top="0"
 		auto_resize="false"
 		user_resize="false"
 		layout="topleft"
-	  mouse_opaque="false"
+		mouse_opaque="false"
 		min_width="22"
-		width="22"
-		top="4">
+		width="22">
 	  <button
+		  name="back_btn"
+		  follows="top"
 		  image_overlay="Arrow_Left_Off"
 		  image_disabled="PushButton_Disabled"
 		  image_disabled_selected="PushButton_Disabled"
@@ -56,12 +101,12 @@
 		  image_unselected="PushButton_Off"
 		  hover_glow_amount="0.15"
 		  auto_resize="false"
-		  height="22"
 		  layout="topleft"
 		  tool_tip="Navigate back"
-		  width="22"
+		  top="0"
 		  left="0"
-		  top_delta="4">
+		  width="22"
+		  height="22">
 		<button.commit_callback
 			function="MediaCtrl.Back" />
 	  </button>
@@ -71,22 +116,24 @@
 		auto_resize="false"
 		user_resize="false"
 		layout="topleft"
-		top="10"
 		min_width="22"
+		top="0"
+		height="22"
 		width="22">
 	  <button
+		  follows="top"
 		  image_overlay="Arrow_Right_Off"
 		  image_disabled="PushButton_Disabled"
 		  image_disabled_selected="PushButton_Disabled"
 		  image_selected="PushButton_Selected"
 		  image_unselected="PushButton_Off"
 		  hover_glow_amount="0.15"
+		  top="0"
 		  height="22"
-		  layout="topleft"
-		  tool_tip="Navigate forward"
-		  top_delta="0"
 		  min_width="22"
-		  width="22">
+		  width="22"
+		  layout="topleft"
+		  tool_tip="Navigate forward">
 		<button.commit_callback
 			function="MediaCtrl.Forward" />
 	  </button>
@@ -96,10 +143,12 @@
 		auto_resize="false"
 		user_resize="false"
 		layout="topleft"
-		top="-2"
+		top="0"
+		height="22"
 		min_width="22"
 		width="22">
 	  <button
+		  follows="top"
 		  image_disabled="PushButton_Disabled"
 		  image_disabled_selected="PushButton_Disabled"
 		  image_overlay="Home_Off"
@@ -108,6 +157,7 @@
 		  hover_glow_amount="0.15"
 		  layout="topleft"
 		  tool_tip="Home page"
+		  top="0"
 		  height="22"
 		  min_width="22"
 		  width="22">
@@ -120,19 +170,22 @@
 		auto_resize="false"
 		user_resize="false"
 		layout="topleft"
-		top="2"
+		top="0"
+		height="22"
 		min_width="22"
 		width="22">
 	  <button
+		  follows="top"
 		  image_overlay="Stop_Off"
 		  image_disabled="PushButton_Disabled"
 		  image_disabled_selected="PushButton_Disabled"
 		  image_selected="PushButton_Selected"
 		  image_unselected="PushButton_Off"
 		  hover_glow_amount="0.15"
-		  height="22"
 		  layout="topleft"
 		  tool_tip="Stop media"
+		  top="0"
+		  height="22"
 		  min_width="22"
 		  width="22">
 		<button.commit_callback
@@ -144,11 +197,12 @@
 		auto_resize="false"
 		user_resize="false"
 		layout="topleft"
-		top="6"
+		top="0"
+		height="22"
 		min_width="22"
 		width="22">
 	  <button
-		  height="22"
+		  follows="top"
 		  image_overlay="Refresh_Off"
 		  image_disabled="PushButton_Disabled"
 		  image_disabled_selected="PushButton_Disabled"
@@ -157,6 +211,8 @@
 		  hover_glow_amount="0.15"
 		  layout="topleft"
 		  tool_tip="Reload"
+		  top="0"
+		  height="22"
 		  min_width="22"
 		  width="22">
 		<button.commit_callback
@@ -168,11 +224,12 @@
 		auto_resize="false"
 		user_resize="false"
 		layout="topleft"
-		top="10"
+		top="0"
+		height="22"
 		min_width="22"
 		width="22">
 	  <button
-		  height="22"
+		  follows="top"
 		  image_overlay="StopReload_Off"
 		  image_disabled="PushButton_Disabled"
 		  image_disabled_selected="PushButton_Disabled"
@@ -181,6 +238,8 @@
 		  hover_glow_amount="0.15"
 		  layout="topleft"
 		  tool_tip = "Stop loading"
+		  top="0"
+		  height="22"
 		  min_width="22"
 		  width="22">
 		<button.commit_callback
@@ -192,10 +251,12 @@
 		auto_resize="false"
 		user_resize="false"
 		layout="topleft"
-		top="14"
+		top="0"
+		height="22"
 		min_width="22"
 		width="24">
 	  <button
+		  follows="top"
 		  image_overlay="Play_Off"
 		  image_disabled="PushButton_Disabled"
 		  image_disabled_selected="PushButton_Disabled"
@@ -205,7 +266,7 @@
 		  layout="topleft"
 		  tool_tip = "Play media"
 		  left_delta="2"
-		  top="4"
+		  top="0"
 		  height="22"
 		  min_width="22"
 		  width="22">
@@ -218,10 +279,11 @@
 		auto_resize="false"
 		user_resize="false"
 		layout="topleft"
-		top="18"
+		top="0"
 		min_width="22"
 		width="24">
 	  <button
+		  follows="top"
 		  image_overlay="Pause_Off"
 		  image_disabled="PushButton_Disabled"
 		  image_disabled_selected="PushButton_Disabled"
@@ -229,10 +291,10 @@
 		  image_unselected="PushButton_Off"
 		  hover_glow_amount="0.15"
 		  layout="topleft"
+		  top="0"
 		  height="22"
 		  width="22"
 		  left_delta="-1"
-		  top="4"
 		  tool_tip = "Pause media">
 		<button.commit_callback
 			function="MediaCtrl.Pause" />
@@ -246,11 +308,12 @@
 		height="24"
 		follows="left|right|bottom"
 		layout="topleft"
+		top="0"
 		width="190"
 		min_width="90">
 	  <line_editor 
 		  name="media_address_url"
-		  follows="left|right" 
+		  follows="top|left|right" 
 		  height="22"
 		  top="0"
 		  tool_tip="Media URL"
@@ -261,17 +324,18 @@
 	  <layout_stack
 		  name="media_address_url_icons"
 		  animate="false"
-		  follows="right"
+		  follows="top|right"
 		  height="20"
 		  width="38"
-		  right="-2"
-		  top="-1"
-     	mouse_opaque="false"
+		  top="0"
+		  right="-1"
+		  border_size="0"
+		  mouse_opaque="false"
 		  orientation="horizontal">
 		<layout_panel
 			layout="topleft"
 			width="16"
-     	mouse_opaque="false"
+			mouse_opaque="false"
 			auto_resize="false"
 			user_resize="false">
 		  <icon
@@ -287,7 +351,7 @@
 		<layout_panel
 			layout="topleft"
 			width="16"
-     	mouse_opaque="false"
+			mouse_opaque="false"
 			auto_resize="false"
 			user_resize="false">
 		  <icon
@@ -305,16 +369,17 @@
 		name="media_play_position"
 		auto_resize="true"
 		user_resize="false"
-		follows="left|right|top|bottom"
+		follows="left|right"
 		layout="topleft"
-		height="16"		
+		top="0"
+		height="22"
 		min_width="100"
 		width="200">
 	  <slider_bar
 		  name="media_play_slider"
 		  follows="left|right|top"
-		  height="20"
-		  bottom="88"
+		  top="0"
+		  height="22"
 		  increment="0.01"
 		  initial_value="0.5"
 		  layout="topleft"
@@ -330,9 +395,11 @@
 		auto_resize="false"
 		user_resize="false"
 		layout="topleft"
+		top="0"
 		min_width="22"
 		width="22">
 	  <button
+		  follows="top"
 		  image_overlay="SkipBackward_Off"
 		  image_disabled="PushButton_Disabled"
 		  image_disabled_selected="PushButton_Disabled"
@@ -343,7 +410,7 @@
 		  height="22"
 		  layout="topleft"
 		  tool_tip="Step back"
-		  top="-14"
+		  top="0"
 		  width="22"
 		  left="0">
 		<button.commit_callback
@@ -355,9 +422,11 @@
 		auto_resize="false"
 		user_resize="false"
 		layout="topleft"
+		top="0"
 		min_width="22"
 		width="22">
 	  <button
+		  follows="top"
 		  image_overlay="SkipForward_Off"
 		  image_disabled="PushButton_Disabled"
 		  image_disabled_selected="PushButton_Disabled"
@@ -367,7 +436,7 @@
 		  height="22"
 		  layout="topleft"
 		  tool_tip="Step forward"
-		  top="-14"
+		  top="0"
 		  min_width="22"
 		  width="22">
 		<button.commit_callback
@@ -379,26 +448,28 @@
 		auto_resize="false"
 		user_resize="false"
 		layout="topleft"
-		top="-50"
+		top="0"
 		height="72"
 		min_width="22"
 		width="22">
 	  <!-- Note: this is not quite right either...the mute button is not the -->
 	  <!-- same as the others because it cannot have the "image_overlay" be  -->
 	  <!-- two different images.  -->
+	  <!-- Note also: the button and the slider must overlap! -->
 	  <button
+		  follows="top"
 		  image_disabled="PushButton_Disabled"
 		  image_disabled_selected="PushButton_Disabled"
 		  image_selected="AudioMute_Off"
 		  image_unselected="Audio_Off"
 		  hover_glow_amount="0.15"
 		  name="media_mute_button"
-		  height="22"
 		  is_toggle="true"
 		  layout="topleft"
 		  scale_image="false" 
 		  tool_tip="Mute This Media"
-		  top="118"
+		  top="0"
+		  height="20"
 		  min_width="22"
 		  width="22" >
 		<button.commit_callback
@@ -411,7 +482,7 @@
 	  <slider
 		  orientation="vertical"
 		  left="0"
-		  top="-2"
+		  top="16"
 		  height="50"
 		  layout="topleft"
 		  increment="0.01"
@@ -428,35 +499,24 @@
 			function="MediaCtrl.HideVolumeSlider" />
 	  </slider>
 	</layout_panel>
-	<panel
-		height="28"
-		layout="topleft"
-		auto_resize="false"
-		min_width="3"
-		width="3">
-	  <icon
-		  height="26"
-		  image_name="media_panel_divider.png"
-		  layout="topleft"
-		  top="0"
-		  min_width="3"
-		  width="3" />
-	</panel>
 	<layout_panel
 		name="zoom_frame"
 		auto_resize="false"
 		user_resize="false"
 		layout="topleft"
+		top="0"
 		height="28"
 		min_width="22"
 		width="22">
 	  <button
+		  follows="top"
 		  image_overlay="Zoom_Off"
 		  image_disabled="PushButton_Disabled"
 		  image_disabled_selected="PushButton_Disabled"
 		  image_selected="PushButton_Selected"
 		  image_unselected="PushButton_Off"
 		  hover_glow_amount="0.15"
+		  top="0"
 		  height="22"
 		  layout="topleft"
 		  tool_tip="Zoom into media"
@@ -471,15 +531,18 @@
 		auto_resize="false"
 		user_resize="false"
 		layout="topleft"
+		top="0"
 		min_width="21"
 		width="21" >
 	  <button
+		  follows="top"
 		  image_overlay="UnZoom_Off"
 		  image_disabled="PushButton_Disabled"
 		  image_disabled_selected="PushButton_Disabled"
 		  image_selected="PushButton_Selected"
 		  image_unselected="PushButton_Off"
 		  hover_glow_amount="0.15"
+		  top="0"
 		  height="22"
 		  layout="topleft"
 		  tool_tip ="Zoom Back"
@@ -494,9 +557,11 @@
 		auto_resize="false"
 		user_resize="false"
 		layout="topleft"
+		top="0"
 		min_width="22"
 		width="22">
 	  <button
+		  follows="top"
 		  image_overlay="ExternalBrowser_Off"
 		  image_disabled="PushButton_Disabled"
 		  image_disabled_selected="PushButton_Disabled"
@@ -506,7 +571,7 @@
 		  height="22"
 		  layout="topleft"
 		  tool_tip = "Open URL in browser"
-		  top_delta="-4"
+		  top="0"
 		  min_width="24"
 		  width="24" >
 		<button.commit_callback
@@ -516,46 +581,16 @@
 	<!-- bookend panel -->
 	<layout_panel
 		name="right_bookend"
-		width="0"
-		layout="topleft"
-		user_resize="false" />
-  </layout_stack>
-  <layout_stack
-	  follows="left|right|bottom"
-	  height="20"
-	  layout="topleft"
-	  animate="false"
-	  left="0"
-	  orientation="horizontal"
-	  top="170">
-	<!-- outer layout_panels center the inner one -->
-	<layout_panel
-		width="0"
-		layout="topleft"
-		user_resize="false" />
-	<panel
-		name="media_progress_indicator"
-		height="20"
-		layout="topleft"
-		left="0"
 		top="0"
-		auto_resize="false"
-		user_resize="false"
-		min_width="100"
-		width="200">
-	  <progress_bar
-		  name="media_progress_bar"
-		  color_bar="1 1 1 0.96"
-		  follows="left|right|top"
-		  top="5"
-		  height="8"
-		  layout="topleft"
-		  left="0"
-		  tool_tip="Media is Loading"/>
-	</panel>
-	<layout_panel
 		width="0"
 		layout="topleft"
 		user_resize="false" />
   </layout_stack>
+  <panel
+	  name="media_region"
+	  height="100"
+	  follows="left|right|top|bottom"
+	  layout="topleft"
+	  mouse_opaque="false"
+	  top="30" />
 </panel>
diff --git a/indra/viewer_components/login/lllogin.cpp b/indra/viewer_components/login/lllogin.cpp
index 364088ab31e9e45929e0f517e8c26279046b5527..f5bda71846b2e495e8843579ffd5809e1106048e 100644
--- a/indra/viewer_components/login/lllogin.cpp
+++ b/indra/viewer_components/login/lllogin.cpp
@@ -160,8 +160,11 @@ void LLLogin::Impl::login_(LLCoros::self& self, std::string uri, LLSD credential
 			seconds_to_timeout = credentials["cfg_srv_timeout"].asReal();
 		}
 
-		filter.eventAfter(seconds_to_timeout, 
-			getProgressEventLLSD("offline", "fail.login"));
+        // If the SRV request times out (e.g. EXT-3934), simulate response: an
+        // array containing our original URI.
+        LLSD fakeResponse(LLSD::emptyArray());
+        fakeResponse.append(uri);
+		filter.eventAfter(seconds_to_timeout, fakeResponse);
 
 		std::string srv_pump_name = "LLAres";
 		if(credentials.has("cfg_srv_pump"))
diff --git a/indra/viewer_components/login/tests/lllogin_test.cpp b/indra/viewer_components/login/tests/lllogin_test.cpp
index 7159959a4f7dda4d47bf753dfb0c61e633a4843f..8463e6d2caa54f849012b8c1921bfdf8c3233e0b 100644
--- a/indra/viewer_components/login/tests/lllogin_test.cpp
+++ b/indra/viewer_components/login/tests/lllogin_test.cpp
@@ -215,14 +215,14 @@ namespace tut
     void llviewerlogin_object::test<1>()
     {
         DEBUG;
-		// Testing login with immediate repsonses from Ares and XMLPRC
+		// Testing login with immediate responses from Ares and XMLPRC
 		// The response from both requests will come before the post request exits.
 		// This tests an edge case of the login state handling.
 		LLEventStream llaresPump("LLAres"); // Dummy LLAres pump.
 		LLEventStream xmlrpcPump("LLXMLRPCTransaction"); // Dummy XMLRPC pump
 
 		bool respond_immediately = true;
-		// Have 'dummy ares' repsond immediately. 
+		// Have 'dummy ares' respond immediately. 
 		LLAresListener dummyLLAres("dummy_llares", respond_immediately);
 		dummyLLAres.listenTo(llaresPump);
 
@@ -251,7 +251,7 @@ namespace tut
         DEBUG;
 		// Tests a successful login in with delayed responses. 
 		// Also includes 'failure' that cause the login module
-		// To re-attempt connection, once from a basic failure
+		// to re-attempt connection, once from a basic failure
 		// and once from the 'indeterminate' response.
 
 		set_test_name("LLLogin multiple srv uris w/ success");
@@ -464,6 +464,12 @@ namespace tut
 		LLSD frame_event;
 		mainloop.post(frame_event);
 
-		ensure_equals("SRV Failure", listener.lastEvent()["change"].asString(), "fail.login"); 
+		// In this state we have NOT sent a reply from LLAresListener -- in
+		// fact there's no such object. Nonetheless, we expect the timeout to
+		// have stepped the login module forward to try to authenticate with
+		// the original URI.
+		ensure_equals("Auth state", listener.lastEvent()["change"].asString(), "authenticating"); 
+		ensure_equals("Attempt", listener.lastEvent()["data"]["attempt"].asInteger(), 1); 
+		ensure_equals("URI", listener.lastEvent()["data"]["request"]["uri"].asString(), "login.bar.com"); 
 	}
 }