diff --git a/.hgignore b/.hgignore
index 886af2b00794f61e6c660b47c4bf91fefb153d23..53ddf71bb79ecb63c743d8f67bd5f8271400142a 100644
--- a/.hgignore
+++ b/.hgignore
@@ -55,3 +55,8 @@ glob:*.cpp.orig
 glob:*.cpp.bak
 glob:*.h.bak
 glob:*.h.orig
+glob:indra/newview/typed_locations.txt
+glob:indra/newview/teleport_history.txt
+glob:indra/newview/search_history.txt
+glob:indra/newview/filters.xml
+glob:indra/newview/avatar_icons_cache.txt
diff --git a/indra/llrender/llrendertarget.cpp b/indra/llrender/llrendertarget.cpp
index f0df3bcf90c47a43dcadc1e67a2d3addee4faca0..bab5cfd56edf1251bf2361e9d1f4341a9d0fca90 100644
--- a/indra/llrender/llrendertarget.cpp
+++ b/indra/llrender/llrendertarget.cpp
@@ -89,19 +89,6 @@ void LLRenderTarget::setSampleBuffer(LLMultisampleBuffer* buffer)
 
 void LLRenderTarget::allocate(U32 resx, U32 resy, U32 color_fmt, BOOL depth, BOOL stencil, LLTexUnit::eTextureType usage, BOOL use_fbo)
 {
-	// only reallocate if something changed
-	if (mResX == resx
-		&& mResY == resy
-		&& mUseDepth == depth
-		&& mStencil == stencil
-		&& mUsage == usage
-		&& (mFBO != 0) == ((sUseFBO || use_fbo) && gGLManager.mHasFramebufferObject)
-		&& mColorFmt == color_fmt)
-	{
-		// nothing to do
-		return;
-	}
-		
 	stop_glerror();
 	mResX = resx;
 	mResY = resy;
@@ -620,19 +607,6 @@ void LLMultisampleBuffer::allocate(U32 resx, U32 resy, U32 color_fmt, BOOL depth
 
 void LLMultisampleBuffer::allocate(U32 resx, U32 resy, U32 color_fmt, BOOL depth, BOOL stencil,  LLTexUnit::eTextureType usage, BOOL use_fbo, U32 samples )
 {
-	if (mResX == resx
-		&& mResY == resy
-		&& mUseDepth == depth
-		&& mStencil == stencil
-		&& mUsage == usage
-		&& (mFBO != 0) == ((sUseFBO || use_fbo) && gGLManager.mHasFramebufferObject)
-		&& mColorFmt == color_fmt
-		&& mSamples == samples)
-	{
-		// nothing to do
-		return;
-	}
-
 	stop_glerror();
 	mResX = resx;
 	mResY = resy;
diff --git a/indra/llui/llbutton.cpp b/indra/llui/llbutton.cpp
index b65f248db27d9bc88ccce696889c1bdd0690603b..8930e320558c315c5d65406af2f867f2f0875130 100644
--- a/indra/llui/llbutton.cpp
+++ b/indra/llui/llbutton.cpp
@@ -147,7 +147,11 @@ LLButton::LLButton(const LLButton::Params& p)
 	mCommitOnReturn(p.commit_on_return),
 	mFadeWhenDisabled(FALSE),
 	mForcePressedState(false),
-	mLastDrawCharsCount(0)
+	mLastDrawCharsCount(0),
+	mMouseDownSignal(NULL),
+	mMouseUpSignal(NULL),
+	mHeldDownSignal(NULL)
+
 {
 	static LLUICachedControl<S32> llbutton_orig_h_pad ("UIButtonOrigHPad", 0);
 	static Params default_params(LLUICtrlFactory::getDefaultParams<LLButton>());
@@ -215,13 +219,28 @@ LLButton::LLButton(const LLButton::Params& p)
 	}
 	
 	if (p.click_callback.isProvided())
-		initCommitCallback(p.click_callback, mCommitSignal); // alias -> commit_callback
+	{
+		setCommitCallback(initCommitCallback(p.click_callback)); // alias -> commit_callback
+	}
 	if (p.mouse_down_callback.isProvided())
-		initCommitCallback(p.mouse_down_callback, mMouseDownSignal);
+	{
+		setMouseDownCallback(initCommitCallback(p.mouse_down_callback));
+	}
 	if (p.mouse_up_callback.isProvided())
-		initCommitCallback(p.mouse_up_callback, mMouseUpSignal);
+	{
+		setMouseUpCallback(initCommitCallback(p.mouse_up_callback));
+	}
 	if (p.mouse_held_callback.isProvided())
-		initCommitCallback(p.mouse_held_callback, mHeldDownSignal);
+	{
+		setHeldDownCallback(initCommitCallback(p.mouse_held_callback));
+	}
+}
+
+LLButton::~LLButton()
+{
+	delete mMouseDownSignal;
+	delete mMouseUpSignal;
+	delete mHeldDownSignal;
 }
 
 // HACK: Committing a button is the same as instantly clicking it.
@@ -232,9 +251,9 @@ void LLButton::onCommit()
 	// panel containing it.  Therefore we need to call 	LLUICtrl::onCommit()
 	// LAST, otherwise this becomes deleted memory.
 
-	mMouseDownSignal(this, LLSD());
+	if (mMouseDownSignal) (*mMouseDownSignal)(this, LLSD());
 	
-	mMouseUpSignal(this, LLSD());
+	if (mMouseUpSignal) (*mMouseUpSignal)(this, LLSD());
 
 	if (getSoundFlags() & MOUSE_DOWN)
 	{
@@ -257,19 +276,23 @@ void LLButton::onCommit()
 
 boost::signals2::connection LLButton::setClickedCallback( const commit_signal_t::slot_type& cb )
 {
-	return mCommitSignal.connect(cb);
+	if (!mCommitSignal) mCommitSignal = new commit_signal_t();
+	return mCommitSignal->connect(cb);
 }
 boost::signals2::connection LLButton::setMouseDownCallback( const commit_signal_t::slot_type& cb )
 {
-	return mMouseDownSignal.connect(cb);
+	if (!mMouseDownSignal) mMouseDownSignal = new commit_signal_t();
+	return mMouseDownSignal->connect(cb);
 }
 boost::signals2::connection LLButton::setMouseUpCallback( const commit_signal_t::slot_type& cb )
 {
-	return mMouseUpSignal.connect(cb);
+	if (!mMouseUpSignal) mMouseUpSignal = new commit_signal_t();
+	return mMouseUpSignal->connect(cb);
 }
 boost::signals2::connection LLButton::setHeldDownCallback( const commit_signal_t::slot_type& cb )
 {
-	return mHeldDownSignal.connect(cb);
+	if (!mHeldDownSignal) mHeldDownSignal = new commit_signal_t();
+	return mHeldDownSignal->connect(cb);
 }
 
 
@@ -351,7 +374,7 @@ BOOL LLButton::handleMouseDown(S32 x, S32 y, MASK mask)
 		 */
 		LLUICtrl::handleMouseDown(x, y, mask);
 
-		mMouseDownSignal(this, LLSD());
+		if(mMouseDownSignal) (*mMouseDownSignal)(this, LLSD());
 
 		mMouseDownTimer.start();
 		mMouseDownFrame = (S32) LLFrameTimer::getFrameCount();
@@ -383,7 +406,7 @@ BOOL LLButton::handleMouseUp(S32 x, S32 y, MASK mask)
 		LLUICtrl::handleMouseUp(x, y, mask);
 
 		// Regardless of where mouseup occurs, handle callback
-		mMouseUpSignal(this, LLSD());
+		if(mMouseUpSignal) (*mMouseUpSignal)(this, LLSD());
 
 		resetMouseDownTimer();
 
@@ -493,7 +516,7 @@ BOOL LLButton::handleHover(S32 x, S32 y, MASK mask)
 			{
 				LLSD param;
 				param["count"] = mMouseHeldDownCount++;
-				mHeldDownSignal(this, param);
+				if (mHeldDownSignal) (*mHeldDownSignal)(this, param);
 			}
 		}
 
diff --git a/indra/llui/llbutton.h b/indra/llui/llbutton.h
index 3c1b57c4befab71b573a699c152b9aab6c1209e8..8c3b4bd859ea3bf7e008136b6c0eef39414df067 100644
--- a/indra/llui/llbutton.h
+++ b/indra/llui/llbutton.h
@@ -128,6 +128,8 @@ class LLButton
 	LLButton(const Params&);
 
 public:
+
+	~LLButton();
 	// For backward compatability only
 	typedef boost::function<void(void*)> button_callback_t;
 
@@ -251,9 +253,9 @@ class LLButton
 	void			resetMouseDownTimer();
 
 private:
-	commit_signal_t 			mMouseDownSignal;
-	commit_signal_t 			mMouseUpSignal;
-	commit_signal_t 			mHeldDownSignal;
+	commit_signal_t* 			mMouseDownSignal;
+	commit_signal_t* 			mMouseUpSignal;
+	commit_signal_t* 			mHeldDownSignal;
 	
 	const LLFontGL*				mGLFont;
 	
diff --git a/indra/llui/llfloater.cpp b/indra/llui/llfloater.cpp
index bf965e8e28e6760693cced9fe41cdb1af0917548..262afbe661507960ec58e2fef733562cd4e9c567 100644
--- a/indra/llui/llfloater.cpp
+++ b/indra/llui/llfloater.cpp
@@ -2642,10 +2642,14 @@ void LLFloater::initFromParams(const LLFloater::Params& p)
 	
 	// open callback 
 	if (p.open_callback.isProvided())
-		initCommitCallback(p.open_callback, mOpenSignal);
+	{
+		mOpenSignal.connect(initCommitCallback(p.open_callback));
+	}
 	// close callback 
 	if (p.close_callback.isProvided())
-		initCommitCallback(p.close_callback, mCloseSignal);
+	{
+		mCloseSignal.connect(initCommitCallback(p.close_callback));
+	}
 }
 
 LLFastTimer::DeclareTimer POST_BUILD("Floater Post Build");
diff --git a/indra/llui/llfocusmgr.cpp b/indra/llui/llfocusmgr.cpp
index 00a80478cf467eedb94358bde8d3510f5fd96b79..35fbc7b0a88f9a898714569f46614b81b0ed2d69 100644
--- a/indra/llui/llfocusmgr.cpp
+++ b/indra/llui/llfocusmgr.cpp
@@ -41,6 +41,10 @@ const F32 FOCUS_FADE_TIME = 0.3f;
 // NOTE: the LLFocusableElement implementation has been moved here from lluictrl.cpp.
 
 LLFocusableElement::LLFocusableElement()
+:	mFocusLostCallback(NULL),
+	mFocusReceivedCallback(NULL),
+	mFocusChangedCallback(NULL),
+	mTopLostCallback(NULL)
 {
 }
 
@@ -59,23 +63,27 @@ BOOL LLFocusableElement::handleUnicodeChar(llwchar uni_char, BOOL called_from_pa
 // virtual
 LLFocusableElement::~LLFocusableElement()
 {
+	delete mFocusLostCallback;
+	delete mFocusReceivedCallback;
+	delete mFocusChangedCallback;
+	delete mTopLostCallback;
 }
 
 void LLFocusableElement::onFocusReceived()
 {
-	mFocusReceivedCallback(this);
-	mFocusChangedCallback(this);
+	if (mFocusReceivedCallback) (*mFocusReceivedCallback)(this);
+	if (mFocusChangedCallback) (*mFocusChangedCallback)(this);
 }
 
 void LLFocusableElement::onFocusLost()
 {
-	mFocusLostCallback(this);
-	mFocusChangedCallback(this);
+	if (mFocusLostCallback) (*mFocusLostCallback)(this);
+	if (mFocusChangedCallback) (*mFocusChangedCallback)(this);
 }
 
 void LLFocusableElement::onTopLost()
 {
-	mTopLostCallback(this);
+	if (mTopLostCallback) (*mTopLostCallback)(this);
 }
 
 BOOL LLFocusableElement::hasFocus() const
@@ -87,6 +95,31 @@ void LLFocusableElement::setFocus(BOOL b)
 {
 }
 
+boost::signals2::connection LLFocusableElement::setFocusLostCallback( const focus_signal_t::slot_type& cb)	
+{ 
+	if (!mFocusLostCallback) mFocusLostCallback = new focus_signal_t();
+	return mFocusLostCallback->connect(cb);
+}
+
+boost::signals2::connection	LLFocusableElement::setFocusReceivedCallback(const focus_signal_t::slot_type& cb)	
+{ 
+	if (!mFocusReceivedCallback) mFocusReceivedCallback = new focus_signal_t();
+	return mFocusReceivedCallback->connect(cb);
+}
+
+boost::signals2::connection	LLFocusableElement::setFocusChangedCallback(const focus_signal_t::slot_type& cb)	
+{
+	if (!mFocusChangedCallback) mFocusChangedCallback = new focus_signal_t();
+	return mFocusChangedCallback->connect(cb);
+}
+
+boost::signals2::connection	LLFocusableElement::setTopLostCallback(const focus_signal_t::slot_type& cb)	
+{ 
+	if (!mTopLostCallback) mTopLostCallback = new focus_signal_t();
+	return mTopLostCallback->connect(cb);
+}
+
+
 
 LLFocusMgr gFocusMgr;
 
diff --git a/indra/llui/llfocusmgr.h b/indra/llui/llfocusmgr.h
index 2fa4e124fb8c8fedba410114a22f03dbf04faa07..83ecd1d301fdb199dcc2f700c4249d7bb9e6b193 100644
--- a/indra/llui/llfocusmgr.h
+++ b/indra/llui/llfocusmgr.h
@@ -56,10 +56,10 @@ class LLFocusableElement
 
 	typedef boost::signals2::signal<void(LLFocusableElement*)> focus_signal_t;
 	
-	boost::signals2::connection setFocusLostCallback( const focus_signal_t::slot_type& cb)	{ return mFocusLostCallback.connect(cb);}
-	boost::signals2::connection	setFocusReceivedCallback(const focus_signal_t::slot_type& cb)	{ return mFocusReceivedCallback.connect(cb);}
-	boost::signals2::connection	setFocusChangedCallback(const focus_signal_t::slot_type& cb)	{ return mFocusChangedCallback.connect(cb);}
-	void	setTopLostCallback(const focus_signal_t::slot_type& cb)	{ mTopLostCallback.connect(cb);}
+	boost::signals2::connection setFocusLostCallback( const focus_signal_t::slot_type& cb);
+	boost::signals2::connection	setFocusReceivedCallback(const focus_signal_t::slot_type& cb);
+	boost::signals2::connection	setFocusChangedCallback(const focus_signal_t::slot_type& cb);
+	boost::signals2::connection	setTopLostCallback(const focus_signal_t::slot_type& cb);
 
 	// These were brought up the hierarchy from LLView so that we don't have to use dynamic_cast when dealing with keyboard focus.
 	virtual BOOL	handleKey(KEY key, MASK mask, BOOL called_from_parent);
@@ -69,10 +69,10 @@ class LLFocusableElement
 	virtual void	onFocusReceived();
 	virtual void	onFocusLost();
 	virtual void	onTopLost();	// called when registered as top ctrl and user clicks elsewhere
-	focus_signal_t  mFocusLostCallback;
-	focus_signal_t  mFocusReceivedCallback;
-	focus_signal_t  mFocusChangedCallback;
-	focus_signal_t  mTopLostCallback;
+	focus_signal_t*  mFocusLostCallback;
+	focus_signal_t*  mFocusReceivedCallback;
+	focus_signal_t*  mFocusChangedCallback;
+	focus_signal_t*  mTopLostCallback;
 };
 
 
diff --git a/indra/llui/lllineeditor.cpp b/indra/llui/lllineeditor.cpp
index c2f91ff7e01a365b7ea576d245933a66a0711421..406c77a365d71e872e48900bba27196fb496dd7b 100644
--- a/indra/llui/lllineeditor.cpp
+++ b/indra/llui/lllineeditor.cpp
@@ -626,7 +626,8 @@ BOOL LLLineEditor::handleMouseDown(S32 x, S32 y, MASK mask)
 	// delay cursor flashing
 	mKeystrokeTimer.reset();
 	
-	mMouseDownSignal(this,x,y,mask);
+	if (mMouseDownSignal)
+		(*mMouseDownSignal)(this,x,y,mask);
 
 	return TRUE;
 }
@@ -742,7 +743,8 @@ BOOL LLLineEditor::handleMouseUp(S32 x, S32 y, MASK mask)
 	}
 	
 	// We won't call LLUICtrl::handleMouseUp to avoid double calls of  childrenHandleMouseUp().Just invoke the signal manually.
-	mMouseUpSignal(this,x,y, mask);
+	if (mMouseUpSignal)
+		(*mMouseUpSignal)(this,x,y, mask);
 	return handled;
 }
 
