diff --git a/indra/llcommon/llfasttimer.h b/indra/llcommon/llfasttimer.h
index f5c90291b801d3a87346a7c89f0024f9062bd4f2..645bbb88ff49dde87d0eb93adda5e8fee37e21ff 100644
--- a/indra/llcommon/llfasttimer.h
+++ b/indra/llcommon/llfasttimer.h
@@ -39,40 +39,24 @@
 #define TIME_FAST_TIMERS 0
 
 #if LL_WINDOWS
+#include <intrin.h>
 
+#define LL_INLINE __forceinline
 // shift off lower 8 bits for lower resolution but longer term timing
 // on 1Ghz machine, a 32-bit word will hold ~1000 seconds of timing
 inline U32 get_cpu_clock_count_32()
 {
-	U32 ret_val;
-	__asm 
-	{
-        _emit   0x0f
-        _emit   0x31
-		shr eax,8
-		shl edx,24
-		or eax, edx
-		mov dword ptr [ret_val], eax
-	}
-    return ret_val;
+	U64 time_stamp = __rdtsc();
+	return (U32)(time_stamp >> 8);
 }
 
 // return full timer value, *not* shifted by 8 bits
 inline U64 get_cpu_clock_count_64()
 {
-	U64 ret_val;
-	__asm 
-	{
-        _emit   0x0f
-        _emit   0x31
-		mov eax,eax
-		mov edx,edx
-		mov dword ptr [ret_val+4], edx
-		mov dword ptr [ret_val], eax
-	}
-    return ret_val;
+	return __rdtsc();
 }
-
+#else
+#define LL_INLINE
 #endif // LL_WINDOWS
 
 #if (LL_LINUX || LL_SOLARIS || LL_DARWIN) && (defined(__i386__) || defined(__amd64__))
@@ -113,10 +97,25 @@ class LLMutex;
 #include <queue>
 #include "llsd.h"
 
-
 class LL_COMMON_API LLFastTimer
 {
 public:
+
+	class NamedTimer;
+
+	struct LL_COMMON_API FrameState
+	{
+		FrameState(NamedTimer* timerp);
+
+		U32 				mSelfTimeCounter;
+		U32 				mCalls;
+		FrameState*			mParent;		// info for caller timer
+		FrameState*			mLastCaller;	// used to bootstrap tree construction
+		NamedTimer*			mTimer;
+		U16					mActiveCount;	// number of timers with this ID active on stack
+		bool				mMoveUpTree;	// needs to be moved up the tree of timers at the end of frame
+	};
+
 	// stores a "named" timer instance to be reused via multiple LLFastTimer stack instances
 	class LL_COMMON_API NamedTimer 
 	:	public LLInstanceTracker<NamedTimer>
@@ -149,24 +148,10 @@ class LL_COMMON_API LLFastTimer
 
 		static NamedTimer& getRootNamedTimer();
 
-		struct FrameState
-		{
-			FrameState(NamedTimer* timerp);
-
-			U32 		mSelfTimeCounter;
-			U32 		mCalls;
-			FrameState*	mParent;		// info for caller timer
-			FrameState*	mLastCaller;	// used to bootstrap tree construction
-			NamedTimer*	mTimer;
-			U16			mActiveCount;	// number of timers with this ID active on stack
-			bool		mMoveUpTree;	// needs to be moved up the tree of timers at the end of frame
-		};
-
 		S32 getFrameStateIndex() const { return mFrameStateIndex; }
 
 		FrameState& getFrameState() const;
 
-
 	private: 
 		friend class LLFastTimer;
 		friend class NamedTimerFactory;
@@ -185,7 +170,6 @@ class LL_COMMON_API LLFastTimer
 		static void buildHierarchy();
 		static void resetFrame();
 		static void reset();
-
 	
 		//
 		// members
@@ -207,58 +191,47 @@ class LL_COMMON_API LLFastTimer
 		std::vector<NamedTimer*>	mChildren;
 		bool						mCollapsed;				// don't show children
 		bool						mNeedsSorting;			// sort children whenever child added
-
 	};
 
 	// used to statically declare a new named timer
 	class LL_COMMON_API DeclareTimer
 	:	public LLInstanceTracker<DeclareTimer>
 	{
+		friend class LLFastTimer;
 	public:
 		DeclareTimer(const std::string& name, bool open);
 		DeclareTimer(const std::string& name);
 
 		static void updateCachedPointers();
 
-		// convertable to NamedTimer::FrameState for convenient usage of LLFastTimer(declared_timer)
-		operator NamedTimer::FrameState&() { return *mFrameState; }
 	private:
-		NamedTimer&				mTimer;
-		NamedTimer::FrameState* mFrameState; 
+		NamedTimer&		mTimer;
+		FrameState*		mFrameState; 
 	};
 
-
 public:
-	static LLMutex* sLogLock;
-	static std::queue<LLSD> sLogQueue;
-	static BOOL sLog;
-	static BOOL sMetricLog;
-
-	typedef std::vector<NamedTimer::FrameState> info_list_t;
-	static info_list_t& getFrameStateList();
-
-	enum RootTimerMarker { ROOT };
-	LLFastTimer(RootTimerMarker);
+	LLFastTimer(LLFastTimer::FrameState* state);
 
-	LLFastTimer(NamedTimer::FrameState& timer)
-	:	mFrameState(&timer)
+	LL_INLINE LLFastTimer(LLFastTimer::DeclareTimer& timer)
+	:	mFrameState(timer.mFrameState)
 	{
 #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();
-		mStartSelfTime = cur_time;
-		mStartTotalTime = cur_time;
+		LLFastTimer::FrameState* frame_state = mFrameState;
+		mStartTime = get_cpu_clock_count_32();
 
 		frame_state->mActiveCount++;
 		frame_state->mCalls++;
 		// keep current parent as long as it is active when we are
 		frame_state->mMoveUpTree |= (frame_state->mParent->mActiveCount == 0);
 	
-		mLastTimer = sCurTimer;
-		sCurTimer = this;
+		LLFastTimer::CurTimerData* cur_timer_data = &LLFastTimer::sCurTimerData;
+		mLastTimerData = *cur_timer_data;
+		cur_timer_data->mCurTimer = this;
+		cur_timer_data->mFrameState = frame_state;
+		cur_timer_data->mChildTime = 0;
 #endif
 #if TIME_FAST_TIMERS
 		U64 timer_end = get_cpu_clock_count_64();
@@ -266,26 +239,26 @@ class LL_COMMON_API LLFastTimer
 #endif
 	}
 
-	~LLFastTimer()
+	LL_INLINE ~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();
-		frame_state->mSelfTimeCounter += cur_time - mStartSelfTime;
+		LLFastTimer::FrameState* frame_state = mFrameState;
+		U32 total_time = get_cpu_clock_count_32() - mStartTime;
 
+		frame_state->mSelfTimeCounter += total_time - LLFastTimer::sCurTimerData.mChildTime;
 		frame_state->mActiveCount--;
-		LLFastTimer* last_timer = mLastTimer;
-		sCurTimer = last_timer;
 
 		// store last caller to bootstrap tree creation
-		frame_state->mLastCaller = last_timer->mFrameState;
+		// do this in the destructor in case of recursion to get topmost caller
+		frame_state->mLastCaller = mLastTimerData.mFrameState;
 
 		// we are only tracking self time, so subtract our total time delta from parents
-		U32 total_time = cur_time - mStartTotalTime;
-		last_timer->mStartSelfTime += total_time;
+		mLastTimerData.mChildTime += total_time;
+
+		LLFastTimer::sCurTimerData = mLastTimerData;
 #endif
 #if TIME_FAST_TIMERS
 		U64 timer_end = get_cpu_clock_count_64();
@@ -294,7 +267,20 @@ class LL_COMMON_API LLFastTimer
 #endif	
 	}
 
+public:
+	static LLMutex*			sLogLock;
+	static std::queue<LLSD> sLogQueue;
+	static BOOL				sLog;
+	static BOOL				sMetricLog;
+	static bool 			sPauseHistory;
+	static bool 			sResetHistory;
+	static U64				sTimerCycles;
+	static U32				sTimerCalls;
+
+	typedef std::vector<FrameState> info_list_t;
+	static info_list_t& getFrameStateList();
 
+	
 	// call this once a frame to reset timers
 	static void nextFrame();
 
@@ -312,23 +298,26 @@ class LL_COMMON_API LLFastTimer
 	static void writeLog(std::ostream& os);
 	static const NamedTimer* getTimerByName(const std::string& name);
 
-public:
-	static bool 			sPauseHistory;
-	static bool 			sResetHistory;
-	static U64				sTimerCycles;
-	static U32				sTimerCalls;
-	
+	struct CurTimerData
+	{
+		LLFastTimer*	mCurTimer;
+		FrameState*		mFrameState;
+		U32				mChildTime;
+	};
+	static CurTimerData		sCurTimerData;
+
 private:
-	static LLFastTimer*		sCurTimer;
 	static S32				sCurFrameIndex;
 	static S32				sLastFrameIndex;
 	static U64				sLastFrameTime;
 	static info_list_t*		sTimerInfos;
 
-	U32						mStartSelfTime;	// start time + time of all child timers
-	U32						mStartTotalTime;	// start time + time of all child timers
-	NamedTimer::FrameState*	mFrameState;
-	LLFastTimer*			mLastTimer;
+	U32							mStartTime;
+	LLFastTimer::FrameState*	mFrameState;
+	LLFastTimer::CurTimerData	mLastTimerData;
+
 };
 
+typedef class LLFastTimer LLFastTimer;
+
 #endif // LL_LLFASTTIMER_H
