diff --git a/indra/llcommon/llfasttimer.h b/indra/llcommon/llfasttimer.h
index 45b84ea3eaa5c353913b7bc3acfec5ddbe6bafce..f5c90291b801d3a87346a7c89f0024f9062bd4f2 100644
--- a/indra/llcommon/llfasttimer.h
+++ b/indra/llcommon/llfasttimer.h
@@ -36,6 +36,7 @@
 #include "llinstancetracker.h"
 
 #define FAST_TIMER_ON 1
+#define TIME_FAST_TIMERS 0
 
 #if LL_WINDOWS
 
@@ -56,7 +57,7 @@ inline U32 get_cpu_clock_count_32()
     return ret_val;
 }
 
-// return full timer value, still shifted by 8 bits
+// return full timer value, *not* shifted by 8 bits
 inline U64 get_cpu_clock_count_64()
 {
 	U64 ret_val;
@@ -69,7 +70,7 @@ inline U64 get_cpu_clock_count_64()
 		mov dword ptr [ret_val+4], edx
 		mov dword ptr [ret_val], eax
 	}
-    return ret_val >> 8;
+    return ret_val;
 }
 
 #endif // LL_WINDOWS
@@ -242,6 +243,9 @@ class LL_COMMON_API LLFastTimer
 	LLFastTimer(NamedTimer::FrameState& timer)
 	:	mFrameState(&timer)
 	{
+#if TIME_FAST_TIMERS
+		U64 timer_start = get_cpu_clock_count_64();
+#endif
 #if FAST_TIMER_ON
 		NamedTimer::FrameState* frame_state = &timer;
 		U32 cur_time = get_cpu_clock_count_32();
@@ -255,11 +259,18 @@ class LL_COMMON_API LLFastTimer
 	
 		mLastTimer = sCurTimer;
 		sCurTimer = this;
+#endif
+#if TIME_FAST_TIMERS
+		U64 timer_end = get_cpu_clock_count_64();
+		sTimerCycles += timer_end - timer_start;
 #endif
 	}
 
 	~LLFastTimer()
 	{
+#if TIME_FAST_TIMERS
+		U64 timer_start = get_cpu_clock_count_64();
+#endif
 #if FAST_TIMER_ON
 		NamedTimer::FrameState* frame_state = mFrameState;
 		U32 cur_time = get_cpu_clock_count_32();
@@ -276,6 +287,11 @@ class LL_COMMON_API LLFastTimer
 		U32 total_time = cur_time - mStartTotalTime;
 		last_timer->mStartSelfTime += total_time;
 #endif
+#if TIME_FAST_TIMERS
+		U64 timer_end = get_cpu_clock_count_64();
+		sTimerCycles += timer_end - timer_start;
+		sTimerCalls++;
+#endif	
 	}
 
 
@@ -297,11 +313,12 @@ class LL_COMMON_API LLFastTimer
 	static const NamedTimer* getTimerByName(const std::string& name);
 
 public:
-	static bool 		sPauseHistory;
-	static bool 		sResetHistory;
+	static bool 			sPauseHistory;
+	static bool 			sResetHistory;
+	static U64				sTimerCycles;
+	static U32				sTimerCalls;
 	
 private:
-	typedef std::vector<LLFastTimer*> timer_stack_t;
 	static LLFastTimer*		sCurTimer;
 	static S32				sCurFrameIndex;
 	static S32				sLastFrameIndex;
diff --git a/indra/llui/llfloater.cpp b/indra/llui/llfloater.cpp
index f7fd2dbdfee233bbfc51ce1a439daffbc6bf441e..d7a692ec9badf7eced4ee6dd39d3dad8b8d71566 100644
--- a/indra/llui/llfloater.cpp
+++ b/indra/llui/llfloater.cpp
@@ -2717,7 +2717,7 @@ bool LLFloater::initFloaterXML(LLXMLNodePtr node, LLView *parent, LLXMLNodePtr o
 	}
 
 	params.from_xui = true;
-	setupParams(params, parent);
+	applyXUILayout(params, parent);
  	initFromParams(params);
 	
 	initFloater(params);
diff --git a/indra/llui/lllayoutstack.cpp b/indra/llui/lllayoutstack.cpp
index 5e15fa3919ae4c5d0c866cf7de6f467b14ed2f4b..7d8c10275021df6e680fa8a6b510d6690e2c3a2f 100644
--- a/indra/llui/lllayoutstack.cpp
+++ b/indra/llui/lllayoutstack.cpp
@@ -247,7 +247,7 @@ LLView* LLLayoutStack::fromXML(LLXMLNodePtr node, LLView *parent, LLXMLNodePtr o
 	}
 
 	p.from_xui = true;
-	setupParams(p, parent);
+	applyXUILayout(p, parent);
 	LLLayoutStack* layout_stackp = LLUICtrlFactory::create<LLLayoutStack>(p);
 
 	if (parent && layout_stackp)
diff --git a/indra/llui/llmultislider.cpp b/indra/llui/llmultislider.cpp
index 1891bca36cb5be97592a1649f59261bd6ef2b892..aea7c5f87c3017fc8fb99066d848210cd1b0634c 100644
--- a/indra/llui/llmultislider.cpp
+++ b/indra/llui/llmultislider.cpp
@@ -50,6 +50,12 @@ const F32 FLOAT_THRESHOLD = 0.00001f;
 
 S32 LLMultiSlider::mNameCounter = 0;
 
+LLMultiSlider::SliderParams::SliderParams()
+:	name("name"),
+	value("value", 0.f)
+{
+}
+
 LLMultiSlider::Params::Params()
 :	max_sliders("max_sliders", 1),
 	allow_overlap("allow_overlap", false),
@@ -63,7 +69,8 @@ LLMultiSlider::Params::Params()
 	triangle_color("triangle_color"),
 	mouse_down_callback("mouse_down_callback"),
 	mouse_up_callback("mouse_up_callback"),
-	thumb_width("thumb_width")
+	thumb_width("thumb_width"),
+	sliders("slider")
 {
 	name = "multi_slider_bar";
 	mouse_opaque(true);
@@ -99,6 +106,20 @@ LLMultiSlider::LLMultiSlider(const LLMultiSlider::Params& p)
 	{
 		setMouseUpCallback(initCommitCallback(p.mouse_up_callback));
 	}
+
+	for (LLInitParam::ParamIterator<SliderParams>::const_iterator it = p.sliders().begin();
+		it != p.sliders().end();
+		++it)
+	{
+		if (it->name.isProvided())
+		{
+			addSlider(it->value, it->name);
+		}
+		else
+		{
+			addSlider(it->value);
+		}
+	}
 }
 
 LLMultiSlider::~LLMultiSlider()
@@ -230,6 +251,30 @@ const std::string& LLMultiSlider::addSlider(F32 val)
 	return mCurSlider;
 }
 
+void LLMultiSlider::addSlider(F32 val, const std::string& name)
+{
+	F32 initVal = val;
+
+	if(mValue.size() >= mMaxNumSliders) {
+		return;
+	}
+
+	bool foundOne = findUnusedValue(initVal);
+	if(!foundOne) {
+		return;
+	}
+
+	// add a new thumb rect
+	mThumbRects[name] = LLRect( 0, getRect().getHeight(), mThumbWidth, 0 );
+
+	// add the value and set the current slider to this one
+	mValue.insert(name, initVal);
+	mCurSlider = name;
+
+	// move the slider
+	setSliderValue(mCurSlider, initVal, TRUE);
+}
+
 bool LLMultiSlider::findUnusedValue(F32& initVal)
 {
 	bool firstTry = true;
@@ -572,7 +617,6 @@ void LLMultiSlider::draw()
 
 	LLF32UICtrl::draw();
 }
-
 boost::signals2::connection LLMultiSlider::setMouseDownCallback( const commit_signal_t::slot_type& cb ) 
 { 
 	if (!mMouseDownSignal) mMouseDownSignal = new commit_signal_t();
diff --git a/indra/llui/llmultislider.h b/indra/llui/llmultislider.h
index f8e43a0470aa4a1d87b83f19a664c0bdb0977dcf..88576da85b1fb649cb28a42c16261684d322b79f 100644
--- a/indra/llui/llmultislider.h
+++ b/indra/llui/llmultislider.h
@@ -41,6 +41,13 @@ class LLUICtrlFactory;
 class LLMultiSlider : public LLF32UICtrl
 {
 public:
+	struct SliderParams : public LLInitParam::Block<SliderParams>
+	{
+		Optional<std::string>	name;
+		Mandatory<F32>			value;
+		SliderParams();
+	};
+
 	struct Params : public LLInitParam::Block<Params, LLF32UICtrl::Params>
 	{
 		Optional<S32>	max_sliders;
@@ -60,6 +67,7 @@ class LLMultiSlider : public LLF32UICtrl
 										mouse_up_callback;
 		Optional<S32>		thumb_width;
 
+		Multiple<SliderParams>	sliders;
 		Params();
 	};
 
@@ -68,13 +76,13 @@ class LLMultiSlider : public LLF32UICtrl
 	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;
+	void				setSliderValue(const std::string& name, F32 value, BOOL from_event = FALSE);
+	F32					getSliderValue(const std::string& name) const;
 
-	const std::string& getCurSlider() const					{ return mCurSlider; }
-	F32				getCurSliderValue() const				{ return getSliderValue(mCurSlider); }
-	void			setCurSlider(const std::string& name);
-	void			setCurSliderValue(F32 val, BOOL from_event = false) { setSliderValue(mCurSlider, val, from_event); }
+	const std::string&	getCurSlider() const					{ return mCurSlider; }
+	F32					getCurSliderValue() const				{ return getSliderValue(mCurSlider); }
+	void				setCurSlider(const std::string& name);
+	void				setCurSliderValue(F32 val, BOOL from_event = false) { setSliderValue(mCurSlider, val, from_event); }
 
 	/*virtual*/ void	setValue(const LLSD& value);
 	/*virtual*/ LLSD	getValue() const		{ return mValue; }
@@ -82,12 +90,13 @@ class LLMultiSlider : public LLF32UICtrl
 	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);
+	bool				findUnusedValue(F32& initVal);
 	const std::string&	addSlider();
 	const std::string&	addSlider(F32 val);
-	void			deleteSlider(const std::string& name);
-	void			deleteCurSlider()			{ deleteSlider(mCurSlider); }
-	void			clear();
+	void				addSlider(F32 val, const std::string& name);
+	void				deleteSlider(const std::string& name);
+	void				deleteCurSlider()			{ deleteSlider(mCurSlider); }
+	void				clear();
 
 	/*virtual*/ BOOL	handleHover(S32 x, S32 y, MASK mask);
 	/*virtual*/ BOOL	handleMouseUp(S32 x, S32 y, MASK mask);
@@ -109,7 +118,8 @@ class LLMultiSlider : public LLF32UICtrl
 	LLRect			mDragStartThumbRect;
 	S32				mThumbWidth;
 
-	std::map<std::string, LLRect>	mThumbRects;
+	std::map<std::string, LLRect>	
+					mThumbRects;
 	LLUIColor		mTrackColor;
 	LLUIColor		mThumbOutlineColor;
 	LLUIColor		mThumbCenterColor;
diff --git a/indra/llui/llmultisliderctrl.cpp b/indra/llui/llmultisliderctrl.cpp
index 7323323d8caff10eff125b445011079d7334908a..f4434a0f7805501b4b0d63d6639e74da2f9fd2b5 100644
--- a/indra/llui/llmultisliderctrl.cpp
+++ b/indra/llui/llmultisliderctrl.cpp
@@ -65,7 +65,8 @@ LLMultiSliderCtrl::Params::Params()
 	text_color("text_color"),
 	text_disabled_color("text_disabled_color"),
 	mouse_down_callback("mouse_down_callback"),
-	mouse_up_callback("mouse_up_callback")
+	mouse_up_callback("mouse_up_callback"),
+	sliders("slider")
 {
 	mouse_opaque = true;
 }
@@ -161,6 +162,7 @@ LLMultiSliderCtrl::LLMultiSliderCtrl(const LLMultiSliderCtrl::Params& p)
 	S32 slider_left = label_width ? label_width + multi_sliderctrl_spacing : 0;
 	LLRect slider_rect( slider_left, top, slider_right, bottom );
 	LLMultiSlider::Params params;
+	params.sliders = p.sliders;
 	params.rect(slider_rect);
 	params.commit_callback.function( LLMultiSliderCtrl::onSliderCommit );
 	params.mouse_down_callback( p.mouse_down_callback );
diff --git a/indra/llui/llmultisliderctrl.h b/indra/llui/llmultisliderctrl.h
index 16d07541f2f632e626b1fc61d4c2ce3429d3f73a..e8366d09c27a3bb90ad8982537efca985a9bdf51 100644
--- a/indra/llui/llmultisliderctrl.h
+++ b/indra/llui/llmultisliderctrl.h
@@ -69,6 +69,8 @@ class LLMultiSliderCtrl : public LLF32UICtrl
 		Optional<CommitCallbackParam>	mouse_down_callback,
 										mouse_up_callback;
 
+		Multiple<LLMultiSlider::SliderParams>	sliders;
+
 		Params();
 	};
 
diff --git a/indra/llui/llpanel.cpp b/indra/llui/llpanel.cpp
index 738a96f7305206ffadab451e873e104ec9879088..db3288243828de36db4ab1582df7c34b63c511f0 100644
--- a/indra/llui/llpanel.cpp
+++ b/indra/llui/llpanel.cpp
@@ -452,7 +452,7 @@ void LLPanel::initFromParams(const LLPanel::Params& p)
 	parseFollowsFlags(p);
 
 	setToolTip(p.tool_tip());
-	setSaveToXML(p.from_xui);
+	setFromXUI(p.from_xui);
 	
 	mHoverCursor = getCursorFromString(p.hover_cursor);
 	
@@ -542,7 +542,7 @@ BOOL LLPanel::initPanelXML(LLXMLNodePtr node, LLView *parent, LLXMLNodePtr outpu
 		}
 		
 		params.from_xui = true;
-		setupParams(params, parent);
+		applyXUILayout(params, parent);
 		{
 			LLFastTimer timer(FTM_PANEL_CONSTRUCTION);
 			initFromParams(params);
diff --git a/indra/llui/llradiogroup.cpp b/indra/llui/llradiogroup.cpp
index 997b9c13f8523038cea6670a413a690472afa02e..4087b484aaa657a64fba9f503899294ef9928455 100644
--- a/indra/llui/llradiogroup.cpp
+++ b/indra/llui/llradiogroup.cpp
@@ -116,6 +116,10 @@ void LLRadioGroup::initFromParams(const Params& p)
 		item_params.font.setIfNotProvided(mFont); // apply radio group font by default
 		item_params.commit_callback.function = boost::bind(&LLRadioGroup::onClickButton, this, _1);
 		item_params.from_xui = p.from_xui;
+		if (p.from_xui)
+		{
+			applyXUILayout(item_params, this);
+		}
 
 		LLRadioCtrl* item = LLUICtrlFactory::create<LLRadioCtrl>(item_params, this);
 		mRadioButtons.push_back(item);
diff --git a/indra/llui/llscrolllistcell.cpp b/indra/llui/llscrolllistcell.cpp
index 544352176abcbe61cf704ce30c687508538f234a..7238d903a30cf6062ccad4853890f335bbc3f5a2 100644
--- a/indra/llui/llscrolllistcell.cpp
+++ b/indra/llui/llscrolllistcell.cpp
@@ -353,7 +353,7 @@ LLScrollListCheck::LLScrollListCheck(const LLScrollListCell::Params& p)
 {
 	LLCheckBoxCtrl::Params checkbox_p;
 	checkbox_p.name("checkbox");
-	checkbox_p.rect.left(0).bottom(0).width(p.width).height(p.width);
+	checkbox_p.rect = LLRect(0, p.width, p.width, 0);
 	checkbox_p.enabled(p.enabled);
 	checkbox_p.initial_value(p.value());
 
diff --git a/indra/llui/llspinctrl.cpp b/indra/llui/llspinctrl.cpp
index d6d46654d57003bff84c31b680d2ee45b153dcb9..20a1ab7af3a4536c2cc6dc1cb589f289a6d922a5 100644
--- a/indra/llui/llspinctrl.cpp
+++ b/indra/llui/llspinctrl.cpp
@@ -75,10 +75,8 @@ LLSpinCtrl::LLSpinCtrl(const LLSpinCtrl::Params& p)
 	static LLUICachedControl<S32> spinctrl_spacing ("UISpinctrlSpacing", 0);
 	static LLUICachedControl<S32> spinctrl_btn_width ("UISpinctrlBtnWidth", 0);
 	static LLUICachedControl<S32> spinctrl_btn_height ("UISpinctrlBtnHeight", 0);
-	S32 top = getRect().getHeight();
-	S32 bottom = top - 2 * spinctrl_btn_height;
-	S32 centered_top = top;
-	S32 centered_bottom = bottom;
+	S32 centered_top = getRect().getHeight();
+	S32 centered_bottom = getRect().getHeight() - 2 * spinctrl_btn_height;
 	S32 btn_left = 0;
 	// reserve space for spinner
 	S32 label_width = llclamp(p.label_width(), 0, llmax(0, getRect().getWidth() - 40));
@@ -105,25 +103,15 @@ LLSpinCtrl::LLSpinCtrl(const LLSpinCtrl::Params& p)
 	
 	// Spin buttons
 	LLButton::Params up_button_params(p.up_button);
-	up_button_params.rect
-					.left(btn_left)
-					.top(top)
-					.right(btn_right)
-					.height(spinctrl_btn_height);
+	up_button_params.rect = LLRect(btn_left, getRect().getHeight(), btn_right, getRect().getHeight() - spinctrl_btn_height);
 	up_button_params.click_callback.function(boost::bind(&LLSpinCtrl::onUpBtn, this, _2));
 	up_button_params.mouse_held_callback.function(boost::bind(&LLSpinCtrl::onUpBtn, this, _2));
 
 	mUpBtn = LLUICtrlFactory::create<LLButton>(up_button_params);
 	addChild(mUpBtn);
 
-	LLRect down_rect( btn_left, top - spinctrl_btn_height, btn_right, bottom );
-
 	LLButton::Params down_button_params(p.down_button);
-	down_button_params.rect
-					.left(btn_left)
-					.right(btn_right)
-					.bottom(bottom)
-					.height(spinctrl_btn_height);
+	down_button_params.rect = LLRect(btn_left, getRect().getHeight() - spinctrl_btn_height, btn_right, getRect().getHeight() - 2 * spinctrl_btn_height);
 	down_button_params.click_callback.function(boost::bind(&LLSpinCtrl::onDownBtn, this, _2));
 	down_button_params.mouse_held_callback.function(boost::bind(&LLSpinCtrl::onDownBtn, this, _2));
 	mDownBtn = LLUICtrlFactory::create<LLButton>(down_button_params);
diff --git a/indra/llui/lltabcontainer.cpp b/indra/llui/lltabcontainer.cpp
index 83e2e3db50d82fa80eb39bff5d544f1d9b1483ab..327dd01612b18c3cf20f87faa2249d84da61434a 100644
--- a/indra/llui/lltabcontainer.cpp
+++ b/indra/llui/lltabcontainer.cpp
@@ -266,8 +266,6 @@ bool LLTabContainer::addChild(LLView* view, S32 tab_group)
 
 	if (panelp)
 	{
-		panelp->setSaveToXML(TRUE);
-
 		addTabPanel(TabPanelParams().panel(panelp).label(panelp->getLabel()).is_placeholder(dynamic_cast<LLPlaceHolderPanel*>(view) != NULL));
 		return true;
 	}
@@ -1019,12 +1017,10 @@ void LLTabContainer::addTabPanel(const TabPanelParams& panel)
 	{
 		if (textbox)
 		{
-			textbox->setSaveToXML(false);
 			addChild( textbox, 0 );
 		}
 		if (btn)
 		{
-			btn->setSaveToXML(false);
 			addChild( btn, 0 );
 		}
 	}
@@ -1747,24 +1743,20 @@ void LLTabContainer::initButtons()
 		}
 	}
 
-	mPrevArrowBtn->setSaveToXML(false);
 	mPrevArrowBtn->setTabStop(FALSE);
 	addChild(mPrevArrowBtn);
 
-	mNextArrowBtn->setSaveToXML(false);
 	mNextArrowBtn->setTabStop(FALSE);
 	addChild(mNextArrowBtn);
 
 	if (mJumpPrevArrowBtn)
 	{
-		mJumpPrevArrowBtn->setSaveToXML(false);
 		mJumpPrevArrowBtn->setTabStop(FALSE);
 		addChild(mJumpPrevArrowBtn);
 	}
 
 	if (mJumpNextArrowBtn)
 	{
-		mJumpNextArrowBtn->setSaveToXML(false);
 		mJumpNextArrowBtn->setTabStop(FALSE);
 		addChild(mJumpNextArrowBtn);
 	}
diff --git a/indra/llui/lltextbase.cpp b/indra/llui/lltextbase.cpp
index cb0907a771b9aad466230f7b6b08bbc33fb6b7f5..e54032ac5e52c88457bf18f948bd64bba2c77cae 100644
--- a/indra/llui/lltextbase.cpp
+++ b/indra/llui/lltextbase.cpp
@@ -962,7 +962,10 @@ void LLTextBase::draw()
 	reflow();
 
 	// then update scroll position, as cursor may have moved
-	updateScrollFromCursor();
+	if (!mReadOnly)
+	{
+		updateScrollFromCursor();
+	}
 
 	LLRect doc_rect;
 	if (mScroller)
@@ -1932,11 +1935,19 @@ void LLTextBase::endOfLine()
 void LLTextBase::startOfDoc()
 {
 	setCursorPos(0);
+	if (mScroller)
+	{
+		mScroller->goToTop();
+	}
 }
 
 void LLTextBase::endOfDoc()
 {
 	setCursorPos(getLength());
+	if (mScroller)
+	{
+		mScroller->goToBottom();
+	}
 }
 
 void LLTextBase::changePage( S32 delta )
@@ -2001,6 +2012,16 @@ void LLTextBase::changeLine( S32 delta )
 	setCursorPos(new_cursor_pos, true);
 }
 