diff --git a/indra/llui/llmenugl.cpp b/indra/llui/llmenugl.cpp
index de9a854f63702872920e2fbfdadeea1e4c23dbca..f8935d03ac1f72d20fc72c54204a73dd1ee63efa 100644
--- a/indra/llui/llmenugl.cpp
+++ b/indra/llui/llmenugl.cpp
@@ -760,21 +760,25 @@ void LLMenuItemCallGL::initFromParams(const Params& p)
 {
 	if (p.on_visible.isProvided())
 	{
-		initVisibleCallback(p.on_visible, mVisibleSignal);
+		mVisibleSignal.connect(initVisibleCallback(p.on_visible));
 	}
 	if (p.on_enable.isProvided())
 	{
-		initEnableCallback(p.on_enable, mEnableSignal);
+		setEnableCallback(initEnableCallback(p.on_enable));
 		// Set the enabled control variable (for backwards compatability)
 		if (p.on_enable.control_name.isProvided() && !p.on_enable.control_name().empty())
 		{
 			LLControlVariable* control = findControl(p.on_enable.control_name());
 			if (control)
+			{
 				setEnabledControlVariable(control);
+			}
 		}
 	}
 	if (p.on_click.isProvided())
-		initCommitCallback(p.on_click, mCommitSignal);
+	{
+		setCommitCallback(initCommitCallback(p.on_click));
+	}
 		
 	LLUICtrl::initFromParams(p);
 }