diff --git a/indra/llrender/llgl.cpp b/indra/llrender/llgl.cpp
index 3400a7238572439f961e3b3148c56c7dd8bfe79f..187a9a984e021f9016a3704a2059da90d613fbcc 100644
--- a/indra/llrender/llgl.cpp
+++ b/indra/llrender/llgl.cpp
@@ -1919,6 +1919,16 @@ LLGLDepthTest::LLGLDepthTest(GLboolean depth_enabled, GLboolean write_enabled, G
 : mPrevDepthEnabled(sDepthEnabled), mPrevDepthFunc(sDepthFunc), mPrevWriteEnabled(sWriteEnabled)
 {
 	stop_glerror();
+	
+	checkState();
+
+	if (!depth_enabled)
+	{ // always disable depth writes if depth testing is disabled
+	  // GL spec defines this as a requirement, but some implementations allow depth writes with testing disabled
+	  // The proper way to write to depth buffer with testing disabled is to enable testing and use a depth_func of GL_ALWAYS
+		write_enabled = FALSE;
+	}
+
 	if (depth_enabled != sDepthEnabled)
 	{
 		gGL.flush();
@@ -1942,6 +1952,7 @@ LLGLDepthTest::LLGLDepthTest(GLboolean depth_enabled, GLboolean write_enabled, G
 
 LLGLDepthTest::~LLGLDepthTest()
 {
+	checkState();
 	if (sDepthEnabled != mPrevDepthEnabled )
 	{
 		gGL.flush();
@@ -1963,6 +1974,32 @@ LLGLDepthTest::~LLGLDepthTest()
 	}
 }
 
+void LLGLDepthTest::checkState()
+{
+	if (gDebugGL)
+	{
+		GLint func = 0;
+		GLboolean mask = FALSE;
+
+		glGetIntegerv(GL_DEPTH_FUNC, &func);
+		glGetBooleanv(GL_DEPTH_WRITEMASK, &mask);
+
+		if (glIsEnabled(GL_DEPTH_TEST) != sDepthEnabled ||
+			sWriteEnabled != mask ||
+			sDepthFunc != func)
+		{
+			if (gDebugSession)
+			{
+				gFailLog << "Unexpected depth testing state." << std::endl;
+			}
+			else
+			{
+				LL_GL_ERRS << "Unexpected depth testing state." << LL_ENDL;
+			}
+		}
+	}
+}
+
 LLGLClampToFarClip::LLGLClampToFarClip(glh::matrix4f P)
 {
 	for (U32 i = 0; i < 4; i++)
diff --git a/indra/llrender/llglstates.h b/indra/llrender/llglstates.h
index 4a51cac438e0452a5c25b100a9d7a47cfd0ad228..968a37cab06c59b445e118eb47ad09610cd2fe6a 100644
--- a/indra/llrender/llglstates.h
+++ b/indra/llrender/llglstates.h
@@ -46,6 +46,8 @@ class LLGLDepthTest
 	
 	~LLGLDepthTest();
 	
+	void checkState();
+
 	GLboolean mPrevDepthEnabled;
 	GLenum mPrevDepthFunc;
 	GLboolean mPrevWriteEnabled;
diff --git a/indra/llrender/llrender.cpp b/indra/llrender/llrender.cpp
index fc45df8153908e2fbe0c273d20d06541818b1138..f97d81126ecb6e05d22725e5e328096cd7a1df7d 100644
--- a/indra/llrender/llrender.cpp
+++ b/indra/llrender/llrender.cpp
@@ -162,6 +162,8 @@ void LLTexUnit::enable(eTextureType type)
 			disable(); // Force a disable of a previous texture type if it's enabled.
 		}
 		mCurrTexType = type;
+
+		gGL.flush();
 		glEnable(sGLTextureType[type]);
 	}
 }
diff --git a/indra/llui/CMakeLists.txt b/indra/llui/CMakeLists.txt
index 82ec02d2ebc66df50590332039ae8ef11a294cb2..ce068618e20c5caf1fe891456b9d4d04472362ee 100644
--- a/indra/llui/CMakeLists.txt
+++ b/indra/llui/CMakeLists.txt
@@ -26,6 +26,8 @@ include_directories(
     )
 
 set(llui_SOURCE_FILES
+    llaccordionctrl.cpp
+    llaccordionctrltab.cpp
     llbutton.cpp
     llcheckboxctrl.cpp
     llclipboard.cpp
@@ -111,6 +113,8 @@ set(llui_SOURCE_FILES
 set(llui_HEADER_FILES
     CMakeLists.txt
 
+    llaccordionctrl.h
+    llaccordionctrltab.h
     llbutton.h
     llcallbackmap.h
     llcheckboxctrl.h
diff --git a/indra/llui/llaccordionctrl.cpp b/indra/llui/llaccordionctrl.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..b5e870228ad68f9ab140abf6b99773e725cc3d29
--- /dev/null
+++ b/indra/llui/llaccordionctrl.cpp
@@ -0,0 +1,578 @@
+/** 
+ * @file llaccordionctrl.cpp
+ * @brief Accordion panel  implementation
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ * 
+ * Copyright (c) 2009, Linden Research, Inc.
+ * 
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab.  Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ * 
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ * 
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ * 
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+#include "linden_common.h"
+
+#include "llaccordionctrl.h"
+#include "llaccordionctrltab.h"
+
+#include "lluictrlfactory.h" // builds floaters from XML
+
+#include "llwindow.h"
+#include "llfocusmgr.h"
+#include "lllocalcliprect.h"
+
+#include "boost/bind.hpp"
+
+static const S32 DRAGGER_BAR_MARGIN = 4;
+static const S32 DRAGGER_BAR_HEIGHT = 5;
+static const S32 BORDER_MARGIN = 2;
+static const S32 PARENT_BORDER_MARGIN = 5;
+
+static const S32 panel_delta = DRAGGER_BAR_MARGIN;  // Distanse between two panels 
+
+static const S32 HORIZONTAL_MULTIPLE = 8;
+static const S32 VERTICAL_MULTIPLE = 16;
+static const F32 MIN_AUTO_SCROLL_RATE = 120.f;
+static const F32 MAX_AUTO_SCROLL_RATE = 500.f;
+static const F32 AUTO_SCROLL_RATE_ACCEL = 120.f;
+
+
+// LLAccordionCtrl =================================================================|
+
+static LLDefaultChildRegistry::Register<LLAccordionCtrl>	t2("accordion");
+
+
+LLAccordionCtrl::LLAccordionCtrl(const Params& params):LLPanel(params)
+ , mFitParent(params.fit_parent)
+{
+  mSingleExpansion = params.single_expansion;
+	if(mFitParent && !mSingleExpansion)
+	{
+		llinfos << "fit_parent works best when combined with single_expansion" << llendl;
+	}
+}
+
+LLAccordionCtrl::LLAccordionCtrl() : LLPanel()
+{
+	mSingleExpansion = false;
+	mFitParent = false;
+	LLUICtrlFactory::getInstance()->buildPanel(this, "accordion_parent.xml");	
+}
+
+//---------------------------------------------------------------------------------
+void LLAccordionCtrl::draw()
+{
+	LLRect local_rect(0, getRect().getHeight(), getRect().getWidth(), 0);
+	
+	LLLocalClipRect clip(local_rect);
+	
+	LLPanel::draw();
+}
+
+
+//---------------------------------------------------------------------------------
+BOOL LLAccordionCtrl::postBuild()
+{
+	static LLUICachedControl<S32> scrollbar_size ("UIScrollbarSize", 0);
+
+	LLRect scroll_rect;
+	scroll_rect.setOriginAndSize( 
+		getRect().getWidth() - scrollbar_size,
+		1,
+		scrollbar_size,
+		getRect().getHeight() - 1);
+	
+
+	LLScrollbar::Params sbparams;
+	sbparams.name("scrollable vertical");
+	sbparams.rect(scroll_rect);
+	sbparams.orientation(LLScrollbar::VERTICAL);
+	sbparams.doc_size(mInnerRect.getHeight());
+	sbparams.doc_pos(0);
+	sbparams.page_size(mInnerRect.getHeight());
+	sbparams.step_size(VERTICAL_MULTIPLE);
+	sbparams.follows.flags(FOLLOWS_RIGHT | FOLLOWS_TOP | FOLLOWS_BOTTOM);
+	sbparams.change_callback(boost::bind(&LLAccordionCtrl::onScrollPosChangeCallback, this, _1, _2));
+	
+	mScrollbar = LLUICtrlFactory::create<LLScrollbar> (sbparams);
+	LLView::addChild( mScrollbar );
+	mScrollbar->setVisible( false );
+	mScrollbar->setFollowsRight();
+	mScrollbar->setFollowsTop();
+	mScrollbar->setFollowsBottom();
+
+	//if it was created from xml...
+	std::vector<LLUICtrl*> accordion_tabs;
+	for(child_list_const_iter_t it = getChildList()->begin(); 
+		getChildList()->end() != it; ++it)
+	{
+		LLAccordionCtrlTab* accordion_tab = dynamic_cast<LLAccordionCtrlTab*>(*it);
+		if(accordion_tab == NULL)
+			continue;
+		if(std::find(mAccordionTabs.begin(),mAccordionTabs.end(),accordion_tab) == mAccordionTabs.end())
+		{
+			accordion_tabs.push_back(accordion_tab);
+		}
+	}
+
+	for(std::vector<LLUICtrl*>::reverse_iterator it = accordion_tabs.rbegin();it!=accordion_tabs.rend();++it)
+		addCollapsibleCtrl(*it);
+
+	arrange	();
+
+	if(mSingleExpansion)
+	{
+		if(!mAccordionTabs[0]->getDisplayChildren())
+			mAccordionTabs[0]->setDisplayChildren(true);
+		for(size_t i=1;i<mAccordionTabs.size();++i)
+		{
+			if(mAccordionTabs[i]->getDisplayChildren())
+				mAccordionTabs[i]->setDisplayChildren(false);
+		}
+	}
+
+	return TRUE;
+}
+
+
+//---------------------------------------------------------------------------------
+LLAccordionCtrl::~LLAccordionCtrl()
+{
+  mAccordionTabs.clear();
+}
+
+//---------------------------------------------------------------------------------
+
+void LLAccordionCtrl::reshape(S32 width, S32 height, BOOL called_from_parent)
+{
+	// adjust our rectangle
+	LLRect rcLocal = getRect();
+	rcLocal.mRight = rcLocal.mLeft + width;
+	rcLocal.mTop = rcLocal.mBottom + height;
+
+	setRect(rcLocal);
+
+	arrange();
+}
+
+//---------------------------------------------------------------------------------
+BOOL LLAccordionCtrl::handleRightMouseDown(S32 x, S32 y, MASK mask)
+{
+	return LLPanel::handleRightMouseDown(x, y, mask);
+}
+
+//---------------------------------------------------------------------------------
+void LLAccordionCtrl::shiftAccordionTabs(S16 panel_num, S32 delta)
+{
+	for(size_t i = panel_num; i < mAccordionTabs.size(); i++ )
+	{
+		ctrlShiftVertical(mAccordionTabs[i],delta);
+	}	
+}
+
+
+//---------------------------------------------------------------------------------
+void LLAccordionCtrl::onCollapseCtrlCloseOpen(S16 panel_num) 
+{
+	if(mSingleExpansion)
+	{
+		for(size_t i=0;i<mAccordionTabs.size();++i)
+		{
+			if(i==panel_num)
+				continue;
+			if(mAccordionTabs[i]->getDisplayChildren())
+				mAccordionTabs[i]->setDisplayChildren(false);
+		}
+
+	}
+	arrange();
+}
+
+void LLAccordionCtrl::show_hide_scrollbar(S32 width, S32 height)
+{
+	calcRecuiredHeight();
+	if(getRecuiredHeight() > height )
+		showScrollbar(width,height);
+	else
+		hideScrollbar(width,height);
+}
+
+void	LLAccordionCtrl::showScrollbar(S32 width, S32 height)
+{
+	bool was_visible = mScrollbar->getVisible();
+
+	mScrollbar->setVisible(true);
+	
+	static LLUICachedControl<S32> scrollbar_size ("UIScrollbarSize", 0);
+
+	ctrlSetLeftTopAndSize(mScrollbar
+		,width-scrollbar_size - PARENT_BORDER_MARGIN/2
+		,height-PARENT_BORDER_MARGIN
+		,scrollbar_size
+		,height-2*PARENT_BORDER_MARGIN);
+	
+	mScrollbar->setPageSize(height);
+	mScrollbar->setDocParams(mInnerRect.getHeight(),mScrollbar->getDocPos());
+
+	if(was_visible)
+	{
+		S32 scroll_pos = llmin(mScrollbar->getDocPos(), getRecuiredHeight() - height - 1);
+		mScrollbar->setDocPos(scroll_pos);
+	}
+}
+
+void	LLAccordionCtrl::hideScrollbar( S32 width, S32 height )
+{
+	if(mScrollbar->getVisible() == false)
+		return;
+	mScrollbar->setVisible(false);
+
+	static LLUICachedControl<S32> scrollbar_size ("UIScrollbarSize", 0);
+
+	S32 panel_width = width - 2*BORDER_MARGIN;
+
+	//reshape all accordeons and shift all draggers
+	for(size_t i=0;i<mAccordionTabs.size();++i)
+	{
+		LLRect panel_rect = mAccordionTabs[i]->getRect();
+		ctrlSetLeftTopAndSize(mAccordionTabs[i],panel_rect.mLeft,panel_rect.mTop,panel_width,panel_rect.getHeight());
+	}
+
+	mScrollbar->setDocPos(0);
+
+	if(mAccordionTabs.size()>0)
+	{
+		S32 panel_top = height - BORDER_MARGIN;		  // Top coordinate of the first panel
+		S32 diff = panel_top - mAccordionTabs[0]->getRect().mTop;
+		shiftAccordionTabs(0,diff);
+	}
+}
+
+
+//---------------------------------------------------------------------------------
+S32 LLAccordionCtrl::calcRecuiredHeight()
+{
+	S32 rec_height = 0;
+	
+	std::vector<LLAccordionCtrlTab*>::iterator panel;
+	for(panel=mAccordionTabs.begin(); panel!=mAccordionTabs.end(); ++panel)
+	{
+		LLAccordionCtrlTab* accordion_tab = dynamic_cast<LLAccordionCtrlTab*>(*panel);
+		if(accordion_tab && accordion_tab->getVisible())
+		{
+			rec_height += accordion_tab->getRect().getHeight();
+		}
+	}
+
+	mInnerRect.setLeftTopAndSize(0,rec_height + BORDER_MARGIN*2,getRect().getWidth(),rec_height + BORDER_MARGIN);
+
+	return mInnerRect.getHeight();
+}
+
+//---------------------------------------------------------------------------------
+void LLAccordionCtrl::ctrlSetLeftTopAndSize(LLView* panel, S32 left, S32 top, S32 width, S32 height)
+{
+	if(!panel)
+		return;
+	LLRect panel_rect = panel->getRect();
+	panel_rect.setLeftTopAndSize( left, top, width, height);
+	panel->reshape( width, height, 1);
+	panel->setRect(panel_rect);
+}
+
+void LLAccordionCtrl::ctrlShiftVertical(LLView* panel,S32 delta)
+{
+	if(!panel)
+		return;
+	panel->translate(0,delta);
+}
+
+//---------------------------------------------------------------------------------
+
+void LLAccordionCtrl::addCollapsibleCtrl(LLView* view)
+{
+	LLAccordionCtrlTab* accordion_tab = dynamic_cast<LLAccordionCtrlTab*>(view);
+	if(!accordion_tab)
+		return;
+	if(std::find(getChildList()->begin(),getChildList()->end(),accordion_tab) == getChildList()->end())
+		addChild(accordion_tab);
+	mAccordionTabs.push_back(accordion_tab);
+	
+	accordion_tab->setDropDownStateChangedCallback( boost::bind(&LLAccordionCtrl::onCollapseCtrlCloseOpen, this, mAccordionTabs.size() - 1) );
+
+}
+
+
+void LLAccordionCtrl::arrange()
+{
+	if( mAccordionTabs.size() == 0)
+	{
+		//We do not arrange if we do not have what should be arranged
+		return;
+	}
+
+	//Calculate params	
+	S32 panel_left = BORDER_MARGIN;	  // Margin from left side of Splitter
+	S32 panel_top = getRect().getHeight() - BORDER_MARGIN;		  // Top coordinate of the first panel
+	S32 panel_width = getRect().getWidth() - 4;		  // Top coordinate of the first panel
+
+	
+	if(mAccordionTabs.size() == 1)
+	{
+		LLAccordionCtrlTab* accordion_tab = dynamic_cast<LLAccordionCtrlTab*>(mAccordionTabs[0]);
+		
+		LLRect panel_rect = accordion_tab->getRect();
+		
+		S32 panel_height = getRect().getHeight() - 2*BORDER_MARGIN;
+
+		ctrlSetLeftTopAndSize(accordion_tab,panel_rect.mLeft,panel_top,panel_width,panel_height);
+		
+		show_hide_scrollbar(getRect().getWidth(),getRect().getHeight());
+		return;
+
+	}
+
+	for(size_t i = 0; i < mAccordionTabs.size(); i++ )
+	{
+		LLAccordionCtrlTab* accordion_tab = dynamic_cast<LLAccordionCtrlTab*>(mAccordionTabs[i]);
+		
+		if(accordion_tab->getVisible() == false) //skip hidden accordion tabs
+			continue;
+		
+		if(!accordion_tab->isExpanded() )
+		{
+			ctrlSetLeftTopAndSize(mAccordionTabs[i], panel_left, panel_top, panel_width, accordion_tab->getRect().getHeight());
+			panel_top-=mAccordionTabs[i]->getRect().getHeight();
+		}
+		else
+		{
+			S32 panel_height = accordion_tab->getRect().getHeight();
+			
+			if(mFitParent)
+			{
+				// all expanded tabs will have equal height
+				panel_height = calcExpandedTabHeight(i, panel_top);
+				ctrlSetLeftTopAndSize(accordion_tab, panel_left, panel_top, panel_width, panel_height);
+
+				// try to make accordion tab fit accordion view height.
+				// Accordion View should implement getRequiredRect() and provide valid height
+				S32 optimal_height = accordion_tab->getAccordionView()->getRequiredRect().getHeight();
+				optimal_height += accordion_tab->getHeaderHeight() + 2 * BORDER_MARGIN;
+				if(optimal_height < panel_height)
+				{
+					panel_height = optimal_height;
+				}
+
+				// minimum tab height is equal to header height
+				if(mAccordionTabs[i]->getHeaderHeight() > panel_height)
+				{
+					panel_height = mAccordionTabs[i]->getHeaderHeight();
+				}
+			}
+			
+			ctrlSetLeftTopAndSize(mAccordionTabs[i], panel_left, panel_top, panel_width, panel_height);
+			panel_top-=panel_height;
+			
+		}
+	}	
+
+	show_hide_scrollbar(getRect().getWidth(),getRect().getHeight());
+
+	updateLayout(getRect().getWidth(),getRect().getHeight());
+
+}
+
+//---------------------------------------------------------------------------------
+
+BOOL LLAccordionCtrl::handleScrollWheel		( S32 x, S32 y, S32 clicks )
+{
+	if(LLPanel::handleScrollWheel(x,y,clicks))
+		return TRUE;
+	if( mScrollbar->getVisible() && mScrollbar->handleScrollWheel( 0, 0, clicks ) )
+		return TRUE;
+	return false;
+
+}
+
+BOOL LLAccordionCtrl::handleKeyHere			(KEY key, MASK mask)
+{
+	if( mScrollbar->getVisible() && mScrollbar->handleKeyHere( key,mask ) )
+		return TRUE;
+	return LLPanel::handleKeyHere(key,mask);
+}
+
+void	LLAccordionCtrl::updateLayout	(S32 width, S32 height)
+{
+	S32 panel_top = height - BORDER_MARGIN ;
+	if(mScrollbar->getVisible())
+		panel_top+=mScrollbar->getDocPos();
+
+	S32 panel_width = width - 2*BORDER_MARGIN;
+
+	static LLUICachedControl<S32> scrollbar_size ("UIScrollbarSize", 0);
+	if(mScrollbar->getVisible())
+		panel_width-=scrollbar_size;
+
+	//set sizes for first panels and dragbars
+	for(size_t i=0;i<mAccordionTabs.size();++i)
+	{
+		if(!mAccordionTabs[i]->getVisible())
+			continue;
+		LLRect panel_rect = mAccordionTabs[i]->getRect();
+		ctrlSetLeftTopAndSize(mAccordionTabs[i],panel_rect.mLeft,panel_top,panel_width,panel_rect.getHeight());
+		panel_top-=panel_rect.getHeight();
+	}
+}
+
+void	LLAccordionCtrl::onScrollPosChangeCallback(S32, LLScrollbar*)
+{
+	updateLayout(getRect().getWidth(),getRect().getHeight());
+}
+void	LLAccordionCtrl::onOpen		(const LLSD& key)
+{
+	for(size_t i=0;i<mAccordionTabs.size();++i)
+	{
+		LLAccordionCtrlTab* accordion_tab = dynamic_cast<LLAccordionCtrlTab*>(mAccordionTabs[i]);
+		LLPanel* panel = dynamic_cast<LLPanel*>(accordion_tab->getAccordionView());
+		if(panel!=NULL)
+		{
+			panel->onOpen(key);
+		}
+	}
+}
+S32	LLAccordionCtrl::notifyParent(const LLSD& info)
+{
+	if(info.has("action"))
+	{
+		std::string str_action = info["action"];
+		if(str_action == "size_changes")
+		{
+			//
+			arrange();
+			return 1;
+		}
+		else if(str_action == "select_next")
+		{
+			for(size_t i=0;i<mAccordionTabs.size();++i)
+			{
+				LLAccordionCtrlTab* accordion_tab = dynamic_cast<LLAccordionCtrlTab*>(mAccordionTabs[i]);
+				if(accordion_tab->hasFocus())
+				{
+					while(++i<mAccordionTabs.size())
+					{
+						if(mAccordionTabs[i]->getVisible())
+							break;
+					}
+					if(i<mAccordionTabs.size())
+					{
+						accordion_tab = dynamic_cast<LLAccordionCtrlTab*>(mAccordionTabs[i]);
+						accordion_tab->notify(LLSD().with("action","select_first"));
+						return 1;
+					}
+					break;
+				}
+			}
+			return 0;
+		}
+		else if(str_action == "select_prev")
+		{
+			for(size_t i=0;i<mAccordionTabs.size();++i)
+			{
+				LLAccordionCtrlTab* accordion_tab = dynamic_cast<LLAccordionCtrlTab*>(mAccordionTabs[i]);
+				if(accordion_tab->hasFocus() && i>0)
+				{
+					while(i>0)
+					{
+						if(mAccordionTabs[--i]->getVisible())
+							break;
+					}
+					
+					accordion_tab = dynamic_cast<LLAccordionCtrlTab*>(mAccordionTabs[i]);
+					accordion_tab->notify(LLSD().with("action","select_last"));
+					return 1;
+				}
+			}
+			return 0;
+		}
+	}
+	else if (info.has("scrollToShowRect"))
+	{
+		LLRect screen_rc, local_rc;
+		screen_rc.setValue(info["scrollToShowRect"]);
+		screenRectToLocal(screen_rc, &local_rc);
+
+		// Translate to parent coordinatess to check if we are in visible rectangle
+		local_rc.translate( getRect().mLeft, getRect().mBottom );
+
+		if ( !getRect().contains (local_rc) )
+		{
+			// Back to local coords and calculate position for scroller
+			S32 bottom = mScrollbar->getDocPos() - local_rc.mBottom + getRect().mBottom;
+			S32 top = mScrollbar->getDocPos() - local_rc.mTop + getRect().mTop;
+
+			S32 scroll_pos = llclamp(mScrollbar->getDocPos(),
+									 bottom, // min vertical scroll
+									 top); // max vertical scroll 
+
+			mScrollbar->setDocPos( scroll_pos );
+		}
+		return 1;
+	}
+	return LLPanel::notifyParent(info);
+}
+void	LLAccordionCtrl::reset		()
+{
+	if(mScrollbar)
+		mScrollbar->setDocPos(0);
+}
+
+S32 LLAccordionCtrl::calcExpandedTabHeight(S32 tab_index /* = 0 */, S32 available_height /* = 0 */)
+{
+	if(tab_index < 0)
+	{
+		return available_height;
+	}
+
+	S32 collapsed_tabs_height = 0;
+	S32 num_expanded = 0;
+
+	for(size_t n = tab_index; n < mAccordionTabs.size(); ++n)
+	{
+		if(!mAccordionTabs[n]->isExpanded())
+		{
+			collapsed_tabs_height += mAccordionTabs[n]->getHeaderHeight();
+		}
+		else
+		{
+			++num_expanded;
+		}
+	}
+
+	if(0 == num_expanded)
+	{
+		return available_height;
+	}
+
+	S32 expanded_tab_height = available_height - collapsed_tabs_height - BORDER_MARGIN; // top BORDER_MARGIN is added in arrange(), here we add bottom BORDER_MARGIN
+	expanded_tab_height /= num_expanded;
+	return expanded_tab_height;
+}
diff --git a/indra/llui/llaccordionctrl.h b/indra/llui/llaccordionctrl.h
new file mode 100644
index 0000000000000000000000000000000000000000..4cb0f382813ab9ef14fba7f462ab451751c91606
--- /dev/null
+++ b/indra/llui/llaccordionctrl.h
@@ -0,0 +1,123 @@
+/** 
+ * @file LLAccordionCtrl.h
+ * @brief Accordion Panel implementation
+ *
+ * $LicenseInfo:firstyear=2004&license=viewergpl$
+ * 
+ * Copyright (c) 2004-2009, Linden Research, Inc.
+ * 
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab.  Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ * 
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ * 
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ * 
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_ACCORDIONCTRL_H
+#define LL_ACCORDIONCTRL_H
+
+#include "llpanel.h"
+#include "llscrollbar.h"
+
+#include <vector>
+#include <algorithm>
+#include <string>
+
+class LLAccordionCtrlTab;
+
+class LLAccordionCtrl: public LLPanel
+{
+private:
+
+	std::vector<LLAccordionCtrlTab*> mAccordionTabs;
+
+	void ctrlSetLeftTopAndSize(LLView* panel, S32 left, S32 top, S32 width, S32 height);
+	void ctrlShiftVertical(LLView* panel,S32 delta);
+	
+	void onCollapseCtrlCloseOpen(S16 panel_num); 
+	void shiftAccordionTabs(S16 panel_num, S32 delta);
+
+
+public:
+	struct Params 
+		: public LLInitParam::Block<Params, LLPanel::Params>
+	{
+		Optional<bool>			single_expansion,
+								fit_parent; /* Accordion will fit its parent size, controls that are placed into 
+								accordion tabs are responsible for scrolling their content.
+								*NOTE fit_parent works best when combined with single_expansion.
+								Accordion view should implement getRequiredRect() and provide valid height*/
+
+		Params()
+			: single_expansion("single_expansion",false)
+			, fit_parent("fit_parent", false)
+		{};
+	};
+
+	LLAccordionCtrl(const Params& params);
+
+    LLAccordionCtrl();
+    virtual ~LLAccordionCtrl();
+
+	virtual BOOL postBuild();
+	
+	virtual BOOL handleRightMouseDown	( S32 x, S32 y, MASK mask); 
+	virtual BOOL handleScrollWheel		( S32 x, S32 y, S32 clicks );
+	virtual BOOL handleKeyHere			(KEY key, MASK mask);
+	//
+
+	// Call reshape after changing splitter's size
+	virtual void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE);
+
+	void addCollapsibleCtrl(LLView* view);
+	void arrange();
+
+
+	void	draw();
+	
+	void	onScrollPosChangeCallback(S32, LLScrollbar*);
+
+	void	onOpen		(const LLSD& key);
+	S32		notifyParent(const LLSD& info);
+
+	void	reset		();
+
+private:
+	// Calc Splitter's height that is necessary to display all child content
+	S32		calcRecuiredHeight();
+	S32		getRecuiredHeight() const { return mInnerRect.getHeight(); }
+	S32		calcExpandedTabHeight(S32 tab_index = 0, S32 available_height = 0);
+
+	void	updateLayout			(S32 width, S32 height);
+
+	void	show_hide_scrollbar		(S32 width, S32 height);
+
+	void	showScrollbar			(S32 width, S32 height);
+	void	hideScrollbar			(S32 width, S32 height);
+
+private:
+	LLRect			mInnerRect;
+	LLScrollbar*	mScrollbar;
+	bool			mSingleExpansion;
+	bool			mFitParent;
+};
+
+
+#endif // LL_LLSPLITTER_H
diff --git a/indra/llui/llaccordionctrltab.cpp b/indra/llui/llaccordionctrltab.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..9d6ba57c29a21a1f3ee8a7cbbaecbc28aacc01e6
--- /dev/null
+++ b/indra/llui/llaccordionctrltab.cpp
@@ -0,0 +1,599 @@
+/** 
+ * @file LLAccordionCtrlTab.cpp
+ * @brief Collapsible control implementation
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ * 
+ * Copyright (c) 2009, Linden Research, Inc.
+ * 
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab.  Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ * 
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ * 
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ * 
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "linden_common.h"
+
+#include "lluictrl.h"
+
+#include "llaccordionctrltab.h"
+
+#include "lltextbox.h"
+
+static const std::string DD_BUTTON_NAME = "dd_button";
+static const std::string DD_TEXTBOX_NAME = "dd_textbox";
+static const std::string DD_HEADER_NAME = "dd_header";
+
+static const S32 HEADER_HEIGHT = 20;
+static const S32 HEADER_IMAGE_LEFT_OFFSET = 5;
+static const S32 HEADER_TEXT_LEFT_OFFSET = 30;
+
+static LLDefaultChildRegistry::Register<LLAccordionCtrlTab> t1("accordion_tab");
+
+class LLAccordionCtrlTab::LLAccordionCtrlTabHeader : public LLUICtrl
+{
+public:
+	friend class LLUICtrlFactory;
+
+	struct Params : public LLInitParam::Block<Params, LLAccordionCtrlTab::Params>
+	{
+		Params();
+	};
+
+	LLAccordionCtrlTabHeader(const LLAccordionCtrlTabHeader::Params& p);
+	
+	virtual ~LLAccordionCtrlTabHeader();
+
+	virtual void draw();
+
+	virtual void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE);
+
+	virtual BOOL postBuild();
+
+	void	setTitle(const std::string& title);
+
+	virtual void onMouseEnter(S32 x, S32 y, MASK mask);
+	virtual void onMouseLeave(S32 x, S32 y, MASK mask);
+	virtual BOOL handleKey(KEY key, MASK mask, BOOL called_from_parent);
+private:
+
+	LLTextBox* mHeaderTextbox;
+
+	// Overlay images (arrows)
+	LLPointer<LLUIImage> mImageCollapsed;
+	LLPointer<LLUIImage> mImageExpanded;
+	LLPointer<LLUIImage> mImageCollapsedPressed;
+	LLPointer<LLUIImage> mImageExpandedPressed;
+
+	// Background images
+	LLPointer<LLUIImage> mImageHeader;
+	LLPointer<LLUIImage> mImageHeaderOver;
+	LLPointer<LLUIImage> mImageHeaderPressed;
+	LLPointer<LLUIImage> mImageHeaderFocused;
+
+	LLUIColor mHeaderBGColor;
+
+	bool mNeedsHighlight;
+};
+
+LLAccordionCtrlTab::LLAccordionCtrlTabHeader::Params::Params()
+{
+}
+
+LLAccordionCtrlTab::LLAccordionCtrlTabHeader::LLAccordionCtrlTabHeader(
+	const LLAccordionCtrlTabHeader::Params& p)
+: LLUICtrl(p)
+, mHeaderBGColor(p.header_bg_color())
+,mNeedsHighlight(false),
+	mImageCollapsed(p.header_collapse_img),
+	mImageCollapsedPressed(p.header_collapse_img_pressed),
+	mImageExpanded(p.header_expand_img),
+	mImageExpandedPressed(p.header_expand_img_pressed),
+	mImageHeader(p.header_image),
+	mImageHeaderOver(p.header_image_over),
+	mImageHeaderPressed(p.header_image_pressed),
+	mImageHeaderFocused(p.header_image_focused)
+{
+	LLTextBox::Params textboxParams;
+	textboxParams.name(DD_TEXTBOX_NAME);
+	textboxParams.initial_value(p.title());
+	textboxParams.text_color(p.header_text_color());
+	textboxParams.follows.flags(FOLLOWS_NONE);
+	textboxParams.font( p.font() );
+	textboxParams.font_shadow(LLFontGL::NO_SHADOW);
+	textboxParams.use_ellipses = true;
+	textboxParams.bg_visible = false;
+	textboxParams.mouse_opaque = false;
+	mHeaderTextbox = LLUICtrlFactory::create<LLTextBox>(textboxParams);
+	addChild(mHeaderTextbox);
+}
+
+LLAccordionCtrlTab::LLAccordionCtrlTabHeader::~LLAccordionCtrlTabHeader()
+{
+}
+
+BOOL LLAccordionCtrlTab::LLAccordionCtrlTabHeader::postBuild()
+{
+	return TRUE;
+}
+
+void	LLAccordionCtrlTab::LLAccordionCtrlTabHeader::setTitle(const std::string& title)
+{
+	if(mHeaderTextbox)
+		mHeaderTextbox->setText(title);
+}
+
+void LLAccordionCtrlTab::LLAccordionCtrlTabHeader::draw()
+{
+	S32 width = getRect().getWidth();
+	S32 height = getRect().getHeight();
+
+	gl_rect_2d(0,0,width - 1 ,height - 1,mHeaderBGColor.get(),true);
+
+	LLAccordionCtrlTab* parent = dynamic_cast<LLAccordionCtrlTab*>(getParent());
+	bool collapsible = (parent && parent->getCollapsible());
+	bool expanded = (parent && parent->getDisplayChildren());
+
+	// Handle overlay images, if needed
+	// Only show green "focus" background image if the accordion is open,
+	// because the user's mental model of focus is that it goes away after
+	// the accordion is closed.
+	if (getParent()->hasFocus()
+		&& !(collapsible && !expanded))
+	{
+		mImageHeaderFocused->draw(0,0,width,height);
+	}
+	else
+	{
+		mImageHeader->draw(0,0,width,height);
+	}
+
+	if(mNeedsHighlight)
+	{
+		mImageHeaderOver->draw(0,0,width,height);
+	}
+	
+
+	if(collapsible)
+	{
+		LLPointer<LLUIImage> overlay_image;
+		if(expanded)
+		{
+			overlay_image = mImageExpanded;
+		}
+		else
+		{
+			overlay_image = mImageCollapsed;
+		}
+		overlay_image->draw(HEADER_IMAGE_LEFT_OFFSET,
+							(height - overlay_image->getHeight()) / 2);
+	}
+	
+	LLUICtrl::draw();
+}
+
+void LLAccordionCtrlTab::LLAccordionCtrlTabHeader::reshape(S32 width, S32 height, BOOL called_from_parent /* = TRUE */)
+{
+	S32 header_height = mHeaderTextbox->getTextPixelHeight();
+
+	LLRect textboxRect(HEADER_TEXT_LEFT_OFFSET,(height+header_height)/2 ,width,(height-header_height)/2);
+	mHeaderTextbox->reshape(textboxRect.getWidth(), textboxRect.getHeight());
+	mHeaderTextbox->setRect(textboxRect);
+}
+
+void LLAccordionCtrlTab::LLAccordionCtrlTabHeader::onMouseEnter(S32 x, S32 y, MASK mask)
+{
+	LLUICtrl::onMouseEnter(x, y, mask);
+	mNeedsHighlight = true;
+}
+void LLAccordionCtrlTab::LLAccordionCtrlTabHeader::onMouseLeave(S32 x, S32 y, MASK mask)
+{
+	LLUICtrl::onMouseLeave(x, y, mask);
+	mNeedsHighlight = false;
+}
+BOOL LLAccordionCtrlTab::LLAccordionCtrlTabHeader::handleKey(KEY key, MASK mask, BOOL called_from_parent)
+{
+	if ( ( key == KEY_LEFT || key == KEY_RIGHT) && mask == MASK_NONE)
+	{
+		return getParent()->handleKey(key, mask, called_from_parent);
+	}
+	return LLUICtrl::handleKey(key, mask, called_from_parent);
+}
+
+
+LLAccordionCtrlTab::Params::Params()
+	: title("title")
+	,display_children("expanded", true)
+	,header_height("header_height", HEADER_HEIGHT),
+	min_width("min_width", 0),
+	min_height("min_height", 0)
+	,collapsible("collapsible", true)
+	,header_bg_color("header_bg_color")
+	,dropdown_bg_color("dropdown_bg_color")
+	,header_visible("header_visible",true)
+	,padding_left("padding_left",2)
+	,padding_right("padding_right",2)
+	,padding_top("padding_top",2)
+	,padding_bottom("padding_bottom",2)
+	,header_expand_img("header_expand_img")
+	,header_expand_img_pressed("header_expand_img_pressed")
+	,header_collapse_img("header_collapse_img")
+	,header_collapse_img_pressed("header_collapse_img_pressed")
+	,header_image("header_image")
+	,header_image_over("header_image_over")
+	,header_image_pressed("header_image_pressed")
+	,header_image_focused("header_image_focused")
+	,header_text_color("header_text_color")
+{
+	mouse_opaque(false);
+}
+
+LLAccordionCtrlTab::LLAccordionCtrlTab(const LLAccordionCtrlTab::Params&p)
+	: LLUICtrl(p)
+	,mDisplayChildren(p.display_children)
+	,mCollapsible(p.collapsible)
+	,mExpandedHeight(0)
+	,mDropdownBGColor(p.dropdown_bg_color())
+	,mHeaderVisible(p.header_visible)
+	,mPaddingLeft(p.padding_left)
+	,mPaddingRight(p.padding_right)
+	,mPaddingTop(p.padding_top)
+	,mPaddingBottom(p.padding_bottom)
+	,mCanOpenClose(true)
+{
+	mStoredOpenCloseState = false;
+	mWasStateStored = false;
+	
+	mDropdownBGColor = LLColor4::white;
+	LLAccordionCtrlTabHeader::Params headerParams;
+	headerParams.name(DD_HEADER_NAME);
+	headerParams.title(p.title);
+	mHeader = LLUICtrlFactory::create<LLAccordionCtrlTabHeader>(headerParams);
+	addChild(mHeader, 1);
+
+	reshape(100, 200,FALSE);
+}
+
+LLAccordionCtrlTab::~LLAccordionCtrlTab()
+{
+}
+
+
+void LLAccordionCtrlTab::setDisplayChildren(bool display)
+{
+	mDisplayChildren = display;
+	LLRect rect = getRect();
+
+	rect.mBottom = rect.mTop - (getDisplayChildren() ? 
+		mExpandedHeight : HEADER_HEIGHT);
+	setRect(rect);
+
+	for(child_list_const_iter_t it = getChildList()->begin();
+		getChildList()->end() != it; ++it)
+	{
+		LLView* child = *it;
+		if(DD_HEADER_NAME == child->getName())
+			continue;
+
+		child->setVisible(getDisplayChildren());
+	}
+}
+
+void LLAccordionCtrlTab::reshape(S32 width, S32 height, BOOL called_from_parent /* = TRUE */)
+{
+	LLRect headerRect;
+
+	LLUICtrl::reshape(width, height, TRUE);
+
+	headerRect.setLeftTopAndSize(
+		0,height,width,HEADER_HEIGHT);
+	mHeader->setRect(headerRect);
+	mHeader->reshape(headerRect.getWidth(), headerRect.getHeight());
+
+	for(child_list_const_iter_t it = getChildList()->begin(); 
+		getChildList()->end() != it; ++it)
+	{
+		LLView* child = *it;
+		if(DD_HEADER_NAME == child->getName())
+			continue;
+		if(!child->getVisible())
+			continue;
+
+		LLRect childRect = child->getRect();
+		S32 childWidth = width - getPaddingLeft() - getPaddingRight();
+		S32 childHeight = height - getHeaderHeight() - getPaddingTop() - getPaddingBottom();
+
+		child->reshape(childWidth,childHeight);
+		
+		childRect.setLeftTopAndSize(
+			getPaddingLeft(),
+			childHeight + getPaddingBottom(),
+			childWidth, 
+			childHeight);
+
+		child->setRect(childRect);
+		
+		break;//suppose that there is only one panel
+	}
+
+}
+
+void LLAccordionCtrlTab::changeOpenClose(bool is_open)
+{
+	if(is_open)
+		mExpandedHeight = getRect().getHeight();
+
+	setDisplayChildren(!is_open);
+	reshape(getRect().getWidth(), getRect().getHeight(), FALSE);
+	if (mCommitSignal)
+	{
+		(*mCommitSignal)(this, getDisplayChildren());
+	}
+}
+
+BOOL LLAccordionCtrlTab::handleMouseDown(S32 x, S32 y, MASK mask)
+{
+	if(mCollapsible && mHeaderVisible && mCanOpenClose)
+	{
+		if(y >= (getRect().getHeight() - HEADER_HEIGHT) )
+		{
+			LLAccordionCtrlTabHeader* header = getChild<LLAccordionCtrlTabHeader>(DD_HEADER_NAME);
+			header->setFocus(true);
+			changeOpenClose(getDisplayChildren());
+
+			//reset stored state
+			mWasStateStored = false;
+			return TRUE;
+		}
+	}
+	return LLUICtrl::handleMouseDown(x,y,mask);
+}
+
+BOOL LLAccordionCtrlTab::handleMouseUp(S32 x, S32 y, MASK mask)
+{
+	return LLUICtrl::handleMouseUp(x,y,mask);
+}
+
+boost::signals2::connection LLAccordionCtrlTab::setDropDownStateChangedCallback(commit_callback_t cb)
+{
+	return setCommitCallback(cb);
+}
+
+bool LLAccordionCtrlTab::addChild(LLView* child, S32 tab_group)
+{
+	if(DD_HEADER_NAME != child->getName())
+	{
+		reshape(child->getRect().getWidth() , child->getRect().getHeight() + HEADER_HEIGHT );
+		mExpandedHeight = getRect().getHeight();
+	}
+
+	bool res = LLUICtrl::addChild(child, tab_group);
+
+	if(DD_HEADER_NAME != child->getName())
+	{
+		if(!mCollapsible)
+			setDisplayChildren(true);
+		else
+			setDisplayChildren(getDisplayChildren());	
+	}
+
+	return res;
+}
+
+void LLAccordionCtrlTab::setAccordionView(LLView* panel)
+{
+	addChild(panel,0);
+}
+
+
+LLView*	LLAccordionCtrlTab::getAccordionView()
+{
+	for(child_list_const_iter_t it = getChildList()->begin(); 
+		getChildList()->end() != it; ++it)
+	{
+		LLView* child = *it;
+		if(DD_HEADER_NAME == child->getName())
+			continue;
+		if(!child->getVisible())
+			continue;
+		return child;
+	}
+	return NULL;
+}
+
+
+S32 LLAccordionCtrlTab::getHeaderHeight()
+{
+	return mHeaderVisible?HEADER_HEIGHT:0; 
+}
+
+void LLAccordionCtrlTab::setHeaderVisible(bool value) 
+{
+	if(mHeaderVisible == value)
+		return;
+	mHeaderVisible = value;
+	if(mHeader)
+		mHeader->setVisible(value);
+	reshape(getRect().getWidth(), getRect().getHeight(), FALSE);
+};
+
+//vurtual
+BOOL LLAccordionCtrlTab::postBuild()
+{
+	mHeader->setVisible(mHeaderVisible);
+	return LLUICtrl::postBuild();
+}
+bool	LLAccordionCtrlTab::notifyChildren	(const LLSD& info)
+{
+	if(info.has("action"))
+	{
+		std::string str_action = info["action"];
+		if(str_action == "store_state")
+		{
+			storeOpenCloseState();
+			return true;
+		}
+		if(str_action == "restore_state")
+		{
+			restoreOpenCloseState();
+			return true;
+		}
+	}	
+	return LLUICtrl::notifyChildren(info);
+}
+
+S32	LLAccordionCtrlTab::notifyParent(const LLSD& info)
+{
+	if(info.has("action"))
+	{
+		std::string str_action = info["action"];
+		if(str_action == "size_changes")
+		{
+			//
+			S32 height = info["height"];
+			height = llmax(height,10) + HEADER_HEIGHT + getPaddingTop() + getPaddingBottom();
+			
+			mExpandedHeight = height;
+			
+			if(isExpanded())
+			{
+				LLRect panel_rect = getRect();
+				panel_rect.setLeftTopAndSize( panel_rect.mLeft, panel_rect.mTop, panel_rect.getWidth(), height);
+				reshape(getRect().getWidth(),height);
+				setRect(panel_rect);
+			}
+			
+			//LLAccordionCtrl should rearrange accodion tab if one of accordion change its size
+			getParent()->notifyParent(info);
+			return 1;
+		}
+		else if(str_action == "select_prev") 
+		{
+			showAndFocusHeader();
+			return 1;
+		}
+	}
+	return LLUICtrl::notifyParent(info);
+}
+
+S32 LLAccordionCtrlTab::notify(const LLSD& info)
+{
+	if(info.has("action"))
+	{
+		std::string str_action = info["action"];
+		if(str_action == "select_first")
+		{
+			showAndFocusHeader();
+			return 1;
+		}
+		else if( str_action == "select_last" )
+		{
+			if(getDisplayChildren() == false)
+			{
+				showAndFocusHeader();
+			}
+			else
+			{
+				LLView* view = getAccordionView();
+				if(view)
+					view->notify(LLSD().with("action","select_last"));
+			}
+		}
+	}
+	return 0;
+}
+
+BOOL LLAccordionCtrlTab::handleKey(KEY key, MASK mask, BOOL called_from_parent)
+{
+	LLAccordionCtrlTabHeader* header = getChild<LLAccordionCtrlTabHeader>(DD_HEADER_NAME);	
+	if( !header->hasFocus() )
+		return LLUICtrl::handleKey(key, mask, called_from_parent);
+
+	if ( (key == KEY_ADD || key == KEY_RIGHT)&& mask == MASK_NONE)
+	{
+		if(getDisplayChildren() == false)
+		{
+			changeOpenClose(getDisplayChildren());
+			return TRUE;
+		}
+	}
+	if ( (key == KEY_SUBTRACT || key == KEY_LEFT)&& mask == MASK_NONE)
+	{
+		if(getDisplayChildren() == true)
+		{
+			changeOpenClose(getDisplayChildren());
+			return TRUE;
+		}
+	}
+
+	if ( key == KEY_DOWN && mask == MASK_NONE)
+	{
+		//if collapsed go to the next accordion
+		if(getDisplayChildren() == false)
+			//we processing notifyParent so let call parent directly
+			getParent()->notifyParent(LLSD().with("action","select_next"));
+		else
+		{
+			getAccordionView()->notify(LLSD().with("action","select_first"));
+		}
+		return TRUE;
+	}
+
+	if ( key == KEY_UP && mask == MASK_NONE)
+	{
+		//go to the previous accordion
+
+		//we processing notifyParent so let call parent directly
+		getParent()->notifyParent(LLSD().with("action","select_prev"));
+		return TRUE;
+	}
+
+	return LLUICtrl::handleKey(key, mask, called_from_parent);
+}
+
+void LLAccordionCtrlTab::showAndFocusHeader()
+{
+	LLAccordionCtrlTabHeader* header = getChild<LLAccordionCtrlTabHeader>(DD_HEADER_NAME);	
+	header->setFocus(true);
+
+	LLRect screen_rc;
+	LLRect selected_rc = header->getRect();
+	localRectToScreen(selected_rc, &screen_rc);
+	notifyParent(LLSD().with("scrollToShowRect",screen_rc.getValue()));
+
+}
+void    LLAccordionCtrlTab::storeOpenCloseState()
+{
+	if(mWasStateStored)
+		return;
+	mStoredOpenCloseState = getDisplayChildren();
+	mWasStateStored = true;
+}
+void   LLAccordionCtrlTab::restoreOpenCloseState()
+{
+	if(!mWasStateStored)
+		return;
+	if(getDisplayChildren() != mStoredOpenCloseState)
+	{
+		changeOpenClose(getDisplayChildren());
+	}
+	mWasStateStored = false;
+}
diff --git a/indra/llui/llaccordionctrltab.h b/indra/llui/llaccordionctrltab.h
new file mode 100644
index 0000000000000000000000000000000000000000..b200d43438b5e2f4920a51a95965075a9a90c312
--- /dev/null
+++ b/indra/llui/llaccordionctrltab.h
@@ -0,0 +1,191 @@
+/** 
+ * @file LLAccordionCtrlTab.h
+ * @brief Collapsible box control implementation
+ *
+ * $LicenseInfo:firstyear=2004&license=viewergpl$
+ * 
+ * Copyright (c) 2004-2009, Linden Research, Inc.
+ * 
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab.  Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ * 
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ * 
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ * 
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_ACCORDIONCTRLTAB_H_
+#define LL_ACCORDIONCTRLTAB_H_
+
+#include <string>
+#include "llrect.h"
+
+class LLUICtrl;
+class LLUICtrlFactory;
+class LLUIImage;
+class LLButton;
+class LLTextBox;
+
+
+
+// LLAccordionCtrlTab is a container for other controls. 
+// It has a Header, by clicking on which hosted controls are shown or hidden.
+// When hosted controls are show - LLAccordionCtrlTab is expanded.
+// When hosted controls are hidden - LLAccordionCtrlTab is collapsed.
+
+class LLAccordionCtrlTab : public LLUICtrl
+{
+// Interface
+public:
+
+	struct Params 
+	 : public LLInitParam::Block<Params, LLUICtrl::Params>
+	{
+		Optional<bool>			display_children, //expanded or collapsed after initialization
+								collapsible;
+
+		Optional<std::string>	title;
+
+		Optional<S32>			header_height,
+								min_width,
+								min_height;
+
+		// Overlay images (arrows on the left)
+		Mandatory<LLUIImage*>	header_expand_img,
+								header_expand_img_pressed,
+								header_collapse_img,
+								header_collapse_img_pressed;
+
+		// Background images for the accordion tabs
+		Mandatory<LLUIImage*>	header_image,
+								header_image_over,
+								header_image_pressed,
+								header_image_focused;
+
+		Optional<LLUIColor>		header_bg_color,
+								header_text_color,
+								dropdown_bg_color;
+
+		Optional<bool>			header_visible;
+
+		Optional<S32>			padding_left;
+		Optional<S32>			padding_right;
+		Optional<S32>			padding_top;
+		Optional<S32>			padding_bottom;
+
+		Params();
+	};
+
+	typedef LLDefaultChildRegistry child_registry_t;
+
+	virtual ~LLAccordionCtrlTab();
+	
+	// Registers callback for expand/collapse events.
+	boost::signals2::connection setDropDownStateChangedCallback(commit_callback_t cb);
+
+	// Changes expand/collapse state
+	virtual void setDisplayChildren(bool display);
+
+	// Returns expand/collapse state
+	virtual bool getDisplayChildren() const {return mDisplayChildren;};
+
+	//set LLAccordionCtrlTab panel
+	void		setAccordionView(LLView* panel);
+	LLView*		getAccordionView();
+
+	bool getCollapsible() {return mCollapsible;};
+
+	void setCollapsible(bool collapsible) {mCollapsible = collapsible;};
+	void changeOpenClose(bool is_open);
+
+	void canOpenClose(bool can_open_close) { mCanOpenClose = can_open_close;};
+
+	virtual BOOL postBuild();
+
+	S32	notifyParent(const LLSD& info);
+	S32 notify(const LLSD& info);
+	bool notifyChildren(const LLSD& info);
+
+	void    storeOpenCloseState		();
+	void    restoreOpenCloseState	();
+
+protected:
+	LLAccordionCtrlTab(const LLAccordionCtrlTab::Params&);
+	friend class LLUICtrlFactory;
+
+// Overrides
+public:
+
+	// Call reshape after changing size
+	virtual void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE);
+
+	// Changes expand/collapse state and triggers expand/collapse callbacks
+	virtual BOOL handleMouseDown(S32 x, S32 y, MASK mask);
+
+	virtual BOOL handleMouseUp(S32 x, S32 y, MASK mask);
+	virtual BOOL handleKey(KEY key, MASK mask, BOOL called_from_parent);
+
+	virtual bool addChild(LLView* child, S32 tab_group);
+
+	bool isExpanded() { return mDisplayChildren; }
+
+	S32 getHeaderHeight();
+
+	// Min size functions
+
+	void setHeaderVisible(bool value);
+
+	bool getHeaderVisible() { return mHeaderVisible;}
+
+	S32 mExpandedHeight; // Height of expanded ctrl.
+						 // Used to restore height after expand.
+
+	S32	getPaddingLeft() const { return mPaddingLeft;}
+	S32	getPaddingRight() const { return mPaddingRight;}
+	S32	getPaddingTop() const { return mPaddingTop;}
+	S32	getPaddingBottom() const { return mPaddingBottom;}
+
+	void showAndFocusHeader();
+
+private:
+
+	
+
+	class LLAccordionCtrlTabHeader;
+	LLAccordionCtrlTabHeader* mHeader; //Header
+
+	bool mDisplayChildren; //Expanded/collapsed
+	bool mCollapsible;
+	bool mHeaderVisible;
+
+	bool mCanOpenClose;
+
+	S32	mPaddingLeft;
+	S32	mPaddingRight;
+	S32	mPaddingTop;
+	S32	mPaddingBottom;
+
+	bool mStoredOpenCloseState;
+	bool mWasStateStored;
+
+
+	LLUIColor mDropdownBGColor;
+};
+
+#endif
diff --git a/indra/llui/llconsole.cpp b/indra/llui/llconsole.cpp
index e08d93b23277e68d2ca4cced4f6e50fee41d1dad..59499f987b7d755232a40841c7d6c464f9c792f9 100644
--- a/indra/llui/llconsole.cpp
+++ b/indra/llui/llconsole.cpp
@@ -180,7 +180,7 @@ void LLConsole::draw()
 	// draw remaining lines
 	F32 y_pos = 0.f;
 
-	LLUIImagePtr imagep = LLUI::getUIImage("rounded_square.tga");
+	LLUIImagePtr imagep = LLUI::getUIImage("Rounded_Square");
 
 //	F32 console_opacity = llclamp(gSavedSettings.getF32("ConsoleBackgroundOpacity"), 0.f, 1.f);
 	F32 console_opacity = llclamp(LLUI::sSettingGroups["config"]->getF32("ConsoleBackgroundOpacity"), 0.f, 1.f);
diff --git a/indra/llui/llfloater.cpp b/indra/llui/llfloater.cpp
index 845203b420ebb7e29ef5a70372462f6ba61948c1..a35d279500494fed9e4deeaed37b1ab1adb8b18c 100644
--- a/indra/llui/llfloater.cpp
+++ b/indra/llui/llfloater.cpp
@@ -878,9 +878,11 @@ void LLFloater::setSnappedTo(const LLView* snap_view)
 	else
 	{
 		//RN: assume it's a floater as it must be a sibling to our parent floater
-		LLFloater* floaterp = (LLFloater*)snap_view;
-		
-		setSnapTarget(floaterp->getHandle());
+		const LLFloater* floaterp = dynamic_cast<const LLFloater*>(snap_view);
+		if (floaterp)
+		{
+			setSnapTarget(floaterp->getHandle());
+		}
 	}
 }
 
diff --git a/indra/llui/llmenugl.cpp b/indra/llui/llmenugl.cpp
index 527c0a1b87509fa6c9055ea864b6a7f21c541634..bd67949c2ae6c577c879759eddd148608321db47 100644
--- a/indra/llui/llmenugl.cpp
+++ b/indra/llui/llmenugl.cpp
@@ -46,6 +46,7 @@
 
 #include "llmenugl.h"
 
+#include "llgl.h"
 #include "llmath.h"
 #include "llrender.h"
 #include "llfocusmgr.h"
@@ -477,6 +478,7 @@ void LLMenuItemGL::draw( void )
 		if (dynamic_cast<LLMenuItemCallGL*>(this))
 			debug_count++;
 		gGL.color4fv( mHighlightBackground.get().mV );
+
 		gl_rect_2d( 0, getRect().getHeight(), getRect().getWidth(), 0 );
 	}
 
diff --git a/indra/llui/llmultislider.cpp b/indra/llui/llmultislider.cpp
index aea7c5f87c3017fc8fb99066d848210cd1b0634c..27a727fdf5ea00dfa915fe6aa0b8d4140bfc265b 100644
--- a/indra/llui/llmultislider.cpp
+++ b/indra/llui/llmultislider.cpp
@@ -490,7 +490,7 @@ void LLMultiSlider::draw()
 	F32 opacity = getEnabled() ? 1.f : 0.3f;
 
 	// Track
-	LLUIImagePtr thumb_imagep = LLUI::getUIImage("rounded_square.tga");
+	LLUIImagePtr thumb_imagep = LLUI::getUIImage("Rounded_Square");
 
 	static LLUICachedControl<S32> multi_track_height ("UIMultiTrackHeight", 0);
 	S32 height_offset = (getRect().getHeight() - multi_track_height) / 2;
diff --git a/indra/llui/llpanel.cpp b/indra/llui/llpanel.cpp
index db3288243828de36db4ab1582df7c34b63c511f0..143f19eea61494a12127a4fee328a43c36d3375e 100644
--- a/indra/llui/llpanel.cpp
+++ b/indra/llui/llpanel.cpp
@@ -43,6 +43,7 @@
 #include "llerror.h"
 #include "lltimer.h"
 
+#include "llaccordionctrltab.h"
 #include "llbutton.h"
 #include "llmenugl.h"
 //#include "llstatusbar.h"
@@ -851,14 +852,26 @@ static LLPanel *childGetVisibleTabWithHelp(LLView *parent)
 	// look through immediate children first for an active tab with help
 	for (child = parent->getFirstChild(); child; child = parent->findNextSibling(child))
 	{
+		LLPanel *curTabPanel = NULL;
+
+		// do we have a tab container?
 		LLTabContainer *tab = dynamic_cast<LLTabContainer *>(child);
 		if (tab && tab->getVisible())
 		{
-			LLPanel *curTabPanel = tab->getCurrentPanel();
-			if (curTabPanel && !curTabPanel->getHelpTopic().empty())
-			{
-				return curTabPanel;
-			}
+			curTabPanel = tab->getCurrentPanel();
+		}
+
+		// do we have an accordion tab?
+		LLAccordionCtrlTab* accordion = dynamic_cast<LLAccordionCtrlTab *>(child);
+		if (accordion && accordion->getDisplayChildren())
+		{
+			curTabPanel = dynamic_cast<LLPanel *>(accordion->getAccordionView());
+		}
+
+		// if we found a valid tab, does it have a help topic?
+		if (curTabPanel && !curTabPanel->getHelpTopic().empty())
+		{
+			return curTabPanel;
 		}
 	}
 
diff --git a/indra/llui/llscrolllistcell.cpp b/indra/llui/llscrolllistcell.cpp
index 7238d903a30cf6062ccad4853890f335bbc3f5a2..3cc92baa8dc48612ca19695cc605d60c9efeaf88 100644
--- a/indra/llui/llscrolllistcell.cpp
+++ b/indra/llui/llscrolllistcell.cpp
@@ -188,7 +188,7 @@ LLScrollListText::LLScrollListText(const LLScrollListCell::Params& p)
 	// initialize rounded rect image
 	if (!mRoundedRectImage)
 	{
-		mRoundedRectImage = LLUI::getUIImage("rounded_square.tga");
+		mRoundedRectImage = LLUI::getUIImage("Rounded_Square");
 	}
 }
 
diff --git a/indra/llui/llurlentry.cpp b/indra/llui/llurlentry.cpp
index f7528bc62ab331e9776eca2aec819d6f2e657cda..1b6dd1b2641967f18af68f9de3138f0f4f8a7732 100644
--- a/indra/llui/llurlentry.cpp
+++ b/indra/llui/llurlentry.cpp
@@ -101,7 +101,7 @@ std::string LLUrlEntryBase::getLabelFromWikiLink(const std::string &url)
 	{
 		start++;
 	}
-	return url.substr(start, url.size()-start-1);
+	return unescapeUrl(url.substr(start, url.size()-start-1));
 }
 
 std::string LLUrlEntryBase::getUrlFromWikiLink(const std::string &string)
diff --git a/indra/llui/tests/llurlentry_test.cpp b/indra/llui/tests/llurlentry_test.cpp
index 128cd134c138b0346de6d45a36d442d471d134f9..38cf7124ceadd0c041d89da30911bd329d76736d 100644
--- a/indra/llui/tests/llurlentry_test.cpp
+++ b/indra/llui/tests/llurlentry_test.cpp
@@ -545,4 +545,50 @@ namespace tut
 				  "XXX [secondlife:///app/teleport/Ahern/50/50/50/ Teleport to Ahern] YYY",
 				  "[secondlife:///app/teleport/Ahern/50/50/50/ Teleport to Ahern]");
 	}
+
+	template<> template<>
+	void object::test<11>()
+	{
+		//
+		// test LLUrlEntryHTTPNoProtocol - general URLs without a protocol
+		//
+		LLUrlEntryHTTPNoProtocol url;
+		boost::regex r = url.getPattern();
+
+		testRegex("naked .com URL", r,
+				  "see google.com",
+				  "google.com");
+
+		testRegex("naked .org URL", r,
+				  "see en.wikipedia.org for details",
+				  "en.wikipedia.org");
+
+		testRegex("naked .net URL", r,
+				  "example.net",
+				  "example.net");
+
+		testRegex("naked .edu URL (2 instances)", r,
+				  "MIT web site is at web.mit.edu and also www.mit.edu",
+				  "web.mit.edu");
+
+		testRegex("invalid .com URL [1]", r,
+				  "..com",
+				  "");
+
+		testRegex("invalid .com URL [2]", r,
+				  "you.come",
+				  "");
+
+		testRegex("invalid .com URL [3]", r,
+				  "recommended",
+				  "");
+
+		testRegex("invalid .edu URL", r,
+				  "hi there scheduled maitenance has begun",
+				  "");
+
+		testRegex("invalid .net URL", r,
+				  "foo.netty",
+				  "");
+	}
 }
diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt
index 8918fc301893315dc178ac5868a64052f2c2bc87..39594bcf3e9bb3b57d5c005e290f6ea0e9b04e92 100644
--- a/indra/newview/CMakeLists.txt
+++ b/indra/newview/CMakeLists.txt
@@ -63,8 +63,6 @@ include_directories(
     )
 
 set(viewer_SOURCE_FILES
-    llaccordionctrl.cpp
-    llaccordionctrltab.cpp
     llagent.cpp
     llagentaccess.cpp
     llagentdata.cpp
@@ -214,7 +212,6 @@ set(viewer_SOURCE_FILES
     llfloaterurldisplay.cpp
     llfloaterurlentry.cpp
     llfloatervoicedevicesettings.cpp
-    llfloatervolumepulldown.cpp
     llfloaterwater.cpp
     llfloaterwhitelistentry.cpp
     llfloaterwindlight.cpp
@@ -349,6 +346,7 @@ set(viewer_SOURCE_FILES
     llpanelshower.cpp
     llpanelteleporthistory.cpp
     llpanelvolume.cpp
+    llpanelvolumepulldown.cpp
     llparcelselection.cpp
     llparticipantlist.cpp
     llpatchvertexarray.cpp
@@ -569,8 +567,6 @@ endif (LINUX)
 set(viewer_HEADER_FILES
     CMakeLists.txt
     ViewerInstall.cmake
-    llaccordionctrl.h
-    llaccordionctrltab.h
     llagent.h
     llagentaccess.h
     llagentdata.h
@@ -852,6 +848,7 @@ set(viewer_HEADER_FILES
     llpanelshower.h
     llpanelteleporthistory.h
     llpanelvolume.h
+    llpanelvolumepulldown.h
     llparcelselection.h
     llparticipantlist.h
     llpatchvertexarray.h
diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index 7d98a4b6ce6c49a7737737ee2d262383c1d4d2cb..382793a4974823cfce77760c8518d49da0d20dc5 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -3257,17 +3257,6 @@
       <key>Value</key>
       <real>0.75</real>
     </map>
-    <key>FolderIndentation</key>
-    <map>
-      <key>Comment</key>
-      <string>Number of pixels to indent subfolders in inventory</string>
-      <key>Persist</key>
-      <integer>1</integer>
-      <key>Type</key>
-      <string>S32</string>
-      <key>Value</key>
-      <integer>8</integer>
-    </map>
     <key>FolderLoadingMessageWaitTime</key>
     <map>
       <key>Comment</key>
diff --git a/indra/newview/llagentwearables.cpp b/indra/newview/llagentwearables.cpp
index f49f8620455061fb783ce9d54a5c7517c1f4f54a..10a2dd132ad965ddc812d0be00dfd1425732fa4f 100644
--- a/indra/newview/llagentwearables.cpp
+++ b/indra/newview/llagentwearables.cpp
@@ -95,19 +95,38 @@ class LLLibraryOutfitsFetch : public LLInventoryFetchDescendentsObserver
 	enum ELibraryOutfitFetchStep {
 		LOFS_FOLDER = 0,
 		LOFS_OUTFITS,
+		LOFS_LIBRARY,
+		LOFS_IMPORTED,
 		LOFS_CONTENTS
 	};
-	LLLibraryOutfitsFetch() : mCurrFetchStep(LOFS_FOLDER), mOutfitsPopulated(false) {}
+	LLLibraryOutfitsFetch() : mCurrFetchStep(LOFS_FOLDER), mOutfitsPopulated(false) 
+	{
+		mMyOutfitsID = LLUUID::null;
+		mClothingID = LLUUID::null;
+		mLibraryClothingID = LLUUID::null;
+		mImportedClothingID = LLUUID::null;
+		mImportedClothingName = "Imported Library Clothing";
+	}
 	~LLLibraryOutfitsFetch() {}
-	virtual void done();	
+	virtual void done();
 	void doneIdle();
+	LLUUID mMyOutfitsID;
+	void importedFolderFetch();
 protected:
 	void folderDone(void);
 	void outfitsDone(void);
+	void libraryDone(void);
+	void importedFolderDone(void);
 	void contentsDone(void);
 	enum ELibraryOutfitFetchStep mCurrFetchStep;
-	std::vector< std::pair< LLUUID, std::string > > mOutfits;
+	typedef std::vector< std::pair< LLUUID, std::string > > cloth_folder_vec_t;
+	cloth_folder_vec_t mLibraryClothingFolders;
+	cloth_folder_vec_t mImportedClothingFolders;
 	bool mOutfitsPopulated;
+	LLUUID mClothingID;
+	LLUUID mLibraryClothingID;
+	LLUUID mImportedClothingID;
+	std::string mImportedClothingName;
 };
 
 LLAgentWearables gAgentWearables;
@@ -2126,11 +2145,15 @@ void LLAgentWearables::populateMyOutfitsFolder(void)
 	// Get the complete information on the items in the inventory and 
 	// setup an observer that will wait for that to happen.
 	LLInventoryFetchDescendentsObserver::folder_ref_t folders;
-	const LLUUID my_outfits_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_MY_OUTFITS);
+	outfits->mMyOutfitsID = gInventory.findCategoryUUIDForType(LLFolderType::FT_MY_OUTFITS);
 
-	folders.push_back(my_outfits_id);
+	folders.push_back(outfits->mMyOutfitsID);
 	gInventory.addObserver(outfits);
 	outfits->fetchDescendents(folders);
+	if (outfits->isEverythingComplete())
+	{
+		outfits->done();
+	}
 }
 
 void LLLibraryOutfitsFetch::done()
@@ -2144,13 +2167,24 @@ void LLLibraryOutfitsFetch::done()
 void LLLibraryOutfitsFetch::doneIdle()
 {
 	gInventory.addObserver(this); // Add this back in since it was taken out during ::done()
+	
 	switch (mCurrFetchStep)
 	{
 		case LOFS_FOLDER:
 			folderDone();
+			mCurrFetchStep = LOFS_OUTFITS;
 			break;
 		case LOFS_OUTFITS:
 			outfitsDone();
+			mCurrFetchStep = LOFS_LIBRARY;
+			break;
+		case LOFS_LIBRARY:
+			libraryDone();
+			mCurrFetchStep = LOFS_IMPORTED;
+			break;
+		case LOFS_IMPORTED:
+			importedFolderDone();
+			mCurrFetchStep = LOFS_CONTENTS;
 			break;
 		case LOFS_CONTENTS:
 			contentsDone();
@@ -2172,67 +2206,217 @@ void LLLibraryOutfitsFetch::doneIdle()
 
 void LLLibraryOutfitsFetch::folderDone(void)
 {
-	// Early out if we already have items in My Outfits.
 	LLInventoryModel::cat_array_t cat_array;
 	LLInventoryModel::item_array_t wearable_array;
-	gInventory.collectDescendents(mCompleteFolders.front(), cat_array, wearable_array, 
+	gInventory.collectDescendents(mMyOutfitsID, cat_array, wearable_array, 
 								  LLInventoryModel::EXCLUDE_TRASH);
+	
+	// Early out if we already have items in My Outfits.
 	if (cat_array.count() > 0 || wearable_array.count() > 0)
 	{
 		mOutfitsPopulated = true;
 		return;
 	}
 	
-	// Get the UUID of the library's clothing folder
-	const LLUUID library_clothing_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_CLOTHING, false, true);
+	mClothingID = gInventory.findCategoryUUIDForType(LLFolderType::FT_CLOTHING);
+	mLibraryClothingID = gInventory.findCategoryUUIDForType(LLFolderType::FT_CLOTHING, false, true);
 	
 	mCompleteFolders.clear();
 	
 	// Get the complete information on the items in the inventory.
 	LLInventoryFetchDescendentsObserver::folder_ref_t folders;
-	folders.push_back(library_clothing_id);
-	mCurrFetchStep = LOFS_OUTFITS;
+	folders.push_back(mClothingID);
+	folders.push_back(mLibraryClothingID);
 	fetchDescendents(folders);
+	if (isEverythingComplete())
+	{
+		done();
+	}
 }
 
 void LLLibraryOutfitsFetch::outfitsDone(void)
 {
 	LLInventoryModel::cat_array_t cat_array;
 	LLInventoryModel::item_array_t wearable_array;
-	gInventory.collectDescendents(mCompleteFolders.front(), cat_array, wearable_array, 
-								  LLInventoryModel::EXCLUDE_TRASH);
-	
 	LLInventoryFetchDescendentsObserver::folder_ref_t folders;
 	
+	// Collect the contents of the Library's Clothing folder
+	gInventory.collectDescendents(mLibraryClothingID, cat_array, wearable_array, 
+								  LLInventoryModel::EXCLUDE_TRASH);
+	
 	llassert(cat_array.count() > 0);
 	for (LLInventoryModel::cat_array_t::const_iterator iter = cat_array.begin();
 		 iter != cat_array.end();
 		 ++iter)
 	{
 		const LLViewerInventoryCategory *cat = iter->get();
+		
+		// Get the names and id's of every outfit in the library, except for ruth and other "misc" outfits.
 		if (cat->getName() != "More Outfits" && cat->getName() != "Ruth")
 		{
+			// Get the name of every outfit in the library 
 			folders.push_back(cat->getUUID());
-			mOutfits.push_back(std::make_pair(cat->getUUID(), cat->getName()));
+			mLibraryClothingFolders.push_back(std::make_pair(cat->getUUID(), cat->getName()));
+		}
+	}
+	
+	// Collect the contents of your Inventory Clothing folder
+	cat_array.clear();
+	wearable_array.clear();
+	gInventory.collectDescendents(mClothingID, cat_array, wearable_array, 
+								  LLInventoryModel::EXCLUDE_TRASH);
+
+	// Check if you already have an "Imported Library Clothing" folder
+	for (LLInventoryModel::cat_array_t::const_iterator iter = cat_array.begin();
+		 iter != cat_array.end();
+		 ++iter)
+	{
+		const LLViewerInventoryCategory *cat = iter->get();
+		if (cat->getName() == mImportedClothingName)
+		{
+			mImportedClothingID = cat->getUUID();
 		}
 	}
+	
 	mCompleteFolders.clear();
+	
+	fetchDescendents(folders);
+	if (isEverythingComplete())
+	{
+		done();
+	}
+}
+
+class LLLibraryOutfitsCopyDone: public LLInventoryCallback
+{
+public:
+	LLLibraryOutfitsCopyDone(LLLibraryOutfitsFetch * fetcher):
+	mFireCount(0), mLibraryOutfitsFetcher(fetcher)
+	{
+	}
+	
+	virtual ~LLLibraryOutfitsCopyDone()
+	{
+		if (mLibraryOutfitsFetcher)
+		{
+			gInventory.addObserver(mLibraryOutfitsFetcher);
+			mLibraryOutfitsFetcher->done();
+		}
+	}
+	
+	/* virtual */ void fire(const LLUUID& inv_item)
+	{
+		mFireCount++;
+	}
+private:
+	U32 mFireCount;
+	LLLibraryOutfitsFetch * mLibraryOutfitsFetcher;
+};
 