+bool LLTextBase::scrolledToStart()
+{
+	return mScroller->isAtTop();
+}
+
+bool LLTextBase::scrolledToEnd()
+{
+	return mScroller->isAtBottom();
+}
+
 
 bool LLTextBase::setCursor(S32 row, S32 column)
 {
diff --git a/indra/llui/lltextbase.h b/indra/llui/lltextbase.h
index a1f8ba39ae7ea5bff7c2e66e8b3f375ef23b6a5f..c91578b63772ca752f4b1036897f1ed9c6841755 100644
--- a/indra/llui/lltextbase.h
+++ b/indra/llui/lltextbase.h
@@ -180,6 +180,8 @@ class LLTextBase
 	void					changePage( S32 delta );
 	void					changeLine( S32 delta );
 
+	bool					scrolledToStart();
+	bool					scrolledToEnd();
 
 	const LLFontGL*			getDefaultFont() const					{ return mDefaultFont; }
 
diff --git a/indra/llui/llui.cpp b/indra/llui/llui.cpp
index 1ea6b66a93cba23efb6fc9912f2f16d292927136..d0ed3b6fcae6d5bd9ef8a1a0a2bc978b660c1196 100644
--- a/indra/llui/llui.cpp
+++ b/indra/llui/llui.cpp
@@ -1915,6 +1915,7 @@ namespace LLInitParam
 		green = color.mV[VGREEN];
 		blue = color.mV[VBLUE];
 		alpha = color.mV[VALPHA];
+		control.set("", false);
 	}
 
 	void TypeValues<LLUIColor>::declareValues()
@@ -2046,12 +2047,16 @@ namespace LLInitParam
 	
 	void TypedParam<LLRect>::setBlockFromValue()
 	{
-		left = mData.mValue.mLeft;
-		right = mData.mValue.mRight;
-		bottom = mData.mValue.mBottom;
-		top = mData.mValue.mTop;
-		width.setProvided(false);
-		height.setProvided(false);
+		// because of the ambiguity in specifying a rect by position and/or dimensions
+		// we clear the "provided" flag so that values from xui/etc have priority
+		// over those calculated from the rect object
+
+		left.set(mData.mValue.mLeft, false);
+		right.set(mData.mValue.mRight, false);
+		bottom.set(mData.mValue.mBottom, false);
+		top.set(mData.mValue.mTop, false);
+		width.set(mData.mValue.getWidth(), false);
+		height.set(mData.mValue.getHeight(), false);
 	}
 
 	TypedParam<LLCoordGL>::TypedParam(BlockDescriptor& descriptor, const char* name, LLCoordGL value, ParamDescriptor::validation_func_t func, S32 min_count, S32 max_count)
diff --git a/indra/llui/lluictrlfactory.h b/indra/llui/lluictrlfactory.h
index 6788f29ba93352eb92d1158f135a563cb1c57835..b1fa6add67bfbc708b81714ac2b66a4e8422676f 100644
--- a/indra/llui/lluictrlfactory.h
+++ b/indra/llui/lluictrlfactory.h
@@ -184,8 +184,6 @@ class LLUICtrlFactory : public LLSingleton<LLUICtrlFactory>
 	{
 		T* widget = NULL;
 
-		T::setupParams(params, parent);
-
 		if (!params.validateBlock())
 		{
 			llwarns << getInstance()->getCurFileName() << ": Invalid parameter block for " << typeid(T).name() << llendl;
@@ -310,6 +308,7 @@ class LLUICtrlFactory : public LLSingleton<LLUICtrlFactory>
 
 		// Apply layout transformations, usually munging rect
 		params.from_xui = true;
+		T::applyXUILayout(params, parent);
 		T* widget = createWidget<T>(params, parent);
 
 		typedef typename T::child_registry_t registry_t;
diff --git a/indra/llui/lluiimage.cpp b/indra/llui/lluiimage.cpp
index 1dfc281d93e66190c20c43e54dbc27e0039ba2ad..966d919dc764d82b0415369b3f2f4eb30fe7d192 100644
--- a/indra/llui/lluiimage.cpp
+++ b/indra/llui/lluiimage.cpp
@@ -168,6 +168,7 @@ namespace LLInitParam
 		if (name() == "none")
 		{
 			mData.mValue = NULL;
+			return;
 		}
 
 		LLUIImage* imagep =  LLUI::getUIImage(name());
diff --git a/indra/llui/llurlentry.cpp b/indra/llui/llurlentry.cpp
index 95dc2ce027ccaa544b2fd775244fabb650960c7e..983f0a2d49914e58c059a738f6798de9de6abc6a 100644
--- a/indra/llui/llurlentry.cpp
+++ b/indra/llui/llurlentry.cpp
@@ -80,7 +80,7 @@ std::string LLUrlEntryBase::escapeUrl(const std::string &url) const
 			"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
 			"abcdefghijklmnopqrstuvwxyz"
 			"0123456789"
-			"-._~!$?&()*+,@:;=/%";
+			"-._~!$?&()*+,@:;=/%#";
 
 		std::sort(no_escape_chars.begin(), no_escape_chars.end());
 		initialized = true;
diff --git a/indra/llui/llurlregistry.cpp b/indra/llui/llurlregistry.cpp
index afcff0d4090c607ea729b0adddda94a6a4c8b526..ad5c0911f8cb2fcdd5256bbab45b1fdb620e5b74 100644
--- a/indra/llui/llurlregistry.cpp
+++ b/indra/llui/llurlregistry.cpp
@@ -223,3 +223,23 @@ bool LLUrlRegistry::hasUrl(const LLWString &text)
 	LLUrlMatch match;
 	return findUrl(text, match);
 }
+
+bool LLUrlRegistry::isUrl(const std::string &text)
+{
+	LLUrlMatch match;
+	if (findUrl(text, match))
+	{
+		return (match.getStart() == 0 && match.getEnd() >= text.size()-1);
+	}
+	return false;
+}
+
+bool LLUrlRegistry::isUrl(const LLWString &text)
+{
+	LLUrlMatch match;
+	if (findUrl(text, match))
+	{
+		return (match.getStart() == 0 && match.getEnd() >= text.size()-1);
+	}
+	return false;
+}
diff --git a/indra/llui/llurlregistry.h b/indra/llui/llurlregistry.h
index d7800d8cfc29606bb6c691a96a36d6fbe1f422fc..399ee0a9887d28e9b09510d49918a1c63242d1d3 100644
--- a/indra/llui/llurlregistry.h
+++ b/indra/llui/llurlregistry.h
@@ -85,6 +85,10 @@ class LLUrlRegistry : public LLSingleton<LLUrlRegistry>
 	bool hasUrl(const std::string &text);
 	bool hasUrl(const LLWString &text);
 
+	// return true if the given string is a URL that findUrl would match
+	bool isUrl(const std::string &text);
+	bool isUrl(const LLWString &text);
+
 private:
 	LLUrlRegistry();
 	friend class LLSingleton<LLUrlRegistry>;
diff --git a/indra/llui/llview.cpp b/indra/llui/llview.cpp
index a8d8626e49e6bca06870253b8dc2e26eafa70e4f..f1b08c380b5ff79f9c2907ffea1162f193e820e9 100644
--- a/indra/llui/llview.cpp
+++ b/indra/llui/llview.cpp
@@ -126,7 +126,7 @@ LLView::LLView(const LLView::Params& p)
 :	mName(p.name),
 	mParentView(NULL),
 	mReshapeFlags(FOLLOWS_NONE),
-	mSaveToXML(p.from_xui),
+	mFromXUI(p.from_xui),
 	mIsFocusRoot(FALSE),
 	mLastVisible(FALSE),
 	mNextInsertionOrdinal(0),
@@ -2479,7 +2479,7 @@ static bool get_last_child_rect(LLView* parent, LLRect *rect)
 	for (;itor != parent->getChildList()->end(); ++itor)
 	{
 		LLView *last_view = (*itor);
-		if (last_view->getSaveToXML())
+		if (last_view->getFromXUI())
 		{
 			*rect = last_view->getRect();
 			return true;
@@ -2489,7 +2489,7 @@ static bool get_last_child_rect(LLView* parent, LLRect *rect)
 }
 
 //static
-void LLView::setupParams(LLView::Params& p, LLView* parent)
+void LLView::applyXUILayout(LLView::Params& p, LLView* parent)
 {
 	const S32 VPAD = 4;
 	const S32 MIN_WIDGET_HEIGHT = 10;
@@ -2509,7 +2509,7 @@ void LLView::setupParams(LLView::Params& p, LLView* parent)
 		LLRect last_rect = parent->getLocalRect();
 
 		bool layout_topleft = (p.layout() == "topleft");
-		if (layout_topleft && p.from_xui)
+		if (layout_topleft)
 		{
 			//invert top to bottom
 			if (p.rect.top.isProvided()) p.rect.top = parent_rect.getHeight() - p.rect.top;
@@ -2535,10 +2535,10 @@ void LLView::setupParams(LLView::Params& p, LLView* parent)
 				p.rect.right.setProvided(false); // recalculate the right
 			}
 		}
-		else if (p.from_xui) // only do negative coordinate magic for XUI
+		else
 		{
-			if (p.rect.left < 0) p.rect.left = p.rect.left + parent_rect.getWidth();
-			if (p.rect.right < 0) p.rect.right = p.rect.right + parent_rect.getWidth();
+			if (p.rect.left.isProvided() && p.rect.left < 0) p.rect.left = p.rect.left + parent_rect.getWidth();
+			if (p.rect.right.isProvided() && p.rect.right < 0) p.rect.right = p.rect.right + parent_rect.getWidth();
 		}
 		if (p.center_vert)
 		{
@@ -2556,15 +2556,15 @@ void LLView::setupParams(LLView::Params& p, LLView* parent)
 				p.rect.top.setProvided(false); // recalculate the top
 			}
 		}
-		else if (p.from_xui)
+		else
 		{
-			if (p.rect.bottom < 0) p.rect.bottom = p.rect.bottom + parent_rect.getHeight();
-			if (p.rect.top < 0) p.rect.top = p.rect.top + parent_rect.getHeight();
+			if (p.rect.bottom.isProvided() && p.rect.bottom < 0) p.rect.bottom = p.rect.bottom + parent_rect.getHeight();
+			if (p.rect.top.isProvided() && p.rect.top < 0) p.rect.top = p.rect.top + parent_rect.getHeight();
 		}
 
 
 		// DEPRECATE: automatically fall back to height of MIN_WIDGET_HEIGHT pixels
-		if (!p.rect.height.isProvided() && !p.rect.top.isProvided())
+		if (!p.rect.height.isProvided() && !p.rect.top.isProvided() && p.rect.height == 0)
 		{
 			p.rect.height = MIN_WIDGET_HEIGHT;
 		}
@@ -2663,7 +2663,7 @@ static void convert_to_relative_layout(LLView::Params& p, LLView* parent)
 	// Use setupParams to get the final widget rectangle
 	// according to our wacky layout rules.
 	LLView::Params final = p;
-	LLView::setupParams(final, parent);
+	LLView::applyXUILayout(final, parent);
 	// Must actually extract the rectangle to get consistent
 	// right = left+width, top = bottom+height
 	LLRect final_rect = final.rect;
diff --git a/indra/llui/llview.h b/indra/llui/llview.h
index f8460f536168daa5fccad9a05ba47f4171072e0b..c4d731374313907a79bc72560cb6680c1e0aa67d 100644
--- a/indra/llui/llview.h
+++ b/indra/llui/llview.h
@@ -395,8 +395,8 @@ class LLView : public LLMouseHandler, public LLMortician, public LLFocusableElem
 	void parseFollowsFlags(const LLView::Params& params);
 
 	// Some widgets, like close box buttons, don't need to be saved
-	BOOL getSaveToXML() const { return mSaveToXML; }
-	void setSaveToXML(BOOL b) { mSaveToXML = b; }
+	BOOL getFromXUI() const { return mFromXUI; }
+	void setFromXUI(BOOL b) { mFromXUI = b; }
 
 	typedef enum e_hit_test_type
 	{
@@ -498,7 +498,7 @@ class LLView : public LLMouseHandler, public LLMortician, public LLFocusableElem
 
 	// Set up params after XML load before calling new(),
 	// usually to adjust layout.
-	static void setupParams(Params& p, LLView* parent);
+	static void applyXUILayout(Params& p, LLView* parent);
 
 	// For re-export of floaters and panels, convert the coordinate system
 	// to be top-left based.
@@ -573,7 +573,7 @@ class LLView : public LLMouseHandler, public LLMortician, public LLFocusableElem
 	LLUIString	mToolTipMsg;	// isNull() is true if none.
 
 	U8          mSoundFlags;
-	BOOL		mSaveToXML;
+	BOOL		mFromXUI;
 
 	BOOL		mIsFocusRoot;
 	BOOL		mUseBoundingRect; // hit test against bounding rectangle that includes all child elements
diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt
index 9f7b78232085db763a64193d748320a9f17a6836..f3d399c616b425cb6d1d8b8a9f697ac6039ffe70 100644
--- a/indra/newview/CMakeLists.txt
+++ b/indra/newview/CMakeLists.txt
@@ -1446,6 +1446,10 @@ if (WINDOWS)
       ${ARCH_PREBUILT_DIRS_RELEASE}/imageformats/qmng4.dll
       ${ARCH_PREBUILT_DIRS_RELEASE}/imageformats/qsvg4.dll
       ${ARCH_PREBUILT_DIRS_RELEASE}/imageformats/qtiff4.dll
+      ${ARCH_PREBUILT_DIRS_RELEASE}/codecs/qcncodecs4.dll
+      ${ARCH_PREBUILT_DIRS_RELEASE}/codecs/qjpcodecs4.dll
+      ${ARCH_PREBUILT_DIRS_RELEASE}/codecs/qkrcodecs4.dll
+      ${ARCH_PREBUILT_DIRS_RELEASE}/codecs/qtwcodecs4.dll
       ${ARCH_PREBUILT_DIRS_DEBUG}/libeay32.dll
       ${ARCH_PREBUILT_DIRS_DEBUG}/qtcored4.dll
       ${ARCH_PREBUILT_DIRS_DEBUG}/qtguid4.dll
@@ -1460,6 +1464,10 @@ if (WINDOWS)
       ${ARCH_PREBUILT_DIRS_DEBUG}/imageformats/qmngd4.dll
       ${ARCH_PREBUILT_DIRS_DEBUG}/imageformats/qsvgd4.dll
       ${ARCH_PREBUILT_DIRS_DEBUG}/imageformats/qtiffd4.dll
+      ${ARCH_PREBUILT_DIRS_RELEASE}/codecs/qcncodecsd4.dll
+      ${ARCH_PREBUILT_DIRS_RELEASE}/codecs/qjpcodecsd4.dll
+      ${ARCH_PREBUILT_DIRS_RELEASE}/codecs/qkrcodecsd4.dll
+      ${ARCH_PREBUILT_DIRS_RELEASE}/codecs/qtwcodecsd4.dll
       SLPlugin
       media_plugin_quicktime
       media_plugin_webkit
diff --git a/indra/newview/app_settings/shaders/class2/deferred/blurLightF.glsl b/indra/newview/app_settings/shaders/class2/deferred/blurLightF.glsl
index 28908a311d77b833a4b948ecb6c4d86b0171723e..0fad5b4b50be87187b9e320cd1aee3aa28e61db2 100644
--- a/indra/newview/app_settings/shaders/class2/deferred/blurLightF.glsl
+++ b/indra/newview/app_settings/shaders/class2/deferred/blurLightF.glsl
@@ -10,7 +10,6 @@
 uniform sampler2DRect depthMap;
 uniform sampler2DRect normalMap;
 uniform sampler2DRect lightMap;
-uniform sampler2DRect edgeMap;
 
 uniform float dist_factor;
 uniform float blur_size;
@@ -46,53 +45,36 @@ void main()
 	
 	dlt /= max(-pos.z*dist_factor, 1.0);
 	
-	vec2 defined_weight = kern[0].xy; // special case the kern[0] (centre) sample's weight in the blur; we have to sample it anyway so we get it for 'free'
+	vec2 defined_weight = kern[0].xy; // special case the first (centre) sample's weight in the blur; we have to sample it anyway so we get it for 'free'
 	vec4 col = defined_weight.xyxx * ccol;
-
-	float center_e = 1.0 - (texture2DRect(edgeMap, vary_fragcoord.xy).a+
-		      texture2DRect(edgeMap, vary_fragcoord.xy+dlt*0.333).a+
-	              texture2DRect(edgeMap, vary_fragcoord.xy-dlt*0.333).a);
 	
-	float e = center_e;
 	for (int i = 1; i < 4; i++)
 	{
 		vec2 tc = vary_fragcoord.xy + kern[i].z*dlt;
-		
-		e = max(e, 0.0);
-		
-		vec2 wght = kern[i].xy*e;
-		
-		col += texture2DRect(lightMap, tc)*wght.xyxx;
-		defined_weight += wght;
-		
-		e *= e;
-		e -= texture2DRect(edgeMap, tc.xy).a+
-			texture2DRect(edgeMap, tc.xy+dlt*0.333).a+
-			texture2DRect(edgeMap, tc.xy-dlt*0.333).a;
+	        vec3 samppos = getPosition(tc).xyz; 
+		float d = dot(norm.xyz, samppos.xyz-pos.xyz);// dist from plane
+		if (d*d <= 0.003)
+		{
+			col += texture2DRect(lightMap, tc)*kern[i].xyxx;
+			defined_weight += kern[i].xy;
+		}
 	}
-
-	e = center_e;
 	for (int i = 1; i < 4; i++)
 	{
 		vec2 tc = vary_fragcoord.xy - kern[i].z*dlt;
-		
-		e = max(e, 0.0);
-		
-		vec2 wght = kern[i].xy*e;
-		
-		col += texture2DRect(lightMap, tc)*wght.xyxx;
-		defined_weight += wght;
-		
-		e *= e;
-		e -= texture2DRect(edgeMap, tc.xy).a+
-			texture2DRect(edgeMap, tc.xy+dlt*0.333).a+
-			texture2DRect(edgeMap, tc.xy-dlt*0.333).a;
+	        vec3 samppos = getPosition(tc).xyz; 
+		float d = dot(norm.xyz, samppos.xyz-pos.xyz);// dist from plane
+		if (d*d <= 0.003)
+		{
+			col += texture2DRect(lightMap, tc)*kern[i].xyxx;
+			defined_weight += kern[i].xy;
+		}
 	}
 
 
+
 	col /= defined_weight.xyxx;
 	
 	gl_FragColor = col;
-	
-	//gl_FragColor = ccol;
 }
+
diff --git a/indra/newview/featuretable.txt b/indra/newview/featuretable.txt
index d20c23df80838bf4066b4bb7c483ac6814e83ae9..4029bf95a0d0f04bbaf7babb7571a7b4a2e6b10d 100644
--- a/indra/newview/featuretable.txt
+++ b/indra/newview/featuretable.txt
@@ -1,4 +1,4 @@
-version 20
+version 21
 
 // NOTE: This is mostly identical to featuretable_mac.txt with a few differences
 // Should be combined into one table
@@ -28,6 +28,7 @@ RenderAvatarCloth			1	1
 RenderAvatarLODFactor		1	1.0
 RenderAvatarVP				1	1
 RenderCubeMap				1	1
+RenderDelayVBUpdate			1	0
 RenderFarClip				1	256
 RenderFlexTimeFactor		1	1.0
 RenderFogRatio				1	4.0
diff --git a/indra/newview/featuretable_linux.txt b/indra/newview/featuretable_linux.txt
index 57d712ede73bda0341ce4a86292e0b28f4f125bc..61a8e51c50e5d04e71e5b6eb6deae5ab3ffc3427 100644
--- a/indra/newview/featuretable_linux.txt
+++ b/indra/newview/featuretable_linux.txt
@@ -1,4 +1,4 @@
-version 20
+version 21
 
 // NOTE: This is mostly identical to featuretable_mac.txt with a few differences
 // Should be combined into one table
@@ -28,6 +28,7 @@ RenderAvatarCloth			1	1
 RenderAvatarLODFactor		1	1.0
 RenderAvatarVP				1	1
 RenderCubeMap				1	1
+RenderDelayVBUpdate			1	0
 RenderFarClip				1	256
 RenderFlexTimeFactor		1	1.0
 RenderFogRatio				1	4.0
diff --git a/indra/newview/featuretable_mac.txt b/indra/newview/featuretable_mac.txt
index 15974c0691675bbeafb348adb427363cde841416..12d47a904c0def93caca1ffb0042fb7b25e63914 100644
--- a/indra/newview/featuretable_mac.txt
+++ b/indra/newview/featuretable_mac.txt
@@ -1,4 +1,4 @@
-version 20
+version 21
 
 // NOTE: This is mostly identical to featuretable_mac.txt with a few differences
 // Should be combined into one table
@@ -28,6 +28,7 @@ RenderAvatarCloth				0	0
 RenderAvatarLODFactor			1	1.0
 RenderAvatarVP					1	0
 RenderCubeMap					1	1
+RenderDelayVBUpdate				1	0
 RenderFarClip					1	256
 RenderFlexTimeFactor			1	1.0
 RenderFogRatio					1	4.0
diff --git a/indra/newview/llagentwearables.cpp b/indra/newview/llagentwearables.cpp
index 454e547155e0faa5ea192e919819aed97492a380..79ba3fb51d71b5523a381ee0f1b43567b822aa0a 100644
--- a/indra/newview/llagentwearables.cpp
+++ b/indra/newview/llagentwearables.cpp
@@ -871,24 +871,31 @@ void LLAgentWearables::processAgentInitialWearablesUpdate(LLMessageSystem* mesgs
 	if (mInitialWearablesUpdateReceived)
 		return;
 	mInitialWearablesUpdateReceived = true;
+	
+	// If this is the very first time the user has logged into viewer2+ (from a legacy viewer, or new account)
+	// then auto-populate outfits from the library into the My Outfits folder.
+	if (LLInventoryModel::getIsFirstTimeInViewer2())
+	{
+		gAgentWearables.populateMyOutfitsFolder();
+	}
 
 	LLUUID agent_id;
 	gMessageSystem->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id);
 
-	const BOOL is_first_time_in_viewer2_0 = (gInventory.findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT, FALSE) == LLUUID::null);
-
-
 	LLVOAvatar* avatar = gAgent.getAvatarObject();
 	if (avatar && (agent_id == avatar->getID()))
 	{
 		gMessageSystem->getU32Fast(_PREHASH_AgentData, _PREHASH_SerialNum, gAgentQueryManager.mUpdateSerialNum);
 		
+		const S32 NUM_BODY_PARTS = 4;
 		S32 num_wearables = gMessageSystem->getNumberOfBlocksFast(_PREHASH_WearableData);
-		if (num_wearables < 4)
+		if (num_wearables < NUM_BODY_PARTS)
 		{
 			// Transitional state.  Avatars should always have at least their body parts (hair, eyes, shape and skin).
-			// The fact that they don't have any here (only a dummy is sent) implies that this account existed
-			// before we had wearables, or that the database has gotten messed up.
+			// The fact that they don't have any here (only a dummy is sent) implies that either:
+			// 1. This account existed before we had wearables
+			// 2. The database has gotten messed up
+			// 3. This is the account's first login (i.e. the wearables haven't been generated yet).
 			return;
 		}
 
@@ -957,8 +964,6 @@ void LLAgentWearables::processAgentInitialWearablesUpdate(LLMessageSystem* mesgs
 			gInventory.addObserver(outfit);
 		}
 		
-		if (is_first_time_in_viewer2_0)
-			gAgentWearables.populateMyOutfitsFolder();
 	}
 }
 
