diff --git a/indra/llcommon/llinstancetracker.h b/indra/llcommon/llinstancetracker.h
index 5a3990a8df58d8dcf4f40069af59f31cefc80452..34d841a4e01ddc58a383a1618f05185a4dfbdcd4 100644
--- a/indra/llcommon/llinstancetracker.h
+++ b/indra/llcommon/llinstancetracker.h
@@ -193,7 +193,12 @@ class LLInstanceTracker : public LLInstanceTrackerBase
 	}
 
 protected:
-	LLInstanceTracker(KEY key) { add_(key); }
+	LLInstanceTracker(KEY key) 
+	{ 
+		// make sure static data outlives all instances
+		getStatic();
+		add_(key); 
+	}
 	virtual ~LLInstanceTracker() 
 	{ 
 		// it's unsafe to delete instances of this type while all instances are being iterated over.
@@ -281,7 +286,8 @@ class LLInstanceTracker<T, T*> : public LLInstanceTrackerBase
 protected:
 	LLInstanceTracker()
 	{
-		// it's safe but unpredictable to create instances of this type while all instances are being iterated over.  I hate unpredictable.	 This assert will probably be turned on early in the next development cycle.
+		// make sure static data outlives all instances
+		getStatic();
 		getSet_().insert(static_cast<T*>(this));
 	}
 	virtual ~LLInstanceTracker()
diff --git a/indra/llui/llcommandmanager.cpp b/indra/llui/llcommandmanager.cpp
index 128ba609cb2e9940fad52909b21b7334800cdd04..0e2f3f1961b784ebea0d731ceedca6403453c8ac 100644
--- a/indra/llui/llcommandmanager.cpp
+++ b/indra/llui/llcommandmanager.cpp
@@ -41,7 +41,7 @@
 // LLCommandId class
 //
 
-const LLCommandId LLCommandId::null = LLCommandId();
+const LLCommandId LLCommandId::null = LLCommandId("null command");
 
 //
 // LLCommand class
@@ -67,10 +67,11 @@ LLCommand::Params::Params()
 }
 
 LLCommand::LLCommand(const LLCommand::Params& p)
-	: mAvailableInToybox(p.available_in_toybox)
+	: mIdentifier(p.name)
+	, mAvailableInToybox(p.available_in_toybox)
 	, mIcon(p.icon)
-	, mIdentifier(p.name)
 	, mLabelRef(p.label_ref)
+	, mName(p.name)
 	, mTooltipRef(p.tooltip_ref)
 	, mExecuteFunction(p.execute_function)
 	, mExecuteParameters(p.execute_parameters)
@@ -134,7 +135,7 @@ void LLCommandManager::addCommand(LLCommand * command)
 	mCommandIndices[command_id.uuid()] = mCommands.size();
 	mCommands.push_back(command);
 
-	lldebugs << "Successfully added command: " << command->id().name() << llendl;
+	lldebugs << "Successfully added command: " << command->name() << llendl;
 }
 
 //static
diff --git a/indra/llui/llcommandmanager.h b/indra/llui/llcommandmanager.h
index 9b93ab735a4937d9eef4975ea50192b6c6f7b11f..a7276a48aa5cb146e72d70020c57ccb2662b477f 100644
--- a/indra/llui/llcommandmanager.h
+++ b/indra/llui/llcommandmanager.h
@@ -50,31 +50,20 @@ class LLCommandId
 		{}
 	};
 
-	LLCommandId()
-		: mName("null command")
-	{
-		mUUID = LLUUID::generateNewID(mName);
-	}
-	
 	LLCommandId(const std::string& name)
-		: mName(name)
 	{
 		mUUID = LLUUID::generateNewID(name);
 	}
 
 	LLCommandId(const Params& p)
-	:	mName(p.name)
 	{
 		mUUID = LLUUID::generateNewID(p.name);
 	}
 
 	LLCommandId(const LLUUID& uuid)
-	:	mName(""),
-		mUUID(uuid)
-	{
-	}
+	:	mUUID(uuid)
+	{}
 	
-	const std::string& name() const { return mName; }
 	const LLUUID& uuid() const { return mUUID; }
 
 	bool operator!=(const LLCommandId& command) const
@@ -87,15 +76,9 @@ class LLCommandId
 		return (mUUID == command.mUUID);
 	}
 
-	bool operator<(const LLCommandId& command) const
-	{
-		return (mName < command.mName);
-	}
-
 	static const LLCommandId null;
 
 private:
-	std::string mName;
 	LLUUID		mUUID;
 };
 
@@ -137,6 +120,7 @@ class LLCommand
 	const std::string& icon() const { return mIcon; }
 	const LLCommandId& id() const { return mIdentifier; }
 	const std::string& labelRef() const { return mLabelRef; }
+	const std::string& name() const { return mName; }
 	const std::string& tooltipRef() const { return mTooltipRef; }
 
 	const std::string& executeFunctionName() const { return mExecuteFunction; }
@@ -160,6 +144,7 @@ class LLCommand
 	bool        mAvailableInToybox;
 	std::string mIcon;
 	std::string mLabelRef;
+	std::string mName;
 	std::string mTooltipRef;
 
 	std::string mExecuteFunction;
diff --git a/indra/llui/lldockablefloater.cpp b/indra/llui/lldockablefloater.cpp
index ca2dc644a488e70e005caf5239c1e7d05d669a31..aea58be12afaa3d6addcf5092ecbeca3fbce36bc 100644
--- a/indra/llui/lldockablefloater.cpp
+++ b/indra/llui/lldockablefloater.cpp
@@ -162,10 +162,15 @@ void LLDockableFloater::setVisible(BOOL visible)
 
 void LLDockableFloater::setMinimized(BOOL minimize)
 {
-	if(minimize)
+	if(minimize && isDocked())
 	{
+		// minimizing a docked floater just hides it
 		setVisible(FALSE);
 	}
+	else
+	{
+		LLFloater::setMinimized(minimize);
+	}
 }
 
 LLView * LLDockableFloater::getDockWidget()
diff --git a/indra/llui/llfloater.cpp b/indra/llui/llfloater.cpp
index d1d840729d6538ed84da756814d285d8a6715663..7100ea13a7ec4035d7e102e298e84faa92d7631e 100644
--- a/indra/llui/llfloater.cpp
+++ b/indra/llui/llfloater.cpp
@@ -165,6 +165,7 @@ LLFloater::Params::Params()
 :	title("title"),
 	short_title("short_title"),
 	single_instance("single_instance", false),
+	reuse_instance("reuse_instance", false),
 	can_resize("can_resize", false),
 	can_minimize("can_minimize", true),
 	can_close("can_close", true),
@@ -174,6 +175,7 @@ LLFloater::Params::Params()
 	save_rect("save_rect", false),
 	save_visibility("save_visibility", false),
 	can_dock("can_dock", false),
+	show_title("show_title", true),
 	open_positioning("open_positioning", LLFloaterEnums::OPEN_POSITIONING_NONE),
 	specified_left("specified_left"),
 	specified_bottom("specified_bottom"),
@@ -238,6 +240,7 @@ LLFloater::LLFloater(const LLSD& key, const LLFloater::Params& p)
 	mTitle(p.title),
 	mShortTitle(p.short_title),
 	mSingleInstance(p.single_instance),
+	mReuseInstance(p.reuse_instance.isProvided() ? p.reuse_instance : p.single_instance), // reuse single-instance floaters by default
 	mKey(key),
 	mCanTearOff(p.can_tear_off),
 	mCanMinimize(p.can_minimize),
@@ -538,7 +541,6 @@ LLFloater::~LLFloater()
 		delete mResizeHandle[i];
 	}
 
-	storeRectControl();
 	setVisible(false); // We're not visible if we're destroyed
 	storeVisibilityControl();
 	storeDockStateControl();
@@ -683,7 +685,12 @@ void LLFloater::openFloater(const LLSD& key)
 	}
 	else
 	{
-		applyControlsAndPosition(LLFloaterReg::getLastFloaterCascading());
+		LLFloater* floater_to_stack = LLFloaterReg::getLastFloaterInGroup(mInstanceName);
+		if (!floater_to_stack)
+		{
+			floater_to_stack = LLFloaterReg::getLastFloaterCascading();
+		}
+		applyControlsAndPosition(floater_to_stack);
 		setMinimized(FALSE);
 		setVisibleAndFrontmost(mAutoFocus);
 	}
@@ -776,12 +783,19 @@ void LLFloater::closeFloater(bool app_quitting)
 			else
 			{
 				setVisible(FALSE);
+				if (!mReuseInstance)
+				{
+					destroy();
+				}
 			}
 		}
 		else
 		{
 			setVisible(FALSE); // hide before destroying (so handleVisibilityChange() gets called)
-			destroy();
+			if (!mReuseInstance)
+			{
+				destroy();
+			}
 		}
 	}
 }
@@ -861,9 +875,16 @@ bool LLFloater::applyRectControl()
 {
 	bool saved_rect = false;
 
-	// If we have a saved rect, use it
-	if (mRectControl.size() > 1)
+	LLFloater* last_in_group = LLFloaterReg::getLastFloaterInGroup(mInstanceName);
+	if (last_in_group && last_in_group != this)
 	{
+		// other floaters in our group, position ourselves relative to them and don't save the rect
+		mRectControl.clear();
+		mOpenPositioning = LLFloaterEnums::OPEN_POSITIONING_CASCADE_GROUP;
+	}
+	else if (mRectControl.size() > 1)
+	{
+		// If we have a saved rect, use it
 		const LLRect& rect = getControlGroup()->getRect(mRectControl);
 		saved_rect = rect.notEmpty();
 		if (saved_rect)
@@ -912,6 +933,7 @@ void LLFloater::applyPositioning(LLFloater* other)
 		}
 		break;
 
+	case LLFloaterEnums::OPEN_POSITIONING_CASCADE_GROUP:
 	case LLFloaterEnums::OPEN_POSITIONING_CASCADING:
 		if (other != NULL)
 		{
@@ -1051,6 +1073,7 @@ void LLFloater::handleReshape(const LLRect& new_rect, bool by_user)
 	if (by_user)
 	{
 		storeRectControl();
+		mOpenPositioning = LLFloaterEnums::OPEN_POSITIONING_NONE;
 	}
 
 	// if not minimized, adjust all snapped dependents to new shape
@@ -1142,10 +1165,6 @@ void LLFloater::setMinimized(BOOL minimize)
 			mButtonsEnabled[BUTTON_RESTORE] = TRUE;
 		}
 
-		if (mDragHandle)
-		{
-			mDragHandle->setVisible(TRUE);
-		}
 		setBorderVisible(TRUE);
 
 		for(handle_set_iter_t dependent_it = mDependents.begin();
@@ -1296,19 +1315,9 @@ void LLFloater::setIsChrome(BOOL is_chrome)
 		mButtons[BUTTON_CLOSE]->setToolTip(LLStringExplicit(getButtonTooltip(Params(), BUTTON_CLOSE, is_chrome)));
 	}
 	
-	// no titles displayed on "chrome" floaters
-	if (mDragHandle)
-		mDragHandle->setTitleVisible(!is_chrome);
-	
 	LLPanel::setIsChrome(is_chrome);
 }
 
-void LLFloater::setTitleVisible(bool visible)
-{
-	if (mDragHandle)
-		mDragHandle->setTitleVisible(visible);
-}
-
 // Change the draw style to account for the foreground state.
 void LLFloater::setForeground(BOOL front)
 {
@@ -1396,7 +1405,10 @@ void LLFloater::moveResizeHandlesToFront()
 
 BOOL LLFloater::isFrontmost()
 {
-	return gFloaterView && gFloaterView->getFrontmost() == this && getVisible();
+	LLFloaterView* floater_view = getParentByType<LLFloaterView>();
+	return getVisible()
+			&& (floater_view 
+				&& floater_view->getFrontmost() == this);
 }
 
 void LLFloater::addDependentFloater(LLFloater* floaterp, BOOL reposition)
@@ -1469,6 +1481,7 @@ BOOL LLFloater::handleMouseDown(S32 x, S32 y, MASK mask)
 		if(offerClickToButton(x, y, mask, BUTTON_CLOSE)) return TRUE;
 		if(offerClickToButton(x, y, mask, BUTTON_RESTORE)) return TRUE;
 		if(offerClickToButton(x, y, mask, BUTTON_TEAR_OFF)) return TRUE;
+		if(offerClickToButton(x, y, mask, BUTTON_DOCK)) return TRUE;
 
 		// Otherwise pass to drag handle for movement
 		return mDragHandle->handleMouseDown(x, y, mask);
@@ -1574,6 +1587,13 @@ void LLFloater::setDocked(bool docked, bool pop_on_undock)
 	{
 		mDocked = docked;
 		mButtonsEnabled[BUTTON_DOCK] = !mDocked;
+
+		if (mDocked)
+		{
+			setMinimized(FALSE);
+			mOpenPositioning = LLFloaterEnums::OPEN_POSITIONING_NONE;
+		}
+
 		updateTitleButtons();
 
 		storeDockStateControl();
@@ -1812,7 +1832,7 @@ void LLFloater::draw()
 		{
 			drawChild(mButtons[i]);
 		}
-		drawChild(mDragHandle);
+		drawChild(mDragHandle, 0, 0, TRUE);
 	}
 	else
 	{
@@ -2963,6 +2983,7 @@ void LLFloater::initFromParams(const LLFloater::Params& p)
 	mHeaderHeight = p.header_height;
 	mLegacyHeaderHeight = p.legacy_header_height;
 	mSingleInstance = p.single_instance;
+	mReuseInstance = p.reuse_instance.isProvided() ? p.reuse_instance : p.single_instance;
 
 	mOpenPositioning = p.open_positioning;
 	mSpecifiedLeft = p.specified_left;
@@ -2991,6 +3012,11 @@ void LLFloater::initFromParams(const LLFloater::Params& p)
 	{
 		setCloseCallback(initCommitCallback(p.close_callback));
 	}
+
+	if (mDragHandle)
+	{
+		mDragHandle->setTitleVisible(p.show_title);
+	}
 }
 
 boost::signals2::connection LLFloater::setMinimizeCallback( const commit_signal_t::slot_type& cb ) 
@@ -3239,7 +3265,6 @@ void LLFloater::stackWith(LLFloater& other)
 
 	next_rect.setLeftTopAndSize(next_rect.mLeft, next_rect.mTop, getRect().getWidth(), getRect().getHeight());
 	
-	mRectControl.clear(); // don't save rect of stacked floaters
 	setShape(next_rect);
 }
 