-	mCurrFetchStep = LOFS_CONTENTS;
+void LLLibraryOutfitsFetch::libraryDone(void)
+{
+	// Copy the clothing folders from the library into the imported clothing folder if necessary.
+	if (mImportedClothingID == LLUUID::null)
+	{
+		gInventory.removeObserver(this);
+		LLPointer<LLInventoryCallback> copy_waiter = new LLLibraryOutfitsCopyDone(this);
+		mImportedClothingID = gInventory.createNewCategory(mClothingID,
+														   LLFolderType::FT_NONE,
+														   mImportedClothingName);
+		
+		for (cloth_folder_vec_t::const_iterator iter = mLibraryClothingFolders.begin();
+			 iter != mLibraryClothingFolders.end();
+			 ++iter)
+		{
+			LLUUID folder_id = gInventory.createNewCategory(mImportedClothingID,
+															LLFolderType::FT_NONE,
+															iter->second);
+			LLAppearanceManager::getInstance()->shallowCopyCategory(iter->first, folder_id, copy_waiter);
+		}
+	}
+	else
+	{
+		// Skip straight to fetching the contents of the imported folder
+		importedFolderFetch();
+	}
+}
+
+void LLLibraryOutfitsFetch::importedFolderFetch(void)
+{
+	// Fetch the contents of the Imported Clothing Folder
+	LLInventoryFetchDescendentsObserver::folder_ref_t folders;
+	folders.push_back(mImportedClothingID);
+	
+	mCompleteFolders.clear();
+	
 	fetchDescendents(folders);
+	if (isEverythingComplete())
+	{
+		done();
+	}
 }
 