diff --git a/indra/newview/llavataractions.cpp b/indra/newview/llavataractions.cpp
index 9f7a36e2090b1a4d76c6688ab272a3482dfeac0a..2a8c55e5dbf961e2c87bc5a6ba0bec20fbfc03ce 100644
--- a/indra/newview/llavataractions.cpp
+++ b/indra/newview/llavataractions.cpp
@@ -332,6 +332,54 @@ void LLAvatarActions::pay(const LLUUID& id)
 	}
 }
 
+// static
+void LLAvatarActions::kick(const LLUUID& id)
+{
+	LLSD payload;
+	payload["avatar_id"] = id;
+	LLNotifications::instance().add("KickUser", LLSD(), payload, handleKick);
+}
+
+// static
+void LLAvatarActions::freeze(const LLUUID& id)
+{
+	LLSD payload;
+	payload["avatar_id"] = id;
+	LLNotifications::instance().add("FreezeUser", LLSD(), payload, handleFreeze);
+}
+
+// static
+void LLAvatarActions::unfreeze(const LLUUID& id)
+{
+	LLSD payload;
+	payload["avatar_id"] = id;
+	LLNotifications::instance().add("UnFreezeUser", LLSD(), payload, handleUnfreeze);
+}
+
+//static 
+void LLAvatarActions::csr(const LLUUID& id, std::string name)
+{
+	if (name.empty()) return;
+	
+	std::string url = "http://csr.lindenlab.com/agent/";
+	
+	// slow and stupid, but it's late
+	S32 len = name.length();
+	for (S32 i = 0; i < len; i++)
+	{
+		if (name[i] == ' ')
+		{
+			url += "%20";
+		}
+		else
+		{
+			url += name[i];
+		}
+	}
+	
+	LLWeb::loadURL(url);
+}
+
 //static 
 void LLAvatarActions::share(const LLUUID& id)
 {
@@ -455,6 +503,67 @@ bool LLAvatarActions::callbackAddFriendWithMessage(const LLSD& notification, con
 	return false;
 }
 
+// static
+bool LLAvatarActions::handleKick(const LLSD& notification, const LLSD& response)
+{
+	S32 option = LLNotification::getSelectedOption(notification, response);
+
+	if (option == 0)
+	{
+		LLUUID avatar_id = notification["payload"]["avatar_id"].asUUID();
+		LLMessageSystem* msg = gMessageSystem;
+
+		msg->newMessageFast(_PREHASH_GodKickUser);
+		msg->nextBlockFast(_PREHASH_UserInfo);
+		msg->addUUIDFast(_PREHASH_GodID,		gAgent.getID() );
+		msg->addUUIDFast(_PREHASH_GodSessionID, gAgent.getSessionID());
+		msg->addUUIDFast(_PREHASH_AgentID,   avatar_id );
+		msg->addU32("KickFlags", KICK_FLAGS_DEFAULT );
+		msg->addStringFast(_PREHASH_Reason,    response["message"].asString() );
+		gAgent.sendReliableMessage();
+	}
+	return false;
+}
+bool LLAvatarActions::handleFreeze(const LLSD& notification, const LLSD& response)
+{
+	S32 option = LLNotification::getSelectedOption(notification, response);
+
+	if (option == 0)
+	{
+		LLUUID avatar_id = notification["payload"]["avatar_id"].asUUID();
+		LLMessageSystem* msg = gMessageSystem;
+
+		msg->newMessageFast(_PREHASH_GodKickUser);
+		msg->nextBlockFast(_PREHASH_UserInfo);
+		msg->addUUIDFast(_PREHASH_GodID,		gAgent.getID() );
+		msg->addUUIDFast(_PREHASH_GodSessionID, gAgent.getSessionID());
+		msg->addUUIDFast(_PREHASH_AgentID,   avatar_id );
+		msg->addU32("KickFlags", KICK_FLAGS_FREEZE );
+		msg->addStringFast(_PREHASH_Reason, response["message"].asString() );
+		gAgent.sendReliableMessage();
+	}
+	return false;
+}
+bool LLAvatarActions::handleUnfreeze(const LLSD& notification, const LLSD& response)
+{
+	S32 option = LLNotification::getSelectedOption(notification, response);
+	std::string text = response["message"].asString();
+	if (option == 0)
+	{
+		LLUUID avatar_id = notification["payload"]["avatar_id"].asUUID();
+		LLMessageSystem* msg = gMessageSystem;
+
+		msg->newMessageFast(_PREHASH_GodKickUser);
+		msg->nextBlockFast(_PREHASH_UserInfo);
+		msg->addUUIDFast(_PREHASH_GodID,		gAgent.getID() );
+		msg->addUUIDFast(_PREHASH_GodSessionID, gAgent.getSessionID());
+		msg->addUUIDFast(_PREHASH_AgentID,   avatar_id );
+		msg->addU32("KickFlags", KICK_FLAGS_UNFREEZE );
+		msg->addStringFast(_PREHASH_Reason,    text );
+		gAgent.sendReliableMessage();
+	}
+	return false;
+}
 // static
 bool LLAvatarActions::callbackAddFriend(const LLSD& notification, const LLSD& response)
 {
diff --git a/indra/newview/llavataractions.h b/indra/newview/llavataractions.h
index 01c18d42285e5b8b6decfea1b4d6b144cd13bc60..a4504ae679b946b513670d19731b7c9e35e0c88c 100644
--- a/indra/newview/llavataractions.h
+++ b/indra/newview/llavataractions.h
@@ -138,11 +138,35 @@ class LLAvatarActions
 	 */	
 	static void inviteToGroup(const LLUUID& id);
 	
+	/**
+	 * Kick avatar off grid
+	 */	
+	static void kick(const LLUUID& id);
+
+	/**
+	 * Freeze avatar
+	 */	
+	static void freeze(const LLUUID& id);
+
+	/**
+	 * Unfreeze avatar
+	 */	
+	static void unfreeze(const LLUUID& id);
+
+	/**
+	 * Open csr page for avatar
+	 */	
+	static void csr(const LLUUID& id, std::string name);
+
+	
 private:
 	static bool callbackAddFriend(const LLSD& notification, const LLSD& response);
 	static bool callbackAddFriendWithMessage(const LLSD& notification, const LLSD& response);
 	static bool handleRemove(const LLSD& notification, const LLSD& response);
 	static bool handlePay(const LLSD& notification, const LLSD& response, LLUUID avatar_id);
+	static bool handleKick(const LLSD& notification, const LLSD& response);
+	static bool handleFreeze(const LLSD& notification, const LLSD& response);
+	static bool handleUnfreeze(const LLSD& notification, const LLSD& response);
 	static void callback_invite_to_group(LLUUID group_id, LLUUID id);
 
 	// Just request friendship, no dialog.
diff --git a/indra/newview/llchathistory.cpp b/indra/newview/llchathistory.cpp
index 7a83299daced7c30de80718100ea16a8d9104880..b1ddddc4b1dab42f8bd2981a73eb6b14415942b2 100644
--- a/indra/newview/llchathistory.cpp
+++ b/indra/newview/llchathistory.cpp
@@ -44,6 +44,8 @@
 #include "llfloaterreg.h"
 #include "llmutelist.h"
 #include "llstylemap.h"
+#include "lllayoutstack.h"
+#include "llagent.h"
 
 #include "llsidetray.h"//for blocked objects panel
 
@@ -346,18 +348,23 @@ class LLChatHistoryHeader: public LLPanel
 
 
 LLChatHistory::LLChatHistory(const LLChatHistory::Params& p)
-: LLTextEditor(p),
-mMessageHeaderFilename(p.message_header),
-mMessageSeparatorFilename(p.message_separator),
-mLeftTextPad(p.left_text_pad),
-mRightTextPad(p.right_text_pad),
-mLeftWidgetPad(p.left_widget_pad),
-mRightWidgetPad(p.right_widget_pad),
-mTopSeparatorPad(p.top_separator_pad),
-mBottomSeparatorPad(p.bottom_separator_pad),
-mTopHeaderPad(p.top_header_pad),
-mBottomHeaderPad(p.bottom_header_pad)
+:	LLUICtrl(p),
+	mMessageHeaderFilename(p.message_header),
+	mMessageSeparatorFilename(p.message_separator),
+	mLeftTextPad(p.left_text_pad),
+	mRightTextPad(p.right_text_pad),
+	mLeftWidgetPad(p.left_widget_pad),
+	mRightWidgetPad(p.right_widget_pad),
+	mTopSeparatorPad(p.top_separator_pad),
+	mBottomSeparatorPad(p.bottom_separator_pad),
+	mTopHeaderPad(p.top_header_pad),
+	mBottomHeaderPad(p.bottom_header_pad)
 {
+	LLTextEditor::Params editor_params(p);
+	editor_params.rect = getLocalRect();
+	editor_params.follows.flags = FOLLOWS_ALL;
+	editor_params.enabled = false; // read only
+	mEditor = LLUICtrlFactory::create<LLTextEditor>(editor_params, this);
 }
 
 LLChatHistory::~LLChatHistory()
@@ -365,6 +372,49 @@ LLChatHistory::~LLChatHistory()
 	this->clear();
 }
 
+void LLChatHistory::initFromParams(const LLChatHistory::Params& p)
+{
+	static LLUICachedControl<S32> scrollbar_size ("UIScrollbarSize", 0);
+
+	LLRect stack_rect = getLocalRect();
+	stack_rect.mRight -= scrollbar_size;
+	LLLayoutStack::Params layout_p;
+	layout_p.rect = stack_rect;
+	layout_p.follows.flags = FOLLOWS_ALL;
+	layout_p.orientation = "vertical";
+	layout_p.mouse_opaque = false;
+	
+	LLLayoutStack* stackp = LLUICtrlFactory::create<LLLayoutStack>(layout_p, this);
+	
+	const S32 NEW_TEXT_NOTICE_HEIGHT = 20;
+	
+	LLPanel::Params panel_p;
+	panel_p.name = "spacer";
+	panel_p.background_visible = false;
+	panel_p.has_border = false;
+	panel_p.mouse_opaque = false;
+	stackp->addPanel(LLUICtrlFactory::create<LLPanel>(panel_p), 0, 30, true, false, LLLayoutStack::ANIMATE);
+
+	panel_p.name = "new_text_notice_holder";
+	LLRect new_text_notice_rect = getLocalRect();
+	new_text_notice_rect.mTop = new_text_notice_rect.mBottom + NEW_TEXT_NOTICE_HEIGHT;
+	panel_p.rect = new_text_notice_rect;
+	panel_p.background_opaque = true;
+	panel_p.background_visible = true;
+	panel_p.visible = false;
+	mMoreChatPanel = LLUICtrlFactory::create<LLPanel>(panel_p);
+	
+	LLTextBox::Params text_p(p.more_chat_text);
+	text_p.rect = mMoreChatPanel->getLocalRect();
+	text_p.follows.flags = FOLLOWS_ALL;
+	text_p.name = "more_chat_text";
+	mMoreChatText = LLUICtrlFactory::create<LLTextBox>(text_p, mMoreChatPanel);
+	mMoreChatText->setClickedCallback(boost::bind(&LLChatHistory::onClickMoreText, this));
+
+	stackp->addPanel(mMoreChatPanel, 0, 0, false, false, LLLayoutStack::ANIMATE);
+}
+
+
 /*void LLChatHistory::updateTextRect()
 {
 	static LLUICachedControl<S32> texteditor_border ("UITextEditorBorder", 0);
@@ -393,15 +443,49 @@ LLView* LLChatHistory::getHeader(const LLChat& chat,const LLStyle::Params& style
 	return header;
 }
 
+void LLChatHistory::onClickMoreText()
+{
+	mEditor->endOfDoc();
+}
+
 void LLChatHistory::clear()
 {
 	mLastFromName.clear();
-	LLTextEditor::clear();
+	mEditor->clear();
 	mLastFromID = LLUUID::null;
 }
 
 void LLChatHistory::appendMessage(const LLChat& chat, const bool use_plain_text_chat_history, const LLStyle::Params& input_append_params)
 {
+	if (!mEditor->scrolledToEnd() && chat.mFromID != gAgent.getID() && !chat.mFromName.empty())
+	{
+		mUnreadChatSources.insert(chat.mFromName);
+		mMoreChatPanel->setVisible(TRUE);
+		std::string chatters;
+		for (unread_chat_source_t::iterator it = mUnreadChatSources.begin();
+			it != mUnreadChatSources.end();)
+		{
+			chatters += *it;
+			if (++it != mUnreadChatSources.end())
+			{
+				chatters += ",";
+			}
+		}
+		LLStringUtil::format_map_t args;
+		args["SOURCES"] = chatters;
+
+		if (mUnreadChatSources.size() == 1)
+		{
+			mMoreChatText->setValue(LLTrans::getString("unread_chat_single", args));
+		}
+		else
+		{
+			mMoreChatText->setValue(LLTrans::getString("unread_chat_multiple", args));
+		}
+		S32 height = mMoreChatText->getTextPixelHeight() + 5;
+		mMoreChatPanel->reshape(mMoreChatPanel->getRect().getWidth(), height);
+	}
+
 	LLColor4 txt_color = LLUIColorTable::instance().getColor("White");
 	LLViewerChat::getChatColor(chat,txt_color);
 	LLFontGL* fontp = LLViewerChat::getChatFont();	
@@ -416,7 +500,7 @@ void LLChatHistory::appendMessage(const LLChat& chat, const bool use_plain_text_
 	
 	if (use_plain_text_chat_history)
 	{
-		appendText("[" + chat.mTimeStr + "] ", getText().size() != 0, style_params);
+		mEditor->appendText("[" + chat.mTimeStr + "] ", mEditor->getText().size() != 0, style_params);
 
 		if (utf8str_trim(chat.mFromName).size() != 0)
 		{
@@ -426,11 +510,11 @@ void LLChatHistory::appendMessage(const LLChat& chat, const bool use_plain_text_
 				LLStyle::Params link_params(style_params);
 				link_params.fillFrom(LLStyleMap::instance().lookupAgent(chat.mFromID));
 				// Convert the name to a hotlink and add to message.
-				appendText(chat.mFromName + ": ", false, link_params);
+				mEditor->appendText(chat.mFromName + ": ", false, link_params);
 			}
 			else
 			{
-				appendText(chat.mFromName + ": ", false, style_params);
+				mEditor->appendText(chat.mFromName + ": ", false, style_params);
 			}
 		}
 	}
@@ -457,7 +541,7 @@ void LLChatHistory::appendMessage(const LLChat& chat, const bool use_plain_text_
 		else
 		{
 			view = getHeader(chat, style_params);
-			if (getText().size() == 0)
+			if (mEditor->getText().size() == 0)
 				p.top_pad = 0;
 			else
 				p.top_pad = mTopHeaderPad;
@@ -467,9 +551,9 @@ void LLChatHistory::appendMessage(const LLChat& chat, const bool use_plain_text_
 		p.view = view;
 
 		//Prepare the rect for the view
-		LLRect target_rect = getDocumentView()->getRect();
+		LLRect target_rect = mEditor->getDocumentView()->getRect();
 		// squeeze down the widget by subtracting padding off left and right
-		target_rect.mLeft += mLeftWidgetPad + mHPad;
+		target_rect.mLeft += mLeftWidgetPad + mEditor->getHPad();
 		target_rect.mRight -= mRightWidgetPad;
 		view->reshape(target_rect.getWidth(), view->getRect().getHeight());
 		view->setOrigin(target_rect.mLeft, view->getRect().mBottom);
@@ -478,7 +562,7 @@ void LLChatHistory::appendMessage(const LLChat& chat, const bool use_plain_text_
 		if (utf8str_trim(chat.mFromName).size() != 0 && chat.mFromName != SYSTEM_FROM)
 			header_text += chat.mFromName + ": ";
 
-		appendWidget(p, header_text, false);
+		mEditor->appendWidget(p, header_text, false);
 		mLastFromName = chat.mFromName;
 		mLastFromID = chat.mFromID;
 		mLastMessageTime = new_message_time;
@@ -490,10 +574,10 @@ void LLChatHistory::appendMessage(const LLChat& chat, const bool use_plain_text_
 		style_params.font.style = "ITALIC";
 
 		if (chat.mFromName.size() > 0)
-			appendText(chat.mFromName + " ", TRUE, style_params);
+			mEditor->appendText(chat.mFromName + " ", TRUE, style_params);
 		// Ensure that message ends with NewLine, to avoid losing of new lines
 		// while copy/paste from text chat. See EXT-3263.
-		appendText(chat.mText.substr(4) + NEW_LINE, FALSE, style_params);
+		mEditor->appendText(chat.mText.substr(4) + NEW_LINE, FALSE, style_params);
 	}
 	else
 	{
@@ -504,8 +588,19 @@ void LLChatHistory::appendMessage(const LLChat& chat, const bool use_plain_text_
 			// while copy/paste from text chat. See EXT-3263.
 			message += NEW_LINE;
 		}
-		appendText(message, FALSE, style_params);
+		mEditor->appendText(message, FALSE, style_params);
 	}
-	blockUndo();
+	mEditor->blockUndo();
+}
+
+void LLChatHistory::draw()
+{
+	if (mEditor->scrolledToEnd())
+	{
+		mUnreadChatSources.clear();
+		mMoreChatPanel->setVisible(FALSE);
+	}
+
+	LLUICtrl::draw();
 }
 
diff --git a/indra/newview/llchathistory.h b/indra/newview/llchathistory.h
index 8ca7dd1d58993be856ea48f81c08e94b8737ac65..260015e2dc8a048b88c7e9964aca249daf8e61cc 100644
--- a/indra/newview/llchathistory.h
+++ b/indra/newview/llchathistory.h
@@ -34,10 +34,11 @@
 #define LLCHATHISTORY_H_
 
 #include "lltexteditor.h"
+#include "lltextbox.h"
 #include "llviewerchat.h"
 
 //Chat log widget allowing addition of a message as a widget 
-class LLChatHistory : public LLTextEditor
+class LLChatHistory : public LLUICtrl
 {
 	public:
 		struct Params : public LLInitParam::Block<Params, LLTextEditor::Params>
@@ -63,6 +64,8 @@ class LLChatHistory : public LLTextEditor
 			//Header bottom padding
 			Optional<S32>			bottom_header_pad;
 
+			Optional<LLTextBox::Params>	more_chat_text;
+
 			Params()
 			:	message_header("message_header"),
 				message_separator("message_separator"),
@@ -73,15 +76,16 @@ class LLChatHistory : public LLTextEditor
 				top_separator_pad("top_separator_pad"),
 				bottom_separator_pad("bottom_separator_pad"),
 				top_header_pad("top_header_pad"),
-				bottom_header_pad("bottom_header_pad")
-				{
-				}
+				bottom_header_pad("bottom_header_pad"),
+				more_chat_text("more_chat_text")
+			{}
 
 		};
 	protected:
 		LLChatHistory(const Params&);
 		friend class LLUICtrlFactory;
 
+		/*virtual*/ void draw();
 		/**
 		 * Redefinition of LLTextEditor::updateTextRect() to considerate text
 		 * left/right padding params.
@@ -98,9 +102,13 @@ class LLChatHistory : public LLTextEditor
 		 */
 		LLView* getHeader(const LLChat& chat,const LLStyle::Params& style_params);
 
+		void onClickMoreText();
+
 	public:
 		~LLChatHistory();
 
+		void initFromParams(const Params&);
+
 		/**
 		 * Appends a widget message.
 		 * If last user appended message, concurs with current user,
@@ -129,5 +137,11 @@ class LLChatHistory : public LLTextEditor
 		S32 mBottomSeparatorPad;
 		S32 mTopHeaderPad;
 		S32 mBottomHeaderPad;
+
+		LLPanel*		mMoreChatPanel;
+		LLTextBox*		mMoreChatText;
+		LLTextEditor*	mEditor;
+		typedef std::set<std::string> unread_chat_source_t;
+		unread_chat_source_t mUnreadChatSources;
 };
 #endif /* LLCHATHISTORY_H_ */
diff --git a/indra/newview/llcommanddispatcherlistener.cpp b/indra/newview/llcommanddispatcherlistener.cpp
index 00a20de30edc4639671fd432adfb938282c39275..91baeaf989adbaa26a2f67441f4e965c01748e1b 100644
--- a/indra/newview/llcommanddispatcherlistener.cpp
+++ b/indra/newview/llcommanddispatcherlistener.cpp
@@ -31,6 +31,11 @@ LLCommandDispatcherListener::LLCommandDispatcherListener(/* LLCommandDispatcher*
         "[\"query\"] map of parameters, as if from ?key1=val&key2=val\n"
         "[\"trusted\"] boolean indicating trusted browser [default true]",
         &LLCommandDispatcherListener::dispatch);
+    add("enumerate",
+        "Post to [\"reply\"] a map of registered LLCommandHandler instances, containing\n"
+        "name key and (e.g.) untrusted flag",
+        &LLCommandDispatcherListener::enumerate,
+        LLSD().with("reply", LLSD()));
 }
 
 void LLCommandDispatcherListener::dispatch(const LLSD& params) const
@@ -45,3 +50,11 @@ void LLCommandDispatcherListener::dispatch(const LLSD& params) const
     LLCommandDispatcher::dispatch(params["cmd"], params["params"], params["query"], NULL,
                                   trusted_browser);
 }
+
+void LLCommandDispatcherListener::enumerate(const LLSD& params) const
+{
+    LLReqID reqID(params);
+    LLSD response(LLCommandDispatcher::enumerate());
+    reqID.stamp(response);
+    LLEventPumps::instance().obtain(params["reply"]).post(response);
+}
diff --git a/indra/newview/llcommanddispatcherlistener.h b/indra/newview/llcommanddispatcherlistener.h
index d0070ddd711caf8d13fe3866e70b5cf7f0b2425d..9bcddebcc149b799d77450099123675ea51372d6 100644
--- a/indra/newview/llcommanddispatcherlistener.h
+++ b/indra/newview/llcommanddispatcherlistener.h
@@ -23,6 +23,7 @@ class LLCommandDispatcherListener: public LLEventAPI
 
 private:
     void dispatch(const LLSD& params) const;
+    void enumerate(const LLSD& params) const;
 
     //LLCommandDispatcher* mDispatcher;
 };
diff --git a/indra/newview/llcommandhandler.cpp b/indra/newview/llcommandhandler.cpp
index 8c7e7bea83b91be92abf6a0680ddca920c787726..dc506a16925c238f565e071a5a67fc440ac8bc58 100644
--- a/indra/newview/llcommandhandler.cpp
+++ b/indra/newview/llcommandhandler.cpp
@@ -36,6 +36,7 @@
 #include "llcommandhandler.h"
 #include "llnotificationsutil.h"
 #include "llcommanddispatcherlistener.h"
+#include "stringize.h"
 
 // system includes
 #include <boost/tokenizer.hpp>
@@ -67,6 +68,7 @@ class LLCommandHandlerRegistry
 				  bool trusted_browser);
 
 private:
+	friend LLSD LLCommandDispatcher::enumerate();
 	std::map<std::string, LLCommandHandlerInfo> mMap;
 };
 
@@ -175,3 +177,56 @@ bool LLCommandDispatcher::dispatch(const std::string& cmd,
 	return LLCommandHandlerRegistry::instance().dispatch(
 		cmd, params, query_map, web, trusted_browser);
 }
+
+static std::string lookup(LLCommandHandler::EUntrustedAccess value);
+
+LLSD LLCommandDispatcher::enumerate()
+{
+	LLSD response;
+	LLCommandHandlerRegistry& registry(LLCommandHandlerRegistry::instance());
+	for (std::map<std::string, LLCommandHandlerInfo>::const_iterator chi(registry.mMap.begin()),
+																	 chend(registry.mMap.end());
+		 chi != chend; ++chi)
+	{
+		LLSD info;
+		info["untrusted"] = chi->second.mUntrustedBrowserAccess;
+		info["untrusted_str"] = lookup(chi->second.mUntrustedBrowserAccess);
+		response[chi->first] = info;
+	}
+	return response;
+}
+
+/*------------------------------ lookup stuff ------------------------------*/
+struct symbol_info
+{
+	const char* name;
+	LLCommandHandler::EUntrustedAccess value;
+};
+
+#define ent(SYMBOL)										\
+	{													\
+		#SYMBOL + 28, /* skip "LLCommandHandler::UNTRUSTED_" prefix */	\
+		SYMBOL											\
+	}
+
+symbol_info symbols[] =
+{
+	ent(LLCommandHandler::UNTRUSTED_ALLOW),		  // allow commands from untrusted browsers
+	ent(LLCommandHandler::UNTRUSTED_BLOCK),		  // ignore commands from untrusted browsers
+	ent(LLCommandHandler::UNTRUSTED_THROTTLE)	  // allow untrusted, but only a few per min.
+};
+
+#undef ent
+
+static std::string lookup(LLCommandHandler::EUntrustedAccess value)
+{
+	for (symbol_info *sii(symbols), *siend(symbols + (sizeof(symbols)/sizeof(symbols[0])));
+		 sii != siend; ++sii)
+	{
+		if (sii->value == value)
+		{
+			return sii->name;
+		}
+	}
+	return STRINGIZE("UNTRUSTED_" << value);
+}
diff --git a/indra/newview/llcommandhandler.h b/indra/newview/llcommandhandler.h
index 1bae6d94142545c973d7b141cae2f83f8172d2f8..a1d4c880f537b223c2730ebd00a4309455ff281e 100644
--- a/indra/newview/llcommandhandler.h
+++ b/indra/newview/llcommandhandler.h
@@ -34,6 +34,8 @@
 #ifndef LLCOMMANDHANDLER_H
 #define LLCOMMANDHANDLER_H
 
+#include "llsd.h"
+
 /* Example:  secondlife:///app/foo/<uuid>
    Command "foo" that takes one parameter, a UUID.
 
@@ -103,6 +105,9 @@ class LLCommandDispatcher
 		// Execute a command registered via the above mechanism,
 		// passing string parameters.
 		// Returns true if command was found and executed correctly.
+	/// Return an LLSD::Map of registered LLCommandHandlers and associated
+	/// info (e.g. EUntrustedAccess).
+	static LLSD enumerate();
 };
 
 #endif
diff --git a/indra/newview/llfasttimerview.cpp b/indra/newview/llfasttimerview.cpp
index 0b27001f10300ae8d32ac585e71c876ba5655860..effa57b1efba5cf91d3a4893821d585e4b39f7bb 100644
--- a/indra/newview/llfasttimerview.cpp
+++ b/indra/newview/llfasttimerview.cpp
@@ -98,6 +98,7 @@ LLFastTimerView::LLFastTimerView(const LLRect& rect)
 	mHoverBarIndex = -1;
 	FTV_NUM_TIMERS = LLFastTimer::NamedTimer::instanceCount();
 	mPrintStats = -1;	
+	mAverageCyclesPerTimer = 0;
 }
 
 
@@ -306,8 +307,9 @@ void LLFastTimerView::draw()
 	S32 height = (S32) (gViewerWindow->getWindowRectScaled().getHeight()*0.75f);
 	S32 width = (S32) (gViewerWindow->getWindowRectScaled().getWidth() * 0.75f);
 	
-	// HACK: casting away const. Should use setRect or some helper function instead.
-		const_cast<LLRect&>(getRect()).setLeftTopAndSize(getRect().mLeft, getRect().mTop, width, height);
+	LLRect new_rect;
+	new_rect.setLeftTopAndSize(getRect().mLeft, getRect().mTop, width, height);
+	setRect(new_rect);
 
 	S32 left, top, right, bottom;
 	S32 x, y, barw, barh, dx, dy;
@@ -321,6 +323,10 @@ void LLFastTimerView::draw()
 	S32 xleft = margin;
 	S32 ytop = margin;
 	
+	mAverageCyclesPerTimer = llround(lerp((F32)mAverageCyclesPerTimer, (F32)(LLFastTimer::sTimerCycles / (U64)LLFastTimer::sTimerCalls), 0.1f));
+	LLFastTimer::sTimerCycles = 0;
+	LLFastTimer::sTimerCalls = 0;
+
 	// Draw some help
 	{
 		
@@ -328,6 +334,10 @@ void LLFastTimerView::draw()
 		y = height - ytop;
 		texth = (S32)LLFontGL::getFontMonospace()->getLineHeight();
 
+#if TIME_FAST_TIMERS
+		tdesc = llformat("Cycles per timer call: %d", mAverageCyclesPerTimer);
+		LLFontGL::getFontMonospace()->renderUTF8(tdesc, 0, x, y, LLColor4::white, LLFontGL::LEFT, LLFontGL::TOP);
+#else
 		char modedesc[][32] = {
 			"2 x Average ",
 			"Max         ",
@@ -342,7 +352,6 @@ void LLFastTimerView::draw()
 
 		tdesc = llformat("Full bar = %s [Click to pause/reset] [SHIFT-Click to toggle]",modedesc[mDisplayMode]);
 		LLFontGL::getFontMonospace()->renderUTF8(tdesc, 0, x, y, LLColor4::white, LLFontGL::LEFT, LLFontGL::TOP);
-
 		textw = LLFontGL::getFontMonospace()->getWidth(tdesc);
 
 		x = xleft, y -= (texth + 2);
@@ -352,6 +361,7 @@ void LLFastTimerView::draw()
 
 		LLFontGL::getFontMonospace()->renderUTF8(std::string("[Right-Click log selected] [ALT-Click toggle counts] [ALT-SHIFT-Click sub hidden]"),
 										 0, x, y, LLColor4::white, LLFontGL::LEFT, LLFontGL::TOP);
+#endif
 		y -= (texth + 2);
 	}
 
diff --git a/indra/newview/llfasttimerview.h b/indra/newview/llfasttimerview.h
index 2bb023ab143771aeb9c9f775a596c5facd369b9e..f5c8f2381860b1c23061556f3b3011d5c44d9cdf 100644
--- a/indra/newview/llfasttimerview.h
+++ b/indra/newview/llfasttimerview.h
@@ -91,6 +91,7 @@ class LLFastTimerView : public LLFloater
 	S32 mHoverBarIndex;
 	LLFrameTimer mHighlightTimer;
 	S32 mPrintStats;
+	S32 mAverageCyclesPerTimer;
 };
 
 #endif
diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp
index ff568a11a92406fb3bf6acf4732c37391b230653..7e0e8bfaa70b865b80a1866ff85b36ed0c000022 100644
--- a/indra/newview/llfloaterpreference.cpp
+++ b/indra/newview/llfloaterpreference.cpp
@@ -760,8 +760,9 @@ void LLFloaterPreference::onClickResetCache()
 	{
 		gSavedSettings.setString("NewCacheLocation", "");
 		gSavedSettings.setString("NewCacheLocationTopFolder", "");
-		LLNotificationsUtil::add("CacheWillBeMoved");
 	}
+	
+	LLNotificationsUtil::add("CacheWillBeMoved");
 	std::string cache_location = gDirUtilp->getCacheDir(true);
 	gSavedSettings.setString("CacheLocation", cache_location);
 	std::string top_folder(gDirUtilp->getBaseFileName(cache_location));
diff --git a/indra/newview/llfloatersnapshot.cpp b/indra/newview/llfloatersnapshot.cpp
index dbecd45d1f2cf591e8cc615f920d9a18e7f576ff..f53b62e4903b11a789207a3ab3ffd72ab12628a9 100644
--- a/indra/newview/llfloatersnapshot.cpp
+++ b/indra/newview/llfloatersnapshot.cpp
@@ -1379,7 +1379,6 @@ void LLFloaterSnapshot::Impl::onClickDiscard(void* data)
 	
 	if (view)
 	{
-		view->getParent()->setMouseOpaque(FALSE);
 		view->closeFloater();
 	}
 }
@@ -2105,6 +2104,12 @@ void LLFloaterSnapshot::onOpen(const LLSD& key)
 	gSnapshotFloaterView->adjustToFitScreen(this, FALSE);
 }
 
+void LLFloaterSnapshot::onClose(bool app_quitting)
+{
+	getParent()->setMouseOpaque(FALSE);
+}
+
+
 //static 
 void LLFloaterSnapshot::update()
 {
diff --git a/indra/newview/llfloatersnapshot.h b/indra/newview/llfloatersnapshot.h
index bd01f6c5731ecc9dead351fd353a66d76c7ac0e9..1333497bd25f1211aad2746d177b8001e6d17f5e 100644
--- a/indra/newview/llfloatersnapshot.h
+++ b/indra/newview/llfloatersnapshot.h
@@ -52,6 +52,7 @@ class LLFloaterSnapshot : public LLFloater
 	/*virtual*/ BOOL postBuild();
 	/*virtual*/ void draw();
 	/*virtual*/ void onOpen(const LLSD& key);
+	/*virtual*/ void onClose(bool app_quitting);
 	
 	static void update();
 	
diff --git a/indra/newview/llfolderview.cpp b/indra/newview/llfolderview.cpp
index 8b05f8614d27873be7b9f9a9019875ec1555e00e..9cca1b07db8505c1800bc69166fb314cf51a3adf 100644
--- a/indra/newview/llfolderview.cpp
+++ b/indra/newview/llfolderview.cpp
@@ -751,7 +751,7 @@ void LLFolderView::sanitizeSelection()
 		}
 
 		// Don't allow invisible items (such as root folders) to be selected.
-		if (item->getDontShowInHierarchy())
+		if (item->getHidden())
 		{
 			items_to_remove.push_back(item);
 		}
@@ -774,7 +774,7 @@ void LLFolderView::sanitizeSelection()
 				parent_folder;
 				parent_folder = parent_folder->getParentFolder())
 			{
-				if (parent_folder->potentiallyVisible() && !parent_folder->getDontShowInHierarchy())
+				if (parent_folder->potentiallyVisible() && !parent_folder->getHidden())
 				{
 					// give initial selection to first ancestor folder that potentially passes the filter
 					if (!new_selection)
@@ -796,7 +796,7 @@ void LLFolderView::sanitizeSelection()
 			// nothing selected to start with, so pick "My Inventory" as best guess
 			new_selection = getItemByID(gInventory.getRootFolderID());
 			// ... except if it's hidden from the UI.
-			if (new_selection && new_selection->getDontShowInHierarchy())
+			if (new_selection && new_selection->getHidden())
 			{
 				new_selection = NULL;
 			}
diff --git a/indra/newview/llfolderviewitem.cpp b/indra/newview/llfolderviewitem.cpp
index bfd9d6dca7fd9ca5c6c3291ef1e8b1b22ef5fd2f..720c2c7b1a5cf835c971fcc217b0f5f866c0cffb 100644
--- a/indra/newview/llfolderviewitem.cpp
+++ b/indra/newview/llfolderviewitem.cpp
@@ -136,7 +136,7 @@ LLFolderViewItem::LLFolderViewItem(LLFolderViewItem::Params p)
 	mListener(p.listener),
 	mArrowImage(p.folder_arrow_image),
 	mBoxImage(p.selection_image),
-	mDontShowInHierarchy(false),
+	mHidden(false),
 	mShowLoadStatus(false)
 {
 	refresh();
@@ -201,7 +201,7 @@ LLFolderViewItem* LLFolderViewItem::getPreviousOpenNode(BOOL include_children)
 	LLFolderViewItem* itemp = mParentFolder->getPreviousFromChild( this, include_children );
 
 	// Skip over items that are invisible or are hidden from the UI.
-	while(itemp && (!itemp->getVisible() || itemp->getDontShowInHierarchy()))
+	while(itemp && (!itemp->getVisible() || itemp->getHidden()))
 	{
 		LLFolderViewItem* next_itemp = itemp->mParentFolder->getPreviousFromChild( itemp, include_children );
 		if (itemp == next_itemp) 
@@ -418,7 +418,7 @@ S32 LLFolderViewItem::arrange( S32* width, S32* height, S32 filter_generation)
 
 S32 LLFolderViewItem::getItemHeight()
 {
-	if (mDontShowInHierarchy) return 0;
+	if (mHidden) return 0;
 
 	S32 icon_height = mIcon->getHeight();
 	S32 label_height = llround(getLabelFontForStyle(mLabelStyle)->getLineHeight());
@@ -823,7 +823,7 @@ BOOL LLFolderViewItem::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
 
 void LLFolderViewItem::draw()
 {
-	if (mDontShowInHierarchy) return;
+	if (mHidden) return;
 
 	static LLUIColor sFgColor = LLUIColorTable::instance().getColor("MenuItemEnabledColor", DEFAULT_WHITE);
 	static LLUIColor sHighlightBgColor = LLUIColorTable::instance().getColor("MenuItemHighlightBgColor", DEFAULT_WHITE);
@@ -970,11 +970,26 @@ void LLFolderViewItem::draw()
 
 
 		font->renderUTF8( mLabel, 0, text_left, y, color,
-				   LLFontGL::LEFT, LLFontGL::BOTTOM, LLFontGL::NORMAL, LLFontGL::NO_SHADOW,
-			S32_MAX, getRect().getWidth() - (S32) text_left, &right_x, TRUE);
+						  LLFontGL::LEFT, LLFontGL::BOTTOM, LLFontGL::NORMAL, LLFontGL::NO_SHADOW,
+						  S32_MAX, getRect().getWidth() - (S32) text_left, &right_x, TRUE);
 
+//		LLViewerInventoryCategory *item = 0;
+//		if (getListener())
+//			item = gInventory.getCategory(getListener()->getUUID());
+		bool root_is_loading = false;
+		if (getListener() && gInventory.isObjectDescendentOf(getListener()->getUUID(),gInventory.getRootFolderID()))
+		{
+			// Descendent of my inventory.
+			root_is_loading = gInventory.myInventoryFetchInProgress();
+		}
+		if (getListener() && gInventory.isObjectDescendentOf(getListener()->getUUID(),gInventory.getLibraryRootFolderID()))
+		{
+			// Descendent of library
+			root_is_loading = gInventory.libraryFetchInProgress();
+		}
+			
 		if ( (mIsLoading && mTimeSinceRequestStart.getElapsedTimeF32() >= gSavedSettings.getF32("FolderLoadingMessageWaitTime"))
-			|| (LLInventoryModel::backgroundFetchActive() && mShowLoadStatus) )
+			|| (LLInventoryModel::backgroundFetchActive() && root_is_loading && mShowLoadStatus) )
 		{
 			std::string load_string = " ( " + LLTrans::getString("LoadingData") + " ) ";
 			font->renderUTF8(load_string, 0, right_x, y, sSearchStatusColor,
@@ -1257,7 +1272,7 @@ void LLFolderViewFolder::filter( LLInventoryFilter& filter)
 			// filter self only on first pass through
 			LLFolderViewItem::filter( filter );
 		}
-		if (mDontShowInHierarchy)
+		if (mHidden)
 		{
 			setOpen();
 		}
diff --git a/indra/newview/llfolderviewitem.h b/indra/newview/llfolderviewitem.h
index a43096dcb2efc09269a23ec73dab8876cd0c308a..21e24c2a4dd065dac7570f0649014f62971b8035 100644
--- a/indra/newview/llfolderviewitem.h
+++ b/indra/newview/llfolderviewitem.h
@@ -162,7 +162,7 @@ class LLFolderViewItem : public LLView
 	LLUIImagePtr				mBoxImage;
 	BOOL                        mIsLoading;
 	LLTimer                     mTimeSinceRequestStart;
-	bool						mDontShowInHierarchy;
+	bool						mHidden;
 	bool						mShowLoadStatus;
 
 	// helper function to change the selection from the root.
@@ -206,8 +206,11 @@ class LLFolderViewItem : public LLView
 	// makes sure that this view and it's children are the right size.
 	virtual S32 arrange( S32* width, S32* height, S32 filter_generation );
 	virtual S32 getItemHeight();
-	void setDontShowInHierarchy(bool dont_show) { mDontShowInHierarchy = dont_show; }
-	bool getDontShowInHierarchy() const { return mDontShowInHierarchy; }
+
+	// Hide the folder from the UI, such as if you want to hide the root
+	// folder in an inventory panel.
+	void setHidden(bool hidden) { mHidden = hidden; }
+	bool getHidden() const { return mHidden; }
 
 	// applies filters to control visibility of inventory items
 	virtual void filter( LLInventoryFilter& filter);
diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp
index 85880af92393b266aaca4c646cd2035ea3f74c75..3549891bc5f1fd36a7ed7f1252ccb779a6881baf 100644
--- a/indra/newview/llimview.cpp
+++ b/indra/newview/llimview.cpp
@@ -1447,11 +1447,20 @@ void LLCallDialog::getAllowedRect(LLRect& rect)
 	rect = gViewerWindow->getWorldViewRectScaled();
 }
 
-void LLCallDialog::onOpen(const LLSD& key)
+BOOL LLCallDialog::postBuild()
 {
+	if (!LLDockableFloater::postBuild())
+		return FALSE;
+
 	// dock the dialog to the Speak Button, where other sys messages appear
-	setDockControl(new LLDockControl(LLBottomTray::getInstance()->getChild<LLPanel>("speak_panel"),
-		this, getDockTongue(), LLDockControl::TOP, boost::bind(&LLCallDialog::getAllowedRect, this, _1)));
+	LLView *anchor_panel = LLBottomTray::getInstance()->getChild<LLView>("speak_panel");
+
+	setDockControl(new LLDockControl(
+		anchor_panel, this,
+		getDockTongue(), LLDockControl::TOP,
+		boost::bind(&LLCallDialog::getAllowedRect, this, _1)));
+
+	return TRUE;
 }
 
 //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -1595,7 +1604,7 @@ void LLOutgoingCallDialog::onCancel(void* user_data)
 
 BOOL LLOutgoingCallDialog::postBuild()
 {
-	BOOL success = LLDockableFloater::postBuild();
+	BOOL success = LLCallDialog::postBuild();
 
 	childSetAction("Cancel", onCancel, this);
 
@@ -1614,7 +1623,7 @@ LLCallDialog(payload)
 
 BOOL LLIncomingCallDialog::postBuild()
 {
-	LLDockableFloater::postBuild();
+	LLCallDialog::postBuild();
 
 	LLUUID session_id = mPayload["session_id"].asUUID();
 	LLSD caller_id = mPayload["caller_id"];
diff --git a/indra/newview/llimview.h b/indra/newview/llimview.h
index c928546219b0abb2b6a13256ff9b7ec6feefb7e1..3f46b0d75463c3ae6de25f4abf16aae4ef64c830 100644
--- a/indra/newview/llimview.h
+++ b/indra/newview/llimview.h
@@ -484,7 +484,7 @@ class LLCallDialog : public LLDockableFloater
 	LLCallDialog(const LLSD& payload);
 	~LLCallDialog() {}
 
-	virtual void onOpen(const LLSD& key);
+	virtual BOOL postBuild();
 
 protected:
 	virtual void getAllowedRect(LLRect& rect);
diff --git a/indra/newview/llinventorymodel.cpp b/indra/newview/llinventorymodel.cpp
index 0a8108899ae55d87b2d8e2656a06dbb2ae569010..1eb8d1bc2cc18cef6d90249ac04245b7dc594566 100644
--- a/indra/newview/llinventorymodel.cpp
+++ b/indra/newview/llinventorymodel.cpp
@@ -67,6 +67,7 @@ F32  LLInventoryModel::sMaxTimeBetweenFetches = 10.f;
 BOOL LLInventoryModel::sTimelyFetchPending = FALSE;
 LLFrameTimer LLInventoryModel::sFetchTimer;
 S16 LLInventoryModel::sBulkFetchCount = 0;
+BOOL LLInventoryModel::sFirstTimeInViewer2 = TRUE;
 
 // Increment this if the inventory contents change in a non-backwards-compatible way.
 // For viewer 2, the addition of link items makes a pre-viewer-2 cache incorrect.
@@ -1339,8 +1340,7 @@ bool LLInventoryModel::fetchDescendentsOf(const LLUUID& folder_id)
 //Initialize statics.
 bool LLInventoryModel::isBulkFetchProcessingComplete()
 {
-	return ( (sFetchQueue.empty() 
-			&& sBulkFetchCount<=0)  ?  TRUE : FALSE ) ;
+	return sFetchQueue.empty() && sBulkFetchCount<=0;
 }
 
 class LLInventoryModelFetchDescendentsResponder: public LLHTTPClient::Responder
@@ -1615,10 +1615,58 @@ void LLInventoryModel::bulkFetch(std::string url)
 	}	
 }
 
+bool fetchQueueContainsNoDescendentsOf(const LLUUID& cat_id)
+{
+	for (std::deque<LLUUID>::iterator it = sFetchQueue.begin();
+		 it != sFetchQueue.end(); ++it)
+	{
+		const LLUUID& fetch_id = *it;
+		if (gInventory.isObjectDescendentOf(fetch_id, cat_id))
+			return false;
+	}
+	return true;
+}
+
+/* static */
+bool LLInventoryModel::libraryFetchStarted()
+{
+	return sLibraryFetchStarted;
+}
+
+/* static */
+bool LLInventoryModel::libraryFetchCompleted()
+{
+	return libraryFetchStarted() && fetchQueueContainsNoDescendentsOf(gInventory.getLibraryRootFolderID());
+}
+
+/* static */
+bool LLInventoryModel::libraryFetchInProgress()
+{
+	return libraryFetchStarted() && !libraryFetchCompleted();
+}
+	
+/* static */
+bool LLInventoryModel::myInventoryFetchStarted()
+{
+	return sMyInventoryFetchStarted;
+}
+
+/* static */
+bool LLInventoryModel::myInventoryFetchCompleted()
+{
+	return myInventoryFetchStarted() && fetchQueueContainsNoDescendentsOf(gInventory.getRootFolderID());
+}
+
+/* static */
+bool LLInventoryModel::myInventoryFetchInProgress()
+{
+	return myInventoryFetchStarted() && !myInventoryFetchCompleted();
+}
+
 // static
 bool LLInventoryModel::isEverythingFetched()
 {
-	return (sAllFoldersFetched ? true : false);
+	return sAllFoldersFetched;
 }
 
 //static
@@ -1637,7 +1685,6 @@ void LLInventoryModel::startBackgroundFetch(const LLUUID& cat_id)
 			if (!sMyInventoryFetchStarted)
 			{
 				sMyInventoryFetchStarted = TRUE;
-				sFetchQueue.push_back(gInventory.getLibraryRootFolderID());
 				sFetchQueue.push_back(gInventory.getRootFolderID());
 				gIdleCallbacks.addFunction(&LLInventoryModel::backgroundFetch, NULL);
 			}
@@ -1645,7 +1692,6 @@ void LLInventoryModel::startBackgroundFetch(const LLUUID& cat_id)
 			{
 				sLibraryFetchStarted = TRUE;
 				sFetchQueue.push_back(gInventory.getLibraryRootFolderID());
-				sFetchQueue.push_back(gInventory.getRootFolderID());
 				gIdleCallbacks.addFunction(&LLInventoryModel::backgroundFetch, NULL);
 			}
 		}
@@ -2517,6 +2563,10 @@ void LLInventoryModel::buildParentChildMap()
 		llwarns << "Found  " << lost << " lost categories." << llendl;
 	}
 
+	const BOOL COF_exists = (findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT, FALSE) != LLUUID::null);
+	sFirstTimeInViewer2 = !COF_exists || gAgent.isFirstLogin();
+
+
 	// Now the items. We allocated in the last step, so now all we
 	// have to do is iterate over the items and put them in the right
 	// place.
@@ -3530,6 +3580,19 @@ void LLInventoryModel::setLibraryOwnerID(const LLUUID& val)
 	mLibraryOwnerID = val;
 }
 