diff --git a/indra/llui/llfloater.h b/indra/llui/llfloater.h
index 8beb11507e115750c17d06320a60a25f49e802e4..73e9c9e83107721223d15bf32678f9fac7deb2a2 100644
--- a/indra/llui/llfloater.h
+++ b/indra/llui/llfloater.h
@@ -66,9 +66,9 @@ namespace LLFloaterEnums
 	{
 		OPEN_POSITIONING_NONE,
 		OPEN_POSITIONING_CASCADING,
+		OPEN_POSITIONING_CASCADE_GROUP,
 		OPEN_POSITIONING_CENTERED,
 		OPEN_POSITIONING_SPECIFIED,
-
 		OPEN_POSITIONING_COUNT
 	};
 }
@@ -120,6 +120,7 @@ class LLFloater : public LLPanel
 								short_title;
 		
 		Optional<bool>			single_instance,
+								reuse_instance,
 								can_resize,
 								can_minimize,
 								can_close,
@@ -128,7 +129,8 @@ class LLFloater : public LLPanel
 								save_rect,
 								save_visibility,
 								save_dock_state,
-								can_dock;
+								can_dock,
+								show_title;
 		
 		Optional<LLFloaterEnums::EOpenPositioning>	open_positioning;
 		Optional<S32>								specified_left;
@@ -209,7 +211,6 @@ class LLFloater : public LLPanel
 	std::string		getTitle() const;
 	void			setShortTitle( const std::string& short_title );
 	std::string		getShortTitle() const;
-	void			setTitleVisible(bool visible);
 	virtual void	setMinimized(BOOL b);
 	void			moveResizeHandlesToFront();
 	void			addDependentFloater(LLFloater* dependent, BOOL reposition = TRUE);
@@ -409,6 +410,7 @@ class LLFloater : public LLPanel
 	LLUIString		mShortTitle;
 	
 	BOOL			mSingleInstance;	// TRUE if there is only ever one instance of the floater
+	bool			mReuseInstance;		// true if we want to hide the floater when we close it instead of destroying it
 	std::string		mInstanceName;		// Store the instance name so we can remove ourselves from the list
 	
 	BOOL			mCanTearOff;
diff --git a/indra/llui/llfloaterreg.cpp b/indra/llui/llfloaterreg.cpp
index 0edfc8da2d4aa9630cad4518e8be2e80f02ce122..e144b68f5ebb00ae3df2316233d359ff0092f8f9 100644
--- a/indra/llui/llfloaterreg.cpp
+++ b/indra/llui/llfloaterreg.cpp
@@ -167,6 +167,7 @@ LLFloater* LLFloaterReg::getInstance(const std::string& name, const LLSD& key)
 				res->setInstanceName(name);
 
 				LLFloater *last_floater = (list.empty() ? NULL : list.back());
+
 				res->applyControlsAndPosition(last_floater);
 
 				gFloaterView->adjustToFitScreen(res, false);
@@ -462,16 +463,16 @@ void LLFloaterReg::toggleInstanceOrBringToFront(const LLSD& sdname, const LLSD&
 	else if (instance->isMinimized())
 	{
 		instance->setMinimized(FALSE);
-		instance->setFocus(TRUE);
+		instance->setVisibleAndFrontmost();
 	}
 	else if (!instance->isShown())
 	{
 		instance->openFloater(key);
-		instance->setFocus(TRUE);
+		instance->setVisibleAndFrontmost();
 	}
-	else if (!instance->hasFocus() && !instance->getIsChrome())
+	else if (!instance->isFrontmost())
 	{
-		instance->setFocus(TRUE);
+		instance->setVisibleAndFrontmost();
 	}
 	else
 	{
diff --git a/indra/llui/lllayoutstack.cpp b/indra/llui/lllayoutstack.cpp
index 4991c4afa641a3139f3e289534d70a08a8c12a99..0e7060e22cfc887157bdfceb40ceb5c38b1a4d40 100644
--- a/indra/llui/lllayoutstack.cpp
+++ b/indra/llui/lllayoutstack.cpp
@@ -47,6 +47,19 @@ void LLLayoutStack::OrientationNames::declareValues()
 //
 // LLLayoutPanel
 //
+LLLayoutPanel::Params::Params()	
+:	expanded_min_dim("expanded_min_dim", 0),
+	min_dim("min_dim", 0),
+	max_dim("max_dim", S32_MAX),
+	user_resize("user_resize", true),
+	auto_resize("auto_resize", true)
+{
+	addSynonym(min_dim, "min_width");
+	addSynonym(min_dim, "min_height");
+	addSynonym(max_dim, "max_width");
+	addSynonym(max_dim, "max_height");
+}
+
 LLLayoutPanel::LLLayoutPanel(const Params& p)	
 :	LLPanel(p),
 	mExpandedMinDimSpecified(false),
@@ -527,8 +540,8 @@ void LLLayoutStack::updateLayout(BOOL force_resize)
 	// not enough room to fit existing contents
 	if (force_resize == FALSE
 		// layout did not complete by reaching target position
-		&& ((mOrientation == VERTICAL && cur_y != -mPanelSpacing)
-			|| (mOrientation == HORIZONTAL && cur_x != getRect().getWidth() + mPanelSpacing)))
+		&& ((mOrientation == VERTICAL && llround(cur_y) != -mPanelSpacing)
+			|| (mOrientation == HORIZONTAL && llround(cur_x) != getRect().getWidth() + mPanelSpacing)))
 	{
 		// do another layout pass with all stacked elements contributing
 		// even those that don't usually resize
diff --git a/indra/llui/lllayoutstack.h b/indra/llui/lllayoutstack.h
index 5d79505fc36b5eea4b1ce9ec94599cb7791e5438..ede6149a800da8c15b6de93079cb2845a767d0e5 100644
--- a/indra/llui/lllayoutstack.h
+++ b/indra/llui/lllayoutstack.h
@@ -161,18 +161,7 @@ friend class LLUICtrlFactory;
 		Optional<bool>			user_resize,
 								auto_resize;
 
-		Params()
-		:	expanded_min_dim("expanded_min_dim", 0),
-			min_dim("min_dim", 0),
-			max_dim("max_dim", 0),
-			user_resize("user_resize", true),
-			auto_resize("auto_resize", true)
-		{
-			addSynonym(min_dim, "min_width");
-			addSynonym(min_dim, "min_height");
-			addSynonym(max_dim, "max_width");
-			addSynonym(max_dim, "max_height");
-		}
+		Params();
 	};
 
 	~LLLayoutPanel();
diff --git a/indra/llui/lltabcontainer.cpp b/indra/llui/lltabcontainer.cpp
index 9c6a76822c2e12e1379e3b0bd54acdbafd888798..ad1f3c504da89f8271c89c215ff9b3d8f415606f 100644
--- a/indra/llui/lltabcontainer.cpp
+++ b/indra/llui/lltabcontainer.cpp
@@ -548,23 +548,23 @@ BOOL LLTabContainer::handleMouseDown( S32 x, S32 y, MASK mask )
 	}
 
 	S32 tab_count = getTabCount();