-void LLLibraryOutfitsFetch::contentsDone(void)
+void LLLibraryOutfitsFetch::importedFolderDone(void)
 {
-	for(S32 i = 0; i < (S32)mOutfits.size(); ++i)
+	LLInventoryModel::cat_array_t cat_array;
+	LLInventoryModel::item_array_t wearable_array;
+	LLInventoryFetchDescendentsObserver::folder_ref_t folders;
+	
+	// Collect the contents of the Imported Clothing folder
+	gInventory.collectDescendents(mImportedClothingID, cat_array, wearable_array, 
+								  LLInventoryModel::EXCLUDE_TRASH);
+	
+	for (LLInventoryModel::cat_array_t::const_iterator iter = cat_array.begin();
+		 iter != cat_array.end();
+		 ++iter)
+	{
+		const LLViewerInventoryCategory *cat = iter->get();
+		
+		// Get the name of every imported outfit
+		folders.push_back(cat->getUUID());
+		mImportedClothingFolders.push_back(std::make_pair(cat->getUUID(), cat->getName()));
+	}
+	
+	mCompleteFolders.clear();
+	fetchDescendents(folders);
+	if (isEverythingComplete())
+	{
+		done();
+	}
+}
+
+void LLLibraryOutfitsFetch::contentsDone(void)
+{		
+	LLInventoryModel::cat_array_t cat_array;
+	LLInventoryModel::item_array_t wearable_array;
+	
+	for (cloth_folder_vec_t::const_iterator folder_iter = mImportedClothingFolders.begin();
+		 folder_iter != mImportedClothingFolders.end();
+		 ++folder_iter)
 	{
 		// First, make a folder in the My Outfits directory.
-		const LLUUID parent_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_MY_OUTFITS);
-		LLUUID folder_id = gInventory.createNewCategory(parent_id,
-														LLFolderType::FT_OUTFIT,
-														mOutfits[i].second);
-		LLAppearanceManager::getInstance()->shallowCopyCategory(mOutfits[i].first, folder_id, NULL);
+		LLUUID new_outfit_folder_id = gInventory.createNewCategory(mMyOutfitsID, LLFolderType::FT_OUTFIT, folder_iter->second);
+		
+		cat_array.clear();
+		wearable_array.clear();
+		// Collect the contents of each imported clothing folder, so we can create new outfit links for it
+		gInventory.collectDescendents(folder_iter->first, cat_array, wearable_array, 
+									  LLInventoryModel::EXCLUDE_TRASH);
+		
+		for (LLInventoryModel::item_array_t::const_iterator wearable_iter = wearable_array.begin();
+			 wearable_iter != wearable_array.end();
+			 ++wearable_iter)
+		{
+			const LLViewerInventoryItem *item = wearable_iter->get();
+			link_inventory_item(gAgent.getID(),
+								item->getLinkedUUID(),
+								new_outfit_folder_id,
+								item->getName(),
+								LLAssetType::AT_LINK,
+								NULL);
+		}
 	}
+
 	mOutfitsPopulated = true;
 }
 
diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp
index e0356bc091af11c9f975a1d4e7303ef05068fcc3..fb1bded7959638c978ff5595d2f1a7c243066b3a 100644
--- a/indra/newview/llappviewer.cpp
+++ b/indra/newview/llappviewer.cpp
@@ -313,6 +313,7 @@ void init_default_trans_args()
 {
 	default_trans_args.insert("SECOND_LIFE"); // World
 	default_trans_args.insert("APP_NAME");
+	default_trans_args.insert("CAPITALIZED_APP_NAME");
 	default_trans_args.insert("SECOND_LIFE_GRID");
 	default_trans_args.insert("SUPPORT_SITE");
 }
diff --git a/indra/newview/llchathistory.cpp b/indra/newview/llchathistory.cpp
index dac328057527d6c041a3f1ffd96c6f8b12f22689..cda3e3a4191c6e6eb80ef9ded69ffc2c82b1a752 100644
--- a/indra/newview/llchathistory.cpp
+++ b/indra/newview/llchathistory.cpp
@@ -576,10 +576,10 @@ void LLChatHistory::appendMessage(const LLChat& chat, const bool use_plain_text_
 		style_params.font.style = "ITALIC";
 
 		if (chat.mFromName.size() > 0)
-			mEditor->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.
-		mEditor->appendText(chat.mText.substr(4) + NEW_LINE, FALSE, style_params);
+		mEditor->appendText(chat.mText.substr(3) + NEW_LINE, FALSE, style_params);
 	}
 	else
 	{
diff --git a/indra/newview/llchatitemscontainerctrl.cpp b/indra/newview/llchatitemscontainerctrl.cpp
index 60a37ac4af96f923a6b3067ff72980b72542d2b8..9ce3f29853a9a7df264039eb1edba2911c350a65 100644
--- a/indra/newview/llchatitemscontainerctrl.cpp
+++ b/indra/newview/llchatitemscontainerctrl.cpp
@@ -170,10 +170,7 @@ void LLNearbyChatToastPanel::init(LLSD& notification)
 
 	std::string str_sender;
 	
-	if(gAgentID != mFromID)
-		str_sender = fromName;
-	else
-		str_sender = LLTrans::getString("You");
+	str_sender = fromName;
 
 	str_sender+=" ";
 
diff --git a/indra/newview/llfasttimerview.cpp b/indra/newview/llfasttimerview.cpp
index 7d8bb6e10449178bb9e4bba8ebd0f31c45987006..4fa97e789b305e47e599d38e216d7855ba43a405 100644
--- a/indra/newview/llfasttimerview.cpp
+++ b/indra/newview/llfasttimerview.cpp
@@ -314,7 +314,7 @@ void LLFastTimerView::draw()
 	S32 left, top, right, bottom;
 	S32 x, y, barw, barh, dx, dy;
 	S32 texth, textw;
-	LLPointer<LLUIImage> box_imagep = LLUI::getUIImage("rounded_square.tga");
+	LLPointer<LLUIImage> box_imagep = LLUI::getUIImage("Rounded_Square");
 
 	// Draw the window background
 	gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
diff --git a/indra/newview/llfloaterscriptlimits.cpp b/indra/newview/llfloaterscriptlimits.cpp
index 3042fbc6ec16dad5ad5aa8b1c1d50c78825ecc55..0964ad7f917cc88ea10eac2abce6a965f378534c 100644
--- a/indra/newview/llfloaterscriptlimits.cpp
+++ b/indra/newview/llfloaterscriptlimits.cpp
@@ -64,6 +64,8 @@
 // summary which only shows available & correct information
 #define USE_SIMPLE_SUMMARY
 
+const S32 SIZE_OF_ONE_KB = 1024;
+
 LLFloaterScriptLimits::LLFloaterScriptLimits(const LLSD& seed)
 	: LLFloater(seed)
 {
@@ -130,7 +132,6 @@ void LLFloaterScriptLimits::refresh()
 	}
 }
 
-
 ///----------------------------------------------------------------------------
 // Base class for panels
 ///----------------------------------------------------------------------------
@@ -331,6 +332,57 @@ void LLPanelScriptLimitsRegionMemory::setErrorStatus(U32 status, const std::stri
 	llerrs << "Can't handle remote parcel request."<< " Http Status: "<< status << ". Reason : "<< reason<<llendl;
 }
 
+// callback from the name cache with an owner name to add to the list
+void LLPanelScriptLimitsRegionMemory::onNameCache(
+						 const LLUUID& id,
+						 const std::string& first_name,
+						 const std::string& last_name)
+{
+	std::string name = first_name + " " + last_name;
+
+	LLScrollListCtrl *list = getChild<LLScrollListCtrl>("scripts_list");	
+	std::vector<LLSD>::iterator id_itor;
+	for (id_itor = mObjectListItems.begin(); id_itor != mObjectListItems.end(); ++id_itor)
+	{
+		LLSD element = *id_itor;
+		if(element["owner_id"].asUUID() == id)
+		{
+			LLScrollListItem* item = list->getItem(element["id"].asUUID());
+
+			if(item)
+			{
+				item->getColumn(2)->setValue(LLSD(name));
+				element["columns"][2]["value"] = name;
+			}
+		}
+	}
+
+	// fill in the url's tab if needed, all urls must have memory so we can do it all here
+	LLFloaterScriptLimits* instance = LLFloaterReg::getTypedInstance<LLFloaterScriptLimits>("script_limits");
+	if(instance)
+	{
+		LLTabContainer* tab = instance->getChild<LLTabContainer>("scriptlimits_panels");
+		LLPanelScriptLimitsRegionMemory* panel = (LLPanelScriptLimitsRegionMemory*)tab->getChild<LLPanel>("script_limits_region_urls_panel");
+
+		LLScrollListCtrl *list = panel->getChild<LLScrollListCtrl>("scripts_list");	
+		std::vector<LLSD>::iterator id_itor;
+		for (id_itor = mObjectListItems.begin(); id_itor != mObjectListItems.end(); ++id_itor)
+		{
+			LLSD element = *id_itor;
+			if(element["owner_id"].asUUID() == id)
+			{
+				LLScrollListItem* item = list->getItem(element["id"].asUUID());
+
+				if(item)
+				{
+					item->getColumn(2)->setValue(LLSD(name));
+					element["columns"][2]["value"] = name;
+				}
+			}
+		}
+	}
+}
+
 void LLPanelScriptLimitsRegionMemory::setRegionDetails(LLSD content)
 {
 	LLScrollListCtrl *list = getChild<LLScrollListCtrl>("scripts_list");
@@ -345,22 +397,40 @@ void LLPanelScriptLimitsRegionMemory::setRegionDetails(LLSD content)
 	S32 total_objects = 0;
 	S32 total_size = 0;
 
+	std::vector<LLUUID> names_requested;
+
 	for(S32 i = 0; i < number_parcels; i++)
 	{
 		std::string parcel_name = content["parcels"][i]["name"].asString();
-		
+		LLUUID parcel_id = content["parcels"][i]["id"].asUUID();
 		S32 number_objects = content["parcels"][i]["objects"].size();
 		for(S32 j = 0; j < number_objects; j++)
 		{
-			S32 size = content["parcels"][i]["objects"][j]["resources"]["memory"].asInteger() / 1024;
+			S32 size = content["parcels"][i]["objects"][j]["resources"]["memory"].asInteger() / SIZE_OF_ONE_KB;
 			total_size += size;
 			
 			std::string name_buf = content["parcels"][i]["objects"][j]["name"].asString();
 			LLUUID task_id = content["parcels"][i]["objects"][j]["id"].asUUID();
+			LLUUID owner_id = content["parcels"][i]["objects"][j]["owner_id"].asUUID();
+			
+			std::string owner_buf;
+			
+			BOOL name_is_cached = gCacheName->getFullName(owner_id, owner_buf);
+			if(!name_is_cached)
+			{
+				if(std::find(names_requested.begin(), names_requested.end(), owner_id) == names_requested.end())
+				{
+					names_requested.push_back(owner_id);
+					gCacheName->get(owner_id, TRUE,
+					boost::bind(&LLPanelScriptLimitsRegionMemory::onNameCache,
+						this, _1, _2, _3));
+				}
+			}
 
 			LLSD element;
 
 			element["id"] = task_id;
+			element["owner_id"] = owner_id;
 			element["columns"][0]["column"] = "size";
 			element["columns"][0]["value"] = llformat("%d", size);
 			element["columns"][0]["font"] = "SANSSERIF";
@@ -368,18 +438,18 @@ void LLPanelScriptLimitsRegionMemory::setRegionDetails(LLSD content)
 			element["columns"][1]["value"] = name_buf;
 			element["columns"][1]["font"] = "SANSSERIF";
 			element["columns"][2]["column"] = "owner";
-			element["columns"][2]["value"] = "";
+			element["columns"][2]["value"] = owner_buf;
 			element["columns"][2]["font"] = "SANSSERIF";
 			element["columns"][3]["column"] = "location";
 			element["columns"][3]["value"] = parcel_name;
 			element["columns"][3]["font"] = "SANSSERIF";
 
-			list->addElement(element);
-			mObjectListIDs.push_back(task_id);
+			list->addElement(element, ADD_SORTED);
+			mObjectListItems.push_back(element);
 			total_objects++;
 		}
 	}
-	
+
 	mParcelMemoryUsed =total_size;
 	mGotParcelMemoryUsed = TRUE;
 	populateParcelMemoryText();
@@ -556,7 +626,7 @@ void LLPanelScriptLimitsRegionMemory::clearList()
 	childSetValue("memory_used", LLSD(msg_empty_string));
 	childSetValue("parcels_listed", LLSD(msg_empty_string));
 
-	mObjectListIDs.clear();
+	mObjectListItems.clear();
 }
 
 // static
@@ -728,7 +798,7 @@ void LLPanelScriptLimitsRegionURLs::setRegionDetails(LLSD content)
 
 	S32 total_objects = 0;
 	S32 total_size = 0;