+// static
+BOOL LLInventoryModel::getIsFirstTimeInViewer2()
+{
+	// Do not call this before parentchild map is built.
+	if (!gInventory.mIsAgentInvUsable)
+	{
+		llwarns << "Parent Child Map not yet built; guessing as first time in viewer2." << llendl;
+		return TRUE;
+	}
+
+	return sFirstTimeInViewer2;
+}
+
 //----------------------------------------------------------------------------
 
 // *NOTE: DEBUG functionality
diff --git a/indra/newview/llinventorymodel.h b/indra/newview/llinventorymodel.h
index 27bbca493daf2d8e749e0a5e5cdf2bbdce28eac5..39377b4ae24985cf483d45e4822f282399b85c08 100644
--- a/indra/newview/llinventorymodel.h
+++ b/indra/newview/llinventorymodel.h
@@ -499,9 +499,9 @@ class LLInventoryModel
 	// *NOTE: DEBUG functionality
 	void dumpInventory() const;
 
-	////////////////////////////////////////////////////////////////////////////////
-	// Bulk / Background Fetch
 
+	////////////////////////////////////////////////////////////////////////////////
+	// Bulk fetch
 public:
 	// Start and stop background breadth-first fetching of inventory contents.
 	// This gets triggered when performing a filter-search