@@ -795,7 +799,10 @@ void LLMenuItemCallGL::updateEnabled( void )
 		if (mEnabledControlVariable)
 		{
 			if (!enabled)
-				mEnabledControlVariable->set(false); // callback overrides control variable; this will call setEnabled()
+			{
+				// callback overrides control variable; this will call setEnabled()
+				mEnabledControlVariable->set(false); 
+			}
 		}
 		else
 		{
@@ -854,7 +861,7 @@ void LLMenuItemCheckGL::initFromParams(const Params& p)
 {
 	if (p.on_check.isProvided())
 	{
-		initEnableCallback(p.on_check, mCheckSignal);
+		setCheckCallback(initEnableCallback(p.on_check));
 		// Set the control name (for backwards compatability)
 		if (p.on_check.control_name.isProvided() && !p.on_check.control_name().empty())
 		{
diff --git a/indra/llui/llmultislider.cpp b/indra/llui/llmultislider.cpp
index 68e496aed177935e368f0e442f9e49da66f8cbc8..1891bca36cb5be97592a1649f59261bd6ef2b892 100644
--- a/indra/llui/llmultislider.cpp
+++ b/indra/llui/llmultislider.cpp
@@ -84,17 +84,30 @@ LLMultiSlider::LLMultiSlider(const LLMultiSlider::Params& p)
 	mThumbCenterSelectedColor(p.thumb_center_selected_color()),
 	mDisabledThumbColor(p.thumb_disabled_color()),
 	mTriangleColor(p.triangle_color()),
-	mThumbWidth(p.thumb_width)
+	mThumbWidth(p.thumb_width),
+	mMouseDownSignal(NULL),
+	mMouseUpSignal(NULL)
 {
 	mValue.emptyMap();
 	mCurSlider = LLStringUtil::null;
 	
 	if (p.mouse_down_callback.isProvided())
-		initCommitCallback(p.mouse_down_callback, mMouseDownSignal);
+	{
+		setMouseDownCallback(initCommitCallback(p.mouse_down_callback));
+	}
 	if (p.mouse_up_callback.isProvided())
-		initCommitCallback(p.mouse_up_callback, mMouseUpSignal);
+	{
+		setMouseUpCallback(initCommitCallback(p.mouse_up_callback));
+	}
+}
+
+LLMultiSlider::~LLMultiSlider()
+{
+	delete mMouseDownSignal;
+	delete mMouseUpSignal;
 }
 
+
 void LLMultiSlider::setSliderValue(const std::string& name, F32 value, BOOL from_event)
 {
 	// exit if not there
@@ -325,7 +338,8 @@ BOOL LLMultiSlider::handleMouseUp(S32 x, S32 y, MASK mask)
 	{
 		gFocusMgr.setMouseCapture( NULL );
 
-		mMouseUpSignal( this, LLSD() );
+		if (mMouseUpSignal)
+			(*mMouseUpSignal)( this, LLSD() );
 
 		handled = TRUE;
 		make_ui_sound("UISndClickRelease");
@@ -345,7 +359,8 @@ BOOL LLMultiSlider::handleMouseDown(S32 x, S32 y, MASK mask)
 	{
 		setFocus(TRUE);
 	}
-	mMouseDownSignal( this, LLSD() );
+	if (mMouseDownSignal)
+		(*mMouseDownSignal)( this, LLSD() );
 
 	if (MASK_CONTROL & mask) // if CTRL is modifying
 	{
@@ -557,3 +572,15 @@ void LLMultiSlider::draw()
 
 	LLF32UICtrl::draw();
 }
+
+boost::signals2::connection LLMultiSlider::setMouseDownCallback( const commit_signal_t::slot_type& cb ) 
+{ 
+	if (!mMouseDownSignal) mMouseDownSignal = new commit_signal_t();
+	return mMouseDownSignal->connect(cb); 
+}
+
+boost::signals2::connection LLMultiSlider::setMouseUpCallback(	const commit_signal_t::slot_type& cb )   
+{ 
+	if (!mMouseUpSignal) mMouseUpSignal = new commit_signal_t();
+	return mMouseUpSignal->connect(cb); 
+}
diff --git a/indra/llui/llmultislider.h b/indra/llui/llmultislider.h
index da633cc1cd5017c10cb98be8751b6e82c16838da..f8e43a0470aa4a1d87b83f19a664c0bdb0977dcf 100644
--- a/indra/llui/llmultislider.h
+++ b/indra/llui/llmultislider.h
@@ -67,6 +67,7 @@ class LLMultiSlider : public LLF32UICtrl
 	LLMultiSlider(const Params&);
 	friend class LLUICtrlFactory;
 public:
+	virtual ~LLMultiSlider();
 	void			setSliderValue(const std::string& name, F32 value, BOOL from_event = FALSE);
 	F32				getSliderValue(const std::string& name) const;
 
@@ -78,8 +79,8 @@ class LLMultiSlider : public LLF32UICtrl
 	/*virtual*/ void	setValue(const LLSD& value);
 	/*virtual*/ LLSD	getValue() const		{ return mValue; }
 
-	boost::signals2::connection setMouseDownCallback( const commit_signal_t::slot_type& cb ) { return mMouseDownSignal.connect(cb); }
-	boost::signals2::connection setMouseUpCallback(	const commit_signal_t::slot_type& cb )   { return mMouseUpSignal.connect(cb); }
+	boost::signals2::connection setMouseDownCallback( const commit_signal_t::slot_type& cb );
+	boost::signals2::connection setMouseUpCallback(	const commit_signal_t::slot_type& cb );
 
 	bool			findUnusedValue(F32& initVal);
 	const std::string&	addSlider();
@@ -116,8 +117,8 @@ class LLMultiSlider : public LLF32UICtrl
 	LLUIColor		mDisabledThumbColor;
 	LLUIColor		mTriangleColor;
 	
-	commit_signal_t	mMouseDownSignal;
-	commit_signal_t	mMouseUpSignal;
+	commit_signal_t*	mMouseDownSignal;
+	commit_signal_t*	mMouseUpSignal;
 };
 
 #endif  // LL_MULTI_SLIDER_H
diff --git a/indra/llui/llmultisliderctrl.cpp b/indra/llui/llmultisliderctrl.cpp
index a9f462173dde1994bf47d5f4d0f9f4b5f81a3d0c..87938c19d4869efdbfa88a89ac213c198e9e991b 100644
--- a/indra/llui/llmultisliderctrl.cpp
+++ b/indra/llui/llmultisliderctrl.cpp
@@ -344,7 +344,7 @@ void LLMultiSliderCtrl::onEditorCommit( LLUICtrl* ctrl, const LLSD& userdata)
 		if( self->mMultiSlider->getMinValue() <= val && val <= self->mMultiSlider->getMaxValue() )
 		{
 			self->setCurSliderValue( val );  // set the value temporarily so that the callback can retrieve it.
-			if( self->mValidateSignal( self, val ) )
+			if( !self->mValidateSignal || (*(self->mValidateSignal))( self, val ) )
 			{
 				success = TRUE;
 			}
@@ -378,7 +378,7 @@ void LLMultiSliderCtrl::onSliderCommit(LLUICtrl* ctrl, const LLSD& userdata)
 	F32 new_val = self->mMultiSlider->getCurSliderValue();
 
 	self->mCurValue = new_val;  // set the value temporarily so that the callback can retrieve it.
-	if( self->mValidateSignal( self, new_val ) )
+	if( !self->mValidateSignal || (*(self->mValidateSignal))( self, new_val ) )
 	{
 		success = TRUE;
 	}
diff --git a/indra/llui/llpanel.cpp b/indra/llui/llpanel.cpp
index 89c46562973ec4e39982c235933ebba96fc38884..063822dd567ce25064300d76754de622fa043a95 100644
--- a/indra/llui/llpanel.cpp
+++ b/indra/llui/llpanel.cpp
@@ -106,7 +106,8 @@ LLPanel::LLPanel(const LLPanel::Params& p)
 	mHelpTopic(p.help_topic),
 	mCommitCallbackRegistrar(false),
 	mEnableCallbackRegistrar(false),
-	mXMLFilename(p.filename)
+	mXMLFilename(p.filename),
+	mVisibleSignal(NULL)
 	// *NOTE: Be sure to also change LLPanel::initFromParams().  We have too
 	// many classes derived from LLPanel to retrofit them all to pass in params.
 {
@@ -118,6 +119,11 @@ LLPanel::LLPanel(const LLPanel::Params& p)
 	mPanelHandle.bind(this);
 }
 
+LLPanel::~LLPanel()
+{
+	delete mVisibleSignal;
+}
+
 // virtual
 BOOL LLPanel::isPanel() const
 {
@@ -332,7 +338,8 @@ BOOL LLPanel::handleKeyHere( KEY key, MASK mask )
 void LLPanel::handleVisibilityChange ( BOOL new_visibility )
 {
 	LLUICtrl::handleVisibilityChange ( new_visibility );
-	mVisibleSignal(this, LLSD(new_visibility) ); // Pass BOOL as LLSD
+	if (mVisibleSignal)
+		(*mVisibleSignal)(this, LLSD(new_visibility) ); // Pass BOOL as LLSD
 }
 
 void LLPanel::setFocus(BOOL b)
@@ -424,7 +431,9 @@ void LLPanel::initFromParams(const LLPanel::Params& p)
 	
 	// visible callback 
 	if (p.visible_callback.isProvided())
-		initCommitCallback(p.visible_callback, mVisibleSignal);
+	{
+		setVisibleCallback(initCommitCallback(p.visible_callback));
+	}
 	
 	for (LLInitParam::ParamIterator<LocalizedString>::const_iterator it = p.strings().begin();
 		it != p.strings().end();
@@ -907,3 +916,13 @@ void LLPanel::childSetControlName(const std::string& id, const std::string& cont
 		view->setControlName(control_name, NULL);
 	}
 }
+
+boost::signals2::connection LLPanel::setVisibleCallback( const commit_signal_t::slot_type& cb )
+{
+	if (!mVisibleSignal)
+	{
+		mVisibleSignal = new commit_signal_t();
+	}
+
+	return mVisibleSignal->connect(cb);
+}
diff --git a/indra/llui/llpanel.h b/indra/llui/llpanel.h
index c213809d685a4d556ad3f044a1a6e6f435e4b803..0a0fed82fbddc1b994f2dcf4fbe5fb5937846367 100644
--- a/indra/llui/llpanel.h
+++ b/indra/llui/llpanel.h
@@ -109,7 +109,7 @@ class LLPanel : public LLUICtrl
 	
 public:
 // 	LLPanel(const std::string& name, const LLRect& rect = LLRect(), BOOL bordered = TRUE);
-	/*virtual*/ ~LLPanel() {}
+	/*virtual*/ ~LLPanel();
 
 	// LLView interface
 	/*virtual*/ BOOL 	isPanel() const;
@@ -241,6 +241,8 @@ class LLPanel : public LLUICtrl
 	void setXMLFilename(std::string filename) { mXMLFilename = filename; };
 	std::string getXMLFilename() { return mXMLFilename; };
 	
+	boost::signals2::connection setVisibleCallback( const commit_signal_t::slot_type& cb );
+
 protected:
 	// Override to set not found list
 	LLButton*		getDefaultButton() { return mDefaultBtn; }
@@ -249,7 +251,7 @@ class LLPanel : public LLUICtrl
 	EnableCallbackRegistry::ScopedRegistrar mEnableCallbackRegistrar;
 	VisibleCallbackRegistry::ScopedRegistrar mVisibleCallbackRegistrar;
 
-	commit_signal_t mVisibleSignal;		// Called when visibility changes, passes new visibility as LLSD()
+	commit_signal_t* mVisibleSignal;		// Called when visibility changes, passes new visibility as LLSD()
 
 	std::string		mHelpTopic;         // the name of this panel's help topic to display in the Help Viewer
 	
diff --git a/indra/llui/llslider.cpp b/indra/llui/llslider.cpp
index da2fc7c68b2fb5209536d87456183f0514bf9720..a6f729b396a1aeb051ed0102999255233bfc537c 100644
--- a/indra/llui/llslider.cpp
+++ b/indra/llui/llslider.cpp
@@ -77,7 +77,9 @@ LLSlider::LLSlider(const LLSlider::Params& p)
 	mTrackImageHorizontal(p.track_image_horizontal),
 	mTrackImageVertical(p.track_image_vertical),
 	mTrackHighlightHorizontalImage(p.track_highlight_horizontal_image),
-	mTrackHighlightVerticalImage(p.track_highlight_vertical_image)
+	mTrackHighlightVerticalImage(p.track_highlight_vertical_image),
+	mMouseDownSignal(NULL),
+	mMouseUpSignal(NULL)
 {
     mViewModel->setValue(p.initial_value);
 	updateThumbRect();
@@ -86,9 +88,19 @@ LLSlider::LLSlider(const LLSlider::Params& p)
 	setValue(getValueF32());
 	
 	if (p.mouse_down_callback.isProvided())
-		initCommitCallback(p.mouse_down_callback, mMouseDownSignal);
+	{
+		setMouseDownCallback(initCommitCallback(p.mouse_down_callback));
+	}
 	if (p.mouse_up_callback.isProvided())
-		initCommitCallback(p.mouse_up_callback, mMouseUpSignal);
+	{
+		setMouseUpCallback(initCommitCallback(p.mouse_up_callback));
+	}
+}
+
+LLSlider::~LLSlider()
+{
+	delete mMouseDownSignal;
+	delete mMouseUpSignal;
 }
 
 void LLSlider::setValue(F32 value, BOOL from_event)
@@ -202,7 +214,8 @@ BOOL LLSlider::handleMouseUp(S32 x, S32 y, MASK mask)
 	{
 		gFocusMgr.setMouseCapture( NULL );
 
-		mMouseUpSignal( this, getValueF32() );
+		if (mMouseUpSignal)
+			(*mMouseUpSignal)( this, getValueF32() );
 
 		handled = TRUE;
 		make_ui_sound("UISndClickRelease");
@@ -222,7 +235,8 @@ BOOL LLSlider::handleMouseDown(S32 x, S32 y, MASK mask)
 	{
 		setFocus(TRUE);
 	}
-	mMouseDownSignal( this, getValueF32() );
+	if (mMouseDownSignal)
+		(*mMouseDownSignal)( this, getValueF32() );
 
 	if (MASK_CONTROL & mask) // if CTRL is modifying
 	{
@@ -364,3 +378,15 @@ void LLSlider::draw()
 	
 	LLUICtrl::draw();
 }
+
+boost::signals2::connection LLSlider::setMouseDownCallback( const commit_signal_t::slot_type& cb ) 
+{ 
+	if (!mMouseDownSignal) mMouseDownSignal = new commit_signal_t();
+	return mMouseDownSignal->connect(cb); 
+}
+
+boost::signals2::connection LLSlider::setMouseUpCallback(	const commit_signal_t::slot_type& cb )   
+{ 
+	if (!mMouseUpSignal) mMouseUpSignal = new commit_signal_t();
+	return mMouseUpSignal->connect(cb); 
+}
diff --git a/indra/llui/llslider.h b/indra/llui/llslider.h
index 6ab0ed79220f8bc9228040944e4ec25a25b6f19c..45f8f81e409af8f8b8ca26f0cdc17239d3331986 100644
--- a/indra/llui/llslider.h
+++ b/indra/llui/llslider.h
@@ -67,6 +67,7 @@ class LLSlider : public LLF32UICtrl
 	LLSlider(const Params&);
 	friend class LLUICtrlFactory;
 public:
+	virtual ~LLSlider();
 	void			setValue( F32 value, BOOL from_event = FALSE );
     // overrides for LLF32UICtrl methods
 	virtual void	setValue(const LLSD& value )	{ setValue((F32)value.asReal(), TRUE); }
@@ -76,8 +77,8 @@ class LLSlider : public LLF32UICtrl
 	virtual void	setMinValue(F32 min_value) { LLF32UICtrl::setMinValue(min_value); updateThumbRect(); }
 	virtual void	setMaxValue(F32 max_value) { LLF32UICtrl::setMaxValue(max_value); updateThumbRect(); }
 
-	boost::signals2::connection setMouseDownCallback( const commit_signal_t::slot_type& cb ) { return mMouseDownSignal.connect(cb); }
-	boost::signals2::connection setMouseUpCallback(	const commit_signal_t::slot_type& cb )   { return mMouseUpSignal.connect(cb); }
+	boost::signals2::connection setMouseDownCallback( const commit_signal_t::slot_type& cb );
+	boost::signals2::connection setMouseUpCallback(	const commit_signal_t::slot_type& cb );
 
 	virtual BOOL	handleHover(S32 x, S32 y, MASK mask);
 	virtual BOOL	handleMouseUp(S32 x, S32 y, MASK mask);
@@ -109,8 +110,8 @@ class LLSlider : public LLF32UICtrl
 	LLUIColor	mThumbOutlineColor;
 	LLUIColor	mThumbCenterColor;
 	
-	commit_signal_t	mMouseDownSignal;
-	commit_signal_t	mMouseUpSignal;
+	commit_signal_t*	mMouseDownSignal;
+	commit_signal_t*	mMouseUpSignal;
 };
 
 #endif  // LL_LLSLIDER_H
diff --git a/indra/llui/llsliderctrl.cpp b/indra/llui/llsliderctrl.cpp
index ed22c0a47f8ac07ea994edf0d85e6fb0102e18af..a4f89ae1d38f609d026edacbde5574bdbf3b67a7 100644
--- a/indra/llui/llsliderctrl.cpp
+++ b/indra/llui/llsliderctrl.cpp
@@ -260,7 +260,7 @@ void LLSliderCtrl::onEditorCommit( LLUICtrl* ctrl, const LLSD& userdata )
 		if( self->mSlider->getMinValue() <= val && val <= self->mSlider->getMaxValue() )
 		{
 			self->setValue( val );  // set the value temporarily so that the callback can retrieve it.
-			if( self->mValidateSignal( self, val ) )
+			if( !self->mValidateSignal || (*(self->mValidateSignal))( self, val ) )
 			{
 				success = TRUE;
 			}
@@ -294,7 +294,7 @@ void LLSliderCtrl::onSliderCommit( LLUICtrl* ctrl, const LLSD& userdata )
 	F32 new_val = self->mSlider->getValueF32();
 
 	self->mValue = new_val;  // set the value temporarily so that the callback can retrieve it.
-	if( self->mValidateSignal( self, new_val ) )
+	if( !self->mValidateSignal || (*(self->mValidateSignal))( self, new_val ) )
 	{
 		success = TRUE;
 	}
diff --git a/indra/llui/llspinctrl.cpp b/indra/llui/llspinctrl.cpp
index bedf16a397ddd7845f94bf7196a65601f1bc7108..d6d46654d57003bff84c31b680d2ee45b153dcb9 100644
--- a/indra/llui/llspinctrl.cpp
+++ b/indra/llui/llspinctrl.cpp
@@ -190,7 +190,7 @@ void LLSpinCtrl::onUpBtn( const LLSD& data )
 		
 			F32 saved_val = (F32)getValue().asReal();
 			setValue(val);
-			if( !mValidateSignal( this, val ) )
+			if( mValidateSignal && !(*mValidateSignal)( this, val ) )
 			{
 				setValue( saved_val );
 				reportInvalidData();
@@ -224,7 +224,7 @@ void LLSpinCtrl::onDownBtn( const LLSD& data )
 			
 			F32 saved_val = (F32)getValue().asReal();
 			setValue(val);
-			if( !mValidateSignal( this, val ) )
+			if( mValidateSignal && !(*mValidateSignal)( this, val ) )
 			{
 				setValue( saved_val );
 				reportInvalidData();
@@ -316,7 +316,7 @@ void LLSpinCtrl::onEditorCommit( const LLSD& data )
 
 		F32 saved_val = getValueF32();
 		setValue(val);
-		if( mValidateSignal( this, val ) )
+		if( !mValidateSignal || (*mValidateSignal)( this, val ) )
 		{
 			success = TRUE;
 			onCommit();
diff --git a/indra/llui/lltabcontainer.cpp b/indra/llui/lltabcontainer.cpp
index f5d81748206271588011911e90e5ac08653dbca4..d7d61cf6cb1cc0c50f46b75c7a837d673ace3b76 100644
--- a/indra/llui/lltabcontainer.cpp
+++ b/indra/llui/lltabcontainer.cpp
@@ -1339,12 +1339,12 @@ BOOL LLTabContainer::selectTab(S32 which)
 		cbdata = selected_tuple->mTabPanel->getName();
 
 	BOOL res = FALSE;
-	if( mValidateSignal( this, cbdata ) )
+	if( !mValidateSignal || (*mValidateSignal)( this, cbdata ) )
 	{
 		res = setTab(which);
-		if (res)
+		if (res && mCommitSignal)
 		{
-			mCommitSignal(this, cbdata);
+			(*mCommitSignal)(this, cbdata);
 		}
 	}
 	
diff --git a/indra/llui/lltextbase.cpp b/indra/llui/lltextbase.cpp
index e210667764bbabc96a54128c33727a7792202f5c..3619b36c0d825eb3f48b8aad644719b29e5918e2 100644
--- a/indra/llui/lltextbase.cpp
+++ b/indra/llui/lltextbase.cpp
@@ -60,6 +60,11 @@ LLTextBase::line_info::line_info(S32 index_start, S32 index_end, LLRect rect, S3
 
 bool LLTextBase::compare_segment_end::operator()(const LLTextSegmentPtr& a, const LLTextSegmentPtr& b) const
 {
+	// sort empty spans (e.g. 11-11) after previous non-empty spans (e.g. 5-11)
+	if (a->getEnd() == b->getEnd())
+	{
+		return a->getStart() < b->getStart();
+	}
 	return a->getEnd() < b->getEnd();
 }
 
diff --git a/indra/llui/lluictrl.cpp b/indra/llui/lluictrl.cpp
index 08fc8fb7849203697e2e183446b80ba4709356bb..a30d5b4651d30daeede064016bf8e3404df5905d 100644
--- a/indra/llui/lluictrl.cpp
+++ b/indra/llui/lluictrl.cpp
@@ -78,7 +78,16 @@ LLUICtrl::LLUICtrl(const LLUICtrl::Params& p, const LLViewModelPtr& viewmodel)
 	mEnabledControlVariable(NULL),
 	mDisabledControlVariable(NULL),
 	mMakeVisibleControlVariable(NULL),
-	mMakeInvisibleControlVariable(NULL)
+	mMakeInvisibleControlVariable(NULL),
+	mCommitSignal(NULL),
+	mValidateSignal(NULL),
+	mMouseEnterSignal(NULL),
+	mMouseLeaveSignal(NULL),
+	mMouseDownSignal(NULL),
+	mMouseUpSignal(NULL),
+	mRightMouseDownSignal(NULL),
+	mRightMouseUpSignal(NULL),
+	mDoubleClickSignal(NULL)
 {
 	mUICtrlHandle.bind(this);
 }
@@ -129,10 +138,14 @@ void LLUICtrl::initFromParams(const Params& p)
 	}
 	
 	if (p.commit_callback.isProvided())
-		initCommitCallback(p.commit_callback, mCommitSignal);
+	{
+		setCommitCallback(initCommitCallback(p.commit_callback));
+	}
 	
 	if (p.validate_callback.isProvided())
-		initEnableCallback(p.validate_callback, mValidateSignal);
+	{
+		setValidateCallback(initEnableCallback(p.validate_callback));
+	}
 	
 	if (p.init_callback.isProvided())
 	{
@@ -151,10 +164,14 @@ void LLUICtrl::initFromParams(const Params& p)
 	}
 
 	if(p.mouseenter_callback.isProvided())
-		initCommitCallback(p.mouseenter_callback, mMouseEnterSignal);
+	{
+		setMouseEnterCallback(initCommitCallback(p.mouseenter_callback));
+	}
 
 	if(p.mouseleave_callback.isProvided())
-		initCommitCallback(p.mouseleave_callback, mMouseLeaveSignal);
+	{
+		setMouseLeaveCallback(initCommitCallback(p.mouseleave_callback));
+	}
 }
 
 
@@ -167,16 +184,40 @@ LLUICtrl::~LLUICtrl()
 		llwarns << "UI Control holding top ctrl deleted: " << getName() << ".  Top view removed." << llendl;
 		gFocusMgr.removeTopCtrlWithoutCallback( this );
 	}
+
+	delete mCommitSignal;
+	delete mValidateSignal;
+	delete mMouseEnterSignal;
+	delete mMouseLeaveSignal;
+	delete mMouseDownSignal;
+	delete mMouseUpSignal;
+	delete mRightMouseDownSignal;
+	delete mRightMouseUpSignal;
+	delete mDoubleClickSignal;
 }
 
-void LLUICtrl::initCommitCallback(const CommitCallbackParam& cb, commit_signal_t& sig)
+void default_commit_handler(LLUICtrl* ctrl, const LLSD& param)
+{}
+
+bool default_enable_handler(LLUICtrl* ctrl, const LLSD& param)
+{
+	return true;
+}
+
+bool default_visible_handler(LLUICtrl* ctrl, const LLSD& param)
+{
+	return true;
+}
+
+
+LLUICtrl::commit_signal_t::slot_type LLUICtrl::initCommitCallback(const CommitCallbackParam& cb)
 {
 	if (cb.function.isProvided())
 	{
 		if (cb.parameter.isProvided())
-			sig.connect(boost::bind(cb.function(), _1, cb.parameter));
+			return boost::bind(cb.function(), _1, cb.parameter);
 		else
-			sig.connect(cb.function());
+			return cb.function();
 	}
 	else
 	{
@@ -185,26 +226,27 @@ void LLUICtrl::initCommitCallback(const CommitCallbackParam& cb, commit_signal_t
 		if (func)
 		{
 			if (cb.parameter.isProvided())
-				sig.connect(boost::bind((*func), _1, cb.parameter));
+				return boost::bind((*func), _1, cb.parameter);
 			else
-				sig.connect(*func);
+				return commit_signal_t::slot_type(*func);
 		}
 		else if (!function_name.empty())
 		{
 			llwarns << "No callback found for: '" << function_name << "' in control: " << getName() << llendl;
 		}			
 	}
+	return default_commit_handler;
 }
 
-void LLUICtrl::initEnableCallback(const EnableCallbackParam& cb, enable_signal_t& sig)
+LLUICtrl::enable_signal_t::slot_type LLUICtrl::initEnableCallback(const EnableCallbackParam& cb)
 {
 	// Set the callback function
 	if (cb.function.isProvided())
 	{
 		if (cb.parameter.isProvided())
-			sig.connect(boost::bind(cb.function(), this, cb.parameter));
+			return boost::bind(cb.function(), this, cb.parameter);
 		else
-			sig.connect(cb.function());
+			return cb.function();
 	}
 	else
 	{
@@ -212,22 +254,23 @@ void LLUICtrl::initEnableCallback(const EnableCallbackParam& cb, enable_signal_t
 		if (func)
 		{
 			if (cb.parameter.isProvided())
-				sig.connect(boost::bind((*func), this, cb.parameter));
+				return boost::bind((*func), this, cb.parameter);
 			else
-				sig.connect(*func);
+				return enable_signal_t::slot_type(*func);
 		}
 	}
+	return default_enable_handler;
 }
 
-void LLUICtrl::initVisibleCallback(const VisibleCallbackParam& cb, visible_signal_t& sig)
+LLUICtrl::visible_signal_t::slot_type LLUICtrl::initVisibleCallback(const VisibleCallbackParam& cb)
 {
 	// Set the callback function
 	if (cb.function.isProvided())
 	{
 		if (cb.parameter.isProvided())
-			sig.connect(boost::bind(cb.function(), this, cb.parameter));
+			return boost::bind(cb.function(), this, cb.parameter);
 		else
-			sig.connect(cb.function());
+			return cb.function();
 	}
 	else
 	{
@@ -235,30 +278,40 @@ void LLUICtrl::initVisibleCallback(const VisibleCallbackParam& cb, visible_signa
 		if (func)
 		{
 			if (cb.parameter.isProvided())
-				sig.connect(boost::bind((*func), this, cb.parameter));
+				return boost::bind((*func), this, cb.parameter);
 			else
-				sig.connect(*func);
+				return visible_signal_t::slot_type(*func);
 		}
 	}
+	return default_visible_handler;
 }
 
 // virtual
 void LLUICtrl::onMouseEnter(S32 x, S32 y, MASK mask)
 {
-	mMouseEnterSignal(this, getValue());
+	if (mMouseEnterSignal)
+	{
+		(*mMouseEnterSignal)(this, getValue());
+	}
 }
 
 // virtual
 void LLUICtrl::onMouseLeave(S32 x, S32 y, MASK mask)
 {
-	mMouseLeaveSignal(this, getValue());
+	if(mMouseLeaveSignal)
+	{
+		(*mMouseLeaveSignal)(this, getValue());
+	}
 }
 
 //virtual 
 BOOL LLUICtrl::handleMouseDown(S32 x, S32 y, MASK mask)
 {
 	BOOL handled  = LLView::handleMouseDown(x,y,mask);
-	mMouseDownSignal(this,x,y,mask);
+	if (mMouseDownSignal)
+	{
+		(*mMouseDownSignal)(this,x,y,mask);
+	}
 	return handled;
 }
 
@@ -266,7 +319,10 @@ BOOL LLUICtrl::handleMouseDown(S32 x, S32 y, MASK mask)
 BOOL LLUICtrl::handleMouseUp(S32 x, S32 y, MASK mask)
 {
 	BOOL handled  = LLView::handleMouseUp(x,y,mask);
-	mMouseUpSignal(this,x,y,mask);
+	if (mMouseUpSignal)
+	{
+		(*mMouseUpSignal)(this,x,y,mask);
+	}
 	return handled;
 }
 
@@ -274,7 +330,10 @@ BOOL LLUICtrl::handleMouseUp(S32 x, S32 y, MASK mask)
 BOOL LLUICtrl::handleRightMouseDown(S32 x, S32 y, MASK mask)
 {
 	BOOL handled  = LLView::handleRightMouseDown(x,y,mask);
-	mRightMouseDownSignal(this,x,y,mask);
+	if (mRightMouseDownSignal)
+	{
+		(*mRightMouseDownSignal)(this,x,y,mask);
+	}
 	return handled;
 }
 
@@ -282,14 +341,20 @@ BOOL LLUICtrl::handleRightMouseDown(S32 x, S32 y, MASK mask)
 BOOL LLUICtrl::handleRightMouseUp(S32 x, S32 y, MASK mask)
 {
 	BOOL handled  = LLView::handleRightMouseUp(x,y,mask);
-	mRightMouseUpSignal(this,x,y,mask);
+	if(mRightMouseUpSignal)
+	{
+		(*mRightMouseUpSignal)(this,x,y,mask);
+	}
 	return handled;
 }
 
 BOOL LLUICtrl::handleDoubleClick(S32 x, S32 y, MASK mask)
 {
 	BOOL handled = LLView::handleDoubleClick(x, y, mask);
-	mDoubleClickSignal(this, x, y, mask);
+	if (mDoubleClickSignal)
+	{
+		(*mDoubleClickSignal)(this, x, y, mask);
+	}
 	return handled;
 }
 
@@ -302,7 +367,8 @@ BOOL LLUICtrl::canFocusChildren() const
 
 void LLUICtrl::onCommit()
 {
-	mCommitSignal(this, getValue());
+	if (mCommitSignal)
+	(*mCommitSignal)(this, getValue());
 }
 
 //virtual
@@ -832,7 +898,8 @@ boost::signals2::connection LLUICtrl::setCommitCallback( boost::function<void (L
 }
 boost::signals2::connection LLUICtrl::setValidateBeforeCommit( boost::function<bool (const LLSD& data)> cb )
 {
-	return mValidateSignal.connect(boost::bind(cb, _2));
+	if (!mValidateSignal) mValidateSignal = new enable_signal_t();
+	return mValidateSignal->connect(boost::bind(cb, _2));
 }
 
 // virtual
@@ -850,3 +917,57 @@ BOOL LLUICtrl::getTentative() const
 // virtual
 void LLUICtrl::setColor(const LLColor4& color)							
 { }
+
+boost::signals2::connection LLUICtrl::setCommitCallback( const commit_signal_t::slot_type& cb ) 
+{ 
+	if (!mCommitSignal) mCommitSignal = new commit_signal_t();
+	return mCommitSignal->connect(cb); 
+}
+
+boost::signals2::connection LLUICtrl::setValidateCallback( const enable_signal_t::slot_type& cb ) 
+{ 
+	if (!mValidateSignal) mValidateSignal = new enable_signal_t();
+	return mValidateSignal->connect(cb); 
+}
+
+boost::signals2::connection LLUICtrl::setMouseEnterCallback( const commit_signal_t::slot_type& cb ) 
+{ 
+	if (!mMouseEnterSignal) mMouseEnterSignal = new commit_signal_t();
+	return mMouseEnterSignal->connect(cb); 
+}
+
+boost::signals2::connection LLUICtrl::setMouseLeaveCallback( const commit_signal_t::slot_type& cb ) 
+{ 
+	if (!mMouseLeaveSignal) mMouseLeaveSignal = new commit_signal_t();
+	return mMouseLeaveSignal->connect(cb); 
+}
+
+boost::signals2::connection LLUICtrl::setMouseDownCallback( const mouse_signal_t::slot_type& cb ) 
+{ 
+	if (!mMouseDownSignal) mMouseDownSignal = new mouse_signal_t();
+	return mMouseDownSignal->connect(cb); 
+}
+
+boost::signals2::connection LLUICtrl::setMouseUpCallback( const mouse_signal_t::slot_type& cb ) 
+{ 
+	if (!mMouseUpSignal) mMouseUpSignal = new mouse_signal_t();
+	return mMouseUpSignal->connect(cb); 
+}
+
+boost::signals2::connection LLUICtrl::setRightMouseDownCallback( const mouse_signal_t::slot_type& cb ) 
+{ 
+	if (!mRightMouseDownSignal) mRightMouseDownSignal = new mouse_signal_t();
+	return mRightMouseDownSignal->connect(cb); 
+}
+
+boost::signals2::connection LLUICtrl::setRightMouseUpCallback( const mouse_signal_t::slot_type& cb ) 
+{ 
+	if (!mRightMouseUpSignal) mRightMouseUpSignal = new mouse_signal_t();
+	return mRightMouseUpSignal->connect(cb); 
+}
+
+boost::signals2::connection LLUICtrl::setDoubleClickCallback( const mouse_signal_t::slot_type& cb ) 
+{ 
+	if (!mDoubleClickSignal) mDoubleClickSignal = new mouse_signal_t();
+	return mDoubleClickSignal->connect(cb); 
+}
diff --git a/indra/llui/lluictrl.h b/indra/llui/lluictrl.h
index dd22851100b0f3cf081ed5c32dee8266b1da76e9..aef1bcd5194341e7d545956f2b155628e63d6398 100644
--- a/indra/llui/lluictrl.h
+++ b/indra/llui/lluictrl.h
@@ -162,9 +162,9 @@ class LLUICtrl
 	LLUICtrl(const Params& p = getDefaultParams(),
              const LLViewModelPtr& viewmodel=LLViewModelPtr(new LLViewModel));
 	
-	void initCommitCallback(const CommitCallbackParam& cb, commit_signal_t& sig);
-	void initEnableCallback(const EnableCallbackParam& cb, enable_signal_t& sig);
-	void initVisibleCallback(const VisibleCallbackParam& cb, visible_signal_t& sig);
+	commit_signal_t::slot_type initCommitCallback(const CommitCallbackParam& cb);
+	enable_signal_t::slot_type initEnableCallback(const EnableCallbackParam& cb);
+	visible_signal_t::slot_type initVisibleCallback(const VisibleCallbackParam& cb);
 
 	// We need this virtual so we can override it with derived versions
 	virtual LLViewModel* getViewModel() const;
@@ -254,18 +254,18 @@ class LLUICtrl
 	// topic then put in help_topic_out
 	bool                    findHelpTopic(std::string& help_topic_out);
 
-	boost::signals2::connection setCommitCallback( const commit_signal_t::slot_type& cb ) { return mCommitSignal.connect(cb); }
-	boost::signals2::connection setValidateCallback( const enable_signal_t::slot_type& cb ) { return mValidateSignal.connect(cb); }
+	boost::signals2::connection setCommitCallback( const commit_signal_t::slot_type& cb );
+	boost::signals2::connection setValidateCallback( const enable_signal_t::slot_type& cb );
 
-	boost::signals2::connection setMouseEnterCallback( const commit_signal_t::slot_type& cb ) { return mMouseEnterSignal.connect(cb); }
-	boost::signals2::connection setMouseLeaveCallback( const commit_signal_t::slot_type& cb ) { return mMouseLeaveSignal.connect(cb); }
+	boost::signals2::connection setMouseEnterCallback( const commit_signal_t::slot_type& cb );
+	boost::signals2::connection setMouseLeaveCallback( const commit_signal_t::slot_type& cb );
 	
-	boost::signals2::connection setMouseDownCallback( const mouse_signal_t::slot_type& cb ) { return mMouseDownSignal.connect(cb); }
-	boost::signals2::connection setMouseUpCallback( const mouse_signal_t::slot_type& cb ) { return mMouseUpSignal.connect(cb); }
-	boost::signals2::connection setRightMouseDownCallback( const mouse_signal_t::slot_type& cb ) { return mRightMouseDownSignal.connect(cb); }
-	boost::signals2::connection setRightMouseUpCallback( const mouse_signal_t::slot_type& cb ) { return mRightMouseUpSignal.connect(cb); }
+	boost::signals2::connection setMouseDownCallback( const mouse_signal_t::slot_type& cb );
+	boost::signals2::connection setMouseUpCallback( const mouse_signal_t::slot_type& cb );
+	boost::signals2::connection setRightMouseDownCallback( const mouse_signal_t::slot_type& cb );
+	boost::signals2::connection setRightMouseUpCallback( const mouse_signal_t::slot_type& cb );
 	
-	boost::signals2::connection setDoubleClickCallback( const mouse_signal_t::slot_type& cb ) { return mDoubleClickSignal.connect(cb); }
+	boost::signals2::connection setDoubleClickCallback( const mouse_signal_t::slot_type& cb );
 
 	// *TODO: Deprecate; for backwards compatability only:
 	boost::signals2::connection setCommitCallback( boost::function<void (LLUICtrl*,void*)> cb, void* data);	
@@ -293,18 +293,18 @@ class LLUICtrl
 
 	static bool controlListener(const LLSD& newvalue, LLHandle<LLUICtrl> handle, std::string type);
 
-	commit_signal_t		mCommitSignal;
-	enable_signal_t		mValidateSignal;
+	commit_signal_t*		mCommitSignal;
+	enable_signal_t*		mValidateSignal;
 
-	commit_signal_t		mMouseEnterSignal;
-	commit_signal_t		mMouseLeaveSignal;
+	commit_signal_t*		mMouseEnterSignal;
+	commit_signal_t*		mMouseLeaveSignal;
 	
-	mouse_signal_t		mMouseDownSignal;
-	mouse_signal_t		mMouseUpSignal;
-	mouse_signal_t		mRightMouseDownSignal;
-	mouse_signal_t		mRightMouseUpSignal;
+	mouse_signal_t*		mMouseDownSignal;
+	mouse_signal_t*		mMouseUpSignal;
+	mouse_signal_t*		mRightMouseDownSignal;
+	mouse_signal_t*		mRightMouseUpSignal;
 
-	mouse_signal_t		mDoubleClickSignal;
+	mouse_signal_t*		mDoubleClickSignal;
 	
     LLViewModelPtr  mViewModel;
 
diff --git a/indra/llxuixml/llinitparam.cpp b/indra/llxuixml/llinitparam.cpp
index 318a0348a2aec14e5b06b545f034939dbb52498f..4c050844f86691e41deacade72d0b56027ee2332 100644
--- a/indra/llxuixml/llinitparam.cpp
+++ b/indra/llxuixml/llinitparam.cpp
@@ -46,7 +46,7 @@ namespace LLInitParam
 	{
 		const U8* my_addr = reinterpret_cast<const U8*>(this);
 		const U8* block_addr = reinterpret_cast<const U8*>(enclosing_block);
-		mEnclosingBlockOffset = (S16)(block_addr - my_addr);
+		mEnclosingBlockOffset = (U16)(my_addr - block_addr);
 	}
 
 	//
diff --git a/indra/llxuixml/llinitparam.h b/indra/llxuixml/llinitparam.h
index 9fb464ca7b9c4809a16233c4089009389401a2ad..493ddaa3785d118543035b876dd2f0d77d017415 100644
--- a/indra/llxuixml/llinitparam.h
+++ b/indra/llxuixml/llinitparam.h
@@ -300,14 +300,14 @@ namespace LLInitParam
 			const U8* my_addr = reinterpret_cast<const U8*>(this);
 			// get address of enclosing BLOCK class using stored offset to enclosing BaseBlock class
 			return *const_cast<BaseBlock*>(
-							reinterpret_cast<const BaseBlock*>(my_addr + (ptrdiff_t)mEnclosingBlockOffset));
+							reinterpret_cast<const BaseBlock*>(my_addr - (ptrdiff_t)(S32)mEnclosingBlockOffset));
 		}
 
 	private:
 		friend class BaseBlock;
 
 		bool		mIsProvided;
-		S16			mEnclosingBlockOffset;
+		U16			mEnclosingBlockOffset;
 	};
 
 	// various callbacks and constraints associated with an individual param
diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index c7279a2e333e2e063f286261e89c5a304a7460b2..21ccf2ac9134142c62ac02995177669e3970b0f5 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -7709,7 +7709,7 @@
       <key>Value</key>
       <integer>0</integer>
     </map>
-    <key>ShowCoordinatesOption</key>
+    <key>NavBarShowCoordinates</key>
     <map>
       <key>Comment</key>
       <string>Show Coordinates in  Location Input Field</string>
diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp
index 4dd569e2fab456293128e18ff742bdb0aa2109a9..eb5d172ff7d7689f534d98d82f5f132a978f4db2 100644
--- a/indra/newview/llagent.cpp
+++ b/indra/newview/llagent.cpp
@@ -2795,7 +2795,8 @@ void LLAgent::endAnimationUpdateUI()
 
 		LLBottomTray::getInstance()->setVisible(TRUE);
 
-		LLSideTray::getInstance()->setVisible(TRUE);
+		LLSideTray::getInstance()->getButtonsPanel()->setVisible(TRUE);
+		LLSideTray::getInstance()->updateSidetrayVisibility();
 
 		LLPanelStandStopFlying::getInstance()->setVisible(TRUE);
 
@@ -2893,7 +2894,8 @@ void LLAgent::endAnimationUpdateUI()
 
 		LLBottomTray::getInstance()->setVisible(FALSE);
 
-		LLSideTray::getInstance()->setVisible(FALSE);
+		LLSideTray::getInstance()->getButtonsPanel()->setVisible(FALSE);
+		LLSideTray::getInstance()->updateSidetrayVisibility();
 
 		LLPanelStandStopFlying::getInstance()->setVisible(FALSE);
 
diff --git a/indra/newview/llagentui.cpp b/indra/newview/llagentui.cpp
index 568ac4164ac154db08c1c45cc3e3a2d560ff2b44..7404fe5bc4726b0324cec3686ba3d6d4f15a6d8d 100644
--- a/indra/newview/llagentui.cpp
+++ b/indra/newview/llagentui.cpp
@@ -130,6 +130,7 @@ BOOL LLAgentUI::buildLocationString(std::string& str, ELocationFormat fmt,const
 	// create a default name and description for the landmark
 	std::string parcel_name = LLViewerParcelMgr::getInstance()->getAgentParcelName();
 	std::string region_name = region->getName();
+	std::string sim_access_string = region->getSimAccessString();
 	std::string buffer;
 	if( parcel_name.empty() )
 	{
@@ -142,7 +143,13 @@ BOOL LLAgentUI::buildLocationString(std::string& str, ELocationFormat fmt,const
 		case LOCATION_FORMAT_NORMAL:
 			buffer = llformat("%s", region_name.c_str());
 			break;
-		case LOCATION_FORMAT_WITHOUT_SIM:
+		case LOCATION_FORMAT_NO_COORDS:
+			buffer = llformat("%s%s%s",
+				region_name.c_str(),
+				sim_access_string.empty() ? "" : " - ",
+				sim_access_string.c_str());
+			break;
+		case LOCATION_FORMAT_NO_MATURITY:
 		case LOCATION_FORMAT_FULL:
 			buffer = llformat("%s (%d, %d, %d)",
 				region_name.c_str(),
@@ -161,14 +168,20 @@ BOOL LLAgentUI::buildLocationString(std::string& str, ELocationFormat fmt,const
 		case LOCATION_FORMAT_NORMAL:
 			buffer = llformat("%s, %s", parcel_name.c_str(), region_name.c_str());
 			break;
-		case LOCATION_FORMAT_WITHOUT_SIM:
+		case LOCATION_FORMAT_NO_MATURITY:
 			buffer = llformat("%s, %s (%d, %d, %d)",
 				parcel_name.c_str(),
 				region_name.c_str(),
 				pos_x, pos_y, pos_z);
 			break;
+		case LOCATION_FORMAT_NO_COORDS:
+			buffer = llformat("%s, %s%s%s",
+							  parcel_name.c_str(),
+							  region_name.c_str(),
+							  sim_access_string.empty() ? "" : " - ",
+							  sim_access_string.c_str());
+				break;
 		case LOCATION_FORMAT_FULL:
-			std::string sim_access_string = region->getSimAccessString();
 			buffer = llformat("%s, %s (%d, %d, %d)%s%s",
 				parcel_name.c_str(),
 				region_name.c_str(),
diff --git a/indra/newview/llagentui.h b/indra/newview/llagentui.h
index c7aafb71e7b9db4f8b1c4c64c245963a37284df6..3478793e38f3f198c5e4af2ca5b24a6892d03c8b 100644
--- a/indra/newview/llagentui.h
+++ b/indra/newview/llagentui.h
@@ -38,10 +38,11 @@ class LLAgentUI
 public:
 	enum ELocationFormat
 	{
-		LOCATION_FORMAT_NORMAL,
-		LOCATION_FORMAT_LANDMARK,
-		LOCATION_FORMAT_WITHOUT_SIM,
-		LOCATION_FORMAT_FULL,
+		LOCATION_FORMAT_NORMAL,			// Parcel
+		LOCATION_FORMAT_LANDMARK,		// Parcel, Region
+		LOCATION_FORMAT_NO_MATURITY,	// Parcel, Region (x, y, z)
+		LOCATION_FORMAT_NO_COORDS,		// Parcel, Region - Maturity
+		LOCATION_FORMAT_FULL,			// Parcel, Region (x, y, z) - Maturity
 	};
 
 	static void buildName(std::string& name);
diff --git a/indra/newview/llchiclet.cpp b/indra/newview/llchiclet.cpp
index 6a5877f67351c96f201d15e548c856035ecba47e..fa822e4edc77afb18a31687443e990f396793151 100644
--- a/indra/newview/llchiclet.cpp
+++ b/indra/newview/llchiclet.cpp
@@ -163,7 +163,7 @@ LLChiclet::~LLChiclet()
 boost::signals2::connection LLChiclet::setLeftButtonClickCallback(
 	const commit_callback_t& cb)
 {
-	return mCommitSignal.connect(cb);
+	return setCommitCallback(cb);
 }
 
 BOOL LLChiclet::handleMouseDown(S32 x, S32 y, MASK mask)
@@ -983,7 +983,10 @@ void LLChicletPanel::onChicletSizeChanged(LLChiclet* ctrl, const LLSD& param)
 
 void LLChicletPanel::onChicletClick(LLUICtrl*ctrl,const LLSD&param)
 {
-	mCommitSignal(ctrl,param);
+	if (mCommitSignal)
+	{
+		(*mCommitSignal)(ctrl,param);
+	}
 }
 
 void LLChicletPanel::removeChiclet(chiclet_list_t::iterator it)
@@ -1288,7 +1291,7 @@ void LLChicletPanel::onRightScrollHeldDown()
 boost::signals2::connection LLChicletPanel::setChicletClickedCallback(
 	const commit_callback_t& cb)
 {
-	return mCommitSignal.connect(cb);
+	return setCommitCallback(cb);
 }
 
 BOOL LLChicletPanel::handleScrollWheel(S32 x, S32 y, S32 clicks)
diff --git a/indra/newview/llfavoritesbar.cpp b/indra/newview/llfavoritesbar.cpp
index ae5be8cc7c92ce04c0bef6687a9c581cce2f80dc..8406ddeeca04131d8f59744670b0135d96d0dca1 100644
--- a/indra/newview/llfavoritesbar.cpp
+++ b/indra/newview/llfavoritesbar.cpp
@@ -232,13 +232,15 @@ class LLFavoriteLandmarkMenuItem : public LLMenuItemCallGL
 
 	virtual BOOL handleMouseDown(S32 x, S32 y, MASK mask)
 	{
-		mMouseDownSignal(this, x, y, mask);
+		if (mMouseDownSignal)
+			(*mMouseDownSignal)(this, x, y, mask);
 		return LLMenuItemCallGL::handleMouseDown(x, y, mask);
 	}
 
 	virtual BOOL handleMouseUp(S32 x, S32 y, MASK mask)
 	{
-		mMouseUpSignal(this, x, y, mask);
+		if (mMouseUpSignal)
+			(*mMouseUpSignal)(this, x, y, mask);
 		return LLMenuItemCallGL::handleMouseUp(x, y, mask);
 	}
 
diff --git a/indra/newview/llfloaterbuyland.cpp b/indra/newview/llfloaterbuyland.cpp
index 467796b4a39b0df33ef1ab3ac12f084069a1193b..976aaf8044727b7c329d5e35925ec335afe828fa 100644
--- a/indra/newview/llfloaterbuyland.cpp
+++ b/indra/newview/llfloaterbuyland.cpp
@@ -903,7 +903,7 @@ void LLFloaterBuyLandUI::tellUserError(
 // virtual
 BOOL LLFloaterBuyLandUI::postBuild()
 {
-	mVisibleSignal.connect(boost::bind(&LLFloaterBuyLandUI::onVisibilityChange, this, _2));
+	setVisibleCallback(boost::bind(&LLFloaterBuyLandUI::onVisibilityChange, this, _2));
 	
 	mCurrency.prepare();
 	
diff --git a/indra/newview/llfloaterchat.cpp b/indra/newview/llfloaterchat.cpp
index 58025ef78beb03c5bc34d53b3126220c50c94410..57bb93d81afef3ea51355af4372a798bbdd70dd8 100644
--- a/indra/newview/llfloaterchat.cpp
+++ b/indra/newview/llfloaterchat.cpp
@@ -129,7 +129,7 @@ void LLFloaterChat::draw()
 BOOL LLFloaterChat::postBuild()
 {
 	// Hide the chat overlay when our history is visible.
-	mVisibleSignal.connect(boost::bind(&LLFloaterChat::updateConsoleVisibility, this));
+	setVisibleCallback(boost::bind(&LLFloaterChat::updateConsoleVisibility, this));
 	
 	mPanel = (LLPanelActiveSpeakers*)getChild<LLPanel>("active_speakers_panel");
 
diff --git a/indra/newview/llfloaterchatterbox.cpp b/indra/newview/llfloaterchatterbox.cpp
index fbf09207feaace624dd085a6d57f913752c249b7..1b14ca573ab64cb2899f49344a27d148e2db90b2 100644
--- a/indra/newview/llfloaterchatterbox.cpp
+++ b/indra/newview/llfloaterchatterbox.cpp
@@ -114,7 +114,7 @@ LLFloaterChatterBox::~LLFloaterChatterBox()
 
 BOOL LLFloaterChatterBox::postBuild()
 {
-	mVisibleSignal.connect(boost::bind(&LLFloaterChatterBox::onVisibilityChange, this, _2));
+	setVisibleCallback(boost::bind(&LLFloaterChatterBox::onVisibilityChange, this, _2));
 	
 	if (gSavedSettings.getBOOL("ContactsTornOff"))
 	{
diff --git a/indra/newview/llfloaterland.cpp b/indra/newview/llfloaterland.cpp
index 22d6098d5bc3706c5227f3551f71ef2288b1a095..d855ab1dfa78fcf06d4f898f244949c24588ed0e 100644
--- a/indra/newview/llfloaterland.cpp
+++ b/indra/newview/llfloaterland.cpp
@@ -239,7 +239,7 @@ LLFloaterLand::LLFloaterLand(const LLSD& seed)
 
 BOOL LLFloaterLand::postBuild()
 {	
-	mVisibleSignal.connect(boost::bind(&LLFloaterLand::onVisibilityChange, this, _2));
+	setVisibleCallback(boost::bind(&LLFloaterLand::onVisibilityChange, this, _2));
 	
 	LLTabContainer* tab = getChild<LLTabContainer>("landtab");
 
diff --git a/indra/newview/llglsandbox.cpp b/indra/newview/llglsandbox.cpp
index 43fbe362d5954b65820865c063d690b71f6b7c2d..750a9d478fe5c1ee023716fc3885697bece3c345 100644
--- a/indra/newview/llglsandbox.cpp
+++ b/indra/newview/llglsandbox.cpp
@@ -67,7 +67,10 @@
 #include "llresmgr.h"
 #include "pipeline.h"
 #include "llspatialpartition.h"
- 
+
+// Height of the yellow selection highlight posts for land
+const F32 PARCEL_POST_HEIGHT = 0.666f;
+
 BOOL LLAgent::setLookAt(ELookAtType target_type, LLViewerObject *object, LLVector3 position)
 {
 	if(object && object->isAttachment())
diff --git a/indra/newview/llimpanel.cpp b/indra/newview/llimpanel.cpp
index 87b801d73b6b707ccf0f194a31591bbc67e26fd3..e6ded5f371b9b9e05b8fc28d42d9e328b43c18d0 100644
--- a/indra/newview/llimpanel.cpp
+++ b/indra/newview/llimpanel.cpp
@@ -216,7 +216,7 @@ LLFloaterIMPanel::~LLFloaterIMPanel()
 
 BOOL LLFloaterIMPanel::postBuild() 
 {
-	mVisibleSignal.connect(boost::bind(&LLFloaterIMPanel::onVisibilityChange, this, _2));
+	setVisibleCallback(boost::bind(&LLFloaterIMPanel::onVisibilityChange, this, _2));
 	
 	mInputEditor = getChild<LLLineEditor>("chat_editor");
 	mInputEditor->setFocusReceivedCallback( boost::bind(onInputEditorFocusReceived, _1, this) );
diff --git a/indra/newview/lllocationinputctrl.cpp b/indra/newview/lllocationinputctrl.cpp
index 7e35cfa04c201aad03cdf4dc007fe74d46ee8eec..be96d7b43a0ed71860f6551617cdb26dcdfb4edf 100644
--- a/indra/newview/lllocationinputctrl.cpp
+++ b/indra/newview/lllocationinputctrl.cpp
@@ -157,15 +157,21 @@ LLLocationInputCtrl::Params::Params()
 	add_landmark_image_disabled("add_landmark_image_disabled"),
 	add_landmark_image_hover("add_landmark_image_hover"),
 	add_landmark_image_selected("add_landmark_image_selected"),
+	icon_hpad("icon_hpad", 0),
 	add_landmark_button("add_landmark_button"),
-	add_landmark_hpad("add_landmark_hpad", 0),
-	info_button("info_button")
+	info_button("info_button"),
+	voice_icon("voice_icon"),
+	fly_icon("fly_icon"),
+	push_icon("push_icon"),
+	build_icon("build_icon"),
+	scripts_icon("scripts_icon"),
+	damage_icon("damage_icon")
 {
 }
 
 LLLocationInputCtrl::LLLocationInputCtrl(const LLLocationInputCtrl::Params& p)
 :	LLComboBox(p),
-	mAddLandmarkHPad(p.add_landmark_hpad),
+	mIconHPad(p.icon_hpad),
 	mInfoBtn(NULL),
 	mLocationContextMenu(NULL),
 	mAddLandmarkBtn(NULL),
@@ -230,6 +236,32 @@ LLLocationInputCtrl::LLLocationInputCtrl(const LLLocationInputCtrl::Params& p)
 	mAddLandmarkBtn = LLUICtrlFactory::create<LLButton>(al_params);
 	enableAddLandmarkButton(true);
 	addChild(mAddLandmarkBtn);
+
+	// Parcel property icons
+	LLIconCtrl::Params voice_icon = p.voice_icon;
+	mParcelIcon[VOICE_ICON] = LLUICtrlFactory::create<LLIconCtrl>(voice_icon);
+	addChild(mParcelIcon[VOICE_ICON]);
+
+	LLIconCtrl::Params fly_icon = p.fly_icon;
+	mParcelIcon[FLY_ICON] = LLUICtrlFactory::create<LLIconCtrl>(fly_icon);
+	addChild(mParcelIcon[FLY_ICON]);
+
+	LLIconCtrl::Params push_icon = p.push_icon;
+	mParcelIcon[PUSH_ICON] = LLUICtrlFactory::create<LLIconCtrl>(push_icon);
+	addChild(mParcelIcon[PUSH_ICON]);
+
+	LLIconCtrl::Params build_icon = p.build_icon;
+	mParcelIcon[BUILD_ICON] = LLUICtrlFactory::create<LLIconCtrl>(build_icon);
+	addChild(mParcelIcon[BUILD_ICON]);
+
+	LLIconCtrl::Params scripts_icon = p.scripts_icon;
+	mParcelIcon[SCRIPTS_ICON] = LLUICtrlFactory::create<LLIconCtrl>(scripts_icon);
+	addChild(mParcelIcon[SCRIPTS_ICON]);
+
+	LLIconCtrl::Params damage_icon = p.damage_icon;
+	mParcelIcon[DAMAGE_ICON] = LLUICtrlFactory::create<LLIconCtrl>(damage_icon);
+	addChild(mParcelIcon[DAMAGE_ICON]);
+	// TODO: health number?
 	
 	// Register callbacks and load the location field context menu (NB: the order matters).
 	LLUICtrl::CommitCallbackRegistry::currentRegistrar().add("Navbar.Action", boost::bind(&LLLocationInputCtrl::onLocationContextMenuItemClicked, this, _2));
@@ -410,9 +442,10 @@ void LLLocationInputCtrl::onFocusLost()
 		mTextEntry->deselect();
 	}
 }
-void	LLLocationInputCtrl::draw(){
-	
-	if(!hasFocus() && gSavedSettings.getBOOL("ShowCoordinatesOption")){
+
+void LLLocationInputCtrl::draw()
+{	
+	if(!hasFocus() && gSavedSettings.getBOOL("NavBarShowCoordinates")){
 		refreshLocation();
 	}
 	LLComboBox::draw();
@@ -532,6 +565,7 @@ void LLLocationInputCtrl::onTextEditorRightClicked(S32 x, S32 y, MASK mask)
 void LLLocationInputCtrl::refresh()
 {
 	refreshLocation();			// update location string
+	refreshParcelIcons();
 	updateAddLandmarkButton();	// indicate whether current parcel has been landmarked 
 }
 
@@ -548,13 +582,57 @@ void LLLocationInputCtrl::refreshLocation()
 
 	// Update location field.
 	std::string location_name;
-	LLAgentUI::ELocationFormat format =  (gSavedSettings.getBOOL("ShowCoordinatesOption") ? 
-			LLAgentUI::LOCATION_FORMAT_WITHOUT_SIM: LLAgentUI::LOCATION_FORMAT_NORMAL);
+	LLAgentUI::ELocationFormat format =
+		(gSavedSettings.getBOOL("NavBarShowCoordinates")
+			? LLAgentUI::LOCATION_FORMAT_FULL
+			: LLAgentUI::LOCATION_FORMAT_NO_COORDS);
 
-	if (!LLAgentUI::buildLocationString(location_name, format)) location_name = "Unknown";
+	if (!LLAgentUI::buildLocationString(location_name, format)) 
+	{
+		location_name = "???";
+	}
 	setText(location_name);
 }
 
+void LLLocationInputCtrl::refreshParcelIcons()
+{
+	LLViewerParcelMgr* vpm = LLViewerParcelMgr::getInstance();
+	// *TODO buy
+	//bool allow_buy      = vpm->canAgentBuyParcel( vpm->getAgentParcel(), false);
+	bool allow_voice	= vpm->allowAgentVoice();
+	bool allow_fly		= vpm->allowAgentFly();
+	bool allow_push		= vpm->allowAgentPush();
+	bool allow_build	= vpm->allowAgentBuild();
+	bool allow_scripts	= vpm->allowAgentScripts();
+	bool allow_damage	= vpm->allowAgentDamage();
+
+	// Most icons are "block this ability"
+	mParcelIcon[VOICE_ICON]->setVisible(   !allow_voice );
+	mParcelIcon[FLY_ICON]->setVisible(     !allow_fly );
+	mParcelIcon[PUSH_ICON]->setVisible(    !allow_push );
+	mParcelIcon[BUILD_ICON]->setVisible(   !allow_build );
+	mParcelIcon[SCRIPTS_ICON]->setVisible( !allow_scripts );
+	mParcelIcon[DAMAGE_ICON]->setVisible(  allow_damage );
+	// *TODO damage meter
+
+	// Slide the parcel icons rect from right to left, adjusting rectangles of
+	// visible icons.  Assumes all icon rects are the same.
+	LLRect icon_rect = mParcelIcon[0]->getRect();
+	S32 icon_width = icon_rect.getWidth();
+	icon_rect.mRight = mAddLandmarkBtn->getRect().mLeft - mIconHPad;
+	icon_rect.mLeft = icon_rect.mRight - icon_width;
+	
+	for (S32 i = 0; i < ICON_COUNT; ++i)
+	{
+		if (mParcelIcon[i]->getVisible())
+		{
+			mParcelIcon[i]->setRect( icon_rect );
+			icon_rect.translate( -icon_width - mIconHPad, 0);
+		}
+	}
+	// *TODO: health meter
+}
+
 void LLLocationInputCtrl::rebuildLocationHistory(std::string filter)
 {
 	LLLocationHistory::location_list_t filtered_items;
@@ -651,13 +729,11 @@ void LLLocationInputCtrl::updateWidgetlayout()
 	mInfoBtn->setRect(info_btn_rect);
 
 	// "Add Landmark" button
-	{
-		LLRect al_btn_rect = mAddLandmarkBtn->getRect();
-		al_btn_rect.translate(
-			hist_btn_rect.mLeft - mAddLandmarkHPad - al_btn_rect.getWidth(),
-			(rect.getHeight() - al_btn_rect.getHeight()) / 2);
-		mAddLandmarkBtn->setRect(al_btn_rect);
-	}
+	LLRect al_btn_rect = mAddLandmarkBtn->getRect();
+	al_btn_rect.translate(
+		hist_btn_rect.mLeft - mIconHPad - al_btn_rect.getWidth(),
+		(rect.getHeight() - al_btn_rect.getHeight()) / 2);
+	mAddLandmarkBtn->setRect(al_btn_rect);
 }
 
 void LLLocationInputCtrl::changeLocationPresentation()
@@ -680,7 +756,7 @@ void LLLocationInputCtrl::onLocationContextMenuItemClicked(const LLSD& userdata)
 
 	if (item == std::string("show_coordinates"))
 	{
-		gSavedSettings.setBOOL("ShowCoordinatesOption",!gSavedSettings.getBOOL("ShowCoordinatesOption"));
+		gSavedSettings.setBOOL("NavBarShowCoordinates",!gSavedSettings.getBOOL("NavBarShowCoordinates"));
 	}
 	else if (item == std::string("landmark"))
 	{
@@ -744,7 +820,7 @@ bool LLLocationInputCtrl::onLocationContextMenuItemEnabled(const LLSD& userdata)
 	}
 	else if(item == std::string("show_coordinates")){
 	
-		return gSavedSettings.getBOOL("ShowCoordinatesOption");
+		return gSavedSettings.getBOOL("NavBarShowCoordinates");
 	}
 
 	return false;
diff --git a/indra/newview/lllocationinputctrl.h b/indra/newview/lllocationinputctrl.h
index 44dc0cb2510bf3abc96cfe87b7cb9d90dd5e0ee9..fefd0f7fec63e30cabf161ea217ea3a009fdbbc7 100644
--- a/indra/newview/lllocationinputctrl.h
+++ b/indra/newview/lllocationinputctrl.h
@@ -33,7 +33,8 @@
 #ifndef LL_LLLOCATIONINPUTCTRL_H
 #define LL_LLLOCATIONINPUTCTRL_H
 
-#include <llcombobox.h>
+#include "llcombobox.h"
+#include "lliconctrl.h"		// Params
 
 class LLLandmark;
 
@@ -63,9 +64,15 @@ class LLLocationInputCtrl
 											add_landmark_image_disabled,
 											add_landmark_image_hover,
 											add_landmark_image_selected;
-		Optional<S32>						add_landmark_hpad;
+		Optional<S32>						icon_hpad;
 		Optional<LLButton::Params>			add_landmark_button,
 											info_button;
+		Optional<LLIconCtrl::Params>		voice_icon,
+											fly_icon,
+											push_icon,
+											build_icon,
+											scripts_icon,
+											damage_icon;
 		Params();
 	};
 
@@ -103,6 +110,7 @@ class LLLocationInputCtrl
 	void					enableAddLandmarkButton(bool val);
 	void					refresh();
 	void					refreshLocation();
+	void					refreshParcelIcons();
 	void					rebuildLocationHistory(std::string filter = "");
 	bool 					findTeleportItemsByTitle(const LLTeleportHistoryItem& item, const std::string& filter);
 	void					setText(const LLStringExplicit& text);
@@ -126,7 +134,20 @@ class LLLocationInputCtrl
 	LLMenuGL*				mLocationContextMenu;
 	LLButton*				mAddLandmarkBtn;
 	LLButton*				mInfoBtn;
-	S32						mAddLandmarkHPad;
+	S32						mIconHPad;
+	
+	enum EParcelIcon
+	{
+		VOICE_ICON = 0,
+		FLY_ICON,
+		PUSH_ICON,
+		BUILD_ICON,
+		SCRIPTS_ICON,
+		DAMAGE_ICON,
+		ICON_COUNT
+	};
+	LLIconCtrl*	mParcelIcon[ICON_COUNT];
+	// TODO: Health meter?
 
 	LLAddLandmarkObserver*		mAddLandmarkObserver;
 	LLRemoveLandmarkObserver*	mRemoveLandmarkObserver;
diff --git a/indra/newview/llmediactrl.cpp b/indra/newview/llmediactrl.cpp
index 5cd40273f61aee5bdb928b765ffa7f96a9b70932..2376a3581db53c58c6fe896cbd5a40ee5afaf4e1 100644
--- a/indra/newview/llmediactrl.cpp
+++ b/indra/newview/llmediactrl.cpp
@@ -356,7 +356,7 @@ void LLMediaCtrl::onFocusLost()
 //
 BOOL LLMediaCtrl::postBuild ()
 {
-	mVisibleSignal.connect(boost::bind(&LLMediaCtrl::onVisibilityChange, this, _2));
+	setVisibleCallback(boost::bind(&LLMediaCtrl::onVisibilityChange, this, _2));
 	return TRUE;
 }
 
diff --git a/indra/newview/llmoveview.cpp b/indra/newview/llmoveview.cpp
index 93db33705316c110bcc0ffd94082bd83de5e3746..9e46a4422a6d3e463968631451ef0be518908a82 100644
--- a/indra/newview/llmoveview.cpp
+++ b/indra/newview/llmoveview.cpp
@@ -586,7 +586,8 @@ void LLPanelStandStopFlying::setVisible(BOOL visible)
 		updatePosition();
 	}
 
-	LLPanel::setVisible(visible);
+	//change visibility of parent layout_panel to animate in/out
+	if (getParent()) getParent()->setVisible(visible);
 }
 
 BOOL LLPanelStandStopFlying::handleToolTip(S32 x, S32 y, MASK mask)
diff --git a/indra/newview/llnavigationbar.cpp b/indra/newview/llnavigationbar.cpp
index 114d26af8aac017377f76135f46be411a4442118..e552d9c555fdbbfaef97187ab290497671861ee0 100644
--- a/indra/newview/llnavigationbar.cpp
+++ b/indra/newview/llnavigationbar.cpp
@@ -230,6 +230,16 @@ BOOL LLNavigationBar::postBuild()
 	return TRUE;
 }
 
+void LLNavigationBar::setVisible(BOOL visible)
+{
+	// change visibility of grandparent layout_panel to animate in and out
+	if (getParent() && getParent()->getParent()) 
+	{
+		getParent()->getParent()->setVisible(visible);	
+	}
+}
+
+
 void LLNavigationBar::fillSearchComboBox()
 {
 	if(!mSearchComboBox)
@@ -413,7 +423,7 @@ void LLNavigationBar::onTeleportFinished(const LLVector3d& global_agent_pos, con
 	 * At this moment gAgent.getPositionAgent() contains previous coordinates.
 	 * according to EXT-65 agent position is being reseted on each frame.  
 	 */
-		LLAgentUI::buildLocationString(location, LLAgentUI::LOCATION_FORMAT_WITHOUT_SIM,
+		LLAgentUI::buildLocationString(location, LLAgentUI::LOCATION_FORMAT_NO_MATURITY,
 					gAgent.getPosAgentFromGlobal(global_agent_pos));
 	std::string tooltip (LLSLURL::buildSLURLfromPosGlobal(gAgent.getRegion()->getName(), global_agent_pos, false));
 	
diff --git a/indra/newview/llnavigationbar.h b/indra/newview/llnavigationbar.h
index 52f5a827e4b17bdc232cb72a710e8d771cce74cf..6f5175d1ae3a1f82a13b6567519c23f7f68c1380 100644
--- a/indra/newview/llnavigationbar.h
+++ b/indra/newview/llnavigationbar.h
@@ -56,6 +56,7 @@ class LLNavigationBar
 	/*virtual*/ void	draw();
 	/*virtual*/ BOOL handleRightMouseDown(S32 x, S32 y, MASK mask);
 	/*virtual*/ BOOL	postBuild();
+	/*virtual*/ void	setVisible(BOOL visible);
 
 	void handleLoginComplete();
 	void clearHistoryCache();
diff --git a/indra/newview/llpanelavatartag.cpp b/indra/newview/llpanelavatartag.cpp
index 03ad19f9118ca92836ba090095b55d8727f9fdd6..7563cc7f61cf4a400df81f39241a581f74c9eb59 100644
--- a/indra/newview/llpanelavatartag.cpp
+++ b/indra/newview/llpanelavatartag.cpp
@@ -92,7 +92,7 @@ void LLPanelAvatarTag::setAvatarId(const LLUUID& avatar_id)
 boost::signals2::connection LLPanelAvatarTag::setLeftButtonClickCallback(
 																  const commit_callback_t& cb)
 {
-	return mCommitSignal.connect(cb);
+	return setCommitCallback(cb);
 }
 
 BOOL LLPanelAvatarTag::handleMouseDown(S32 x, S32 y, MASK mask)
diff --git a/indra/newview/llpanelpeople.cpp b/indra/newview/llpanelpeople.cpp
index 29f7cc18518cb962961b6da61dacc4b9b6a5bcdf..0c832defd72dfec74076fcc6247b6c2557a5c2ca 100644
--- a/indra/newview/llpanelpeople.cpp
+++ b/indra/newview/llpanelpeople.cpp
@@ -483,7 +483,7 @@ void LLPanelPeople::onFriendsAccordionExpandedCollapsed(const LLSD& param, LLAva
 
 BOOL LLPanelPeople::postBuild()
 {
-	mVisibleSignal.connect(boost::bind(&LLPanelPeople::onVisibilityChange, this, _2));
+	setVisibleCallback(boost::bind(&LLPanelPeople::onVisibilityChange, this, _2));
 	
 	mFilterEditor = getChild<LLFilterEditor>("filter_input");
 	mFilterEditor->setCommitCallback(boost::bind(&LLPanelPeople::onFilterEdit, this, _2));
diff --git a/indra/newview/llpreviewgesture.cpp b/indra/newview/llpreviewgesture.cpp
index 49a2a3723d214b688a116250373371028612b6f7..3d2c529dda6e29a11c3d439024d0647d0e3c3dbe 100644
--- a/indra/newview/llpreviewgesture.cpp
+++ b/indra/newview/llpreviewgesture.cpp
@@ -355,7 +355,7 @@ LLPreviewGesture::~LLPreviewGesture()
 
 BOOL LLPreviewGesture::postBuild()
 {
-	mVisibleSignal.connect(boost::bind(&LLPreviewGesture::onVisibilityChange, this, _2));
+	setVisibleCallback(boost::bind(&LLPreviewGesture::onVisibilityChange, this, _2));
 	
 	LLLineEditor* edit;
 	LLComboBox* combo;
diff --git a/indra/newview/llsidetray.cpp b/indra/newview/llsidetray.cpp
index 7711f3c7330bd09a16c972f7d9c39b9a5b3c537a..2f98435b8314e2640e3e7419a463491551a9eb62 100644
--- a/indra/newview/llsidetray.cpp
+++ b/indra/newview/llsidetray.cpp
@@ -34,6 +34,7 @@
 
 #include "lltextbox.h"
 
+#include "llagent.h"
 #include "llbottomtray.h"
 #include "llsidetray.h"
 #include "llviewerwindow.h"
@@ -700,7 +701,7 @@ void	LLSideTray::updateSidetrayVisibility()
 	// set visibility of parent container based on collapsed state
 	if (getParent())
 	{
-		getParent()->setVisible(!mCollapsed);
+		getParent()->setVisible(!mCollapsed && !gAgent.cameraMouselook());
 	}
 }
 
diff --git a/indra/newview/llsidetray.h b/indra/newview/llsidetray.h
index 54652c110852e3ab600a525a681c285fe2d025d6..73215746819f36b4468ab451bc960fdc8d045b5d 100644
--- a/indra/newview/llsidetray.h
+++ b/indra/newview/llsidetray.h
@@ -120,7 +120,7 @@ class LLSideTray : public LLPanel, private LLDestroyClass<LLSideTray>
 
 	void		setVisible(BOOL visible)
 	{
-		LLPanel::setVisible(visible);
+		if (getParent()) getParent()->setVisible(visible);
 	}
 
 	LLPanel*	getButtonsPanel() { return mButtonsPanel; }
@@ -141,6 +141,7 @@ class LLSideTray : public LLPanel, private LLDestroyClass<LLSideTray>
 
 	void		processTriState ();
 	
+	void		updateSidetrayVisibility();
 
 protected:
 	LLSideTrayTab* getTab		(const std::string& name);
@@ -153,10 +154,6 @@ class LLSideTray : public LLPanel, private LLDestroyClass<LLSideTray>
 
 	void		toggleTabButton	(LLSideTrayTab* tab);
 
-	void		updateSidetrayVisibility();
-
-	
-
 private:
 	// Implementation of LLDestroyClass<LLSideTray>
 	static void destroyClass()
@@ -166,7 +163,6 @@ class LLSideTray : public LLPanel, private LLDestroyClass<LLSideTray>
 			LLSideTray::getInstance()->setEnabled(FALSE);
 	}
 	
-
 private:
 
 	LLPanel*						mButtonsPanel;
diff --git a/indra/newview/llteleporthistory.cpp b/indra/newview/llteleporthistory.cpp
index bc886d5743281d90470c35d4af915514d1f0c637..cc4689062eb11e16a66fd8349047edd21bb46dfc 100644
--- a/indra/newview/llteleporthistory.cpp
+++ b/indra/newview/llteleporthistory.cpp
@@ -52,7 +52,7 @@
 
 const std::string& LLTeleportHistoryItem::getTitle() const
 {
-	return gSavedSettings.getBOOL("ShowCoordinatesOption") ? mFullTitle : mTitle;
+	return gSavedSettings.getBOOL("NavBarShowCoordinates") ? mFullTitle : mTitle;
 }
 
 //////////////////////////////////////////////////////////////////////////////
@@ -177,7 +177,7 @@ void LLTeleportHistory::purgeItems()
 std::string LLTeleportHistory::getCurrentLocationTitle(bool full, const LLVector3& local_pos_override)
 {
 	std::string location_name;
-	LLAgentUI::ELocationFormat fmt = full ? LLAgentUI::LOCATION_FORMAT_WITHOUT_SIM : LLAgentUI::LOCATION_FORMAT_NORMAL;
+	LLAgentUI::ELocationFormat fmt = full ? LLAgentUI::LOCATION_FORMAT_NO_MATURITY : LLAgentUI::LOCATION_FORMAT_NORMAL;
 
 	if (!LLAgentUI::buildLocationString(location_name, fmt, local_pos_override)) location_name = "Unknown";
 	return location_name;
diff --git a/indra/newview/llteleporthistory.h b/indra/newview/llteleporthistory.h
index 9f5563ed0b45563d39356cd829287aa8f0390162..a82bec7c4f466a341f97c744d879dbbf8e968f93 100644
--- a/indra/newview/llteleporthistory.h
+++ b/indra/newview/llteleporthistory.h
@@ -57,7 +57,8 @@ class LLTeleportHistoryItem
 	{}
 
 	/**
-	 * @return title formatted according to the current value of the ShowCoordinatesOption setting.
+	 * @return title formatted according to the current value of the 
+	 * NavBarShowCoordinates setting.
 	 */
 	const std::string& getTitle() const;
 	
diff --git a/indra/newview/lltoolmgr.cpp b/indra/newview/lltoolmgr.cpp
index ded83debad8690eefdfd017c838bd8c98ddbecbd..26b3bdb82e24516926e320bb0b7a17fa2054cd7b 100644
--- a/indra/newview/lltoolmgr.cpp
+++ b/indra/newview/lltoolmgr.cpp
@@ -247,7 +247,7 @@ bool LLToolMgr::inEdit()
 
 bool LLToolMgr::canEdit()
 {
-	return LLViewerParcelMgr::getInstance()->agentCanBuild();
+	return LLViewerParcelMgr::getInstance()->allowAgentBuild();
 }
 
 void LLToolMgr::toggleBuildMode()
diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp
index c67af994a42a3ff8e4d7a35e182f64406bf8dfb5..ee1a469bbd919e2f0d34da4b6a6a44806583eb78 100644
--- a/indra/newview/llviewermenu.cpp
+++ b/indra/newview/llviewermenu.cpp
@@ -2736,7 +2736,7 @@ bool enable_object_edit()
 	bool enable = false;
 	if (gAgent.inPrelude())
 	{
-		enable = LLViewerParcelMgr::getInstance()->agentCanBuild()
+		enable = LLViewerParcelMgr::getInstance()->allowAgentBuild()
 			|| LLSelectMgr::getInstance()->getSelection()->isAttachment();
 	} 
 	else if (LLSelectMgr::getInstance()->selectGetModify())
@@ -6096,7 +6096,7 @@ class LLAttachmentEnableDrop : public view_listener_t
 {
 	bool handleEvent(const LLSD& userdata)
 	{
-		BOOL can_build   = gAgent.isGodlike() || (LLViewerParcelMgr::getInstance()->agentCanBuild());
+		BOOL can_build   = gAgent.isGodlike() || (LLViewerParcelMgr::getInstance()->allowAgentBuild());
 
 		//Add an inventory observer to only allow dropping the newly attached item
 		//once it exists in your inventory.  Look at Jira 2422.
diff --git a/indra/newview/llviewerparcelmgr.cpp b/indra/newview/llviewerparcelmgr.cpp
index aa0987aa7d1223635a663a09366f20d002f12302..fcaf49c88493951764f08045512741d3a067e395 100644
--- a/indra/newview/llviewerparcelmgr.cpp
+++ b/indra/newview/llviewerparcelmgr.cpp
@@ -650,7 +650,7 @@ LLParcel *LLViewerParcelMgr::getAgentParcel() const
 }
 
 // Return whether the agent can build on the land they are on
-bool LLViewerParcelMgr::agentCanBuild() const
+bool LLViewerParcelMgr::allowAgentBuild() const
 {
 	if (mAgentParcel)
 	{
@@ -664,19 +664,47 @@ bool LLViewerParcelMgr::agentCanBuild() const
 	}
 }
 
-BOOL LLViewerParcelMgr::agentCanTakeDamage() const
+bool LLViewerParcelMgr::allowAgentVoice() const
 {
-	return mAgentParcel->getAllowDamage();
+	LLViewerRegion* region = gAgent.getRegion();
+	return region && region->isVoiceEnabled()
+		&& mAgentParcel	&& mAgentParcel->getParcelFlagAllowVoice();
 }
 
-BOOL LLViewerParcelMgr::agentCanFly() const
+bool LLViewerParcelMgr::allowAgentFly() const
 {
-	return TRUE;
+	LLViewerRegion* region = gAgent.getRegion();
+	return region && !region->getBlockFly()
+		&& mAgentParcel && mAgentParcel->getAllowFly();
 }
 
-F32 LLViewerParcelMgr::agentDrawDistance() const
+// Can the agent be pushed around by LLPushObject?
+bool LLViewerParcelMgr::allowAgentPush() const
 {
-	return 512.f;
+	LLViewerRegion* region = gAgent.getRegion();
+	return region && !region->getRestrictPushObject()
+		&& mAgentParcel && !mAgentParcel->getRestrictPushObject();
+}
+
+bool LLViewerParcelMgr::allowAgentScripts() const
+{
+	LLViewerRegion* region = gAgent.getRegion();
+	// *NOTE: This code does not take into account group-owned parcels
+	// and the flag to allow group-owned scripted objects to run.
+	// This mirrors the traditional menu bar parcel icon code, but is not
+	// technically correct.
+	return region
+		&& !(region->getRegionFlags() & REGION_FLAGS_SKIP_SCRIPTS)
+		&& !(region->getRegionFlags() & REGION_FLAGS_ESTATE_SKIP_SCRIPTS)
+		&& mAgentParcel
+		&& mAgentParcel->getAllowOtherScripts();
+}
+
+bool LLViewerParcelMgr::allowAgentDamage() const
+{
+	LLViewerRegion* region = gAgent.getRegion();
+	return region && region->getAllowDamage()
+		&& mAgentParcel && mAgentParcel->getAllowDamage();
 }
 
 BOOL LLViewerParcelMgr::isOwnedAt(const LLVector3d& pos_global) const
diff --git a/indra/newview/llviewerparcelmgr.h b/indra/newview/llviewerparcelmgr.h
index 1c8fe23dba125ed08ca0414935d84988f68ae7f3..379190789b09e98e64e61129d12bde672a15ee07 100644
--- a/indra/newview/llviewerparcelmgr.h
+++ b/indra/newview/llviewerparcelmgr.h
@@ -56,9 +56,6 @@ class LLViewerRegion;
 //							  | EAST_MASK 
 //							  | WEST_MASK);
 
-const F32 PARCEL_POST_HEIGHT = 0.666f;
-//const F32 PARCEL_POST_HEIGHT = 20.f;
-
 // Specify the type of land transfer taking place
 //enum ELandTransferType
 //{
@@ -171,10 +168,29 @@ class LLViewerParcelMgr : public LLSingleton<LLViewerParcelMgr>
 
 	LLParcel*	getCollisionParcel() const;
 
-	BOOL	agentCanTakeDamage() const;
-	BOOL	agentCanFly() const;
-	F32		agentDrawDistance() const;
-	bool	agentCanBuild() const;
+	// Can this agent build on the parcel he is on?
+	// Used for parcel property icons in nav bar.
+	bool	allowAgentBuild() const;
+	
+	// Can this agent speak on the parcel he is on?
+	// Used for parcel property icons in nav bar.
+	bool	allowAgentVoice() const;
+	
+	// Can this agent start flying on this parcel?
+	// Used for parcel property icons in nav bar.
+	bool	allowAgentFly() const;
+	
+	// Can this agent be pushed by llPushObject() on this parcel?
+	// Used for parcel property icons in nav bar.
+	bool	allowAgentPush() const;
+	
+	// Can scripts written by non-parcel-owners run on the agent's current
+	// parcel?  Used for parcel property icons in nav bar.
+	bool	allowAgentScripts() const;
+	
+	// Can the agent be damaged here?
+	// Used for parcel property icons in nav bar.
+	bool	allowAgentDamage() const;
 
 	F32		getHoverParcelWidth() const		
 				{ return F32(mHoverEastNorth.mdV[VX] - mHoverWestSouth.mdV[VX]); }
diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp
index db66faef8139a56c344335e92aa6221604f2300c..29d40d073ce0e1294f43904e6b9f74b00f91b292 100644
--- a/indra/newview/llviewerwindow.cpp
+++ b/indra/newview/llviewerwindow.cpp
@@ -1573,7 +1573,8 @@ void LLViewerWindow::initWorldUI()
 	LLPanel* side_tray_container = getRootView()->getChild<LLPanel>("side_tray_container");
 	LLSideTray* sidetrayp = LLSideTray::getInstance();
 	sidetrayp->setShape(side_tray_container->getLocalRect());
-	sidetrayp->setFollowsAll();
+	// don't follow right edge to avoid spurious resizes, since we are using a fixed width layout
+	sidetrayp->setFollows(FOLLOWS_LEFT|FOLLOWS_TOP|FOLLOWS_BOTTOM);
 	side_tray_container->addChild(sidetrayp);
 	side_tray_container->setVisible(FALSE);
 	
diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp
index 507c726e02d6e1834c44ee1332d16d667fc4cd83..5aad87630d5ce05158a4b3d15b6c1bd28b03f439 100644
--- a/indra/newview/pipeline.cpp
+++ b/indra/newview/pipeline.cpp
@@ -344,7 +344,12 @@ LLPipeline::LLPipeline() :
 	mWLSkyPool(NULL),
 	mLightMask(0),
 	mLightMovingMask(0),
-	mLightingDetail(0)
+	mLightingDetail(0),
+	mScreenWidth(0),
+	mScreenHeight(0),
+	mViewportWidth(0),
+	mViewportHeight(0)
+
 {
 	mNoiseMap = 0;
 	mTrueNoiseMap = 0;
@@ -518,13 +523,29 @@ void LLPipeline::resizeScreenTexture()
 		GLuint view_height = gViewerWindow->getWorldViewHeightRaw();
 	
 		allocateScreenBuffer(resX, resY, view_width, view_height);
-
-		llinfos << "RESIZED SCREEN TEXTURE: " << resX << "x" << resY << llendl;
 	}
 }
 
 void LLPipeline::allocateScreenBuffer(U32 resX, U32 resY, U32 viewport_width, U32 viewport_height)
 {
+	bool screen_size_changed = resX != mScreenWidth || resY != mScreenHeight;
+	bool viewport_size_changed = viewport_width != mViewportWidth || viewport_height != mViewportHeight;
+
+	if (!screen_size_changed
+		&& !viewport_size_changed)
+	{
+		// nothing to do
+		return;
+	}
+
+	// remember these dimensions
+	mScreenWidth = resX;
+	mScreenHeight = resY;
+	mViewportWidth = viewport_width;
+	mViewportHeight = viewport_height;
+
+	llinfos << "RESIZED SCREEN TEXTURE: " << resX << "x" << resY << llendl;
+
 	U32 samples = gSavedSettings.getU32("RenderFSAASamples");
 
 	U32 res_mod = gSavedSettings.getU32("RenderResolutionDivisor");
@@ -534,7 +555,8 @@ void LLPipeline::allocateScreenBuffer(U32 resX, U32 resY, U32 viewport_width, U3
 		resY /= res_mod;
 	}
 
-	if (gSavedSettings.getBOOL("RenderUIBuffer"))
+	if (gSavedSettings.getBOOL("RenderUIBuffer") 
+		&& screen_size_changed)
 	{
 		mUIScreen.allocate(resX,resY, GL_RGBA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE);
 	}	
@@ -542,25 +564,39 @@ void LLPipeline::allocateScreenBuffer(U32 resX, U32 resY, U32 viewport_width, U3
 	if (LLPipeline::sRenderDeferred)
 	{
 		//allocate deferred rendering color buffers
-		mDeferredScreen.allocate(resX, resY, GL_RGBA, TRUE, TRUE, LLTexUnit::TT_RECT_TEXTURE, FALSE);
-		mDeferredDepth.allocate(resX, resY, 0, TRUE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE);
+		if (screen_size_changed)
+		{
+			mDeferredScreen.allocate(resX, resY, GL_RGBA, TRUE, TRUE, LLTexUnit::TT_RECT_TEXTURE, FALSE);
+			mDeferredDepth.allocate(resX, resY, 0, TRUE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE);
+			addDeferredAttachments(mDeferredScreen);
+		}
+		// always set viewport to desired size, since allocate resets the viewport
 		mDeferredScreen.setViewport(viewport_width, viewport_height);
 		mDeferredDepth.setViewport(viewport_width, viewport_height);
-		addDeferredAttachments(mDeferredScreen);
-		mScreen.allocate(resX, resY, GL_RGBA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE);		
-		mEdgeMap.allocate(resX, resY, GL_ALPHA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE);
+
+		if (screen_size_changed)
+		{
+			mScreen.allocate(resX, resY, GL_RGBA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE);		
+			mEdgeMap.allocate(resX, resY, GL_ALPHA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE);
+		}
 		mScreen.setViewport(viewport_width, viewport_height);
 		mEdgeMap.setViewport(viewport_width, viewport_height);
 
 		for (U32 i = 0; i < 3; i++)
 		{
-			mDeferredLight[i].allocate(resX, resY, GL_RGBA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE);
+			if (screen_size_changed)
+			{
+				mDeferredLight[i].allocate(resX, resY, GL_RGBA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE);
+			}
 			mDeferredLight[i].setViewport(viewport_width, viewport_height);
 		}
 
 		for (U32 i = 0; i < 2; i++)
 		{
-			mGIMapPost[i].allocate(resX,resY, GL_RGB, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE);
+			if (screen_size_changed)
+			{
+				mGIMapPost[i].allocate(resX,resY, GL_RGB, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE);
+			}
 			mGIMapPost[i].setViewport(viewport_width, viewport_height);
 		}
 
@@ -568,7 +604,10 @@ void LLPipeline::allocateScreenBuffer(U32 resX, U32 resY, U32 viewport_width, U3
 
 		for (U32 i = 0; i < 4; i++)
 		{
-			mShadow[i].allocate(U32(resX*scale),U32(resY*scale), 0, TRUE, FALSE, LLTexUnit::TT_RECT_TEXTURE);
+			if (screen_size_changed)
+			{
+				mShadow[i].allocate(U32(resX*scale),U32(resY*scale), 0, TRUE, FALSE, LLTexUnit::TT_RECT_TEXTURE);
+			}
 			mShadow[i].setViewport(viewport_width, viewport_height);
 		}
 
@@ -578,7 +617,10 @@ void LLPipeline::allocateScreenBuffer(U32 resX, U32 resY, U32 viewport_width, U3
 
 		for (U32 i = 4; i < 6; i++)
 		{
-			mShadow[i].allocate(width, height, 0, TRUE, FALSE);
+			if (screen_size_changed)
+			{
+				mShadow[i].allocate(width, height, 0, TRUE, FALSE);
+			}
 			mShadow[i].setViewport(viewport_width, viewport_height);
 		}
 
@@ -586,32 +628,41 @@ void LLPipeline::allocateScreenBuffer(U32 resX, U32 resY, U32 viewport_width, U3
 
 		width = nhpo2(resX)/2;
 		height = nhpo2(resY)/2;
-		mLuminanceMap.allocate(width,height, GL_RGBA, FALSE, FALSE);
+		if (screen_size_changed)
+		{
+			mLuminanceMap.allocate(width,height, GL_RGBA, FALSE, FALSE);
+		}
 		mLuminanceMap.setViewport(viewport_width, viewport_height);
 	}
 	else
 	{
-		mScreen.allocate(resX, resY, GL_RGBA, TRUE, TRUE, LLTexUnit::TT_RECT_TEXTURE, FALSE);		
+		if (screen_size_changed)
+		{
+			mScreen.allocate(resX, resY, GL_RGBA, TRUE, TRUE, LLTexUnit::TT_RECT_TEXTURE, FALSE);		
+		}
 		mScreen.setViewport(viewport_width, viewport_height);
 	}
 	
 
 	if (gGLManager.mHasFramebufferMultisample && samples > 1)
 	{
-		mSampleBuffer.allocate(resX,resY,GL_RGBA,TRUE,TRUE,LLTexUnit::TT_RECT_TEXTURE,FALSE,samples);
-		mSampleBuffer.setViewport(viewport_width, viewport_height);
-		mScreen.setSampleBuffer(&mSampleBuffer);
-
-		if (LLPipeline::sRenderDeferred)
+		if (screen_size_changed)
 		{
-			addDeferredAttachments(mSampleBuffer);
-			mDeferredScreen.setSampleBuffer(&mSampleBuffer);
+			mSampleBuffer.allocate(resX,resY,GL_RGBA,TRUE,TRUE,LLTexUnit::TT_RECT_TEXTURE,FALSE,samples);
+			if (LLPipeline::sRenderDeferred)
+			{
+				addDeferredAttachments(mSampleBuffer);
+				mDeferredScreen.setSampleBuffer(&mSampleBuffer);
+			}
 		}
+		mSampleBuffer.setViewport(viewport_width, viewport_height);
+		mScreen.setSampleBuffer(&mSampleBuffer);
 
 		stop_glerror();
 	}
 	
-	if (LLPipeline::sRenderDeferred)
+	if (LLPipeline::sRenderDeferred 
+		&& screen_size_changed)
 	{ //share depth buffer between deferred targets
 		mDeferredScreen.shareDepthBuffer(mScreen);
 		for (U32 i = 0; i < 3; i++)
@@ -726,6 +777,10 @@ void LLPipeline::createGLBuffers()
 			mGlow[i].allocate(512,glow_res,GL_RGBA,FALSE,FALSE);
 		}
 
+		// force reallocation of buffers by clearing known dimensions
+		mScreenWidth = 0;
+		mScreenHeight = 0;
+
 		allocateScreenBuffer(resX,resY, viewport_width, viewport_height);
 	}
 	
diff --git a/indra/newview/pipeline.h b/indra/newview/pipeline.h
index 9193e19bb1aaf184329a9b6ff298b089ff16e144..11b7b55f20b34720e6c618aa5cf7c1880cfff92c 100644
--- a/indra/newview/pipeline.h
+++ b/indra/newview/pipeline.h
@@ -467,6 +467,11 @@ class LLPipeline
 	static F32				sMinRenderSize;
 
 	//screen texture
+	U32 					mScreenWidth;
+	U32 					mScreenHeight;
+	U32 					mViewportWidth;
+	U32 					mViewportHeight;
+
 	LLRenderTarget			mScreen;
 	LLRenderTarget			mUIScreen;
 	LLRenderTarget			mDeferredScreen;
diff --git a/indra/newview/skins/default/textures/bottomtray/Notices_Unread.png b/indra/newview/skins/default/textures/bottomtray/Notices_Unread.png
index 98f1f04b9a70d6eeb129a0f0355d220518b03d33..aa3898ca99f816f86ecb763761d43d91a3d7420a 100644
Binary files a/indra/newview/skins/default/textures/bottomtray/Notices_Unread.png and b/indra/newview/skins/default/textures/bottomtray/Notices_Unread.png differ
diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml
index f4a239be62145f3ba0db0c15ceed6d9f149941ef..8469cf9e2d00f68aeef4592bb09c42c819dfb996 100644
--- a/indra/newview/skins/default/textures/textures.xml
+++ b/indra/newview/skins/default/textures/textures.xml
@@ -50,8 +50,12 @@ with the same filename but different name
   <texture name="Arrow_Right_Off" file_name="navbar/Arrow_Right_Off.png" preload="true" />
   <texture name="Arrow_Right_Press" file_name="navbar/Arrow_Right_Press.png" preload="true" />
 
-  <texture name="Arrow_Up" file_name="widgets/Arrow_Up.png" preload="true" />
-  <texture name="Arrow_Down" file_name="widgets/Arrow_Down.png" preload="true" />
+  <texture name="Arrow_Left" file_name="widgets/Arrow_Left.png" preload="true" />
+  <texture name="Arrow_Right" file_name="widgets/Arrow_Right.png" preload="true" />
+
+  <texture name="Arrow_Small_Up" file_name="widgets/Arrow_Small_Up.png" preload="true" />
+  <texture name="Arrow_Small_Left" file_name="widgets/Arrow_Small_Left.png" preload="true" />
+  <texture name="Arrow_Small_Right" file_name="widgets/Arrow_Small_Right.png" preload="true" />
 
   <texture name="AudioMute_Off" file_name="icons/AudioMute_Off.png" preload="false" />
   <texture name="AudioMute_Over" file_name="icons/AudioMute_Over.png" preload="false" />
@@ -120,6 +124,7 @@ with the same filename but different name
   <texture name="ComboButton_Press" file_name="widgets/ComboButton_Press.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" />
   <texture name="ComboButton_Selected" file_name="widgets/ComboButton_Selected.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" />
   <texture name="ComboButton_UpSelected" file_name="widgets/ComboButton_UpSelected.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" />
+  <texture name="ComboButton_Up_On_Selected" file_name="widgets/ComboButton_Up_On_Selected.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" />
   <texture name="ComboButton_Off" file_name="widgets/ComboButton_Off.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" />
   <texture name="ComboButton_UpOff" file_name="widgets/ComboButton_UpOff.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" />
   <texture name="Container" file_name="containers/Container.png" preload="false" />
@@ -439,6 +444,7 @@ with the same filename but different name
   <texture name="Search" file_name="navbar/Search.png" preload="false" />
 
   <texture name="SegmentedBtn_Left_Off" file_name="widgets/SegmentedBtn_Left_Off.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" />
+  <texture name="SegmentedBtn_Left_Over" file_name="widgets/SegmentedBtn_Left_Over.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" />
   <texture name="SegmentedBtn_Left_Press" file_name="widgets/SegmentedBtn_Left_Press.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" />
   <texture name="SegmentedBtn_Left_Disabled" file_name="widgets/SegmentedBtn_Left_Disabled.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" />
   <texture name="SegmentedBtn_Left_Selected" file_name="widgets/SegmentedBtn_Left_Selected.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" />
@@ -453,6 +459,7 @@ with the same filename but different name
   <texture name="SegmentedBtn_Middle_Selected_Disabled" file_name="widgets/SegmentedBtn_Middle_Selected_Disabled.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" />
 
   <texture name="SegmentedBtn_Right_Off" file_name="widgets/SegmentedBtn_Right_Off.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" />
+  <texture name="SegmentedBtn_Right_Over" file_name="widgets/SegmentedBtn_Right_Over.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" />
   <texture name="SegmentedBtn_Right_Press" file_name="widgets/SegmentedBtn_Right_Press.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" />
   <texture name="SegmentedBtn_Right_Disabled" file_name="widgets/SegmentedBtn_Right_Disabled.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" />
   <texture name="SegmentedBtn_Right_Selected" file_name="widgets/SegmentedBtn_Right_Selected.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" />
diff --git a/indra/newview/skins/default/textures/widgets/Arrow_Small_Left.png b/indra/newview/skins/default/textures/widgets/Arrow_Small_Left.png
new file mode 100644
index 0000000000000000000000000000000000000000..2d624c377915f4622a4e4897c7099e147a7d8a10
Binary files /dev/null and b/indra/newview/skins/default/textures/widgets/Arrow_Small_Left.png differ
diff --git a/indra/newview/skins/default/textures/widgets/Arrow_Small_Right.png b/indra/newview/skins/default/textures/widgets/Arrow_Small_Right.png
new file mode 100644
index 0000000000000000000000000000000000000000..91c03c426e265431ed5cbf3136e61cac7ad3e50f
Binary files /dev/null and b/indra/newview/skins/default/textures/widgets/Arrow_Small_Right.png differ
diff --git a/indra/newview/skins/default/textures/widgets/Arrow_Small_Up.png b/indra/newview/skins/default/textures/widgets/Arrow_Small_Up.png
new file mode 100644
index 0000000000000000000000000000000000000000..38aac0e5cabb91d65f455fc317c473281a870ffe
Binary files /dev/null and b/indra/newview/skins/default/textures/widgets/Arrow_Small_Up.png differ
diff --git a/indra/newview/skins/default/textures/widgets/ComboButton_Up_On_Selected.png b/indra/newview/skins/default/textures/widgets/ComboButton_Up_On_Selected.png
new file mode 100644
index 0000000000000000000000000000000000000000..fd1d11dd0b5f981513643df7c7fe497295e8447c
Binary files /dev/null and b/indra/newview/skins/default/textures/widgets/ComboButton_Up_On_Selected.png differ
diff --git a/indra/newview/skins/default/xui/en/main_view.xml b/indra/newview/skins/default/xui/en/main_view.xml
index 14a4949df7ff08d4cd3912250e0ebfe90dcec437..3bf7f50a2c2280168ae2ca4b3ab8e80e67ce46db 100644
--- a/indra/newview/skins/default/xui/en/main_view.xml
+++ b/indra/newview/skins/default/xui/en/main_view.xml
@@ -15,19 +15,19 @@
                 orientation="vertical"
                 top="0">
     <layout_panel auto_resize="false"
-                  min_height="19"
+                  height="84"
                   mouse_opaque="false"
-                  name="status_bar_container"
-                  height="19"
+                  name="nav_and_status_bar_region"
                   width="1024"
-                  visible="false"/>
-    <layout_panel auto_resize="false"
-                  height="65"
-                  mouse_opaque="false"
-                  name="nav_bar_container"
-                  width="1024"
-                  visible="false"/>
-    <panel        auto_resize="true"
+                  visible="false">
+      <panel follows="left|right|bottom"
+             left="0"
+             name="nav_bar_container"
+             right="1024"
+             top="19"
+             height="65"/>
+    </layout_panel>
+    <layout_panel auto_resize="true"
                   follows="all"
                   height="500"
                   layout="topleft"
@@ -124,8 +124,16 @@
                   height="500"
                   name="DebugView"
                   width="1024"/>
-  </panel>
+    </layout_panel>
   </layout_stack>
+  <panel mouse_opaque="false"
+         follows="left|right|top" 
+         name="status_bar_container"
+         height="19"
+         left="0" 
+         top="0" 
+         width="1024"
+         visible="false"/>
   <notify_box_view top="0"
                    follows="all"
                    height="768"
diff --git a/indra/newview/skins/default/xui/en/panel_bottomtray.xml b/indra/newview/skins/default/xui/en/panel_bottomtray.xml
index 6480469f43f959323958f96e8d7fba2a46832c23..da8006d545efb993611305c915bba5235614600e 100644
--- a/indra/newview/skins/default/xui/en/panel_bottomtray.xml
+++ b/indra/newview/skins/default/xui/en/panel_bottomtray.xml
@@ -46,7 +46,7 @@
          left="0"
          min_height="23"
          width="310"
-         top="0"
+         top="4"
          min_width="192"
          name="chat_bar"
          user_resize="false"
@@ -58,7 +58,7 @@
          height="28"
          layout="topleft"
          min_height="28"
-         width="104"
+         width="100"
          top_delta="0"
          min_width="54"
          name="speak_panel"
@@ -71,7 +71,7 @@
            layout="topleft"
            left="0"
            name="talk"
-           top="3"
+           top="4"
           width="100" />
         </layout_panel>
         <icon
@@ -104,11 +104,10 @@
           layout="topleft"
           name="Gesture"
           left="0"
-          top="3"
+          top="4"
           width="82"
           tool_tip="Shows/hides gestures">
              <gesture_combo_box.drop_down_button
-              font="SansSerifSmall"
               pad_right="10" 
               use_ellipses="true" />
          </gesture_combo_box>
@@ -137,6 +136,9 @@
          width="80"
          min_width="49">
             <button
+                 image_selected="PushButton_Selected_Press"
+                 image_pressed="PushButton_Press"
+		 image_pressed_selected="PushButton_Selected_Press"
              follows="left|right"
              height="23"
              use_ellipses="true"
@@ -145,7 +147,7 @@
              layout="topleft"
              name="movement_btn"
              tool_tip="Shows/hides movement controls"
-             top="3"
+             top="4"
              width="80">
                 <button.init_callback
                  function="Button.SetDockableFloaterToggle"
@@ -176,6 +178,9 @@
          user_resize="false"
          width="80">
             <button
+                 image_selected="PushButton_Selected_Press"
+                 image_pressed="PushButton_Press"
+		 image_pressed_selected="PushButton_Selected_Press"
              follows="left|right"
              height="23"
              use_ellipses="true"
@@ -184,7 +189,7 @@
              layout="topleft"
              left="0"
              tool_tip="Shows/hides camera controls"
-             top="3"
+             top="4"
              name="camera_btn"
              width="80">
                 <button.init_callback
@@ -221,7 +226,7 @@
              layout="topleft"
              name="snapshots"
              width="36"
-             top="3"
+             top="4"
              image_overlay="Snapshot_Off"
              tool_tip="Take snapshot">
 				<button.commit_callback
@@ -245,37 +250,47 @@ as for parent layout_panel (chiclet_list_panel) to resize bottom tray properly.
             <chiclet_panel
 	    mouse_opaque="false"
              follows="left|right"
-             height="28"
+             height="23"
              layout="topleft"
              left="0"
              min_width="180"
              name="chiclet_list"
-             top="0"
-             chiclet_padding="3"
+             top="4"
+             chiclet_padding="4"
              scrolling_offset="40"
              width="189">
                 <button
                  auto_resize="true"
                  follows="right"
                  height="23"
-                 image_selected="BottomTray_Scroll_Left"
-                 image_unselected="BottomTray_Scroll_Left"
+                 image_selected="SegmentedBtn_Left_Off"
+                 image_unselected="SegmentedBtn_Left_Off"
+		 image_hover_selected="SegmentedBtn_Left_Over"
+		 image_hover_unselected="SegmentedBtn_Left_Over"
+		 image_pressed="SegmentedBtn_Left_Press"
+		 image_pressed_selected="SegmentedBtn_Left_Press"
+		 image_overlay="Arrow_Small_Left"
                  layout="topleft"
                  name="chicklet_left_scroll_button"
                  tab_stop="false"
-                 top="3"
+                 top="0"
                  visible="false"
                  width="20" />
                 <button
                  auto_resize="true"
                  follows="right"
                  height="23"
-                 image_selected="BottomTray_Scroll_Right"
-                 image_unselected="BottomTray_Scroll_Right"
+                 image_selected="SegmentedBtn_Right_Off"
+                 image_unselected="SegmentedBtn_Right_Off"
+		 image_hover_selected="SegmentedBtn_Right_Over"
+		 image_hover_unselected="SegmentedBtn_Right_Over"
+		 image_pressed="SegmentedBtn_Right_Press"
+		 image_pressed_selected="SegmentedBtn_Right_Press"
+		 image_overlay="Arrow_Small_Right"
                  layout="topleft"
                  name="chicklet_right_scroll_button"
                  tab_stop="false"
-                 top="3"
+                 top="0"
                  visible="false"
                  width="20" />
             </chiclet_panel>
@@ -311,6 +326,9 @@ as for parent layout_panel (chiclet_list_panel) to resize bottom tray properly.
              top="4"
              width="54">
               <button
+                 image_selected="PushButton_Selected_Press"
+                 image_pressed="PushButton_Press"
+		 image_pressed_selected="PushButton_Selected_Press"
               auto_resize="true"
                halign="right"
                height="23"
diff --git a/indra/newview/skins/default/xui/en/panel_nearby_chat_bar.xml b/indra/newview/skins/default/xui/en/panel_nearby_chat_bar.xml
index ecf35523cd863b862cabbd33cf79e0049d440287..de612fbbc3117455b977bd338137a19004a41ca8 100644
--- a/indra/newview/skins/default/xui/en/panel_nearby_chat_bar.xml
+++ b/indra/newview/skins/default/xui/en/panel_nearby_chat_bar.xml
@@ -26,7 +26,7 @@
      max_length="512"
      name="chat_box"
      tool_tip="Press Enter to say, Ctrl+Enter to shout"
-     top="0"
+     top="1"
      width="279" />
     <output_monitor
      auto_update="true"
@@ -37,19 +37,21 @@
      left_pad="-24"
      mouse_opaque="true"
      name="chat_zone_indicator"
-     top="4"
+     top="1"
      visible="true"
      width="20" />
     <button
      follows="right"
      is_toggle="true"
      width="20"
-     top="0"
+     top="1"
      layout="topleft"
-     left_pad="4           "
+     left_pad="4"
      image_disabled="ComboButton_UpOff"
      image_unselected="ComboButton_UpOff"
-     image_selected="ComboButton_UpSelected"
+     image_selected="ComboButton_Up_On_Selected"
+     image_pressed="ComboButton_UpSelected"
+     image_pressed_selected="ComboButton_Up_On_Selected"
      height="23"
      name="show_nearby_chat"
      tool_tip="Shows/hides nearby chat log">
diff --git a/indra/newview/skins/default/xui/en/widgets/button.xml b/indra/newview/skins/default/xui/en/widgets/button.xml
index 6b11e72247492d988e2f22589d7d4e8b480bf9f4..7c54e618ef63740cdb8cd30566befe263c6ad7a2 100644
--- a/indra/newview/skins/default/xui/en/widgets/button.xml
+++ b/indra/newview/skins/default/xui/en/widgets/button.xml
@@ -15,7 +15,6 @@
         image_color="ButtonImageColor"
         image_color_disabled="ButtonImageColor"
         flash_color="ButtonFlashBgColor"
-        font="SansSerifSmall"
         hover_glow_amount="0.15"
         halign="center"
         scale_image="true">
diff --git a/indra/newview/skins/default/xui/en/widgets/gesture_combo_box.xml b/indra/newview/skins/default/xui/en/widgets/gesture_combo_box.xml
index 6171be034f4b440171101213fe9fae9879089a33..4229f34c09ff6f6a281564401430611753d5cae9 100644
--- a/indra/newview/skins/default/xui/en/widgets/gesture_combo_box.xml
+++ b/indra/newview/skins/default/xui/en/widgets/gesture_combo_box.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<gesture_combo_box font="SansSerifSmall"
+<gesture_combo_box
            label="Gestures" 
            list_position="below"
            max_chars="20"
@@ -7,7 +7,6 @@
   <gesture_combo_box.combo_button name="Combobox Button"
                           label=""
                           hover_glow_amount="0.15"
-                          font="SansSerifSmall"
                           scale_image="true"
                           image_unselected="ComboButton_Off"
                           image_selected="ComboButton_Selected"
@@ -17,15 +16,15 @@
                               label=""
                               halign="center"
                               hover_glow_amount="0.15"
-                              font="SansSerif"
                               scale_image="true"
+                 image_selected="PushButton_Selected_Press"
+                 image_pressed="PushButton_Press"
+		 image_pressed_selected="PushButton_Selected_Press"
                               image_unselected="PushButton_Off"
-                              image_selected="PushButton_Selected"
                               image_disabled="PushButton_Disabled"
                               image_disabled_selected="PushButton_Selected_Disabled" />
   <gesture_combo_box.combo_list bg_writeable_color="MenuDefaultBgColor"
-                                scroll_bar_bg_visible="true" />
+                                scroll_bar_bg_visible="false" />
   <gesture_combo_box.combo_editor name="Combo Text Entry"
-                          select_on_focus="true"
-                          font="SansSerifSmall" />
+                          select_on_focus="true" />
 </gesture_combo_box>
diff --git a/indra/newview/skins/default/xui/en/widgets/location_input.xml b/indra/newview/skins/default/xui/en/widgets/location_input.xml
index d88bcfab1d7b6445f114247b1d8f9c204534a3e5..1fed1c075a6ec4d736f292790a1b01dd10718884 100644
--- a/indra/newview/skins/default/xui/en/widgets/location_input.xml
+++ b/indra/newview/skins/default/xui/en/widgets/location_input.xml
@@ -11,7 +11,7 @@
                 add_landmark_image_disabled="Favorite_Star_Off"
                 add_landmark_image_hover="Favorite_Star_Over"
                 add_landmark_image_selected="Favorite_Star_Press"
-                add_landmark_hpad="2"
+                icon_hpad="2"
                 allow_text_entry="true"
                 list_position="below"
       	        show_text_as_tentative="false"
@@ -38,7 +38,51 @@
                           scale_image="false"
 			  top="19"
 			  left="-3" />
-  <combo_button name="Location History"
+  <voice_icon
+    name="voice_icon"
+    width="22"
+    height="18"
+	top="21"
+    image_name="parcel_lght_VoiceNo"
+    />
+  <fly_icon
+    name="fly_icon"
+    width="22"
+    height="18"
+	top="21"
+    image_name="parcel_lght_FlyNo"
+    />
+  <push_icon
+    name="push_icon"
+    width="22"
+    height="18"
+	top="21"
+    image_name="parcel_lght_PushNo"
+    />
+  <build_icon
+    name="build_icon"
+    width="22"
+    height="18"
+	top="21"
+    image_name="parcel_lght_BuildNo"
+    />
+  <scripts_icon
+    name="scripts_icon"
+    width="22"
+    height="18"
+	top="21"
+    image_name="parcel_lght_ScriptsNo"
+    />
+  <!-- NOTE: Placeholder icon, there is no dark grayscale version -->
+  <damage_icon
+    name="damage_icon"
+    width="22"
+    height="18"
+	top="21"
+    image_name="parcel_lght_Damage"
+    />
+
+    <combo_button name="Location History"
                           label=""
                           pad_right="0"/>
   <combo_list bg_writeable_color="MenuDefaultBgColor" page_lines="10"
diff --git a/indra/newview/skins/default/xui/en/widgets/menu_item.xml b/indra/newview/skins/default/xui/en/widgets/menu_item.xml
index c98e9cb6b839b3c7aa5f846c1e18b66b3b36a53f..2bbaa6233ff717ad154c31cdc6fd7c64bb690c69 100644
--- a/indra/newview/skins/default/xui/en/widgets/menu_item.xml
+++ b/indra/newview/skins/default/xui/en/widgets/menu_item.xml
@@ -1,6 +1,4 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes" ?>
 <!-- Use this for the top-level menu styling -->
-<menu_item
-  font="SansSerifSmall"
-  >
+<menu_item>
 </menu_item>
diff --git a/indra/newview/skins/default/xui/en/widgets/talk_button.xml b/indra/newview/skins/default/xui/en/widgets/talk_button.xml
index 64c2e65a6e0d2902049a3f359a1700967e61314a..7781bdd066bb62fd579a3ede8e4c1cfd88740b4f 100644
--- a/indra/newview/skins/default/xui/en/widgets/talk_button.xml
+++ b/indra/newview/skins/default/xui/en/widgets/talk_button.xml
@@ -7,10 +7,13 @@
   -->
   <speak_button
     follows="left|right" 
+                 image_selected="SegmentedBtn_Left_Selected_Press"
+                 image_unselected="SegmentedBtn_Left_Off"
+		 image_pressed="SegmentedBtn_Left_Selected_Press"
+		 image_pressed_selected="SegmentedBtn_Left_Selected_Press"
     name="left"
     label="Speak"
     label_selected="Speak"
-    font="SansSerifSmall"
     tab_stop="false"
     />
   <show_button
@@ -23,8 +26,11 @@
     bottom="0"
     tab_stop="false"
     is_toggle="true"
-    image_selected="ComboButton_UpSelected"
-    image_unselected="ComboButton_UpOff"
+                 image_selected="SegmentedBtn_Right_Selected_Press"
+                 image_unselected="SegmentedBtn_Right_Off"
+		 image_pressed="SegmentedBtn_Right_Press"
+		 image_pressed_selected="SegmentedBtn_Right_Selected_Press"
+		 image_overlay="Arrow_Small_Up"
     />
   <monitor
     follows="right"