-
+	
 	for(S32 i = 0; i < number_parcels; i++)
 	{
 		std::string parcel_name = content["parcels"][i]["name"].asString();
@@ -744,6 +814,10 @@ void LLPanelScriptLimitsRegionURLs::setRegionDetails(LLSD content)
 				
 				std::string name_buf = content["parcels"][i]["objects"][j]["name"].asString();
 				LLUUID task_id = content["parcels"][i]["objects"][j]["id"].asUUID();
+				LLUUID owner_id = content["parcels"][i]["objects"][j]["owner_id"].asUUID();
+
+				std::string owner_buf;
+				gCacheName->getFullName(owner_id, owner_buf); //dont care if this fails as the memory tab will request and fill the field
 
 				LLSD element;
 
@@ -755,14 +829,14 @@ void LLPanelScriptLimitsRegionURLs::setRegionDetails(LLSD content)
 				element["columns"][1]["value"] = name_buf;
 				element["columns"][1]["font"] = "SANSSERIF";
 				element["columns"][2]["column"] = "owner";
-				element["columns"][2]["value"] = "";
+				element["columns"][2]["value"] = owner_buf;
 				element["columns"][2]["font"] = "SANSSERIF";
 				element["columns"][3]["column"] = "location";
 				element["columns"][3]["value"] = parcel_name;
 				element["columns"][3]["font"] = "SANSSERIF";
 
 				list->addElement(element);
-				mObjectListIDs.push_back(task_id);
+				mObjectListItems.push_back(element);
 				total_objects++;
 			}
 		}
@@ -868,7 +942,7 @@ void LLPanelScriptLimitsRegionURLs::clearList()
 	childSetValue("urls_used", LLSD(msg_empty_string));
 	childSetValue("parcels_listed", LLSD(msg_empty_string));
 
-	mObjectListIDs.clear();
+	mObjectListItems.clear();
 }
 
 // static
@@ -982,7 +1056,7 @@ void LLPanelScriptLimitsAttachment::setAttachmentDetails(LLSD content)
 			S32 size = 0;
 			if(content["attachments"][i]["objects"][j]["resources"].has("memory"))
 			{
-				size = content["attachments"][i]["objects"][j]["resources"]["memory"].asInteger();
+				size = content["attachments"][i]["objects"][j]["resources"]["memory"].asInteger() / SIZE_OF_ONE_KB;
 			}
 			S32 urls = 0;
 			if(content["attachments"][i]["objects"][j]["resources"].has("urls"))
@@ -1059,3 +1133,4 @@ void LLPanelScriptLimitsAttachment::onClickRefresh(void* userdata)
 		return;
 	}
 }
+
diff --git a/indra/newview/llfloaterscriptlimits.h b/indra/newview/llfloaterscriptlimits.h
index 88239136e3738e9fd5b59af209cc6c4b13149c93..7e2b536eb6b15aacf2740b0f20dc9df4852d473b 100644
--- a/indra/newview/llfloaterscriptlimits.h
+++ b/indra/newview/llfloaterscriptlimits.h
@@ -54,12 +54,12 @@ class LLFloaterScriptLimits : public LLFloater
 
 	// from LLPanel
 	virtual void refresh();
-	
+
 private:
-	
+
 	LLFloaterScriptLimits(const LLSD& seed);
 	~LLFloaterScriptLimits();
-	
+
 protected:
 
 	LLTabContainer* mTab;
@@ -167,13 +167,17 @@ class LLPanelScriptLimitsRegionMemory : public LLPanelScriptLimitsInfo, LLRemote
 
 private:
 
+	void onNameCache(	 const LLUUID& id,
+						 const std::string& first_name,
+						 const std::string& last_name);
+
 	LLUUID mParcelId;
 	BOOL mGotParcelMemoryUsed;
 	BOOL mGotParcelMemoryMax;
 	S32 mParcelMemoryMax;
 	S32 mParcelMemoryUsed;
 	
-	std::vector<LLUUID> mObjectListIDs;
+	std::vector<LLSD> mObjectListItems;
 		
 protected:
 
@@ -218,7 +222,7 @@ class LLPanelScriptLimitsRegionURLs : public LLPanelScriptLimitsInfo
 	S32 mParcelURLsMax;
 	S32 mParcelURLsUsed;
 	
-	std::vector<LLUUID> mObjectListIDs;
+	std::vector<LLSD> mObjectListItems;
 		
 protected:
 	
diff --git a/indra/newview/llfloatersearch.cpp b/indra/newview/llfloatersearch.cpp
index c6d9fee6305aeaa54e72daac0c07eab6e32806bb..a7401fdb6f26f4ebd3c670917a08b8a5e1b39722 100644
--- a/indra/newview/llfloatersearch.cpp
+++ b/indra/newview/llfloatersearch.cpp
@@ -32,6 +32,9 @@
  */
 
 #include "llviewerprecompiledheaders.h"
+
+#include "llcommandhandler.h"
+#include "llfloaterreg.h"
 #include "llfloatersearch.h"
 #include "llmediactrl.h"
 #include "lllogininstance.h"
@@ -41,6 +44,42 @@
 #include "llviewercontrol.h"
 #include "llweb.h"
 
+// support secondlife:///app/search/{CATEGORY}/{QUERY} SLapps
+class LLSearchHandler : public LLCommandHandler
+{
+public:
+	// requires trusted browser to trigger
+	LLSearchHandler() : LLCommandHandler("search", UNTRUSTED_THROTTLE) { }
+	bool handle(const LLSD& tokens, const LLSD& query_map, LLMediaCtrl* web)
+	{
+		const size_t parts = tokens.size();
+
+		// get the (optional) category for the search
+		std::string category;
+		if (parts > 0)
+		{
+			category = tokens[0].asString();
+		}
+
+		// get the (optional) search string
+		std::string search_text;
+		if (parts > 1)
+		{
+			search_text = tokens[1].asString();
+		}
+
+		// create the LLSD arguments for the search floater
+		LLSD args;
+		args["category"] = category;
+		args["id"] = LLURI::unescape(search_text);
+
+		// open the search floater and perform the requested search
+		LLFloaterReg::showInstance("search", args);
+		return true;
+	}
+};
+LLSearchHandler gSearchHandler;
+
 LLFloaterSearch::LLFloaterSearch(const LLSD& key) :
 	LLFloater(key),
 	LLViewerMediaObserver(),
diff --git a/indra/newview/llfolderview.cpp b/indra/newview/llfolderview.cpp
index 41f4d1a663ccd6b3fc03ecd6b1a36b6f535cb2fa..9aed40399130eb95b864d5e0a352c7c952a1c18e 100644
--- a/indra/newview/llfolderview.cpp
+++ b/indra/newview/llfolderview.cpp
@@ -206,7 +206,9 @@ LLFolderView::LLFolderView(const Params& p)
 	mAutoOpenCandidate = NULL;
 	mAutoOpenTimer.stop();
 	mKeyboardSelection = FALSE;
-    static LLUICachedControl<S32> indentation("FolderIndentation", 0);
+	const LLFolderViewItem::Params& item_params =
+		LLUICtrlFactory::getDefaultParams<LLFolderViewItem>();
+	S32 indentation = item_params.folder_indentation();
 	mIndentation = -indentation; // children start at indentation 0
 	gIdleCallbacks.addFunction(idle, this);
 
@@ -395,7 +397,7 @@ S32 LLFolderView::arrange( S32* unused_width, S32* unused_height, S32 filter_gen
 		getRoot()->getFilter()->getShowFolderState();
 
 	S32 total_width = LEFT_PAD;
-	S32 running_height = mDebugFilters ? llceil(sSmallFont->getLineHeight()) : 0;
+	S32 running_height = mDebugFilters ? llceil(LLFontGL::getFontMonospace()->getLineHeight()) : 0;
 	S32 target_height = running_height;
 	S32 parent_item_height = getRect().getHeight();
 
@@ -820,10 +822,11 @@ void LLFolderView::clearSelection()
 	mSelectThisID.setNull();
 }
 