@@ -516,6 +516,14 @@ class LLInventoryModel
 	// Add categories to a list to be fetched in bulk.
 	static void bulkFetch(std::string url);
 
+	static bool libraryFetchStarted();
+	static bool libraryFetchCompleted();
+	static bool libraryFetchInProgress();
+	
+	static bool myInventoryFetchStarted();
+	static bool myInventoryFetchCompleted();
+	static bool myInventoryFetchInProgress();
+	
 private:
  	static BOOL sMyInventoryFetchStarted;
 	static BOOL sLibraryFetchStarted;
@@ -525,6 +533,13 @@ class LLInventoryModel
 	// completing the fetch once per session should be sufficient
 	static BOOL sBackgroundFetchActive;
 	static S16 sBulkFetchCount;
+
+	////////////////////////////////////////////////////////////////////////////////
+	// Login status
+public:
+	static BOOL getIsFirstTimeInViewer2();
+private:
+	static BOOL sFirstTimeInViewer2;
 };
 
 // a special inventory model for the agent
diff --git a/indra/newview/llinventorypanel.cpp b/indra/newview/llinventorypanel.cpp
index 3c34ba32e279cc363f63f72cdf350c2165009a14..082b7a94689b8fcb872848f00c8f4611d0f28bbe 100644
--- a/indra/newview/llinventorypanel.cpp
+++ b/indra/newview/llinventorypanel.cpp
@@ -402,9 +402,12 @@ void LLInventoryPanel::modelChanged(U32 mask)
 // static
 void LLInventoryPanel::onIdle(void *userdata)
 {
+	if (!gInventory.isInventoryUsable())
+		return;
+
 	LLInventoryPanel *self = (LLInventoryPanel*)userdata;
 	// Inventory just initialized, do complete build
-	if (!self->mViewsInitialized && gInventory.isInventoryUsable())
+	if (!self->mViewsInitialized)
 	{
 		self->initializeViews();
 	}
@@ -502,7 +505,7 @@ void LLInventoryPanel::buildNewViews(const LLUUID& id)
 				// but still have the parent folder present for listener-related operations.
 				if (id == mStartFolderID)
 				{
-					folderp->setDontShowInHierarchy(TRUE);
+					folderp->setHidden(TRUE);
 				}
 			}
 		}
diff --git a/indra/newview/lllogininstance.cpp b/indra/newview/lllogininstance.cpp
index 2dc9f255d7a644f2d6c95310a411b1bc90ba4cf2..24c72c65cede0f674b90b49dcd93a42354d0532e 100644
--- a/indra/newview/lllogininstance.cpp
+++ b/indra/newview/lllogininstance.cpp
@@ -76,6 +76,7 @@ LLLoginInstance::LLLoginInstance() :
 	mDispatcher.add("fail.login", boost::bind(&LLLoginInstance::handleLoginFailure, this, _1));
 	mDispatcher.add("connect",    boost::bind(&LLLoginInstance::handleLoginSuccess, this, _1));
 	mDispatcher.add("disconnect", boost::bind(&LLLoginInstance::handleDisconnect, this, _1));
+	mDispatcher.add("indeterminate", boost::bind(&LLLoginInstance::handleIndeterminate, this, _1));
 }
 
 LLLoginInstance::~LLLoginInstance()
@@ -204,6 +205,8 @@ bool LLLoginInstance::handleLoginEvent(const LLSD& event)
 		mTransferRate = event["transfer_rate"].asReal();
 	}
 
+	
+
 	// Call the method registered in constructor, if any, for more specific
 	// handling
 	LLEventDispatcher::Callable method(mDispatcher.get(event["change"]));
@@ -295,6 +298,22 @@ void LLLoginInstance::handleDisconnect(const LLSD& event)
     // placeholder
 }
 
+void LLLoginInstance::handleIndeterminate(const LLSD& event)
+{
+	// The indeterminate response means that the server
+	// gave the viewer a new url and params to try.
+	// The login module handles the retry, but it gives us the
+	// server response so that we may show
+	// the user some status.
+	LLSD message = event.get("data").get("message");
+	if(message.isDefined())
+	{
+		LLSD progress_update;
+		progress_update["desc"] = message;
+		LLEventPumps::getInstance()->obtain("LLProgressView").post(progress_update);
+	}
+}
+
 bool LLLoginInstance::handleTOSResponse(bool accepted, const std::string& key)
 {
 	if(accepted)
@@ -374,28 +393,6 @@ void LLLoginInstance::updateApp(bool mandatory, const std::string& auth_msg)
 		mNotifications->add(notification_name, args, payload, 
 			boost::bind(&LLLoginInstance::updateDialogCallback, this, _1, _2));
 	}
-
-	/* *NOTE:Mani Experiment with Event API interface.
-	if(!mUpdateAppResponse)
-	{
-		bool make_unique = true;
-		mUpdateAppResponse.reset(new LLEventStream("logininstance_updateapp", make_unique));
-		mUpdateAppResponse->listen("diaupdateDialogCallback", 
-								   boost::bind(&LLLoginInstance::updateDialogCallback,
-								 			   this, _1
-											   )
-								   );
-	}
-
-	LLSD event;
-	event["op"] = "requestAdd";
-	event["name"] = notification_name;
-	event["substitutions"] = args;
-	event["payload"] = payload;
-	event["reply"] = mUpdateAppResponse->getName();
-
-	LLEventPumps::getInstance()->obtain("LLNotifications").post(event);
-	*/
 }
 
 bool LLLoginInstance::updateDialogCallback(const LLSD& notification, const LLSD& response)
diff --git a/indra/newview/lllogininstance.h b/indra/newview/lllogininstance.h
index 19d7449bc15bfc7eef3af996c3e7667e014ecbde..c8704eddb497dfb98ae7bebfe2f790d34fb4fa95 100644
--- a/indra/newview/lllogininstance.h
+++ b/indra/newview/lllogininstance.h
@@ -89,6 +89,7 @@ class LLLoginInstance : public LLSingleton<LLLoginInstance>
 	void handleLoginFailure(const LLSD& event);
 	void handleLoginSuccess(const LLSD& event);
 	void handleDisconnect(const LLSD& event);
+	void handleIndeterminate(const LLSD& event);
 
 	bool handleTOSResponse(bool v, const std::string& key);
 
@@ -107,7 +108,6 @@ class LLLoginInstance : public LLSingleton<LLLoginInstance>
 	std::string mSerialNumber;
 	int mLastExecEvent;
 	UpdaterLauncherCallback mUpdaterLauncher;
-	boost::scoped_ptr<LLEventStream> mUpdateAppResponse;
 	LLEventDispatcher mDispatcher;
 };
 
diff --git a/indra/newview/llmediadataclient.cpp b/indra/newview/llmediadataclient.cpp
index 2bb2a3da6fb23d98b7ae83711d211efd74474559..b8da368bd7a970bfcaba9ee890da6c9e57f2c80e 100755
--- a/indra/newview/llmediadataclient.cpp
+++ b/indra/newview/llmediadataclient.cpp
@@ -164,7 +164,7 @@ void LLMediaDataClient::enqueue(const Request *request)
 		// Sadly, we have to const-cast because items put into the queue are not const
 		mSortedQueue.push_back(const_cast<LLMediaDataClient::Request*>(request));
 		
-		LL_DEBUGS("LLMediaDataClient") << "SORTED queue:" << mSortedQueue << LL_ENDL;
+		LL_DEBUGS("LLMediaDataClientQueue") << "SORTED queue:" << mSortedQueue << LL_ENDL;
 	}
 	else {
 		if (mRoundRobinQueue.size() > mMaxRoundRobinQueueSize) 
@@ -187,7 +187,7 @@ void LLMediaDataClient::enqueue(const Request *request)
 			// Sadly, we have to const-cast because items put into the queue are not const
 			mRoundRobinQueue.push_front(const_cast<LLMediaDataClient::Request*>(request));
 			
-			LL_DEBUGS("LLMediaDataClient") << "RR queue:" << mRoundRobinQueue << LL_ENDL;			
+			LL_DEBUGS("LLMediaDataClientQueue") << "RR queue:" << mRoundRobinQueue << LL_ENDL;			
 		}
 		else
 		{
@@ -226,16 +226,16 @@ bool LLMediaDataClient::processQueueTimer()
 	{
 		LL_DEBUGS("LLMediaDataClient") << "QueueTimer::tick() started, SORTED queue size is:	  " << mSortedQueue.size() 
 			<< ", RR queue size is:	  " << mRoundRobinQueue.size() << LL_ENDL;
-		LL_DEBUGS("LLMediaDataClient") << "QueueTimer::tick() started, SORTED queue is:	  " << mSortedQueue << LL_ENDL;
-		LL_DEBUGS("LLMediaDataClient") << "QueueTimer::tick() started, RR queue is:	  " << mRoundRobinQueue << LL_ENDL;
+		LL_DEBUGS("LLMediaDataClientQueue") << "QueueTimer::tick() started, SORTED queue is:	  " << mSortedQueue << LL_ENDL;
+		LL_DEBUGS("LLMediaDataClientQueue") << "QueueTimer::tick() started, RR queue is:	  " << mRoundRobinQueue << LL_ENDL;
 	}
 	
 	serviceQueue();
 	
 	LL_DEBUGS("LLMediaDataClient") << "QueueTimer::tick() finished, SORTED queue size is:	  " << mSortedQueue.size() 
 		<< ", RR queue size is:	  " << mRoundRobinQueue.size() << LL_ENDL;
-	LL_DEBUGS("LLMediaDataClient") << "QueueTimer::tick() finished, SORTED queue is:	  " << mSortedQueue << LL_ENDL;
-	LL_DEBUGS("LLMediaDataClient") << "QueueTimer::tick() finished, RR queue is:	  " << mRoundRobinQueue << LL_ENDL;
+	LL_DEBUGS("LLMediaDataClientQueue") << "QueueTimer::tick() finished, SORTED queue is:	  " << mSortedQueue << LL_ENDL;
+	LL_DEBUGS("LLMediaDataClientQueue") << "QueueTimer::tick() finished, RR queue is:	  " << mRoundRobinQueue << LL_ENDL;
 	
 	return isEmpty();
 }
@@ -649,7 +649,7 @@ void LLMediaDataClient::Responder::error(U32 status, const std::string& reason)
 /*virtual*/
 void LLMediaDataClient::Responder::result(const LLSD& content)
 {
-	LL_DEBUGS("LLMediaDataClient") << *mRequest << " result : " << ll_print_sd(content) << LL_ENDL;
+	LL_DEBUGS("LLMediaDataClientResponse") << *mRequest << " result : " << ll_print_sd(content) << LL_ENDL;
 }
 
 //////////////////////////////////////////////////////////////////////////////////////
@@ -703,7 +703,7 @@ void LLObjectMediaDataClient::Responder::result(const LLSD& content)
 	llassert(type == LLMediaDataClient::Request::GET || type == LLMediaDataClient::Request::UPDATE)
 	if (type == LLMediaDataClient::Request::GET)
 	{
-		LL_DEBUGS("LLMediaDataClient") << *(getRequest()) << " GET returned: " << ll_print_sd(content) << LL_ENDL;
+		LL_DEBUGS("LLMediaDataClientResponse") << *(getRequest()) << " GET returned: " << ll_print_sd(content) << LL_ENDL;
 		
 		// Look for an error
 		if (content.has("error"))
diff --git a/indra/newview/llnavigationbar.cpp b/indra/newview/llnavigationbar.cpp
index 6210151d1b23ee992acf904026e0c3b95955201c..71dc0f901137488e0a50f437105dbeeb5384ab44 100644
--- a/indra/newview/llnavigationbar.cpp
+++ b/indra/newview/llnavigationbar.cpp
@@ -51,6 +51,8 @@
 #include "llsidetray.h"
 #include "llslurl.h"
 #include "llurlsimstring.h"
+#include "llurlregistry.h"
+#include "llurldispatcher.h"
 #include "llviewerinventory.h"
 #include "llviewermenu.h"
 #include "llviewerparcelmgr.h"
@@ -58,6 +60,7 @@
 #include "llappviewer.h"
 #include "llviewercontrol.h"
 #include "llfloatermediabrowser.h"
+#include "llweb.h"
 
 #include "llinventorymodel.h"
 #include "lllandmarkactions.h"
@@ -543,7 +546,20 @@ void LLNavigationBar::onRegionNameResponse(
 	// Invalid location?
 	if (!region_handle)
 	{
-		invokeSearch(typed_location);
+		// handle any secondlife:// SLapps, or
+		// display http:// URLs in the media browser, or
+		// anything else is sent to the search floater
+		if (LLUrlRegistry::instance().isUrl(typed_location))
+		{
+			if (! LLURLDispatcher::dispatchFromTextEditor(typed_location))
+			{
+				LLWeb::loadURL(typed_location);
+			}
+		}
+		else
+		{
+			invokeSearch(typed_location);
+		}
 		return;
 	}
 
diff --git a/indra/newview/llpanelavatar.cpp b/indra/newview/llpanelavatar.cpp
index ffe7f5716766a1e82511812abf4085263819b745..e9131a342e6327aebe10f6561bb53b832d93347e 100644
--- a/indra/newview/llpanelavatar.cpp
+++ b/indra/newview/llpanelavatar.cpp
@@ -403,6 +403,11 @@ void LLPanelProfileTab::updateButtons()
 //////////////////////////////////////////////////////////////////////////
 //////////////////////////////////////////////////////////////////////////
 
+bool enable_god()
+{
+	return gAgent.isGodlike();
+}
+
 LLPanelAvatarProfile::LLPanelAvatarProfile()
 : LLPanelProfileTab()
 {
@@ -423,6 +428,13 @@ BOOL LLPanelAvatarProfile::postBuild()
 	LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar;
 	registrar.add("Profile.Pay",  boost::bind(&LLPanelAvatarProfile::pay, this));
 	registrar.add("Profile.Share", boost::bind(&LLPanelAvatarProfile::share, this));
+	registrar.add("Profile.Kick", boost::bind(&LLPanelAvatarProfile::kick, this));
+	registrar.add("Profile.Freeze", boost::bind(&LLPanelAvatarProfile::freeze, this));
+	registrar.add("Profile.Unfreeze", boost::bind(&LLPanelAvatarProfile::unfreeze, this));
+	registrar.add("Profile.CSR", boost::bind(&LLPanelAvatarProfile::csr, this));
+
+	LLUICtrl::EnableCallbackRegistry::ScopedRegistrar enable;
+	enable.add("Profile.EnableGod", boost::bind(&enable_god));
 
 	mProfileMenu = LLUICtrlFactory::getInstance()->createFromFile<LLToggleableMenu>("menu_profile_overflow.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
 
@@ -622,6 +634,28 @@ void LLPanelAvatarProfile::share()
 	LLAvatarActions::share(getAvatarId());
 }
 
+void LLPanelAvatarProfile::kick()
+{
+	LLAvatarActions::kick(getAvatarId());
+}
+
+void LLPanelAvatarProfile::freeze()
+{
+	LLAvatarActions::freeze(getAvatarId());
+}
+
+void LLPanelAvatarProfile::unfreeze()
+{
+	LLAvatarActions::unfreeze(getAvatarId());
+}
+
+void LLPanelAvatarProfile::csr()
+{
+	std::string name;
+	gCacheName->getFullName(getAvatarId(), name);
+	LLAvatarActions::csr(getAvatarId(), name);
+}
+
 void LLPanelAvatarProfile::onUrlTextboxClicked(const std::string& url)
 {
 	LLWeb::loadURL(url);
diff --git a/indra/newview/llpanelavatar.h b/indra/newview/llpanelavatar.h
index b19c5cca49c8b1b48b055a5e82d754f3d190972e..8f07c67fb183dd1fd6aa40c715980427b7aef054 100644
--- a/indra/newview/llpanelavatar.h
+++ b/indra/newview/llpanelavatar.h
@@ -181,6 +181,15 @@ class LLPanelAvatarProfile
 	 */
 	void share();
 
+	void kick();
+	void freeze();
+	void unfreeze();
+	void csr();
+	
+
+	bool enableGod();
+
+
 	void onUrlTextboxClicked(const std::string& url);
 	void onHomepageTextboxClicked();
 	void onAddFriendButtonClick();
diff --git a/indra/newview/llpanelpicks.cpp b/indra/newview/llpanelpicks.cpp
index a52aa6d30f5288a5870e24156792f59a3f479a41..751705dd577d69310ef230e1d0c4c0b223ceafaa 100644
--- a/indra/newview/llpanelpicks.cpp
+++ b/indra/newview/llpanelpicks.cpp
@@ -485,6 +485,18 @@ void LLPanelPicks::onOpen(const LLSD& key)
 	LLPanelProfileTab::onOpen(key);
 }
 
+void LLPanelPicks::onClosePanel()
+{
+	if (mPanelClassifiedInfo)
+	{
+		onPanelClassifiedClose(mPanelClassifiedInfo);
+	}
+	if (mPanelPickInfo)
+	{
+		onPanelPickClose(mPanelPickInfo);
+	}
+}
+
 void LLPanelPicks::onListCommit(const LLFlatListView* f_list)
 {
 	// Make sure only one of the lists has selection.
diff --git a/indra/newview/llpanelpicks.h b/indra/newview/llpanelpicks.h
index fd8a9e6938c2759379823c2c7dc0ef9d3c8d4a79..1b2e35ca468339792d07a613232857716ba91a6e 100644
--- a/indra/newview/llpanelpicks.h
+++ b/indra/newview/llpanelpicks.h
@@ -74,6 +74,8 @@ class LLPanelPicks
 
 	/*virtual*/ void onOpen(const LLSD& key);
 
+	/*virtual*/ void onClosePanel();
+
 	void processProperties(void* data, EAvatarProcessorType type);
 
 	void updateData();
diff --git a/indra/newview/llparticipantlist.cpp b/indra/newview/llparticipantlist.cpp
index 5941487c7d500d7e149c14daaee5f240bc1279bc..7d5944ea2b2a403f96fafa3b38aedce9d279eee3 100644
--- a/indra/newview/llparticipantlist.cpp
+++ b/indra/newview/llparticipantlist.cpp
@@ -213,7 +213,6 @@ void LLParticipantList::updateRecentSpeakersOrder()
 	if (E_SORT_BY_RECENT_SPEAKERS == getSortOrder())
 	{
 		// Resort avatar list
-		mAvatarList->setDirty(true);
 		sort();
 	}
 }
diff --git a/indra/newview/llprogressview.cpp b/indra/newview/llprogressview.cpp
index 5f6b210767d23882de572b2f2e9de0c27dd8ebf3..7a48f890e05bddded44f5a127095b7d3936ac772 100644
--- a/indra/newview/llprogressview.cpp
+++ b/indra/newview/llprogressview.cpp
@@ -72,10 +72,12 @@ const S32 ANIMATION_FRAMES = 1; //13;
 LLProgressView::LLProgressView(const LLRect &rect) 
 :	LLPanel(),
 	mPercentDone( 0.f ),
-	mMouseDownInActiveArea( false )
+	mMouseDownInActiveArea( false ),
+	mUpdateEvents("LLProgressView")
 {
 	LLUICtrlFactory::getInstance()->buildPanel(this, "panel_progress.xml");
 	reshape(rect.getWidth(), rect.getHeight());
+	mUpdateEvents.listen("self", boost::bind(&LLProgressView::handleUpdate, this, _1));
 }
 
 BOOL LLProgressView::postBuild()
@@ -260,3 +262,26 @@ void LLProgressView::onClickMessage(void* data)
 		}
 	}
 }