-	if (tab_count > 0)
+	if (tab_count > 0 && !getTabsHidden())
 	{
 		LLTabTuple* firsttuple = getTab(0);
 		LLRect tab_rect;
 		if (mIsVertical)
 		{
 			tab_rect = LLRect(firsttuple->mButton->getRect().mLeft,
-							  has_scroll_arrows ? mPrevArrowBtn->getRect().mBottom - tabcntrv_pad : mPrevArrowBtn->getRect().mTop,
-							  firsttuple->mButton->getRect().mRight,
-							  has_scroll_arrows ? mNextArrowBtn->getRect().mTop + tabcntrv_pad : mNextArrowBtn->getRect().mBottom );
+								has_scroll_arrows ? mPrevArrowBtn->getRect().mBottom - tabcntrv_pad : mPrevArrowBtn->getRect().mTop,
+								firsttuple->mButton->getRect().mRight,
+								has_scroll_arrows ? mNextArrowBtn->getRect().mTop + tabcntrv_pad : mNextArrowBtn->getRect().mBottom );
 		}
 		else
 		{
 			tab_rect = LLRect(has_scroll_arrows ? mPrevArrowBtn->getRect().mRight : mJumpPrevArrowBtn->getRect().mLeft,
-							  firsttuple->mButton->getRect().mTop,
-							  has_scroll_arrows ? mNextArrowBtn->getRect().mLeft : mJumpNextArrowBtn->getRect().mRight,
-							  firsttuple->mButton->getRect().mBottom );
+								firsttuple->mButton->getRect().mTop,
+								has_scroll_arrows ? mNextArrowBtn->getRect().mLeft : mJumpNextArrowBtn->getRect().mRight,
+								firsttuple->mButton->getRect().mBottom );
 		}
 		if( tab_rect.pointInRect( x, y ) )
 		{
@@ -681,7 +681,7 @@ BOOL LLTabContainer::handleToolTip( S32 x, S32 y, MASK mask)
 {
 	static LLUICachedControl<S32> tabcntrv_pad ("UITabCntrvPad", 0);
 	BOOL handled = LLPanel::handleToolTip( x, y, mask);
-	if (!handled && getTabCount() > 0) 
+	if (!handled && getTabCount() > 0 && !getTabsHidden()) 
 	{
 		LLTabTuple* firsttuple = getTab(0);
 
@@ -812,7 +812,9 @@ BOOL LLTabContainer::handleDragAndDrop(S32 x, S32 y, MASK mask,	BOOL drop,	EDrag
 {
 	BOOL has_scroll_arrows = (getMaxScrollPos() > 0);
 
-	if( mDragAndDropDelayTimer.getStarted() && mDragAndDropDelayTimer.getElapsedTimeF32() > SCROLL_DELAY_TIME )
+	if( !getTabsHidden()
+		&& mDragAndDropDelayTimer.getStarted() 
+		&& mDragAndDropDelayTimer.getElapsedTimeF32() > SCROLL_DELAY_TIME )
 	{
 		if (has_scroll_arrows)
 		{
diff --git a/indra/llui/lltoolbar.cpp b/indra/llui/lltoolbar.cpp
index 629c7d9bc740a0120457cb6123ec9a5c76b926a0..515605200ed4fef1a3316601fa5a3797410fe136 100644
--- a/indra/llui/lltoolbar.cpp
+++ b/indra/llui/lltoolbar.cpp
@@ -217,7 +217,7 @@ bool LLToolBar::addCommand(const LLCommandId& commandId, int rank)
 	if ((rank >= mButtonCommands.size()) || (rank == RANK_NONE))
 	{
 		// In that case, back load
-		mButtonCommands.push_back(commandId);
+		mButtonCommands.push_back(command->id());
 		mButtons.push_back(button);
 	}
 	else 
@@ -232,7 +232,7 @@ bool LLToolBar::addCommand(const LLCommandId& commandId, int rank)
 			rank--;
 		}
 		// ...then insert
-		mButtonCommands.insert(it_command,commandId);
+		mButtonCommands.insert(it_command, command->id());
 		mButtons.insert(it_button,button);
 	}
 
@@ -302,7 +302,50 @@ bool LLToolBar::enableCommand(const LLCommandId& commandId, bool enabled)
 		command_id_map::iterator it = mButtonMap.find(commandId.uuid());
 		if (it != mButtonMap.end())
 		{
-			it->second->setEnabled(enabled);
+			command_button = it->second;
+			command_button->setEnabled(enabled);
+		}
+	}
+
+	return (command_button != NULL);
+}
+
+bool LLToolBar::stopCommandInProgress(const LLCommandId& commandId)
+{
+	//
+	// Note from Leslie:
+	//
+	// This implementation was largely put in place to handle EXP-1348 which is related to
+	// dragging and dropping the "speak" button.  The "speak" button can be in one of two
+	// modes, i.e., either a toggle action or a push-to-talk action.  Because of this it
+	// responds to mouse down and mouse up in different ways, based on which behavior the
+	// button is currently set to obey.  This was the simplest way of getting the button
+	// to turn off the microphone for both behaviors without risking duplicate state.
+	//
+
+	LLToolBarButton * command_button = NULL;
+
+	if (commandId != LLCommandId::null)
+	{
+		LLCommand* command = LLCommandManager::instance().getCommand(commandId);
+		llassert(command);
+
+		// If this command has an explicit function for execution stop
+		if (command->executeStopFunctionName().length() > 0)
+		{
+			command_id_map::iterator it = mButtonMap.find(commandId.uuid());
+			if (it != mButtonMap.end())
+			{
+				command_button = it->second;
+				llassert(command_button->mIsRunningSignal);
+
+				// Check to see if it is running
+				if ((*command_button->mIsRunningSignal)(command_button, command->isRunningParameters()))
+				{
+					// Trigger an additional button commit, which calls mouse down, mouse up and commit
+					command_button->onCommit();
+				}
+			}
 		}
 	}
 
@@ -778,7 +821,7 @@ LLToolBarButton* LLToolBar::createButton(const LLCommandId& id)
 	if (!commandp) return NULL;
 
 	LLToolBarButton::Params button_p;
-	button_p.name = id.name();
+	button_p.name = commandp->name();
 	button_p.label = LLTrans::getString(commandp->labelRef());
 	button_p.tool_tip = LLTrans::getString(commandp->tooltipRef());
 	button_p.image_overlay = LLUI::getUIImage(commandp->icon());
@@ -956,13 +999,13 @@ BOOL LLToolBarButton::handleHover(S32 x, S32 y, MASK mask)
 	{
 		if (!mIsDragged)
 		{
-			mStartDragItemCallback(x,y,mId.uuid());
+			mStartDragItemCallback(x, y, this);
 			mIsDragged = true;
 			handled = TRUE;
 		}
 		else 
 		{
-			handled = mHandleDragItemCallback(x,y,mId.uuid(),LLAssetType::AT_WIDGET);
+			handled = mHandleDragItemCallback(x, y, mId.uuid(), LLAssetType::AT_WIDGET);
 		}
 	}
 	else
diff --git a/indra/llui/lltoolbar.h b/indra/llui/lltoolbar.h
index 616710ea70f4920e3ca9d50b93e1f6347da88a1f..e634e57f93802d90456f8e519bb0417ed7cbb6c9 100644
--- a/indra/llui/lltoolbar.h
+++ b/indra/llui/lltoolbar.h
@@ -36,8 +36,9 @@
 #include "llassettype.h"
 
 class LLToolBar;
+class LLToolBarButton;
 
-typedef boost::function<void (S32 x, S32 y, const LLUUID& uuid)> tool_startdrag_callback_t;
+typedef boost::function<void (S32 x, S32 y, LLToolBarButton* button)> tool_startdrag_callback_t;
 typedef boost::function<BOOL (S32 x, S32 y, const LLUUID& uuid, LLAssetType::EType type)> tool_handledrag_callback_t;
 typedef boost::function<BOOL (void* data, S32 x, S32 y, LLToolBar* toolbar)> tool_handledrop_callback_t;
 
@@ -185,6 +186,7 @@ class LLToolBar
 	int  removeCommand(const LLCommandId& commandId);		// Returns the rank the removed command was at, RANK_NONE if not found
 	bool hasCommand(const LLCommandId& commandId) const;
 	bool enableCommand(const LLCommandId& commandId, bool enabled);
+	bool stopCommandInProgress(const LLCommandId& commandId);
 
 	void setStartDragCallback(tool_startdrag_callback_t cb)   { mStartDragItemCallback  = cb; }
 	void setHandleDragCallback(tool_handledrag_callback_t cb) { mHandleDragItemCallback = cb; }
diff --git a/indra/llui/llview.cpp b/indra/llui/llview.cpp
index fdb84f1ec57f1b7890d8ed55c8dd69bbe1fd1188..3fd7e48428915cc6b02f39226b0f7012673369ce 100644
--- a/indra/llui/llview.cpp
+++ b/indra/llui/llview.cpp
@@ -721,7 +721,7 @@ LLView* LLView::childrenHandleCharEvent(const std::string& desc, const METHOD& m
 
 // XDATA might be MASK, or S32 clicks
 template <typename METHOD, typename XDATA>
-LLView* LLView::childrenHandleMouseEvent(const METHOD& method, S32 x, S32 y, XDATA extra)
+LLView* LLView::childrenHandleMouseEvent(const METHOD& method, S32 x, S32 y, XDATA extra, bool allow_mouse_block)
 {
 	BOOST_FOREACH(LLView* viewp, mChildList)
 	{
@@ -734,7 +734,7 @@ LLView* LLView::childrenHandleMouseEvent(const METHOD& method, S32 x, S32 y, XDA
 		}
 
 		if ((viewp->*method)( local_x, local_y, extra )
-			|| viewp->blockMouseEvent( local_x, local_y ))
+			|| (allow_mouse_block && viewp->blockMouseEvent( local_x, local_y )))
 		{
 			viewp->logMouseEvent();
 			return viewp;
@@ -1021,7 +1021,7 @@ BOOL LLView::handleMiddleMouseUp(S32 x, S32 y, MASK mask)
 
 LLView* LLView::childrenHandleScrollWheel(S32 x, S32 y, S32 clicks)
 {
-	return childrenHandleMouseEvent(&LLView::handleScrollWheel, x, y, clicks);
+	return childrenHandleMouseEvent(&LLView::handleScrollWheel, x, y, clicks, false);
 }
 
 // Called during downward traversal
diff --git a/indra/llui/llview.h b/indra/llui/llview.h
index 6d1dda90affb4f73e1fe1f1624a2d765d14bb4cb..08828e55e6a0ae216be8328b99f0453af0cd6ae9 100644
--- a/indra/llui/llview.h
+++ b/indra/llui/llview.h
@@ -565,7 +565,7 @@ class LLView : public LLMouseHandler, public LLMortician, public LLFocusableElem
 private:
 
 	template <typename METHOD, typename XDATA>
-	LLView* childrenHandleMouseEvent(const METHOD& method, S32 x, S32 y, XDATA extra);
+	LLView* childrenHandleMouseEvent(const METHOD& method, S32 x, S32 y, XDATA extra, bool allow_mouse_block = true);
 
 	template <typename METHOD, typename CHARTYPE>
 	LLView* childrenHandleCharEvent(const std::string& desc, const METHOD& method,
diff --git a/indra/llxuixml/llinitparam.h b/indra/llxuixml/llinitparam.h
index 1e295ada2dada4a1572701ec40d176a2328cdbac..183472450dbc2ba75372a6f8df80612e7548d7d4 100644
--- a/indra/llxuixml/llinitparam.h
+++ b/indra/llxuixml/llinitparam.h
@@ -982,7 +982,7 @@ namespace LLInitParam
 					if (parser.readValue(name))
 					{
 						// try to parse a per type named value
-						if (name_value_lookup_t::getValueFromName(name, typed_param.mValues))
+						if (name_value_lookup_t::getValueFromName(name, value))
 						{
 							typed_param.add(value);
 							typed_param.mValues.back().setValueName(name);
@@ -1013,7 +1013,7 @@ namespace LLInitParam
 					bool value_written = parser.writeValue(*it, name_stack);
 					if (!value_written)
 					{
-						std::string calculated_key = typed_param.calcValueName(typed_param.getValue());
+						std::string calculated_key = it->calcValueName(key);
 						if (!parser.writeValue(calculated_key, name_stack))
 						{
 							break;
diff --git a/indra/llxuixml/llxuiparser.cpp b/indra/llxuixml/llxuiparser.cpp
index d4556113eaea1723a9e75d074ad10b3f68020e2e..878f9921783fb1a2b466f5d20b0af7085445accd 100644
--- a/indra/llxuixml/llxuiparser.cpp
+++ b/indra/llxuixml/llxuiparser.cpp
@@ -51,6 +51,14 @@ static 	LLInitParam::Parser::parser_read_func_map_t sXSDReadFuncs;
 static 	LLInitParam::Parser::parser_write_func_map_t sXSDWriteFuncs;
 static 	LLInitParam::Parser::parser_inspect_func_map_t sXSDInspectFuncs;
 
+static 	LLInitParam::Parser::parser_read_func_map_t sSimpleXUIReadFuncs;
+static 	LLInitParam::Parser::parser_write_func_map_t sSimpleXUIWriteFuncs;
+static 	LLInitParam::Parser::parser_inspect_func_map_t sSimpleXUIInspectFuncs;
+
+const char* NO_VALUE_MARKER = "no_value";
+
+const S32 LINE_NUMBER_HERE = 0;
+
 struct MaxOccur : public LLInitParam::ChoiceBlock<MaxOccur>
 {
 	Alternative<int> count;
@@ -1190,12 +1198,6 @@ struct ScopedFile
 
 	LLFILE* mFile;
 };
-static 	LLInitParam::Parser::parser_read_func_map_t sSimpleXUIReadFuncs;
-static 	LLInitParam::Parser::parser_write_func_map_t sSimpleXUIWriteFuncs;
-static 	LLInitParam::Parser::parser_inspect_func_map_t sSimpleXUIInspectFuncs;
-
-const char* NO_VALUE_MARKER = "no_value";
-
 LLSimpleXUIParser::LLSimpleXUIParser(LLSimpleXUIParser::element_start_callback_t element_cb)
 :	Parser(sSimpleXUIReadFuncs, sSimpleXUIWriteFuncs, sSimpleXUIInspectFuncs),
 	mCurReadDepth(0),
@@ -1300,6 +1302,11 @@ void LLSimpleXUIParser::characterDataHandler(void *userData, const char *s, int
 	self->characterData(s, len);
 }
 
+void LLSimpleXUIParser::characterData(const char *s, int len)
+{
+	mTextContents += std::string(s, len);
+}
+
 void LLSimpleXUIParser::startElement(const char *name, const char **atts)
 {
 	processText();
@@ -1372,6 +1379,37 @@ void LLSimpleXUIParser::startElement(const char *name, const char **atts)
 
 }
 
+void LLSimpleXUIParser::endElement(const char *name)
+{
+	bool has_text = processText();
+
+	// no text, attributes, or children
+	if (!has_text && mEmptyLeafNode.back())
+	{
+		// submit this as a valueless name (even though there might be text contents we haven't seen yet)
+		mCurAttributeValueBegin = NO_VALUE_MARKER;
+		mOutputStack.back().first->submitValue(mNameStack, *this, mParseSilently);
+	}
+
+	if (--mOutputStack.back().second == 0)
+	{
+		if (mOutputStack.empty())
+		{
+			LL_ERRS("ReadXUI") << "Parameter block output stack popped while empty." << LL_ENDL;
+		}
+		mOutputStack.pop_back();
+	}
+
+	S32 num_tokens_to_pop = mTokenSizeStack.back();
+	mTokenSizeStack.pop_back();
+	while(num_tokens_to_pop-- > 0)
+	{
+		mNameStack.pop_back();
+	}
+	mScope.pop_back();
+	mEmptyLeafNode.pop_back();
+}
+
 bool LLSimpleXUIParser::readAttributes(const char **atts)
 {
 	typedef boost::tokenizer<boost::char_separator<char> > tokenizer;
@@ -1421,43 +1459,6 @@ bool LLSimpleXUIParser::processText()
 	return false;
 }
 
-void LLSimpleXUIParser::endElement(const char *name)
-{
-	bool has_text = processText();
-
-	// no text, attributes, or children
-	if (!has_text && mEmptyLeafNode.back())
-	{
-		// submit this as a valueless name (even though there might be text contents we haven't seen yet)
-		mCurAttributeValueBegin = NO_VALUE_MARKER;
-		mOutputStack.back().first->submitValue(mNameStack, *this, mParseSilently);
-	}
-
-	if (--mOutputStack.back().second == 0)
-	{
-		if (mOutputStack.empty())
-		{
-			LL_ERRS("ReadXUI") << "Parameter block output stack popped while empty." << LL_ENDL;
-		}
-		mOutputStack.pop_back();
-	}
-
-	S32 num_tokens_to_pop = mTokenSizeStack.back();
-	mTokenSizeStack.pop_back();
-	while(num_tokens_to_pop-- > 0)
-	{
-		mNameStack.pop_back();
-	}
-	mScope.pop_back();
-	mEmptyLeafNode.pop_back();
-}
-
-void LLSimpleXUIParser::characterData(const char *s, int len)
-{
-	mTextContents += std::string(s, len);
-}
-
-
 /*virtual*/ std::string LLSimpleXUIParser::getCurrentElementName()
 {
 	std::string full_name;
@@ -1471,8 +1472,6 @@ void LLSimpleXUIParser::characterData(const char *s, int len)
 	return full_name;
 }
 
-const S32 LINE_NUMBER_HERE = 0;
-
 void LLSimpleXUIParser::parserWarning(const std::string& message)
 {
 #ifdef LL_WINDOWS
diff --git a/indra/newview/app_settings/commands.xml b/indra/newview/app_settings/commands.xml
index 391a864846bc16d47791e8e1cb0dee192d9ba84e..a44b895f7bcf1b79f486065ec9b8cb3ecf2cf447 100644
--- a/indra/newview/app_settings/commands.xml
+++ b/indra/newview/app_settings/commands.xml
@@ -10,7 +10,7 @@
            is_running_function="Floater.IsOpen"
            is_running_parameters="about_land"
            />
-  <command name="appearance"
+  <command name="appearance"  
            available_in_toybox="true"
            icon="Command_Appearance_Icon"
            label_ref="Command_Appearance_Label"
diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index 7396209e2734d8561ef4a0b30ef358a7030c17d6..3c53a9d44c3767aec23e9de601a076bdc165eb26 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -1836,7 +1836,7 @@
     <key>Type</key>
     <string>Boolean</string>
     <key>Value</key>
-    <integer>0</integer>
+    <integer>1</integer>
   </map>
     <key>Cursor3D</key>
     <map>
diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp
index 773e20eda700c3f45fdbd34b4cc2a30604ad7537..f8b204eca0eb6ceb3870114ee2124295d1e7118b 100755
--- a/indra/newview/llagent.cpp
+++ b/indra/newview/llagent.cpp
@@ -175,7 +175,9 @@ bool LLAgent::isActionAllowed(const LLSD& sdname)
 	}
 	else if (param == "speak")
 	{
-		if ( gAgent.isVoiceConnected() )
+		if ( gAgent.isVoiceConnected() && 
+			LLViewerParcelMgr::getInstance()->allowAgentVoice() &&
+				! LLVoiceClient::getInstance()->inTuningMode() )
 		{
 			retval = true;
 		}
@@ -305,13 +307,6 @@ LLAgent::LLAgent() :
 	mListener.reset(new LLAgentListener(*this));
 
 	mMoveTimer.stop();
-
-	LLViewerParcelMgr::getInstance()->addAgentParcelChangedCallback(boost::bind(&LLAgent::parcelChangedCallback));
-
-	LLUICtrl::EnableCallbackRegistry::currentRegistrar().add("Agent.IsActionAllowed", boost::bind(&LLAgent::isActionAllowed, _2));
-	LLUICtrl::CommitCallbackRegistry::currentRegistrar().add("Agent.PressMicrophone", boost::bind(&LLAgent::pressMicrophone, _2));
-	LLUICtrl::CommitCallbackRegistry::currentRegistrar().add("Agent.ReleaseMicrophone", boost::bind(&LLAgent::releaseMicrophone, _2));
-	LLUICtrl::EnableCallbackRegistry::currentRegistrar().add("Agent.IsMicrophoneOn", boost::bind(&LLAgent::isMicrophoneOn, _2));
 }
 
 // Requires gSavedSettings to be initialized.
@@ -333,6 +328,14 @@ void LLAgent::init()
 
 	gSavedSettings.getControl("PreferredMaturity")->getValidateSignal()->connect(boost::bind(&LLAgent::validateMaturity, this, _2));
 	gSavedSettings.getControl("PreferredMaturity")->getSignal()->connect(boost::bind(&LLAgent::handleMaturity, this, _2));
+
+	LLViewerParcelMgr::getInstance()->addAgentParcelChangedCallback(boost::bind(&LLAgent::parcelChangedCallback));
+
+	LLUICtrl::EnableCallbackRegistry::currentRegistrar().add("Agent.IsActionAllowed", boost::bind(&LLAgent::isActionAllowed, _2));
+	LLUICtrl::CommitCallbackRegistry::currentRegistrar().add("Agent.PressMicrophone", boost::bind(&LLAgent::pressMicrophone, _2));
+	LLUICtrl::CommitCallbackRegistry::currentRegistrar().add("Agent.ReleaseMicrophone", boost::bind(&LLAgent::releaseMicrophone, _2));
+	LLUICtrl::EnableCallbackRegistry::currentRegistrar().add("Agent.IsMicrophoneOn", boost::bind(&LLAgent::isMicrophoneOn, _2));
+
 	
 	mInitialized = TRUE;
 }
diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp
index e38f86d0fc9f5708c225e9024eb9308440a98cee..ecfd101eebf2377263dccf11fd879829abff5270 100644
--- a/indra/newview/llappviewer.cpp
+++ b/indra/newview/llappviewer.cpp
@@ -89,6 +89,7 @@
 #include "llweb.h"
 #include "llsecondlifeurls.h"
 #include "llupdaterservice.h"
+#include "llcallfloater.h"
 
 // Linden library includes
 #include "llavatarnamecache.h"
@@ -112,6 +113,7 @@
 #include <boost/foreach.hpp>
 
 
+
 #if LL_WINDOWS
 #	include <share.h> // For _SH_DENYWR in initMarkerFile
 #else
@@ -1183,6 +1185,7 @@ bool LLAppViewer::mainLoop()
 
 	LLVoiceChannel::initClass();
 	LLVoiceClient::getInstance()->init(gServicePump);
+	LLVoiceChannel::setCurrentVoiceChannelChangedCallback(boost::bind(&LLCallFloater::sOnCurrentChannelChanged, _1), true);
 	LLTimer frameTimer,idleTimer;
 	LLTimer debugTime;
 	LLViewerJoystick* joystick(LLViewerJoystick::getInstance());
diff --git a/indra/newview/llcallfloater.cpp b/indra/newview/llcallfloater.cpp
index cc2a189b7628954b21b4084c1ef5f2c4ab7d775d..e3217668c540eda7e0895051f03f533cdb5e8bae 100644
--- a/indra/newview/llcallfloater.cpp
+++ b/indra/newview/llcallfloater.cpp
@@ -44,6 +44,7 @@
 #include "llparticipantlist.h"
 #include "llspeakers.h"
 #include "lltextutil.h"
+#include "lltransientfloatermgr.h"
 #include "llviewercontrol.h"
 #include "llviewerdisplayname.h"
 #include "llviewerwindow.h"
@@ -96,7 +97,7 @@ static void* create_non_avatar_caller(void*)
 LLVoiceChannel* LLCallFloater::sCurrentVoiceChannel = NULL;
 
 LLCallFloater::LLCallFloater(const LLSD& key)
-: LLFloater(key)
+: LLTransientDockableFloater(NULL, false, key)
 , mSpeakerManager(NULL)
 , mParticipants(NULL)
 , mAvatarList(NULL)
@@ -112,6 +113,7 @@ LLCallFloater::LLCallFloater(const LLSD& key)
 
 	mFactoryMap["non_avatar_caller"] = LLCallbackMap(create_non_avatar_caller, NULL);
 	LLVoiceClient::instance().addObserver(this);
+	LLTransientFloaterMgr::getInstance()->addControlView(this);
 
 	// update the agent's name if display name setting change
 	LLAvatarNameCache::addUseDisplayNamesCallback(boost::bind(&LLCallFloater::updateAgentModeratorState, this));
@@ -134,6 +136,7 @@ LLCallFloater::~LLCallFloater()
 	{
 		LLVoiceClient::getInstance()->removeObserver(this);
 	}
+	LLTransientFloaterMgr::getInstance()->removeControlView(this);
 }
 
 // virtual
@@ -151,10 +154,6 @@ BOOL LLCallFloater::postBuild()
 
 	connectToChannel(LLVoiceChannel::getCurrentVoiceChannel());
 
-	setIsChrome(true);
-	//chrome="true" hides floater caption 
-	if (mDragHandle)
-		mDragHandle->setTitleVisible(TRUE);
 	updateTransparency(TT_ACTIVE); // force using active floater transparency (STORM-730)
 	
 	updateSession();
diff --git a/indra/newview/llcallfloater.h b/indra/newview/llcallfloater.h
index 7282f7a8be98c0eb25500b80ba63d9830b4bfd28..00a3f76e5679d53ee2908cff0ab9776ebe04e289 100644
--- a/indra/newview/llcallfloater.h
+++ b/indra/newview/llcallfloater.h
@@ -28,7 +28,7 @@
 #ifndef LL_LLCALLFLOATER_H
 #define LL_LLCALLFLOATER_H
 
-#include "llfloater.h"
+#include "lltransientdockablefloater.h"
 #include "llvoicechannel.h"
 #include "llvoiceclient.h"
 
@@ -52,7 +52,7 @@ class LLSpeakersDelayActionsStorage;
  * When the Resident is engaged in any chat except Nearby Chat, the Voice Control Panel
  * also provides a 'Leave Call' button to allow the Resident to leave that voice channel.
  */
-class LLCallFloater : public LLFloater, LLVoiceClientParticipantObserver
+class LLCallFloater : public LLTransientDockableFloater, LLVoiceClientParticipantObserver
 {
 public:
 
@@ -262,6 +262,9 @@ class LLCallFloater : public LLFloater, LLVoiceClientParticipantObserver
 	 */
 	static LLVoiceChannel* sCurrentVoiceChannel;
 
+	/* virtual */
+	LLTransientFloaterMgr::ETransientGroup getGroup() { return LLTransientFloaterMgr::IM; }
+
 	boost::signals2::connection mVoiceChannelStateChangeConnection;
 };
 
diff --git a/indra/newview/lldebugview.cpp b/indra/newview/lldebugview.cpp
index cc6ba05e7e197f5e2da6e723c48d243c64cd2f7e..ba511a36931f9cf85b62285b90c456a2297ca5c8 100644
--- a/indra/newview/lldebugview.cpp
+++ b/indra/newview/lldebugview.cpp
@@ -147,3 +147,12 @@ LLDebugView::~LLDebugView()
 	gTextureCategoryView = NULL;
 }
 
+void LLDebugView::draw()
+{
+	LLView* floater_snap_region = getRootView()->getChildView("floater_snap_region");
+	LLRect debug_rect;
+	floater_snap_region->localRectToOtherView(floater_snap_region->getLocalRect(), &debug_rect, getParent());
+
+	setShape(debug_rect);
+	LLView::draw();
+}
diff --git a/indra/newview/lldebugview.h b/indra/newview/lldebugview.h
index 20262fc89e5a9042c839331893c057a5cdd2982d..907a42c981eae3f7b28682de8e0bffac42195745 100644
--- a/indra/newview/lldebugview.h
+++ b/indra/newview/lldebugview.h
@@ -55,6 +55,7 @@ class LLDebugView : public LLView
 	~LLDebugView();
 
 	void init();
+	void draw();
 
 	void setStatsVisible(BOOL visible);
 	
diff --git a/indra/newview/llfloatercamera.cpp b/indra/newview/llfloatercamera.cpp
index aa78bc4f2921375c5c397308f2e42d884fe9d93f..b33dea4890fabbe6bfb219b15781f341539c3944 100644
--- a/indra/newview/llfloatercamera.cpp
+++ b/indra/newview/llfloatercamera.cpp
@@ -347,13 +347,12 @@ LLFloaterCamera::LLFloaterCamera(const LLSD& val)
 	mPrevMode(CAMERA_CTRL_MODE_PAN)
 {
 	LLHints::registerHintTarget("view_popup", LLView::getHandle());
+	mCommitCallbackRegistrar.add("CameraPresets.ChangeView", boost::bind(&LLFloaterCamera::onClickCameraItem, _2));
 }
 
 // virtual
 BOOL LLFloaterCamera::postBuild()
 {
-	setIsChrome(TRUE);
-	setTitleVisible(TRUE); // restore title visibility after chrome applying
 	updateTransparency(TT_ACTIVE); // force using active floater transparency (STORM-730)
 
 	mRotate = getChild<LLJoystickCameraRotate>(ORBIT);
diff --git a/indra/newview/llfloaterhud.cpp b/indra/newview/llfloaterhud.cpp
index 4181d1906e55a652d6d689fbf51a949a139f0622..58c76a0b85efe08995e93a231de8c706bc98f549 100644
--- a/indra/newview/llfloaterhud.cpp
+++ b/indra/newview/llfloaterhud.cpp
@@ -54,14 +54,6 @@ LLFloaterHUD::LLFloaterHUD(const LLSD& key)
 		return;
 	}
 	
-	// Don't grab the focus as it will impede performing in-world actions
-	// while using the HUD
-	setIsChrome(TRUE);
-
-	// Chrome doesn't show the window title by default, but here we
-	// want to show it.
-	setTitleVisible(true);
-	
 	// Opaque background since we never get the focus
 	setBackgroundOpaque(TRUE);
 }
diff --git a/indra/newview/llfloaterinventory.cpp b/indra/newview/llfloaterinventory.cpp
index df769bdd8852d8de09767559ea9aee7db4b0589c..9b9b90e5219481452c72e69553fd56d7f2c04c03 100644
--- a/indra/newview/llfloaterinventory.cpp
+++ b/indra/newview/llfloaterinventory.cpp
@@ -98,3 +98,12 @@ void LLFloaterInventory::onOpen(const LLSD& key)
 {
 	//LLFirstUse::useInventory();
 }
+
+void LLFloaterInventory::onClose(bool app_quitting)
+{
+	LLFloater::onClose(app_quitting);
+	if (mKey.asInteger() > 1)
+	{
+		destroy();
+	}
+}
diff --git a/indra/newview/llfloaterinventory.h b/indra/newview/llfloaterinventory.h
index f59a015b07f7499bfad26eb6ccd850a35e5355a7..823c4903b42d1b2672abccc64179bd78d4f6d837 100644
--- a/indra/newview/llfloaterinventory.h
+++ b/indra/newview/llfloaterinventory.h
@@ -58,6 +58,7 @@ class LLFloaterInventory : public LLFloater
 
 	// Inherited functionality
 	/*virtual*/ void onOpen(const LLSD& key);
+	/*virtual*/ void onClose(bool app_quitting);
 
 	LLInventoryPanel* getPanel();
 	LLPanelMainInventory* getMainInventoryPanel() { return mPanelMainInventory;}
diff --git a/indra/newview/llfloatermap.cpp b/indra/newview/llfloatermap.cpp
index 871351305425c1ce1a6dfeb078a7e977627ea39b..a65e9e911a9fb91c6624361ff377ffbace99bbdc 100644
--- a/indra/newview/llfloatermap.cpp
+++ b/indra/newview/llfloatermap.cpp
@@ -105,9 +105,6 @@ BOOL LLFloaterMap::postBuild()
 	// Get the drag handle all the way in back
 	sendChildToBack(getDragHandle());
 
-	//setIsChrome(TRUE);
-	//getDragHandle()->setTitleVisible(TRUE);
-	
 	// keep onscreen
 	gFloaterView->adjustToFitScreen(this, FALSE);
 
diff --git a/indra/newview/llfloatersounddevices.cpp b/indra/newview/llfloatersounddevices.cpp
index 56c08065467922891df3c93139c4d2e431085dc2..72c077d2156b5b323046c4dcc4c6b16845cbfec2 100644
--- a/indra/newview/llfloatersounddevices.cpp
+++ b/indra/newview/llfloatersounddevices.cpp
@@ -55,9 +55,6 @@ BOOL LLFloaterSoundDevices::postBuild()
 {
 	LLTransientDockableFloater::postBuild();
 
-	setIsChrome(TRUE);
-	if (mDragHandle)
-		mDragHandle->setTitleVisible(TRUE);
 	updateTransparency(TT_ACTIVE); // force using active floater transparency (STORM-730)
 
 	LLPanelVoiceDeviceSettings* panel = findChild<LLPanelVoiceDeviceSettings>("device_settings_panel");
diff --git a/indra/newview/llfloatertoybox.cpp b/indra/newview/llfloatertoybox.cpp
index b4c989427165435031395403d8d58994cf72bb9b..66f644748eaef62735a83c1549a24f53d930bd15 100644
--- a/indra/newview/llfloatertoybox.cpp
+++ b/indra/newview/llfloatertoybox.cpp
@@ -39,7 +39,6 @@
 
 LLFloaterToybox::LLFloaterToybox(const LLSD& key)
 	: LLFloater(key)
-	, mBtnRestoreDefaults(NULL)
 	, mToolBar(NULL)
 {
 	mCommitCallbackRegistrar.add("Toybox.RestoreDefaults", boost::bind(&LLFloaterToybox::onBtnRestoreDefaults, this));
@@ -59,20 +58,19 @@ bool compare_localized_command_labels(LLCommand * cmd1, LLCommand * cmd2)
 
 BOOL LLFloaterToybox::postBuild()
 {	
-	mBtnRestoreDefaults = getChild<LLButton>("btn_restore_defaults");
 	mToolBar = getChild<LLToolBar>("toybox_toolbar");
+
 	mToolBar->setStartDragCallback(boost::bind(LLToolBarView::startDragTool,_1,_2,_3));
 	mToolBar->setHandleDragCallback(boost::bind(LLToolBarView::handleDragTool,_1,_2,_3,_4));
 	mToolBar->setHandleDropCallback(boost::bind(LLToolBarView::handleDropTool,_1,_2,_3,_4));
 	
-	LLCommandManager& cmdMgr = LLCommandManager::instance();
-
 	//
 	// Sort commands by localized labels so they will appear alphabetized in all languages
 	//
 
 	std::list<LLCommand *> alphabetized_commands;
 
+	LLCommandManager& cmdMgr = LLCommandManager::instance();
 	for (U32 i = 0; i < cmdMgr.commandCount(); i++)
 	{
 		LLCommand * command = cmdMgr.getCommand(i);
diff --git a/indra/newview/llfloatertoybox.h b/indra/newview/llfloatertoybox.h
index f0a6cf1a8be509c7f355dea29d3a23b86035cbb1..62bf68680dafd73afb32d6e4e2df17ea07531a1e 100644
--- a/indra/newview/llfloatertoybox.h
+++ b/indra/newview/llfloatertoybox.h
@@ -53,7 +53,6 @@ class LLFloaterToybox : public LLFloater
 	void onBtnRestoreDefaults();
 
 public:
-	LLButton *	mBtnRestoreDefaults;
 	LLToolBar *	mToolBar;
 };
 
diff --git a/indra/newview/llhudeffectblob.cpp b/indra/newview/llhudeffectblob.cpp
index d8687eed8db022ba8267a0863b73c231d1d1b0db..c909551b51755d2725f62597e712e1e88932fce5 100644
--- a/indra/newview/llhudeffectblob.cpp
+++ b/indra/newview/llhudeffectblob.cpp
@@ -44,12 +44,20 @@ LLHUDEffectBlob::~LLHUDEffectBlob()
 {
 }
 
+void LLHUDEffectBlob::markDead()
+{
+	mImage = NULL;
+
+	LLHUDEffect::markDead();
+}
+
 void LLHUDEffectBlob::render()
 {
 	F32 time = mTimer.getElapsedTimeF32();
 	if (mDuration < time)
 	{
 		markDead();
+		return;
 	}
 
 	LLVector3 pos_agent = gAgent.getPosAgentFromGlobal(mPositionGlobal);
diff --git a/indra/newview/llhudeffectblob.h b/indra/newview/llhudeffectblob.h
index f4c1691108fded588d05c7c4335f275f0b28e32d..ce3e8500fc180d6b98d12c33769e0fdd95a3be91 100644
--- a/indra/newview/llhudeffectblob.h
+++ b/indra/newview/llhudeffectblob.h
@@ -35,6 +35,8 @@ class LLHUDEffectBlob : public LLHUDEffect
 public:
 	friend class LLHUDObject;
 
+	void markDead();
+
 	void setPixelSize(S32 pixels) { mPixelSize = pixels; }
 
 protected:
diff --git a/indra/newview/llnearbychat.cpp b/indra/newview/llnearbychat.cpp
index 67d745248fe87b0eb246179ccfccb85b0f2ab51e..341846219205281a4466084d3c4fdc8f39c84190 100644
--- a/indra/newview/llnearbychat.cpp
+++ b/indra/newview/llnearbychat.cpp
@@ -214,9 +214,10 @@ void LLNearbyChat::updateChatHistoryStyle()
 //static 
 void LLNearbyChat::processChatHistoryStyleUpdate(const LLSD& newvalue)
 {
-	//LLNearbyChat* nearby_chat = LLFloaterReg::getTypedInstance<LLNearbyChat>("nearby_chat", LLSD());
-	//if(nearby_chat)
-	//	nearby_chat->updateChatHistoryStyle();
+	LLFloater* chat_bar = LLFloaterReg::getInstance("chat_bar");
+	LLNearbyChat* nearby_chat = chat_bar->findChild<LLNearbyChat>("nearby_chat");
+	if(nearby_chat)
+		nearby_chat->updateChatHistoryStyle();
 }
 
 bool isWordsName(const std::string& name)
diff --git a/indra/newview/llnearbychatbar.cpp b/indra/newview/llnearbychatbar.cpp
index 3e4228cfb64eb6eca052f8104696e33013c4fe28..a8113322618d4058a1317e1acfeeab3bc223a037 100644
--- a/indra/newview/llnearbychatbar.cpp
+++ b/indra/newview/llnearbychatbar.cpp
@@ -53,6 +53,8 @@
 S32 LLNearbyChatBar::sLastSpecialChatChannel = 0;
 
 const S32 EXPANDED_HEIGHT = 300;
+const S32 COLLAPSED_HEIGHT = 60;
+const S32 EXPANDED_MIN_HEIGHT = 150;
 
 // legacy callback glue
 void send_chat_from_viewer(const std::string& utf8_out_text, EChatType type, S32 channel);
@@ -102,7 +104,7 @@ BOOL LLNearbyChatBar::postBuild()
 	// Register for font change notifications
 	LLViewerChat::setFontChangedCallback(boost::bind(&LLNearbyChatBar::onChatFontChange, this, _1));
 
-	mExpandedHeight = getMinHeight() + EXPANDED_HEIGHT;
+	mExpandedHeight = COLLAPSED_HEIGHT + EXPANDED_HEIGHT;
 
 	enableResizeCtrls(true, true, false);
 
@@ -112,14 +114,19 @@ BOOL LLNearbyChatBar::postBuild()
 bool LLNearbyChatBar::applyRectControl()
 {
 	bool rect_controlled = LLFloater::applyRectControl();
-	
-	if (getRect().getHeight() > getMinHeight())
+
+	LLView* nearby_chat = getChildView("nearby_chat");	
+	if (!nearby_chat->getVisible())
+	{
+		reshape(getRect().getWidth(), getMinHeight());
+		enableResizeCtrls(true, true, false);
+	}
+	else
 	{
-		getChildView("nearby_chat")->setVisible(true);
-		mExpandedHeight = getRect().getHeight();
 		enableResizeCtrls(true);
+		setResizeLimits(getMinWidth(), EXPANDED_MIN_HEIGHT);
 	}
-
+	
 	return rect_controlled;
 }
 
@@ -373,15 +380,19 @@ void LLNearbyChatBar::onToggleNearbyChatPanel()
 	if (nearby_chat->getVisible())
 	{
 		mExpandedHeight = getRect().getHeight();
+		setResizeLimits(getMinWidth(), COLLAPSED_HEIGHT);
 		nearby_chat->setVisible(FALSE);
-		reshape(getRect().getWidth(), getMinHeight());
+		reshape(getRect().getWidth(), COLLAPSED_HEIGHT);
 		enableResizeCtrls(true, true, false);
+		storeRectControl();
 	}
 	else
 	{
 		nearby_chat->setVisible(TRUE);
+		setResizeLimits(getMinWidth(), EXPANDED_MIN_HEIGHT);
 		reshape(getRect().getWidth(), mExpandedHeight);
 		enableResizeCtrls(true);
+		storeRectControl();
 	}
 }
 
diff --git a/indra/newview/llpanelteleporthistory.cpp b/indra/newview/llpanelteleporthistory.cpp
index 79171dbcb9297d9d74106de47a7e16ad3f7297f9..d3543daff082defd48068ea6a8cc6e9c3192c920 100644
--- a/indra/newview/llpanelteleporthistory.cpp
+++ b/indra/newview/llpanelteleporthistory.cpp
@@ -389,6 +389,7 @@ LLTeleportHistoryPanel::~LLTeleportHistoryPanel()
 {
 	LLTeleportHistoryFlatItemStorage::instance().purge();
 	delete mGearMenuHandle.get();
+	mTeleportHistoryChangedConnection.disconnect();
 }
 
 BOOL LLTeleportHistoryPanel::postBuild()
@@ -679,29 +680,32 @@ void LLTeleportHistoryPanel::refresh()
 			// tab_boundary_date would be earliest possible date for this tab
 			S32 tab_idx = 0;
 			getNextTab(date, tab_idx, tab_boundary_date);
-
-			LLAccordionCtrlTab* tab = mItemContainers.get(mItemContainers.size() - 1 - tab_idx);
-			tab->setVisible(true);
-
-			// Expand all accordion tabs when filtering
-			if(!sFilterSubString.empty())
+			tab_idx = mItemContainers.size() - 1 - tab_idx;
+			if (tab_idx >= 0)
 			{
-				//store accordion tab state when filter is not empty
-				tab->notifyChildren(LLSD().with("action","store_state"));
-				
-				tab->setDisplayChildren(true);
-			}
-			// Restore each tab's expand state when not filtering
-			else
-			{
-				bool collapsed = isAccordionCollapsedByUser(tab);
-				tab->setDisplayChildren(!collapsed);
+				LLAccordionCtrlTab* tab = mItemContainers.get(tab_idx);
+				tab->setVisible(true);
+
+				// Expand all accordion tabs when filtering
+				if(!sFilterSubString.empty())
+				{
+					//store accordion tab state when filter is not empty
+					tab->notifyChildren(LLSD().with("action","store_state"));
 				
-				//restore accordion state after all those accodrion tabmanipulations
-				tab->notifyChildren(LLSD().with("action","restore_state"));
-			}
+					tab->setDisplayChildren(true);
+				}
+				// Restore each tab's expand state when not filtering
+				else
+				{
+					bool collapsed = isAccordionCollapsedByUser(tab);
+					tab->setDisplayChildren(!collapsed);
+			
+					//restore accordion state after all those accodrion tabmanipulations
+					tab->notifyChildren(LLSD().with("action","restore_state"));
+				}
 
-			curr_flat_view = getFlatListViewFromTab(tab);
+				curr_flat_view = getFlatListViewFromTab(tab);
+			}
 		}
 
 		if (curr_flat_view)
@@ -760,7 +764,12 @@ void LLTeleportHistoryPanel::onTeleportHistoryChange(S32 removed_index)
 void LLTeleportHistoryPanel::replaceItem(S32 removed_index)
 {
 	// Flat list for 'Today' (mItemContainers keeps accordion tabs in reverse order)
-	LLFlatListView* fv = getFlatListViewFromTab(mItemContainers[mItemContainers.size() - 1]);
+	LLFlatListView* fv = NULL;
+	
+	if (mItemContainers.size() > 0)
+	{
+		fv = getFlatListViewFromTab(mItemContainers[mItemContainers.size() - 1]);
+	}
 
 	// Empty flat list for 'Today' means that other flat lists are empty as well,
 	// so all items from teleport history should be added.
@@ -828,19 +837,27 @@ void LLTeleportHistoryPanel::showTeleportHistory()
 
 	// Starting to add items from last one, in reverse order,
 	// since TeleportHistory keeps most recent item at the end
+	if (!mTeleportHistory)
+	{
+		mTeleportHistory = LLTeleportHistoryStorage::getInstance();
+	}
+
 	mCurrentItem = mTeleportHistory->getItems().size() - 1;
 
 	for (S32 n = mItemContainers.size() - 1; n >= 0; --n)
 	{
 		LLAccordionCtrlTab* tab = mItemContainers.get(n);
-		tab->setVisible(false);
-
-		LLFlatListView* fv = getFlatListViewFromTab(tab);
-		if (fv)
+		if (tab)
 		{
-			// Detached panels are managed by LLTeleportHistoryFlatItemStorage
-			std::vector<LLPanel*> detached_items;
-			fv->detachItems(detached_items);
+			tab->setVisible(false);
+
+			LLFlatListView* fv = getFlatListViewFromTab(tab);
+			if (fv)
+			{
+				// Detached panels are managed by LLTeleportHistoryFlatItemStorage
+				std::vector<LLPanel*> detached_items;
+				fv->detachItems(detached_items);
+			}
 		}
 	}
 }
diff --git a/indra/newview/llteleporthistory.cpp b/indra/newview/llteleporthistory.cpp
index 0d8b45db1fe52111b4f3729690ebd4231945ef54..50a088b79979c260f6bfaff291ef8c9b9296ae49 100644
--- a/indra/newview/llteleporthistory.cpp
+++ b/indra/newview/llteleporthistory.cpp
@@ -56,7 +56,8 @@ const std::string& LLTeleportHistoryItem::getTitle() const
 LLTeleportHistory::LLTeleportHistory():
 	mCurrentItem(-1),
 	mRequestedItem(-1),
-	mGotInitialUpdate(false)
+	mGotInitialUpdate(false),
+	mTeleportHistoryStorage(NULL)
 {
 	mTeleportFinishedConn = LLViewerParcelMgr::getInstance()->
 		setTeleportFinishedCallback(boost::bind(&LLTeleportHistory::updateCurrentLocation, this, _1));
@@ -115,6 +116,10 @@ void LLTeleportHistory::handleLoginComplete()
 
 void LLTeleportHistory::updateCurrentLocation(const LLVector3d& new_pos)
 {
+	if (!mTeleportHistoryStorage)
+	{
+		mTeleportHistoryStorage = LLTeleportHistoryStorage::getInstance();
+	}
 	if (mRequestedItem != -1) // teleport within the history in progress?
 	{
 		mCurrentItem = mRequestedItem;
@@ -152,7 +157,7 @@ void LLTeleportHistory::updateCurrentLocation(const LLVector3d& new_pos)
 		if (mCurrentItem < 0 || mCurrentItem >= (int) mItems.size()) // sanity check
 		{
 			llwarns << "Invalid current item. (this should not happen)" << llendl;
-			llassert(!"Invalid current teleport histiry item");
+			llassert(!"Invalid current teleport history item");
 			return;
 		}
 		LLVector3 new_pos_local = gAgent.getPosAgentFromGlobal(new_pos);
diff --git a/indra/newview/llteleporthistory.h b/indra/newview/llteleporthistory.h
index e45dc28f9b4bc42fa695f24f39502427174ab246..e9c29c39bf3e945d91a57f4260d8ad705919f56d 100644
--- a/indra/newview/llteleporthistory.h
+++ b/indra/newview/llteleporthistory.h
@@ -33,6 +33,7 @@
 #include <string>
 #include <boost/function.hpp>
 #include <boost/signals2.hpp>
+#include "llteleporthistorystorage.h"
 
 
 /**
@@ -210,6 +211,8 @@ class LLTeleportHistory: public LLSingleton<LLTeleportHistory>
 	 */
 	bool					mGotInitialUpdate;
 	
+	LLTeleportHistoryStorage*	mTeleportHistoryStorage;
+
 	/**
 	 * Signal emitted when the history gets changed.
 	 * 
diff --git a/indra/newview/llteleporthistorystorage.cpp b/indra/newview/llteleporthistorystorage.cpp
index 0ba455e7d5b5de3b90c0844ce1eabf3f6eeff2c6..af5a047da4d974c4d77f5e0e78fcefc37977b4fa 100644
--- a/indra/newview/llteleporthistorystorage.cpp
+++ b/indra/newview/llteleporthistorystorage.cpp
@@ -66,6 +66,7 @@ struct LLSortItemsByDate
 LLTeleportHistoryStorage::LLTeleportHistoryStorage() :
 	mFilename("teleport_history.txt")
 {
+	mItems.clear();
 	LLTeleportHistory *th = LLTeleportHistory::getInstance();
 	if (th)
 		th->setHistoryChangedCallback(boost::bind(&LLTeleportHistoryStorage::onTeleportHistoryChange, this));	
diff --git a/indra/newview/llteleporthistorystorage.h b/indra/newview/llteleporthistorystorage.h
index 6cae0a345477ebbfeb69e988923a4ac3f91fce1a..cf4c85a9910106a91c9f69be4cfe62dea049cb0a 100644
--- a/indra/newview/llteleporthistorystorage.h
+++ b/indra/newview/llteleporthistorystorage.h
@@ -93,9 +93,6 @@ class LLTeleportHistoryStorage: public LLSingleton<LLTeleportHistoryStorage>
 	void removeItem(S32 idx);
 
 	void save();
-	void load();
-
-	void dump() const;
 
 	/**
 	 * Set a callback to be called upon history changes.
@@ -113,6 +110,9 @@ class LLTeleportHistoryStorage: public LLSingleton<LLTeleportHistoryStorage>
 
 private:
 
+	void load();
+	void dump() const;
+	
 	void onTeleportHistoryChange();
 	bool compareByTitleAndGlobalPos(const LLTeleportHistoryPersistentItem& a, const LLTeleportHistoryPersistentItem& b);
 
diff --git a/indra/newview/lltoastnotifypanel.cpp b/indra/newview/lltoastnotifypanel.cpp
index 6873cf058aed7179d46003050fe7fcbc4f111e1d..de305bf3d9d3de96586d68e4c8fb7845509577c4 100644
--- a/indra/newview/lltoastnotifypanel.cpp
+++ b/indra/newview/lltoastnotifypanel.cpp
@@ -91,8 +91,6 @@ mCloseNotificationOnDestroy(true)
 		sFont = LLFontGL::getFontSansSerif();
 		sFontSmall = LLFontGL::getFontSansSerifSmall();
 	}
-	// clicking on a button does not steal current focus
-	setIsChrome(TRUE);
 	// initialize
 	setFocusRoot(!mIsTip);
 	// get a form for the notification
diff --git a/indra/newview/lltoolbarview.cpp b/indra/newview/lltoolbarview.cpp
index 21e682f0728e528c179830c1cbd09aae5b28b9b5..619d17efad4b5f803d1be4fe3da4849d7a4406bd 100644
--- a/indra/newview/lltoolbarview.cpp
+++ b/indra/newview/lltoolbarview.cpp
@@ -29,6 +29,7 @@
 
 #include "lltoolbarview.h"
 
+#include "llappviewer.h"
 #include "lldir.h"
 #include "llxmlnode.h"
 #include "lltoolbar.h"
@@ -36,12 +37,18 @@
 #include "lltooldraganddrop.h"
 #include "llclipboard.h"
 
+#include "llagent.h"  // HACK for destinations guide on startup
+#include "llfloaterreg.h"  // HACK for destinations guide on startup
+#include "llviewercontrol.h"  // HACK for destinations guide on startup
+
 #include <boost/foreach.hpp>
 
 LLToolBarView* gToolBarView = NULL;
 
 static LLDefaultChildRegistry::Register<LLToolBarView> r("toolbar_view");
 
+void handleLoginToolbarSetup();
+
 bool isToolDragged()
 {
 	return (LLToolDragAndDrop::getInstance()->getSource() == LLToolDragAndDrop::SOURCE_VIEWER);
@@ -63,7 +70,9 @@ LLToolBarView::LLToolBarView(const LLToolBarView::Params& p)
 :	LLUICtrl(p),
 	mToolbarLeft(NULL),
 	mToolbarRight(NULL),
-	mToolbarBottom(NULL)
+	mToolbarBottom(NULL),
+	mDragStarted(false),
+	mDragToolbarButton(NULL)
 {
 }
 
@@ -95,6 +104,8 @@ BOOL LLToolBarView::postBuild()
 	mToolbarBottom->setStartDragCallback(boost::bind(LLToolBarView::startDragTool,_1,_2,_3));
 	mToolbarBottom->setHandleDragCallback(boost::bind(LLToolBarView::handleDragTool,_1,_2,_3,_4));
 	mToolbarBottom->setHandleDropCallback(boost::bind(LLToolBarView::handleDropTool,_1,_2,_3,_4));
+
+	LLAppViewer::instance()->setOnLoginCompletedCallback(boost::bind(&handleLoginToolbarSetup));
 	
 	return TRUE;
 }
@@ -126,7 +137,7 @@ bool LLToolBarView::addCommand(const LLCommandId& command, LLToolBar* toolbar)
 	}
 	else 
 	{
-		llwarns	<< "Toolbars creation : the command " << command.name() << " cannot be found in the command manager" << llendl;
+		llwarns	<< "Toolbars creation : the command with id " << command.uuid().asString() << " cannot be found in the command manager" << llendl;
 		return false;
 	}
 	return true;
@@ -191,9 +202,12 @@ bool LLToolBarView::loadToolbars(bool force_default)
 			LLToolBarEnums::ButtonType button_type = toolbar_set.left_toolbar.button_display_mode;
 			mToolbarLeft->setButtonType(button_type);
 		}
-		BOOST_FOREACH(LLCommandId::Params& command, toolbar_set.left_toolbar.commands)
+		BOOST_FOREACH(const LLCommandId::Params& command_name_param, toolbar_set.left_toolbar.commands)
 		{
-			addCommand(LLCommandId(command),mToolbarLeft);
+			if (addCommand(LLCommandId(command_name_param), mToolbarLeft) == false)
+			{
+				llwarns << "Error adding command '" << command_name_param.name() << "' to left toolbar." << llendl;
+			}
 		}
 	}
 	if (toolbar_set.right_toolbar.isProvided() && mToolbarRight)
@@ -203,9 +217,12 @@ bool LLToolBarView::loadToolbars(bool force_default)
 			LLToolBarEnums::ButtonType button_type = toolbar_set.right_toolbar.button_display_mode;
 			mToolbarRight->setButtonType(button_type);
 		}
-		BOOST_FOREACH(LLCommandId::Params& command, toolbar_set.right_toolbar.commands)
+		BOOST_FOREACH(const LLCommandId::Params& command_name_param, toolbar_set.right_toolbar.commands)
 		{
-			addCommand(LLCommandId(command),mToolbarRight);
+			if (addCommand(LLCommandId(command_name_param), mToolbarRight) == false)
+			{
+				llwarns << "Error adding command '" << command_name_param.name() << "' to right toolbar." << llendl;
+			}
 		}
 	}
 	if (toolbar_set.bottom_toolbar.isProvided() && mToolbarBottom)
@@ -215,9 +232,12 @@ bool LLToolBarView::loadToolbars(bool force_default)
 			LLToolBarEnums::ButtonType button_type = toolbar_set.bottom_toolbar.button_display_mode;
 			mToolbarBottom->setButtonType(button_type);
 		}
-		BOOST_FOREACH(LLCommandId::Params& command, toolbar_set.bottom_toolbar.commands)
+		BOOST_FOREACH(const LLCommandId::Params& command_name_param, toolbar_set.bottom_toolbar.commands)
 		{
-			addCommand(LLCommandId(command),mToolbarBottom);
+			if (addCommand(LLCommandId(command_name_param), mToolbarBottom) == false)
+			{
+				llwarns << "Error adding command '" << command_name_param.name() << "' to bottom toolbar." << llendl;
+			}
 		}
 	}
 	return true;
@@ -278,13 +298,19 @@ void LLToolBarView::saveToolbars() const
 // Enumerate the commands in command_list and add them as Params to the toolbar
 void LLToolBarView::addToToolset(command_id_list_t& command_list, Toolbar& toolbar) const
 {
+	LLCommandManager& mgr = LLCommandManager::instance();
+
 	for (command_id_list_t::const_iterator it = command_list.begin();
 		 it != command_list.end();
 		 ++it)
 	{
-		LLCommandId::Params command;
-		command.name = it->name();		
-		toolbar.commands.add(command);
+		LLCommand* command = mgr.getCommand(*it);
+		if (command)
+		{
+			LLCommandId::Params command_name_param;
+			command_name_param.name = command->name();
+			toolbar.commands.add(command_name_param);
+		}
 	}
 }
 
@@ -328,13 +354,11 @@ void LLToolBarView::draw()
 // ----------------------------------------
 
 
-void LLToolBarView::startDragTool( S32 x, S32 y, const LLUUID& uuid)
+void LLToolBarView::startDragTool(S32 x, S32 y, LLToolBarButton* button)
 {
+	resetDragTool(button);
+
 	// Flag the tool dragging but don't start it yet
-	gToolBarView->mDragStarted = false;
-	gToolBarView->mDragCommand = LLCommandId::null;
-	gToolBarView->mDragRank = LLToolBar::RANK_NONE;
-	gToolBarView->mDragToolbar = NULL;
 	LLToolDragAndDrop::getInstance()->setDragStart( x, y );
 }
 
@@ -355,30 +379,12 @@ BOOL LLToolBarView::handleDragTool( S32 x, S32 y, const LLUUID& uuid, LLAssetTyp
 			LLToolDragAndDrop::ESource src = LLToolDragAndDrop::SOURCE_VIEWER;
 			LLUUID srcID;
 			LLToolDragAndDrop::getInstance()->beginMultiDrag(types, cargo_ids, src, srcID);
-			
-			// Second, check if the command is present in one of the 3 toolbars
-			// If it is, store the command, the toolbar and the rank in the toolbar and
-			// set a callback on end drag so that we reinsert the command if no drop happened
-			/*
-			gToolBarView->mDragCommand = LLCommandId(uuid);
-			if ((gToolBarView->mDragRank = gToolBarView->mToolbarLeft->removeCommand(gToolBarView->mDragCommand)) != LLToolBar::RANK_NONE)
-			{
-				gToolBarView->mDragToolbar = gToolBarView->mToolbarLeft;
-			}
-			else if ((gToolBarView->mDragRank = gToolBarView->mToolbarRight->removeCommand(gToolBarView->mDragCommand)) != LLToolBar::RANK_NONE)
-			{
-				gToolBarView->mDragToolbar = gToolBarView->mToolbarRight;
-			}
-			else if ((gToolBarView->mDragRank = gToolBarView->mToolbarBottom->removeCommand(gToolBarView->mDragCommand)) != LLToolBar::RANK_NONE)
-			{
-				gToolBarView->mDragToolbar = gToolBarView->mToolbarBottom;
-			}
-			if (gToolBarView->mDragRank != LLToolBar::RANK_NONE)
-			{
-				llinfos << "Merov debug: rank of dragged tool = " << gToolBarView->mDragRank << llendl;
-				LLToolDragAndDrop::getInstance()->setEndDragCallback(boost::bind(&LLToolBarView::onEndDrag, gToolBarView));
-			}
-			 */
+
+			// Second, stop the command if it is in progress and requires stopping!
+			LLCommandId command_id = LLCommandId(uuid);
+			gToolBarView->mToolbarLeft->stopCommandInProgress(command_id);
+			gToolBarView->mToolbarRight->stopCommandInProgress(command_id);
+			gToolBarView->mToolbarBottom->stopCommandInProgress(command_id);
 
 			gToolBarView->mDragStarted = true;
 			return TRUE;
@@ -407,42 +413,32 @@ BOOL LLToolBarView::handleDropTool( void* cargo_data, S32 x, S32 y, LLToolBar* t
 		LLCommand* command = mgr.getCommand(command_id);
 		if (command)
 		{
-			// Convert the (x,y) position in rank in toolbar
-			int new_rank = LLToolBar::RANK_NONE;
-			if (!toolbar->isReadOnly())
-			{
-				new_rank = toolbar->getRankFromPosition(x,y);
-			}
 			// Suppress the command from the toolbars (including the one it's dropped in, 
 			// this will handle move position).
-			int old_rank = LLToolBar::RANK_NONE;
+			bool command_present = gToolBarView->hasCommand(command_id);
 			LLToolBar* old_toolbar = NULL;
-			int rank;
-			if ((rank = gToolBarView->mToolbarLeft->removeCommand(command_id)) != LLToolBar::RANK_NONE)
-			{
-				old_rank = rank;
-				old_toolbar = gToolBarView->mToolbarLeft;
-			}
-			if ((rank = gToolBarView->mToolbarRight->removeCommand(command_id)) != LLToolBar::RANK_NONE)
-			{
-				old_rank = rank;
-				old_toolbar = gToolBarView->mToolbarRight;
-			}
-			if ((rank = gToolBarView->mToolbarBottom->removeCommand(command_id)) != LLToolBar::RANK_NONE)
+
+			if (command_present)
 			{
-				old_rank = rank;
-				old_toolbar = gToolBarView->mToolbarBottom;
+				llassert(gToolBarView->mDragToolbarButton);
+				old_toolbar = gToolBarView->mDragToolbarButton->getParentByType<LLToolBar>();
+				if (old_toolbar->isReadOnly() && toolbar->isReadOnly())
+				{
+					// do nothing
+				}
+				else
+				{
+					gToolBarView->mToolbarBottom->removeCommand(command_id);
+					gToolBarView->mToolbarLeft->removeCommand(command_id);
+					gToolBarView->mToolbarRight->removeCommand(command_id);
+				}
 			}
-			// Now insert it in the toolbar at the detected rank
+
+			// Convert the (x,y) position in rank in toolbar
 			if (!toolbar->isReadOnly())
 			{
-				if ((old_toolbar == toolbar) && (old_rank != LLToolBar::RANK_NONE) && (old_rank < new_rank))
-				{
-					// If we just removed the command from the same toolbar, we need to consider that it might
-					// change the target rank.
-					new_rank -= 1;
-				}
-				toolbar->addCommand(command->id(),new_rank);
+				int new_rank = toolbar->getRankFromPosition(x,y);
+				toolbar->addCommand(command_id, new_rank);
 			}
 		}
 		else
@@ -450,27 +446,16 @@ BOOL LLToolBarView::handleDropTool( void* cargo_data, S32 x, S32 y, LLToolBar* t
 			llwarns << "Command couldn't be found in command manager" << llendl;
 		}
 	}
-	stopDragTool();
+
+	resetDragTool(NULL);
 	return handled;
 }
 
-void LLToolBarView::stopDragTool()
+void LLToolBarView::resetDragTool(LLToolBarButton* button)
 {
 	// Clear the saved command, toolbar and rank
 	gToolBarView->mDragStarted = false;
-	gToolBarView->mDragCommand = LLCommandId::null;
-	gToolBarView->mDragRank = LLToolBar::RANK_NONE;
-	gToolBarView->mDragToolbar = NULL;
-}
-
-void LLToolBarView::onEndDrag()
-{
-	// If there's a saved command, reinsert it in the saved toolbar
-	if (gToolBarView->mDragRank != LLToolBar::RANK_NONE)
-	{
-		gToolBarView->mDragToolbar->addCommand(gToolBarView->mDragCommand,gToolBarView->mDragRank);
-	}
-	stopDragTool();
+	gToolBarView->mDragToolbarButton = button;
 }
 
 void LLToolBarView::setToolBarsVisible(bool visible)
@@ -490,3 +475,18 @@ bool LLToolBarView::isModified() const
 
 	return modified;
 }
+
+
+//
+// HACK to bring up destinations guide at startup
+//
+
+void handleLoginToolbarSetup()
+{
+	// Open the destinations guide by default on first login, per Rhett
+	if (gSavedSettings.getBOOL("FirstLoginThisInstall") || gAgent.isFirstLogin())
+	{
+		LLFloaterReg::showInstance("destinations");
+	}
+}
+
diff --git a/indra/newview/lltoolbarview.h b/indra/newview/lltoolbarview.h
index 8b3af4387531c8eba893983b04d331e29bbd67cf..60ad6316f85e23630bedbabdc409d91705d48704 100644
--- a/indra/newview/lltoolbarview.h
+++ b/indra/newview/lltoolbarview.h
@@ -76,11 +76,10 @@ class LLToolBarView : public LLUICtrl
 
 	static bool loadDefaultToolbars();
 	
-	static void startDragTool( S32 x, S32 y, const LLUUID& uuid);
-	static BOOL handleDragTool( S32 x, S32 y, const LLUUID& uuid, LLAssetType::EType type);
-	static BOOL handleDropTool(	void* cargo_data, S32 x, S32 y, LLToolBar* toolbar);
-	static void stopDragTool();
-	void onEndDrag();
+	static void startDragTool(S32 x, S32 y, LLToolBarButton* button);
+	static BOOL handleDragTool(S32 x, S32 y, const LLUUID& uuid, LLAssetType::EType type);
+	static BOOL handleDropTool(void* cargo_data, S32 x, S32 y, LLToolBar* toolbar);
+	static void resetDragTool(LLToolBarButton* button);
 
 	bool isModified() const;
 	
@@ -100,10 +99,8 @@ class LLToolBarView : public LLUICtrl
 	LLToolBar*	mToolbarRight;
 	LLToolBar*	mToolbarBottom;
 	
-	LLCommandId mDragCommand;
-	int			mDragRank;
-	LLToolBar*	mDragToolbar;
-	bool		mDragStarted;
+	bool				mDragStarted;
+	LLToolBarButton*	mDragToolbarButton;
 };
 
 extern LLToolBarView* gToolBarView;
diff --git a/indra/newview/lltoolmgr.cpp b/indra/newview/lltoolmgr.cpp
index 51c0e2eeed31cbd433c9c740fc7f6aed93172942..6bc7c6de11b8b22e58ab605d5a79a3d4bbd76028 100644
--- a/indra/newview/lltoolmgr.cpp
+++ b/indra/newview/lltoolmgr.cpp
@@ -247,24 +247,10 @@ bool LLToolMgr::canEdit()
 
 void LLToolMgr::toggleBuildMode()
 {
-	if (inBuildMode())
-	{
-		if (gSavedSettings.getBOOL("EditCameraMovement"))
-		{
-			// just reset the view, will pull us out of edit mode
-			handle_reset_view();
-		}
-		else
-		{
-			// manually disable edit mode, but do not affect the camera
-			gAgentCamera.resetView(false);
-			LLFloaterReg::hideInstance("build");
-			gViewerWindow->showCursor();			
-		}
-		// avoid spurious avatar movements pulling out of edit mode
-		LLViewerJoystick::getInstance()->setNeedsReset();
-	}
-	else
+	LLFloaterReg::toggleInstanceOrBringToFront("build");
+
+	bool build_visible = LLFloaterReg::instanceVisible("build");
+	if (build_visible)
 	{
 		ECameraMode camMode = gAgentCamera.getCameraMode();
 		if (CAMERA_MODE_MOUSELOOK == camMode ||	CAMERA_MODE_CUSTOMIZE_AVATAR == camMode)
@@ -291,7 +277,7 @@ void LLToolMgr::toggleBuildMode()
 			}
 		}
 
-		
+
 		setCurrentToolset(gBasicToolset);
 		getCurrentToolset()->selectTool( LLToolCompCreate::getInstance() );
 
@@ -304,6 +290,24 @@ void LLToolMgr::toggleBuildMode()
 		LLViewerJoystick::getInstance()->setNeedsReset();
 
 	}
+	else
+	{
+		if (gSavedSettings.getBOOL("EditCameraMovement"))
+		{
+			// just reset the view, will pull us out of edit mode
+			handle_reset_view();
+		}
+		else
+		{
+			// manually disable edit mode, but do not affect the camera
+			gAgentCamera.resetView(false);
+			LLFloaterReg::hideInstance("build");
+			gViewerWindow->showCursor();			
+		}
+		// avoid spurious avatar movements pulling out of edit mode
+		LLViewerJoystick::getInstance()->setNeedsReset();
+	}
+
 }
 
 bool LLToolMgr::inBuildMode()
diff --git a/indra/newview/lltracker.cpp b/indra/newview/lltracker.cpp
index 983108391f8fa904156fbd018a8e08576be79d3c..efe9bb8da7cdeb27f0ea6c1c16959ee1f77a358c 100644
--- a/indra/newview/lltracker.cpp
+++ b/indra/newview/lltracker.cpp
@@ -53,10 +53,12 @@
 #include "llinventorymodel.h"
 #include "llinventoryobserver.h"
 #include "lllandmarklist.h"
+#include "llprogressview.h"
 #include "llsky.h"
 #include "llui.h"
 #include "llviewercamera.h"
 #include "llviewerinventory.h"
+#include "llviewerwindow.h"
 #include "llworld.h"
 #include "llworldmapview.h"
 #include "llviewercontrol.h"
@@ -111,6 +113,8 @@ void LLTracker::drawHUDArrow()
 {
 	if (!gSavedSettings.getBOOL("RenderTrackerBeacon")) return;
 
+	if (gViewerWindow->getProgressView()->getVisible()) return;
+
 	static LLUIColor map_track_color = LLUIColorTable::instance().getColor("MapTrackColor", LLColor4::white);
 	
 	/* tracking autopilot destination has been disabled 
diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp
index 8576d811965f9ff4beec87a04898212af40707aa..6fcbc401af1bd4700fedbbd02ffeaa951f269259 100644
--- a/indra/newview/llviewerwindow.cpp
+++ b/indra/newview/llviewerwindow.cpp
@@ -3174,7 +3174,7 @@ void LLViewerWindow::updateLayout()
 		//gMenuBarView->setItemVisible("BuildTools", gFloaterTools->getVisible());
 	}
 
-	LLFloaterBuildOptions* build_options_floater = LLFloaterReg::getTypedInstance<LLFloaterBuildOptions>("build_options");
+	LLFloaterBuildOptions* build_options_floater = LLFloaterReg::findTypedInstance<LLFloaterBuildOptions>("build_options");
 	if (build_options_floater && build_options_floater->getVisible())
 	{
 		build_options_floater->updateGridMode();
diff --git a/indra/newview/skins/default/xui/en/floater_avatar.xml b/indra/newview/skins/default/xui/en/floater_avatar.xml
index 3c7de6f3348845969a6aa87c81946dba65b520d2..2d973e7d9070c5a87aeba6a4c8573337b263c545 100644
--- a/indra/newview/skins/default/xui/en/floater_avatar.xml
+++ b/indra/newview/skins/default/xui/en/floater_avatar.xml
@@ -1,5 +1,7 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes" ?>
 <floater
+ open_positioning="cascading"
+ ignore_ui_scale="false"
  legacy_header_height="225"
  can_minimize="true"
  can_close="true"
@@ -12,6 +14,7 @@
  single_instance="true"
  help_topic="avatar"
  save_rect="true"
+ save_visibility="true"
  title="AVATAR PICKER"
  width="635">
     <web_browser
diff --git a/indra/newview/skins/default/xui/en/floater_camera.xml b/indra/newview/skins/default/xui/en/floater_camera.xml
index afe8584a2d3777e99873473ad1ea0a7ce571f33b..e7f5207271752fc7800f9eaf205ce03bcdecdb03 100644
--- a/indra/newview/skins/default/xui/en/floater_camera.xml
+++ b/indra/newview/skins/default/xui/en/floater_camera.xml
@@ -14,6 +14,7 @@
  save_visibility="true"
  single_instance="true"
  title="VIEW"
+ chrome="true"
  save_rect="true"
  width="228">
     <floater.string
@@ -166,14 +167,10 @@
            <joystick_rotate
               follows="top|left"
               height="78"
-              image_selected="Cam_Rotate_In"
-              image_unselected="Cam_Rotate_Out"
               layout="topleft"
               left="7"
-              mouse_opaque="false"
               name="cam_rotate_stick"
               quadrant="left"
-              scale_image="false"
               sound_flags="3"
               visible="true"
               tool_tip="Orbit camera around focus"
diff --git a/indra/newview/skins/default/xui/en/floater_destinations.xml b/indra/newview/skins/default/xui/en/floater_destinations.xml
index e63dc02a5783bebbf4504a399d8c5c839cba6a02..373114a1eb8a748170552b2dcf1450fd86defe16 100644
--- a/indra/newview/skins/default/xui/en/floater_destinations.xml
+++ b/indra/newview/skins/default/xui/en/floater_destinations.xml
@@ -1,6 +1,7 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes" ?>
 <floater
  open_positioning="cascading"
+ ignore_ui_scale="false"
  legacy_header_height="225"
  can_minimize="true"
  can_close="true"
@@ -14,6 +15,7 @@
  single_instance="true"
  help_topic="destinations"
  save_rect="true"
+ save_visibility="true"
  title="DESTINATIONS"
  width="840">
     <web_browser
diff --git a/indra/newview/skins/default/xui/en/floater_how_to.xml b/indra/newview/skins/default/xui/en/floater_how_to.xml
index 0369ecbeff4a5426a01c11242c1e7c56c4b05beb..8c0077a8cc8eecf4db8c6051cf1d1c07338909ce 100644
--- a/indra/newview/skins/default/xui/en/floater_how_to.xml
+++ b/indra/newview/skins/default/xui/en/floater_how_to.xml
@@ -10,6 +10,7 @@
   top="10" 
   min_width="335"
   name="floater_how_to"
+  help_topic="how_to"
   single_instance="true"
   save_rect="true"
   title="HOW TO"
diff --git a/indra/newview/skins/default/xui/en/floater_hud.xml b/indra/newview/skins/default/xui/en/floater_hud.xml
index 99a6a95828edad946f52ddd0c23ecd604e407b19..e2d860881a25be8d9cde567b149b13e0247e4e56 100644
--- a/indra/newview/skins/default/xui/en/floater_hud.xml
+++ b/indra/newview/skins/default/xui/en/floater_hud.xml
@@ -8,6 +8,7 @@
  help_topic="floater_hud"
  save_rect="true"
  save_visibility="true"
+ chrome="true"
  title="TUTORIAL"
  width="362">
     <web_browser
diff --git a/indra/newview/skins/default/xui/en/floater_map.xml b/indra/newview/skins/default/xui/en/floater_map.xml
index 58d67c82211e10baaed9629683968eef8dc9a8fa..31972d412247fa32cb77e7c012966519decda46c 100644
--- a/indra/newview/skins/default/xui/en/floater_map.xml
+++ b/indra/newview/skins/default/xui/en/floater_map.xml
@@ -3,6 +3,7 @@
  open_positioning="cascading"
  can_minimize="true" 
  can_resize="true"
+ chrome="true"
  follows="top|right"
  height="200"
  layout="topleft"
diff --git a/indra/newview/skins/default/xui/en/floater_moveview.xml b/indra/newview/skins/default/xui/en/floater_moveview.xml
index b7370580af49bd7feee49fe0da5ab000d5bd19a3..e96039a3e153fa16d7f3db583011a08be5421308 100644
--- a/indra/newview/skins/default/xui/en/floater_moveview.xml
+++ b/indra/newview/skins/default/xui/en/floater_moveview.xml
@@ -14,7 +14,8 @@
  help_topic="move_floater"
  save_rect="true"
  save_visibility="true"
- save_dock_state="true"
+ single_instance="true"
+ chrome="true"
  title="MOVE"
  width="133">
     <string
diff --git a/indra/newview/skins/default/xui/en/floater_my_appearance.xml b/indra/newview/skins/default/xui/en/floater_my_appearance.xml
index d9f3f1e13f662a93d3428e53728c1d82ebd401d6..a40393aed8b6ec804a24d9f7cd17ef9ca5c39aa8 100644
--- a/indra/newview/skins/default/xui/en/floater_my_appearance.xml
+++ b/indra/newview/skins/default/xui/en/floater_my_appearance.xml
@@ -10,6 +10,7 @@
   help_topic="appearance"
   save_rect="true"
   single_instance="true"
+  reuse_instance="true"
   title="APPEARANCE"
   min_height="260"
   min_width="333"
diff --git a/indra/newview/skins/default/xui/en/floater_my_inventory.xml b/indra/newview/skins/default/xui/en/floater_my_inventory.xml
index 44491c671fbb6328b756a9eea24eb0207513e28a..cd0b59dc5136e76f1e1b9a1391d33b1df62808be 100644
--- a/indra/newview/skins/default/xui/en/floater_my_inventory.xml
+++ b/indra/newview/skins/default/xui/en/floater_my_inventory.xml
@@ -10,6 +10,7 @@
  name="floater_my_inventory"
  save_rect="true"
  save_visibility="true"
+ reuse_instance="true"
  title="INVENTORY"
  width="333" >
    <panel
diff --git a/indra/newview/skins/default/xui/en/floater_people.xml b/indra/newview/skins/default/xui/en/floater_people.xml
index 9c1d1214330fb58b837c038db5047c810296b8cf..32dda1b694920961f9b6b936196661c412ab374c 100644
--- a/indra/newview/skins/default/xui/en/floater_people.xml
+++ b/indra/newview/skins/default/xui/en/floater_people.xml
@@ -12,6 +12,7 @@
   name="floater_people"
   save_rect="true"
   single_instance="true"
+  reuse_instance="true"
   title="PEOPLE"
   width="333">
     <panel_container
diff --git a/indra/newview/skins/default/xui/en/floater_picks.xml b/indra/newview/skins/default/xui/en/floater_picks.xml
index 2d307028e46a09c8fe871f1c4759b8e934ca679a..78821166624401bdea23a42c6c97d09a1aa11f25 100644
--- a/indra/newview/skins/default/xui/en/floater_picks.xml
+++ b/indra/newview/skins/default/xui/en/floater_picks.xml
@@ -10,6 +10,7 @@
  name="floater_picks"
  save_rect="true"
  save_visibility="true"
+ reuse_instance="true"
  title="Picks"
  width="333" >
    <panel
diff --git a/indra/newview/skins/default/xui/en/floater_places.xml b/indra/newview/skins/default/xui/en/floater_places.xml
index b7cb86b468fbaba0b6555e5af6c09b600101c42d..6484b543604ec6a31e02b11c6ecb24d5cf241913 100644
--- a/indra/newview/skins/default/xui/en/floater_places.xml
+++ b/indra/newview/skins/default/xui/en/floater_places.xml
@@ -9,6 +9,7 @@
   name="floater_places"
   help_topic="floater_places"
   save_rect="true"
+  reuse_instance="true"
   title="PLACES"
   min_height="230"
   min_width="333"
diff --git a/indra/newview/skins/default/xui/en/floater_sound_devices.xml b/indra/newview/skins/default/xui/en/floater_sound_devices.xml
index 3dbe4adf28af3d827e2b3f79c7faeec218b90095..dec0e9b6c620e3f44233ff24d9c04314684f41f3 100644
--- a/indra/newview/skins/default/xui/en/floater_sound_devices.xml
+++ b/indra/newview/skins/default/xui/en/floater_sound_devices.xml
@@ -6,6 +6,7 @@
  can_minimize="true"
  can_resize="false"
  can_close="false"
+ chrome="true"
  save_dock_state="true"
  save_visibility="true"
  save_rect="true"
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 3f5768bc0b59c3b335eaca9347ac6c61c54c8b27..93a04050b64025f869f924f0552ae9bb9df58b96 100644
--- a/indra/newview/skins/default/xui/en/floater_voice_controls.xml
+++ b/indra/newview/skins/default/xui/en/floater_voice_controls.xml
@@ -4,6 +4,7 @@
  can_resize="true"
  can_minimize="true"
  can_close="true"
+ chrome="true"
  height="205"
  layout="topleft"
  min_height="124"
@@ -18,19 +19,19 @@
  width="282">
     <string
      name="title_nearby">
-        Nearby voice
+        VOICE SETTINGS
     </string>
     <string
      name="title_group">
-        Group call with [GROUP]
+        GROUP CALL WITH [GROUP]
     </string>
     <string
      name="title_adhoc">
-        Conference call
+        CONFERENCE CALL
     </string>
     <string
      name="title_peer_2_peer">
-        Call with [NAME]
+        CALL WITH [NAME]
     </string>
     <string
      name="no_one_near">
@@ -51,6 +52,7 @@
          user_resize="false"
          auto_resize="false"
          layout="topleft"
+         min_height="20"
          height="20"
          name="my_panel">
             <avatar_icon
@@ -132,6 +134,7 @@
           height="132"
           name="callers_panel"
           user_resize="false" 
+          auto_resize="true"
           width="280">
         <avatar_list
          follows="all"
diff --git a/indra/newview/skins/default/xui/en/menu_bottomtray.xml b/indra/newview/skins/default/xui/en/menu_bottomtray.xml
deleted file mode 100644
index 1a102c21bbbb682f1369d7298b9fdc9d6b8b3382..0000000000000000000000000000000000000000
--- a/indra/newview/skins/default/xui/en/menu_bottomtray.xml
+++ /dev/null
@@ -1,163 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<menu
- height="201"
- layout="topleft"
- left="100"
- mouse_opaque="false"
- name="hide_camera_move_controls_menu"
- top="624"
- visible="false"
- width="128">
-    <menu_item_check
-         label="Speak Button"
-         layout="topleft"
-         name="EnableVoiceChat">
-           <menu_item_check.on_click
-             function="ToggleControl"
-             parameter="EnableVoiceChat" /> 
-             <menu_item_check.on_check
-             function="CheckControl"
-             parameter="EnableVoiceChat" />
-    </menu_item_check>
-    <menu_item_check
-         label="Gesture button"
-         layout="topleft"
-         name="ShowGestureButton">
-           <menu_item_check.on_click
-             function="ToggleControl"
-             parameter="ShowGestureButton" /> 
-             <menu_item_check.on_check
-             function="CheckControl"
-             parameter="ShowGestureButton" />
-    </menu_item_check>
-    <menu_item_check
-         label="Move button"
-         layout="topleft"
-         name="ShowMoveButton">
-           <menu_item_check.on_click
-             function="ToggleControl"
-             parameter="ShowMoveButton" />
-             <menu_item_check.on_check
-             function="CheckControl"
-             parameter="ShowMoveButton" />
-    </menu_item_check>
-    <menu_item_check
-         label="View button"
-         layout="topleft"
-         name="ShowCameraButton">
-           <menu_item_check.on_click
-             function="ToggleControl"
-             parameter="ShowCameraButton" />
-             <menu_item_check.on_check
-             function="CheckControl"
-             parameter="ShowCameraButton" />
-    </menu_item_check>        
-    <menu_item_check
-         label="Snapshot button"
-         layout="topleft"
-         name="ShowSnapshotButton">
-           <menu_item_check.on_click
-             function="ToggleControl"
-             parameter="ShowSnapshotButton" />
-             <menu_item_check.on_check
-             function="CheckControl"
-             parameter="ShowSnapshotButton" />
-    </menu_item_check>        
-    <menu_item_check
-     label="Build button"
-     layout="topleft"
-     name="ShowBuildButton">
-        <menu_item_check.on_click
-         function="ToggleControl"
-         parameter="ShowBuildButton" />
-        <menu_item_check.on_check
-         function="CheckControl"
-         parameter="ShowBuildButton" />
-    </menu_item_check>
-    <menu_item_check
-     label="Search button"
-     layout="topleft"
-     name="ShowSearchButton">
-        <menu_item_check.on_click
-         function="ToggleControl"
-         parameter="ShowSearchButton" />
-        <menu_item_check.on_check
-         function="CheckControl"
-         parameter="ShowSearchButton" />
-    </menu_item_check>
-    <menu_item_check
-     label="Map button"
-     layout="topleft"
-     name="ShowWorldMapButton">
-        <menu_item_check.on_click
-         function="ToggleControl"
-         parameter="ShowWorldMapButton" />
-        <menu_item_check.on_check
-         function="CheckControl"
-         parameter="ShowWorldMapButton" />
-    </menu_item_check>
-    <menu_item_check
-     label="Mini-map button"
-     layout="topleft"
-     name="ShowMiniMapButton">
-        <menu_item_check.on_click
-         function="ToggleControl"
-         parameter="ShowMiniMapButton" />
-        <menu_item_check.on_check
-         function="CheckControl"
-         parameter="ShowMiniMapButton" />
-    </menu_item_check>
-    <menu_item_separator
-     name="Separator" />
-    <menu_item_call
-     label="Cut"
-     name="NearbyChatBar_Cut">
-        <menu_item_call.on_click
-         function="NearbyChatBar.Action"
-         parameter="cut" />
-        <menu_item_call.on_enable
-         function="NearbyChatBar.EnableMenuItem"
-         parameter="can_cut" />
-    </menu_item_call>
-    <menu_item_call
-     label="Copy"
-     name="NearbyChatBar_Copy">
-        <menu_item_call.on_click
-         function="NearbyChatBar.Action"
-         parameter="copy" />
-        <menu_item_call.on_enable
-         function="NearbyChatBar.EnableMenuItem"
-         parameter="can_copy" />
-    </menu_item_call>
-    <menu_item_call
-     label="Paste"
-     name="NearbyChatBar_Paste">
-        <menu_item_call.on_click
-         function="NearbyChatBar.Action"
-         parameter="paste" />
-        <menu_item_call.on_enable
-         function="NearbyChatBar.EnableMenuItem"
-         parameter="can_paste" />
-    </menu_item_call>
-    <menu_item_call
-     label="Delete"
-     name="NearbyChatBar_Delete">
-        <menu_item_call.on_click
-         function="NearbyChatBar.Action"
-         parameter="delete" />
-        <menu_item_call.on_enable
-         function="NearbyChatBar.EnableMenuItem"
-         parameter="can_delete" />
-    </menu_item_call>
-    <menu_item_call
-     label="Select All"
-     name="NearbyChatBar_Select_All">
-        <menu_item_call.on_click
-         function="NearbyChatBar.Action"
-         parameter="select_all" />
-        <menu_item_call.on_enable
-         function="NearbyChatBar.EnableMenuItem"
-         parameter="can_select_all" />
-    </menu_item_call>
-
-</menu>
diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml
index 6720d8131ec73517f7e2979dc7d99a65deb71b79..3ed8c30ca82bbbd10cf70e712d7579422758baf0 100644
--- a/indra/newview/skins/default/xui/en/notifications.xml
+++ b/indra/newview/skins/default/xui/en/notifications.xml
@@ -5432,21 +5432,23 @@ Your calling card was declined.
   </notification>
 
   <notification
-   icon="notifytip.tga"
-   name="TeleportToLandmark"
-   type="notifytip">
-You can teleport to locations like &apos;[NAME]&apos; by opening the Places panel on the right side of your screen, and then select the Landmarks tab.
-Click on any landmark to select it, then click &apos;Teleport&apos; at the bottom of the panel.
-(You can also double-click on the landmark, or right-click it and choose &apos;Teleport&apos;.)
+ icon="notifytip.tga"
+ name="TeleportToLandmark"
+ type="notifytip">
+    To teleport to locations like &apos;[NAME]&apos;, click on the &quot;Places&quot; button,
+    then select the Landmarks tab in the window that opens. Click on any
+    landmark to select it, then click &apos;Teleport&apos; at the bottom of the window.
+    (You can also double-click on the landmark, or right-click it and
+    choose &apos;Teleport&apos;.)
   </notification>
 
   <notification
    icon="notifytip.tga"
    name="TeleportToPerson"
    type="notifytip">
-You can contact Residents like &apos;[NAME]&apos; by opening the People panel on the right side of your screen.
-Select the Resident from the list, then click &apos;IM&apos; at the bottom of the panel.
-(You can also double-click on their name in the list, or right-click and choose &apos;IM&apos;).
+    To contact Residents like &apos;[NAME]&apos;, click on the &quot;People&quot; button , select a Resident from the window that opens, then click &apos;IM&apos; at the
+    bottom of the window.
+    (You can also double-click on their name in the list, or right-click and choose &apos;IM&apos;).
   </notification>
 
   <notification
diff --git a/indra/newview/skins/default/xui/en/panel_chat_item.xml b/indra/newview/skins/default/xui/en/panel_chat_item.xml
index 34c6e02684b7886d9c6653e0453d6e7028f65c22..6af110540075ae0bf770df51efadbeaf733e130a 100644
--- a/indra/newview/skins/default/xui/en/panel_chat_item.xml
+++ b/indra/newview/skins/default/xui/en/panel_chat_item.xml
@@ -2,7 +2,7 @@
 <!-- All our XML is utf-8 encoded. -->
 <panel
   name="instant_message"
-  width="315"
+  width="300"
   height="180"
   follows="all">
      <avatar_icon
@@ -22,6 +22,7 @@
       text_color="white"
       word_wrap="true"
       mouse_opaque="true"
+      valign="bottom"
       name="msg_text">
 	</text_chat>
 </panel>
diff --git a/indra/newview/skins/default/xui/en/panel_chiclet_bar.xml b/indra/newview/skins/default/xui/en/panel_chiclet_bar.xml
index 355a76e05f9ec40589d805138918e332b1268797..41d1036a4d4859791b2f622b273efa1a0f2449cf 100644
--- a/indra/newview/skins/default/xui/en/panel_chiclet_bar.xml
+++ b/indra/newview/skins/default/xui/en/panel_chiclet_bar.xml
@@ -42,7 +42,7 @@
              top="7"
              width="189">
         <button
-                 auto_resize="true"
+                 auto_resize="false"
                  follows="right"
                  height="29"
                  image_hover_selected="SegmentedBtn_Left_Over"
@@ -57,9 +57,9 @@
                  tab_stop="false"
                  top="-28"
                  visible="false"
-                 width="7" />
+                 width="12" />
         <button
-                 auto_resize="true"
+                 auto_resize="false"
                  follows="right"
                  height="29"
                  image_hover_selected="SegmentedBtn_Right_Over"
@@ -74,7 +74,7 @@
                  tab_stop="false"
                  top="-28"
                  visible="false"
-                 width="7" />
+                 width="12" />
       </chiclet_panel>
     </layout_panel>
     <layout_panel auto_resize="false"
@@ -110,7 +110,7 @@ image_pressed           "Lit" - there are new messages
 image_pressed_selected  "Lit" + "Selected" - there are new messages and the Well is open
              -->
         <button
-                 auto_resize="true"
+                 auto_resize="false"
                  follows="right"
                  halign="center"
                  height="23"
@@ -151,7 +151,7 @@ image_pressed_selected  "Lit" + "Selected" - there are new messages and the Well
              top="5"
              width="35">
         <button
-                 auto_resize="true"
+                 auto_resize="false"
                  bottom_pad="3"
                  follows="right"
                  halign="center"
diff --git a/indra/newview/skins/default/xui/en/panel_notification.xml b/indra/newview/skins/default/xui/en/panel_notification.xml
index 59ead84127a7273cd4227a76bc1cdd9001713e05..f6f62ac54eb71ee56051b27cb0be8ab0a00a81ed 100644
--- a/indra/newview/skins/default/xui/en/panel_notification.xml
+++ b/indra/newview/skins/default/xui/en/panel_notification.xml
@@ -9,6 +9,8 @@
   layout="topleft"
   left="0"
   name="notification_panel"
+  chrome="true"
+  show_title="false"
   top="0"
   	height="140"
   translate="false"
diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml
index db7c07f2f80af12b73751944129f6c5e5c78f1fb..c4031de0f875a7fd16626e37ac18334ec5519ccb 100644
--- a/indra/newview/skins/default/xui/en/strings.xml
+++ b/indra/newview/skins/default/xui/en/strings.xml
@@ -2028,7 +2028,7 @@ Returns a string with the requested data about the region
 	<string name="PlacesNoMatchingItems">Didn't find what you're looking for? Try [secondlife:///app/search/places/[SEARCH_TERM] Search].</string>
 	<string name="FavoritesNoMatchingItems">Drag a landmark here to add it to your favorites.</string>
 	<string name="InventoryNoTexture">You do not have a copy of this texture in your inventory</string>
-	<string name="InventoryInboxNoItems">Items purchased through the marketplace will be delivered here.</string>
+	<string name="InventoryInboxNoItems">When you purchase or otherwise receive an item, it will appear here so you can drag it to a folder in your inventory, or delete it if you do not wish to keep it.</string>
 	<string name="MarketplaceURL">http://marketplace.[DOMAIN_NAME]</string>
 	<string name="MarketplaceURL_CreateStore">http://marketplace.[DOMAIN_NAME]/create_store</string>
 	<string name="MarketplaceURL_LearnMore">http://marketplace.[DOMAIN_NAME]/learn_more</string>
@@ -3678,7 +3678,7 @@ Try enclosing path to the editor with double quotes.
   <string name="Command_Snapshot_Label">Snapshot</string>
   <string name="Command_Speak_Label">Speak</string>
   <string name="Command_View_Label">View</string>
-  <string name="Command_Voice_Label">Nearby voice</string>
+  <string name="Command_Voice_Label">Voice settings</string>
 
   <string name="Command_AboutLand_Tooltip">Information about the land you're visiting</string>
   <string name="Command_Appearance_Tooltip">Change your avatar</string>
@@ -3703,7 +3703,7 @@ Try enclosing path to the editor with double quotes.
   <string name="Command_Snapshot_Tooltip">Take a picture</string>
   <string name="Command_Speak_Tooltip">Speak with people nearby using your microphone</string>
   <string name="Command_View_Tooltip">Changing camera angle</string>
-  <string name="Command_Voice_Tooltip">People nearby with voice capability</string>
+  <string name="Command_Voice_Tooltip">Volume controls for calls and people near you in world</string>
 
  <!-- Mesh UI terms -->
   <string name="Retain%">Retain%</string>
diff --git a/indra/newview/skins/default/xui/en/widgets/joystick_rotate.xml b/indra/newview/skins/default/xui/en/widgets/joystick_rotate.xml
new file mode 100644
index 0000000000000000000000000000000000000000..a190da3909959deb8f77587a2a3654637c85724e
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/widgets/joystick_rotate.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<joystick_rotate
+   image_selected="Cam_Rotate_In"
+   image_unselected="Cam_Rotate_Out"
+   scale_image="false"
+   mouse_opaque="false"
+   held_down_delay.seconds="0"/>