-BOOL LLFolderView::getSelectionList(std::set<LLUUID> &selection)
+BOOL LLFolderView::getSelectionList(std::set<LLUUID> &selection) const
 {
-	selected_items_t::iterator item_it;
-	for (item_it = mSelectedItems.begin(); item_it != mSelectedItems.end(); ++item_it)
+	for (selected_items_t::const_iterator item_it = mSelectedItems.begin(); 
+		 item_it != mSelectedItems.end(); 
+		 ++item_it)
 	{
 		selection.insert((*item_it)->getListener()->getUUID());
 	}
@@ -866,8 +869,8 @@ void LLFolderView::draw()
 	{
 		std::string current_filter_string = llformat("Current Filter: %d, Least Filter: %d, Auto-accept Filter: %d",
 										mFilter->getCurrentGeneration(), mFilter->getMinRequiredGeneration(), mFilter->getMustPassGeneration());
-		sSmallFont->renderUTF8(current_filter_string, 0, 2, 
-			getRect().getHeight() - sSmallFont->getLineHeight(), LLColor4(0.5f, 0.5f, 0.8f, 1.f), 
+		LLFontGL::getFontMonospace()->renderUTF8(current_filter_string, 0, 2, 
+			getRect().getHeight() - LLFontGL::getFontMonospace()->getLineHeight(), LLColor4(0.5f, 0.5f, 0.8f, 1.f), 
 			LLFontGL::LEFT, LLFontGL::BOTTOM, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, S32_MAX, S32_MAX, NULL, FALSE );
 	}
 
diff --git a/indra/newview/llfolderview.h b/indra/newview/llfolderview.h
index 2598af4df4bc954fe20b242b14ce032b9fbd4c6c..89e1865e3539451703ca16c7f393c2e038123753 100644
--- a/indra/newview/llfolderview.h
+++ b/indra/newview/llfolderview.h
@@ -162,7 +162,7 @@ class LLFolderView : public LLFolderViewFolder, public LLEditMenuHandler
 
 	virtual S32 extendSelection(LLFolderViewItem* selection, LLFolderViewItem* last_selected, LLDynamicArray<LLFolderViewItem*>& items);
 
-	virtual BOOL getSelectionList(std::set<LLUUID> &selection);
+	virtual BOOL getSelectionList(std::set<LLUUID> &selection) const;
 
 	// make sure if ancestor is selected, descendents are not
 	void sanitizeSelection();
diff --git a/indra/newview/llfolderviewitem.cpp b/indra/newview/llfolderviewitem.cpp
index 9d54aafd6756231fa81591109e6fbf313f4cd19e..2363f51d80ac36c5568f1c05b6979a315c3e074a 100644
--- a/indra/newview/llfolderviewitem.cpp
+++ b/indra/newview/llfolderviewitem.cpp
@@ -51,11 +51,10 @@
 /// Class LLFolderViewItem
 ///----------------------------------------------------------------------------
 
+static LLDefaultChildRegistry::Register<LLFolderViewItem> r("folder_view_item");
+
 // statics 
 std::map<U8, LLFontGL*> LLFolderViewItem::sFonts; // map of styles to fonts
-const LLFontGL* LLFolderViewItem::sSmallFont = NULL;
-LLUIImagePtr LLFolderViewItem::sArrowImage;
-LLUIImagePtr LLFolderViewItem::sBoxImage;
 
 // only integers can be initialized in header
 const F32 LLFolderViewItem::FOLDER_CLOSE_TIME_CONSTANT = 0.02f;
@@ -84,33 +83,34 @@ LLFontGL* LLFolderViewItem::getLabelFontForStyle(U8 style)
 //static
 void LLFolderViewItem::initClass()
 {
-	sSmallFont = LLFontGL::getFontMonospace();
-	sArrowImage = LLUI::getUIImage("folder_arrow.tga"); 
-	sBoxImage = LLUI::getUIImage("rounded_square.tga");
 }
 
 //static
 void LLFolderViewItem::cleanupClass()
 {
 	sFonts.clear();
-	sArrowImage = NULL;
-	sBoxImage = NULL;
 }
 
 
 // NOTE: Optimize this, we call it a *lot* when opening a large inventory
 LLFolderViewItem::Params::Params()
-:	icon("icon"),
-	folder_arrow_image("folder_arrow_image", LLUI::getUIImage("folder_arrow.tga")),
-	selection_image("selection_image", LLUI::getUIImage("rounded_square.tga"))
+:	icon(),
+	icon_open(),
+	root(),
+	listener(),
+	folder_arrow_image("folder_arrow_image"),
+	folder_indentation("folder_indentation"),
+	selection_image("selection_image"),
+	item_height("item_height"),
+	item_top_pad("item_top_pad"),
+	creation_date()
 {
 	mouse_opaque(true);
 	follows.flags(FOLLOWS_LEFT|FOLLOWS_TOP|FOLLOWS_RIGHT);
-	// JAMESDEBUG tab_stop(false);
 }
 
 // Default constructor
-LLFolderViewItem::LLFolderViewItem(LLFolderViewItem::Params p)
+LLFolderViewItem::LLFolderViewItem(const LLFolderViewItem::Params& p)
 :	LLView(p),
 	mLabelWidth(0),
 	mLabelWidthDirty(false),
@@ -121,6 +121,7 @@ LLFolderViewItem::LLFolderViewItem(LLFolderViewItem::Params p)
 	mLabelStyle( LLFontGL::NORMAL ),
 	mHasVisibleChildren(FALSE),
 	mIndentation(0),
+	mItemHeight(p.item_height),
 	mNumDescendantsSelected(0),
 	mPassedFilter(FALSE),
 	mLastFilterGeneration(-1),
@@ -134,8 +135,6 @@ LLFolderViewItem::LLFolderViewItem(LLFolderViewItem::Params p)
 	mIcon(p.icon),
 	mIconOpen(p.icon_open),
 	mListener(p.listener),
-	mArrowImage(p.folder_arrow_image),
-	mBoxImage(p.selection_image),
 	mHidden(false),
 	mShowLoadStatus(false)
 {
@@ -392,10 +391,11 @@ BOOL LLFolderViewItem::addToFolder(LLFolderViewFolder* folder, LLFolderView* roo
 // makes sure that this view and it's children are the right size.
 S32 LLFolderViewItem::arrange( S32* width, S32* height, S32 filter_generation)
 {
-    static LLUICachedControl<S32> indentation("FolderIndentation", 0);
+	const Params& p = LLUICtrlFactory::getDefaultParams<LLFolderViewItem>();
+	S32 indentation = p.folder_indentation();
+	// Only indent deeper items in hierarchy
 	mIndentation = (getParentFolder() 
-					&& getParentFolder()->getParentFolder() 
-					&& getParentFolder()->getParentFolder()->getParentFolder())
+					&& getParentFolder()->getParentFolder() )
 		? mParentFolder->getIndentation() + indentation
 		: 0;
 	if (mLabelWidthDirty)
@@ -421,9 +421,10 @@ S32 LLFolderViewItem::getItemHeight()
 {
 	if (mHidden) return 0;
 
-	S32 icon_height = mIcon->getHeight();
-	S32 label_height = llround(getLabelFontForStyle(mLabelStyle)->getLineHeight());
-	return llmax( icon_height, label_height ) + ICON_PAD;
+	//S32 icon_height = mIcon->getHeight();
+	//S32 label_height = llround(getLabelFontForStyle(mLabelStyle)->getLineHeight());
+	//return llmax( icon_height, label_height ) + ICON_PAD;
+	return mItemHeight;
 }
 
 void LLFolderViewItem::filter( LLInventoryFilter& filter)
@@ -829,11 +830,16 @@ void LLFolderViewItem::draw()
 	static LLUIColor sFgColor = LLUIColorTable::instance().getColor("MenuItemEnabledColor", DEFAULT_WHITE);
 	static LLUIColor sHighlightBgColor = LLUIColorTable::instance().getColor("MenuItemHighlightBgColor", DEFAULT_WHITE);
 	static LLUIColor sHighlightFgColor = LLUIColorTable::instance().getColor("MenuItemHighlightFgColor", DEFAULT_WHITE);
+	static LLUIColor sFocusOutlineColor =
+		LLUIColorTable::instance().getColor("InventoryFocusOutlineColor", DEFAULT_WHITE);
 	static LLUIColor sFilterBGColor = LLUIColorTable::instance().getColor("FilterBackgroundColor", DEFAULT_WHITE);
 	static LLUIColor sFilterTextColor = LLUIColorTable::instance().getColor("FilterTextColor", DEFAULT_WHITE);
 	static LLUIColor sSuffixColor = LLUIColorTable::instance().getColor("InventoryItemSuffixColor", DEFAULT_WHITE);
 	static LLUIColor sSearchStatusColor = LLUIColorTable::instance().getColor("InventorySearchStatusColor", DEFAULT_WHITE);
 
+	const Params& default_params = LLUICtrlFactory::getDefaultParams<LLFolderViewItem>();
+	const S32 TOP_PAD = default_params.item_top_pad;
+
 	bool possibly_has_children = false;
 	bool up_to_date = mListener && mListener->isUpToDate();
 	if((up_to_date && hasVisibleChildren() ) || // we fetched our children and some of them have passed the filter...
@@ -843,11 +849,10 @@ void LLFolderViewItem::draw()
 	}
 	if(/*mControlLabel[0] != '\0' && */possibly_has_children)
 	{
-		if (sArrowImage)
-		{
-			gl_draw_scaled_rotated_image(mIndentation, getRect().getHeight() - ARROW_SIZE - TEXT_PAD,
-				ARROW_SIZE, ARROW_SIZE, mControlLabelRotation, sArrowImage->getImage(), sFgColor);
-		}
+		LLUIImage* arrow_image = default_params.folder_arrow_image;
+		gl_draw_scaled_rotated_image(
+			mIndentation, getRect().getHeight() - ARROW_SIZE - TEXT_PAD - TOP_PAD,
+			ARROW_SIZE, ARROW_SIZE, mControlLabelRotation, arrow_image->getImage(), sFgColor);
 	}
 
 	F32 text_left = (F32)(ARROW_SIZE + TEXT_PAD + ICON_WIDTH + ICON_PAD + mIndentation);
@@ -857,6 +862,10 @@ void LLFolderViewItem::draw()
 	// If we have keyboard focus, draw selection filled
 	BOOL show_context = getRoot()->getShowSelectionContext();
 	BOOL filled = show_context || (getRoot()->getParentPanel()->hasFocus());
+	const S32 FOCUS_LEFT = 1;
+	S32 focus_top = getRect().getHeight();
+	S32 focus_bottom = getRect().getHeight() - mItemHeight;
+	bool folder_open = (getRect().getHeight() > mItemHeight + 4);
 
 	// always render "current" item, only render other selected items if
 	// mShowSingleSelection is FALSE
@@ -864,7 +873,6 @@ void LLFolderViewItem::draw()
 	{
 		gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
 		LLColor4 bg_color = sHighlightBgColor;
-		//const S32 TRAILING_PAD = 5;  // It just looks better with this.
 		if (!mIsCurSelection)
 		{
 			// do time-based fade of extra objects
@@ -882,35 +890,35 @@ void LLFolderViewItem::draw()
 		}
 
 		gl_rect_2d(
-			0, 
-			getRect().getHeight(), 
+			FOCUS_LEFT,
+			focus_top, 
 			getRect().getWidth() - 2,
-			llfloor(getRect().getHeight() - font->getLineHeight() - ICON_PAD),
+			focus_bottom,
 			bg_color, filled);
 		if (mIsCurSelection)
 		{
 			gl_rect_2d(
-				0, 
-				getRect().getHeight(), 
+				FOCUS_LEFT, 
+				focus_top, 
 				getRect().getWidth() - 2,
-				llfloor(getRect().getHeight() - font->getLineHeight() - ICON_PAD),
-				sHighlightFgColor, FALSE);
+				focus_bottom,
+				sFocusOutlineColor, FALSE);
 		}
-		if (getRect().getHeight() > llround(font->getLineHeight()) + ICON_PAD + 4)
+		if (folder_open)
 		{
 			gl_rect_2d(
-				0, 
-				llfloor(getRect().getHeight() - font->getLineHeight() - ICON_PAD) - 4, 
+				FOCUS_LEFT,
+				focus_bottom + 1, // overlap with bottom edge of above rect
 				getRect().getWidth() - 2,
-				2,
-				sHighlightFgColor, FALSE);
+				0,
+				sFocusOutlineColor, FALSE);
 			if (show_context)
 			{
 				gl_rect_2d(
-					0, 
-					llfloor(getRect().getHeight() - font->getLineHeight() - ICON_PAD) - 4, 
+					FOCUS_LEFT,
+					focus_bottom + 1,
 					getRect().getWidth() - 2,
-					2,
+					0,
 					sHighlightBgColor, TRUE);
 			}
 		}
@@ -919,32 +927,32 @@ void LLFolderViewItem::draw()
 	{
 		gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
 		gl_rect_2d(
-			0, 
-			getRect().getHeight(), 
+			FOCUS_LEFT, 
+			focus_top, 
 			getRect().getWidth() - 2,
-			llfloor(getRect().getHeight() - font->getLineHeight() - ICON_PAD),
+			focus_bottom,
 			sHighlightBgColor, FALSE);
-
-		if (getRect().getHeight() > llround(font->getLineHeight()) + ICON_PAD + 2)
+		if (folder_open)
 		{
 			gl_rect_2d(
-				0, 
-				llfloor(getRect().getHeight() - font->getLineHeight() - ICON_PAD) - 2, 
+				FOCUS_LEFT,
+				focus_bottom + 1, // overlap with bottom edge of above rect
 				getRect().getWidth() - 2,
-				2,
+				0,
 				sHighlightBgColor, FALSE);
 		}
 		mDragAndDropTarget = FALSE;
 	}
 
+	S32 icon_x = mIndentation + ARROW_SIZE + TEXT_PAD;
 	// First case is used for open folders
 	if (!mIconOpen.isNull() && (llabs(mControlLabelRotation) > 80))
  	{
-		mIconOpen->draw(mIndentation + ARROW_SIZE + TEXT_PAD, getRect().getHeight() - mIcon->getHeight());
+		mIconOpen->draw(icon_x, getRect().getHeight() - mIconOpen->getHeight() - TOP_PAD + 1);
 	}
 	else if(mIcon)
 	{
- 		mIcon->draw(mIndentation + ARROW_SIZE + TEXT_PAD, getRect().getHeight() - mIcon->getHeight());
+ 		mIcon->draw(icon_x, getRect().getHeight() - mIcon->getHeight() - TOP_PAD + 1);
  	}
 
 	if (!mLabel.empty())
@@ -953,7 +961,7 @@ void LLFolderViewItem::draw()
 		BOOL debug_filters = getRoot()->getDebugFilters();
 		LLColor4 color = ( (mIsSelected && filled) ? sHighlightFgColor : sFgColor );
 		F32 right_x;
-		F32 y = (F32)getRect().getHeight() - font->getLineHeight() - (F32)TEXT_PAD;
+		F32 y = (F32)getRect().getHeight() - font->getLineHeight() - (F32)TEXT_PAD - (F32)TOP_PAD;
 
 		if (debug_filters)
 		{
@@ -963,7 +971,8 @@ void LLFolderViewItem::draw()
 			}
 
 			LLColor4 filter_color = mLastFilterGeneration >= getRoot()->getFilter()->getCurrentGeneration() ? LLColor4(0.5f, 0.8f, 0.5f, 1.f) : LLColor4(0.8f, 0.5f, 0.5f, 1.f);
-			sSmallFont->renderUTF8(mStatusText, 0, text_left, y, filter_color,
+			LLFontGL::getFontMonospace()->renderUTF8(
+				mStatusText, 0, text_left, y, filter_color,
 				LLFontGL::LEFT, LLFontGL::BOTTOM, LLFontGL::NORMAL, LLFontGL::NO_SHADOW,
 				S32_MAX, S32_MAX, &right_x, FALSE );
 			text_left = right_x;
@@ -1004,7 +1013,7 @@ void LLFolderViewItem::draw()
 				S32_MAX, S32_MAX, &right_x, FALSE );
 		}
 
-		if (sBoxImage.notNull() && mStringMatchOffset != std::string::npos)
+		if (mStringMatchOffset != std::string::npos)
 		{
 			// don't draw backgrounds for zero-length strings
 			S32 filter_string_length = getRoot()->getFilterSubString().size();
@@ -1013,14 +1022,15 @@ void LLFolderViewItem::draw()
 				std::string combined_string = mLabel + mLabelSuffix;
 				S32 left = llround(text_left) + font->getWidth(combined_string, 0, mStringMatchOffset) - 1;
 				S32 right = left + font->getWidth(combined_string, mStringMatchOffset, filter_string_length) + 2;
-				S32 bottom = llfloor(getRect().getHeight() - font->getLineHeight() - 3);
-				S32 top = getRect().getHeight();
-				
+				S32 bottom = llfloor(getRect().getHeight() - font->getLineHeight() - 3 - TOP_PAD);
+				S32 top = getRect().getHeight() - TOP_PAD;
+		
+				LLUIImage* box_image = default_params.selection_image;
 				LLRect box_rect(left, top, right, bottom);
-				sBoxImage->draw(box_rect, sFilterBGColor);
+				box_image->draw(box_rect, sFilterBGColor);
 				F32 match_string_left = text_left + font->getWidthF32(combined_string, 0, mStringMatchOffset);
-				F32 y = (F32)getRect().getHeight() - font->getLineHeight() - (F32)TEXT_PAD;
-				font->renderUTF8( combined_string, mStringMatchOffset, match_string_left, y,
+				F32 yy = (F32)getRect().getHeight() - font->getLineHeight() - (F32)TEXT_PAD - (F32)TOP_PAD;
+				font->renderUTF8( combined_string, mStringMatchOffset, match_string_left, yy,
 								  sFilterTextColor, LLFontGL::LEFT, LLFontGL::BOTTOM, LLFontGL::NORMAL, LLFontGL::NO_SHADOW,
 								  filter_string_length, S32_MAX, &right_x, FALSE );
 			}
diff --git a/indra/newview/llfolderviewitem.h b/indra/newview/llfolderviewitem.h
index 6f8c738a59694c2ece01d71ace288b728a0f8ba5..be8e73a5a9d8a9d47c4b9fd3961ba588e6a95dff 100644
--- a/indra/newview/llfolderviewitem.h
+++ b/indra/newview/llfolderviewitem.h
@@ -101,7 +101,10 @@ class LLFolderViewItem : public LLView
 		Optional<LLFolderViewEventListener*>	listener;
 
 		Optional<LLUIImage*>					folder_arrow_image;
+		Optional<S32>							folder_indentation; // pixels
 		Optional<LLUIImage*>					selection_image;
+		Optional<S32>							item_height; // pixels
+		Optional<S32>							item_top_pad; // pixels
 
 		Optional<S32>							creation_date; //UTC seconds
 
@@ -110,7 +113,7 @@ class LLFolderViewItem : public LLView
 
 	// layout constants
 	static const S32 LEFT_PAD = 5;
-    // LEFT_INDENTATION is set via settings.xml FolderIndentation
+    // LEFT_INDENTATION is set via folder_indentation above
 	static const S32 ICON_PAD = 2;
 	static const S32 ICON_WIDTH = 16;
 	static const S32 TEXT_PAD = 1;
@@ -127,11 +130,7 @@ class LLFolderViewItem : public LLView
 	friend class LLUICtrlFactory;
 	friend class LLFolderViewEventListener;
 
-	LLFolderViewItem(Params p = LLFolderViewItem::Params());
-
-	static const LLFontGL*		sSmallFont;
-	static LLUIImagePtr			sArrowImage;
-	static LLUIImagePtr			sBoxImage;
+	LLFolderViewItem(const Params& p);
 
 	std::string					mLabel;
 	std::string					mSearchableLabel;
@@ -150,6 +149,7 @@ class LLFolderViewItem : public LLView
 	LLUIImagePtr				mIconOpen;
 	BOOL						mHasVisibleChildren;
 	S32							mIndentation;
+	S32							mItemHeight;
 	S32							mNumDescendantsSelected;
 	BOOL						mPassedFilter;
 	S32							mLastFilterGeneration;
@@ -157,8 +157,6 @@ class LLFolderViewItem : public LLView
 	F32							mControlLabelRotation;
 	LLFolderView*				mRoot;
 	BOOL						mDragAndDropTarget;
-	LLUIImagePtr				mArrowImage;
-	LLUIImagePtr				mBoxImage;
 	BOOL                        mIsLoading;
 	LLTimer                     mTimeSinceRequestStart;
 	bool						mHidden;
@@ -237,7 +235,7 @@ class LLFolderViewItem : public LLView
 	virtual void recursiveDeselect(BOOL deselect_self);
 
 	// gets multiple-element selection
-	virtual BOOL getSelectionList(std::set<LLUUID> &selection){return TRUE;}
+	virtual BOOL getSelectionList(std::set<LLUUID> &selection) const {return TRUE;}
 
 	// Returns true is this object and all of its children can be removed (deleted by user)
 	virtual BOOL isRemovable();
@@ -304,7 +302,7 @@ class LLFolderViewItem : public LLView
 	// Show children (unfortunate that this is called "open")
 	virtual void setOpen(BOOL open = TRUE) {};
 
-	virtual BOOL isOpen() { return FALSE; }
+	virtual BOOL isOpen() const { return FALSE; }
 
 	virtual LLFolderView*	getRoot();
 	BOOL			isDescendantOf( const LLFolderViewFolder* potential_ancestor );
@@ -499,7 +497,7 @@ class LLFolderViewFolder : public LLFolderViewItem
 	virtual void setOpenArrangeRecursively(BOOL openitem, ERecurseType recurse = RECURSE_NO);
 
 	// Get the current state of the folder.
-	virtual BOOL isOpen() { return mIsOpen; }
+	virtual BOOL isOpen() const { return mIsOpen; }
 
 	// special case if an object is dropped on the child.
 	BOOL handleDragAndDropFromChild(MASK mask,
diff --git a/indra/newview/llhudtext.cpp b/indra/newview/llhudtext.cpp
index 08cf86df4aade332a569692556901a16623d0746..8ad94b957d78ac5525bd58e0607d8d12a710e9d4 100644
--- a/indra/newview/llhudtext.cpp
+++ b/indra/newview/llhudtext.cpp
@@ -287,7 +287,7 @@ void LLHUDText::renderText(BOOL for_select)
 	mOffsetY = lltrunc(mHeight * ((mVertAlignment == ALIGN_VERT_CENTER) ? 0.5f : 1.f));
 
 	// *TODO: cache this image
-	LLUIImagePtr imagep = LLUI::getUIImage("rounded_square.tga");
+	LLUIImagePtr imagep = LLUI::getUIImage("Rounded_Square");
 
 	// *TODO: make this a per-text setting
 	LLColor4 bg_color = LLUIColorTable::instance().getColor("BackgroundChatColor");
diff --git a/indra/newview/llimfloater.cpp b/indra/newview/llimfloater.cpp
index fdc5d14d9763cb94b273ce4afa58b2861b99bb22..b05568f353f07dd9fd966785e9b26bc103aec941 100644
--- a/indra/newview/llimfloater.cpp
+++ b/indra/newview/llimfloater.cpp
@@ -595,7 +595,7 @@ void LLIMFloater::updateMessages()
 
 			std::string time = msg["time"].asString();
 			LLUUID from_id = msg["from_id"].asUUID();
-			std::string from = from_id != gAgentID ? msg["from"].asString() : LLTrans::getString("You");
+			std::string from = msg["from"].asString();
 			std::string message = msg["message"].asString();
 
 			LLChat chat;
diff --git a/indra/newview/llinspectavatar.cpp b/indra/newview/llinspectavatar.cpp
index 5f9d479b3e3b987673ab43ba5cf5aa235b81bb54..8f4fba244d2b3cbec53a573937a0cf6e932ea218 100644
--- a/indra/newview/llinspectavatar.cpp
+++ b/indra/newview/llinspectavatar.cpp
@@ -278,7 +278,7 @@ void LLInspectAvatar::onOpen(const LLSD& data)
 	
 	getChild<LLUICtrl>("gear_self_btn")->setVisible(self);
 	getChild<LLUICtrl>("gear_btn")->setVisible(!self);
-	
+
 	// Position the inspector relative to the mouse cursor
 	// Similar to how tooltips are positioned
 	// See LLToolTipMgr::createToolTip
@@ -544,6 +544,7 @@ void LLInspectAvatar::updateVolumeSlider()
 
 		LLUICtrl* volume_slider = getChild<LLUICtrl>("volume_slider");
 		volume_slider->setEnabled( !is_muted );
+
 		const F32 DEFAULT_VOLUME = 0.5f;
 		F32 volume;
 		if (is_muted)
diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp
index 2a395d79dcdd990a09ae69c3180ac30c9a2b68e1..20d7f5214bec3472ac0a37e09e1a6b9d79f55462 100644
--- a/indra/newview/llinventorybridge.cpp
+++ b/indra/newview/llinventorybridge.cpp
@@ -2074,7 +2074,12 @@ void LLFolderBridge::performAction(LLFolderView* folder, LLInventoryModel* model
 {
 	if ("open" == action)
 	{
-		openItem();
+		LLFolderViewFolder *f = dynamic_cast<LLFolderViewFolder *>(folder->getItemByID(mUUID));
+		if (f)
+		{
+			f->setOpen(TRUE);
+		}
+		
 		return;
 	}
 	else if ("paste" == action)
diff --git a/indra/newview/llinventorypanel.cpp b/indra/newview/llinventorypanel.cpp
index 498a29728c28d926c4929cd7cbbc9f913093f222..9141d50829c5ec6369d88dd24e5eed489351d611 100644
--- a/indra/newview/llinventorypanel.cpp
+++ b/indra/newview/llinventorypanel.cpp
@@ -98,10 +98,6 @@ LLInventoryPanel::LLInventoryPanel(const LLInventoryPanel::Params& p) :
 	mCommitCallbackRegistrar.add("Inventory.AttachObject", boost::bind(&LLInventoryPanel::attachObject, this, _2));
 	mCommitCallbackRegistrar.add("Inventory.BeginIMSession", boost::bind(&LLInventoryPanel::beginIMSession, this));
 	
-	setBackgroundColor(LLUIColorTable::instance().getColor("InventoryBackgroundColor"));
-	setBackgroundVisible(TRUE);
-	setBackgroundOpaque(TRUE);
-	
 	if (mStartFolderString != "")
 	{
 		mBuildDefaultHierarchy = false;
diff --git a/indra/newview/lllogchat.cpp b/indra/newview/lllogchat.cpp
index fc9654e9adbe3999f5ec1ef8510ac9c1e464f5d5..92f19c9232e3029d0cc30987aaa9594f8536280a 100644
--- a/indra/newview/lllogchat.cpp
+++ b/indra/newview/lllogchat.cpp
@@ -59,9 +59,6 @@ const static std::string NEW_LINE_SPACE_PREFIX("\n ");
 const static std::string TWO_SPACES("  ");
 const static std::string MULTI_LINE_PREFIX(" ");
 
-//viewer 1.23 may have used "You" for Agent's entries
-const static std::string YOU("You");
-
 /**
  *  Chat log lines - timestamp and name are optional but message text is mandatory.
  *
diff --git a/indra/newview/llmanip.cpp b/indra/newview/llmanip.cpp
index f30821cacf08bb990f6d69581e73598347ef2d70..a96240e31ccb7aec5629e7619e6b606da88e17cf 100644
--- a/indra/newview/llmanip.cpp
+++ b/indra/newview/llmanip.cpp
@@ -436,7 +436,7 @@ void LLManip::renderXYZ(const LLVector3 &vec)
 
 	glPushMatrix();
 	{
-		LLUIImagePtr imagep = LLUI::getUIImage("rounded_square.tga");
+		LLUIImagePtr imagep = LLUI::getUIImage("Rounded_Square");
 		gViewerWindow->setup2DRender();
 		const LLVector2& display_scale = gViewerWindow->getDisplayScale();
 		glScalef(display_scale.mV[VX], display_scale.mV[VY], 1.f);
diff --git a/indra/newview/llnearbychat.cpp b/indra/newview/llnearbychat.cpp
index e7043b2d00c742af4ba4ea94d7fce6f876d1cbef..fc0e51b76d1c082d0b16206257c9307d31f8e6de 100644
--- a/indra/newview/llnearbychat.cpp
+++ b/indra/newview/llnearbychat.cpp
@@ -178,7 +178,7 @@ void	LLNearbyChat::addMessage(const LLChat& chat,bool archive)
 	
 	if (!chat.mMuted)
 	{
-		tmp_chat.mFromName = chat.mFromID != gAgentID ? chat.mFromName : LLTrans::getString("You");
+		tmp_chat.mFromName = chat.mFromName;
 
 		if (chat.mChatStyle == CHAT_STYLE_IRC)
 		{
diff --git a/indra/newview/llpanelavatar.cpp b/indra/newview/llpanelavatar.cpp
index f3d6dbbb464cf0d1d3f01e196a1f6d857c3912df..fb898f7cdf6110826e6c0b23daad32d9efb35ab7 100644
--- a/indra/newview/llpanelavatar.cpp
+++ b/indra/newview/llpanelavatar.cpp
@@ -594,8 +594,8 @@ void LLPanelAvatarProfile::processGroupProperties(const LLAvatarGroups* avatar_g
 		if (it != mGroups.begin())
 			groups += ", ";
 
-		
-		std::string group_url="[secondlife:///app/group/" + it->second.asString() + "/about " + it->first + "]";
+		std::string group_name = LLURI::escape(it->first);
+		std::string group_url="[secondlife:///app/group/" + it->second.asString() + "/about " + group_name + "]";
 		groups += group_url;
 	}
 
diff --git a/indra/newview/llpaneloutfitsinventory.cpp b/indra/newview/llpaneloutfitsinventory.cpp
index a1c12412b5ddf8e6ec5a9e4e8daca670cb7bf4e3..550fee71bf51dcd6505c185da94d9b2996c91bdf 100644
--- a/indra/newview/llpaneloutfitsinventory.cpp
+++ b/indra/newview/llpaneloutfitsinventory.cpp
@@ -181,6 +181,10 @@ void LLPanelOutfitsInventory::onNew()
 {
 	const std::string& outfit_name = LLViewerFolderType::lookupNewCategoryName(LLFolderType::FT_OUTFIT);
 	LLUUID outfit_folder = gAgentWearables.makeNewOutfitLinks(outfit_name);
+	if (mAppearanceTabs)
+	{
+		mAppearanceTabs->selectTabByName("outfitslist_tab");
+	}
 }
 
 void LLPanelOutfitsInventory::onSelectionChange(const std::deque<LLFolderViewItem*> &items, BOOL user_action)
@@ -412,8 +416,7 @@ BOOL LLPanelOutfitsInventory::isActionEnabled(const LLSD& userdata)
 		return (getCorrectListenerForAction() != NULL) && hasItemsSelected();
 	}
 	
-	if (command_name == "wear" ||
-		command_name == "make_outfit")
+	if (command_name == "wear")
 	{
 		const BOOL is_my_outfits = (mActivePanel->getName() == "outfitslist_tab");
 		if (!is_my_outfits)
@@ -421,6 +424,10 @@ BOOL LLPanelOutfitsInventory::isActionEnabled(const LLSD& userdata)
 			return FALSE;
 		}
 	}
+	if (command_name == "make_outfit")
+	{
+		return TRUE;
+	}
    
 	if (command_name == "edit" || 
 		command_name == "add"
diff --git a/indra/newview/llpanelvolumepulldown.cpp b/indra/newview/llpanelvolumepulldown.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..74e37efe4e45f0a0fadfddd9fc9457d29803ba5e
--- /dev/null
+++ b/indra/newview/llpanelvolumepulldown.cpp
@@ -0,0 +1,154 @@
+/** 
+ * @file llpanelvolumepulldown.cpp
+ * @author Tofu Linden
+ * @brief A floater showing the master volume pull-down
+ *
+ * $LicenseInfo:firstyear=2008&license=viewergpl$
+ * 
+ * Copyright (c) 2008-2009, Linden Research, Inc.
+ * 
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab.  Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ * 
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ * 
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ * 
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llpanelvolumepulldown.h"
+
+// Viewer libs
+#include "llviewercontrol.h"
+#include "llstatusbar.h"
+
+// Linden libs
+#include "llbutton.h"
+#include "lltabcontainer.h"
+#include "llfloaterreg.h"
+#include "llfloaterpreference.h"
+#include "llslider.h"
+
+/* static */ const F32 LLPanelVolumePulldown::sAutoCloseFadeStartTimeSec = 4.0f;
+/* static */ const F32 LLPanelVolumePulldown::sAutoCloseTotalTimeSec = 5.0f;
+
+///----------------------------------------------------------------------------
+/// Class LLPanelVolumePulldown
+///----------------------------------------------------------------------------
+
+// Default constructor
+LLPanelVolumePulldown::LLPanelVolumePulldown()
+{
+    mCommitCallbackRegistrar.add("Vol.setControlFalse", boost::bind(&LLPanelVolumePulldown::setControlFalse, this, _2));
+	mCommitCallbackRegistrar.add("Vol.GoAudioPrefs", boost::bind(&LLPanelVolumePulldown::onAdvancedButtonClick, this, _2));
+	LLUICtrlFactory::instance().buildPanel(this, "panel_volume_pulldown.xml");
+}
+
+BOOL LLPanelVolumePulldown::postBuild()
+{
+	// set the initial volume-slider's position to reflect reality
+	LLSlider* volslider =  getChild<LLSlider>( "mastervolume" );
+	volslider->setValue(gSavedSettings.getF32("AudioLevelMaster"));
+
+	return LLPanel::postBuild();
+}
+
+/*virtual*/
+void LLPanelVolumePulldown::onMouseEnter(S32 x, S32 y, MASK mask)
+{
+	mHoverTimer.stop();
+	LLPanel::onMouseEnter(x,y,mask);
+}
+
+
+/*virtual*/
+void LLPanelVolumePulldown::onMouseLeave(S32 x, S32 y, MASK mask)
+{
+	mHoverTimer.start();
+	LLPanel::onMouseLeave(x,y,mask);
+}
+
+/*virtual*/ 
+void LLPanelVolumePulldown::handleVisibilityChange ( BOOL new_visibility )
+{
+	if (new_visibility)	
+	{
+		mHoverTimer.start(); // timer will be stopped when mouse hovers over panel
+		gFocusMgr.setTopCtrl(this);
+	}
+	else
+	{
+		mHoverTimer.stop();
+		gFocusMgr.setTopCtrl(NULL);
+	}
+}
+
+/*virtual*/ 
+void LLPanelVolumePulldown::onTopLost()
+{
+	setVisible(FALSE);
+}
+
+void LLPanelVolumePulldown::onAdvancedButtonClick(const LLSD& user_data)
+{
+	// close the global volume minicontrol, we're bringing up the big one
+	setVisible(FALSE);
+
+	// bring up the prefs floater
+	LLFloaterPreference* prefsfloater = dynamic_cast<LLFloaterPreference*>
+		(LLFloaterReg::showInstance("preferences"));
+	if (prefsfloater)
+	{
+		// grab the 'audio' panel from the preferences floater and
+		// bring it the front!
+		LLTabContainer* tabcontainer = prefsfloater->getChild<LLTabContainer>("pref core");
+		LLPanel* audiopanel = prefsfloater->getChild<LLPanel>("audio");
+		if (tabcontainer && audiopanel)
+		{
+			tabcontainer->selectTabPanel(audiopanel);
+		}
+	}
+}
+
+void LLPanelVolumePulldown::setControlFalse(const LLSD& user_data)
+{
+	std::string control_name = user_data.asString();
+	LLControlVariable* control = findControl(control_name);
+	
+	if (control)
+		control->set(LLSD(FALSE));
+}
+
+//virtual
+void LLPanelVolumePulldown::draw()
+{
+	F32 alpha = mHoverTimer.getStarted() 
+		? clamp_rescale(mHoverTimer.getElapsedTimeF32(), sAutoCloseFadeStartTimeSec, sAutoCloseTotalTimeSec, 1.f, 0.f)
+		: 1.0f;
+	LLViewDrawContext context(alpha);
+
+	LLPanel::draw();
+
+	if (alpha == 0.f)
+	{
+		setVisible(FALSE);
+	}
+}
+
diff --git a/indra/newview/llpanelvolumepulldown.h b/indra/newview/llpanelvolumepulldown.h
new file mode 100644
index 0000000000000000000000000000000000000000..9f20caa1a8bd9efcd1eddb131507c1283e36a35e
--- /dev/null
+++ b/indra/newview/llpanelvolumepulldown.h
@@ -0,0 +1,64 @@
+/** 
+ * @file llpanelvolumepulldown.h
+ * @author Tofu Linden
+ * @brief A panel showing the master volume pull-down
+ *
+ * $LicenseInfo:firstyear=2008&license=viewergpl$
+ * 
+ * Copyright (c) 2008-2009, Linden Research, Inc.
+ * 
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab.  Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ * 
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ * 
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ * 
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLPANELVOLUMEPULLDOWN_H
+#define LL_LLPANELVOLUMEPULLDOWN_H
+
+#include "linden_common.h"
+
+#include "llpanel.h"
+
+class LLFrameTimer;
+
+class LLPanelVolumePulldown : public LLPanel
+{
+ public:
+	LLPanelVolumePulldown();
+	/*virtual*/ void draw();
+	/*virtual*/ void onMouseEnter(S32 x, S32 y, MASK mask);
+	/*virtual*/ void onMouseLeave(S32 x, S32 y, MASK mask);
+	/*virtual*/ void handleVisibilityChange ( BOOL new_visibility );
+	/*virtual*/ void onTopLost();
+	/*virtual*/ BOOL postBuild();
+	
+ private:
+	void setControlFalse(const LLSD& user_data);
+	void onAdvancedButtonClick(const LLSD& user_data);
+
+	LLFrameTimer mHoverTimer;
+	static const F32 sAutoCloseFadeStartTimeSec;
+	static const F32 sAutoCloseTotalTimeSec;
+};
+
+
+#endif // LL_LLPANELVOLUMEPULLDOWN_H
diff --git a/indra/newview/llsidepanelappearance.cpp b/indra/newview/llsidepanelappearance.cpp
index 0ae62843acc88614f86314b134269a6b2e36e16a..77a370cc3fc66874ff72a6bb95788e41f9b48bb3 100644
--- a/indra/newview/llsidepanelappearance.cpp
+++ b/indra/newview/llsidepanelappearance.cpp
@@ -62,6 +62,7 @@ class LLCurrentlyWornFetchObserver : public LLInventoryFetchObserver
 	{
 		mPanel->inventoryFetched();
 		gInventory.removeObserver(this);
+		delete this;
 	}
 private:
 	LLSidepanelAppearance *mPanel;
@@ -94,14 +95,12 @@ LLSidepanelAppearance::LLSidepanelAppearance() :
 	mLookInfo(NULL),
 	mCurrOutfitPanel(NULL)
 {
-	//LLUICtrlFactory::getInstance()->buildPanel(this, "panel_appearance.xml"); // Called from LLRegisterPanelClass::defaultPanelClassBuilder()
-	mFetchWorn = new LLCurrentlyWornFetchObserver(this);
-	
-	mOutfitRenameWatcher = new LLWatchForOutfitRenameObserver(this);
 }
 
 LLSidepanelAppearance::~LLSidepanelAppearance()
 {
+	gInventory.removeObserver(mOutfitRenameWatcher);
+	delete mOutfitRenameWatcher;
 }
 
 // virtual
@@ -156,6 +155,7 @@ BOOL LLSidepanelAppearance::postBuild()
 	
 	mCurrOutfitPanel = getChild<LLPanel>("panel_currentlook");
 
+	mOutfitRenameWatcher = new LLWatchForOutfitRenameObserver(this);
 	gInventory.addObserver(mOutfitRenameWatcher);
 
 	return TRUE;
@@ -389,16 +389,17 @@ void LLSidepanelAppearance::fetchInventory()
 		}
 	}
 
-	mFetchWorn->fetchItems(ids);
+	LLCurrentlyWornFetchObserver *fetch_worn = new LLCurrentlyWornFetchObserver(this);
+	fetch_worn->fetchItems(ids);
 	// If no items to be fetched, done will never be triggered.
 	// TODO: Change LLInventoryFetchObserver::fetchItems to trigger done() on this condition.
-	if (mFetchWorn->isEverythingComplete())
+	if (fetch_worn->isEverythingComplete())
 	{
-		mFetchWorn->done();
+		fetch_worn->done();
 	}
 	else
 	{
-		gInventory.addObserver(mFetchWorn);
+		gInventory.addObserver(fetch_worn);
 	}
 }
 
diff --git a/indra/newview/llspatialpartition.cpp b/indra/newview/llspatialpartition.cpp
index 6ca67345984c475b8b87bbc08f859718604b44f6..514d8facb447dfa70dffcbcd3810de70aaa6e488 100644
--- a/indra/newview/llspatialpartition.cpp
+++ b/indra/newview/llspatialpartition.cpp
@@ -2460,7 +2460,6 @@ void renderOctree(LLSpatialGroup* group)
 	gGL.color4fv(col.mV);
 	drawBox(group->mObjectBounds[0], group->mObjectBounds[1]*1.01f+LLVector3(0.001f, 0.001f, 0.001f));
 	
-	glDepthMask(GL_TRUE);
 	gGL.setSceneBlendType(LLRender::BT_ALPHA);
 
 	if (group->mBuilt <= 0.f)
diff --git a/indra/newview/llstatusbar.cpp b/indra/newview/llstatusbar.cpp
index 5ce3bbb9f629f599abc16adc35d97dd4d1394dce..b3b2b9ee5d55e658f4360c743393e2165117122a 100644
--- a/indra/newview/llstatusbar.cpp
+++ b/indra/newview/llstatusbar.cpp
@@ -42,7 +42,7 @@
 #include "llfloaterbuycurrency.h"
 #include "llfloaterchat.h"
 #include "llfloaterlagmeter.h"
-#include "llfloatervolumepulldown.h"
+#include "llpanelvolumepulldown.h"
 #include "llfloaterregioninfo.h"
 #include "llfloaterscriptdebug.h"
 #include "llhudicon.h"
@@ -204,6 +204,21 @@ LLStatusBar::LLStatusBar(const LLRect& rect)
 	addChild(mSGPacketLoss);
 
 	childSetActionTextbox("stat_btn", onClickStatGraph);
+
+	mPanelVolumePulldown = new LLPanelVolumePulldown();
+	addChild(mPanelVolumePulldown);
+
+	LLRect volume_pulldown_rect = mPanelVolumePulldown->getRect();
+	LLButton* volbtn =  getChild<LLButton>( "volume_btn" );
+	volume_pulldown_rect.setLeftTopAndSize(volbtn->getRect().mLeft -
+	     (volume_pulldown_rect.getWidth() - volbtn->getRect().getWidth())/2,
+			       volbtn->calcScreenRect().mBottom,
+			       volume_pulldown_rect.getWidth(),
+			       volume_pulldown_rect.getHeight());
+
+	mPanelVolumePulldown->setShape(volume_pulldown_rect);
+	mPanelVolumePulldown->setFollows(FOLLOWS_TOP|FOLLOWS_RIGHT);
+	mPanelVolumePulldown->setVisible(FALSE);
 }
 
 LLStatusBar::~LLStatusBar()
@@ -501,7 +516,7 @@ static void onClickScriptDebug(void*)
 void LLStatusBar::onMouseEnterVolume(LLUICtrl* ctrl)
 {
 	// show the master volume pull-down
-	LLFloaterReg::showInstance("volume_pulldown");
+	gStatusBar->mPanelVolumePulldown->setVisible(TRUE);
 }
 
 static void onClickVolume(void* data)
diff --git a/indra/newview/llstatusbar.h b/indra/newview/llstatusbar.h
index f77cc1acb863f592a616bee261dfcbfdf946756b..0e98da0fe45ba52e304bbfd2eba3b8e4662db8d5 100644
--- a/indra/newview/llstatusbar.h
+++ b/indra/newview/llstatusbar.h
@@ -112,7 +112,7 @@ class LLStatusBar
 	S32				mSquareMetersCommitted;
 	LLFrameTimer*	mBalanceTimer;
 	LLFrameTimer*	mHealthTimer;
-		
+	LLPanelVolumePulldown* mPanelVolumePulldown;
 	static std::vector<std::string> sDays;
 	static std::vector<std::string> sMonths;
 	static const U32 MAX_DATE_STRING_LENGTH;
diff --git a/indra/newview/llviewerfloaterreg.cpp b/indra/newview/llviewerfloaterreg.cpp
index 23bdbc7381d168295d45ca7e68cd1718fe0462b7..f8d1f34f9d64ed0ff9f744d1c9ed29d19e868448 100644
--- a/indra/newview/llviewerfloaterreg.cpp
+++ b/indra/newview/llviewerfloaterreg.cpp
@@ -106,7 +106,6 @@
 #include "llfloateruipreview.h"
 #include "llfloaterurldisplay.h"
 #include "llfloatervoicedevicesettings.h"
-#include "llfloatervolumepulldown.h"
 #include "llfloaterwater.h"
 #include "llfloaterwhitelistentry.h"
 #include "llfloaterwindlight.h"
@@ -256,7 +255,6 @@ void LLViewerFloaterReg::registerFloaters()
 	LLFloaterReg::add("upload_image", "floater_image_preview.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterImagePreview>, "upload");
 	LLFloaterReg::add("upload_sound", "floater_sound_preview.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSoundPreview>, "upload");
 	
-	LLFloaterReg::add("volume_pulldown", "floater_volume_pulldown.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterVolumePulldown>);
 	LLFloaterReg::add("voice_controls", "floater_voice_controls.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLCallFloater>);
 	
 	LLFloaterReg::add("whitelist_entry", "floater_whitelist_entry.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterWhiteListEntry>);	
diff --git a/indra/newview/llviewermedia.cpp b/indra/newview/llviewermedia.cpp
index 7e8c8eb92ed9079ce8943c2b15bf73cdc5f81b05..9671b9e5dcf0c604595f2ec26478697305a8ad89 100644
--- a/indra/newview/llviewermedia.cpp
+++ b/indra/newview/llviewermedia.cpp
@@ -48,12 +48,15 @@
 #include "llviewerwindow.h"
 #include "llfocusmgr.h"
 #include "llcallbacklist.h"
+#include "llparcel.h"
+#include "llaudioengine.h"  // for gAudiop
 
 #include "llevent.h"		// LLSimpleListener
 #include "llnotificationsutil.h"
 #include "lluuid.h"
 #include "llkeyboard.h"
 #include "llmutelist.h"
+#include "llfirstuse.h"
 
 #include <boost/bind.hpp>	// for SkinFolder listener
 #include <boost/signals2.hpp>
@@ -708,6 +711,8 @@ void LLViewerMedia::updateMedia(void *dummy_arg)
 	
 	std::vector<LLViewerMediaImpl*> proximity_order;
 	
+	bool inworld_media_enabled = gSavedSettings.getBOOL("AudioStreamingMedia");
+	bool needs_first_run = LLViewerMedia::needsMediaFirstRun();
 	U32 max_instances = gSavedSettings.getU32("PluginInstancesTotal");
 	U32 max_normal = gSavedSettings.getU32("PluginInstancesNormal");
 	U32 max_low = gSavedSettings.getU32("PluginInstancesLow");
@@ -822,6 +827,21 @@ void LLViewerMedia::updateMedia(void *dummy_arg)
 			new_priority = LLPluginClassMedia::PRIORITY_LOW;
 		}
 		
+		if(!inworld_media_enabled)
+		{
+			// If inworld media is locked out, force all inworld media to stay unloaded.
+			if(!pimpl->getUsedInUI())
+			{
+				new_priority = LLPluginClassMedia::PRIORITY_UNLOADED;
+				if(needs_first_run)
+				{
+					// Don't do this more than once in this loop.
+					needs_first_run = false;
+					LLViewerMedia::displayMediaFirstRun();
+				}
+			}
+		}
+		
 		pimpl->setPriority(new_priority);
 		
 		if(pimpl->getUsedInUI())
@@ -888,6 +908,61 @@ void LLViewerMedia::cleanupClass()
 	gIdleCallbacks.deleteFunction(LLViewerMedia::updateMedia, NULL);
 }
 
+
+//////////////////////////////////////////////////////////////////////////////////////////
+// static
+bool LLViewerMedia::needsMediaFirstRun()
+{
+	return gWarningSettings.getBOOL("FirstStreamingMedia");
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////
+// static
+void LLViewerMedia::displayMediaFirstRun()
+{
+	gWarningSettings.setBOOL("FirstStreamingMedia", FALSE);
+
+	LLNotificationsUtil::add("ParcelCanPlayMedia", LLSD(), LLSD(),
+		boost::bind(firstRunCallback, _1, _2));
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////
+// static
+bool LLViewerMedia::firstRunCallback(const LLSD& notification, const LLSD& response)
+{
+	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
+	if (option == 0)
+	{
+		// user has elected to automatically play media.
+		gSavedSettings.setBOOL(LLViewerMedia::AUTO_PLAY_MEDIA_SETTING, TRUE);
+		gSavedSettings.setBOOL("AudioStreamingVideo", TRUE);
+		gSavedSettings.setBOOL("AudioStreamingMusic", TRUE);
+		gSavedSettings.setBOOL("AudioStreamingMedia", TRUE);
+
+		LLParcel *parcel = LLViewerParcelMgr::getInstance()->getAgentParcel();
+				
+		if (parcel)
+		{
+			// play media right now, if available
+			LLViewerParcelMedia::play(parcel);
+		
+			// play music right now, if available
+			std::string music_url = parcel->getMusicURL();
+			if (gAudiop && !music_url.empty())
+				gAudiop->startInternetStream(music_url);
+		}
+	}
+	else
+	{
+		gSavedSettings.setBOOL(LLViewerMedia::AUTO_PLAY_MEDIA_SETTING, FALSE);
+		gSavedSettings.setBOOL("AudioStreamingMedia", FALSE);
+		gSavedSettings.setBOOL("AudioStreamingVideo", FALSE);
+		gSavedSettings.setBOOL("AudioStreamingMusic", FALSE);
+	}
+	return false;
+}
+
+
 //////////////////////////////////////////////////////////////////////////////////////////
 // LLViewerMediaImpl
 //////////////////////////////////////////////////////////////////////////////////////////
diff --git a/indra/newview/llviewermedia.h b/indra/newview/llviewermedia.h
index 5e4dd8ff304a317017cce2094e0dd7b4a4c3ebfc..3ce9f1887cfb7244c6d33b4912f84154f8120117 100644
--- a/indra/newview/llviewermedia.h
+++ b/indra/newview/llviewermedia.h
@@ -115,6 +115,12 @@ class LLViewerMedia
 		
 		// This is the comparitor used to sort the list.
 		static bool priorityComparitor(const LLViewerMediaImpl* i1, const LLViewerMediaImpl* i2);
+		
+		// For displaying the media first-run dialog.
+		static bool needsMediaFirstRun();
+		static void displayMediaFirstRun();
+		static bool firstRunCallback(const LLSD& notification, const LLSD& response);
+
 };
 
 // Implementation functions not exported into header file
@@ -123,7 +129,10 @@ class LLViewerMediaImpl
 {
 	LOG_CLASS(LLViewerMediaImpl);
 public:
-
+	
+	friend class LLViewerMedia;
+	friend class LLMimeDiscoveryResponder;
+	
 	LLViewerMediaImpl(
 		const LLUUID& texture_id,
 		S32 media_width, 
@@ -202,11 +211,15 @@ class LLViewerMediaImpl
 	bool isMediaPaused();
 	bool hasMedia() const;
 	bool isMediaFailed() const { return mMediaSourceFailed; };
+	void setMediaFailed(bool val) { mMediaSourceFailed = val; }
 	void resetPreviousMediaState();
 	
 	void setDisabled(bool disabled);
 	bool isMediaDisabled() const { return mIsDisabled; };
-
+	
+	void setInNearbyMediaList(bool in_list) { mInNearbyMediaList = in_list; }
+	bool getInNearbyMediaList() { return mInNearbyMediaList; }
+	
 	// returns true if this instance should not be loaded (disabled, muted object, crashed, etc.)
 	bool isForcedUnloaded() const;
 	
@@ -311,7 +324,7 @@ class LLViewerMediaImpl
 	void setNavState(EMediaNavState state);
 	
 	void cancelMimeTypeProbe();
-public:
+private:
 	// a single media url with some data and an impl.
 	LLPluginClassMedia* mMediaSource;
 	LLUUID mTextureId;
diff --git a/indra/newview/llviewerparcelmedia.cpp b/indra/newview/llviewerparcelmedia.cpp
index 0f7903a7a536e2cb7bd6a9ff6842d386624387e6..56dee6b34c7c95afb5ee3ec34945cefdb39c518f 100644
--- a/indra/newview/llviewerparcelmedia.cpp
+++ b/indra/newview/llviewerparcelmedia.cpp
@@ -56,10 +56,6 @@ LLUUID LLViewerParcelMedia::sMediaRegionID;
 viewer_media_t LLViewerParcelMedia::sMediaImpl;
 
 
-// Local functions
-bool callback_play_media(const LLSD& notification, const LLSD& response, LLParcel* parcel);
-
-
 // static
 void LLViewerParcelMedia::initClass()
 {
@@ -112,12 +108,10 @@ void LLViewerParcelMedia::update(LLParcel* parcel)
 			// First use warning
 			if( (!mediaUrl.empty() ||
 			     !parcel->getMusicURL().empty())
-			    && gWarningSettings.getBOOL("FirstStreamingMedia") )
+			    && LLViewerMedia::needsMediaFirstRun())
 			{
-				LLNotificationsUtil::add("ParcelCanPlayMedia", LLSD(), LLSD(),
-					boost::bind(callback_play_media, _1, _2, parcel));
+				LLViewerMedia::displayMediaFirstRun();
 				return;
-
 			}
 
 			// if we have a current (link sharing) url, use it instead
@@ -591,36 +585,6 @@ void LLViewerParcelMedia::handleMediaEvent(LLPluginClassMedia* self, EMediaEvent
 	};
 }
 
-bool callback_play_media(const LLSD& notification, const LLSD& response, LLParcel* parcel)
-{
-	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
-	if (option == 0)
-	{
-		// user has elected to automatically play media.
-		gSavedSettings.setBOOL(LLViewerMedia::AUTO_PLAY_MEDIA_SETTING, TRUE);
-		gSavedSettings.setBOOL("AudioStreamingVideo", TRUE);
-		gSavedSettings.setBOOL("AudioStreamingMusic", TRUE);
-		if(!gSavedSettings.getBOOL("AudioStreamingMedia")) 
-			gSavedSettings.setBOOL("AudioStreamingMedia", TRUE);
-		// play media right now, if available
-		LLViewerParcelMedia::play(parcel);
-		// play music right now, if available
-		if (parcel)
-		{
-			std::string music_url = parcel->getMusicURL();
-			if (gAudiop && !music_url.empty())
-				gAudiop->startInternetStream(music_url);
-		}
-	}
-	else
-	{
-		gSavedSettings.setBOOL("AudioStreamingVideo", FALSE);
-		gSavedSettings.setBOOL("AudioStreamingMusic", FALSE);
-	}
-	gWarningSettings.setBOOL("FirstStreamingMedia", FALSE);
-	return false;
-}
-
 // TODO: observer
 /*
 void LLViewerParcelMediaNavigationObserver::onNavigateComplete( const EventType& event_in )
diff --git a/indra/newview/llviewerparcelmediaautoplay.cpp b/indra/newview/llviewerparcelmediaautoplay.cpp
index 1b79b4790551f5254c4028232352fcc40a767738..ad2723b66b242f2798ca9fcfeef40446ea6bfed6 100644
--- a/indra/newview/llviewerparcelmediaautoplay.cpp
+++ b/indra/newview/llviewerparcelmediaautoplay.cpp
@@ -35,6 +35,7 @@
 #include "llviewerparcelmedia.h"
 #include "llviewercontrol.h"
 #include "llviewermedia.h"
+#include "llviewerregion.h"
 #include "llparcel.h"
 #include "llviewerparcelmgr.h"
 #include "lluuid.h"
@@ -48,6 +49,8 @@ const F32 AUTOPLAY_SPEED = 0.1f;        // how slow should the agent be moving t
 
 LLViewerParcelMediaAutoPlay::LLViewerParcelMediaAutoPlay() :
 	LLEventTimer(1),
+	
+	mLastParcelID(-1),
 	mPlayed(FALSE),
 	mTimeInParcel(0)
 {
@@ -81,9 +84,18 @@ void LLViewerParcelMediaAutoPlay::playStarted()
 BOOL LLViewerParcelMediaAutoPlay::tick()
 {
 	LLParcel *this_parcel = NULL;
+	LLViewerRegion *this_region = NULL;
 	std::string this_media_url;
 	LLUUID this_media_texture_id;
 	S32 this_parcel_id = 0;
+	LLUUID this_region_id;
+
+	this_region = gAgent.getRegion();
+	
+	if (this_region)
+	{
+		this_region_id = this_region->getRegionID();
+	}
 
 	this_parcel = LLViewerParcelMgr::getInstance()->getAgentParcel();
 
@@ -96,12 +108,14 @@ BOOL LLViewerParcelMediaAutoPlay::tick()
 		this_parcel_id = this_parcel->getLocalID();
 	}
 
-	if (this_parcel_id != mLastParcelID)
+	if (this_parcel_id != mLastParcelID ||
+	    this_region_id != mLastRegionID)
 	{
 		// we've entered a new parcel
 		mPlayed    = FALSE;                   // we haven't autoplayed yet
 		mTimeInParcel = 0;                    // reset our timer
 		mLastParcelID = this_parcel_id;
+		mLastRegionID = this_region_id;
 	}
 
 	mTimeInParcel += mPeriod;                 // increase mTimeInParcel by the amount of time between ticks
diff --git a/indra/newview/llviewerparcelmediaautoplay.h b/indra/newview/llviewerparcelmediaautoplay.h
index 16279e7f1fc40f5df9fcc8b276d69f8960b7e45f..1d80b4756cad6e9b918703cdfb77d8d4c6260ae1 100644
--- a/indra/newview/llviewerparcelmediaautoplay.h
+++ b/indra/newview/llviewerparcelmediaautoplay.h
@@ -34,6 +34,7 @@
 #define LLVIEWERPARCELMEDIAAUTOPLAY_H
 
 #include "lltimer.h"
+#include "lluuid.h"
 
 // timer to automatically play media
 class LLViewerParcelMediaAutoPlay : LLEventTimer
@@ -47,6 +48,7 @@ class LLViewerParcelMediaAutoPlay : LLEventTimer
 
  private:
 	S32 mLastParcelID;
+	LLUUID mLastRegionID;
 	BOOL mPlayed;
 	F32 mTimeInParcel;
 };
diff --git a/indra/newview/llviewertexture.cpp b/indra/newview/llviewertexture.cpp
index f825eaa8ab654e9312b39f0ae185747bc162a311..1edaeec848e914b0f8c402999a84023507e98d85 100644
--- a/indra/newview/llviewertexture.cpp
+++ b/indra/newview/llviewertexture.cpp
@@ -3007,7 +3007,7 @@ void LLViewerMediaTexture::addFace(LLFace* facep)
 	LLViewerTexture::addFace(facep) ;
 
 	const LLTextureEntry* te = facep->getTextureEntry() ;
-	if(te)
+	if(te && te->getID().notNull())
 	{
 		LLViewerTexture* tex = gTextureList.findImage(te->getID()) ;
 		if(tex)
@@ -3024,7 +3024,10 @@ void LLViewerMediaTexture::addFace(LLFace* facep)
 		return ;
 	}
 	
-	llerrs << "The face does not have a valid texture before media texture." << llendl ;
+	if(te && te->getID().notNull()) //should have a texture
+	{
+		llerrs << "The face does not have a valid texture before media texture." << llendl ;
+	}
 }
 
 //virtual 
@@ -3033,7 +3036,7 @@ void LLViewerMediaTexture::removeFace(LLFace* facep)
 	LLViewerTexture::removeFace(facep) ;
 
 	const LLTextureEntry* te = facep->getTextureEntry() ;
-	if(te)
+	if(te && te->getID().notNull())
 	{
 		LLViewerTexture* tex = gTextureList.findImage(te->getID()) ;
 		if(tex)
@@ -3094,7 +3097,10 @@ void LLViewerMediaTexture::removeFace(LLFace* facep)
 		}
 	}
 
-	llerrs << "mTextureList texture reference number is corrupted." << llendl ;
+	if(te && te->getID().notNull()) //should have a texture
+	{
+		llerrs << "mTextureList texture reference number is corrupted." << llendl ;
+	}
 }
 
 void LLViewerMediaTexture::stopPlaying()
@@ -3130,11 +3136,15 @@ void LLViewerMediaTexture::switchTexture(LLFace* facep)
 			const LLTextureEntry* te = facep->getTextureEntry() ;
 			if(te)
 			{
-				LLViewerTexture* tex = gTextureList.findImage(te->getID()) ;
+				LLViewerTexture* tex = te->getID().notNull() ? gTextureList.findImage(te->getID()) : NULL ;
 				if(!tex && te->getID() != mID)//try parcel media.
 				{
 					tex = gTextureList.findImage(mID) ;
 				}
+				if(!tex)
+				{
+					tex = LLViewerFetchedTexture::sDefaultImagep ;
+				}
 				facep->switchTexture(tex) ;
 			}
 		}
diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp
index 55609621b3ac967bd94bc1f44ed8a6c16b27a084..d23bcf9006fbd64ded0e5a6f38428a4899e141b8 100644
--- a/indra/newview/llvovolume.cpp
+++ b/indra/newview/llvovolume.cpp
@@ -1852,12 +1852,22 @@ void LLVOVolume::mediaNavigateBounceBack(U8 texture_index)
 	if (mep && impl)
 	{
         std::string url = mep->getCurrentURL();
-        if (url.empty())
+		// If the url we're trying to "bounce back" to is either empty or not
+		// allowed by the whitelist, try the home url.  If *that* doesn't work,
+		// set the media as failed and unload it
+        if (url.empty() || !mep->checkCandidateUrl(url))
         {
             url = mep->getHomeURL();
         }
-        if (! url.empty())
-        {
+        if (url.empty() || !mep->checkCandidateUrl(url))
+		{
+			// The url to navigate back to is not good, and we have nowhere else
+			// to go.
+			LL_WARNS("MediaOnAPrim") << "FAILED to bounce back URL \"" << url << "\" -- unloading impl" << LL_ENDL;
+			impl->setMediaFailed(true);
+		}
+		else {
+			// Okay, navigate now
             LL_INFOS("MediaOnAPrim") << "bouncing back to URL: " << url << LL_ENDL;
             impl->navigateTo(url, "", false, true);
         }
diff --git a/indra/newview/skins/default/colors.xml b/indra/newview/skins/default/colors.xml
index 887cff56f6bc9329a809de800af5fdc535abb842..6da38fa0d4d9dacc0abe1ebf5426400ae2ebc732 100644
--- a/indra/newview/skins/default/colors.xml
+++ b/indra/newview/skins/default/colors.xml
@@ -292,7 +292,7 @@
      reference="White" />
      <color
      name="FilterBackgroundColor"
-     reference="MouseGray" />
+     reference="Black" />
     <color
      name="FilterTextColor"
      value="0.38 0.69 0.57 1" />
@@ -394,7 +394,10 @@
      reference="White" />
     <color
      name="InventoryBackgroundColor"
-     reference="Unused?" />
+     reference="DkGray2" />
+    <color
+     name="InventoryFocusOutlineColor"
+     reference="EmphasisColor" />
     <color
      name="InventoryItemSuffixColor"
      reference="White_25" />
diff --git a/indra/newview/skins/default/textures/icons/Inv_Landmark.png b/indra/newview/skins/default/textures/icons/Inv_Landmark.png
index f8ce765c501f57cc29993d6a0a90e59c8c6c0cae..76df984596552d5ee42904e65e8955cc1eb1252d 100644
Binary files a/indra/newview/skins/default/textures/icons/Inv_Landmark.png and b/indra/newview/skins/default/textures/icons/Inv_Landmark.png differ
diff --git a/indra/newview/skins/default/textures/taskpanel/TabIcon_Places_Off.png b/indra/newview/skins/default/textures/taskpanel/TabIcon_Places_Off.png
index ada28e01da57f4a4958421ee288f4fdee2c23b47..f5a5f7a846fa32231bde0ab493eaa7803e58c9f1 100644
Binary files a/indra/newview/skins/default/textures/taskpanel/TabIcon_Places_Off.png and b/indra/newview/skins/default/textures/taskpanel/TabIcon_Places_Off.png differ
diff --git a/indra/newview/skins/default/textures/taskpanel/TabIcon_Places_Selected.png b/indra/newview/skins/default/textures/taskpanel/TabIcon_Places_Selected.png
index 0f8d5619ec84a79b790bd502b3dde554e5cfd702..8e0fb9661eac0dc220e55c5fb88f95340ae5c6a8 100644
Binary files a/indra/newview/skins/default/textures/taskpanel/TabIcon_Places_Selected.png and b/indra/newview/skins/default/textures/taskpanel/TabIcon_Places_Selected.png differ
diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml
index 75424e71f522beec84e552bac26e53196991b6b5..dab11149b99825dfc96d7409c87b97c3ba378418 100644
--- a/indra/newview/skins/default/textures/textures.xml
+++ b/indra/newview/skins/default/textures/textures.xml
@@ -167,6 +167,7 @@ with the same filename but different name
 
   <texture name="Flag" file_name="navbar/Flag.png" preload="false" />
 
+  <texture name="Folder_Arrow" file_name="folder_arrow.tga" preload="false" />
   <texture name="ForSale_Badge" file_name="icons/ForSale_Badge.png" preload="false" />
   <texture name="ForwardArrow_Off" file_name="icons/ForwardArrow_Off.png" preload="false" />
   <texture name="ForwardArrow_Press" file_name="icons/ForwardArrow_Press.png" preload="false" />
@@ -439,6 +440,7 @@ with the same filename but different name
 
   <texture name="Resize_Corner" file_name="windows/Resize_Corner.png" preload="true" />
 
+  <texture name="Rounded_Square"	file_name="rounded_square.j2c" preload="true" scale.left="16" scale.top="16" scale.right="112" scale.bottom="16" />
   <texture name="Row_Selection" file_name="navbar/Row_Selection.png" preload="false" />
 
   <texture name="ScrollArrow_Down" file_name="widgets/ScrollArrow_Down.png"	preload="true" scale.left="2" scale.top="13" scale.right="13" scale.bottom="2" />
@@ -676,7 +678,6 @@ with the same filename but different name
   <texture name="toggle_button_selected" file_name="toggle_button_selected.png" preload="true" />
 
   <texture name="sm_rounded_corners_simple.tga" scale.left="4" scale.top="4" scale.bottom="4" scale.right="4" />
-  <texture name="rounded_square.tga"	file_name="rounded_square.j2c" preload="true" scale.left="16" scale.top="16" scale.right="112" scale.bottom="16" />
   <texture name="color_swatch_alpha.tga" preload="true" />
 
   <texture name="button_anim_pause.tga" />
diff --git a/indra/newview/skins/default/xui/en/floater_about.xml b/indra/newview/skins/default/xui/en/floater_about.xml
index 2ff99dcf5acfff1939d3bc55a05b551775f7667d..fac7aef690dbb5b037cca946b90b44f0994e4a3d 100644
--- a/indra/newview/skins/default/xui/en/floater_about.xml
+++ b/indra/newview/skins/default/xui/en/floater_about.xml
@@ -6,7 +6,7 @@
  name="floater_about"
  help_topic="floater_about"
  save_rect="true"
- title="ABOUT [APP_NAME]"
+ title="ABOUT [CAPITALIZED_APP_NAME]"
  width="470">
   <floater.string
      name="AboutHeader">
diff --git a/indra/newview/skins/default/xui/en/floater_avatar_picker.xml b/indra/newview/skins/default/xui/en/floater_avatar_picker.xml
index 953bd08dd41ace4a534528f1de45ddd1e2099eec..f59badfcb4513c7d299d954e6417fc01d0956914 100644
--- a/indra/newview/skins/default/xui/en/floater_avatar_picker.xml
+++ b/indra/newview/skins/default/xui/en/floater_avatar_picker.xml
@@ -47,7 +47,7 @@
          label="Search"
          layout="topleft"
          left="6"
-         help_topic="avatarpicker_search_tab"
+         help_topic="avatarpicker"
          name="SearchPanel"
          top="150"
          width="132">
@@ -98,7 +98,7 @@
          label="Friends"
          layout="topleft"
          left="6"
-         help_topic="avatarpicker_friends_tab"
+         help_topic="avatarpicker"
          name="FriendsPanel"
          top="150"
          width="132">
@@ -144,7 +144,7 @@
          label="Near Me"
          layout="topleft"
          left="6"
-         help_topic="avatarpicker_near_me_tab"
+         help_topic="avatarpicker"
          name="NearMePanel"
          top="150"
          width="132">
diff --git a/indra/newview/skins/default/xui/en/floater_im_container.xml b/indra/newview/skins/default/xui/en/floater_im_container.xml
index cd297af99d3604068d7e786f3a467cab1e1f4d36..ccbba61ddfb576372c8021e693477bb182e1db81 100644
--- a/indra/newview/skins/default/xui/en/floater_im_container.xml
+++ b/indra/newview/skins/default/xui/en/floater_im_container.xml
@@ -9,7 +9,7 @@
  save_rect="true"
  save_visibility="true"
  single_instance="true"
- title="Instant Messages"
+ title="CONVERSATIONS"
  width="392">
     <tab_container
      follows="left|right|top|bottom"
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 920f0c909a7183c5df2cc0b4ebad92cb7bad1071..ae686d9ab7a4dd2da76f31907bbde1ad1adeb520 100644
--- a/indra/newview/skins/default/xui/en/floater_nearby_chat.xml
+++ b/indra/newview/skins/default/xui/en/floater_nearby_chat.xml
@@ -4,8 +4,8 @@
  border_drop_shadow_visible="false"
  drop_shadow_visible="false"
  border="false"
- bg_opaque_image="Inspector_Background"
- bg_alpha_image="Toast_Background"
+ bg_opaque_image="Window_Foreground" 
+ bg_alpha_image="Window_Background" 
  bg_alpha_color="0 0 0 0"
  legacy_header_height="18"
  can_minimize="true"
diff --git a/indra/newview/skins/default/xui/en/floater_voice_controls.xml b/indra/newview/skins/default/xui/en/floater_voice_controls.xml
index a4ef807f069117e696f81d666fcbeb8883a939b2..b9649e9c577bcdd42d31015d466fb1d63f073e3b 100644
--- a/indra/newview/skins/default/xui/en/floater_voice_controls.xml
+++ b/indra/newview/skins/default/xui/en/floater_voice_controls.xml
@@ -8,6 +8,7 @@
  min_height="122"
  min_width="190"
  name="floater_voice_controls"
+ help_topic="floater_voice_controls"
  title="Voice Controls"
  save_visibility="true"
  single_instance="true"
diff --git a/indra/newview/skins/default/xui/en/floater_whitelist_entry.xml b/indra/newview/skins/default/xui/en/floater_whitelist_entry.xml
index 4ece0fa3baea64dbab2af17a326c48b17b750c38..897d959b989f5d38e090d5c08e065248253418df 100644
--- a/indra/newview/skins/default/xui/en/floater_whitelist_entry.xml
+++ b/indra/newview/skins/default/xui/en/floater_whitelist_entry.xml
@@ -5,6 +5,9 @@
  height="108"
  layout="topleft"
  name="whitelist_entry"
+ single_instance="true"
+ help_topic="whitelist_entry"
+ title="WHITELIST ENTRY"
  width="390">
 
   <text type="string" length="1" bottom="20" follows="top|left" height="15" layout="topleft"
diff --git a/indra/newview/skins/default/xui/en/menu_login.xml b/indra/newview/skins/default/xui/en/menu_login.xml
index 690167bc33bab99f25dda03265682d8914dcff5c..a0dec346a4fd4eb5aea8bbfedb02aebe19a1727f 100644
--- a/indra/newview/skins/default/xui/en/menu_login.xml
+++ b/indra/newview/skins/default/xui/en/menu_login.xml
@@ -223,6 +223,7 @@
            parameter="test_inspectors" />
         </menu_item_call>
       </menu>
+<!--
       <menu_item_check
          label="Reg In Client Test (restart)"
          name="Reg In Client Test (restart)">
@@ -232,6 +233,7 @@
                function="ToggleControl"
                parameter="RegInClient" />
       </menu_item_check>
+-->
       <menu_item_separator />
       <menu_item_call
        label="Set Window Size..."
diff --git a/indra/newview/skins/default/xui/en/panel_block_list_sidetray.xml b/indra/newview/skins/default/xui/en/panel_block_list_sidetray.xml
index 970a2e6a8a5a7bf26a23e76e3871c704fe467aa2..003e1baa7ebcde478f9c677f93510ff8d6ae6fd8 100644
--- a/indra/newview/skins/default/xui/en/panel_block_list_sidetray.xml
+++ b/indra/newview/skins/default/xui/en/panel_block_list_sidetray.xml
@@ -5,6 +5,7 @@
  height="305"
  layout="topleft"
  name="block_list_panel"
+ help_topic="blocked_list"
  min_height="350"
  min_width="240"
  width="280">
diff --git a/indra/newview/skins/default/xui/en/panel_landmarks.xml b/indra/newview/skins/default/xui/en/panel_landmarks.xml
index c899dcb750165631fec5f800aae70432df3cd734..039e1ae0864c97f4c4c549c462c225ec0ba10093 100644
--- a/indra/newview/skins/default/xui/en/panel_landmarks.xml
+++ b/indra/newview/skins/default/xui/en/panel_landmarks.xml
@@ -25,7 +25,7 @@
          title="Favorites bar">
             <places_inventory_panel
              allow_multi_select="true"
-             border="true"
+             border="false"
              bottom="0"
              follows="left|top|right|bottom"
              height="126"
@@ -41,7 +41,7 @@
          title="Landmarks">
             <places_inventory_panel
              allow_multi_select="true"
-             border="true"
+             border="false"
              bottom="0"
              follows="left|top|right|bottom"
              height="126"
@@ -57,7 +57,7 @@
          title="My Inventory">
             <places_inventory_panel
              allow_multi_select="true"
-             border="true"
+             border="false"
              bottom="0"
              follows="left|top|right|bottom"
              height="126"
@@ -73,7 +73,7 @@
            title="Library">
             <places_inventory_panel
              allow_multi_select="true"
-             border="true"
+             border="false"
              bottom="0"
              follows="left|top|right|bottom"
              height="120"
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_chat.xml b/indra/newview/skins/default/xui/en/panel_preferences_chat.xml
index 017c3217674a884917314d33eb2a04d789d7e175..6e0b94ac2bf52e4746e044e678ab873f9a10bcb7 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_chat.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_chat.xml
@@ -318,15 +318,15 @@
      height="20"
      width="300"
      top_pad="20">
-     Show IMs in:
+     Show IMs in: (Requires restart)
     </text>
     <radio_group
      height="30"
      layout="topleft"
-     left="30"
+     left_delta="30"
      control_name="ChatWindow"
      name="chat_window"
-     top_pad="10"
+     top_pad="0"
      tool_tip="Show your Instant Messages in separate windows, or in one window with many tabs (Requires restart)"
      width="331">
      <radio_item
@@ -342,10 +342,10 @@
       height="16"
       label="One window"
       layout="topleft"
-      left_delta="145"
+      left_delta="0"
       name="radio2"
       value="1"
-      top_delta="0"
+      top_pad="5"
       width="150" />
     </radio_group>
 </panel>
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml
index f97ccafecc8c8bec92817abf90cebbabd99d37b8..cc00abf5a0d27d46ada423e4625cf17c3c632618 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml
@@ -76,7 +76,7 @@
     <icon
      color="0.12 0.12 0.12 1"
      height="14"
-     image_name="rounded_square.tga"
+     image_name="Rounded_Square"
      layout="topleft"
      left="128"
      name="LowGraphicsDivet"
@@ -85,7 +85,7 @@
     <icon
      color="0.12 0.12 0.12 1"
      height="14"
-     image_name="rounded_square.tga"
+     image_name="Rounded_Square"
      layout="topleft"
      left_pad="83"
      name="MidGraphicsDivet"
@@ -94,7 +94,7 @@
     <icon
      color="0.12 0.12 0.12 1"
      height="14"
-     image_name="rounded_square.tga"
+     image_name="Rounded_Square"
      layout="topleft"
      left_pad="85"
      name="HighGraphicsDivet"
@@ -103,7 +103,7 @@
     <icon
      color="0.12 0.12 0.12 1"
      height="14"
-     image_name="rounded_square.tga"
+     image_name="Rounded_Square"
      layout="topleft"
      left_pad="83"
      name="UltraGraphicsDivet"
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml b/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml
index 5dd93d0f7e6b27b77b0ae782eeabd61fffda2edd..1c1e17eb5a48fd174a3fddfbbed6c2187969871e 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml
@@ -134,18 +134,6 @@
      name="show_timestamps_check_im"
      top_pad="10"
      width="237" />
-    <line_editor
-     bottom="366"
-     control_name="InstantMessageLogFolder"
-     enabled="false"
-     follows="top|left|right"
-     halign="right"
-     height="19"
-     layout="topleft"
-     left_delta="0"
-     mouse_opaque="false"
-     name="log_path_string"
-     top_pad="5" />
     <text
      type="string"
      length="1"
@@ -155,11 +143,23 @@
      left_delta="0"
      mouse_opaque="false"
      name="log_path_desc"
-     top_pad="1"
-     width="128"
-     text_color="LtGray_50">
-        Location of logs
+     top_pad="5"
+     width="128">
+        Location of logs:
     </text>    
+    <line_editor
+     bottom="366"
+     control_name="InstantMessageLogFolder"
+     enabled="false"
+     follows="top|left|right"
+     halign="right"
+     height="23"
+     layout="topleft"
+     left_delta="0"
+     mouse_opaque="false"
+     name="log_path_string"
+     top_pad="5"
+     width="250"/>
     <button
 	 enabled="false"
      follows="right|bottom"
@@ -167,9 +167,9 @@
      label="Browse"
      label_selected="Browse"
      layout="topleft"
-     left_pad="115"
+     left_pad="5"
      name="log_path_button"
-     top_delta="-21"
+     top_delta="0"
      width="145">
         <button.commit_callback
          function="Pref.LogPath" />
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_setup.xml b/indra/newview/skins/default/xui/en/panel_preferences_setup.xml
index 2c60271801b8d8273409d7809d0e3d7b515c099d..f6900cc31c59feab25f47d0087cde00636334129 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_setup.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_setup.xml
@@ -134,20 +134,20 @@
 		 parameter="ChangeConnectionPort" />
     </check_box>
     <spinner
-     control_name="ConnectionPort"
-     enabled_control="ConnectionPortEnabled"
+     control_name="BrowserProxyPort"
+     enabled_control="BrowserProxyEnabled"
 	 decimal_digits="0"
      follows="left|top"
      height="23"
      increment="1"
-     initial_value="13000"
+     initial_value="80"
      label="Port number:"
      label_width="75"
      layout="topleft"
      left_delta="160"
-     max_val="13050"
-     min_val="13000"
-     name="connection_port"
+     max_val="12000"
+     min_val="10"
+     name="web_proxy_port"
      top_delta="-2"
      width="140" />
     <text
@@ -176,7 +176,7 @@
      max_val="1024"
      min_val="32"
      name="cache_size"
-     top_delta="-1"
+     top_delta="-2"
      width="180" />
     <text
      type="string"
@@ -191,6 +191,18 @@
      width="40">
         MB
     </text>
+    <text
+     type="string"
+     length="1"
+     follows="left|top"
+     height="10"
+     layout="topleft"
+     left="80"
+     name="Cache location"
+     top_delta="20"
+     width="300">
+        Cache location:
+    </text>
     <line_editor
      control_name="CacheLocationTopFolder"
      border_style="line"
@@ -199,12 +211,12 @@
      follows="left|top"
      font="SansSerif"
      handle_edit_keys_directly="true"
-     height="20"
+     height="23"
      layout="topleft"
      left="80"
      max_length="4096"
      name="cache_location"
-     top_pad="20"
+     top_pad="5"
      width="205" />
     <button
      follows="left|top"
@@ -232,20 +244,6 @@
         <button.commit_callback
          function="Pref.ResetCache" />
     </button>
-
-    <text
-     type="string"
-     length="1"
-     follows="left|top"
-     height="10"
-     layout="topleft"
-     left="80"
-     name="Cache location"
-     top_delta="20"
-     width="300"
-     text_color="LtGray_50">
-        Cache location
-    </text>
     <text
      type="string"
      length="1"
@@ -296,53 +294,49 @@
      follows="left|top"
      height="16"
      initial_value="false"
-     control_name="BrowserProxyEnabled" 
-     label="Enable Web Proxy"
+     label="Web proxy"
      left_delta="0"
      mouse_opaque="true"
      name="web_proxy_enabled"
      radio_style="false"
-     width="400" />
-    <line_editor
-     control_name="BrowserProxyAddress"
-     enabled_control="BrowserProxyEnabled"
-	 follows="left|top"
-     font="SansSerif"
-     height="20"
-     layout="topleft"
-     left_delta="1"
-     name="web_proxy_editor"
-     tool_tip="The name or IP address of the proxy you would like to use"
-     top_pad="4"
-     width="200" />
+     width="400"
+     top_pad="5"/>
     <text
      type="string"
      length="1"
      follows="left|top"
      height="10"
      layout="topleft"
-     left_delta="0"
+     left_delta="1"
      name="Proxy location"
      top_delta="20"
-     width="300"
-     text_color="LtGray_50">
-        Proxy location
+     width="300">
+        Proxy location:
     </text>
-  <spinner
-     control_name="BrowserProxyPort"
+    <line_editor
+     control_name="BrowserProxyAddress"
      enabled_control="BrowserProxyEnabled"
-	 decimal_digits="0"
+	 follows="left|top"
+     font="SansSerif"
+     height="23"
+     layout="topleft"
+     left_delta="0"
+     name="web_proxy_editor"
+     tool_tip="The name or IP address of the proxy you would like to use"
+     top_pad="4"
+     width="200" />
+    <button
      follows="left|top"
      height="23"
-     increment="1"
-     initial_value="80"
-     label="Port number:"
-     label_width="75"
+     enabled="false"
+     label="Browse"
+     label_selected="Browse"
      layout="topleft"
-     left_delta="230"
-     max_val="12000"
-     min_val="10"
-     name="web_proxy_port"
-     top_delta="-20"
-     width="140" />
-</panel>
+     left_pad="5"
+     name="set_proxy"
+     top_pad="-21"
+     width="100">
+        <button.commit_callback
+         function="Pref.SetCache" />
+    </button>
+  </panel>
diff --git a/indra/newview/skins/default/xui/en/panel_progress.xml b/indra/newview/skins/default/xui/en/panel_progress.xml
index 18c2228906296b8958c7f602ff93ef398b6c85ad..727c5fb7b24f7e21fc8e9f126219edb1587abaee 100644
--- a/indra/newview/skins/default/xui/en/panel_progress.xml
+++ b/indra/newview/skins/default/xui/en/panel_progress.xml
@@ -54,7 +54,7 @@
                      color="LoginProgressBoxCenterColor"
                      follows="left|right|bottom|top"
                      height="250"
-                     image_name="rounded_square.tga"
+                     image_name="Rounded_Square"
                      layout="topleft"
                      left="0"
                      top="0"
diff --git a/indra/newview/skins/default/xui/en/panel_region_texture.xml b/indra/newview/skins/default/xui/en/panel_region_texture.xml
index a4d24cb0fce95fc038916ab548f5d11917180e70..502a5804c3135d9e127973d3efba41736f5365e9 100644
--- a/indra/newview/skins/default/xui/en/panel_region_texture.xml
+++ b/indra/newview/skins/default/xui/en/panel_region_texture.xml
@@ -136,7 +136,7 @@
      layout="topleft"
      left="10"
      name="height_text_lbl5"
-     top="186"
+     top="170"
      width="300">
         Texture Elevation Ranges
     </text>
@@ -146,7 +146,7 @@
      layout="topleft"
      left="51"
      name="height_text_lbl6"
-     top="201"
+     top="185"
      width="100">
         Southwest
     </text>
@@ -171,7 +171,7 @@
     max_val="500"
     min_val="-500"
     name="height_start_spin_0"
-    top_delta="20"
+    top_delta="15"
     width="100" />
   <spinner
    follows="left|top"
@@ -216,9 +216,9 @@
      follows="left|top"
      height="20"
      layout="topleft"
-     left_pad="10"
+     left="51"
      name="height_text_lbl8"
-     top_delta="0"
+     top_pad="10"
      width="100">
         Southeast
     </text>
@@ -243,7 +243,7 @@
        max_val="500"
        min_val="-500"
        name="height_start_spin_2"
-       top_delta="20"
+       top_delta="15"
        width="100" />
       <spinner
        follows="left|top"
@@ -291,9 +291,9 @@
        left="10"
        name="height_text_lbl10"
        top_delta="30"
-       width="270">
-        These values represent the blend range
-        for the textures above.
+       width="400"
+       wrap="true">
+        These values represent the blend range for the textures above.
       </text>
       <text
        follows="left|top"
@@ -302,11 +302,9 @@
        left_delta="0"
        name="height_text_lbl11"
        top_delta="32"
-       width="270">
-        Measured in meters, the LOW value
-        is the MAXIMUM height of Texture #1,
-        and the HIGH value is the MINIMUM
-        height of Texture #4.
+       width="400"
+       wrap="true">
+        Measured in meters, the LOW value is the MAXIMUM height of Texture #1, and the HIGH value is the MINIMUM height of Texture #4.
       </text>
     <button
      enabled="false"
diff --git a/indra/newview/skins/default/xui/en/panel_status_bar.xml b/indra/newview/skins/default/xui/en/panel_status_bar.xml
index 00f54feabde73a4614e4c5e65a191c3e781eccd6..5c9c9b5611b868e886d805e2d36fd4bf2bc1b034 100644
--- a/indra/newview/skins/default/xui/en/panel_status_bar.xml
+++ b/indra/newview/skins/default/xui/en/panel_status_bar.xml
@@ -84,7 +84,6 @@
      tool_tip="Global Volume Control"
      width="16" />
     <text
-     enabled="true"
      follows="right|bottom"
      halign="center"
      height="12"
diff --git a/indra/newview/skins/default/xui/en/panel_volume_pulldown.xml b/indra/newview/skins/default/xui/en/panel_volume_pulldown.xml
new file mode 100644
index 0000000000000000000000000000000000000000..60d4a7e00b5358e2a98314943600550aec8837b8
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_volume_pulldown.xml
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<panel
+ background_opaque="true"
+ background_visible="false"
+ border_visible="false"
+ border="false"
+ chrome="true" 
+ follows="bottom"
+ height="150"
+ layout="topleft"
+ name="volumepulldown_floater"
+ width="32">
+  <!-- floater background image -->
+  <icon
+   height="150"
+   image_name="Inspector_Background"
+   layout="topleft"
+   left="0"
+   name="normal_background"
+   top="0"
+   width="32" />
+ <slider
+  control_name="AudioLevelMaster"
+  follows="left|top"
+  left="0"
+  top="1"
+  orientation="vertical"
+  height="120"
+  increment="0.05"
+  initial_value="0.5"
+  layout="topleft"
+  name="mastervolume"
+  show_text="false"
+  slider_label.halign="right"
+  top_pad="2"
+  volume="true">
+  <slider.commit_callback
+   function="Vol.setControlFalse"
+   parameter="MuteAudio" />
+  </slider>
+  <button
+    left="7"
+    top_pad="9"
+    width="18"
+    height="12"
+    follows="top|left"
+    name="prefs_btn"
+    image_unselected="Icon_Gear_Foreground"
+    image_disabled="Icon_Gear_Background"
+    image_pressed="Icon_Gear_Press"
+    scale_image="false">
+    <button.commit_callback
+       function="Vol.GoAudioPrefs" />
+  </button>
+</panel>
diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml
index 447901f9842b656d6173f8d9b30b96789d4f7ac7..f2f23a3847dc2d6ab8c0b92e04a596d2ee94d793 100644
--- a/indra/newview/skins/default/xui/en/strings.xml
+++ b/indra/newview/skins/default/xui/en/strings.xml
@@ -8,6 +8,7 @@
 	<!-- Default Args - these arguments will be replaced in all strings -->
 	<string name="SECOND_LIFE">Second Life</string>
 	<string name="APP_NAME">Second Life</string>
+	<string name="CAPITALIZED_APP_NAME">SECOND LIFE</string>
 	<string name="SECOND_LIFE_GRID">Second Life Grid</string>
 	<string name="SUPPORT_SITE">Second Life Support Portal</string>
 
diff --git a/indra/newview/skins/default/xui/en/widgets/folder_view_item.xml b/indra/newview/skins/default/xui/en/widgets/folder_view_item.xml
new file mode 100644
index 0000000000000000000000000000000000000000..e6bdcccfdfcb5fbd7dc958a31b542c0b0258f422
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/widgets/folder_view_item.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<folder_view_item
+  folder_arrow_image="Folder_Arrow"
+  folder_indentation="8"
+  item_height="20" 
+  item_top_pad="4"
+  selection_image="Rounded_Square"
+  />
diff --git a/indra/newview/skins/default/xui/en/widgets/inventory_panel.xml b/indra/newview/skins/default/xui/en/widgets/inventory_panel.xml
new file mode 100644
index 0000000000000000000000000000000000000000..93875d66e622778abed0996c4bcc3592d90fe5cb
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/widgets/inventory_panel.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<panel
+  bg_opaque_color="InventoryBackgroundColor"
+  background_visible="true"
+  background_opaque="true"
+  />