+
+bool LLProgressView::handleUpdate(const LLSD& event_data)
+{
+	LLSD message = event_data.get("message");
+	LLSD desc = event_data.get("desc");
+	LLSD percent = event_data.get("percent");
+
+	if(message.isDefined())
+	{
+		setMessage(message.asString());
+	}
+
+	if(desc.isDefined())
+	{
+		setText(desc.asString());
+	}
+	
+	if(percent.isDefined())
+	{
+		setPercent(percent.asReal());
+	}
+	return false;
+}
diff --git a/indra/newview/llprogressview.h b/indra/newview/llprogressview.h
index 865646c85d0b036c35bbe9864704847273851210..6853674d88f2c1a82c84d0e3527b6ac69cae4bed 100644
--- a/indra/newview/llprogressview.h
+++ b/indra/newview/llprogressview.h
@@ -35,6 +35,7 @@
 
 #include "llpanel.h"
 #include "llframetimer.h"
+#include "llevents.h"
 
 class LLImageRaw;
 class LLButton;
@@ -75,7 +76,12 @@ class LLProgressView : public LLPanel
 	LLRect mOutlineRect;
 	bool mMouseDownInActiveArea;
 
+	// The LLEventStream mUpdateEvents depends upon this class being a singleton
+	// to avoid pump name conflicts.
 	static LLProgressView* sInstance;
+	LLEventStream mUpdateEvents; 
+
+	bool handleUpdate(const LLSD& event_data);
 };
 
 #endif // LL_LLPROGRESSVIEW_H
diff --git a/indra/newview/llscreenchannel.cpp b/indra/newview/llscreenchannel.cpp
index bd256ec9c28c83a8dbdb83033ab0253ea237e2f8..c18fe8ad7e92a3dd64fc96500c92186a2d1bcfed 100644
--- a/indra/newview/llscreenchannel.cpp
+++ b/indra/newview/llscreenchannel.cpp
@@ -217,7 +217,10 @@ void LLScreenChannel::addToast(const LLToast::Params& p)
 
 	ToastElem new_toast_elem(p);
 
+	// reset HIDDEN flags for the Overflow Toast
 	mOverflowToastHidden = false;
+	if(mOverflowToastPanel)
+		mOverflowToastPanel->setIsHidden(false);
 	
 	new_toast_elem.toast->setOnFadeCallback(boost::bind(&LLScreenChannel::onToastFade, this, _1));
 	new_toast_elem.toast->setOnToastDestroyedCallback(boost::bind(&LLScreenChannel::onToastDestroyed, this, _1));
@@ -459,8 +462,6 @@ void LLScreenChannel::showToastsBottom()
 	S32		toast_margin = 0;
 	std::vector<ToastElem>::reverse_iterator it;
 
-	closeOverflowToastPanel();
-
 	for(it = mToastList.rbegin(); it != mToastList.rend(); ++it)
 	{
 		if(it != mToastList.rbegin())
@@ -513,7 +514,11 @@ void LLScreenChannel::showToastsBottom()
 			mHiddenToastsNum++;
 		}
 		createOverflowToast(bottom, gSavedSettings.getS32("NotificationTipToastLifeTime"));
-	}	
+	}
+	else
+	{
+		closeOverflowToastPanel();
+	}
 }
 
 //--------------------------------------------------------------------------
@@ -544,11 +549,14 @@ void LLScreenChannel::createOverflowToast(S32 bottom, F32 timer)
 	LLRect toast_rect;
 	LLToast::Params p;
 	p.lifetime_secs = timer;
-	mOverflowToastPanel = new LLToast(p);
+
+	if(!mOverflowToastPanel)
+		mOverflowToastPanel = new LLToast(p);
 
 	if(!mOverflowToastPanel)
 		return;
 
+	mOverflowToastPanel->startFading();
 	mOverflowToastPanel->setOnFadeCallback(boost::bind(&LLScreenChannel::onOverflowToastHide, this));
 
 	LLTextBox* text_box = mOverflowToastPanel->getChild<LLTextBox>("toast_text");
@@ -606,8 +614,8 @@ void LLScreenChannel::closeOverflowToastPanel()
 {
 	if(mOverflowToastPanel != NULL)
 	{
-		mOverflowToastPanel->closeFloater();
-		mOverflowToastPanel = NULL;
+		mOverflowToastPanel->setVisible(FALSE);
+		mOverflowToastPanel->stopFading();
 	}
 }
 
diff --git a/indra/newview/llspeakbutton.cpp b/indra/newview/llspeakbutton.cpp
index fd39bde1187c4a2834f2f7852e5af6114d1a2e13..90214a1bd7888122ad8238fb9d52ac35e16ecaf9 100644
--- a/indra/newview/llspeakbutton.cpp
+++ b/indra/newview/llspeakbutton.cpp
@@ -61,7 +61,9 @@ void LLSpeakButton::draw()
 {
 	// gVoiceClient is the authoritative global source of info regarding our open-mic state, we merely reflect that state.
 	bool openmic = gVoiceClient->getUserPTTState();
-	mSpeakBtn->setToggleState(openmic);
+	bool voiceenabled = gVoiceClient->voiceEnabled();
+	mSpeakBtn->setToggleState(openmic && voiceenabled);
+	mOutputMonitor->setIsMuted(!voiceenabled);
 	LLUICtrl::draw();
 }
 
diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp
index 73e7d9981509833fd36e4e463149051180c522d1..eb2275bff07d50d1c97f3967c006fd68d21b6dad 100644
--- a/indra/newview/llstartup.cpp
+++ b/indra/newview/llstartup.cpp
@@ -1082,6 +1082,17 @@ bool idle_startup()
 		credentials["passwd"] = gPassword;
 		login->connect(credentials);
 
+		LLStartUp::setStartupState( STATE_LOGIN_CURL_UNSTUCK );
+		return FALSE;
+	}
+
+	if(STATE_LOGIN_CURL_UNSTUCK == LLStartUp::getStartupState())
+	{
+		// If we get here we have gotten past the potential stall
+		// in curl, so take "may appear frozen" out of progress bar. JC
+		auth_desc = LLTrans::getString("LoginInProgressNoFrozen");
+		set_startup_status(progress, auth_desc, auth_message);
+
 		LLStartUp::setStartupState( STATE_LOGIN_PROCESS_RESPONSE );
 		return FALSE;
 	}
@@ -1168,16 +1179,6 @@ bool idle_startup()
 				show_connect_box = true;
 			}
 		}
-		else
-		{
-			// Still waiting for response.
-			// *TODO:Mani - Actually check for login progress.
-			// If we get here we have gotten past the potential stall
-			// in curl, so take "may appear frozen" out of progress bar. JC
-			auth_desc = LLTrans::getString("LoginInProgressNoFrozen");
-			set_startup_status(progress, auth_desc, auth_message);
-		}
-
 		return FALSE;
 	}
 
@@ -2703,6 +2704,7 @@ std::string LLStartUp::startupStateToString(EStartupState state)
 		RTNENUM( STATE_LOGIN_WAIT );
 		RTNENUM( STATE_LOGIN_CLEANUP );
 		RTNENUM( STATE_LOGIN_AUTH_INIT );
+		RTNENUM( STATE_LOGIN_CURL_UNSTUCK );
 		RTNENUM( STATE_LOGIN_PROCESS_RESPONSE );
 		RTNENUM( STATE_WORLD_INIT );
 		RTNENUM( STATE_MULTIMEDIA_INIT );
diff --git a/indra/newview/llstartup.h b/indra/newview/llstartup.h
index ab11b42e7427f81c70cbddc08d68c07402e437ad..92fe9521d3eb31b3ca8f2f99e618bc34a5e1c3ad 100644
--- a/indra/newview/llstartup.h
+++ b/indra/newview/llstartup.h
@@ -55,6 +55,7 @@ typedef enum {
 	STATE_LOGIN_WAIT,				// Wait for user input at login screen
 	STATE_LOGIN_CLEANUP,			// Get rid of login screen and start login
 	STATE_LOGIN_AUTH_INIT,			// Start login to SL servers
+	STATE_LOGIN_CURL_UNSTUCK,		// Update progress to remove "SL appears frozen" msg.
 	STATE_LOGIN_PROCESS_RESPONSE,	// Check authentication reply
 	STATE_WORLD_INIT,				// Start building the world
 	STATE_MULTIMEDIA_INIT,			// Init the rest of multimedia library
diff --git a/indra/newview/lltexturefetch.cpp b/indra/newview/lltexturefetch.cpp
index e80dafe2452c38fe14b6ef615952949a5ca2cc9f..3f489544b477c92428ef55ca23aef204840e2946 100644
--- a/indra/newview/lltexturefetch.cpp
+++ b/indra/newview/lltexturefetch.cpp
@@ -801,7 +801,7 @@ bool LLTextureFetchWorker::doWork(S32 param)
 	if (mState == SEND_HTTP_REQ)
 	{
 		{
-			const S32 HTTP_QUEUE_MAX_SIZE = 32;
+			const S32 HTTP_QUEUE_MAX_SIZE = 8;
 			// *TODO: Integrate this with llviewerthrottle
 			// Note: LLViewerThrottle uses dynamic throttling which makes sense for UDP,
 			// but probably not for Textures.
@@ -874,12 +874,30 @@ bool LLTextureFetchWorker::doWork(S32 param)
 			S32 cur_size = mFormattedImage.notNull() ? mFormattedImage->getDataSize() : 0;
 			if (mRequestedSize < 0)
 			{
-				const S32 HTTP_MAX_RETRY_COUNT = 3;
-				S32 max_attempts = (mGetStatus == HTTP_NOT_FOUND) ? 1 : HTTP_MAX_RETRY_COUNT + 1;
- 				llinfos << "HTTP GET failed for: " << mUrl
-						<< " Status: " << mGetStatus << " Reason: '" << mGetReason << "'"
-						<< " Attempt:" << mHTTPFailCount+1 << "/" << max_attempts << llendl;
-				++mHTTPFailCount;
+				S32 max_attempts;
+				if (mGetStatus == HTTP_NOT_FOUND)
+				{
+					mHTTPFailCount = max_attempts = 1; // Don't retry
+					llinfos << "Texture missing from server (404): " << mUrl << llendl;
+				}
+				else if (mGetStatus == HTTP_SERVICE_UNAVAILABLE)
+				{
+					// *TODO: Should probably introduce a timer here to delay future HTTP requsts
+					// for a short time (~1s) to ease server load? Ideally the server would queue
+					// requests instead of returning 503... we already limit the number pending.
+					++mHTTPFailCount;
+					max_attempts = mHTTPFailCount+1; // Keep retrying
+					LL_INFOS_ONCE("Texture") << "Texture server busy (503): " << mUrl << LL_ENDL;
+				}
+				else
+				{
+					const S32 HTTP_MAX_RETRY_COUNT = 3;
+					max_attempts = HTTP_MAX_RETRY_COUNT + 1;
+					++mHTTPFailCount;
+					llinfos << "HTTP GET failed for: " << mUrl
+							<< " Status: " << mGetStatus << " Reason: '" << mGetReason << "'"
+							<< " Attempt:" << mHTTPFailCount+1 << "/" << max_attempts << llendl;
+				}
 				if (mHTTPFailCount >= max_attempts)
 				{
 					if (cur_size > 0)
diff --git a/indra/newview/lltoolpie.cpp b/indra/newview/lltoolpie.cpp
index 74fbce890d9513b3eecd1f73fd4bc750c0041b06..b1d09eccba194b7eae52a7304ce142155c058c69 100644
--- a/indra/newview/lltoolpie.cpp
+++ b/indra/newview/lltoolpie.cpp
@@ -731,14 +731,13 @@ BOOL LLToolPie::handleToolTip(S32 local_x, S32 local_y, MASK mask)
 				// *HACK: We may select this object, so pretend it was clicked
 				mPick = mHoverPick;
 				LLInspector::Params p;
+				p.fillFrom(LLUICtrlFactory::instance().getDefaultParams<LLInspector>());
 				p.message(avatar_name);
 				p.image(LLUI::getUIImage("Info"));
 				p.click_callback(boost::bind(showAvatarInspector, hover_object->getID()));
 				p.visible_time_near(6.f);
 				p.visible_time_far(3.f);
 				p.wrap(false);
-
-				p.fillFrom(LLUICtrlFactory::instance().getDefaultParams<LLInspector>());
 				
 				LLToolTipMgr::instance().show(p);
 			}
@@ -822,6 +821,7 @@ BOOL LLToolPie::handleToolTip(S32 local_x, S32 local_y, MASK mask)
 					// We may select this object, so pretend it was clicked
 					mPick = mHoverPick;
 					LLInspector::Params p;
+					p.fillFrom(LLUICtrlFactory::instance().getDefaultParams<LLInspector>());
 					p.message(tooltip_msg);
 					p.image(LLUI::getUIImage("Info_Off"));
 					p.click_callback(boost::bind(showObjectInspector, hover_object->getID(), mHoverPick.mObjectFace));
@@ -833,8 +833,6 @@ BOOL LLToolPie::handleToolTip(S32 local_x, S32 local_y, MASK mask)
 					p.visible_time_near(6.f);
 					p.visible_time_far(3.f);
 					p.wrap(false);
-
-					p.fillFrom(LLUICtrlFactory::instance().getDefaultParams<LLInspector>());
 					
 					LLToolTipMgr::instance().show(p);
 				}
diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp
index f98aa361e045d92ebbffd1f92e5d61e017493231..70bfc6752316ee115b984f9dbaceeea4a35ca808 100644
--- a/indra/newview/llvovolume.cpp
+++ b/indra/newview/llvovolume.cpp
@@ -134,9 +134,21 @@ class LLMediaDataClientObjectImpl : public LLMediaDataClientObject
 	
 	virtual F64 getMediaInterest() const 
 		{ 
-			F64 tmp = mObject->getTotalMediaInterest();  
-			return (tmp < 0.0) ? mObject->getPixelArea() : tmp; 
+			F64 interest = mObject->getTotalMediaInterest();
+			if (interest < (F64)0.0)
+			{
+				// media interest not valid yet, try pixel area
+				interest = mObject->getPixelArea();
+				// HACK: force recalculation of pixel area if interest is the "magic default" of 1024.
+				if (interest == 1024.f)
+				{
+					const_cast<LLVOVolume*>(static_cast<LLVOVolume*>(mObject))->setPixelAreaAndAngle(gAgent);
+					interest = mObject->getPixelArea();
+				}
+			}
+			return interest; 
 		}
+	
 	virtual bool isInterestingEnough() const
 		{
 			return LLViewerMedia::isInterestingEnough(mObject, getMediaInterest());
diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp
index 73b5222ee3a5da76b7310b74e9f9fb221f7a3b74..4f4fc838191bb0fe9922e6e8931b3a931001ba58 100644
--- a/indra/newview/pipeline.cpp
+++ b/indra/newview/pipeline.cpp
@@ -6352,7 +6352,8 @@ void LLPipeline::renderDeferredLighting()
 
 			mDeferredLight[0].flush();
 
-			if (gSavedSettings.getBOOL("RenderDeferredBlurLight"))
+			if (gSavedSettings.getBOOL("RenderDeferredBlurLight") &&
+			    gSavedSettings.getBOOL("RenderDeferredGI"))
 			{
 				LLFastTimer ftm(FTM_EDGE_DETECTION);
 				//get edge map
diff --git a/indra/newview/skins/default/colors.xml b/indra/newview/skins/default/colors.xml
index 88e77f11ee9f21d85b6a6b6b823d68f4f7ae370a..706245a4793e5d0f2cf9a10222622d71a0a5cb18 100644
--- a/indra/newview/skins/default/colors.xml
+++ b/indra/newview/skins/default/colors.xml
@@ -71,10 +71,14 @@
 	<color
 	 name="Transparent"
 	 value="0 0 0 0" />
+  <!-- Make potentially unused colors show up bright purple.
+  Leave this here until all Unused? are removed below, otherwise
+  the viewer generates many warnings on startup. -->
+  <color
+	 name="Unused?"
+	 value="1 0 1 1" />
 
-
-
-	<!-- UI Definitions -->
+  <!-- UI Definitions -->
 
 	<color
      name="AgentChatColor"
diff --git a/indra/newview/skins/default/textures/icons/SL_Logo.png b/indra/newview/skins/default/textures/icons/SL_Logo.png
new file mode 100644
index 0000000000000000000000000000000000000000..c9fbde987a6615c783207ad967cb0c6c49670d04
Binary files /dev/null and b/indra/newview/skins/default/textures/icons/SL_Logo.png differ
diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml
index 412f8b6d681977e5acac4425cfe4591789c54054..8a9126208a3093332d3a819f51522ca920d591df 100644
--- a/indra/newview/skins/default/textures/textures.xml
+++ b/indra/newview/skins/default/textures/textures.xml
@@ -234,6 +234,7 @@ with the same filename but different name
   <texture name="Inv_Gloves" file_name="icons/Inv_Gloves.png" preload="false" />
   <texture name="Inv_Hair" file_name="icons/Inv_Hair.png" preload="false" />
   <texture name="Inv_LinkItem" file_name="icons/Inv_LinkItem.png" preload="false" />
+  <texture name="Inv_LinkItem_Broken" file_name="icons/Inv_LinkItem_Broken.png" preload="false" />
   <texture name="Inv_LinkFolder" file_name="icons/Inv_LinkFolder.png" preload="false" />
   <texture name="Inv_Jacket" file_name="icons/Inv_Jacket.png" preload="false" />
   <texture name="Inv_LookFolderOpen" file_name="icons/Inv_LookFolderOpen.png" preload="false" />
@@ -487,7 +488,8 @@ with the same filename but different name
   <texture name="SliderThumb_Off" file_name="widgets/SliderThumb_Off.png" />
   <texture name="SliderThumb_Disabled" file_name="widgets/SliderThumb_Disabled.png" />
   <texture name="SliderThumb_Press" file_name="widgets/SliderThumb_Press.png" />
-  <texture name="SL_Logo" file_name="map_infohub.tga" />
+
+  <texture name="SL_Logo" file_name="icons/SL_Logo.png" preload="true" />
 
   <texture name="Snapshot_Off" file_name="bottomtray/Snapshot_Off.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" />
   <texture name="Snapshot_Over" file_name="bottomtray/Snapshot_Over.png" preload="false" />
@@ -495,12 +497,12 @@ with the same filename but different name
 
   <texture name="startup_logo"  file_name="windows/startup_logo.png" preload="true" />
 
-  <texture name="Stepper_Down_Disabled" file_name="widgets/Stepper_Down_Disabled.png" preload="true" />
-  <texture name="Stepper_Down_Off" file_name="widgets/Stepper_Down_Off.png" preload="true" />
-  <texture name="Stepper_Down_Press" file_name="widgets/Stepper_Down_Press.png" preload="true" />
-  <texture name="Stepper_Up_Disabled" file_name="widgets/Stepper_Up_Disabled.png" preload="true" />
-  <texture name="Stepper_Up_Off" file_name="widgets/Stepper_Up_Off.png" preload="true" />
-  <texture name="Stepper_Up_Press" file_name="widgets/Stepper_Up_Press.png" preload="true" />
+  <texture name="Stepper_Down_Disabled" file_name="widgets/Stepper_Down_Disabled.png" preload="false" />
+  <texture name="Stepper_Down_Off" file_name="widgets/Stepper_Down_Off.png" preload="false" />
+  <texture name="Stepper_Down_Press" file_name="widgets/Stepper_Down_Press.png" preload="false" />
+  <texture name="Stepper_Up_Disabled" file_name="widgets/Stepper_Up_Disabled.png" preload="false" />
+  <texture name="Stepper_Up_Off" file_name="widgets/Stepper_Up_Off.png" preload="false" />
+  <texture name="Stepper_Up_Press" file_name="widgets/Stepper_Up_Press.png" preload="false" />
 
   <texture name="Stop_Off" file_name="icons/Stop_Off.png" preload="false" />
   <texture name="Stop_Over" file_name="icons/Stop_Over.png" preload="false" />
diff --git a/indra/newview/skins/default/xui/en/floater_aaa.xml b/indra/newview/skins/default/xui/en/floater_aaa.xml
index 6956b73371440f6570f75a48f9b6f41593b0aca8..cb4cbd229a82b0afe09590de4aa0124c9bd8f41c 100644
--- a/indra/newview/skins/default/xui/en/floater_aaa.xml
+++ b/indra/newview/skins/default/xui/en/floater_aaa.xml
@@ -15,21 +15,21 @@
  title="TEST FLOATER"
  save_dock_state="true"
  save_visibility="true"
- single_instance="true"
+ single_instance="true" 
  width="320">
   <string name="nudge_parabuild">Nudge 1</string>
   <string name="test_the_vlt">This string is extracted.</string>
   <chat_history
    allow_html="true"
    bg_readonly_color="ChatHistoryBgColor"
-   bg_writeable_color="ChatHistoryBgColor"
-   border_visible="false" 
+   bg_writeable_color="ChatHistoryBgColor" 
+   border_visible="false"
    follows="all"
    font="SansSerif" 
-	    left="1"
+	 left="1"
    top="20"
    layout="topleft"
-	    height="260"
+	 height="260"
    name="chat_history"
    parse_highlights="true"
    text_color="ChatHistoryTextColor"
diff --git a/indra/newview/skins/default/xui/en/floater_about_land.xml b/indra/newview/skins/default/xui/en/floater_about_land.xml
index a581190d1847da0d031a8bda9d13c9d2cbafd86a..cc955369e29e904808f19acf66a4936c171c7ecb 100644
--- a/indra/newview/skins/default/xui/en/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/en/floater_about_land.xml
@@ -4,6 +4,7 @@
  height="420"
  layout="topleft"
  name="floaterland"
+ help_topic="floaterland"
  save_rect="true"
  title="ABOUT LAND"
  width="490">
diff --git a/indra/newview/skins/default/xui/en/floater_nearby_chat.xml b/indra/newview/skins/default/xui/en/floater_nearby_chat.xml
index fb8893678d4eb857bdd3ce033a67724b0d16541b..58ba346e50ad89bca41250cac9d52ac97f2f8d50 100644
--- a/indra/newview/skins/default/xui/en/floater_nearby_chat.xml
+++ b/indra/newview/skins/default/xui/en/floater_nearby_chat.xml
@@ -18,6 +18,7 @@
  height="300"
  layout="topleft"
  name="nearby_chat"
+ help_topic="nearby_chat"
  save_rect="true"
  title="NEARBY CHAT"
  save_dock_state="true"
diff --git a/indra/newview/skins/default/xui/en/floater_preferences.xml b/indra/newview/skins/default/xui/en/floater_preferences.xml
index 2f26e5d0c146ad4bdb3879a18bb47c58d75fa14c..15655a920e3c3b77a5c3e6e0637cb74690711dce 100644
--- a/indra/newview/skins/default/xui/en/floater_preferences.xml
+++ b/indra/newview/skins/default/xui/en/floater_preferences.xml
@@ -7,6 +7,7 @@
  height="460"
  layout="topleft"
  name="Preferences"
+ help_topic="preferences"
  single_instance="true"
  title="PREFERENCES"
  width="620">
diff --git a/indra/newview/skins/default/xui/en/floater_search.xml b/indra/newview/skins/default/xui/en/floater_search.xml
index 9c1a5499db4dd44b5d8509ff0ecda784d6ba2e11..5a9e2ebe6e4cbd0aae3a7bb3fce5e076a1ccba97 100644
--- a/indra/newview/skins/default/xui/en/floater_search.xml
+++ b/indra/newview/skins/default/xui/en/floater_search.xml
@@ -4,8 +4,8 @@
  can_resize="true"
  height="646"
  layout="topleft"
- min_height="140"
- min_width="467"
+ min_height="646"
+ min_width="670"
  name="floater_search"
  help_topic="floater_search"
  save_rect="true"
diff --git a/indra/newview/skins/default/xui/en/floater_water.xml b/indra/newview/skins/default/xui/en/floater_water.xml
index 7f31692ad91c1adf6140dffb5daa800e4945f58d..32739ac953f45a996c62773241a5cf74beeecbfe 100644
--- a/indra/newview/skins/default/xui/en/floater_water.xml
+++ b/indra/newview/skins/default/xui/en/floater_water.xml
@@ -4,6 +4,7 @@
  height="240"
  layout="topleft"
  name="Water Floater"
+ help_topic="water_floater"
  save_rect="true"
  title="ADVANCED WATER EDITOR"
  width="700">
diff --git a/indra/newview/skins/default/xui/en/floater_world_map.xml b/indra/newview/skins/default/xui/en/floater_world_map.xml
index e632b67d119f3b7e2acc5b0a24a78797f65d1e23..169a0ea676801cca7e9aafb76396383b0858a8c0 100644
--- a/indra/newview/skins/default/xui/en/floater_world_map.xml
+++ b/indra/newview/skins/default/xui/en/floater_world_map.xml
@@ -296,7 +296,7 @@
      layout="topleft"
      name="pg_label"
      width="60">
-        PG
+        General
     </text>
 
     <check_box
@@ -330,7 +330,7 @@
      layout="topleft"
      name="mature_label"
      width="66">
-        Mature
+        Moderate
     </text>
 
     <check_box
@@ -361,7 +361,7 @@
      top_delta="2"
      left_pad="3"
      layout="topleft"
-     name="pg_label"
+     name="adult_label"
      width="66">
         Adult
     </text>
diff --git a/indra/newview/skins/default/xui/en/menu_profile_overflow.xml b/indra/newview/skins/default/xui/en/menu_profile_overflow.xml
index d0128d1c9a09a4c2f986f568f97b2c048d08b3b8..1dc1c610cfe09c086e9130c739a78995859e10db 100644
--- a/indra/newview/skins/default/xui/en/menu_profile_overflow.xml
+++ b/indra/newview/skins/default/xui/en/menu_profile_overflow.xml
@@ -19,4 +19,40 @@
         <menu_item_call.on_click
          function="Profile.Share" />
     </menu_item_call>
+  <menu_item_call
+   label="Kick"
+   layout="topleft"
+   name="kick">
+    <menu_item_call.on_click
+     function="Profile.Kick" />
+    <menu_item_call.on_visible
+     function="Profile.EnableGod" />
+  </menu_item_call>
+  <menu_item_call
+   label="Freeze"
+   layout="topleft"
+   name="freeze">
+    <menu_item_call.on_click
+     function="Profile.Freeze" />
+    <menu_item_call.on_visible
+     function="Profile.EnableGod" />
+  </menu_item_call>
+  <menu_item_call
+   label="Unfreeze"
+   layout="topleft"
+   name="unfreeze">
+    <menu_item_call.on_click
+     function="Profile.Unfreeze" />
+    <menu_item_call.on_visible
+     function="Profile.EnableGod" />
+  </menu_item_call>
+  <menu_item_call
+   label="CSR"
+   layout="topleft"
+   name="csr">
+    <menu_item_call.on_click
+     function="Profile.CSR" />
+    <menu_item_call.on_visible
+     function="Profile.EnableGod" />
+  </menu_item_call>
 </toggleable_menu>
diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml
index b4ce32ea1d08f7c39c20c69e18938cc673924a24..8f1799688bad87bb0ef75bc179b7b0a92a524ab9 100644
--- a/indra/newview/skins/default/xui/en/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/en/menu_viewer.xml
@@ -2975,14 +2975,6 @@
             <menu_item_call.on_click
              function="Advanced.SendTestIMs" />
           </menu_item_call>
-          <menu_item_call
-           label="Test Inspectors"
-           name="Test Inspectors"
-           shortcut="control|shift|I">
-            <menu_item_call.on_click
-             function="Floater.Show"
-             parameter="test_inspectors" />
-          </menu_item_call>
         </menu>
         <menu
          create_jump_keys="true"
diff --git a/indra/newview/skins/default/xui/en/panel_outfits_inventory.xml b/indra/newview/skins/default/xui/en/panel_outfits_inventory.xml
index 5c99022f357b7f3c333e2fe25ca52a31891d9327..d6d8e9562b0a1a31e67a8ec7d59a55d9da2c7b02 100644
--- a/indra/newview/skins/default/xui/en/panel_outfits_inventory.xml
+++ b/indra/newview/skins/default/xui/en/panel_outfits_inventory.xml
@@ -3,7 +3,7 @@
  <panel name="Outfits"
  background_visible="true"
   follows="all"
- height="550"
+ height="570"
  label="Things"
  layout="topleft"
  min_height="350"
diff --git a/indra/newview/skins/default/xui/en/sidepanel_appearance.xml b/indra/newview/skins/default/xui/en/sidepanel_appearance.xml
index 7f4b4aef8209334d1b7c9d13af92c91d171c9bf8..44248eedd52d8b0a55f709370aaf0d80af0211a7 100644
--- a/indra/newview/skins/default/xui/en/sidepanel_appearance.xml
+++ b/indra/newview/skins/default/xui/en/sidepanel_appearance.xml
@@ -2,23 +2,24 @@
 <panel
 background_visible="true"
 follows="all"
-height="635"
+height="570"
 label="Outfits"
 layout="topleft"
-min_height="460"
+min_height="350"
+min_width="240"
 name="appearance panel"
 top="0"
 left="0"
-   width="333">
+width="333">
    <string
    name="No Outfit"
    value="No Outfit" />
    <panel
    left="0"
    top="0"
-   follows="left|top|right"
+   follows="all"
    layout="topleft"
-   width="333"
+   width="330"
    height="33"
    name="panel_currentlook"
    >
@@ -85,9 +86,9 @@ left="0"
    class="panel_outfits_inventory"
    filename="panel_outfits_inventory.xml"
    name="panel_outfits_inventory"
-   height="550"
-   min_height="510"
-   width="333"
+   height="515"
+   min_height="410"
+   width="320"
    top_pad="0"
    follows="all"
    />
diff --git a/indra/newview/skins/default/xui/en/sidepanel_item_info.xml b/indra/newview/skins/default/xui/en/sidepanel_item_info.xml
index 7b0b4b0bde13c1fa8801f98e09f3a2d0c7417eaf..790f8afd3a62c2f1a3e2ac0c7923619304d7a899 100644
--- a/indra/newview/skins/default/xui/en/sidepanel_item_info.xml
+++ b/indra/newview/skins/default/xui/en/sidepanel_item_info.xml
@@ -33,10 +33,10 @@
      	 height="18"
      	 image_name="Lock"
 	     layout="topleft"
-		 right="-50"
+		 right="-15"
 	     mouse_opaque="true"
 	     name="IconLocked"
-	     top="4"
+	     top="8"
 	     width="18" />
     <button
      follows="top|right"
@@ -60,14 +60,23 @@
      use_ellipses="true"
      value="Object Profile"
      width="275" />
+    	    <text
+     follows="top|left"
+     height="13"
+     layout="topleft"
+     left="45"
+     name="where"
+     text_color="LtGray_50"
+     value="(Inventory)"
+     width="150" />
 	<panel
          follows="all"
-         height="500"
+         height="490"
          label=""
          layout="topleft"
          left="10"
          help_topic=""
-         top="30"
+         top="45"
          width="313"
    background_visible="true"
    bg_alpha_color="DkGray2">
@@ -125,7 +134,7 @@
 		     layout="topleft"
     		 left="5"
 		     name="LabelCreatorTitle"
-top_pad="10"
+		  top_pad="10"
 		     width="78">
 	        Creator:
     	</text>
@@ -135,7 +144,7 @@ top_pad="10"
      default_icon_name="Generic_Person"
      layout="topleft"
      left_pad="0"
-		     top_delta="-6"
+     top_delta="-6"
      mouse_opaque="true"
      width="20" />
 	    <text
@@ -165,28 +174,28 @@ top_pad="10"
 			 follows="left|top"
 			 height="23"
 			 layout="topleft"
-    		 left="5"
+			   left="5"
 			 name="LabelOwnerTitle"
-top_pad="5"
+			   top_pad="10"
 			 width="78">
 			    Owner:
 	     </text>
 	     <avatar_icon
-     follows="top|left"
-     height="20"
-     default_icon_name="Generic_Person"
-     layout="topleft"
-     left_pad="0"
-		     top_delta="-6"
-     mouse_opaque="true"
-     width="20" />
+			   follows="top|left"
+			   height="20"
+			   default_icon_name="Generic_Person"
+			   layout="topleft"
+			   left_pad="0"
+			   top_delta="-6"
+			   mouse_opaque="true"
+			   width="20" />
 	     <text
 			 type="string"
-     follows="left|right"
-     font="SansSerifSmall"
-     height="15"
-     layout="topleft"
-     left_pad="5"
+			   follows="left|right"
+			   font="SansSerifSmall"
+			   height="15"
+			   layout="topleft"
+			   left_pad="5"
 			 name="LabelOwnerName"
 			 top_delta="6"
 			 width="140">
@@ -224,7 +233,7 @@ top_pad="10"
 			 top_delta="0"
 			 width="222">
 			Wed May 24 12:50:46 2006
-	    </text>
+      </text>
 	 <panel
          border="false"
          follows="left|top"
@@ -350,7 +359,7 @@ top_pad="10"
 			 tool_tip="Next owner can give away or resell this object"
 			 width="106" />
 	    </panel>
-	    <check_box
+	<check_box
 			 height="18"
 			 label="For Sale"
 			 layout="topleft"
@@ -388,144 +397,21 @@ top_pad="10"
 			    height="23"
 			    max_val="999999999"
 			    top_pad="10"/>
-	    <!--line_editor
-			 border_style="line"
-			 border_thickness="1"
-			 follows="left|top|right"
-			 height="16"
-			 layout="topleft"
-			 left_pad="5"
-			 max_length="25"
-			 name="EditPrice"
-			 top_delta="0"
-			 width="242" /-->
-	    <!--text
-			 type="string"
-			 length="1"
-			 follows="left|top"
-			 height="10"
-			 layout="topleft"
-			 left="10"
-			 name="BaseMaskDebug"
-			 top="155"
-			 width="330">
-			B:
-	    </text>
-	    <text
-			 type="string"
-			 length="1"
-			 follows="left|top"
-			 height="10"
-			 layout="topleft"
-			 left_delta="60"
-			 name="OwnerMaskDebug"
-			 top_delta="0"
-			 width="270">
-			O:
-	    </text>
-	    <text
-			 type="string"
-			 length="1"
-			 follows="left|top"
-			 height="10"
-			 layout="topleft"
-			 left_delta="60"
-			 name="GroupMaskDebug"
-			 top_delta="0"
-			 width="210">
-			G:
-	    </text>
-	    <text
-			 type="string"
-			 length="1"
-			 follows="left|top"
-			 height="10"
-			 layout="topleft"
-			 left_delta="60"
-			 name="EveryoneMaskDebug"
-			 top_delta="0"
-			 width="150">
-			E:
-	    </text>
-	    <text
-			 type="string"
-			 length="1"
-			 follows="left|top"
-			 height="10"
-			 layout="topleft"
-			 left_delta="60"
-			 name="NextMaskDebug"
-			 top_delta="0"
-			 width="90">
-			N:
-	    </text-->
-			    <!--text
-			 type="string"
-			 length="1"
-			 follows="left|top"
-			 height="10"
-			 layout="topleft"
-			 left="10"
-			 name="SaleLabel"
-			 top_pad="5"
-			 width="330">
-			Mark Item:
-	    </text-->
-	    <!--radio_group
-			 draw_border="false"
-			 follows="left|top|right"
-			 height="16"
-			 layout="topleft"
-			 left_delta="78"
-			 name="RadioSaleType"
-			 top_delta="0"
-			 width="252">
-			    <radio_item
-			     height="16"
-			     label="Original"
-			     layout="topleft"
-			     left="0"
-			     name="radio"
-			     top="0"
-			     width="70" />
-			    <radio_item
-			     height="16"
-			     label="Copy"
-			     layout="topleft"
-			     left_delta="60"
-			     name="radio2"
-			     top_delta="0"
-			     width="70" />
-	    </radio_group-->
-	    <!--text
-			 type="string"
-			 length="1"
-			 follows="left|top"
-			 height="16"
-			 layout="topleft"
-			 left="10"
-			 name="TextPrice"
-			 top_pad="5"
-			 width="78">
-			Price: L$
-	    </text-->
-	</panel>
+   </panel>
     <panel
-		 height="25"
+		 height="30"
 		 layout="bottomright"
 		 help_topic="button_tab"
 		 name="button_panel"
 		 left="5"
-		 bottom="5"
+		 bottom="2"
 		 width="313">
 	    <button
-		     follows="bottom|right"
-		     height="25"
+		     height="23"
 		     label="Cancel"
 		     layout="topleft"
 		     name="cancel_btn"
 		     right="-1"
-		     left_pad="10"
 		     width="100" />
-	</panel>
-</panel>
+	    </panel>
+	</panel>
\ No newline at end of file
diff --git a/indra/newview/skins/default/xui/en/sidepanel_task_info.xml b/indra/newview/skins/default/xui/en/sidepanel_task_info.xml
index 5b379b54e3030c3f8d4d6701392ac999bc57f9ca..d26e855e2f636b3518ebe16d748f9746972d149e 100644
--- a/indra/newview/skins/default/xui/en/sidepanel_task_info.xml
+++ b/indra/newview/skins/default/xui/en/sidepanel_task_info.xml
@@ -6,7 +6,7 @@
 	 name="object properties"
 	 help_topic="object_properties"
 	 save_rect="true"
-	 title="Object Properties"
+	 title="Object Profile"
 	 width="333">
 	 <panel.string
 	  name="text deed continued">
@@ -57,127 +57,173 @@
                 Mixed Sale
             </panel.string>
     <button
-	     follows="top|right"
-	     height="25"
-	     image_overlay="BackArrow_Off"
-	     layout="topleft"
-	     name="back_btn"
-	     picture_style="true"
-	     right="-5"
-	     tab_stop="false"
-	     top="0"
-	     width="25" />
+     follows="top|right"
+     height="23"
+     image_overlay="BackArrow_Off"
+     layout="topleft"
+     left="10"
+     name="back_btn"
+     tab_stop="false"
+     top="0"
+     width="23" />
+        <text
+     follows="top|left|right"
+     font="SansSerifHuge"
+     height="26"
+     layout="topleft"
+     left_pad="10"
+     name="title"
+     text_color="LtGray"
+     top="0"
+     use_ellipses="true"
+     value="Object Profile"
+     width="275" />
+	    <text
+     follows="top|left"
+     height="13"
+     layout="topleft"
+     left="45"
+     name="where"
+     text_color="LtGray_50"
+     value="(In World)"
+     width="150" />
 	<panel
          follows="all"
-         height="500"
+         height="490"
          label=""
          layout="topleft"
-         left="5"
+         left="10"
          help_topic=""
-         top="30"
-		 border="1"
-         width="313">
-            <text
-             type="string"
-             length="1"
-             follows="left|top"
-             height="10"
-             layout="topleft"
-             left="10"
+         top="45"
+         width="313"
+   background_visible="true"
+   bg_alpha_color="DkGray2">
+	    	    <text
+		     type="string"
+		     length="1"
+		     follows="left|top"
+		     height="10"
+		     layout="topleft"
+		     left="5"
              name="Name:"
-             top_pad="5"
-             width="90">
-                Name:
-            </text>
-            <line_editor
-             follows="left|top|right"
-             height="19"
-             layout="topleft"
-             left_pad="0"
-             max_length="63"
+		     top="10"
+		     width="78">
+	        Name:
+	    </text>
+	    <line_editor
+		     border_style="line"
+		     border_thickness="1"
+	    	 follows="left|top|right"
+		     height="20"
+		     layout="topleft"
+	    	 left_delta="78"
+		     max_length="63"
              name="Object Name"
-             select_on_focus="true"
-             top_delta="0"
-             width="170" />
-            <text
-             type="string"
-             length="1"
-             follows="left|top"
-             height="10"
-             layout="topleft"
-             left="10"
+	    	 top_delta="0"
+		     width="225" />
+	    <text
+	    type="string"
+	    length="1"
+	    follows="left|top"
+	    height="10"
+	    layout="topleft"
+	    left="5"
              name="Description:"
-             top_pad="3"
-             width="90">
-                Description:
-            </text>
+	    top_pad="10"
+	    width="78">
+	        Description:
+	    </text>
             <line_editor
+	     border_style="line"
+    	     border_thickness="1"
              follows="left|top|right"
-             height="19"
+             height="23"
              layout="topleft"
-             left_pad="0"
-             max_length="127"
              name="Object Description"
              select_on_focus="true"
-             top_delta="0"
-             width="170" />
-            <text
-             type="string"
-             left="10"
-             length="1"
-             follows="left|top"
-             height="19"
-             layout="topleft"
-             name="Creator:"
-             width="90">
-                Creator:
-            </text>
-            <text
-             type="string"
-             length="1"
-             follows="left|top"
-             left_pad="0"
-             height="19"
-             layout="topleft"
+    		 left_delta="78"
+		     max_length="127"
+	    	 top_delta="-5"
+	    	 width="225"/>
+	    <text
+		     type="string"
+		     length="1"
+		     follows="left|top"
+		     height="23"
+		     layout="topleft"
+    		 left="5"
+		 name="CreatorNameLabel"
+		  top_pad="10"
+		     width="78">
+	        Creator:
+    	</text>
+	    	<avatar_icon
+     follows="top|left"
+     height="20"
+     default_icon_name="Generic_Person"
+     layout="topleft"
+     left_pad="0"
+      top_delta="-6"
+     mouse_opaque="true"
+     width="20" />
+	    <text
+		     type="string"
+     follows="left|right"
+     font="SansSerifSmall"
+     height="15"
+     layout="topleft"
+     left_pad="5"
              name="Creator Name"
-             width="175">
-                Esbee Linden
-            </text>
-            <text
-             type="string"
-             length="1"
-             left="10"
-             follows="left|top"
-             height="19"
-             layout="topleft"
-             name="Owner:"
-             width="90">
-                Owner:
-            </text>
-            <text
-             type="string"
-             length="1"
-             follows="left|top"
-             height="19"
-             layout="topleft"
-             name="Owner Name"
-             left_pad="0"
-             width="175">
-                Erica Linden
-            </text>
-           <text
-             type="string"
-             length="1"
-             follows="left|top"
-             layout="topleft"
-             left="10"
-             height="18"
-             name="Group:"
-             top_pad="4"
-             width="75">
-                Group:
-            </text>
-            <button
+		     top_delta="6"
+		     width="140">
+	        Erica Linden
+	     </text>
+	    <text
+			 type="string"
+			 length="1"
+			 follows="left|top"
+			 height="23"
+			layout="topleft"
+			left="5"
+			name="Owner:"
+			top_pad="10"
+			 width="78">
+			    Owner:
+	     </text>
+	     <avatar_icon
+     follows="top|left"
+     height="20"
+     default_icon_name="Generic_Person"
+     layout="topleft"
+     left_pad="0"
+	    top_delta="-6"
+	    mouse_opaque="true"
+     width="20" />
+	     <text
+			    type="string"
+			    follows="left|right"
+			    font="SansSerifSmall"
+			    height="15"
+			    layout="topleft"
+			    left_pad="5"
+			    name="Owner Name"
+			    top_delta="6"
+			    width="140">
+			    Erica Linden
+	     </text>
+	    	    <text
+			 type="string"
+			 length="1"
+			 follows="left|top"
+			 height="23"
+			 layout="topleft"
+			 left="5"
+			name="Group_label"
+			top_pad="10"
+			width="78">
+			    Group:
+	     </text>
+      		<button
 			 follows="top|left"
 			 height="10"
 			 image_disabled="Activate_Checkmark"
@@ -203,43 +249,34 @@
              width="150" />
             <button
              follows="top|left"
-             height="20"
+             height="23"
              label="Deed"
              label_selected="Deed"
              layout="topleft"
              name="button deed"
              top_pad="0"
-             left="100"
+             left="81"
              tool_tip="Deeding gives this item away with next owner permissions. Group shared objects can be deeded by a group officer."
-             width="80" />
-            <check_box
-             height="19"
-             follows="left|top"
-             label="Share"
-             layout="topleft"
-             name="checkbox share with group"
-             tool_tip="Allow all members of the set group to share your modify permissions for this object. You must Deed to enable role restrictions."
-             left_pad="3"
              width="100" />
             <text
              type="string"
              length="1"
              follows="left|top"
-             height="16"
+             height="9"
              layout="topleft"
-             top_pad="15"
-             left="10"
+             top_pad="5"
+             left="5"
              name="label click action"
-             width="90">
+             width="280">
                 Click to:
             </text>
             <combo_box
              follows="left|top"
-             height="20"
+             height="23"
              layout="topleft"
              name="clickaction"
              width="168"
-             left_pad="0">
+             left="81">
                 <combo_box.item
                  label="Touch  (default)"
                  name="Touch/grab(default)"
@@ -261,26 +298,131 @@
                  name="Open"
                  value="Open" />
             </combo_box>
-            <check_box
-             height="16"
+	 <panel
+         border="false"
+         follows="left|top"
+         layout="topleft"
+         mouse_opaque="false"
+         background_visible="true"
+         bg_alpha_color="DkGray"
+         name="perms_inv"
+         left="0"
+         top_pad="15"
+         height="135"
+         width="313">
+	  <text
+             type="string"
+             length="1"
+             left="10"
              top_pad="15"
-             label="For Sale:"
+             text_color="EmphasisColor"
+	     height="15"
+             follows="left|top|right"
+             layout="topleft"
+             name="perm_modify"
+             width="200">
+                You can modify this object
+            </text>
+	  	    <text
+			 type="string"
+			 length="1"
+			 follows="left|top"
+			 height="16"
+			 layout="topleft"
+			 left="10"
+               name="Anyone can:"
+			 top_pad="8"
+			 width="100">
+			Anyone:
+	    </text>
+	    <check_box
+			 height="18"
+			 label="Copy"
+			 layout="topleft"
+			 left_pad="0"
+             name="checkbox allow everyone copy"
+			 top_delta="-2"
+			 width="90" />
+	    <check_box
+             height="18"
+             label="Move"
              layout="topleft"
+             name="checkbox allow everyone move"
+			 left_pad="0"
+             width="150" />
+	       	<text
+			 type="string"
+			 length="1"
+			 follows="left|top"
+			 height="16"
+			 layout="topleft"
+			 left="10"
+			 name="GroupLabel"
+			 top_pad="8"
+			 width="100">
+			Group:
+    	</text>
+			    <check_box
+			 height="18"
+			 label="Share"
+			 layout="topleft"
+			 left_pad="90"
+			 top_delta="-2"
+             name="checkbox share with group"
+			 tool_tip="Allow all members of the set group to share your modify permissions for this object. You must Deed to enable role restrictions."
+			 width="150" />
+	    	    <text
+			 type="string"
+			 length="1"
+			 follows="left|top"
+			 height="16"
+			 layout="topleft"
+			 left="10"
+			 name="NextOwnerLabel"
+			 top_pad="8"
+			 width="200"
+			 word_wrap="true">
+			Next owner:
+	    </text>
+	    <check_box
+			 height="18"
+			 label="Modify"
+			 layout="topleft"
+			 left="20"
+			 top_pad="0"
+             name="checkbox next owner can modify"
+			 width="90" />
+	    <check_box
+			 height="18"
+			 label="Copy"
+			 layout="topleft"
+			 left_pad="0"
+             name="checkbox next owner can copy"
+			 width="90" />
+	    <check_box
+			 height="18"
+			 label="Transfer"
+			 layout="topleft"
+			 left_pad="0"
+             name="checkbox next owner can transfer"
+			 tool_tip="Next owner can give away or resell this object"
+			 width="106" />
+	    </panel>
+	    <check_box
+			 height="23"
+			 label="For Sale"
+			 layout="topleft"
+			 left="20"
              name="checkbox for sale"
-             left="10"
-             width="90" />
-<!-- NEW SALE TYPE COMBO BOX -->
-      <combo_box
-            left_pad="0"
-            layout="topleft"
-            follows="left|top"
-            allow_text_entry="false"
-            height="20"
-            intial_value="2"
-            max_chars="20"
-            mouse_opaque="true"
+			 top_pad="10"
+			 width="100" />
+		<combo_box
+			 height="23"
+			 left_pad="0"
+			 layout="topleft"
+			 follows="left|top"
             name="sale type"
-            width="158">
+			 width="170">
         <combo_box.item
            name="Copy"
            label="Copy"
@@ -293,14 +435,13 @@
            name="Original"
            label="Original"
            value="1" />
-      </combo_box>
-<!-- NEW PRICE SPINNER -->
-      <spinner
+	    </combo_box>
+		<spinner
         follows="left|top"
         decimal_digits="0"
         increment="1"
-        top_pad="8"
-        left="100"
+        top_pad="10"
+        left="120"
         control_name="Edit Cost"
         name="Edit Cost"
         label="Price: L$"
@@ -310,106 +451,25 @@
         height="20"
         max_val="999999999" />
       <check_box
-	   height="15"
+	   height="20"
 	   width="110"
-	   top_pad="3"
+	   top_pad="6"
 	   label="Show in search"
        layout="topleft"
-	   left="100"
+	   left="120"
        name="search_check"
        tool_tip="Let people see this object in search results" />
-		<panel
-         border="false"
-         follows="left|top"
-         layout="topleft"
-         mouse_opaque="false"
-         background_visible="true"
-         bg_alpha_color="DkGray"
-         name="perms_build"
-         left="0"
-         top="241"
-         height="120"
-         width="278">
-            <text
-             type="string"
-             length="1"
-             left="10"
-             top_pad="9"
-             text_color="EmphasisColor"
-             height="16"
-             follows="left|top|right"
-             layout="topleft"
-             name="perm_modify"
-             width="250">
-                You can modify this object
-            </text>
-            <text
-               type="string"
-               follows="left|top"
-               name="Anyone can:"
-               width="250"
-               left="10">
-                 Anyone:
-            </text>
-            <check_box
-             height="19"
-             label="Move"
-             layout="topleft"
-             name="checkbox allow everyone move"
-             left="15"
-             width="85" />
-            <check_box
-             height="19"
-             label="Copy"
-             layout="topleft"
-             left_pad="0"
-             name="checkbox allow everyone copy"
-             width="90" />
-            <text
-               type="string"
-               follows="left|top"
-               height="19"
-               name="Next owner can:"
-               width="250"
-               left="10">
-                  Next owner:
-            </text>
-            <check_box
-             follows="left|top|right"
-             label="Modify"
-             layout="topleft"
-             left="15"
-             name="checkbox next owner can modify"
-             width="85" />
-            <check_box
-             follows="left|top|right"
-             height="19"
-             label="Copy"
-             layout="topleft"
-             left_pad="0"
-             name="checkbox next owner can copy"
-             width="90" />
-            <check_box
-             follows="left|top|right"
-             height="19"
-             label="Transfer"
-             layout="topleft"
-             name="checkbox next owner can transfer"
-             left_pad="0"
-             top_delta="0"
-             tool_tip="Next owner can give away or resell this object"
-             width="90" />
             <text
              type="string"
              text_color="EmphasisColor"
              length="1"
-             top_pad="5"
+             top_pad="15"
              follows="left|top"
              layout="topleft"
              left="10"
              name="B:"
              height="10"
-             width="45">
+             width="50">
                 B:
             </text>
             <text
@@ -421,7 +481,7 @@
              left_pad="0"
              name="O:"
              height="10"
-             width="44">
+             width="50">
                 O:
             </text>
             <text
@@ -433,7 +493,7 @@
              left_pad="0"
              name="G:"
              height="10"
-             width="43">
+             width="50">
                 G:
             </text>
             <text
@@ -445,7 +505,7 @@
              layout="topleft"
              name="E:"
              height="10"
-             width="43">
+             width="50">
                 E:
             </text>
             <text
@@ -457,7 +517,7 @@
              left_pad="0"
              name="N:"
              height="10"
-             width="48">
+             width="50">
                 N:
             </text>
             <text
@@ -473,7 +533,6 @@
                 F:
             </text>
 		</panel>
- </panel>
     <panel
 		 height="25"
 		 layout="bottomright"
@@ -484,30 +543,30 @@
 		 width="313">
         <button
 		     follows="bottom|left"
-		     height="25"
+		     height="23"
 		     label="Open"
 		     layout="topleft"
 		     left="5"
 		     name="open_btn"
 		     top="0"
-		     width="60" />
+		     width="100" />
 	    <button
 		     follows="bottom|left"
-		     height="25"
+		     height="23"
 		     label="Pay"
 		     layout="topleft"
 		     left_pad="5"
 		     name="pay_btn"
 		     top="0"
-		     width="50" />
+		     width="100" />
 	    <button
 		     follows="bottom|left"
-		     height="25"
+		     height="23"
 		     label="Buy"
 		     layout="topleft"
 		     left_pad="5"
 		     name="buy_btn"
 		     top="0"
-		     width="60" />
+		     width="100" />
 	</panel>
 </panel>
\ No newline at end of file
diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml
index 9aae04ba38105831f2c21712987690f042c54f95..acdf3d1bf7a90045bb63896b3c51c0ef673b2a8b 100644
--- a/indra/newview/skins/default/xui/en/strings.xml
+++ b/indra/newview/skins/default/xui/en/strings.xml
@@ -2996,4 +2996,10 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
   <string name="close_on_no_ability">
     You no longer have the ability to be in the chat session.
   </string>
+  <string name="unread_chat_single">
+    [SOURCES] has said something new
+  </string>"
+  <string name="unread_chat_multiple">
+    [SOURCES] have said something new
+  </string>"
 </strings>
diff --git a/indra/newview/skins/default/xui/en/widgets/chat_history.xml b/indra/newview/skins/default/xui/en/widgets/chat_history.xml
index 2be37d222a55af0927b84e7fad0aeb94105c73c5..8785dff2ae55ed3e5eb726453790ff7b92a45e55 100644
--- a/indra/newview/skins/default/xui/en/widgets/chat_history.xml
+++ b/indra/newview/skins/default/xui/en/widgets/chat_history.xml
@@ -11,9 +11,13 @@
 	top_header_pad="17"
 	bottom_header_pad="10"
 	max_length="2147483647"
-	enabled="false"
 	track_bottom="true"
 	name="chat_history"
 	type="string"
 	word_wrap="true"
-  font="SansSerif"/>
+  font="SansSerif">
+  <more_chat_text
+    mouse_opaque="true" 
+    word_wrap="true"
+    />
+</chat_history>
diff --git a/indra/newview/skins/default/xui/en/widgets/tab_container.xml b/indra/newview/skins/default/xui/en/widgets/tab_container.xml
index 3368fa88ef5fcf7b42928ad605de2855ef02598f..3f5a4b8379d4fbf832bb79701175ac8c96db00d5 100644
--- a/indra/newview/skins/default/xui/en/widgets/tab_container.xml
+++ b/indra/newview/skins/default/xui/en/widgets/tab_container.xml
@@ -20,12 +20,12 @@ label_pad_left - padding to the left of tab button labels
                tab_top_image_selected="TabTop_Middle_Selected"
                tab_bottom_image_unselected="Toolbar_Middle_Off"
                tab_bottom_image_selected="Toolbar_Middle_Selected"
-               tab_left_image_unselected="TabTop_Middle_Off"
-               tab_left_image_selected="TabTop_Middle_Selected"/>
+               tab_left_image_unselected="SegmentedBtn_Left_Disabled"
+               tab_left_image_selected="SegmentedBtn_Left_Off"/>
   <last_tab tab_top_image_unselected="TabTop_Right_Off"
                tab_top_image_selected="TabTop_Right_Selected"
                tab_bottom_image_unselected="Toolbar_Right_Off"
                tab_bottom_image_selected="Toolbar_Right_Selected"
-               tab_left_image_unselected="TabTop_Middle_Off"
-               tab_left_image_selected="TabTop_Middle_Selected"/>
+               tab_left_image_unselected="SegmentedBtn_Left_Disabled"
+               tab_left_image_selected="SegmentedBtn_Left_Off"/>
 </tab_container>
diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py
index d2859db2961f0b7ee5fddb5e3fc06a654fef888d..0db18525d766b2c0a850793c51a6f3468ef21bc0 100755
--- a/indra/newview/viewer_manifest.py
+++ b/indra/newview/viewer_manifest.py
@@ -354,6 +354,14 @@ def construct(self):
                     self.path("qtiffd4.dll")
                     self.end_prefix()
 
+                # For WebKit/Qt plugin runtimes (codec/character encoding plugins)
+                if self.prefix(src="codecs", dst="codecs"):
+                    self.path("qcncodecsd4.dll")
+                    self.path("qjpcodecsd4.dll")
+                    self.path("qkrcodecsd4.dll")
+                    self.path("qtwcodecsd4.dll")
+                    self.end_prefix()
+
                 self.end_prefix()
         else:
             if self.prefix(src=os.path.join(os.pardir, os.pardir, 'libraries', 'i686-win32', 'lib', 'release'),
@@ -377,6 +385,14 @@ def construct(self):
                     self.path("qtiff4.dll")
                     self.end_prefix()
 
+                # For WebKit/Qt plugin runtimes (codec/character encoding plugins)
+                if self.prefix(src="codecs", dst="codecs"):
+                    self.path("qcncodecs4.dll")
+                    self.path("qjpcodecs4.dll")
+                    self.path("qkrcodecs4.dll")
+                    self.path("qtwcodecs4.dll")
+                    self.end_prefix()
+
                 self.end_prefix()
 
         self.disable_manifest_check()
diff --git a/indra/test_apps/llplugintest/CMakeLists.txt b/indra/test_apps/llplugintest/CMakeLists.txt
index 89e2d8582d01d39df5e62e9d30338f66e2b8e256..b4043b0fd9cd892778cb66da7c248f93d1995a9c 100644
--- a/indra/test_apps/llplugintest/CMakeLists.txt
+++ b/indra/test_apps/llplugintest/CMakeLists.txt
@@ -428,7 +428,23 @@ if(WINDOWS)
     ${plugintest_debug_files}
     )
   set(plugin_test_targets ${plugin_test_targets} ${out_targets})
-  
+
+  # Debug config runtime files required for the plugin test mule (Qt codec plugins)
+  set(plugintest_debug_src_dir "${CMAKE_SOURCE_DIR}/../libraries/i686-win32/lib/debug/codecs")
+  set(plugintest_debug_files
+    qcncodecsd4.dll
+    qjpcodecsd4.dll
+    qkrcodecsd4.dll
+    qtwcodecsd4.dll
+    )
+  copy_if_different(
+    ${plugintest_debug_src_dir}
+    "${CMAKE_CURRENT_BINARY_DIR}/Debug/codecs"
+    out_targets
+    ${plugintest_debug_files}
+    )
+  set(plugin_test_targets ${plugin_test_targets} ${out_targets})
+ 
   # Release & ReleaseDebInfo config runtime files required for the plugin test mule
   set(plugintest_release_src_dir "${CMAKE_SOURCE_DIR}/../libraries/i686-win32/lib/release")
   set(plugintest_release_files
@@ -486,6 +502,30 @@ if(WINDOWS)
     ${plugintest_release_files}
     )
   set(plugin_test_targets ${plugin_test_targets} ${out_targets})
+
+  # Release & ReleaseDebInfo config runtime files required for the plugin test mule (Qt codec plugins)
+  set(plugintest_release_src_dir "${CMAKE_SOURCE_DIR}/../libraries/i686-win32/lib/release/codecs")
+  set(plugintest_release_files
+    qcncodecs4.dll  
+    qjpcodecs4.dll  
+    qkrcodecs4.dll  
+    qtwcodecs4.dll  
+    )
+  copy_if_different(
+    ${plugintest_release_src_dir}
+    "${CMAKE_CURRENT_BINARY_DIR}/Release/codecs"
+    out_targets
+    ${plugintest_release_files}
+    )
+  set(plugin_test_targets ${plugin_test_targets} ${out_targets})
+
+  copy_if_different(
+    ${plugintest_release_src_dir}
+    "${CMAKE_CURRENT_BINARY_DIR}/RelWithDebInfo/codecs"
+    out_targets
+    ${plugintest_release_files}
+    )
+  set(plugin_test_targets ${plugin_test_targets} ${out_targets})
  
    add_custom_target(copy_plugintest_libs ALL
      DEPENDS 
diff --git a/indra/viewer_components/login/lllogin.cpp b/indra/viewer_components/login/lllogin.cpp
index 018f6916720ef72746e3c0150474e056d9bdc642..364088ab31e9e45929e0f517e8c26279046b5527 100644
--- a/indra/viewer_components/login/lllogin.cpp
+++ b/indra/viewer_components/login/lllogin.cpp
@@ -235,6 +235,8 @@ void LLLogin::Impl::login_(LLCoros::self& self, std::string uri, LLSD credential
                 break;
             }
 
+			sendProgressEvent("offline", "indeterminate", mAuthResponse["responses"]);
+
             // Here the login service at the current URI is redirecting us
             // to some other URI ("indeterminate" -- why not "redirect"?).
             // The response should contain another uri to try, with its
@@ -276,7 +278,14 @@ void LLLogin::Impl::login_(LLCoros::self& self, std::string uri, LLSD credential
     // Here we got through all the rewrittenURIs without succeeding. Tell
     // caller this didn't work out so well. Of course, the only failure data
     // we can reasonably show are from the last of the rewrittenURIs.
-    sendProgressEvent("offline", "fail.login", mAuthResponse["responses"]);
+
+	// *NOTE: The response from LLXMLRPCListener's Poller::poll method returns an
+	// llsd with no "responses" node. To make the output from an incomplete login symmetrical 
+	// to success, add a data/message and data/reason fields.
+	LLSD error_response;
+	error_response["reason"] = mAuthResponse["status"];
+	error_response["message"] = mAuthResponse["error"];
+	sendProgressEvent("offline", "fail.login", error_response);
 }
 
 void LLLogin::Impl::disconnect()
diff --git a/install.xml b/install.xml
index 0501ef9cfd1b66914b795a98c6eea305631f342d..fdd7458384f0c64d665273735b5ffd3cde40875d 100644
--- a/install.xml
+++ b/install.xml
@@ -948,9 +948,9 @@ anguage Infrstructure (CLI) international standard</string>
           <key>darwin</key>
           <map>
             <key>md5sum</key>
-            <string>1631831b63310d85ad272b4dca3c1fbf</string>
+            <string>5362a53488693f9bd7d9083758af25eb</string>
             <key>url</key>
-            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/llqtwebkit-4.6-darwin-20091217.tar.bz2</uri>
+            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/llqtwebkit-4.6-darwin-20091218.tar.bz2</uri>
           </map>
           <key>linux</key>
           <map>
@@ -962,9 +962,9 @@ anguage Infrstructure (CLI) international standard</string>
           <key>windows</key>
           <map>
             <key>md5sum</key>
-            <string>3846354e2e20a98c0401317eb114ff5e</string>
+            <string>4dd305f2ce38b2e55a2014ad3a2de34d</string>
             <key>url</key>
-            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/llqtwebkit-windows-qt4.6-20091215.tar.bz2</uri>
+            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/llqtwebkit-windows-qt4.6-20091218.tar.bz2</uri>
           </map>
         </map>
       </map>