diff --git a/indra/llcommon/CMakeLists.txt b/indra/llcommon/CMakeLists.txt
index 9ead183a9e043cc5de702403426dc2fb816d8661..4481d334b27b82b5c6748247b5598e77b6d077d8 100644
--- a/indra/llcommon/CMakeLists.txt
+++ b/indra/llcommon/CMakeLists.txt
@@ -50,6 +50,7 @@ set(llcommon_SOURCE_FILES
     lleventdispatcher.cpp
     lleventfilter.cpp
     llevents.cpp
+    lleventtimer.cpp
     llfasttimer_class.cpp
     llfile.cpp
     llfindlocale.cpp
@@ -164,7 +165,6 @@ set(llcommon_HEADER_FILES
     llhttpstatuscodes.h
     llindexedqueue.h
     llinstancetracker.h
-    llinstancetracker.h
     llkeythrottle.h
     lllazy.h
     lllistenerwrapper.h
diff --git a/indra/llcommon/llapp.cpp b/indra/llcommon/llapp.cpp
index 968b92d1e7ad94b5f21ee45665cf9e32ba9ff073..6b2d1b7c201f0937a52aab2cebdc00fa23c3c173 100644
--- a/indra/llcommon/llapp.cpp
+++ b/indra/llcommon/llapp.cpp
@@ -41,7 +41,7 @@
 #include "lllivefile.h"
 #include "llmemory.h"
 #include "llstl.h" // for DeletePointer()
-#include "lltimer.h"
+#include "lleventtimer.h"
 
 //
 // Signal handling
diff --git a/indra/llcommon/lleventtimer.cpp b/indra/llcommon/lleventtimer.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..d44e7ec1e6875022c66f586c3d6c9cae7ff86794
--- /dev/null
+++ b/indra/llcommon/lleventtimer.cpp
@@ -0,0 +1,95 @@
+/** 
+ * @file lleventtimer.cpp
+ * @brief Cross-platform objects for doing timing 
+ *
+ * $LicenseInfo:firstyear=2000&license=viewergpl$
+ * 
+ * Copyright (c) 2000-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 "lleventtimer.h"
+
+#include "u64.h"
+
+
+//////////////////////////////////////////////////////////////////////////////
+//
+//		LLEventTimer Implementation
+//
+//////////////////////////////////////////////////////////////////////////////
+
+LLEventTimer::LLEventTimer(F32 period)
+: mEventTimer()
+{
+	mPeriod = period;
+}
+
+LLEventTimer::LLEventTimer(const LLDate& time)
+: mEventTimer()
+{
+	mPeriod = (F32)(time.secondsSinceEpoch() - LLDate::now().secondsSinceEpoch());
+}
+
+
+LLEventTimer::~LLEventTimer()
+{
+}
+
+//static
+void LLEventTimer::updateClass() 
+{
+	std::list<LLEventTimer*> completed_timers;
+
+	{
+		LLInstanceTrackerScopedGuard guard;
+		for (instance_iter iter = guard.beginInstances(); iter != guard.endInstances(); ) 
+		{
+			LLEventTimer& timer = *iter++;
+			F32 et = timer.mEventTimer.getElapsedTimeF32();
+			if (timer.mEventTimer.getStarted() && et > timer.mPeriod) {
+				timer.mEventTimer.reset();
+				if ( timer.tick() )
+				{
+					completed_timers.push_back( &timer );
+				}
+			}
+		}
+	}
+
+	if ( completed_timers.size() > 0 )
+	{
+		for (std::list<LLEventTimer*>::iterator completed_iter = completed_timers.begin(); 
+			 completed_iter != completed_timers.end(); 
+			 completed_iter++ ) 
+		{
+			delete *completed_iter;
+		}
+	}
+}
+
+
diff --git a/indra/llcommon/lleventtimer.h b/indra/llcommon/lleventtimer.h
new file mode 100644
index 0000000000000000000000000000000000000000..5181cce52d6ca1de45ef5c055506b829d13a6a7e
--- /dev/null
+++ b/indra/llcommon/lleventtimer.h
@@ -0,0 +1,60 @@
+/** 
+ * @file lleventtimer.h
+ * @brief Cross-platform objects for doing timing 
+ *
+ * $LicenseInfo:firstyear=2000&license=viewergpl$
+ * 
+ * Copyright (c) 2000-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_EVENTTIMER_H					
+#define LL_EVENTTIMER_H
+
+#include "stdtypes.h"
+#include "lldate.h"
+#include "llinstancetracker.h"
+#include "lltimer.h"
+
+// class for scheduling a function to be called at a given frequency (approximate, inprecise)
+class LL_COMMON_API LLEventTimer : protected LLInstanceTracker<LLEventTimer>
+{
+public:
+	LLEventTimer(F32 period);	// period is the amount of time between each call to tick() in seconds
+	LLEventTimer(const LLDate& time);
+	virtual ~LLEventTimer();
+	
+	//function to be called at the supplied frequency
+	// Normally return FALSE; TRUE will delete the timer after the function returns.
+	virtual BOOL tick() = 0;
+
+	static void updateClass();
+
+protected:
+	LLTimer mEventTimer;
+	F32 mPeriod;
+};
+
+#endif //LL_EVENTTIMER_H
diff --git a/indra/llcommon/llfasttimer_class.cpp b/indra/llcommon/llfasttimer_class.cpp
index 6d8d81e114ebae2515af71832a50236d29f715b0..2e5edb1f3b54827aa892aa13b06c82678af30064 100644
--- a/indra/llcommon/llfasttimer_class.cpp
+++ b/indra/llcommon/llfasttimer_class.cpp
@@ -218,9 +218,10 @@ LLFastTimer::DeclareTimer::DeclareTimer(const std::string& name)
 // static
 void LLFastTimer::DeclareTimer::updateCachedPointers()
 {
+	DeclareTimer::LLInstanceTrackerScopedGuard guard;
 	// propagate frame state pointers to timer declarations
-	for (DeclareTimer::instance_iter it = DeclareTimer::beginInstances();
-		it != DeclareTimer::endInstances();
+	for (DeclareTimer::instance_iter it = guard.beginInstances();
+		it != guard.endInstances();
 		++it)
 	{
 		// update cached pointer
@@ -371,20 +372,23 @@ void LLFastTimer::NamedTimer::buildHierarchy()
 	if (sCurFrameIndex < 0 ) return;
 
 	// set up initial tree
-    for (instance_iter it = NamedTimer::beginInstances();
-		it != endInstances();
-		++it)
 	{
-		NamedTimer& timer = *it;
-		if (&timer == NamedTimerFactory::instance().getRootTimer()) continue;
-
-		// bootstrap tree construction by attaching to last timer to be on stack
-		// when this timer was called
-		if (timer.getFrameState().mLastCaller && timer.mParent == NamedTimerFactory::instance().getRootTimer())
+		NamedTimer::LLInstanceTrackerScopedGuard guard;
+		for (instance_iter it = guard.beginInstances();
+		     it != guard.endInstances();
+		     ++it)
 		{
-			timer.setParent(timer.getFrameState().mLastCaller->mTimer);
-			// no need to push up tree on first use, flag can be set spuriously
-			timer.getFrameState().mMoveUpTree = false;
+			NamedTimer& timer = *it;
+			if (&timer == NamedTimerFactory::instance().getRootTimer()) continue;
+			
+			// bootstrap tree construction by attaching to last timer to be on stack
+			// when this timer was called
+			if (timer.getFrameState().mLastCaller && timer.mParent == NamedTimerFactory::instance().getRootTimer())
+			{
+				timer.setParent(timer.getFrameState().mLastCaller->mTimer);
+				// no need to push up tree on first use, flag can be set spuriously
+				timer.getFrameState().mMoveUpTree = false;
+			}
 		}
 	}
 
@@ -486,18 +490,21 @@ void LLFastTimer::NamedTimer::resetFrame()
 		F64 total_time = 0;
 		LLSD sd;
 
-		for (NamedTimer::instance_iter it = NamedTimer::beginInstances();
-					it != NamedTimer::endInstances();
-					++it)
 		{
-			NamedTimer& timer = *it;
-			FrameState& info = timer.getFrameState();
-			sd[timer.getName()]["Time"] = (LLSD::Real) (info.mSelfTimeCounter*iclock_freq);	
-			sd[timer.getName()]["Calls"] = (LLSD::Integer) info.mCalls;
-			
-			// computing total time here because getting the root timer's getCountHistory
-			// doesn't work correctly on the first frame
-			total_time = total_time + info.mSelfTimeCounter * iclock_freq;
+			NamedTimer::LLInstanceTrackerScopedGuard guard;
+			for (NamedTimer::instance_iter it = guard.beginInstances();
+			     it != guard.endInstances();
+			     ++it)
+			{
+				NamedTimer& timer = *it;
+				FrameState& info = timer.getFrameState();
+				sd[timer.getName()]["Time"] = (LLSD::Real) (info.mSelfTimeCounter*iclock_freq);	
+				sd[timer.getName()]["Calls"] = (LLSD::Integer) info.mCalls;
+				
+				// computing total time here because getting the root timer's getCountHistory
+				// doesn't work correctly on the first frame
+				total_time = total_time + info.mSelfTimeCounter * iclock_freq;
+			}
 		}
 
 		sd["Total"]["Time"] = (LLSD::Real) total_time;
@@ -531,21 +538,24 @@ void LLFastTimer::NamedTimer::resetFrame()
 	DeclareTimer::updateCachedPointers();
 
 	// reset for next frame
-	for (NamedTimer::instance_iter it = NamedTimer::beginInstances();
-		it != NamedTimer::endInstances();
-		++it)
 	{
-		NamedTimer& timer = *it;
-
-		FrameState& info = timer.getFrameState();
-		info.mSelfTimeCounter = 0;
-		info.mCalls = 0;
-		info.mLastCaller = NULL;
-		info.mMoveUpTree = false;
-		// update parent pointer in timer state struct
-		if (timer.mParent)
+		NamedTimer::LLInstanceTrackerScopedGuard guard;
+		for (NamedTimer::instance_iter it = guard.beginInstances();
+		     it != guard.endInstances();
+		     ++it)
 		{
-			info.mParent = &timer.mParent->getFrameState();
+			NamedTimer& timer = *it;
+			
+			FrameState& info = timer.getFrameState();
+			info.mSelfTimeCounter = 0;
+			info.mCalls = 0;
+			info.mLastCaller = NULL;
+			info.mMoveUpTree = false;
+			// update parent pointer in timer state struct
+			if (timer.mParent)
+			{
+				info.mParent = &timer.mParent->getFrameState();
+			}
 		}
 	}
 
@@ -575,20 +585,23 @@ void LLFastTimer::NamedTimer::reset()
 	}
 
 	// reset all history
-	for (NamedTimer::instance_iter it = NamedTimer::beginInstances();
-		it != NamedTimer::endInstances();
-		++it)
 	{
-		NamedTimer& timer = *it;
-		if (&timer != NamedTimerFactory::instance().getRootTimer()) 
+		NamedTimer::LLInstanceTrackerScopedGuard guard;
+		for (NamedTimer::instance_iter it = guard.beginInstances();
+		     it != guard.endInstances();
+		     ++it)
 		{
-			timer.setParent(NamedTimerFactory::instance().getRootTimer());
+			NamedTimer& timer = *it;
+			if (&timer != NamedTimerFactory::instance().getRootTimer()) 
+			{
+				timer.setParent(NamedTimerFactory::instance().getRootTimer());
+			}
+			
+			timer.mCountAverage = 0;
+			timer.mCallAverage = 0;
+			memset(timer.mCountHistory, 0, sizeof(U32) * HISTORY_NUM);
+			memset(timer.mCallHistory, 0, sizeof(U32) * HISTORY_NUM);
 		}
-
-		timer.mCountAverage = 0;
-		timer.mCallAverage = 0;
-		memset(timer.mCountHistory, 0, sizeof(U32) * HISTORY_NUM);
-		memset(timer.mCallHistory, 0, sizeof(U32) * HISTORY_NUM);
 	}
 
 	sLastFrameIndex = 0;
diff --git a/indra/llcommon/llinstancetracker.cpp b/indra/llcommon/llinstancetracker.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..c962cb5be1496fba7deb05cecfa4d0afa75c9077
--- /dev/null
+++ b/indra/llcommon/llinstancetracker.cpp
@@ -0,0 +1,20 @@
+/**
+ * @file   lllinstancetracker.cpp
+ * 
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ * Copyright (c) 2009, Linden Research, Inc.
+ * $/LicenseInfo$
+ */
+
+// Precompiled header
+#include "linden_common.h"
+// associated header
+#include "llinstancetracker.h"
+// STL headers
+// std headers
+// external library headers
+// other Linden headers
+
+// llinstancetracker.h is presently header-only. This file exists only because our CMake
+// test macro ADD_BUILD_TEST requires it.
+int dummy = 0;
diff --git a/indra/llcommon/llinstancetracker.h b/indra/llcommon/llinstancetracker.h
index 11fe5236519f3e35f6bbfc720e06b8c15c6e80d3..9df799827338df8592996e23eca511e8ac5f4488 100644
--- a/indra/llcommon/llinstancetracker.h
+++ b/indra/llcommon/llinstancetracker.h
@@ -98,7 +98,10 @@ class LLInstanceTracker : boost::noncopyable
 		mKey = key; 
 		getMap_()[key] = static_cast<T*>(this); 
 	}
-	void remove_() { getMap_().erase(mKey); }
+	void remove_()
+	{
+		getMap_().erase(mKey);
+	}
 
     static InstanceMap& getMap_()
     {
@@ -129,31 +132,65 @@ class LLInstanceTracker<T, T*>
 
 	/// for completeness of analogy with the generic implementation
 	static T* getInstance(T* k) { return k; }
-	static key_iter beginKeys() { return getSet_().begin(); }
-	static key_iter endKeys()   { return getSet_().end(); }
-	static instance_iter beginInstances() { return instance_iter(getSet_().begin()); }
-	static instance_iter endInstances()   { return instance_iter(getSet_().end()); }
 	static S32 instanceCount() { return getSet_().size(); }
 
+	// Instantiate this to get access to iterators for this type.  It's a 'guard' in the sense
+	// that it treats deletes of this type as errors as long as there is an instance of
+	// this class alive in scope somewhere (i.e. deleting while iterating is bad).
+	class LLInstanceTrackerScopedGuard
+	{
+	public:
+		LLInstanceTrackerScopedGuard()
+		{
+			++sIterationNestDepth;
+		}
+
+		~LLInstanceTrackerScopedGuard()
+		{
+			--sIterationNestDepth;
+		}
+
+		static instance_iter beginInstances() {	return instance_iter(getSet_().begin()); }
+		static instance_iter endInstances() { return instance_iter(getSet_().end()); }
+		static key_iter beginKeys() { return getSet_().begin(); }
+		static key_iter endKeys()   { return getSet_().end(); }
+	};
+
 protected:
-	LLInstanceTracker() { getSet_().insert(static_cast<T*>(this)); }
-	virtual ~LLInstanceTracker() { getSet_().erase(static_cast<T*>(this)); }
+	LLInstanceTracker()
+	{
+		// it's safe but unpredictable to create instances of this type while all instances are being iterated over.  I hate unpredictable.  This assert will probably be turned on early in the next development cycle.
+		//llassert(sIterationNestDepth == 0);
+		getSet_().insert(static_cast<T*>(this));
+	}
+	virtual ~LLInstanceTracker()
+	{
+		// it's unsafe to delete instances of this type while all instances are being iterated over.
+		llassert(sIterationNestDepth == 0);
+		getSet_().erase(static_cast<T*>(this));
+	}
 
-	LLInstanceTracker(const LLInstanceTracker& other) { getSet_().insert(static_cast<T*>(this)); }
+	LLInstanceTracker(const LLInstanceTracker& other)
+	{
+		//llassert(sIterationNestDepth == 0);
+		getSet_().insert(static_cast<T*>(this));
+	}
 
-    static InstanceSet& getSet_()   // called after getReady() but before go()
-    {
-        if (! sInstances)
-        {
-            sInstances = new InstanceSet;
-        }
-        return *sInstances;
-    }
+	static InstanceSet& getSet_()
+	{
+		if (! sInstances)
+		{
+			sInstances = new InstanceSet;
+		}
+		return *sInstances;
+	}
 
 	static InstanceSet* sInstances;
+	static S32 sIterationNestDepth;
 };
 
 template <typename T, typename KEY> typename LLInstanceTracker<T, KEY>::InstanceMap* LLInstanceTracker<T, KEY>::sInstances = NULL;
 template <typename T> typename LLInstanceTracker<T, T*>::InstanceSet* LLInstanceTracker<T, T*>::sInstances = NULL;
+template <typename T> S32 LLInstanceTracker<T, T*>::sIterationNestDepth = 0;
 
 #endif
diff --git a/indra/llcommon/lllivefile.cpp b/indra/llcommon/lllivefile.cpp
index effda6c49c281faeebdb77b39152c9c70a474df9..5ca90d82ba782f02d9199ba537716b34f95580eb 100644
--- a/indra/llcommon/lllivefile.cpp
+++ b/indra/llcommon/lllivefile.cpp
@@ -33,7 +33,7 @@
 
 #include "lllivefile.h"
 #include "llframetimer.h"
-#include "lltimer.h"
+#include "lleventtimer.h"
 
 const F32 DEFAULT_CONFIG_FILE_REFRESH = 5.0f;
 
diff --git a/indra/llcommon/lltimer.cpp b/indra/llcommon/lltimer.cpp
index 21e165ebc9967e664ee5cc96fd2665cfdae4ab3e..25b768079ba96ac211d8731da1ae46528146dec0 100644
--- a/indra/llcommon/lltimer.cpp
+++ b/indra/llcommon/lltimer.cpp
@@ -555,60 +555,3 @@ void secondsToTimecodeString(F32 current_time, std::string& tcstring)
 }
 
 
-//////////////////////////////////////////////////////////////////////////////
-//
-//		LLEventTimer Implementation
-//
-//////////////////////////////////////////////////////////////////////////////
-
-LLEventTimer::LLEventTimer(F32 period)
-: mEventTimer()
-{
-	mPeriod = period;
-	mBusy = false;
-}
-
-LLEventTimer::LLEventTimer(const LLDate& time)
-: mEventTimer()
-{
-	mPeriod = (F32)(time.secondsSinceEpoch() - LLDate::now().secondsSinceEpoch());
-	mBusy = false;
-}
-
-
-LLEventTimer::~LLEventTimer()
-{
-	llassert(!mBusy); // this LLEventTimer was destroyed from within its own tick() function - bad.  if you want tick() to cause destruction of its own timer, make it return true.
-}
-
-//static
-void LLEventTimer::updateClass() 
-{
-	std::list<LLEventTimer*> completed_timers;
-	for (instance_iter iter = beginInstances(); iter != endInstances(); ) 
-	{
-		LLEventTimer& timer = *iter++;
-		F32 et = timer.mEventTimer.getElapsedTimeF32();
-		if (timer.mEventTimer.getStarted() && et > timer.mPeriod) {
-			timer.mEventTimer.reset();
-			timer.mBusy = true;
-			if ( timer.tick() )
-			{
-				completed_timers.push_back( &timer );
-			}
-			timer.mBusy = false;
-		}
-	}
-
-	if ( completed_timers.size() > 0 )
-	{
-		for (std::list<LLEventTimer*>::iterator completed_iter = completed_timers.begin(); 
-			 completed_iter != completed_timers.end(); 
-			 completed_iter++ ) 
-		{
-			delete *completed_iter;
-		}
-	}
-}
-
-
diff --git a/indra/llcommon/lltimer.h b/indra/llcommon/lltimer.h
index 4d995d5bba2f2dc8bbdb20dfd4f228f81e69a1f2..baba95bfa1fe1c5324810099cddb5f7e54118e33 100644
--- a/indra/llcommon/lltimer.h
+++ b/indra/llcommon/lltimer.h
@@ -39,8 +39,6 @@
 #include <limits.h>
 
 #include "stdtypes.h"
-#include "lldate.h"
-#include "llinstancetracker.h"
 
 #include <string>
 #include <list>
@@ -171,26 +169,6 @@ LL_COMMON_API struct tm* utc_to_pacific_time(time_t utc_time, BOOL pacific_dayli
 LL_COMMON_API void microsecondsToTimecodeString(U64 current_time, std::string& tcstring);
 LL_COMMON_API void secondsToTimecodeString(F32 current_time, std::string& tcstring);
 
-// class for scheduling a function to be called at a given frequency (approximate, inprecise)
-class LL_COMMON_API LLEventTimer : protected LLInstanceTracker<LLEventTimer>
-{
-public:
-	LLEventTimer(F32 period);	// period is the amount of time between each call to tick() in seconds
-	LLEventTimer(const LLDate& time);
-	virtual ~LLEventTimer();
-	
-	//function to be called at the supplied frequency
-	// Normally return FALSE; TRUE will delete the timer after the function returns.
-	virtual BOOL tick() = 0;
-
-	static void updateClass();
-
-protected:
-	LLTimer mEventTimer;
-	F32 mPeriod;
-	bool mBusy;
-};
-
 U64 LL_COMMON_API totalTime();					// Returns current system time in microseconds
 
 #endif
diff --git a/indra/llcommon/tests/llinstancetracker_test.cpp b/indra/llcommon/tests/llinstancetracker_test.cpp
index 7415f2d33b1eb31eb27853c3abe103b781b9103b..4bb3ec2922b6aef7025a58db440606310667dd7d 100644
--- a/indra/llcommon/tests/llinstancetracker_test.cpp
+++ b/indra/llcommon/tests/llinstancetracker_test.cpp
@@ -138,23 +138,29 @@ namespace tut
         keys.insert(&one);
         keys.insert(&two);
         keys.insert(&three);
-        for (Unkeyed::key_iter ki(Unkeyed::beginKeys()), kend(Unkeyed::endKeys());
-             ki != kend; ++ki)
-        {
-            ensure_equals("spurious key", keys.erase(*ki), 1);
-        }
+	{
+		Unkeyed::LLInstanceTrackerScopedGuard guard;
+		for (Unkeyed::key_iter ki(guard.beginKeys()), kend(guard.endKeys());
+		     ki != kend; ++ki)
+		{
+			ensure_equals("spurious key", keys.erase(*ki), 1);
+		}
+	}
         ensure_equals("unreported key", keys.size(), 0);
 
         KeySet instances;
         instances.insert(&one);
         instances.insert(&two);
         instances.insert(&three);
-        for (Unkeyed::instance_iter ii(Unkeyed::beginInstances()), iend(Unkeyed::endInstances());
-             ii != iend; ++ii)
-        {
-            Unkeyed& ref = *ii;
-            ensure_equals("spurious instance", instances.erase(&ref), 1);
-        }
+	{
+		Unkeyed::LLInstanceTrackerScopedGuard guard;
+		for (Unkeyed::instance_iter ii(guard.beginInstances()), iend(guard.endInstances());
+		     ii != iend; ++ii)
+		{
+			Unkeyed& ref = *ii;
+			ensure_equals("spurious instance", instances.erase(&ref), 1);
+		}
+	}
         ensure_equals("unreported instance", instances.size(), 0);
     }
 } // namespace tut
diff --git a/indra/llimage/llimage.cpp b/indra/llimage/llimage.cpp
index e02be6c8c1495f7a6f287270292807e305ab3e65..5649b4cab7e7eaac7576de253008041cf873174d 100644
--- a/indra/llimage/llimage.cpp
+++ b/indra/llimage/llimage.cpp
@@ -676,9 +676,6 @@ void LLImageRaw::copy(LLImageRaw* src)
 
 	LLImageRaw* dst = this;  // Just for clarity.
 
-	llassert( (3 == src->getComponents()) || (4 == src->getComponents()) );
-	llassert( (3 == dst->getComponents()) || (4 == dst->getComponents()) );
-
 	if( (src->getWidth() == dst->getWidth()) && (src->getHeight() == dst->getHeight()) )
 	{
 		// No scaling needed
diff --git a/indra/llrender/llfontfreetype.cpp b/indra/llrender/llfontfreetype.cpp
index 59e7d890f43229e039427915a517d462cdc2daec..22fad792da32c6fb4974bf3d3d7c1c0dcb73ddad 100644
--- a/indra/llrender/llfontfreetype.cpp
+++ b/indra/llrender/llfontfreetype.cpp
@@ -504,8 +504,13 @@ void LLFontFreetype::resetBitmapCache()
 	mCharGlyphInfoMap.clear();
 	mFontBitmapCachep->reset();
 
-	// Add the empty glyph
-	addGlyphFromFont(this, 0, 0);
+	// Adding default glyph is skipped for fallback fonts here as well as in loadFace(). 
+	// This if was added as fix for EXT-4971.
+	if(!mIsFallback)
+	{
+		// Add the empty glyph
+		addGlyphFromFont(this, 0, 0);
+	}
 }
 
 void LLFontFreetype::destroyGL()
diff --git a/indra/llui/CMakeLists.txt b/indra/llui/CMakeLists.txt
index ce068618e20c5caf1fe891456b9d4d04472362ee..853f6f173d825bc6a44a03243a634bb4984f420b 100644
--- a/indra/llui/CMakeLists.txt
+++ b/indra/llui/CMakeLists.txt
@@ -90,6 +90,7 @@ set(llui_SOURCE_FILES
     lltextbox.cpp
     lltexteditor.cpp
     lltextparser.cpp
+    lltextvalidate.cpp
     lltransutil.cpp
     lltoggleablemenu.cpp
     lltooltip.cpp
@@ -182,6 +183,7 @@ set(llui_HEADER_FILES
     lltextbox.h
     lltexteditor.h
     lltextparser.h
+    lltextvalidate.h
     lltoggleablemenu.h
     lltooltip.h
     lltransutil.h
diff --git a/indra/llui/llbutton.cpp b/indra/llui/llbutton.cpp
index 14b77925f24a2d3c9e6d963186307cd5cfcf1cc1..1d4dc35cee457becd5df32ef4f859bfcaedcbb58 100644
--- a/indra/llui/llbutton.cpp
+++ b/indra/llui/llbutton.cpp
@@ -81,10 +81,9 @@ LLButton::Params::Params()
 	image_pressed_selected("image_pressed_selected"),
 	image_overlay("image_overlay"),
 	image_overlay_alignment("image_overlay_alignment", std::string("center")),
-	image_left_pad("image_left_pad"),
-	image_right_pad("image_right_pad"),
 	image_top_pad("image_top_pad"),
 	image_bottom_pad("image_bottom_pad"),
+	imgoverlay_label_space("imgoverlay_label_space", 1),
 	label_color("label_color"),
 	label_color_selected("label_color_selected"),	// requires is_toggle true
 	label_color_disabled("label_color_disabled"),
@@ -144,10 +143,9 @@ LLButton::LLButton(const LLButton::Params& p)
 	mImageOverlay(p.image_overlay()),
 	mImageOverlayColor(p.image_overlay_color()),
 	mImageOverlayAlignment(LLFontGL::hAlignFromName(p.image_overlay_alignment)),
-	mImageOverlayLeftPad(p.image_left_pad),
-	mImageOverlayRightPad(p.image_right_pad),
 	mImageOverlayTopPad(p.image_top_pad),
 	mImageOverlayBottomPad(p.image_bottom_pad),
+	mImgOverlayLabelSpace(p.imgoverlay_label_space),
 	mIsToggle(p.is_toggle),
 	mScaleImage(p.scale_image),
 	mDropShadowedText(p.label_shadow),
@@ -783,9 +781,9 @@ void LLButton::draw()
 		switch(mImageOverlayAlignment)
 		{
 		case LLFontGL::LEFT:
-			text_left += overlay_width + 1;
+			text_left += overlay_width + mImgOverlayLabelSpace;
 			mImageOverlay->draw(
-				mImageOverlayLeftPad,
+				mLeftHPad,
 				center_y - (overlay_height / 2), 
 				overlay_width, 
 				overlay_height, 
@@ -800,9 +798,9 @@ void LLButton::draw()
 				overlay_color);
 			break;
 		case LLFontGL::RIGHT:
-			text_right -= overlay_width + 1;
+			text_right -= overlay_width + mImgOverlayLabelSpace;
 			mImageOverlay->draw(
-				getRect().getWidth() - mImageOverlayRightPad - overlay_width,
+				getRect().getWidth() - mRightHPad - overlay_width,
 				center_y - (overlay_height / 2), 
 				overlay_width, 
 				overlay_height, 
diff --git a/indra/llui/llbutton.h b/indra/llui/llbutton.h
index 8e5f19602f792875c272191e14768ea25f4d2791..8f35db1007e3fa94206dc491ca47f49b1d0ef56e 100644
--- a/indra/llui/llbutton.h
+++ b/indra/llui/llbutton.h
@@ -107,11 +107,14 @@ class LLButton
 		Optional<S32>			pad_bottom; // under text label
 		
 		//image overlay paddings
-		Optional<S32>			image_left_pad;
-		Optional<S32>			image_right_pad;
 		Optional<S32>			image_top_pad;
 		Optional<S32>			image_bottom_pad;
 
+		/**
+		 * Space between image_overlay and label
+		 */
+		Optional<S32>			imgoverlay_label_space;
+
 		// callbacks
 		Optional<CommitCallbackParam>	click_callback, // alias -> commit_callback
 										mouse_down_callback,
@@ -192,10 +195,6 @@ class LLButton
 	void			setLeftHPad( S32 pad )					{ mLeftHPad = pad; }
 	void			setRightHPad( S32 pad )					{ mRightHPad = pad; }
 
-	void 			setImageOverlayLeftPad( S32 pad )			{ mImageOverlayLeftPad = pad; }
-	S32 			getImageOverlayLeftPad() const				{ return mImageOverlayLeftPad; }
-	void 			setImageOverlayRightPad( S32 pad )			{ mImageOverlayRightPad = pad; }
-	S32 			getImageOverlayRightPad() const				{ return mImageOverlayRightPad; }
 	void 			setImageOverlayTopPad( S32 pad )			{ mImageOverlayTopPad = pad; }
 	S32 			getImageOverlayTopPad() const				{ return mImageOverlayTopPad; }
 	void 			setImageOverlayBottomPad( S32 pad )			{ mImageOverlayBottomPad = pad; }
@@ -328,11 +327,14 @@ class LLButton
 	S32							mRightHPad;
 	S32							mBottomVPad;	// under text label
 
-	S32							mImageOverlayLeftPad;
-	S32							mImageOverlayRightPad;
 	S32							mImageOverlayTopPad;
 	S32							mImageOverlayBottomPad;
 
+	/*
+	 * Space between image_overlay and label
+	 */
+	S32							mImgOverlayLabelSpace;
+
 	F32							mHoverGlowStrength;
 	F32							mCurGlowStrength;
 
diff --git a/indra/llui/lllayoutstack.cpp b/indra/llui/lllayoutstack.cpp
index 1aaba88c49c771501bccd66b34b5e8de8d49a842..dc79550eb47e30703ab6f7424a409232b0e5a8de 100644
--- a/indra/llui/lllayoutstack.cpp
+++ b/indra/llui/lllayoutstack.cpp
@@ -816,7 +816,10 @@ void LLLayoutStack::calcMinExtents()
 //static 
 void LLLayoutStack::updateClass()
 {
-	for (LLLayoutStack::instance_iter it = beginInstances(); it != endInstances(); ++it)
+	LLInstanceTrackerScopedGuard guard;
+	for (LLLayoutStack::instance_iter it = guard.beginInstances();
+	     it != guard.endInstances();
+	     ++it)
 	{
 		it->updateLayout();
 	}
diff --git a/indra/llui/lllineeditor.cpp b/indra/llui/lllineeditor.cpp
index 30b09352d808ce359dffde1a5000acb7a7c8ebc6..483a394bbdbcbb55069dfdbbfe623340fe4ec1d4 100644
--- a/indra/llui/lllineeditor.cpp
+++ b/indra/llui/lllineeditor.cpp
@@ -83,19 +83,6 @@ template class LLLineEditor* LLView::getChild<class LLLineEditor>(
 // Member functions
 //
 
-void LLLineEditor::PrevalidateNamedFuncs::declareValues()
-{
-	declare("ascii", LLLineEditor::prevalidateASCII);
-	declare("float", LLLineEditor::prevalidateFloat);
-	declare("int", LLLineEditor::prevalidateInt);
-	declare("positive_s32", LLLineEditor::prevalidatePositiveS32);
-	declare("non_negative_s32", LLLineEditor::prevalidateNonNegativeS32);
-	declare("alpha_num", LLLineEditor::prevalidateAlphaNum);
-	declare("alpha_num_space", LLLineEditor::prevalidateAlphaNumSpace);
-	declare("ascii_printable_no_pipe", LLLineEditor::prevalidateASCIIPrintableNoPipe);
-	declare("ascii_printable_no_space", LLLineEditor::prevalidateASCIIPrintableNoSpace);
-}
-
 LLLineEditor::Params::Params()
 :	max_length_bytes("max_length", 254),
     keystroke_callback("keystroke_callback"),
@@ -1984,51 +1971,12 @@ void LLLineEditor::setRect(const LLRect& rect)
 	}
 }
 
-void LLLineEditor::setPrevalidate(LLLinePrevalidateFunc func)
+void LLLineEditor::setPrevalidate(LLTextValidate::validate_func_t func)
 {
 	mPrevalidateFunc = func;
 	updateAllowingLanguageInput();
 }
 
-// Limits what characters can be used to [1234567890.-] with [-] only valid in the first position.
-// Does NOT ensure that the string is a well-formed number--that's the job of post-validation--for
-// the simple reasons that intermediate states may be invalid even if the final result is valid.
-// 
-// static
-BOOL LLLineEditor::prevalidateFloat(const LLWString &str)
-{
-	LLLocale locale(LLLocale::USER_LOCALE);
-
-	BOOL success = TRUE;
-	LLWString trimmed = str;
-	LLWStringUtil::trim(trimmed);
-	S32 len = trimmed.length();
-	if( 0 < len )
-	{
-		// May be a comma or period, depending on the locale
-		llwchar decimal_point = (llwchar)LLResMgr::getInstance()->getDecimalPoint();
-
-		S32 i = 0;
-
-		// First character can be a negative sign
-		if( '-' == trimmed[0] )
-		{
-			i++;
-		}
-
-		for( ; i < len; i++ )
-		{
-			if( (decimal_point != trimmed[i] ) && !LLStringOps::isDigit( trimmed[i] ) )
-			{
-				success = FALSE;
-				break;
-			}
-		}
-	}		
-
-	return success;
-}
-
 // static
 BOOL LLLineEditor::postvalidateFloat(const std::string &str)
 {
@@ -2088,223 +2036,6 @@ BOOL LLLineEditor::postvalidateFloat(const std::string &str)
 	return success;
 }
 
-// Limits what characters can be used to [1234567890-] with [-] only valid in the first position.
-// Does NOT ensure that the string is a well-formed number--that's the job of post-validation--for
-// the simple reasons that intermediate states may be invalid even if the final result is valid.
-//
-// static
-BOOL LLLineEditor::prevalidateInt(const LLWString &str)
-{
-	LLLocale locale(LLLocale::USER_LOCALE);
-
-	BOOL success = TRUE;
-	LLWString trimmed = str;
-	LLWStringUtil::trim(trimmed);
-	S32 len = trimmed.length();
-	if( 0 < len )
-	{
-		S32 i = 0;
-
-		// First character can be a negative sign
-		if( '-' == trimmed[0] )
-		{
-			i++;
-		}
-
-		for( ; i < len; i++ )
-		{
-			if( !LLStringOps::isDigit( trimmed[i] ) )
-			{
-				success = FALSE;
-				break;
-			}
-		}
-	}		
-
-	return success;
-}
-
-// static
-BOOL LLLineEditor::prevalidatePositiveS32(const LLWString &str)
-{
-	LLLocale locale(LLLocale::USER_LOCALE);
-
-	LLWString trimmed = str;
-	LLWStringUtil::trim(trimmed);
-	S32 len = trimmed.length();
-	BOOL success = TRUE;
-	if(0 < len)
-	{
-		if(('-' == trimmed[0]) || ('0' == trimmed[0]))
-		{
-			success = FALSE;
-		}
-		S32 i = 0;
-		while(success && (i < len))
-		{
-			if(!LLStringOps::isDigit(trimmed[i++]))
-			{
-				success = FALSE;
-			}
-		}
-	}
-	if (success)
-	{
-		S32 val = strtol(wstring_to_utf8str(trimmed).c_str(), NULL, 10);
-		if (val <= 0)
-		{
-			success = FALSE;
-		}
-	}
-	return success;
-}
-
-BOOL LLLineEditor::prevalidateNonNegativeS32(const LLWString &str)
-{
-	LLLocale locale(LLLocale::USER_LOCALE);
-
-	LLWString trimmed = str;
-	LLWStringUtil::trim(trimmed);
-	S32 len = trimmed.length();
-	BOOL success = TRUE;
-	if(0 < len)
-	{
-		if('-' == trimmed[0])
-		{
-			success = FALSE;
-		}
-		S32 i = 0;
-		while(success && (i < len))
-		{
-			if(!LLStringOps::isDigit(trimmed[i++]))
-			{
-				success = FALSE;
-			}
-		}
-	}
-	if (success)
-	{
-		S32 val = strtol(wstring_to_utf8str(trimmed).c_str(), NULL, 10);
-		if (val < 0)
-		{
-			success = FALSE;
-		}
-	}
-	return success;
-}
-
-BOOL LLLineEditor::prevalidateAlphaNum(const LLWString &str)
-{
-	LLLocale locale(LLLocale::USER_LOCALE);
-
-	BOOL rv = TRUE;
-	S32 len = str.length();
-	if(len == 0) return rv;
-	while(len--)
-	{
-		if( !LLStringOps::isAlnum((char)str[len]) )
-		{
-			rv = FALSE;
-			break;
-		}
-	}
-	return rv;
-}
-
-// static
-BOOL LLLineEditor::prevalidateAlphaNumSpace(const LLWString &str)
-{
-	LLLocale locale(LLLocale::USER_LOCALE);
-
-	BOOL rv = TRUE;
-	S32 len = str.length();
-	if(len == 0) return rv;
-	while(len--)
-	{
-		if(!(LLStringOps::isAlnum((char)str[len]) || (' ' == str[len])))
-		{
-			rv = FALSE;
-			break;
-		}
-	}
-	return rv;
-}
-
-// Used for most names of things stored on the server, due to old file-formats
-// that used the pipe (|) for multiline text storage.  Examples include
-// inventory item names, parcel names, object names, etc.
-// static
-BOOL LLLineEditor::prevalidateASCIIPrintableNoPipe(const LLWString &str)
-{
-	BOOL rv = TRUE;
-	S32 len = str.length();
-	if(len == 0) return rv;
-	while(len--)
-	{
-		llwchar wc = str[len];
-		if (wc < 0x20
-			|| wc > 0x7f
-			|| wc == '|')
-		{
-			rv = FALSE;
-			break;
-		}
-		if(!(wc == ' '
-			 || LLStringOps::isAlnum((char)wc)
-			 || LLStringOps::isPunct((char)wc) ) )
-		{
-			rv = FALSE;
-			break;
-		}
-	}
-	return rv;
-}
-
-
-// Used for avatar names
-// static
-BOOL LLLineEditor::prevalidateASCIIPrintableNoSpace(const LLWString &str)
-{
-	BOOL rv = TRUE;
-	S32 len = str.length();
-	if(len == 0) return rv;
-	while(len--)
-	{
-		llwchar wc = str[len];
-		if (wc < 0x20
-			|| wc > 0x7f
-			|| LLStringOps::isSpace(wc))
-		{
-			rv = FALSE;
-			break;
-		}
-		if( !(LLStringOps::isAlnum((char)str[len]) ||
-		      LLStringOps::isPunct((char)str[len]) ) )
-		{
-			rv = FALSE;
-			break;
-		}
-	}
-	return rv;
-}
-
-
-// static
-BOOL LLLineEditor::prevalidateASCII(const LLWString &str)
-{
-	BOOL rv = TRUE;
-	S32 len = str.length();
-	while(len--)
-	{
-		if (str[len] < 0x20 || str[len] > 0x7f)
-		{
-			rv = FALSE;
-			break;
-		}
-	}
-	return rv;
-}
-
 void LLLineEditor::onMouseCaptureLost()
 {
 	endSelection();
diff --git a/indra/llui/lllineeditor.h b/indra/llui/lllineeditor.h
index f275dfc45aae959f6b0b007c3dc9e2e68d9f50f2..b62138426b9428d7b100298ec2491a34610697ef 100644
--- a/indra/llui/lllineeditor.h
+++ b/indra/llui/lllineeditor.h
@@ -51,27 +51,18 @@
 #include "llviewborder.h"
 
 #include "llpreeditor.h"
-#include <boost/function.hpp>
+#include "lltextvalidate.h"
 
 class LLFontGL;
 class LLLineEditorRollback;
 class LLButton;
 class LLContextMenu;
 
-typedef boost::function<BOOL (const LLWString &wstr)> LLLinePrevalidateFunc;
-
 class LLLineEditor
 : public LLUICtrl, public LLEditMenuHandler, protected LLPreeditor
 {
 public:
 
-	struct PrevalidateNamedFuncs
-	:	public LLInitParam::TypeValuesHelper<LLLinePrevalidateFunc, PrevalidateNamedFuncs>
-
-	{
-		static void declareValues();
-	};
-	
 	typedef boost::function<void (LLLineEditor* caller)> keystroke_callback_t;
 	
 	struct Params : public LLInitParam::Block<Params, LLUICtrl::Params>
@@ -81,7 +72,7 @@ class LLLineEditor
 
 		Optional<keystroke_callback_t>	keystroke_callback;
 
-		Optional<LLLinePrevalidateFunc, PrevalidateNamedFuncs>	prevalidate_callback;
+		Optional<LLTextValidate::validate_func_t, LLTextValidate::ValidateTextNamedFuncs>	prevalidate_callback;
 		
 		Optional<LLViewBorder::Params>	border;
 
@@ -236,17 +227,7 @@ class LLLineEditor
 	void setTextPadding(S32 left, S32 right);
 
 	// Prevalidation controls which keystrokes can affect the editor
-	void			setPrevalidate( LLLinePrevalidateFunc func );
-	static BOOL		prevalidateFloat(const LLWString &str );
-	static BOOL		prevalidateInt(const LLWString &str );
-	static BOOL		prevalidatePositiveS32(const LLWString &str);
-	static BOOL		prevalidateNonNegativeS32(const LLWString &str);
-	static BOOL		prevalidateAlphaNum(const LLWString &str );
-	static BOOL		prevalidateAlphaNumSpace(const LLWString &str );
-	static BOOL		prevalidateASCIIPrintableNoPipe(const LLWString &str); 
-	static BOOL		prevalidateASCIIPrintableNoSpace(const LLWString &str);
-	static BOOL		prevalidateASCII(const LLWString &str);
-
+	void			setPrevalidate( LLTextValidate::validate_func_t func );
 	static BOOL		postvalidateFloat(const std::string &str);
 
 	// line history support:
@@ -326,7 +307,7 @@ class LLLineEditor
 	S32			mLastSelectionStart;
 	S32			mLastSelectionEnd;
 
-	LLLinePrevalidateFunc mPrevalidateFunc;
+	LLTextValidate::validate_func_t mPrevalidateFunc;
 
 	LLFrameTimer mKeystrokeTimer;
 	LLTimer		mTripleClickTimer;
diff --git a/indra/llui/llmultifloater.cpp b/indra/llui/llmultifloater.cpp
index 78738c826dd08a9e3bbd5bc87729716bde4d115a..33d47a3f0e3a955170d42d59b685c2fb34d4b452 100644
--- a/indra/llui/llmultifloater.cpp
+++ b/indra/llui/llmultifloater.cpp
@@ -92,14 +92,6 @@ void LLMultiFloater::draw()
 	}
 	else
 	{
-		for (S32 i = 0; i < mTabContainer->getTabCount(); i++)
-		{
-			LLFloater* floaterp = (LLFloater*)mTabContainer->getPanelByIndex(i);
-			if (floaterp->getShortTitle() != mTabContainer->getPanelTitle(i))
-			{
-				mTabContainer->setPanelTitle(i, floaterp->getShortTitle());
-			}
-		}
 		LLFloater::draw();
 	}
 }
diff --git a/indra/llui/llmultisliderctrl.cpp b/indra/llui/llmultisliderctrl.cpp
index f4434a0f7805501b4b0d63d6639e74da2f9fd2b5..cb81c3910331c074589a7e020bc190232a0fd0d9 100644
--- a/indra/llui/llmultisliderctrl.cpp
+++ b/indra/llui/llmultisliderctrl.cpp
@@ -138,7 +138,7 @@ LLMultiSliderCtrl::LLMultiSliderCtrl(const LLMultiSliderCtrl::Params& p)
 			params.font(p.font);
 			params.max_length_bytes(MAX_STRING_LENGTH);
 			params.commit_callback.function(LLMultiSliderCtrl::onEditorCommit);
-			params.prevalidate_callback(&LLLineEditor::prevalidateFloat);
+			params.prevalidate_callback(&LLTextValidate::validateFloat);
 			params.follows.flags(FOLLOWS_LEFT | FOLLOWS_BOTTOM);
 			mEditor = LLUICtrlFactory::create<LLLineEditor> (params);
 			mEditor->setFocusReceivedCallback( boost::bind(LLMultiSliderCtrl::onEditorGainFocus, _1, this) );
diff --git a/indra/llui/llpanel.cpp b/indra/llui/llpanel.cpp
index 7f23fe2671f4ef033dc8e5326a5577f7518c028f..7b406e090abe144cb626081853ef38e49388c28c 100644
--- a/indra/llui/llpanel.cpp
+++ b/indra/llui/llpanel.cpp
@@ -936,7 +936,7 @@ LLPanel *LLPanel::childGetVisiblePanelWithHelp()
 	return ::childGetVisiblePanelWithHelp(this);
 }
 
-void LLPanel::childSetPrevalidate(const std::string& id, BOOL (*func)(const LLWString &) )
+void LLPanel::childSetPrevalidate(const std::string& id, bool (*func)(const LLWString &) )
 {
 	LLLineEditor* child = findChild<LLLineEditor>(id);
 	if (child)
diff --git a/indra/llui/llpanel.h b/indra/llui/llpanel.h
index 6de83fe3a79ff5ae3caf1fc0a5bf20b8969ff164..4e53fd7ea3779971aec7c6d14d49495bcb8e12f1 100644
--- a/indra/llui/llpanel.h
+++ b/indra/llui/llpanel.h
@@ -226,7 +226,7 @@ class LLPanel : public LLUICtrl
 	std::string childGetText(const std::string& id) const { return childGetValue(id).asString(); }
 
 	// LLLineEditor
-	void childSetPrevalidate(const std::string& id, BOOL (*func)(const LLWString &) );
+	void childSetPrevalidate(const std::string& id, bool (*func)(const LLWString &) );
 
 	// LLButton
 	void childSetAction(const std::string& id, boost::function<void(void*)> function, void* value = NULL);
diff --git a/indra/llui/llsliderctrl.cpp b/indra/llui/llsliderctrl.cpp
index 01c274bb4eb62cb683fd5357a9df50ad43561241..80ee5d098437b40373a4cd15d120b9f4b8451e75 100644
--- a/indra/llui/llsliderctrl.cpp
+++ b/indra/llui/llsliderctrl.cpp
@@ -141,7 +141,7 @@ LLSliderCtrl::LLSliderCtrl(const LLSliderCtrl::Params& p)
 			line_p.rect.setIfNotProvided(text_rect);
 			line_p.font.setIfNotProvided(p.font);
 			line_p.commit_callback.function(&LLSliderCtrl::onEditorCommit);
-			line_p.prevalidate_callback(&LLLineEditor::prevalidateFloat);
+			line_p.prevalidate_callback(&LLTextValidate::validateFloat);
 			mEditor = LLUICtrlFactory::create<LLLineEditor>(line_p);
 
 			mEditor->setFocusReceivedCallback( boost::bind(&LLSliderCtrl::onEditorGainFocus, _1, this ));
diff --git a/indra/llui/llspinctrl.cpp b/indra/llui/llspinctrl.cpp
index 28f3788817a2bc54452e84f240bb7d1fb3ffd042..491cd7b6f37564bd8690e895737e9e6fd7566bbe 100644
--- a/indra/llui/llspinctrl.cpp
+++ b/indra/llui/llspinctrl.cpp
@@ -127,7 +127,7 @@ LLSpinCtrl::LLSpinCtrl(const LLSpinCtrl::Params& p)
 	}
 	params.max_length_bytes(MAX_STRING_LENGTH);
 	params.commit_callback.function((boost::bind(&LLSpinCtrl::onEditorCommit, this, _2)));
-	params.prevalidate_callback(&LLLineEditor::prevalidateFloat);
+	params.prevalidate_callback(&LLTextValidate::validateFloat);
 	params.follows.flags(FOLLOWS_LEFT | FOLLOWS_BOTTOM);
 	mEditor = LLUICtrlFactory::create<LLLineEditor> (params);
 	mEditor->setFocusReceivedCallback( boost::bind(&LLSpinCtrl::onEditorGainFocus, _1, this ));
diff --git a/indra/llui/lltabcontainer.cpp b/indra/llui/lltabcontainer.cpp
index 19408989a535a6e0f60ef82cab3ae4b0f810b94f..ef9d195a19972806300a817bc76325629d8c32da 100644
--- a/indra/llui/lltabcontainer.cpp
+++ b/indra/llui/lltabcontainer.cpp
@@ -1628,15 +1628,11 @@ void LLTabContainer::setTabImage(LLPanel* child, LLIconCtrl* icon)
 void LLTabContainer::reshapeTuple(LLTabTuple* tuple)
 {
 	static LLUICachedControl<S32> tab_padding ("UITabPadding", 0);
-	static LLUICachedControl<S32> image_left_padding ("UIButtonImageLeftPadding", 4);
-	static LLUICachedControl<S32> image_right_padding ("UIButtonImageRightPadding", 4);
 	static LLUICachedControl<S32> image_top_padding ("UIButtonImageTopPadding", 2);
 	static LLUICachedControl<S32> image_bottom_padding ("UIButtonImageBottomPadding", 2);
 
 	if (!mIsVertical)
 	{
-		tuple->mButton->setImageOverlayLeftPad(image_left_padding);
-		tuple->mButton->setImageOverlayRightPad(image_right_padding);
 		tuple->mButton->setImageOverlayTopPad(image_top_padding);
 		tuple->mButton->setImageOverlayBottomPad(image_bottom_padding);
 
diff --git a/indra/llui/lltextbase.cpp b/indra/llui/lltextbase.cpp
index 2b1e2b82268c5e6ff8690d967d704d5196545c1b..b84e6f45fb8a9363a9f7132c75837f346965e7bf 100644
--- a/indra/llui/lltextbase.cpp
+++ b/indra/llui/lltextbase.cpp
@@ -1137,6 +1137,7 @@ void LLTextBase::reflow()
 			line_list_t::iterator iter = std::upper_bound(mLineInfoList.begin(), mLineInfoList.end(), start_index, line_end_compare());
 			line_start_index = iter->mDocIndexStart;
 			line_count = iter->mLineNum;
+			cur_top = iter->mRect.mTop;
 			getSegmentAndOffset(iter->mDocIndexStart, &seg_iter, &seg_offset);
 			mLineInfoList.erase(iter, mLineInfoList.end());
 		}
@@ -1574,8 +1575,10 @@ void LLTextBase::appendText(const std::string &new_text, bool prepend_newline, c
 				{
 					LLStyle::Params icon;
 					icon.image = image;
-					// HACK: fix spacing of images and remove the fixed char spacing
-					appendAndHighlightText("   ", prepend_newline, part, icon);
+					// Text will be replaced during rendering with the icon,
+					// but string cannot be empty or the segment won't be
+					// added (or drawn).
+					appendAndHighlightText(" ", prepend_newline, part, icon);
 					prepend_newline = false;
 				}
 			}
@@ -2296,14 +2299,21 @@ F32 LLNormalTextSegment::draw(S32 start, S32 end, S32 selection_start, S32 selec
 	{
 		if ( mStyle->isImage() && (start >= 0) && (end <= mEnd - mStart))
 		{
+			// ...for images, only render the image, not the underlying text,
+			// which is only a placeholder space
 			LLColor4 color = LLColor4::white % mEditor.getDrawContext().mAlpha;
 			LLUIImagePtr image = mStyle->getImage();
 			S32 style_image_height = image->getHeight();
 			S32 style_image_width = image->getWidth();
-			// Center the image vertically
-			S32 image_bottom = draw_rect.getCenterY() - (style_image_height/2);
+			// Text is drawn from the top of the draw_rect downward
+			S32 text_center = draw_rect.mTop - (mFontHeight / 2);
+			// Align image to center of text
+			S32 image_bottom = text_center - (style_image_height / 2);
 			image->draw(draw_rect.mLeft, image_bottom, 
 				style_image_width, style_image_height, color);
+			
+			const S32 IMAGE_HPAD = 3;
+			return draw_rect.mLeft + style_image_width + IMAGE_HPAD;
 		}
 
 		return drawClippedSegment( getStart() + start, getStart() + end, selection_start, selection_end, draw_rect);
diff --git a/indra/llui/lltexteditor.cpp b/indra/llui/lltexteditor.cpp
index ac5a0376fcb3175083a5634ff9ffbfde1f965eb0..ad9f066539704ccbc3424975186de2fb0d7e52da 100644
--- a/indra/llui/lltexteditor.cpp
+++ b/indra/llui/lltexteditor.cpp
@@ -237,6 +237,7 @@ class LLTextEditor::TextCmdRemove : public LLTextBase::TextCmd
 ///////////////////////////////////////////////////////////////////
 LLTextEditor::Params::Params()
 :	default_text("default_text"),
+	prevalidate_callback("prevalidate_callback"),
 	embedded_items("embedded_items", false),
 	ignore_tab("ignore_tab", true),
 	handle_edit_keys_directly("handle_edit_keys_directly", false),
@@ -244,7 +245,9 @@ LLTextEditor::Params::Params()
 	default_color("default_color"),
     commit_on_focus_lost("commit_on_focus_lost", false),
 	show_context_menu("show_context_menu")
-{}
+{
+	addSynonym(prevalidate_callback, "text_type");
+}
 
 LLTextEditor::LLTextEditor(const LLTextEditor::Params& p) :
 	LLTextBase(p),
@@ -259,6 +262,7 @@ LLTextEditor::LLTextEditor(const LLTextEditor::Params& p) :
 	mMouseDownX(0),
 	mMouseDownY(0),
 	mTabsToNextField(p.ignore_tab),
+	mPrevalidateFunc(p.prevalidate_callback()),
 	mContextMenu(NULL),
 	mShowContextMenu(p.show_context_menu)
 {
@@ -320,6 +324,17 @@ LLTextEditor::~LLTextEditor()
 
 void LLTextEditor::setText(const LLStringExplicit &utf8str, const LLStyle::Params& input_params)
 {
+	// validate incoming text if necessary
+	if (mPrevalidateFunc)
+	{
+		LLWString test_text = utf8str_to_wstring(utf8str);
+		if (!mPrevalidateFunc(test_text))
+		{
+			// not valid text, nothing to do
+			return;
+		}
+	}
+
 	blockUndo();
 	deselect();
 
@@ -911,6 +926,21 @@ S32 LLTextEditor::execute( TextCmd* cmd )
 		// Push the new command is now on the top (front) of the undo stack.
 		mUndoStack.push_front(cmd);
 		mLastCmd = cmd;
+
+		bool need_to_rollback = mPrevalidateFunc 
+								&& !mPrevalidateFunc(getViewModel()->getDisplay());
+		if (need_to_rollback)
+		{
+			// get rid of this last command and clean up undo stack
+			undo();
+
+			// remove any evidence of this command from redo history
+			mUndoStack.pop_front();
+			delete cmd;
+
+			// failure, nothing changed
+			delta = 0;
+		}
 	}
 	else
 	{
@@ -1034,7 +1064,21 @@ S32 LLTextEditor::addChar(S32 pos, llwchar wc)
 	if (mLastCmd && mLastCmd->canExtend(pos))
 	{
 		S32 delta = 0;
+		if (mPrevalidateFunc)
+		{
+			// get a copy of current text contents
+			LLWString test_string(getViewModel()->getDisplay());
+
+			// modify text contents as if this addChar succeeded
+			llassert(pos <= (S32)test_string.size());
+			test_string.insert(pos, 1, wc);
+			if (!mPrevalidateFunc( test_string))
+			{
+				return 0;
+			}
+		}
 		mLastCmd->extendAndExecute(this, pos, wc, &delta);
+
 		return delta;
 	}
 	else
diff --git a/indra/llui/lltexteditor.h b/indra/llui/lltexteditor.h
index d96198d9cee989e85be0564603b9b044b9c56121..00c6a8b68a39c4af30ea59454bb045724656b71f 100644
--- a/indra/llui/lltexteditor.h
+++ b/indra/llui/lltexteditor.h
@@ -44,6 +44,7 @@
 #include "lldarray.h"
 #include "llviewborder.h" // for params
 #include "lltextbase.h"
+#include "lltextvalidate.h"
 
 #include "llpreeditor.h"
 #include "llcontrol.h"
@@ -63,6 +64,7 @@ class LLTextEditor :
 	struct Params : public LLInitParam::Block<Params, LLTextBase::Params>
 	{
 		Optional<std::string>	default_text;
+		Optional<LLTextValidate::validate_func_t, LLTextValidate::ValidateTextNamedFuncs>	prevalidate_callback;
 
 		Optional<bool>			embedded_items,
 								ignore_tab,
@@ -334,6 +336,7 @@ class LLTextEditor :
 	LLCoordGL		mLastIMEPosition;		// Last position of the IME editor
 
 	keystroke_signal_t mKeystrokeSignal;
+	LLTextValidate::validate_func_t mPrevalidateFunc;
 
 	LLContextMenu* mContextMenu;
 }; // end class LLTextEditor
diff --git a/indra/llui/lltextvalidate.cpp b/indra/llui/lltextvalidate.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..8b6bc5bd7da9b3de864526319991511a09ba4dbb
--- /dev/null
+++ b/indra/llui/lltextvalidate.cpp
@@ -0,0 +1,302 @@
+/** 
+ * @file lltextvalidate.cpp
+ * @brief Text validation helper functions
+ *
+ * $LicenseInfo:firstyear=2001&license=viewergpl$
+ * 
+ * Copyright (c) 2001-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$
+ */
+
+// Text editor widget to let users enter a single line.
+
+#include "linden_common.h"
+ 
+#include "lltextvalidate.h"
+#include "llresmgr.h" // for LLLocale
+
+namespace LLTextValidate
+{
+	void ValidateTextNamedFuncs::declareValues()
+	{
+		declare("ascii", validateASCII);
+		declare("float", validateFloat);
+		declare("int", validateInt);
+		declare("positive_s32", validatePositiveS32);
+		declare("non_negative_s32", validateNonNegativeS32);
+		declare("alpha_num", validateAlphaNum);
+		declare("alpha_num_space", validateAlphaNumSpace);
+		declare("ascii_printable_no_pipe", validateASCIIPrintableNoPipe);
+		declare("ascii_printable_no_space", validateASCIIPrintableNoSpace);
+	}
+
+	// Limits what characters can be used to [1234567890.-] with [-] only valid in the first position.
+	// Does NOT ensure that the string is a well-formed number--that's the job of post-validation--for
+	// the simple reasons that intermediate states may be invalid even if the final result is valid.
+	// 
+	bool validateFloat(const LLWString &str)
+	{
+		LLLocale locale(LLLocale::USER_LOCALE);
+
+		bool success = TRUE;
+		LLWString trimmed = str;
+		LLWStringUtil::trim(trimmed);
+		S32 len = trimmed.length();
+		if( 0 < len )
+		{
+			// May be a comma or period, depending on the locale
+			llwchar decimal_point = (llwchar)LLResMgr::getInstance()->getDecimalPoint();
+
+			S32 i = 0;
+
+			// First character can be a negative sign
+			if( '-' == trimmed[0] )
+			{
+				i++;
+			}
+
+			for( ; i < len; i++ )
+			{
+				if( (decimal_point != trimmed[i] ) && !LLStringOps::isDigit( trimmed[i] ) )
+				{
+					success = FALSE;
+					break;
+				}
+			}
+		}		
+
+		return success;
+	}
+
+	// Limits what characters can be used to [1234567890-] with [-] only valid in the first position.
+	// Does NOT ensure that the string is a well-formed number--that's the job of post-validation--for
+	// the simple reasons that intermediate states may be invalid even if the final result is valid.
+	//
+	bool validateInt(const LLWString &str)
+	{
+		LLLocale locale(LLLocale::USER_LOCALE);
+
+		bool success = TRUE;
+		LLWString trimmed = str;
+		LLWStringUtil::trim(trimmed);
+		S32 len = trimmed.length();
+		if( 0 < len )
+		{
+			S32 i = 0;
+
+			// First character can be a negative sign
+			if( '-' == trimmed[0] )
+			{
+				i++;
+			}
+
+			for( ; i < len; i++ )
+			{
+				if( !LLStringOps::isDigit( trimmed[i] ) )
+				{
+					success = FALSE;
+					break;
+				}
+			}
+		}		
+
+		return success;
+	}
+
+	bool validatePositiveS32(const LLWString &str)
+	{
+		LLLocale locale(LLLocale::USER_LOCALE);
+
+		LLWString trimmed = str;
+		LLWStringUtil::trim(trimmed);
+		S32 len = trimmed.length();
+		bool success = TRUE;
+		if(0 < len)
+		{
+			if(('-' == trimmed[0]) || ('0' == trimmed[0]))
+			{
+				success = FALSE;
+			}
+			S32 i = 0;
+			while(success && (i < len))
+			{
+				if(!LLStringOps::isDigit(trimmed[i++]))
+				{
+					success = FALSE;
+				}
+			}
+		}
+		if (success)
+		{
+			S32 val = strtol(wstring_to_utf8str(trimmed).c_str(), NULL, 10);
+			if (val <= 0)
+			{
+				success = FALSE;
+			}
+		}
+		return success;
+	}
+
+	bool validateNonNegativeS32(const LLWString &str)
+	{
+		LLLocale locale(LLLocale::USER_LOCALE);
+
+		LLWString trimmed = str;
+		LLWStringUtil::trim(trimmed);
+		S32 len = trimmed.length();
+		bool success = TRUE;
+		if(0 < len)
+		{
+			if('-' == trimmed[0])
+			{
+				success = FALSE;
+			}
+			S32 i = 0;
+			while(success && (i < len))
+			{
+				if(!LLStringOps::isDigit(trimmed[i++]))
+				{
+					success = FALSE;
+				}
+			}
+		}
+		if (success)
+		{
+			S32 val = strtol(wstring_to_utf8str(trimmed).c_str(), NULL, 10);
+			if (val < 0)
+			{
+				success = FALSE;
+			}
+		}
+		return success;
+	}
+
+	bool validateAlphaNum(const LLWString &str)
+	{
+		LLLocale locale(LLLocale::USER_LOCALE);
+
+		bool rv = TRUE;
+		S32 len = str.length();
+		if(len == 0) return rv;
+		while(len--)
+		{
+			if( !LLStringOps::isAlnum((char)str[len]) )
+			{
+				rv = FALSE;
+				break;
+			}
+		}
+		return rv;
+	}
+
+	bool validateAlphaNumSpace(const LLWString &str)
+	{
+		LLLocale locale(LLLocale::USER_LOCALE);
+
+		bool rv = TRUE;
+		S32 len = str.length();
+		if(len == 0) return rv;
+		while(len--)
+		{
+			if(!(LLStringOps::isAlnum((char)str[len]) || (' ' == str[len])))
+			{
+				rv = FALSE;
+				break;
+			}
+		}
+		return rv;
+	}
+
+	// Used for most names of things stored on the server, due to old file-formats
+	// that used the pipe (|) for multiline text storage.  Examples include
+	// inventory item names, parcel names, object names, etc.
+	bool validateASCIIPrintableNoPipe(const LLWString &str)
+	{
+		bool rv = TRUE;
+		S32 len = str.length();
+		if(len == 0) return rv;
+		while(len--)
+		{
+			llwchar wc = str[len];
+			if (wc < 0x20
+				|| wc > 0x7f
+				|| wc == '|')
+			{
+				rv = FALSE;
+				break;
+			}
+			if(!(wc == ' '
+				 || LLStringOps::isAlnum((char)wc)
+				 || LLStringOps::isPunct((char)wc) ) )
+			{
+				rv = FALSE;
+				break;
+			}
+		}
+		return rv;
+	}
+
+
+	// Used for avatar names
+	bool validateASCIIPrintableNoSpace(const LLWString &str)
+	{
+		bool rv = TRUE;
+		S32 len = str.length();
+		if(len == 0) return rv;
+		while(len--)
+		{
+			llwchar wc = str[len];
+			if (wc < 0x20
+				|| wc > 0x7f
+				|| LLStringOps::isSpace(wc))
+			{
+				rv = FALSE;
+				break;
+			}
+			if( !(LLStringOps::isAlnum((char)str[len]) ||
+				  LLStringOps::isPunct((char)str[len]) ) )
+			{
+				rv = FALSE;
+				break;
+			}
+		}
+		return rv;
+	}
+
+	bool validateASCII(const LLWString &str)
+	{
+		bool rv = TRUE;
+		S32 len = str.length();
+		while(len--)
+		{
+			if (str[len] < 0x20 || str[len] > 0x7f)
+			{
+				rv = FALSE;
+				break;
+			}
+		}
+		return rv;
+	}
+}
diff --git a/indra/llui/lltextvalidate.h b/indra/llui/lltextvalidate.h
new file mode 100644
index 0000000000000000000000000000000000000000..ffb4e85e7ccf90c898313c79dc0fa55a2a8ab1eb
--- /dev/null
+++ b/indra/llui/lltextvalidate.h
@@ -0,0 +1,63 @@
+/** 
+ * @file lltextbase.h
+ * @author Martin Reddy
+ * @brief The base class of text box/editor, providing Url handling support
+ *
+ * $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$
+ */
+
+#ifndef LL_LLTEXTVALIDATE_H
+#define LL_LLTEXTVALIDATE_H
+
+#include "llstring.h"
+#include "llinitparam.h"
+#include <boost/function.hpp>
+
+namespace LLTextValidate
+{
+	typedef boost::function<BOOL (const LLWString &wstr)> validate_func_t;
+
+	struct ValidateTextNamedFuncs
+	:	public LLInitParam::TypeValuesHelper<validate_func_t, ValidateTextNamedFuncs>
+	{
+		static void declareValues();
+	};
+
+	bool	validateFloat(const LLWString &str );
+	bool	validateInt(const LLWString &str );
+	bool	validatePositiveS32(const LLWString &str);
+	bool	validateNonNegativeS32(const LLWString &str);
+	bool	validateAlphaNum(const LLWString &str );
+	bool	validateAlphaNumSpace(const LLWString &str );
+	bool	validateASCIIPrintableNoPipe(const LLWString &str); 
+	bool	validateASCIIPrintableNoSpace(const LLWString &str);
+	bool	validateASCII(const LLWString &str);
+}
+
+
+#endif
diff --git a/indra/llui/lltooltip.h b/indra/llui/lltooltip.h
index 7978b6a583a0e36a7b6fcff1c1fd7d8dc935517c..c0811c56c38d112b624eac64d7511f406c3d8f69 100644
--- a/indra/llui/lltooltip.h
+++ b/indra/llui/lltooltip.h
@@ -129,7 +129,8 @@ class LLToolTip : public LLPanel
 class LLInspector : public LLToolTip
 {
 public:
-	struct Params : public LLInitParam::Block<Params, LLToolTip::Params> {};
+	struct Params : public LLInitParam::Block<Params, LLToolTip::Params> 
+	{};
 };
 
 class LLToolTipMgr : public LLSingleton<LLToolTipMgr>
diff --git a/indra/llui/llview.cpp b/indra/llui/llview.cpp
index f1b08c380b5ff79f9c2907ffea1162f193e820e9..63e627ceb5aa7080ed071d971c95e163d8167b5c 100644
--- a/indra/llui/llview.cpp
+++ b/indra/llui/llview.cpp
@@ -1720,6 +1720,7 @@ LLView* LLView::findChildView(const std::string& name, BOOL recurse) const
 	for ( child_it = mChildList.begin(); child_it != mChildList.end(); ++child_it)
 	{
 		LLView* childp = *child_it;
+		llassert(childp);
 		if (childp->getName() == name)
 		{
 			return childp;
@@ -1731,6 +1732,7 @@ LLView* LLView::findChildView(const std::string& name, BOOL recurse) const
 		for ( child_it = mChildList.begin(); child_it != mChildList.end(); ++child_it)
 		{
 			LLView* childp = *child_it;
+			llassert(childp);
 			LLView* viewp = childp->findChildView(name, recurse);
 			if ( viewp )
 			{
diff --git a/indra/llwindow/CMakeLists.txt b/indra/llwindow/CMakeLists.txt
index 77c6fa57b6c7185e8bb3d5c826db0bf55638b2cf..bf3233f3862635f5872d7b12ba30b6bd45bc2362 100644
--- a/indra/llwindow/CMakeLists.txt
+++ b/indra/llwindow/CMakeLists.txt
@@ -113,6 +113,7 @@ if (WINDOWS)
        )
   list(APPEND llwindow_LINK_LIBRARIES
        comdlg32     # Common Dialogs for ChooseColor
+       ole32
        )
 endif (WINDOWS)
 
diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index 923ba44906d60f1344e0ccdbfbbcb50b8e6918aa..a32f0d046e926bceeb47a3d896e9c5124de56555 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -9938,28 +9938,6 @@
       <key>Value</key>
       <integer>15</integer>
     </map>
-    <key>UIButtonImageLeftPadding</key>
-    <map>
-      <key>Comment</key>
-      <string>Button Overlay Image Left Padding</string>
-      <key>Persist</key>
-      <integer>1</integer>
-      <key>Type</key>
-      <string>S32</string>
-      <key>Value</key>
-      <integer>4</integer>
-    </map>
-    <key>UIButtonImageRightPadding</key>
-    <map>
-      <key>Comment</key>
-      <string>Button Overlay Image Right Padding</string>
-      <key>Persist</key>
-      <integer>1</integer>
-      <key>Type</key>
-      <string>S32</string>
-      <key>Value</key>
-      <integer>4</integer>
-    </map>
     <key>UIButtonImageTopPadding</key>
     <map>
       <key>Comment</key>
diff --git a/indra/newview/llagentwearables.cpp b/indra/newview/llagentwearables.cpp
index 7cbd7e46a9f35e33afc2c2e8e3c462031e90d9af..d560331392e84438784da798864efc717469803e 100644
--- a/indra/newview/llagentwearables.cpp
+++ b/indra/newview/llagentwearables.cpp
@@ -1412,7 +1412,7 @@ LLUUID LLAgentWearables::makeNewOutfitLinks(const std::string& new_folder_name)
 		new_folder_name);
 
 	LLPointer<LLInventoryCallback> cb = new LLShowCreatedOutfit(folder_id);
-	LLAppearanceManager::instance().shallowCopyCategory(LLAppearanceManager::instance().getCOF(),folder_id, cb);
+	LLAppearanceManager::instance().shallowCopyCategoryContents(LLAppearanceManager::instance().getCOF(),folder_id, cb);
 	LLAppearanceManager::instance().createBaseOutfitLink(folder_id, cb);
 
 	return folder_id;
@@ -2329,7 +2329,7 @@ void LLLibraryOutfitsFetch::libraryDone(void)
 			LLUUID folder_id = gInventory.createNewCategory(mImportedClothingID,
 															LLFolderType::FT_NONE,
 															iter->second);
-			LLAppearanceManager::getInstance()->shallowCopyCategory(iter->first, folder_id, copy_waiter);
+			LLAppearanceManager::getInstance()->shallowCopyCategoryContents(iter->first, folder_id, copy_waiter);
 		}
 	}
 	else
diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp
index 326fc41c1e3ca570dfe15fee035658445460c489..0cceba6cb004d39939b7aff1e54e0f89be212a7f 100644
--- a/indra/newview/llappearancemgr.cpp
+++ b/indra/newview/llappearancemgr.cpp
@@ -48,6 +48,31 @@
 #include "llviewerregion.h"
 #include "llwearablelist.h"
 
+LLUUID findDescendentCategoryIDByName(const LLUUID& parent_id,const std::string& name)
+{
+	LLInventoryModel::cat_array_t cat_array;
+	LLInventoryModel::item_array_t item_array;
+	LLNameCategoryCollector has_name(name);
+	gInventory.collectDescendentsIf(parent_id,
+									cat_array,
+									item_array,
+									LLInventoryModel::EXCLUDE_TRASH,
+									has_name);
+	if (0 == cat_array.count())
+		return LLUUID();
+	else
+	{
+		LLViewerInventoryCategory *cat = cat_array.get(0);
+		if (cat)
+			return cat->getUUID();
+		else
+		{
+			llwarns << "null cat" << llendl;
+			return LLUUID();
+		}
+	}
+}
+
 // support for secondlife:///app/appearance SLapps
 class LLAppearanceHandler : public LLCommandHandler
 {
@@ -519,8 +544,32 @@ void LLAppearanceManager::changeOutfit(bool proceed, const LLUUID& category, boo
 	LLAppearanceManager::instance().updateCOF(category,append);
 }
 
+// Create a copy of src_id + contents as a subfolder of dst_id.
 void LLAppearanceManager::shallowCopyCategory(const LLUUID& src_id, const LLUUID& dst_id,
 											  LLPointer<LLInventoryCallback> cb)
+{
+	LLInventoryCategory *src_cat = gInventory.getCategory(src_id);
+	if (!src_cat)
+	{
+		llwarns << "folder not found for src " << src_id.asString() << llendl;
+		return;
+	}
+	LLUUID parent_id = dst_id;
+	if(parent_id.isNull())
+	{
+		parent_id = gInventory.getRootFolderID();
+	}
+	LLUUID subfolder_id = gInventory.createNewCategory( parent_id,
+														LLFolderType::FT_NONE,
+														src_cat->getName());
+	shallowCopyCategoryContents(src_id, subfolder_id, cb);
+
+	gInventory.notifyObservers();
+}
+
+// Copy contents of src_id to dst_id.
+void LLAppearanceManager::shallowCopyCategoryContents(const LLUUID& src_id, const LLUUID& dst_id,
+													  LLPointer<LLInventoryCallback> cb)
 {
 	LLInventoryModel::cat_array_t cats;
 	LLInventoryModel::item_array_t items;
diff --git a/indra/newview/llappearancemgr.h b/indra/newview/llappearancemgr.h
index 38d1e01d08521e0309b2432744bde7c909773b33..5fdff45735c37aeb4684c2ddb9ed8a30b0dba93e 100644
--- a/indra/newview/llappearancemgr.h
+++ b/indra/newview/llappearancemgr.h
@@ -35,6 +35,8 @@
 
 #include "llsingleton.h"
 #include "llinventorymodel.h"
+#include "llinventoryobserver.h"
+#include "llviewerinventory.h"
 #include "llcallbacklist.h"
 
 class LLWearable;
@@ -54,10 +56,14 @@ class LLAppearanceManager: public LLSingleton<LLAppearanceManager>
 	void wearOutfitByName(const std::string& name);
 	void changeOutfit(bool proceed, const LLUUID& category, bool append);
 
-	// Copy all items in a category.
+	// Copy all items and the src category itself.
 	void shallowCopyCategory(const LLUUID& src_id, const LLUUID& dst_id,
 							 LLPointer<LLInventoryCallback> cb);
 
+	// Copy all items in a category.
+	void shallowCopyCategoryContents(const LLUUID& src_id, const LLUUID& dst_id,
+									 LLPointer<LLInventoryCallback> cb);
+
 	// Find the Current Outfit folder.
 	const LLUUID getCOF() const;
 
@@ -144,6 +150,8 @@ class LLAppearanceManager: public LLSingleton<LLAppearanceManager>
 
 #define SUPPORT_ENSEMBLES 0
 
+LLUUID findDescendentCategoryIDByName(const LLUUID& parent_id,const std::string& name);
+
 // Shim class and template function to allow arbitrary boost::bind
 // expressions to be run as one-time idle callbacks.
 template <typename T>
@@ -212,4 +220,103 @@ void doOnIdleRepeating(T callable)
 	gIdleCallbacks.addFunction(&OnIdleCallbackRepeating<T>::onIdle,cb_functor);
 }
 
+template <class T>
+class CallAfterCategoryFetchStage2: public LLInventoryFetchObserver
+{
+public:
+	CallAfterCategoryFetchStage2(T callable):
+		mCallable(callable)
+	{
+	}
+	~CallAfterCategoryFetchStage2()
+	{
+	}
+	virtual void done()
+	{
+		gInventory.removeObserver(this);
+		doOnIdle(mCallable);
+		delete this;
+	}
+protected:
+	T mCallable;
+};
+
+template <class T>
+class CallAfterCategoryFetchStage1: public LLInventoryFetchDescendentsObserver
+{
+public:
+	CallAfterCategoryFetchStage1(T callable):
+		mCallable(callable)
+	{
+	}
+	~CallAfterCategoryFetchStage1()
+	{
+	}
+	virtual void done()
+	{
+		// What we do here is get the complete information on the items in
+		// the library, and set up an observer that will wait for that to
+		// happen.
+		LLInventoryModel::cat_array_t cat_array;
+		LLInventoryModel::item_array_t item_array;
+		gInventory.collectDescendents(mCompleteFolders.front(),
+									  cat_array,
+									  item_array,
+									  LLInventoryModel::EXCLUDE_TRASH);
+		S32 count = item_array.count();
+		if(!count)
+		{
+			llwarns << "Nothing fetched in category " << mCompleteFolders.front()
+					<< llendl;
+			//dec_busy_count();
+			gInventory.removeObserver(this);
+			delete this;
+			return;
+		}
+
+		CallAfterCategoryFetchStage2<T> *stage2 = new CallAfterCategoryFetchStage2<T>(mCallable);
+		LLInventoryFetchObserver::item_ref_t ids;
+		for(S32 i = 0; i < count; ++i)
+		{
+			ids.push_back(item_array.get(i)->getUUID());
+		}
+		
+		gInventory.removeObserver(this);
+		
+		// do the fetch
+		stage2->fetchItems(ids);
+		if(stage2->isEverythingComplete())
+		{
+			// everything is already here - call done.
+			stage2->done();
+		}
+		else
+		{
+			// it's all on it's way - add an observer, and the inventory
+			// will call done for us when everything is here.
+			gInventory.addObserver(stage2);
+		}
+		delete this;
+	}
+protected:
+	T mCallable;
+};
+
+template <class T> 
+void callAfterCategoryFetch(const LLUUID& cat_id, T callable)
+{
+	CallAfterCategoryFetchStage1<T> *stage1 = new CallAfterCategoryFetchStage1<T>(callable);
+	LLInventoryFetchDescendentsObserver::folder_ref_t folders;
+	folders.push_back(cat_id);
+	stage1->fetchDescendents(folders);
+	if (stage1->isEverythingComplete())
+	{
+		stage1->done();
+	}
+	else
+	{
+		gInventory.addObserver(stage1);
+	}
+}
+
 #endif
diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp
index 2d694eefd350a8ab2e71f114463c4700b0c00cc5..98ec9078863ed13d3e59f2cab98840f579c975cc 100644
--- a/indra/newview/llappviewer.cpp
+++ b/indra/newview/llappviewer.cpp
@@ -40,6 +40,7 @@
 #include "lluictrlfactory.h"
 #include "lltexteditor.h"
 #include "llerrorcontrol.h"
+#include "lleventtimer.h"
 #include "llviewertexturelist.h"
 #include "llgroupmgr.h"
 #include "llagent.h"
@@ -1353,9 +1354,6 @@ bool LLAppViewer::cleanup()
 
 	llinfos << "Cache files removed" << llendflush;
 
-
-	cleanup_menus();
-
 	// Wait for any pending VFS IO
 	while (1)
 	{
@@ -2365,9 +2363,6 @@ bool LLAppViewer::initWindow()
 	// store setting in a global for easy access and modification
 	gNoRender = gSavedSettings.getBOOL("DisableRendering");
 
-	// Hide the splash screen
-	LLSplashScreen::hide();
-
 	// always start windowed
 	BOOL ignorePixelDepth = gSavedSettings.getBOOL("IgnorePixelDepth");
 	gViewerWindow = new LLViewerWindow(gWindowTitle, 
diff --git a/indra/newview/llappviewer.h b/indra/newview/llappviewer.h
index a011c5ebfd6f60683b50b37f20161a8ae6b60f84..a915b7fa50c8da0dc88223b4b9d4ed5fce9cc1a8 100644
--- a/indra/newview/llappviewer.h
+++ b/indra/newview/llappviewer.h
@@ -36,6 +36,7 @@
 #include "llallocator.h"
 #include "llcontrol.h"
 #include "llsys.h"			// for LLOSInfo
+#include "lltimer.h"
 
 class LLCommandLineParser;
 class LLFrameTimer;
diff --git a/indra/newview/llcallfloater.cpp b/indra/newview/llcallfloater.cpp
index d405c1bbc141304468be19ca6e9dd9737f938428..97a5c3b8e22d14bdd5863f67688af99dcf41273d 100644
--- a/indra/newview/llcallfloater.cpp
+++ b/indra/newview/llcallfloater.cpp
@@ -678,8 +678,7 @@ void LLCallFloater::resetVoiceRemoveTimers()
 
 void LLCallFloater::removeVoiceRemoveTimer(const LLUUID& voice_speaker_id)
 {
-	bool delete_it = true;
-	mSpeakerDelayRemover->unsetActionTimer(voice_speaker_id, delete_it);
+	mSpeakerDelayRemover->unsetActionTimer(voice_speaker_id);
 }
 
 bool LLCallFloater::validateSpeaker(const LLUUID& speaker_id)
diff --git a/indra/newview/llchathistory.cpp b/indra/newview/llchathistory.cpp
index f046e088277367b6148651951cfbfc281eb83f54..929457046cee1c1d7ba6c253b8e279b00e445c35 100644
--- a/indra/newview/llchathistory.cpp
+++ b/indra/newview/llchathistory.cpp
@@ -262,7 +262,7 @@ class LLChatHistoryHeader: public LLPanel
 			mSourceType = CHAT_SOURCE_SYSTEM;
 		}
 
-		LLTextEditor* userName = getChild<LLTextEditor>("user_name");
+		LLTextBox* userName = getChild<LLTextBox>("user_name");
 
 		userName->setReadOnlyColor(style_params.readonly_color());
 		userName->setColor(style_params.color());
@@ -300,7 +300,7 @@ class LLChatHistoryHeader: public LLPanel
 
 	/*virtual*/ void draw()
 	{
-		LLTextEditor* user_name = getChild<LLTextEditor>("user_name");
+		LLTextBox* user_name = getChild<LLTextBox>("user_name");
 		LLTextBox* time_box = getChild<LLTextBox>("time_box");
 
 		LLRect user_name_rect = user_name->getRect();
@@ -444,6 +444,7 @@ LLChatHistory::LLChatHistory(const LLChatHistory::Params& p)
 	editor_params.rect = getLocalRect();
 	editor_params.follows.flags = FOLLOWS_ALL;
 	editor_params.enabled = false; // read only
+	editor_params.show_context_menu = "true";
 	mEditor = LLUICtrlFactory::create<LLTextEditor>(editor_params, this);
 }
 
diff --git a/indra/newview/llchiclet.cpp b/indra/newview/llchiclet.cpp
index 18bd7b725f3a855dd45b2bfe70e5dbceb5c87ebf..8efa814a2eb1b95f38eda7f252634e73571610ad 100644
--- a/indra/newview/llchiclet.cpp
+++ b/indra/newview/llchiclet.cpp
@@ -36,6 +36,7 @@
 #include "llagent.h"
 #include "llavataractions.h"
 #include "llbottomtray.h"
+#include "lleventtimer.h"
 #include "llgroupactions.h"
 #include "lliconctrl.h"
 #include "llimfloater.h"
@@ -1158,10 +1159,10 @@ void im_chiclet_callback(LLChicletPanel* panel, const LLSD& data){
 
 void object_chiclet_callback(const LLSD& data)
 {
-	LLUUID object_id = data["object_id"];
+	LLUUID notification_id = data["notification_id"];
 	bool new_message = data["new_message"];
 
-	std::list<LLChiclet*> chiclets = LLIMChiclet::sFindChicletsSignal(object_id);
+	std::list<LLChiclet*> chiclets = LLIMChiclet::sFindChicletsSignal(notification_id);
 	std::list<LLChiclet *>::iterator iter;
 	for (iter = chiclets.begin(); iter != chiclets.end(); iter++)
 	{
@@ -1893,12 +1894,8 @@ void LLScriptChiclet::setSessionId(const LLUUID& session_id)
 	setShowNewMessagesIcon( getSessionId() != session_id );
 
 	LLIMChiclet::setSessionId(session_id);
-	LLUUID notification_id = LLScriptFloaterManager::getInstance()->findNotificationId(session_id);
-	LLNotificationPtr notification = LLNotifications::getInstance()->find(notification_id);
-	if(notification)
-	{
-		setToolTip(notification->getSubstitutions()["TITLE"].asString());
-	}
+
+	setToolTip(LLScriptFloaterManager::getObjectName(session_id));
 }
 
 void LLScriptChiclet::setCounter(S32 counter)
@@ -1947,13 +1944,10 @@ void LLInvOfferChiclet::setSessionId(const LLUUID& session_id)
 {
 	setShowNewMessagesIcon( getSessionId() != session_id );
 
+	setToolTip(LLScriptFloaterManager::getObjectName(session_id));
+
 	LLIMChiclet::setSessionId(session_id);
-	LLUUID notification_id = LLScriptFloaterManager::getInstance()->findNotificationId(session_id);
-	LLNotificationPtr notification = LLNotifications::getInstance()->find(notification_id);
-	if(notification)
-	{
-		setToolTip(notification->getSubstitutions()["TITLE"].asString());
-	}
+	LLNotificationPtr notification = LLNotifications::getInstance()->find(session_id);
 
 	if ( notification && notification->getName() == INVENTORY_USER_OFFER )
 	{
diff --git a/indra/newview/llcurrencyuimanager.cpp b/indra/newview/llcurrencyuimanager.cpp
index 00c05445e1a632276e4d5e0bc4243e625e7a1866..be6c15eab4a036be7548f0913d48c09aaf8f4a2e 100644
--- a/indra/newview/llcurrencyuimanager.cpp
+++ b/indra/newview/llcurrencyuimanager.cpp
@@ -426,7 +426,7 @@ void LLCurrencyUIManager::Impl::prepare()
 	LLLineEditor* lindenAmount = mPanel.getChild<LLLineEditor>("currency_amt");
 	if (lindenAmount)
 	{
-		lindenAmount->setPrevalidate(LLLineEditor::prevalidateNonNegativeS32);
+		lindenAmount->setPrevalidate(LLTextValidate::validateNonNegativeS32);
 		lindenAmount->setKeystrokeCallback(onCurrencyKey, this);
 	}
 }
diff --git a/indra/newview/lleventpoll.cpp b/indra/newview/lleventpoll.cpp
index eca9f8aba258295e5fb1236970d3cff9b414d15f..cc4e1a186844eecbea764f29df89cd1cb87f50ff 100644
--- a/indra/newview/lleventpoll.cpp
+++ b/indra/newview/lleventpoll.cpp
@@ -39,7 +39,7 @@
 #include "llhttpclient.h"
 #include "llhttpstatuscodes.h"
 #include "llsdserialize.h"
-#include "lltimer.h"
+#include "lleventtimer.h"
 #include "llviewerregion.h"
 #include "message.h"
 #include "lltrans.h"
diff --git a/indra/newview/llfloatercamera.cpp b/indra/newview/llfloatercamera.cpp
index 9496e947803d3d4db8f48dd419ab7928263337e4..ecb6254f8a6e0817349c4ad493dde983bb914022 100644
--- a/indra/newview/llfloatercamera.cpp
+++ b/indra/newview/llfloatercamera.cpp
@@ -65,7 +65,7 @@ class LLPanelCameraZoom
 	LLPanelCameraZoom();
 
 	/* virtual */ BOOL	postBuild();
-	/* virtual */ void	onOpen(const LLSD& key);
+	/* virtual */ void	draw();
 
 protected:
 	void	onZoomPlusHeldDown();
@@ -73,7 +73,6 @@ class LLPanelCameraZoom
 	void	onSliderValueChanged();
 
 private:
-	F32			mSavedSliderVal;
 	LLButton*	mPlusBtn;
 	LLButton*	mMinusBtn;
 	LLSlider*	mSlider;
@@ -88,8 +87,7 @@ static LLRegisterPanelClassWrapper<LLPanelCameraZoom> t_camera_zoom_panel("camer
 LLPanelCameraZoom::LLPanelCameraZoom()
 :	mPlusBtn( NULL ),
 	mMinusBtn( NULL ),
-	mSlider( NULL ),
-	mSavedSliderVal(0.f)
+	mSlider( NULL )
 {
 	mCommitCallbackRegistrar.add("Zoom.minus", boost::bind(&LLPanelCameraZoom::onZoomPlusHeldDown, this));
 	mCommitCallbackRegistrar.add("Zoom.plus", boost::bind(&LLPanelCameraZoom::onZoomMinusHeldDown, this));
@@ -101,16 +99,13 @@ BOOL LLPanelCameraZoom::postBuild()
 	mPlusBtn  = getChild <LLButton> ("zoom_plus_btn");
 	mMinusBtn = getChild <LLButton> ("zoom_minus_btn");
 	mSlider   = getChild <LLSlider> ("zoom_slider");
-	mSlider->setMinValue(.0f);
-	mSlider->setMaxValue(8.f);
 	return LLPanel::postBuild();
 }
 
-void LLPanelCameraZoom::onOpen(const LLSD& key)
+void LLPanelCameraZoom::draw()
 {
-	LLVector3d to_focus = gAgent.getPosGlobalFromAgent(LLViewerCamera::getInstance()->getOrigin()) - gAgent.calcFocusPositionTargetGlobal();
-	mSavedSliderVal = 8.f - (F32)to_focus.magVec(); // maximum minus current
-	mSlider->setValue( mSavedSliderVal );
+	mSlider->setValue(gAgent.getCameraZoomFraction());
+	LLPanel::draw();
 }
 
 void LLPanelCameraZoom::onZoomPlusHeldDown()
@@ -135,13 +130,8 @@ void LLPanelCameraZoom::onZoomMinusHeldDown()
 
 void  LLPanelCameraZoom::onSliderValueChanged()
 {
-	F32 val	 = mSlider->getValueF32();
-	F32 rate = val - mSavedSliderVal;
-
-	gAgent.unlockView();
-	gAgent.cameraOrbitIn(rate);
-
-	mSavedSliderVal = val;
+	F32 zoom_level = mSlider->getValueF32();
+	gAgent.setCameraZoomFraction(zoom_level);
 }
 
 void activate_camera_tool()
diff --git a/indra/newview/llfloaterfriends.cpp b/indra/newview/llfloaterfriends.cpp
index ccc5cab85a52a3c7e3c022a10e58dcb87c712dd9..4e2633d750a5f4b34ec37b42b39ba7da9f75e45f 100644
--- a/indra/newview/llfloaterfriends.cpp
+++ b/indra/newview/llfloaterfriends.cpp
@@ -58,7 +58,7 @@
 #include "llmenucommands.h"
 #include "llviewercontrol.h"
 #include "llviewermessage.h"
-#include "lltimer.h"
+#include "lleventtimer.h"
 #include "lltextbox.h"
 #include "llvoiceclient.h"
 
diff --git a/indra/newview/llfloatergodtools.cpp b/indra/newview/llfloatergodtools.cpp
index c2b0bd18faf2e4e1149f484d2383e1a7d319d942..5294f09e64812195a5f89cb9a48fd3b644e03b26 100644
--- a/indra/newview/llfloatergodtools.cpp
+++ b/indra/newview/llfloatergodtools.cpp
@@ -414,17 +414,17 @@ LLPanelRegionTools::LLPanelRegionTools()
 BOOL LLPanelRegionTools::postBuild()
 {
 	getChild<LLLineEditor>("region name")->setKeystrokeCallback(onChangeSimName, this);
-	childSetPrevalidate("region name", &LLLineEditor::prevalidateASCIIPrintableNoPipe);
-	childSetPrevalidate("estate", &LLLineEditor::prevalidatePositiveS32);
-	childSetPrevalidate("parentestate", &LLLineEditor::prevalidatePositiveS32);
+	childSetPrevalidate("region name", &LLTextValidate::validateASCIIPrintableNoPipe);
+	childSetPrevalidate("estate", &LLTextValidate::validatePositiveS32);
+	childSetPrevalidate("parentestate", &LLTextValidate::validatePositiveS32);
 	childDisable("parentestate");
-	childSetPrevalidate("gridposx", &LLLineEditor::prevalidatePositiveS32);
+	childSetPrevalidate("gridposx", &LLTextValidate::validatePositiveS32);
 	childDisable("gridposx");
-	childSetPrevalidate("gridposy", &LLLineEditor::prevalidatePositiveS32);
+	childSetPrevalidate("gridposy", &LLTextValidate::validatePositiveS32);
 	childDisable("gridposy");
 	
-	childSetPrevalidate("redirectx", &LLLineEditor::prevalidatePositiveS32);
-	childSetPrevalidate("redirecty", &LLLineEditor::prevalidatePositiveS32);
+	childSetPrevalidate("redirectx", &LLTextValidate::validatePositiveS32);
+	childSetPrevalidate("redirecty", &LLTextValidate::validatePositiveS32);
 			 
 	return TRUE;
 }
diff --git a/indra/newview/llfloaterland.cpp b/indra/newview/llfloaterland.cpp
index 8cd63deebead46a171fb5601c9b43763e18d730b..26c6db9652f9330536927e4e7bec517904a4a599 100644
--- a/indra/newview/llfloaterland.cpp
+++ b/indra/newview/llfloaterland.cpp
@@ -353,7 +353,7 @@ BOOL LLPanelLandGeneral::postBuild()
 {
 	mEditName = getChild<LLLineEditor>("Name");
 	mEditName->setCommitCallback(onCommitAny, this);	
-	childSetPrevalidate("Name", LLLineEditor::prevalidateASCIIPrintableNoPipe);
+	childSetPrevalidate("Name", LLTextValidate::validateASCIIPrintableNoPipe);
 
 	mEditDesc = getChild<LLTextEditor>("Description");
 	mEditDesc->setCommitOnFocusLost(TRUE);
@@ -1111,7 +1111,7 @@ BOOL LLPanelLandObjects::postBuild()
 
 	mCleanOtherObjectsTime->setFocusLostCallback(boost::bind(onLostFocus, _1, this));
 	mCleanOtherObjectsTime->setCommitCallback(onCommitClean, this);
-	childSetPrevalidate("clean other time", LLLineEditor::prevalidateNonNegativeS32);
+	childSetPrevalidate("clean other time", LLTextValidate::validateNonNegativeS32);
 	
 	mBtnRefresh = getChild<LLButton>("Refresh List");
 	mBtnRefresh->setClickedCallback(onClickRefresh, this);
diff --git a/indra/newview/llfloaternamedesc.cpp b/indra/newview/llfloaternamedesc.cpp
index 810761e034d4b4e694e21aed522cd841addffc97..159ce41b790053ab015009dad22cca20c3fbc623 100644
--- a/indra/newview/llfloaternamedesc.cpp
+++ b/indra/newview/llfloaternamedesc.cpp
@@ -111,7 +111,7 @@ BOOL LLFloaterNameDesc::postBuild()
 	if (NameEditor)
 	{
 		NameEditor->setMaxTextLength(DB_INV_ITEM_NAME_STR_LEN);
-		NameEditor->setPrevalidate(&LLLineEditor::prevalidateASCIIPrintableNoPipe);
+		NameEditor->setPrevalidate(&LLTextValidate::validateASCIIPrintableNoPipe);
 	}
 
 	y -= llfloor(PREVIEW_LINE_HEIGHT * 1.2f);
@@ -123,7 +123,7 @@ BOOL LLFloaterNameDesc::postBuild()
 	if (DescEditor)
 	{
 		DescEditor->setMaxTextLength(DB_INV_ITEM_DESC_STR_LEN);
-		DescEditor->setPrevalidate(&LLLineEditor::prevalidateASCIIPrintableNoPipe);
+		DescEditor->setPrevalidate(&LLTextValidate::validateASCIIPrintableNoPipe);
 	}
 
 	y -= llfloor(PREVIEW_LINE_HEIGHT * 1.2f);
diff --git a/indra/newview/llfloaterpay.cpp b/indra/newview/llfloaterpay.cpp
index 00959322e5a8dfe8aee2cc0e5455d2bf4c6e6635..51364594e4b3257d85963a1205a315cdd7847a6b 100644
--- a/indra/newview/llfloaterpay.cpp
+++ b/indra/newview/llfloaterpay.cpp
@@ -204,7 +204,7 @@ BOOL LLFloaterPay::postBuild()
 
 	getChild<LLLineEditor>("amount")->setKeystrokeCallback(&LLFloaterPay::onKeystroke, this);
 	childSetText("amount", last_amount);
-	childSetPrevalidate("amount", LLLineEditor::prevalidateNonNegativeS32);
+	childSetPrevalidate("amount", LLTextValidate::validateNonNegativeS32);
 
 	info = new LLGiveMoneyInfo(this, 0);
 	mCallbackData.push_back(info);
diff --git a/indra/newview/llfloaterproperties.cpp b/indra/newview/llfloaterproperties.cpp
index ff9002787ce859df3a36e5ce54cefd15c770bfa1..bde86a40348bfdcd6460144a82cd41f04024d263 100644
--- a/indra/newview/llfloaterproperties.cpp
+++ b/indra/newview/llfloaterproperties.cpp
@@ -130,9 +130,9 @@ BOOL LLFloaterProperties::postBuild()
 {
 	// build the UI
 	// item name & description
-	childSetPrevalidate("LabelItemName",&LLLineEditor::prevalidateASCIIPrintableNoPipe);
+	childSetPrevalidate("LabelItemName",&LLTextValidate::validateASCIIPrintableNoPipe);
 	getChild<LLUICtrl>("LabelItemName")->setCommitCallback(boost::bind(&LLFloaterProperties::onCommitName,this));
-	childSetPrevalidate("LabelItemDesc",&LLLineEditor::prevalidateASCIIPrintableNoPipe);
+	childSetPrevalidate("LabelItemDesc",&LLTextValidate::validateASCIIPrintableNoPipe);
 	getChild<LLUICtrl>("LabelItemDesc")->setCommitCallback(boost::bind(&LLFloaterProperties:: onCommitDescription, this));
 	// Creator information
 	getChild<LLUICtrl>("BtnCreator")->setCommitCallback(boost::bind(&LLFloaterProperties::onClickCreator,this));
diff --git a/indra/newview/llfloatersellland.cpp b/indra/newview/llfloatersellland.cpp
index e2b0c4b66f89d5a367465f6055f257f273c715cc..98956650261d4b068b6a3bc53101c977d07c671b 100644
--- a/indra/newview/llfloatersellland.cpp
+++ b/indra/newview/llfloatersellland.cpp
@@ -163,7 +163,7 @@ BOOL LLFloaterSellLandUI::postBuild()
 {
 	childSetCommitCallback("sell_to", onChangeValue, this);
 	childSetCommitCallback("price", onChangeValue, this);
-	childSetPrevalidate("price", LLLineEditor::prevalidateNonNegativeS32);
+	childSetPrevalidate("price", LLTextValidate::validateNonNegativeS32);
 	childSetCommitCallback("sell_objects", onChangeValue, this);
 	childSetAction("sell_to_select_agent", boost::bind( &LLFloaterSellLandUI::doSelectAgent, this));
 	childSetAction("cancel_btn", doCancel, this);
@@ -268,7 +268,7 @@ void LLFloaterSellLandUI::refreshUI()
 
 	std::string price_str = childGetValue("price").asString();
 	bool valid_price = false;
-	valid_price = (price_str != "") && LLLineEditor::prevalidateNonNegativeS32(utf8str_to_wstring(price_str));
+	valid_price = (price_str != "") && LLTextValidate::validateNonNegativeS32(utf8str_to_wstring(price_str));
 
 	if (valid_price && mParcelActualArea > 0)
 	{
diff --git a/indra/newview/llfloateruipreview.cpp b/indra/newview/llfloateruipreview.cpp
index c6e12476bd6ea5c34ee756415d584ab058016fcf..3e804bef9d68e766a0ff16b83bd6837d89ef7a2f 100644
--- a/indra/newview/llfloateruipreview.cpp
+++ b/indra/newview/llfloateruipreview.cpp
@@ -41,6 +41,7 @@
 #include "llfloateruipreview.h"			// Own header
 
 // Internal utility
+#include "lleventtimer.h"
 #include "llrender.h"
 #include "llsdutil.h"
 #include "llxmltree.h"
@@ -91,7 +92,6 @@ static std::string get_xui_dir()
 }
 
 // Forward declarations to avoid header dependencies
-class LLEventTimer;
 class LLColor;
 class LLScrollListCtrl;
 class LLComboBox;
diff --git a/indra/newview/llfolderview.cpp b/indra/newview/llfolderview.cpp
index 5c65b2c293174b1002e1e3bd91ea47c04172a677..57c7ba8e27e14937daef24904285c3be70f3cdaf 100644
--- a/indra/newview/llfolderview.cpp
+++ b/indra/newview/llfolderview.cpp
@@ -225,7 +225,7 @@ LLFolderView::LLFolderView(const Params& p)
 	params.font(getLabelFontForStyle(LLFontGL::NORMAL));
 	params.max_length_bytes(DB_INV_ITEM_NAME_STR_LEN);
 	params.commit_callback.function(boost::bind(&LLFolderView::commitRename, this, _2));
-	params.prevalidate_callback(&LLLineEditor::prevalidateASCIIPrintableNoPipe);
+	params.prevalidate_callback(&LLTextValidate::validateASCIIPrintableNoPipe);
 	params.commit_on_focus_lost(true);
 	params.visible(false);
 	mRenamer = LLUICtrlFactory::create<LLLineEditor> (params);
diff --git a/indra/newview/llinspect.cpp b/indra/newview/llinspect.cpp
index c7b651f37cd2ff5cec75a5a3fad2f1f023ec293d..81cfce53b199ce0e2ab04ba891f6864eefb6a15a 100644
--- a/indra/newview/llinspect.cpp
+++ b/indra/newview/llinspect.cpp
@@ -32,6 +32,7 @@
 
 #include "llinspect.h"
 
+#include "lltooltip.h"
 #include "llcontrol.h"	// LLCachedControl
 #include "llui.h"		// LLUI::sSettingsGroups
 #include "llviewermenu.h"
@@ -104,6 +105,26 @@ BOOL LLInspect::handleHover(S32 x, S32 y, MASK mask)
 	return LLView::handleHover(x, y, mask);
 }
 
+BOOL LLInspect::handleToolTip(S32 x, S32 y, MASK mask)
+{
+	BOOL handled = FALSE;
+
+
+	//delegate handling of tooltip to the hovered child
+	LLView* child_handler = childFromPoint(x,y);
+	if (child_handler && !child_handler->getToolTip().empty())// show tooltip if a view has non-empty tooltip message
+	{
+		//build LLInspector params to get correct tooltip setting, etc. background image
+		LLInspector::Params params;
+		params.fillFrom(LLUICtrlFactory::instance().getDefaultParams<LLInspector>());
+		params.message = child_handler->getToolTip();
+		//set up delay if there is no visible tooltip at this moment
+		params.delay_time =  LLToolTipMgr::instance().toolTipVisible() ? 0.f : LLUI::sSettingGroups["config"]->getF32( "ToolTipDelay" );
+		LLToolTipMgr::instance().show(params);
+		handled = TRUE;
+	}
+	return handled;
+}
 // virtual
 void LLInspect::onMouseLeave(S32 x, S32 y, MASK mask)
 {
diff --git a/indra/newview/llinspect.h b/indra/newview/llinspect.h
index f8c86618d264814c851491eedc373ce797fec518..6d994a8d7c4d20646cab69ecc35696678df65001 100644
--- a/indra/newview/llinspect.h
+++ b/indra/newview/llinspect.h
@@ -47,6 +47,7 @@ class LLInspect : public LLFloater
 	/*virtual*/ void draw();
 	
 	/*virtual*/ BOOL handleHover(S32 x, S32 y, MASK mask);
+	/*virtual*/ BOOL handleToolTip(S32 x, S32 y, MASK mask);
 	/*virtual*/ void onMouseLeave(S32 x, S32 y, MASK mask);
 	
 	/// Start open animation
diff --git a/indra/newview/llmediactrl.cpp b/indra/newview/llmediactrl.cpp
index 3c34d26692db8cfd6629f8b4ae445535d815d852..501a137b4253ac49f8397a2460864371f2fa9b5b 100644
--- a/indra/newview/llmediactrl.cpp
+++ b/indra/newview/llmediactrl.cpp
@@ -982,16 +982,20 @@ void LLMediaCtrl::onClickLinkHref( LLPluginClassMedia* self )
 	U32 target_type = self->getClickTargetType();
 	
 	// is there is a target specified for the link?
-	if (gSavedSettings.getBOOL("UseExternalBrowser") || target_type == LLPluginClassMedia::TARGET_EXTERNAL)
+	if (target_type == LLPluginClassMedia::TARGET_EXTERNAL ||
+		target_type == LLPluginClassMedia::TARGET_BLANK )
 	{
-		LLSD payload;
-		payload["url"] = url;
-		payload["target_type"] = LLSD::Integer(target_type);
-		LLNotificationsUtil::add( "WebLaunchExternalTarget", LLSD(), payload, onClickLinkExternalTarget);
-	}
-	else if (target_type == LLPluginClassMedia::TARGET_BLANK)
-	{
-		clickLinkWithTarget(url, target_type);
+		if (gSavedSettings.getBOOL("UseExternalBrowser"))
+		{
+			LLSD payload;
+			payload["url"] = url;
+			payload["target_type"] = LLSD::Integer(target_type);
+			LLNotificationsUtil::add( "WebLaunchExternalTarget", LLSD(), payload, onClickLinkExternalTarget);
+		}
+		else
+		{
+			clickLinkWithTarget(url, target_type);
+		}
 	}
 	else {
 		const std::string protocol1( "http://" );
@@ -1042,7 +1046,7 @@ bool LLMediaCtrl::onClickLinkExternalTarget(const LLSD& notification, const LLSD
 // static 
 void LLMediaCtrl::clickLinkWithTarget(const std::string& url, const S32& target_type )
 {
-	if (gSavedSettings.getBOOL("UseExternalBrowser") || target_type == LLPluginClassMedia::TARGET_EXTERNAL)
+	if (target_type == LLPluginClassMedia::TARGET_EXTERNAL)
 	{
 		// load target in an external browser
 		LLWeb::loadURLExternal(url);
diff --git a/indra/newview/llmediadataclient.h b/indra/newview/llmediadataclient.h
index 75d32e707b49cc7f8801d4902ca7ac0353c8b5cb..8dd72cb5952c85c7fd96bdc87bac7ca0c1ab0512 100755
--- a/indra/newview/llmediadataclient.h
+++ b/indra/newview/llmediadataclient.h
@@ -37,7 +37,7 @@
 #include <queue>
 #include "llrefcount.h"
 #include "llpointer.h"
-#include "lltimer.h"
+#include "lleventtimer.h"
 
 
 // Link seam for LLVOVolume
diff --git a/indra/newview/llnamelistctrl.cpp b/indra/newview/llnamelistctrl.cpp
index d579058c3280b475dfb956c01d60c4660ce163fc..40e8b64362b6a8f697b453f66d845c917f9d6307 100644
--- a/indra/newview/llnamelistctrl.cpp
+++ b/indra/newview/llnamelistctrl.cpp
@@ -356,8 +356,9 @@ void LLNameListCtrl::refresh(const LLUUID& id, const std::string& first,
 void LLNameListCtrl::refreshAll(const LLUUID& id, const std::string& first,
 								const std::string& last, BOOL is_group)
 {
+	LLInstanceTrackerScopedGuard guard;
 	LLInstanceTracker<LLNameListCtrl>::instance_iter it;
-	for (it = beginInstances(); it != endInstances(); ++it)
+	for (it = guard.beginInstances(); it != guard.endInstances(); ++it)
 	{
 		LLNameListCtrl& ctrl = *it;
 		ctrl.refresh(id, first, last, is_group);
diff --git a/indra/newview/llpanelclassified.cpp b/indra/newview/llpanelclassified.cpp
index 1e46827c1ae1d6f326f80f1f3b159c5340aa60ce..8ca044f72b4fd210a9d0198a5c330b7689104248 100644
--- a/indra/newview/llpanelclassified.cpp
+++ b/indra/newview/llpanelclassified.cpp
@@ -242,7 +242,7 @@ BOOL LLPanelClassified::postBuild()
 	mNameEditor->setCommitOnFocusLost(TRUE);
 	mNameEditor->setFocusReceivedCallback(boost::bind(focusReceived, _1, this));
 	mNameEditor->setCommitCallback(onCommitAny, this);
-	mNameEditor->setPrevalidate( LLLineEditor::prevalidateASCII );
+	mNameEditor->setPrevalidate( LLTextValidate::validateASCII );
 
     mDescEditor = getChild<LLTextEditor>("desc_editor");
 	mDescEditor->setCommitOnFocusLost(TRUE);
@@ -1072,7 +1072,7 @@ BOOL LLFloaterPriceForListing::postBuild()
 	LLLineEditor* edit = getChild<LLLineEditor>("price_edit");
 	if (edit)
 	{
-		edit->setPrevalidate(LLLineEditor::prevalidateNonNegativeS32);
+		edit->setPrevalidate(LLTextValidate::validateNonNegativeS32);
 		std::string min_price = llformat("%d", MINIMUM_PRICE_FOR_LISTING);
 		edit->setText(min_price);
 		edit->selectAll();
diff --git a/indra/newview/llpanelgroupgeneral.cpp b/indra/newview/llpanelgroupgeneral.cpp
index 51fc670d877a92c529eb4f1d8051f0dda86f9f7f..3b303eed0fce59e00776cee368bf35cbf710cd08 100644
--- a/indra/newview/llpanelgroupgeneral.cpp
+++ b/indra/newview/llpanelgroupgeneral.cpp
@@ -214,7 +214,7 @@ void LLPanelGroupGeneral::setupCtrls(LLPanel* panel_group)
 	}
 	mFounderName = panel_group->getChild<LLNameBox>("founder_name");
 	mGroupNameEditor = panel_group->getChild<LLLineEditor>("group_name_editor");
-	mGroupNameEditor->setPrevalidate( LLLineEditor::prevalidateASCII );
+	mGroupNameEditor->setPrevalidate( LLTextValidate::validateASCII );
 }
 
 // static
diff --git a/indra/newview/llpanellandaudio.cpp b/indra/newview/llpanellandaudio.cpp
index 6a4c9097592b805c67182df247a52d532f0c0538..a92b4357ed7294b472e4c91e40c3106b4db2a8ed 100644
--- a/indra/newview/llpanellandaudio.cpp
+++ b/indra/newview/llpanellandaudio.cpp
@@ -153,6 +153,13 @@ void LLPanelLandAudio::refresh()
 		mCheckParcelEnableVoice->set(allow_voice);
 		mCheckParcelVoiceLocal->set(!parcel->getParcelFlagUseEstateVoiceChannel());
 
+		// don't display urls if you're not able to change it
+		// much requested change in forums so people can't 'steal' urls
+		// NOTE: bug#2009 means this is still vunerable - however, bug
+		// should be closed since this bug opens up major security issues elsewhere.
+		bool obscure_music = ! can_change_media && parcel->getObscureMusic();
+		
+		mMusicURLEdit->setDrawAsterixes(obscure_music);
 		mMusicURLEdit->setText(parcel->getMusicURL());
 		mMusicURLEdit->setEnabled( can_change_media );
 	}
diff --git a/indra/newview/llpanellogin.cpp b/indra/newview/llpanellogin.cpp
index 2d5246c409ca43d6e703bb6fb03ab84ec8211ccd..43f4024bac838d37b28e9b8f574a925b12c3a13f 100644
--- a/indra/newview/llpanellogin.cpp
+++ b/indra/newview/llpanellogin.cpp
@@ -213,8 +213,8 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect,
 	}
 
 #if !USE_VIEWER_AUTH
-	childSetPrevalidate("first_name_edit", LLLineEditor::prevalidateASCIIPrintableNoSpace);
-	childSetPrevalidate("last_name_edit", LLLineEditor::prevalidateASCIIPrintableNoSpace);
+	childSetPrevalidate("first_name_edit", LLTextValidate::validateASCIIPrintableNoSpace);
+	childSetPrevalidate("last_name_edit", LLTextValidate::validateASCIIPrintableNoSpace);
 
 	childSetCommitCallback("password_edit", mungePassword, this);
 	getChild<LLLineEditor>("password_edit")->setKeystrokeCallback(onPassKey, this);
diff --git a/indra/newview/llpanelpeople.cpp b/indra/newview/llpanelpeople.cpp
index 423ee61e25f3078bf9c8f674eba1090a30085b7d..36fab862808da1b0a20f390ca9c900640f6d7b4c 100644
--- a/indra/newview/llpanelpeople.cpp
+++ b/indra/newview/llpanelpeople.cpp
@@ -36,6 +36,7 @@
 #include "llfloaterreg.h"
 #include "llmenugl.h"
 #include "llnotificationsutil.h"
+#include "lleventtimer.h"
 #include "llfiltereditor.h"
 #include "lltabcontainer.h"
 #include "lluictrlfactory.h"
diff --git a/indra/newview/llpanelpermissions.cpp b/indra/newview/llpanelpermissions.cpp
index 8b8b1bed3756ed9070c8a7ffce6c61fd7ce1954f..01b6e8ffada8eda09b159b7c5fbcafe683dd36a8 100644
--- a/indra/newview/llpanelpermissions.cpp
+++ b/indra/newview/llpanelpermissions.cpp
@@ -142,9 +142,9 @@ LLPanelPermissions::LLPanelPermissions() :
 BOOL LLPanelPermissions::postBuild()
 {
 	childSetCommitCallback("Object Name",LLPanelPermissions::onCommitName,this);
-	childSetPrevalidate("Object Name",LLLineEditor::prevalidateASCIIPrintableNoPipe);
+	childSetPrevalidate("Object Name",LLTextValidate::validateASCIIPrintableNoPipe);
 	childSetCommitCallback("Object Description",LLPanelPermissions::onCommitDesc,this);
-	childSetPrevalidate("Object Description",LLLineEditor::prevalidateASCIIPrintableNoPipe);
+	childSetPrevalidate("Object Description",LLTextValidate::validateASCIIPrintableNoPipe);
 
 	
 	getChild<LLUICtrl>("button set group")->setCommitCallback(boost::bind(&LLPanelPermissions::onClickGroup,this));
diff --git a/indra/newview/llpanelplaces.cpp b/indra/newview/llpanelplaces.cpp
index a49386cb5ce0c311f1ff6caf2c6cec6914c2e3b9..c0491cc00f3139701fd73254a7f1de9752f89a31 100644
--- a/indra/newview/llpanelplaces.cpp
+++ b/indra/newview/llpanelplaces.cpp
@@ -1023,7 +1023,6 @@ void LLPanelPlaces::showAddedLandmarkInfo(const std::vector<LLUUID>& items)
 			{
 				setItem(item);
 			}
-			break;
 		}
 	}
 }
diff --git a/indra/newview/llpanelprimmediacontrols.cpp b/indra/newview/llpanelprimmediacontrols.cpp
index 2dc3a626376954924f2189bea64a7be4e62ea189..479769ee20941f0ac156e1a28367ea19dd4647e2 100644
--- a/indra/newview/llpanelprimmediacontrols.cpp
+++ b/indra/newview/llpanelprimmediacontrols.cpp
@@ -1036,8 +1036,9 @@ void LLPanelPrimMediaControls::updateZoom()
 	}
 
 	if (zoom_padding > 0.0f)
-	{
-		LLViewerMediaFocus::setCameraZoom(getTargetObject(), mTargetObjectNormal, zoom_padding);
+	{	
+		// since we only zoom into medium for now, always set zoom_in constraint to true
+		LLViewerMediaFocus::setCameraZoom(getTargetObject(), mTargetObjectNormal, zoom_padding, true);
 	}
 	
 	// Remember the object ID/face we zoomed into, so we can update the zoom icon appropriately
diff --git a/indra/newview/llpreviewanim.cpp b/indra/newview/llpreviewanim.cpp
index 92bd4dc62b11eba1e3ad289477eae69092b12838..0cc747f789f06af87302ef44f716ae4d72e7061f 100644
--- a/indra/newview/llpreviewanim.cpp
+++ b/indra/newview/llpreviewanim.cpp
@@ -79,7 +79,7 @@ BOOL LLPreviewAnim::postBuild()
 	childSetAction("Anim audition btn",auditionAnim, this);
 
 	childSetCommitCallback("desc", LLPreview::onText, this);
-	childSetPrevalidate("desc", &LLLineEditor::prevalidateASCIIPrintableNoPipe);
+	childSetPrevalidate("desc", &LLTextValidate::validateASCIIPrintableNoPipe);
 	
 	return LLPreview::postBuild();
 }
diff --git a/indra/newview/llpreviewgesture.cpp b/indra/newview/llpreviewgesture.cpp
index 53e351e66e14fd3065597654b39ffa07cd8c1683..57a8ca3d122ca6621b280cfbaa7729bd42bba534 100644
--- a/indra/newview/llpreviewgesture.cpp
+++ b/indra/newview/llpreviewgesture.cpp
@@ -472,7 +472,7 @@ BOOL LLPreviewGesture::postBuild()
 	edit = getChild<LLLineEditor>("wait_time_editor");
 	edit->setEnabled(FALSE);
 	edit->setVisible(FALSE);
-	edit->setPrevalidate(LLLineEditor::prevalidateFloat);
+	edit->setPrevalidate(LLTextValidate::validateFloat);
 //	edit->setKeystrokeCallback(onKeystrokeCommit, this);
 	edit->setCommitOnFocusLost(TRUE);
 	edit->setCommitCallback(onCommitWaitTime, this);
@@ -504,10 +504,10 @@ BOOL LLPreviewGesture::postBuild()
 	if (item) 
 	{
 		childSetText("desc", item->getDescription());
-		childSetPrevalidate("desc", &LLLineEditor::prevalidateASCIIPrintableNoPipe);
+		childSetPrevalidate("desc", &LLTextValidate::validateASCIIPrintableNoPipe);
 		
 		childSetText("name", item->getName());
-		childSetPrevalidate("name", &LLLineEditor::prevalidateASCIIPrintableNoPipe);
+		childSetPrevalidate("name", &LLTextValidate::validateASCIIPrintableNoPipe);
 	}
 
 	return LLPreview::postBuild();
diff --git a/indra/newview/llpreviewnotecard.cpp b/indra/newview/llpreviewnotecard.cpp
index cc7036052826e0e1ab0a09d0a70b5da1e95f530e..ee8e3f1db6a49d731bed3fbf199da11f95f81a1b 100644
--- a/indra/newview/llpreviewnotecard.cpp
+++ b/indra/newview/llpreviewnotecard.cpp
@@ -95,7 +95,7 @@ BOOL LLPreviewNotecard::postBuild()
 	childSetCommitCallback("desc", LLPreview::onText, this);
 	if (item)
 		childSetText("desc", item->getDescription());
-	childSetPrevalidate("desc", &LLLineEditor::prevalidateASCIIPrintableNoPipe);
+	childSetPrevalidate("desc", &LLTextValidate::validateASCIIPrintableNoPipe);
 
 	return LLPreview::postBuild();
 }
diff --git a/indra/newview/llpreviewscript.cpp b/indra/newview/llpreviewscript.cpp
index 7bcbe334fff0e1949fda8e1453528792854f1a75..a8feaf690dff19732c14bb9661877d778ed126c5 100644
--- a/indra/newview/llpreviewscript.cpp
+++ b/indra/newview/llpreviewscript.cpp
@@ -955,7 +955,7 @@ BOOL LLPreviewLSL::postBuild()
 
 	childSetCommitCallback("desc", LLPreview::onText, this);
 	childSetText("desc", item->getDescription());
-	childSetPrevalidate("desc", &LLLineEditor::prevalidateASCIIPrintableNoPipe);
+	childSetPrevalidate("desc", &LLTextValidate::validateASCIIPrintableNoPipe);
 
 	return LLPreview::postBuild();
 }
diff --git a/indra/newview/llpreviewsound.cpp b/indra/newview/llpreviewsound.cpp
index d7fd252fb67f26e2bb9b6dddb6e1a261e94f420b..44b828854bdc99c89381f70793a429cb0cd536ae 100644
--- a/indra/newview/llpreviewsound.cpp
+++ b/indra/newview/llpreviewsound.cpp
@@ -75,7 +75,7 @@ BOOL	LLPreviewSound::postBuild()
 	button->setSoundFlags(LLView::SILENT);
 
 	childSetCommitCallback("desc", LLPreview::onText, this);
-	childSetPrevalidate("desc", &LLLineEditor::prevalidateASCIIPrintableNoPipe);	
+	childSetPrevalidate("desc", &LLTextValidate::validateASCIIPrintableNoPipe);	
 
 	return LLPreview::postBuild();
 }
diff --git a/indra/newview/llpreviewtexture.cpp b/indra/newview/llpreviewtexture.cpp
index dfc67d012602a87d12b3a96296aa6dd7e8b6009e..0ed6bea74f6fcee3289da03d8d6d46679858802c 100644
--- a/indra/newview/llpreviewtexture.cpp
+++ b/indra/newview/llpreviewtexture.cpp
@@ -126,7 +126,7 @@ BOOL LLPreviewTexture::postBuild()
 		{
 			childSetCommitCallback("desc", LLPreview::onText, this);
 			childSetText("desc", item->getDescription());
-			childSetPrevalidate("desc", &LLLineEditor::prevalidateASCIIPrintableNoPipe);
+			childSetPrevalidate("desc", &LLTextValidate::validateASCIIPrintableNoPipe);
 		}
 	}
 	
diff --git a/indra/newview/llscriptfloater.cpp b/indra/newview/llscriptfloater.cpp
index 0d9cf06bc340b56cab57929a8d594262c8704bd3..465d36b8de57cd4416a7f1fa3af423682885b84e 100644
--- a/indra/newview/llscriptfloater.cpp
+++ b/indra/newview/llscriptfloater.cpp
@@ -38,9 +38,11 @@
 #include "llchiclet.h"
 #include "llfloaterreg.h"
 #include "llnotifications.h"
+#include "llnotificationsutil.h"
 #include "llscreenchannel.h"
 #include "llsyswellwindow.h"
 #include "lltoastnotifypanel.h"
+#include "lltrans.h"
 #include "llviewerwindow.h"
 #include "llimfloater.h"
 
@@ -70,12 +72,11 @@ LLScriptFloater::LLScriptFloater(const LLSD& key)
 	setOverlapsScreenChannel(true);
 }
 
-bool LLScriptFloater::toggle(const LLUUID& object_id)
+bool LLScriptFloater::toggle(const LLUUID& notification_id)
 {
 	// Force chiclet toggle on here because first onFocusReceived() will not toggle it on.
-	LLBottomTray::getInstance()->getChicletPanel()->setChicletToggleState(object_id, true);
+	LLBottomTray::getInstance()->getChicletPanel()->setChicletToggleState(notification_id, true);
 
-	LLUUID notification_id = LLScriptFloaterManager::getInstance()->findNotificationId(object_id);
 	LLScriptFloater* floater = LLFloaterReg::findTypedInstance<LLScriptFloater>("script_floater", notification_id);
 
 	// show existing floater
@@ -96,22 +97,21 @@ bool LLScriptFloater::toggle(const LLUUID& object_id)
 	// create and show new floater
 	else
 	{
-		show(object_id);
+		show(notification_id);
 		return true;
 	}
 }
 
-LLScriptFloater* LLScriptFloater::show(const LLUUID& object_id)
+LLScriptFloater* LLScriptFloater::show(const LLUUID& notification_id)
 {
-	LLUUID notification_id = LLScriptFloaterManager::getInstance()->findNotificationId(object_id);
-	
 	LLScriptFloater* floater = LLFloaterReg::showTypedInstance<LLScriptFloater>("script_floater", notification_id);
-	floater->setObjectId(object_id);
-	floater->createForm(object_id);
+
+	floater->setNotificationId(notification_id);
+	floater->createForm(notification_id);
 
 	if (floater->getDockControl() == NULL)
 	{
-		LLChiclet* chiclet = LLBottomTray::getInstance()->getChicletPanel()->findChiclet<LLChiclet>(object_id);
+		LLChiclet* chiclet = LLBottomTray::getInstance()->getChicletPanel()->findChiclet<LLChiclet>(notification_id);
 		if (chiclet == NULL)
 		{
 			llerror("Dock chiclet for LLScriptFloater doesn't exist", 0);
@@ -133,7 +133,7 @@ void LLScriptFloater::getAllowedRect(LLRect& rect)
 	rect = gViewerWindow->getWorldViewRectRaw();
 }
 
-void LLScriptFloater::createForm(const LLUUID& object_id)
+void LLScriptFloater::createForm(const LLUUID& notification_id)
 {
 	// delete old form
 	if(mScriptForm)
@@ -142,8 +142,7 @@ void LLScriptFloater::createForm(const LLUUID& object_id)
 		mScriptForm->die();
 	}
 
-	LLNotificationPtr notification = LLNotifications::getInstance()->find(
-		LLScriptFloaterManager::getInstance()->findNotificationId(object_id));
+	LLNotificationPtr notification = LLNotifications::getInstance()->find(notification_id);
 	if(NULL == notification)
 	{
 		return;
@@ -165,9 +164,9 @@ void LLScriptFloater::createForm(const LLUUID& object_id)
 
 void LLScriptFloater::onClose(bool app_quitting)
 {
-	if(getObjectId().notNull())
+	if(getNotificationId().notNull())
 	{
-		LLScriptFloaterManager::getInstance()->removeNotificationByObjectId(getObjectId());
+		LLScriptFloaterManager::getInstance()->onRemoveNotification(getNotificationId());
 	}
 }
 
@@ -186,7 +185,7 @@ void LLScriptFloater::setVisible(BOOL visible)
 
 	if(!visible)
 	{
-		LLIMChiclet* chiclet = LLBottomTray::getInstance()->getChicletPanel()->findChiclet<LLIMChiclet>(getObjectId());
+		LLIMChiclet* chiclet = LLBottomTray::getInstance()->getChicletPanel()->findChiclet<LLIMChiclet>(getNotificationId());
 		if(chiclet)
 		{
 			chiclet->setToggleState(false);
@@ -196,10 +195,10 @@ void LLScriptFloater::setVisible(BOOL visible)
 
 void LLScriptFloater::onMouseDown()
 {
-	if(getObjectId().notNull())
+	if(getNotificationId().notNull())
 	{
 		// Remove new message icon
-		LLIMChiclet* chiclet = LLBottomTray::getInstance()->getChicletPanel()->findChiclet<LLIMChiclet>(getObjectId());
+		LLIMChiclet* chiclet = LLBottomTray::getInstance()->getChicletPanel()->findChiclet<LLIMChiclet>(getNotificationId());
 		if (chiclet == NULL)
 		{
 			llerror("Dock chiclet for LLScriptFloater doesn't exist", 0);
@@ -213,15 +212,18 @@ void LLScriptFloater::onMouseDown()
 
 void LLScriptFloater::onFocusLost()
 {
-	LLBottomTray::getInstance()->getChicletPanel()->setChicletToggleState(getObjectId(), false);
+	if(getNotificationId().notNull())
+	{
+		LLBottomTray::getInstance()->getChicletPanel()->setChicletToggleState(getNotificationId(), false);
+	}
 }
 
 void LLScriptFloater::onFocusReceived()
 {
 	// first focus will be received before setObjectId() call - don't toggle chiclet
-	if(getObjectId().notNull())
+	if(getNotificationId().notNull())
 	{
-		LLBottomTray::getInstance()->getChicletPanel()->setChicletToggleState(getObjectId(), true);
+		LLBottomTray::getInstance()->getChicletPanel()->setChicletToggleState(getNotificationId(), true);
 	}
 }
 
@@ -246,200 +248,203 @@ void LLScriptFloater::hideToastsIfNeeded()
 
 void LLScriptFloaterManager::onAddNotification(const LLUUID& notification_id)
 {
-	// get scripted Object's ID
-	LLUUID object_id = notification_id_to_object_id(notification_id);
-	if(object_id.isNull())
+	if(notification_id.isNull())
 	{
-		llwarns << "Invalid notification, no object id" << llendl;
+		llwarns << "Invalid notification ID" << llendl;
 		return;
 	}
 
+	// get scripted Object's ID
+	LLUUID object_id = notification_id_to_object_id(notification_id);
+	
 	// Need to indicate of "new message" for object chiclets according to requirements
 	// specified in the Message Bar design specification. See EXT-3142.
 	bool set_new_message = false;
+	EObjectType obj_type = getObjectType(notification_id);
 
-	// If an Object spawns more-than-one floater, only the newest one is shown. 
-	// The previous is automatically closed.
-	script_notification_map_t::iterator it = mNotifications.find(object_id);
-	if(it != mNotifications.end())
+	// LLDialog can spawn only one instance, LLLoadURL and LLGiveInventory can spawn unlimited number of instances
+	if(OBJ_SCRIPT == obj_type)
 	{
-		LLIMChiclet* chiclet = LLBottomTray::getInstance()->getChicletPanel()->findChiclet<LLIMChiclet>(object_id);
-		if(chiclet)
+		// If an Object spawns more-than-one floater, only the newest one is shown. 
+		// The previous is automatically closed.
+		script_notification_map_t::const_iterator it = findUsingObjectId(object_id);
+		if(it != mNotifications.end())
 		{
-			// Pass the new_message icon state further.
-			set_new_message = chiclet->getShowNewMessagesIcon();
-		}
+			LLIMChiclet* chiclet = LLBottomTray::getInstance()->getChicletPanel()->findChiclet<LLIMChiclet>(it->first);
+			if(chiclet)
+			{
+				// Pass the new_message icon state further.
+				set_new_message = chiclet->getShowNewMessagesIcon();
+			}
 
-		LLScriptFloater* floater = LLFloaterReg::findTypedInstance<LLScriptFloater>("script_floater", it->second.notification_id);
-		if(floater)
-		{
-			// Generate chiclet with a "new message" indicator if a docked window was opened but not in focus. See EXT-3142.
-			set_new_message |= !floater->hasFocus();
-		}
+			LLScriptFloater* floater = LLFloaterReg::findTypedInstance<LLScriptFloater>("script_floater", it->first);
+			if(floater)
+			{
+				// Generate chiclet with a "new message" indicator if a docked window was opened but not in focus. See EXT-3142.
+				set_new_message |= !floater->hasFocus();
+			}
 
-		onRemoveNotification(it->second.notification_id);
+			onRemoveNotification(it->first);
+		}
 	}
 
-	LLNotificationData nd = {notification_id};
-	mNotifications.insert(std::make_pair(object_id, nd));
+	mNotifications.insert(std::make_pair(notification_id, object_id));
 
 	// Create inventory offer chiclet for offer type notifications
-	LLNotificationPtr notification = LLNotifications::getInstance()->find(notification_id);
-	if( notification && notification->getType() == "offer" )
+	if( OBJ_GIVE_INVENTORY == obj_type )
 	{
-		LLBottomTray::instance().getChicletPanel()->createChiclet<LLInvOfferChiclet>(object_id);
+		LLBottomTray::instance().getChicletPanel()->createChiclet<LLInvOfferChiclet>(notification_id);
 	}
 	else
 	{
-		LLBottomTray::getInstance()->getChicletPanel()->createChiclet<LLScriptChiclet>(object_id);
+		LLBottomTray::getInstance()->getChicletPanel()->createChiclet<LLScriptChiclet>(notification_id);
 	}
 
-	LLIMWellWindow::getInstance()->addObjectRow(object_id, set_new_message);
+	LLIMWellWindow::getInstance()->addObjectRow(notification_id, set_new_message);
 
 	LLSD data;
-	data["object_id"] = object_id;
+	data["notification_id"] = notification_id;
 	data["new_message"] = set_new_message;
 	data["unread"] = 1; // each object has got only one floater
 	mNewObjectSignal(data);
 
-	toggleScriptFloater(object_id, set_new_message);
+	toggleScriptFloater(notification_id, set_new_message);
 }
 
 void LLScriptFloaterManager::onRemoveNotification(const LLUUID& notification_id)
 {
-	LLUUID object_id = findObjectId(notification_id);
-	if(object_id.isNull())
+	if(notification_id.isNull())
 	{
-		llwarns << "Invalid notification, no object id" << llendl;
+		llwarns << "Invalid notification ID" << llendl;
 		return;
 	}
 
-	using namespace LLNotificationsUI;
-
-	// remove related toast
-	LLUUID channel_id(gSavedSettings.getString("NotificationChannelUUID"));
-	LLScreenChannel* channel = dynamic_cast<LLScreenChannel*>
-		(LLChannelManager::getInstance()->findChannelByID(channel_id));
-	LLUUID n_toast_id = findNotificationToastId(object_id);
-	if(channel && n_toast_id.notNull())
-	{
-		channel->killToastByNotificationID(n_toast_id);
-	}
-
 	// remove related chiclet
-	LLBottomTray::getInstance()->getChicletPanel()->removeChiclet(object_id);
+	LLBottomTray::getInstance()->getChicletPanel()->removeChiclet(notification_id);
 
-	LLIMWellWindow::getInstance()->removeObjectRow(object_id);
+	LLIMWellWindow::getInstance()->removeObjectRow(notification_id);
 
 	// close floater
 	LLScriptFloater* floater = LLFloaterReg::findTypedInstance<LLScriptFloater>("script_floater", notification_id);
 	if(floater)
 	{
-		floater->setObjectId(LLUUID::null);
+		floater->setNotificationId(LLUUID::null);
 		floater->closeFloater();
 	}
 
-	mNotifications.erase(object_id);
-}
-
-void LLScriptFloaterManager::removeNotificationByObjectId(const LLUUID& object_id)
-{
-	// Check we have not removed notification yet
-	LLNotificationPtr notification = LLNotifications::getInstance()->find(
-		findNotificationId(object_id));
-	if(notification)
-	{
-		onRemoveNotification(notification->getID());
-	}
+	mNotifications.erase(notification_id);
 }
 
-void LLScriptFloaterManager::toggleScriptFloater(const LLUUID& object_id, bool set_new_message)
+void LLScriptFloaterManager::toggleScriptFloater(const LLUUID& notification_id, bool set_new_message)
 {
-	// kill toast
-	using namespace LLNotificationsUI;
-	LLScreenChannel* channel = dynamic_cast<LLScreenChannel*>(LLChannelManager::getInstance()->findChannelByID(
-		LLUUID(gSavedSettings.getString("NotificationChannelUUID"))));
-	if(channel)
-	{
-		channel->killToastByNotificationID(findNotificationToastId(object_id));
-	}
-
 	LLSD data;
-	data["object_id"] = object_id;
+	data["notification_id"] = notification_id;
 	data["new_message"] = set_new_message;
 	mToggleFloaterSignal(data);
 
 	// toggle floater
-	LLScriptFloater::toggle(object_id);
+	LLScriptFloater::toggle(notification_id);
 }
 
-void LLScriptFloaterManager::setNotificationToastId(const LLUUID& object_id, const LLUUID& notification_id)
+LLUUID LLScriptFloaterManager::findObjectId(const LLUUID& notification_id)
 {
-	script_notification_map_t::iterator it = mNotifications.find(object_id);
+	script_notification_map_t::const_iterator it = mNotifications.find(notification_id);
 	if(mNotifications.end() != it)
 	{
-		it->second.toast_notification_id = notification_id;
+		return it->second;
 	}
+	return LLUUID::null;
 }
 
-LLUUID LLScriptFloaterManager::findObjectId(const LLUUID& notification_id)
+LLUUID LLScriptFloaterManager::findNotificationId(const LLUUID& object_id)
 {
-	if(notification_id.notNull())
+	if(object_id.notNull())
 	{
-		script_notification_map_t::const_iterator it = mNotifications.begin();
-		for(; mNotifications.end() != it; ++it)
+		script_notification_map_t::const_iterator it = findUsingObjectId(object_id);
+		if(mNotifications.end() != it)
 		{
-			if(notification_id == it->second.notification_id)
-			{
-				return it->first;
-			}
+			return it->first;
 		}
 	}
 	return LLUUID::null;
 }
 
-LLUUID LLScriptFloaterManager::findNotificationId(const LLUUID& object_id)
+// static
+LLScriptFloaterManager::EObjectType LLScriptFloaterManager::getObjectType(const LLUUID& notification_id)
 {
-	script_notification_map_t::const_iterator it = mNotifications.find(object_id);
-	if(mNotifications.end() != it)
+	if(notification_id.isNull())
 	{
-		return it->second.notification_id;
+		llwarns << "Invalid notification ID" << llendl;
+		return OBJ_UNKNOWN;
 	}
-	return LLUUID::null;
-}
 
-LLUUID LLScriptFloaterManager::findNotificationToastId(const LLUUID& object_id)
-{
-	script_notification_map_t::const_iterator it = mNotifications.find(object_id);
-	if(mNotifications.end() != it)
+	static const object_type_map TYPE_MAP = initObjectTypeMap();
+
+	LLNotificationPtr notification = LLNotificationsUtil::find(notification_id);
+	object_type_map::const_iterator it = TYPE_MAP.find(notification->getName());
+	if(it != TYPE_MAP.end())
 	{
-		return it->second.toast_notification_id;
+		return it->second;
 	}
-	return LLUUID::null;
+
+	llwarns << "Unknown object type" << llendl;
+	return OBJ_UNKNOWN;
 }
 
-//static
-void LLScriptFloaterManager::onToastButtonClick(const LLSD&notification, const LLSD&response)
+// static
+std::string LLScriptFloaterManager::getObjectName(const LLUUID& notification_id)
 {
-	S32 option = LLNotification::getSelectedOption(notification, response);
-	LLUUID object_id = notification["payload"]["object_id"].asUUID();
+	using namespace LLNotificationsUI;
+	LLNotificationPtr notification = LLNotifications::getInstance()->find(notification_id);
+	if(!notification)
+	{
+		llwarns << "Invalid notification" << llendl;
+		return LLStringUtil::null;
+	}
+
+	std::string text;
 
-	switch(option)
+	switch(LLScriptFloaterManager::getObjectType(notification_id))
 	{
-	case 0: // "Open"
-		LLScriptFloaterManager::getInstance()->toggleScriptFloater(object_id);
+	case LLScriptFloaterManager::OBJ_SCRIPT:
+		text = notification->getSubstitutions()["TITLE"].asString();
 		break;
-	case 1: // "Ignore"
-		LLScriptFloaterManager::getInstance()->removeNotificationByObjectId(object_id);
+	case LLScriptFloaterManager::OBJ_LOAD_URL:
+		text = notification->getSubstitutions()["OBJECTNAME"].asString();
 		break;
-	case 2: // "Block"
-		LLMuteList::getInstance()->add(LLMute(object_id, notification["substitutions"]["TITLE"], LLMute::OBJECT));
-		LLScriptFloaterManager::getInstance()->removeNotificationByObjectId(object_id);
+	case LLScriptFloaterManager::OBJ_GIVE_INVENTORY:
+		text = notification->getSubstitutions()["NAME"].asString();
 		break;
 	default:
-		llwarns << "Unexpected value" << llendl;
+		text = LLTrans::getString("object");
 		break;
 	}
+
+	return text;
+}
+
+//static
+LLScriptFloaterManager::object_type_map LLScriptFloaterManager::initObjectTypeMap()
+{
+	object_type_map type_map;
+	type_map["ScriptDialog"] = OBJ_SCRIPT;
+	type_map["ScriptDialogGroup"] = OBJ_SCRIPT;
+	type_map["LoadWebPage"] = OBJ_LOAD_URL;
+	type_map["ObjectGiveItem"] = OBJ_GIVE_INVENTORY;
+	return type_map;
+}
+
+LLScriptFloaterManager::script_notification_map_t::const_iterator LLScriptFloaterManager::findUsingObjectId(const LLUUID& object_id)
+{
+	script_notification_map_t::const_iterator it = mNotifications.begin();
+	for(; mNotifications.end() != it; ++it)
+	{
+		if(object_id == it->second)
+		{
+			return it;
+		}
+	}
+	return mNotifications.end();
 }
 
 // EOF
diff --git a/indra/newview/llscriptfloater.h b/indra/newview/llscriptfloater.h
index f86605c5d1d702de45b1f3aab989f8174aaf7a48..f7efff83f953dc32536a9ffc8a52b009c101155e 100644
--- a/indra/newview/llscriptfloater.h
+++ b/indra/newview/llscriptfloater.h
@@ -48,6 +48,15 @@ class LLScriptFloaterManager : public LLSingleton<LLScriptFloaterManager>
 	// know how script notifications should look like.
 public:
 
+	typedef enum e_object_type
+	{
+		OBJ_SCRIPT,
+		OBJ_GIVE_INVENTORY,
+		OBJ_LOAD_URL,
+
+		OBJ_UNKNOWN
+	}EObjectType;
+
 	/**
 	 * Handles new notifications.
 	 * Saves notification and object ids, removes old notification if needed, creates script chiclet
@@ -61,11 +70,6 @@ class LLScriptFloaterManager : public LLSingleton<LLScriptFloaterManager>
 	 */
 	void onRemoveNotification(const LLUUID& notification_id);
 
-	/**
-	 * Wrapper for onRemoveNotification, removes notification by object id.
-	 */
-	void removeNotificationByObjectId(const LLUUID& object_id);
-
 	/**
 	 * Toggles script floater.
 	 * Removes "new message" icon from chiclet and removes notification toast.
@@ -76,12 +80,9 @@ class LLScriptFloaterManager : public LLSingleton<LLScriptFloaterManager>
 
 	LLUUID findNotificationId(const LLUUID& object_id);
 
-	LLUUID findNotificationToastId(const LLUUID& object_id);
+	static EObjectType getObjectType(const LLUUID& notification_id);
 
-	/**
-	 * Associate notification toast id with object id.
-	 */
-	void setNotificationToastId(const LLUUID& object_id, const LLUUID& notification_id);
+	static std::string getObjectName(const LLUUID& notification_id);
 
 	/**
 	* Callback for notification toast buttons.
@@ -93,16 +94,18 @@ class LLScriptFloaterManager : public LLSingleton<LLScriptFloaterManager>
 	boost::signals2::connection addNewObjectCallback(const object_signal_t::slot_type& cb) { return mNewObjectSignal.connect(cb); }
 	boost::signals2::connection addToggleObjectFloaterCallback(const object_signal_t::slot_type& cb) { return mToggleFloaterSignal.connect(cb); }
 
-private:
+protected:
 
-	struct LLNotificationData
-	{
-		LLUUID notification_id;
-		LLUUID toast_notification_id;
-	};
+	typedef std::map<std::string, EObjectType> object_type_map;
+
+	static object_type_map initObjectTypeMap();
 
-	// <object_id, notification_data>
-	typedef std::map<LLUUID, LLNotificationData> script_notification_map_t;
+	// <notification_id, object_id>
+	typedef std::map<LLUUID, LLUUID> script_notification_map_t;
+
+	script_notification_map_t::const_iterator findUsingObjectId(const LLUUID& object_id);
+
+private:
 
 	script_notification_map_t mNotifications;
 
@@ -136,9 +139,9 @@ class LLScriptFloater : public LLDockableFloater
 	 */
 	static LLScriptFloater* show(const LLUUID& object_id);
 
-	const LLUUID& getObjectId() { return mObjectId; }
+	const LLUUID& getNotificationId() { return mNotificationId; }
 
-	void setObjectId(const LLUUID& id) { mObjectId = id; }
+	void setNotificationId(const LLUUID& id) { mNotificationId = id; }
 
 	/**
 	 * Close notification if script floater is closed.
@@ -180,7 +183,7 @@ class LLScriptFloater : public LLDockableFloater
 
 private:
 	LLToastNotifyPanel* mScriptForm;
-	LLUUID mObjectId;
+	LLUUID mNotificationId;
 };
 
 #endif //LL_SCRIPTFLOATER_H
diff --git a/indra/newview/llsidepaneliteminfo.cpp b/indra/newview/llsidepaneliteminfo.cpp
index 94fe95d215a8ffadc44553836444275c7eca688d..44348ba4294643e2f96ff7463d773086dd8a4a40 100644
--- a/indra/newview/llsidepaneliteminfo.cpp
+++ b/indra/newview/llsidepaneliteminfo.cpp
@@ -109,9 +109,9 @@ BOOL LLSidepanelItemInfo::postBuild()
 {
 	LLSidepanelInventorySubpanel::postBuild();
 
-	childSetPrevalidate("LabelItemName",&LLLineEditor::prevalidateASCIIPrintableNoPipe);
+	childSetPrevalidate("LabelItemName",&LLTextValidate::validateASCIIPrintableNoPipe);
 	getChild<LLUICtrl>("LabelItemName")->setCommitCallback(boost::bind(&LLSidepanelItemInfo::onCommitName,this));
-	childSetPrevalidate("LabelItemDesc",&LLLineEditor::prevalidateASCIIPrintableNoPipe);
+	childSetPrevalidate("LabelItemDesc",&LLTextValidate::validateASCIIPrintableNoPipe);
 	getChild<LLUICtrl>("LabelItemDesc")->setCommitCallback(boost::bind(&LLSidepanelItemInfo:: onCommitDescription, this));
 	// Creator information
 	getChild<LLUICtrl>("BtnCreator")->setCommitCallback(boost::bind(&LLSidepanelItemInfo::onClickCreator,this));
diff --git a/indra/newview/llsidepaneltaskinfo.cpp b/indra/newview/llsidepaneltaskinfo.cpp
index 0b8f66c5f3af41dd0e1def576e0f41cf9d16f779..0630981d7e9e231b0049c81703c549d39939f852 100644
--- a/indra/newview/llsidepaneltaskinfo.cpp
+++ b/indra/newview/llsidepaneltaskinfo.cpp
@@ -104,9 +104,9 @@ BOOL LLSidepanelTaskInfo::postBuild()
 	mLabelGroupName = getChild<LLNameBox>("Group Name Proxy");
 
 	childSetCommitCallback("Object Name",						LLSidepanelTaskInfo::onCommitName,this);
-	childSetPrevalidate("Object Name",							LLLineEditor::prevalidateASCIIPrintableNoPipe);
+	childSetPrevalidate("Object Name",							LLTextValidate::validateASCIIPrintableNoPipe);
 	childSetCommitCallback("Object Description",				LLSidepanelTaskInfo::onCommitDesc,this);
-	childSetPrevalidate("Object Description",					LLLineEditor::prevalidateASCIIPrintableNoPipe);
+	childSetPrevalidate("Object Description",					LLTextValidate::validateASCIIPrintableNoPipe);
 	getChild<LLUICtrl>("button set group")->setCommitCallback(boost::bind(&LLSidepanelTaskInfo::onClickGroup,this));
 	childSetCommitCallback("checkbox share with group",			&LLSidepanelTaskInfo::onCommitGroupShare,this);
 	childSetAction("button deed",								&LLSidepanelTaskInfo::onClickDeedToGroup,this);
diff --git a/indra/newview/llspeakers.cpp b/indra/newview/llspeakers.cpp
index 786fa24e659757083bd8243d519f472da9d1d432..717a8bda1e561e8fa1a94625da302058ac252781 100644
--- a/indra/newview/llspeakers.cpp
+++ b/indra/newview/llspeakers.cpp
@@ -175,6 +175,11 @@ BOOL LLSpeakerActionTimer::tick()
 	return TRUE;
 }
 
+void LLSpeakerActionTimer::unset()
+{
+	mActionCallback = 0;
+}
+
 LLSpeakersDelayActionsStorage::LLSpeakersDelayActionsStorage(LLSpeakerActionTimer::action_callback_t action_cb, F32 action_delay)
 : mActionCallback(action_cb)
 , mActionDelay(action_delay)
@@ -205,7 +210,7 @@ void LLSpeakersDelayActionsStorage::setActionTimer(const LLUUID& speaker_id)
 	}
 }
 
-void LLSpeakersDelayActionsStorage::unsetActionTimer(const LLUUID& speaker_id, bool delete_it)
+void LLSpeakersDelayActionsStorage::unsetActionTimer(const LLUUID& speaker_id)
 {
 	if (mActionTimersMap.size() == 0) return;
 
@@ -213,10 +218,7 @@ void LLSpeakersDelayActionsStorage::unsetActionTimer(const LLUUID& speaker_id, b
 
 	if (it_speaker != mActionTimersMap.end())
 	{
-		if (delete_it)
-		{
-			delete it_speaker->second;
-		}
+		it_speaker->second->unset();
 		mActionTimersMap.erase(it_speaker);
 	}
 }
@@ -233,8 +235,7 @@ void LLSpeakersDelayActionsStorage::removeAllTimers()
 
 bool LLSpeakersDelayActionsStorage::onTimerActionCallback(const LLUUID& speaker_id)
 {
-	bool delete_it = false; // we're *in* this timer, return true to delete it, don't manually delete it
-	unsetActionTimer(speaker_id, delete_it);
+	unsetActionTimer(speaker_id);
 
 	if (mActionCallback)
 	{
@@ -293,9 +294,7 @@ LLPointer<LLSpeaker> LLSpeakerMgr::setSpeaker(const LLUUID& id, const std::strin
 		}
 	}
 
-	bool delete_it = true;
-	mSpeakerDelayRemover->unsetActionTimer(speakerp->mID, delete_it);
-
+	mSpeakerDelayRemover->unsetActionTimer(speakerp->mID);
 	return speakerp;
 }
 
diff --git a/indra/newview/llspeakers.h b/indra/newview/llspeakers.h
index ddc3632f0753ce9227d1e0ea52e4021d1824994f..b924fb2f2ce6cd9dc37d92c5015b256b030e5aad 100644
--- a/indra/newview/llspeakers.h
+++ b/indra/newview/llspeakers.h
@@ -34,6 +34,7 @@
 #define LL_LLSPEAKERS_H
 
 #include "llevent.h"
+#include "lleventtimer.h"
 #include "llspeakers.h"
 #include "llvoicechannel.h"
 
@@ -155,6 +156,13 @@ class LLSpeakerActionTimer : public LLEventTimer
 	 */
 	virtual BOOL tick();
 
+	/**
+	 * Clears the callback.
+	 *
+	 * Use this instead of deleteing this object. 
+	 * The next call to tick() will return true and that will destroy this object.
+	 */
+	void unset();
 private:
 	action_callback_t	mActionCallback;
 	LLUUID				mSpeakerId;
@@ -180,7 +188,7 @@ class LLSpeakersDelayActionsStorage
 	 *
 	 * @see onTimerActionCallback()
 	 */
-	void unsetActionTimer(const LLUUID& speaker_id, bool delete_it);
+	void unsetActionTimer(const LLUUID& speaker_id);
 
 	void removeAllTimers();
 private:
@@ -188,7 +196,6 @@ class LLSpeakersDelayActionsStorage
 	 * Callback of the each instance of LLSpeakerActionTimer.
 	 *
 	 * Unsets an appropriate timer instance and calls action callback for specified speacker_id.
-	 * It always returns false to not use LLEventTimer::updateClass functionality of timer deleting.
 	 *
 	 * @see unsetActionTimer()
 	 */
diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp
index 37c8d94d5e4f34cd525095f01537f911fd2ab0a8..d1b91df6e9135b5bf595d83bc0cb689ea37afd43 100644
--- a/indra/newview/llstartup.cpp
+++ b/indra/newview/llstartup.cpp
@@ -135,13 +135,14 @@
 #include "llsecondlifeurls.h"
 #include "llselectmgr.h"
 #include "llsky.h"
+#include "llsidetray.h"
 #include "llstatview.h"
-#include "lltrans.h"
 #include "llstatusbar.h"		// sendMoneyBalanceRequest(), owns L$ balance
 #include "llsurface.h"
 #include "lltexturecache.h"
 #include "lltexturefetch.h"
 #include "lltoolmgr.h"
+#include "lltrans.h"
 #include "llui.h"
 #include "llurldispatcher.h"
 #include "llurlsimstring.h"
@@ -800,6 +801,9 @@ bool idle_startup()
 		gLoginMenuBarView->setVisible( TRUE );
 		gLoginMenuBarView->setEnabled( TRUE );
 
+		// Hide the splash screen
+		LLSplashScreen::hide();
+
 		// Push our window frontmost
 		gViewerWindow->getWindow()->show();
 		display_startup();
@@ -1198,6 +1202,7 @@ bool idle_startup()
 
 		display_startup();
 		LLStartUp::setStartupState( STATE_MULTIMEDIA_INIT );
+		
 		return FALSE;
 	}
 
@@ -1704,6 +1709,9 @@ bool idle_startup()
 			// Set the show start location to true, now that the user has logged
 			// on with this install.
 			gSavedSettings.setBOOL("ShowStartLocation", TRUE);
+			
+			LLSideTray::getInstance()->showPanel("panel_home", LLSD());
+
 		}
 
 		// We're successfully logged in.
@@ -2556,27 +2564,53 @@ void LLStartUp::loadInitialOutfit( const std::string& outfit_folder_name,
 
 	// try to find the outfit - if not there, create some default
 	// wearables.
-	LLInventoryModel::cat_array_t cat_array;
-	LLInventoryModel::item_array_t item_array;
-	LLNameCategoryCollector has_name(outfit_folder_name);
-	gInventory.collectDescendentsIf(gInventory.getLibraryRootFolderID(),
-									cat_array,
-									item_array,
-									LLInventoryModel::EXCLUDE_TRASH,
-									has_name);
-	if (0 == cat_array.count())
+	LLUUID cat_id = findDescendentCategoryIDByName(
+		gInventory.getLibraryRootFolderID(),
+		outfit_folder_name);
+	if (cat_id.isNull())
 	{
 		gAgentWearables.createStandardWearables(gender);
 	}
 	else
 	{
-		LLInventoryCategory* cat = cat_array.get(0);
 		bool do_copy = true;
 		bool do_append = false;
+		LLViewerInventoryCategory *cat = gInventory.getCategory(cat_id);
 		LLAppearanceManager::instance().wearInventoryCategory(cat, do_copy, do_append);
 	}
-	LLAppearanceManager::instance().wearOutfitByName(gestures);
-	LLAppearanceManager::instance().wearOutfitByName(COMMON_GESTURES_FOLDER);
+
+	// Copy gestures
+	LLUUID dst_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_GESTURE);
+	LLPointer<LLInventoryCallback> cb(NULL);
+	LLAppearanceManager *app_mgr = &(LLAppearanceManager::instance());
+
+	// - Copy gender-specific gestures.
+	LLUUID gestures_cat_id = findDescendentCategoryIDByName( 
+		gInventory.getLibraryRootFolderID(),
+		gestures);
+	if (gestures_cat_id.notNull())
+	{
+		callAfterCategoryFetch(gestures_cat_id,
+							   boost::bind(&LLAppearanceManager::shallowCopyCategory,
+										   app_mgr,
+										   gestures_cat_id,
+										   dst_id,
+										   cb));
+	}
+
+	// - Copy common gestures.
+	LLUUID common_gestures_cat_id = findDescendentCategoryIDByName( 
+		gInventory.getLibraryRootFolderID(),
+		COMMON_GESTURES_FOLDER);
+	if (common_gestures_cat_id.notNull())
+	{
+		callAfterCategoryFetch(common_gestures_cat_id,
+							   boost::bind(&LLAppearanceManager::shallowCopyCategory,
+										   app_mgr,
+										   common_gestures_cat_id,
+										   dst_id,
+										   cb));
+	}
 
 	// This is really misnamed -- it means we have started loading
 	// an outfit/shape that will give the avatar a gender eventually. JC
diff --git a/indra/newview/llsyswellwindow.cpp b/indra/newview/llsyswellwindow.cpp
index ba15053381cf97e2013e03cffaf7a818c56b4a8b..4d1718be6aeb1c62ce621c3a3fa22dd34f41f9b1 100644
--- a/indra/newview/llsyswellwindow.cpp
+++ b/indra/newview/llsyswellwindow.cpp
@@ -418,16 +418,16 @@ BOOL LLIMWellWindow::RowPanel::handleRightMouseDown(S32 x, S32 y, MASK mask)
 /*         ObjectRowPanel implementation                                */
 /************************************************************************/
 
-LLIMWellWindow::ObjectRowPanel::ObjectRowPanel(const LLUUID& object_id, bool new_message/* = false*/)
+LLIMWellWindow::ObjectRowPanel::ObjectRowPanel(const LLUUID& notification_id, bool new_message/* = false*/)
  : LLPanel()
  , mChiclet(NULL)
 {
 	LLUICtrlFactory::getInstance()->buildPanel(this, "panel_active_object_row.xml", NULL);
 
-	initChiclet(object_id);
+	initChiclet(notification_id);
 
 	LLTextBox* obj_name = getChild<LLTextBox>("object_name");
-	obj_name->setValue(getObjectName(object_id));
+	obj_name->setValue(LLScriptFloaterManager::getObjectName(notification_id));
 
 	mCloseBtn = getChild<LLButton>("hide_btn");
 	mCloseBtn->setCommitCallback(boost::bind(&LLIMWellWindow::ObjectRowPanel::onClosePanel, this));
@@ -438,90 +438,18 @@ LLIMWellWindow::ObjectRowPanel::~ObjectRowPanel()
 {
 }
 
-std::string LLIMWellWindow::ObjectRowPanel::getObjectName(const LLUUID& object_id)
-{
-	using namespace LLNotificationsUI;
-	LLUUID notification_id = LLScriptFloaterManager::getInstance()->findNotificationId(object_id);
-	LLNotificationPtr notification = LLNotifications::getInstance()->find(notification_id);
-	if(!notification)
-	{
-		llwarns << "Invalid notification" << llendl;
-		return LLStringUtil::null;
-	}
-
-	std::string text;
-
-	switch(getObjectType(notification))
-	{
-	case OBJ_SCRIPT:
-		text = notification->getSubstitutions()["TITLE"].asString();
-		break;
-	case OBJ_LOAD_URL:
-		text = notification->getSubstitutions()["OBJECTNAME"].asString();
-		break;
-	case OBJ_GIVE_INVENTORY:
-		text = notification->getSubstitutions()["NAME"].asString();
-		break;
-	default:
-		text = getString("unknown_obj");
-		break;
-	}
-
-	return text;
-}
-
 //---------------------------------------------------------------------------------
 void LLIMWellWindow::ObjectRowPanel::onClosePanel()
 {
-	LLScriptFloaterManager::getInstance()->removeNotificationByObjectId(mChiclet->getSessionId());
-}
-
-//static
-LLIMWellWindow::ObjectRowPanel::object_type_map LLIMWellWindow::ObjectRowPanel::initObjectTypeMap()
-{
-	object_type_map type_map;
-	type_map["ScriptDialog"] = OBJ_SCRIPT;
-	type_map["LoadWebPage"] = OBJ_LOAD_URL;
-	type_map["ObjectGiveItem"] = OBJ_GIVE_INVENTORY;
-	return type_map;
-}
-
-// static
-LLIMWellWindow::ObjectRowPanel::EObjectType LLIMWellWindow::ObjectRowPanel::getObjectType(const LLNotificationPtr& notification)
-{
-	if(!notification)
-	{
-		llwarns << "Invalid notification" << llendl;
-		return OBJ_UNKNOWN;
-	}
-
-	static object_type_map type_map = initObjectTypeMap();
-	std::string name = notification->getName();
-	object_type_map::const_iterator it = type_map.find(name);
-	if(it != type_map.end())
-	{
-		return it->second;
-	}
-
-	llwarns << "Unknown object type" << llendl;
-	return OBJ_UNKNOWN;
+	LLScriptFloaterManager::getInstance()->onRemoveNotification(mChiclet->getSessionId());
 }
 
-void LLIMWellWindow::ObjectRowPanel::initChiclet(const LLUUID& object_id, bool new_message/* = false*/)
+void LLIMWellWindow::ObjectRowPanel::initChiclet(const LLUUID& notification_id, bool new_message/* = false*/)
 {
-	using namespace LLNotificationsUI;
-	LLUUID notification_id = LLScriptFloaterManager::getInstance()->findNotificationId(object_id);
-	LLNotificationPtr notification = LLNotifications::getInstance()->find(notification_id);
-	if(!notification)
-	{
-		llwarns << "Invalid notification" << llendl;
-		return;
-	}
-
 	// Choose which of the pre-created chiclets to use.
-	switch(getObjectType(notification))
+	switch(LLScriptFloaterManager::getObjectType(notification_id))
 	{
-	case OBJ_GIVE_INVENTORY:
+	case LLScriptFloaterManager::OBJ_GIVE_INVENTORY:
 		mChiclet = getChild<LLInvOfferChiclet>("inv_offer_chiclet");
 		break;
 	default:
@@ -530,8 +458,7 @@ void LLIMWellWindow::ObjectRowPanel::initChiclet(const LLUUID& object_id, bool n
 	}
 
 	mChiclet->setVisible(true);
-	mChiclet->setSessionId(object_id);
-//	mChiclet->setShowNewMessagesIcon(new_message);
+	mChiclet->setSessionId(notification_id);
 }
 
 //---------------------------------------------------------------------------------
@@ -780,10 +707,10 @@ void LLIMWellWindow::sessionIDUpdated(const LLUUID& old_session_id, const LLUUID
 	}
 }
 
-LLChiclet* LLIMWellWindow::findObjectChiclet(const LLUUID& object_id)
+LLChiclet* LLIMWellWindow::findObjectChiclet(const LLUUID& notification_id)
 {
 	LLChiclet* res = NULL;
-	ObjectRowPanel* panel = mMessageList->getTypedItemByValue<ObjectRowPanel>(object_id);
+	ObjectRowPanel* panel = mMessageList->getTypedItemByValue<ObjectRowPanel>(notification_id);
 	if (panel != NULL)
 	{
 		res = panel->mChiclet;
@@ -861,33 +788,33 @@ void LLIMWellWindow::delIMRow(const LLUUID& sessionId)
 	}
 }
 
-void LLIMWellWindow::addObjectRow(const LLUUID& object_id, bool new_message/* = false*/)
+void LLIMWellWindow::addObjectRow(const LLUUID& notification_id, bool new_message/* = false*/)
 {
-	if (mMessageList->getItemByValue(object_id) == NULL)
+	if (mMessageList->getItemByValue(notification_id) == NULL)
 	{
-		ObjectRowPanel* item = new ObjectRowPanel(object_id, new_message);
-		if (mMessageList->insertItemAfter(mSeparator, item, object_id))
+		ObjectRowPanel* item = new ObjectRowPanel(notification_id, new_message);
+		if (mMessageList->insertItemAfter(mSeparator, item, notification_id))
 		{
 			handleItemAdded(IT_INSTANT_MESSAGE);
 		}
 		else
 		{
-			llwarns << "Unable to add Object Row into the list, objectID: " << object_id << llendl;
+			llwarns << "Unable to add Object Row into the list, notificationID: " << notification_id << llendl;
 			item->die();
 		}
 		reshapeWindow();
 	}
 }
 
-void LLIMWellWindow::removeObjectRow(const LLUUID& object_id)
+void LLIMWellWindow::removeObjectRow(const LLUUID& notification_id)
 {
-	if (mMessageList->removeItemByValue(object_id))
+	if (mMessageList->removeItemByValue(notification_id))
 	{
 		handleItemRemoved(IT_INSTANT_MESSAGE);
 	}
 	else
 	{
-		llwarns << "Unable to remove Object Row from the list, objectID: " << object_id << llendl;
+		llwarns << "Unable to remove Object Row from the list, notificationID: " << notification_id << llendl;
 	}
 
 	reshapeWindow();
@@ -967,8 +894,7 @@ void LLIMWellWindow::closeAllImpl()
 		ObjectRowPanel* obj_panel = dynamic_cast <ObjectRowPanel*> (panel);
 		if (obj_panel)
 		{
-			LLScriptFloaterManager::instance()
-				.removeNotificationByObjectId(*iter);
+			LLScriptFloaterManager::instance().onRemoveNotification(*iter);
 		}
 	}
 }
diff --git a/indra/newview/llsyswellwindow.h b/indra/newview/llsyswellwindow.h
index 0c81d1f369bcee27e16ff028cb93b7229819824c..3790aa3ea9d8f978e262680c31dde63e55a8efea 100644
--- a/indra/newview/llsyswellwindow.h
+++ b/indra/newview/llsyswellwindow.h
@@ -188,8 +188,8 @@ class LLIMWellWindow : public LLSysWellWindow, LLIMSessionObserver, LLInitClass<
 	/*virtual*/ void sessionRemoved(const LLUUID& session_id);
 	/*virtual*/ void sessionIDUpdated(const LLUUID& old_session_id, const LLUUID& new_session_id);
 
-	void addObjectRow(const LLUUID& object_id, bool new_message = false);
-	void removeObjectRow(const LLUUID& object_id);
+	void addObjectRow(const LLUUID& notification_id, bool new_message = false);
+	void removeObjectRow(const LLUUID& notification_id);
 
 	void addIMRow(const LLUUID& session_id);
 	bool hasIMRow(const LLUUID& session_id);
@@ -201,7 +201,7 @@ class LLIMWellWindow : public LLSysWellWindow, LLIMSessionObserver, LLInitClass<
 
 private:
 	LLChiclet * findIMChiclet(const LLUUID& sessionId);
-	LLChiclet* findObjectChiclet(const LLUUID& object_id);
+	LLChiclet* findObjectChiclet(const LLUUID& notification_id);
 
 	void addIMRow(const LLUUID& sessionId, S32 chicletCounter, const std::string& name, const LLUUID& otherParticipantId);
 	void delIMRow(const LLUUID& sessionId);
@@ -235,17 +235,8 @@ class LLIMWellWindow : public LLSysWellWindow, LLIMSessionObserver, LLInitClass<
 
 	class ObjectRowPanel: public LLPanel
 	{
-		typedef enum e_object_type
-		{
-			OBJ_UNKNOWN,
-
-			OBJ_SCRIPT,
-			OBJ_GIVE_INVENTORY,
-			OBJ_LOAD_URL
-		}EObjectType;
-
 	public:
-		ObjectRowPanel(const LLUUID& object_id, bool new_message = false);
+		ObjectRowPanel(const LLUUID& notification_id, bool new_message = false);
 		virtual ~ObjectRowPanel();
 		/*virtual*/ void onMouseEnter(S32 x, S32 y, MASK mask);
 		/*virtual*/ void onMouseLeave(S32 x, S32 y, MASK mask);
@@ -254,12 +245,8 @@ class LLIMWellWindow : public LLSysWellWindow, LLIMSessionObserver, LLInitClass<
 
 	private:
 		void onClosePanel();
-		static EObjectType getObjectType(const LLNotificationPtr& notification);
-		void initChiclet(const LLUUID& object_id, bool new_message = false);
-		std::string getObjectName(const LLUUID& object_id);
+		void initChiclet(const LLUUID& notification_id, bool new_message = false);
 
-		typedef std::map<std::string, EObjectType> object_type_map;
-		static object_type_map initObjectTypeMap();
 	public:
 		LLIMChiclet* mChiclet;
 	private:
diff --git a/indra/newview/llviewermedia.cpp b/indra/newview/llviewermedia.cpp
index 9ced0194a27da99713e599c5169f6842ef6b94a7..da090d074c850f4e6c56eab077e8616efd8b40cd 100644
--- a/indra/newview/llviewermedia.cpp
+++ b/indra/newview/llviewermedia.cpp
@@ -712,7 +712,6 @@ 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");
@@ -838,12 +837,6 @@ void LLViewerMedia::updateMedia(void *dummy_arg)
 			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();
-				}
 			}
 		}
 		
@@ -913,59 +906,6 @@ 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("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("AudioStreamingMusic", FALSE);
-	}
-	return false;
-}
-
-
 //////////////////////////////////////////////////////////////////////////////////////////
 // LLViewerMediaImpl
 //////////////////////////////////////////////////////////////////////////////////////////
diff --git a/indra/newview/llviewermedia.h b/indra/newview/llviewermedia.h
index ff18ed605a2063bc2cf3e8ec683dee7a64b88a62..daad70f14f347d7e7686a93f353c19a4d0a32893 100644
--- a/indra/newview/llviewermedia.h
+++ b/indra/newview/llviewermedia.h
@@ -117,11 +117,6 @@ 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
diff --git a/indra/newview/llviewermediafocus.cpp b/indra/newview/llviewermediafocus.cpp
index a0ac9c209175a636e87b84e834de24358bd61e1d..f508a3462ab2b2701bb517946faf53ab770e48b1 100644
--- a/indra/newview/llviewermediafocus.cpp
+++ b/indra/newview/llviewermediafocus.cpp
@@ -157,7 +157,6 @@ void LLViewerMediaFocus::setFocusFace(LLPointer<LLViewerObject> objectp, S32 fac
 			mFocusedObjectFace = 0;
 		}
 	}
-	
 }
 
 void LLViewerMediaFocus::clearFocus()
@@ -198,7 +197,7 @@ bool LLViewerMediaFocus::getFocus()
 }
 
 // This function selects an ideal viewing distance based on the focused object, pick normal, and padding value
-void LLViewerMediaFocus::setCameraZoom(LLViewerObject* object, LLVector3 normal, F32 padding_factor)
+void LLViewerMediaFocus::setCameraZoom(LLViewerObject* object, LLVector3 normal, F32 padding_factor, bool zoom_in_only)
 {
 	if (object)
 	{
@@ -269,7 +268,16 @@ void LLViewerMediaFocus::setCameraZoom(LLViewerObject* object, LLVector3 normal,
             camera_pos += 0.01 * len * delta;
         }
 
+		// If we are not allowing zooming out and the old camera position is closer to 
+		// the center then the new intended camera position, don't move camera and return
+		if (zoom_in_only &&
+		    (dist_vec_squared(gAgent.getCameraPositionGlobal(), target_pos) < dist_vec_squared(camera_pos, target_pos)))
+		{
+			return;
+		}
+
 		gAgent.setCameraPosAndFocusGlobal(camera_pos, target_pos, object->getID() );
+
 	}
 	else
 	{
diff --git a/indra/newview/llviewermediafocus.h b/indra/newview/llviewermediafocus.h
index 89ee0ae283176a110d97b3b47bee4c773e821d81..002044ea2e354237cdece69584b7674c7ec17ae2 100644
--- a/indra/newview/llviewermediafocus.h
+++ b/indra/newview/llviewermediafocus.h
@@ -66,7 +66,7 @@ class LLViewerMediaFocus :
 
 	void update();
 	
-	static void setCameraZoom(LLViewerObject* object, LLVector3 normal, F32 padding_factor);
+	static void setCameraZoom(LLViewerObject* object, LLVector3 normal, F32 padding_factor, bool zoom_in_only = false);
 	static F32 getBBoxAspectRatio(const LLBBox& bbox, const LLVector3& normal, F32* height, F32* width, F32* depth);
 
 	bool isFocusedOnFace(LLPointer<LLViewerObject> objectp, S32 face);
diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp
index 143d95d27e6601fade32d235950fc3ca0159e42c..42f7793b5ad8dc877114dcb7382591d52bcad68a 100644
--- a/indra/newview/llviewermessage.cpp
+++ b/indra/newview/llviewermessage.cpp
@@ -38,6 +38,7 @@
 #include "llavataractions.h"
 #include "lscript_byteformat.h"
 #include "lleconomy.h"
+#include "lleventtimer.h"
 #include "llfloaterreg.h"
 #include "llfollowcamparams.h"
 #include "llregionhandle.h"
@@ -914,12 +915,13 @@ void open_inventory_offer(const std::vector<LLUUID>& items, const std::string& f
 						{
 							// Landmark creation handling is moved to LLPanelPlaces::showAddedLandmarkInfo()
 							// TODO* LLPanelPlaces dependency is going to be removed. See EXT-4347.
-							if("create_landmark" == places_panel->getPlaceInfoType() && !places_panel->getItem())
-							{
-								//places_panel->setItem(item);
-							}
+							//if("create_landmark" == places_panel->getPlaceInfoType() && !places_panel->getItem())
+							//{
+							//	places_panel->setItem(item);
+							//}
+							//else
 							// we are opening a group notice attachment
-							else
+							if("create_landmark" != places_panel->getPlaceInfoType())
 							{
 								LLSD args;
 								args["type"] = "landmark";
@@ -1261,10 +1263,6 @@ bool LLOfferInfo::inventory_offer_callback(const LLSD& notification, const LLSD&
 		gInventory.addObserver(opener);
 	}
 
-	// Remove script dialog because there is no need in it no more.
-	LLUUID object_id = notification["payload"]["object_id"].asUUID();
-	LLScriptFloaterManager::instance().removeNotificationByObjectId(object_id);
-
 	delete this;
 	return false;
 }
@@ -1438,10 +1436,6 @@ bool LLOfferInfo::inventory_task_offer_callback(const LLSD& notification, const
 		gInventory.addObserver(opener);
 	}
 
-	// Remove script dialog because there is no need in it no more.
-	LLUUID object_id = notification["payload"]["object_id"].asUUID();
-	LLScriptFloaterManager::instance().removeNotificationByObjectId(object_id);
-
 	delete this;
 	return false;
 }
@@ -1592,7 +1586,6 @@ void inventory_offer_handler(LLOfferInfo* info)
 		{
 			payload["give_inventory_notification"] = TRUE;
 			LLNotificationPtr notification = LLNotifications::instance().add(p.payload(payload)); 
-			LLScriptFloaterManager::getInstance()->setNotificationToastId(object_id, notification->getID());
 		}
 	}
 }
diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp
index 886f1d9ef54fa35e62cb156ba0c688d85430b80c..d0afa9d9de4015e3615187469f543090f28ce419 100644
--- a/indra/newview/llviewerobject.cpp
+++ b/indra/newview/llviewerobject.cpp
@@ -4019,9 +4019,14 @@ LLBBox LLViewerObject::getBoundingBoxAgent() const
 {
 	LLVector3 position_agent;
 	LLQuaternion rot;
+	LLViewerObject* avatar_parent = NULL;
 	LLViewerObject* root_edit = (LLViewerObject*)getRootEdit();
-	LLViewerObject* avatar_parent = (LLViewerObject*)root_edit->getParent();
-	if (avatar_parent && avatar_parent->isAvatar() && root_edit->mDrawable.notNull())
+	if (root_edit)
+	{
+		avatar_parent = (LLViewerObject*)root_edit->getParent();
+	}
+	
+	if (avatar_parent && avatar_parent->isAvatar() && root_edit && root_edit->mDrawable.notNull())
 	{
 		LLXform* parent_xform = root_edit->mDrawable->getXform()->getParent();
 		position_agent = (getPositionEdit() * parent_xform->getWorldRotation()) + parent_xform->getWorldPosition();
diff --git a/indra/newview/llviewerparcelmedia.cpp b/indra/newview/llviewerparcelmedia.cpp
index c4fc2e5cabf73e7abb8ad58ba5e172c2d5a72317..2c5c0a37e8f3c8d3898f78bbbd82ccbaf041cef4 100644
--- a/indra/newview/llviewerparcelmedia.cpp
+++ b/indra/newview/llviewerparcelmedia.cpp
@@ -105,15 +105,6 @@ void LLViewerParcelMedia::update(LLParcel* parcel)
 			std::string mediaUrl = std::string ( parcel->getMediaURL () );
 			std::string mediaCurrentUrl = std::string( parcel->getMediaCurrentURL());
 
-			// First use warning
-			if( (!mediaUrl.empty() ||
-			     !parcel->getMusicURL().empty())
-			    && LLViewerMedia::needsMediaFirstRun())
-			{
-				LLViewerMedia::displayMediaFirstRun();
-				return;
-			}
-
 			// if we have a current (link sharing) url, use it instead
 			if (mediaCurrentUrl != "" && parcel->getMediaType() == "text/html")
 			{
diff --git a/indra/newview/llviewerparcelmediaautoplay.h b/indra/newview/llviewerparcelmediaautoplay.h
index 1d80b4756cad6e9b918703cdfb77d8d4c6260ae1..40142c1dd100e30b11691dd39407581d920741cf 100644
--- a/indra/newview/llviewerparcelmediaautoplay.h
+++ b/indra/newview/llviewerparcelmediaautoplay.h
@@ -33,7 +33,7 @@
 #ifndef LLVIEWERPARCELMEDIAAUTOPLAY_H
 #define LLVIEWERPARCELMEDIAAUTOPLAY_H
 
-#include "lltimer.h"
+#include "lleventtimer.h"
 #include "lluuid.h"
 
 // timer to automatically play media
diff --git a/indra/newview/llviewerparcelmgr.cpp b/indra/newview/llviewerparcelmgr.cpp
index a075a706e1e4fa7952ead9c3f50a21f9ee449cd7..07c8867e262a3cc4befaf0d01d43bef923a00488 100644
--- a/indra/newview/llviewerparcelmgr.cpp
+++ b/indra/newview/llviewerparcelmgr.cpp
@@ -1762,6 +1762,12 @@ void LLViewerParcelMgr::processParcelProperties(LLMessageSystem *msg, void **use
 						{
 							optionally_start_music(music_url);
 						}
+						else
+						{
+							llinfos << "Stopping parcel music (invalid audio stream URL)" << llendl;
+							// clears the URL 
+							gAudiop->startInternetStream(LLStringUtil::null); 
+						}
 					}
 					else if (!gAudiop->getInternetStreamURL().empty())
 					{
diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp
index 315b7c52cff2013170154acbf85e267d9ea3710f..4a86e1ca412d0ff104dcc078e4b9b32996dbefe5 100644
--- a/indra/newview/llviewerwindow.cpp
+++ b/indra/newview/llviewerwindow.cpp
@@ -1726,7 +1726,11 @@ void LLViewerWindow::shutdownViews()
 	// destroy the nav bar, not currently part of gViewerWindow
 	// *TODO: Make LLNavigationBar part of gViewerWindow
 	delete LLNavigationBar::getInstance();
-	
+
+	// destroy menus after instantiating navbar above, as it needs
+	// access to gMenuHolder
+	cleanup_menus();
+
 	// Delete all child views.
 	delete mRootView;
 	mRootView = NULL;
diff --git a/indra/newview/llvoavatar.h b/indra/newview/llvoavatar.h
index a5815df20a5a57a1607a34850743b36eedd49d50..b5f0ec717648cb9c5e3c1166824b5ef156674b39 100644
--- a/indra/newview/llvoavatar.h
+++ b/indra/newview/llvoavatar.h
@@ -565,7 +565,7 @@ class LLVOAvatar :
 	void 			updateMeshData();
 protected:
 	void 			releaseMeshData();
-	/*virtual*/ void restoreMeshData();
+	virtual void restoreMeshData();
 private:
 	BOOL 			mDirtyMesh;
 	BOOL			mMeshTexturesDirty;
diff --git a/indra/newview/llvoavatarself.cpp b/indra/newview/llvoavatarself.cpp
index b1ea8a1bbb35eca1dc0e8a6c6b57be7b4b80807e..13e28b246a80f1788620f7dd6ba4edbfe89c01a5 100644
--- a/indra/newview/llvoavatarself.cpp
+++ b/indra/newview/llvoavatarself.cpp
@@ -510,8 +510,12 @@ BOOL LLVOAvatarSelf::buildMenus()
 
 LLVOAvatarSelf::~LLVOAvatarSelf()
 {
-	gAgent.setAvatarObject(NULL);
-	gAgentWearables.setAvatarObject(NULL);
+	// gAgents pointer might have been set to a different Avatar Self, don't get rid of it if so.
+	if (gAgent.getAvatarObject() == this)
+	{
+		gAgent.setAvatarObject(NULL);
+		gAgentWearables.setAvatarObject(NULL);
+	}
 	delete mScreenp;
 	mScreenp = NULL;
 }
diff --git a/indra/newview/llworldmapview.cpp b/indra/newview/llworldmapview.cpp
index 1940d65ae4d9ec5ee4b07a1ecb1b40eb4d029722..5edf72d4ae22055d6a67dd14670013007610e180 100644
--- a/indra/newview/llworldmapview.cpp
+++ b/indra/newview/llworldmapview.cpp
@@ -128,10 +128,10 @@ void LLWorldMapView::initClass()
 	sHomeImage =			LLUI::getUIImage("map_home.tga");
 	sTelehubImage = 		LLUI::getUIImage("map_telehub.tga");
 	sInfohubImage = 		LLUI::getUIImage("map_infohub.tga");
-	sEventImage =			LLUI::getUIImage("map_event.tga");
-	sEventMatureImage =		LLUI::getUIImage("map_event_mature.tga");
+	sEventImage =			LLUI::getUIImage("Parcel_PG_Dark");
+	sEventMatureImage =		LLUI::getUIImage("Parcel_M_Dark");
 	// To Do: update the image resource for adult events.
-	sEventAdultImage =		LLUI::getUIImage("map_event_adult.tga");
+	sEventAdultImage =		LLUI::getUIImage("Parcel_R_Dark");
 
 	sTrackCircleImage =		LLUI::getUIImage("map_track_16.tga");
 	sTrackArrowImage =		LLUI::getUIImage("direction_arrow.tga");
diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml
index ccf49f6a9f1d69983869a72ddbd7526a82d90b71..309c2a5f30dbd98c5f01d025c8049fe798b8a503 100644
--- a/indra/newview/skins/default/textures/textures.xml
+++ b/indra/newview/skins/default/textures/textures.xml
@@ -143,12 +143,12 @@ with the same filename but different name
 
   <texture name="DownArrow" file_name="bottomtray/DownArrow.png" preload="false" />
 
-  <texture name="DropDown_Disabled" file_name="widgets/DropDown_Disabled.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" />
-  <texture name="DropDown_Over" file_name="widgets/DropDown_Over.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" />
-  <texture name="DropDown_Press" file_name="widgets/DropDown_Press.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" />
-  <texture name="DropDown_Selected" file_name="widgets/DropDown_Selected.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" />
-  <texture name="DropDown_On" file_name="widgets/DropDown_On.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" />
-  <texture name="DropDown_Off" file_name="widgets/DropDown_Off.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" />
+  <texture name="DropDown_Disabled" file_name="widgets/DropDown_Disabled.png" preload="true" scale.left="4" scale.top="19" scale.right="99" scale.bottom="4" />
+  <texture name="DropDown_Over" file_name="widgets/DropDown_Over.png" preload="true" scale.left="4" scale.top="19" scale.right="99" scale.bottom="4" />
+  <texture name="DropDown_Press" file_name="widgets/DropDown_Press.png" preload="true" scale.left="4" scale.top="19" scale.right="99" scale.bottom="4" />
+  <texture name="DropDown_Selected" file_name="widgets/DropDown_Selected.png" preload="true" scale.left="4" scale.top="19" scale.right="99" scale.bottom="4" />
+  <texture name="DropDown_On" file_name="widgets/DropDown_On.png" preload="true" scale.left="4" scale.top="19" scale.right="99" scale.bottom="4" />
+  <texture name="DropDown_Off" file_name="widgets/DropDown_Off.png" preload="true" scale.left="4" scale.top="19" scale.right="99" scale.bottom="4" />
 
   <texture name="DropTarget" file_name="widgets/DropTarget.png" preload="false" />
 
@@ -265,8 +265,8 @@ with the same filename but different name
   <texture name="Linden_Dollar_Alert" file_name="widgets/Linden_Dollar_Alert.png"/>
   <texture name="Linden_Dollar_Background" file_name="widgets/Linden_Dollar_Background.png"/>
 
-  <texture name="ListItem_Select" file_name="widgets/ListItem_Select.png" preload="true" />
-  <texture name="ListItem_Over" file_name="widgets/ListItem_Over.png" preload="true" />
+  <texture name="ListItem_Select" file_name="widgets/ListItem_Select.png" preload="true" scale.left="2" scale.bottom="2" scale.top="22" scale.right="278" />
+  <texture name="ListItem_Over" file_name="widgets/ListItem_Over.png" preload="true" scale.left="2" scale.bottom="2" scale.top="22" scale.right="278" />
 
   <texture name="Lock" file_name="icons/Lock.png" preload="false" />
   <texture name="Lock2" file_name="navbar/Lock.png" preload="false" />
diff --git a/indra/newview/skins/default/xui/de/panel_side_tray.xml b/indra/newview/skins/default/xui/de/panel_side_tray.xml
index 2cd11cdcef7b1de0c3cc7bbedd9181d209ebf4b0..446117962f7dac9dce9dbef698b3202105356b91 100644
--- a/indra/newview/skins/default/xui/de/panel_side_tray.xml
+++ b/indra/newview/skins/default/xui/de/panel_side_tray.xml
@@ -2,26 +2,26 @@
 <!-- Side tray cannot show background because it is always
 	partially on screen to hold tab buttons. -->
 <side_tray name="sidebar">
-	<sidetray_tab description="Seitenleiste auf-/zuklappen." name="sidebar_openclose"/>
-	<sidetray_tab description="Startseite." name="sidebar_home">
+	<sidetray_tab description="Seitenleiste auf-/zuklappen." name="sidebar_openclose" tab_title="Seitenleiste auf-/zuklappen"/>
+	<sidetray_tab description="Startseite." name="sidebar_home" tab_title="Startseite">
 		<panel label="Startseite" name="panel_home"/>
 	</sidetray_tab>
-	<sidetray_tab description="Ihr öffentliches Profil und Auswahl bearbeiten." name="sidebar_me">
+	<sidetray_tab description="Ihr öffentliches Profil und Auswahl bearbeiten." name="sidebar_me" tab_title="Mein Profil">
 		<panel label="Ich" name="panel_me"/>
 	</sidetray_tab>
-	<sidetray_tab description="Freunde, Kontakte und Leute in Ihrer Nähe finden." name="sidebar_people">
+	<sidetray_tab description="Freunde, Kontakte und Leute in Ihrer Nähe finden." name="sidebar_people" tab_title="Leute">
 		<panel_container name="panel_container">
 			<panel label="Gruppeninfo" name="panel_group_info_sidetray"/>
 			<panel label="Ignorierte Einwohner &amp; Objekte" name="panel_block_list_sidetray"/>
 		</panel_container>
 	</sidetray_tab>
-	<sidetray_tab description="Hier finden Sie neue Orte und Orte, die Sie bereits besucht haben." label="Orte" name="sidebar_places">
+	<sidetray_tab description="Hier finden Sie neue Orte und Orte, die Sie bereits besucht haben." label="Orte" name="sidebar_places" tab_title="Orte">
 		<panel label="Orte" name="panel_places"/>
 	</sidetray_tab>
-	<sidetray_tab description="Inventar durchsuchen." name="sidebar_inventory">
+	<sidetray_tab description="Inventar durchsuchen." name="sidebar_inventory" tab_title="Mein Inventar">
 		<panel label="Inventar bearbeiten" name="sidepanel_inventory"/>
 	</sidetray_tab>
-	<sidetray_tab description="Ändern Sie Ihr Aussehen und Ihren aktuellen Look." name="sidebar_appearance">
+	<sidetray_tab description="Ändern Sie Ihr Aussehen und Ihren aktuellen Look." name="sidebar_appearance" tab_title="Mein Aussehen">
 		<panel label="Aussehen bearbeiten" name="sidepanel_appearance"/>
 	</sidetray_tab>
 </side_tray>
diff --git a/indra/newview/skins/default/xui/en/floater_about_land.xml b/indra/newview/skins/default/xui/en/floater_about_land.xml
index 61ca783d14aea2b91907a16e49074964eb31786e..44c9284b36f0a79c202d877543504dcf53da26ff 100644
--- a/indra/newview/skins/default/xui/en/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/en/floater_about_land.xml
@@ -1825,6 +1825,15 @@ Only large parcels can be listed in search.
              top_delta="0"
              right="-15"
              select_on_focus="true" />
+			<check_box
+             height="16"
+             label="Hide URL"
+             layout="topleft"
+             name="hide_music_url"
+			 tool_tip="Checking this option will hide the music url to any non-authorized viewers of this parcel information."
+			 left_delta="10"
+             top_pad="5"
+             width="292" /> 
             <text
              type="string"
              length="1"
diff --git a/indra/newview/skins/default/xui/en/floater_camera.xml b/indra/newview/skins/default/xui/en/floater_camera.xml
index a797d547492aa9dce14cf53b715e1fd879e028de..2bd84209257c33f5547ef34e67b1aa8bdcb2c16d 100644
--- a/indra/newview/skins/default/xui/en/floater_camera.xml
+++ b/indra/newview/skins/default/xui/en/floater_camera.xml
@@ -82,6 +82,8 @@
               orientation="vertical"
               tool_tip="Zoom camera toward focus"
               top_pad="0"
+              min_val="0"
+              max_val="1" 
               width="18">
              <commit_callback function="Slider.value_changed"/>
            </slider_bar>
diff --git a/indra/newview/skins/default/xui/en/floater_inventory.xml b/indra/newview/skins/default/xui/en/floater_inventory.xml
index e187eabd3a2110d02ace6b7e189642acccc21617..0d381fe5cbbddb36b8487146374e0dc2319a7951 100644
--- a/indra/newview/skins/default/xui/en/floater_inventory.xml
+++ b/indra/newview/skins/default/xui/en/floater_inventory.xml
@@ -20,11 +20,11 @@
     </floater.string>
     <floater.string
      name="TitleFetching">
-        Inventory (Fetching [ITEM_COUNT] Items...) [FILTER]
+        MY INVENTORY (Fetching [ITEM_COUNT] Items...) [FILTER]
     </floater.string>
     <floater.string
      name="TitleCompleted">
-        Inventory ([ITEM_COUNT] Items) [FILTER]
+        MY INVENTORY ([ITEM_COUNT] Items) [FILTER]
     </floater.string>
     <floater.string
      name="Fetched">
diff --git a/indra/newview/skins/default/xui/en/floater_test_inspectors.xml b/indra/newview/skins/default/xui/en/floater_test_inspectors.xml
index 0f5c5f2be0789bb2fe128b502486d9202d7b5afc..209285da2e8cad6c6bcc0d0253e7f63aac888af9 100644
--- a/indra/newview/skins/default/xui/en/floater_test_inspectors.xml
+++ b/indra/newview/skins/default/xui/en/floater_test_inspectors.xml
@@ -116,10 +116,10 @@
   follows="left|top"
   font="SansSerif"
   height="20"
-  left="0"
+  left="10"
   max_length="65536"
   name="slurl"
-  top_pad="4"
+  top_pad="20"
   width="150">
     secondlife:///app/agent/00000000-0000-0000-0000-000000000000/inspect
   </text>
@@ -127,12 +127,11 @@
   follows="left|top"
   font="SansSerif"
   height="20"
-  left="0"
+  left="10"
   max_length="65536"
   name="slurl_group"
-  top_pad="4"
+  top_pad="20"
   width="150">
     secondlife:///app/group/00000000-0000-0000-0000-000000000000/inspect
   </text>
-
 </floater>
diff --git a/indra/newview/skins/default/xui/en/floater_test_text_editor.xml b/indra/newview/skins/default/xui/en/floater_test_text_editor.xml
index dc8f00d5f36981288b7b331a1cf85137a7201667..b730f0e511f9da97cb2e7b5943f1ca7002580d8c 100644
--- a/indra/newview/skins/default/xui/en/floater_test_text_editor.xml
+++ b/indra/newview/skins/default/xui/en/floater_test_text_editor.xml
@@ -28,4 +28,17 @@
    width="200">
     This contains long text and should scroll horizontally to the right
   </text_editor>
+  <text_editor
+   height="50"
+   follows="top|left|bottom"
+   font="SansSerif"
+   left="10"
+   name="numeric_text_editor"
+   tool_tip="text editor for numeric text entry only"
+   top_pad="10"
+   text_type="int"
+   width="200">
+    This is text that is NOT a number, so shouldn't appear
+  </text_editor>
+
 </floater>
diff --git a/indra/newview/skins/default/xui/en/floater_world_map.xml b/indra/newview/skins/default/xui/en/floater_world_map.xml
index 34d4b19410cab95611f2ccd7bbd7b3847a9a838e..86ac7c8e54bf3b17af29ab729cf6511f8d16b40f 100644
--- a/indra/newview/skins/default/xui/en/floater_world_map.xml
+++ b/indra/newview/skins/default/xui/en/floater_world_map.xml
@@ -279,12 +279,12 @@
          <icon
      follows="top|right"
      height="16"
-     image_name="map_event.tga"
+     image_name="Parcel_PG_Dark"
      layout="topleft"
      mouse_opaque="true"
      name="event"
      left_pad="0"
-     width="16" />
+     width="18" />
       <text
      type="string"
      length="1"
@@ -312,13 +312,13 @@
     <icon
      follows="top|right"
      height="16"
-     image_name="map_event_mature.tga"
+     image_name="Parcel_M_Dark"
      layout="topleft"
      mouse_opaque="true"
      name="events_mature_icon"
      top_delta="0"
      left_pad="0"
-     width="16" />
+     width="18" />
            <text
      type="string"
      length="1"
@@ -345,13 +345,13 @@
     <icon
      follows="top|right"
      height="16"
-     image_name="map_event_adult.tga"
+     image_name="Parcel_R_Dark"
      layout="topleft"
      left_pad="0"
      mouse_opaque="true"
      name="events_adult_icon"
      top_delta="0"
-     width="16" />
+     width="18" />
                 <text
      type="string"
      length="1"
diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml
index 72ac457882d0a50e1ff7e62a6c53f0c26fdb29ab..90381c2af46b96970ff46e5e79f05c7aed5826bd 100644
--- a/indra/newview/skins/default/xui/en/notifications.xml
+++ b/indra/newview/skins/default/xui/en/notifications.xml
@@ -1731,21 +1731,6 @@ Multiple parcels selected.
 Try selecting a single parcel.
   </notification>
 
-  <notification
-   icon="alertmodal.tga"
-   name="ParcelCanPlayMedia"
-   type="alertmodal">
-This location can play streaming media.
-Streaming media requires a fast Internet connection.
-
-Play streaming media when available?
-(You can change this option later under Preferences &gt; Privacy.)
-    <usetemplate
-     name="okcancelbuttons"
-     notext="Disable"
-     yestext="Play Media"/>
-  </notification>
-
   <notification
    icon="alertmodal.tga"
    name="CannotDeedLandWaitingForServer"
diff --git a/indra/newview/skins/default/xui/en/panel_active_object_row.xml b/indra/newview/skins/default/xui/en/panel_active_object_row.xml
index 7657fb8055f32bb6f27a2c4c411baf4f186c6f49..bef5f8dafd98b63227e68a30e52ae1aa09966a87 100644
--- a/indra/newview/skins/default/xui/en/panel_active_object_row.xml
+++ b/indra/newview/skins/default/xui/en/panel_active_object_row.xml
@@ -10,10 +10,6 @@
   background_opaque="false"
   background_visible="true"
   bg_alpha_color="0.0 0.0 0.0 0.0" >
-  <string
-   name="unknown_obj">
-    Unknown Object
-  </string>
   <chiclet_script
     name="object_chiclet"
     layout="topleft"
diff --git a/indra/newview/skins/default/xui/en/panel_chat_header.xml b/indra/newview/skins/default/xui/en/panel_chat_header.xml
index 89d632c4c6df2dd097428fa2b44c09d00531588c..51e2256a7d5d5663256e1475ca1ec520f464f81c 100644
--- a/indra/newview/skins/default/xui/en/panel_chat_header.xml
+++ b/indra/newview/skins/default/xui/en/panel_chat_header.xml
@@ -19,7 +19,7 @@
          name="avatar_icon"
          top="3"
          width="18" />
-    <text_editor
+    <text
       allow_scroll="false"
       v_pad = "7"
       read_only = "true"
diff --git a/indra/newview/skins/default/xui/en/panel_classified_info.xml b/indra/newview/skins/default/xui/en/panel_classified_info.xml
index 31719aad2012814c36552a6a7892ec5027fe517a..34c1923582c9c19f6c4d62da9731c1ef0b56a3e5 100644
--- a/indra/newview/skins/default/xui/en/panel_classified_info.xml
+++ b/indra/newview/skins/default/xui/en/panel_classified_info.xml
@@ -29,7 +29,7 @@
      layout="topleft"
      name="back_btn"
      picture_style="true"
-     left="10"
+     left="11"
      tab_stop="false"
      top="2"
      width="23" />
@@ -40,7 +40,7 @@
      layout="topleft"
      left_pad="10"
      name="title"
-     text_color="white"
+     text_color="LtGray"
      top="0"
      value="Classified Info"
      use_ellipses="true"
@@ -49,13 +49,13 @@
      color="DkGray2"
      opaque="true"
      follows="all"
-     height="500"
+     height="502"
      layout="topleft"
-     left="10"
+     left="9"
      top_pad="10"
      name="profile_scroll"
      reserve_scroll_corner="false"
-     width="313">
+     width="310">
     <panel
      name="scroll_content_panel"
      follows="left|top"
@@ -65,16 +65,16 @@
      background_visible="false"
      height="500"
      left="0"
-     width="295">
+     width="285">
         <texture_picker
          enabled="false"
-         follows="left|top"
+         follows="left|top|right"
          height="197"
          layout="topleft"
-         left="10"
+         left="11"
          name="classified_snapshot"
-         top="20"
-         width="290" />
+         top="10"
+         width="286" />
         <text_editor
          allow_scroll="false"
          bg_visible="false"
@@ -181,37 +181,35 @@
     </scroll_container>
     <panel
      follows="left|right|bottom"
-     height="20"
+     height="35"
      layout="topleft"
-     top_pad="8"
-     left="10"
+     top_pad="5"
+     left="9"
      name="buttons">
         <button
          follows="bottom|left"
-         height="19"
+         height="23"
          label="Teleport"
          layout="topleft"
          left="0"
          name="teleport_btn"
          top="0"
-         width="90" />
+         width="101" />
         <button
          follows="bottom|left"
-         height="19"
+         height="23"
          label="Map"
          layout="topleft"
-         left_pad="10"
+         left_pad="3"
          name="show_on_map_btn"
-         top="0"
-         width="90" />
+         width="100" />
         <button
          follows="bottom|left"
-         height="19"
+         height="23"
          label="Edit"
          layout="topleft"
-         right="-1"
          name="edit_btn"
-         top="0"
-         width="90" />
+         left_pad="3"
+         width="101" />
     </panel>
 </panel>
diff --git a/indra/newview/skins/default/xui/en/panel_classifieds_list_item.xml b/indra/newview/skins/default/xui/en/panel_classifieds_list_item.xml
index 9518151b7240181121f5c73f0f2bbb1c44a56ab6..1375eb87d9e3c30f96ea1dd0e96e92598a3e517c 100644
--- a/indra/newview/skins/default/xui/en/panel_classifieds_list_item.xml
+++ b/indra/newview/skins/default/xui/en/panel_classifieds_list_item.xml
@@ -76,6 +76,6 @@
      left_pad="5"
      right="-8"
      name="info_chevron"
-     top_delta="15"
+     top_delta="24"
      width="20" />
 </panel>
diff --git a/indra/newview/skins/default/xui/en/panel_edit_classified.xml b/indra/newview/skins/default/xui/en/panel_edit_classified.xml
index 188ded3dabaf12663635343a52ade9eb2de2c199..a357ba1d97d04e40864ab59bc239f51b73e96c58 100644
--- a/indra/newview/skins/default/xui/en/panel_edit_classified.xml
+++ b/indra/newview/skins/default/xui/en/panel_edit_classified.xml
@@ -23,7 +23,7 @@
      layout="topleft"
      name="back_btn"
      picture_style="true"
-     left="10"
+     left="11"
      tab_stop="false"
      top="2"
      width="23" />
@@ -31,27 +31,27 @@
      type="string"
      length="1"
      follows="top"
-     font="SansSerifHuge"
-     height="15"
+     font="SansSerifHugeBold"
+     height="26"
      layout="topleft"
      left_pad="10"
      name="title"
-     text_color="white"
-     top="5"
+     text_color="LtGray"
+     top="0"
      width="250">
         Edit Classified
     </text>
    <scroll_container
      color="DkGray2"
      follows="all"
-     height="510"
+     height="502"
      layout="topleft"
-     left="10"
+     left="9"
      top_pad="10"
      name="profile_scroll"
      reserve_scroll_corner="false"
      opaque="true"
-     width="313">
+     width="310">
     <panel
      name="scroll_content_panel"
      follows="left|top"
@@ -65,10 +65,10 @@
     <texture_picker
      follows="left|top|right"
      height="197"
-     width="290"
+     width="286"
      layout="topleft"
-     top="20"
-     left="10"
+     top="10"
+     left="11"
      name="classified_snapshot" />
           <icon
            height="18"
@@ -78,7 +78,7 @@
            name="edit_icon"
            label=""
            tool_tip="Click to select an image"
-           top="27"
+           top="17"
            width="18" />
         <text
          type="string"
@@ -165,29 +165,29 @@
         </text>
         <button
          follows="left|top"
-         height="20"
+         height="23"
          label="Set to Current Location"
          layout="topleft"
-         left="8"
+         left="10"
          top_pad="5"
          name="set_to_curr_location_btn"
-         width="200" />
+         width="156" />
         <combo_box
          follows="left|top" 
-         height="18" 
+         height="23" 
          label=""
 	     left="10" 
          name="category" 
          top_pad="5"
-         width="200" />
+         width="156" />
         <combo_box 
          allow_text_entry="false" 
          follows="left|top" 
-         height="18" 
+         height="23" 
          left="10"
          name="content_type" 
          top_pad="5"
-         width="200">
+         width="156">
          <combo_item 
           name="mature_ci" 
           value="Mature">
@@ -203,10 +203,11 @@
          decimal_digits="0"
          follows="left|top"
          halign="left"
-         height="16"
+         height="23"
          increment="1"
          label_width="20"
          label="L$"
+         v_pad="10"
          layout="topleft"
          left="10"
          value="50"
@@ -228,30 +229,29 @@
     </scroll_container>
     <panel
      follows="left|right|bottom"
-     height="20"
+     height="23"
      label="bottom_panel"
      layout="topleft"
-     left="10"
+     left="9"
      name="bottom_panel"
      top_pad="5"
      width="303">
         <button
          follows="bottom|left"
-         height="19"
+         height="23"
          label="Save"
          layout="topleft"
          name="save_changes_btn"
          left="0"
          top="0"
-         width="130" />
+         width="152" />
         <button
          follows="bottom|left"
-         height="19"
+         height="23"
          label="Cancel"
          layout="topleft"
          name="cancel_btn"
-         left_pad="5"
-         right="-1"
-         width="130" />
+         left_pad="3"
+         width="152" />
     </panel>
 </panel>
diff --git a/indra/newview/skins/default/xui/en/panel_edit_pick.xml b/indra/newview/skins/default/xui/en/panel_edit_pick.xml
index 8e39697a16ec63e57f6d1672a3dc7019bb13a734..6ef762dc1d4ee793c36318b8109387b9e2b558b9 100644
--- a/indra/newview/skins/default/xui/en/panel_edit_pick.xml
+++ b/indra/newview/skins/default/xui/en/panel_edit_pick.xml
@@ -18,7 +18,7 @@
      image_overlay="BackArrow_Off"
      layout="topleft"
      name="back_btn"
-     left="10"
+     left="11"
      tab_stop="false"
      top="2"
      width="23" />
@@ -26,26 +26,26 @@
      type="string"
      length="1"
      follows="top"
-     font="SansSerifHuge"
-     height="15"
+     font="SansSerifHugeBold"
+     height="26"
      layout="topleft"
      left_pad="10"
      name="title"
-     text_color="white"
-     top="5"
+     text_color="LtGray"
+     top="0"
      width="250">
         Edit Pick
     </text>
    <scroll_container
      color="DkGray2"
      follows="all"
-     height="500"
+     height="502"
      layout="topleft"
-     left="10"
+     left="9"
      top_pad="10"
      name="profile_scroll"
      opaque="true"
-     width="313">
+     width="310">
     <panel
      name="scroll_content_panel"
      follows="left|top|right"
@@ -59,11 +59,11 @@
     <texture_picker
      follows="left|top|right"
      height="197"
-     width="280"
+     width="272"
      layout="topleft"
      no_commit_on_selection="true"
-     top="20"
-     left="10"
+     top="10"
+     left="11"
      name="pick_snapshot" />
           <icon
            height="18"
@@ -73,7 +73,7 @@
            name="edit_icon"
            label=""
            tool_tip="Click to select an image"
-           top="27"
+           top="17"
            width="18" />
         <text
          type="string"
@@ -100,7 +100,7 @@
          max_length="63"
          name="pick_name"
          text_color="black"
-         width="280" />
+         width="273" />
         <text
          type="string"
          length="1"
@@ -119,7 +119,7 @@
         <text_editor
          follows="left|top|right"
          height="100"
-         width="280"
+         width="273"
          hide_scrollbar="false"
          layout="topleft"
          left="10"
@@ -158,41 +158,40 @@
         </text>
         <button
          follows="left|top"
-         height="20"
+         height="23"
          label="Set to Current Location"
          layout="topleft"
          left="8"
          top_pad="0"
          name="set_to_curr_location_btn"
-         width="200" />
+         width="156" />
     </panel>
     </scroll_container>
     <panel
      follows="left|right|bottom"
-     height="20"
+     height="23"
      label="bottom_panel"
      layout="topleft"
-     left="10"
+     left="9"
      name="bottom_panel"
      top_pad="5"
      width="303">
         <button
          follows="bottom|left"
-         height="19"
+         height="23"
          label="Save [WHAT]"
          layout="topleft"
          name="save_changes_btn"
          left="0"
          top="0"
-         width="130" />
+         width="152" />
         <button
          follows="bottom|left"
-         height="19"
+         height="23"
          label="Cancel"
          layout="topleft"
          name="cancel_btn"
-         left_pad="5"
-         right="-1"
-         width="130" />
+         left_pad="3"
+        width="152" />
     </panel>
 </panel>
diff --git a/indra/newview/skins/default/xui/en/panel_group_notices.xml b/indra/newview/skins/default/xui/en/panel_group_notices.xml
index 5f46ad7860159c4a80109dd3fad43286543156e8..1f16aea2ef3f79dd06e082f254ed1f19428fedda 100644
--- a/indra/newview/skins/default/xui/en/panel_group_notices.xml
+++ b/indra/newview/skins/default/xui/en/panel_group_notices.xml
@@ -159,6 +159,7 @@ Maximum 200 per group daily
          left_pad="3"
          max_length="511"
          name="create_message"
+         text_type="ascii"
          top_delta="0"
          width="220"
          word_wrap="true" />
diff --git a/indra/newview/skins/default/xui/en/panel_landmark_info.xml b/indra/newview/skins/default/xui/en/panel_landmark_info.xml
index d1b22a34bbe773d271dccc0e53d51db4a01c68a9..6927906d3dfe38711d95e49e45d4f0558c43072c 100644
--- a/indra/newview/skins/default/xui/en/panel_landmark_info.xml
+++ b/indra/newview/skins/default/xui/en/panel_landmark_info.xml
@@ -269,6 +269,7 @@
                  name="notes_editor"
                  read_only="true"
                  text_readonly_color="white"
+                 text_type="ascii"
                  top_pad="5"
                  width="290"
                  wrap="true" />
diff --git a/indra/newview/skins/default/xui/en/panel_people.xml b/indra/newview/skins/default/xui/en/panel_people.xml
index 447ac1b1231e901f1e0df6b5eb6441132acfcf0a..31ea54cf405f426c7a62d8f1fcbd8cc3a4b69c8f 100644
--- a/indra/newview/skins/default/xui/en/panel_people.xml
+++ b/indra/newview/skins/default/xui/en/panel_people.xml
@@ -237,7 +237,7 @@ If you're looking for people to hang out with, [secondlife:///app/worldmap try t
              left="0"
              name="group_list"
              no_filtered_groups_msg="No groups"
-             no_groups_msg="[secondlife:///app/search/groups Trying searching for some groups to join.]"
+             no_groups_msg="[secondlife:///app/search/groups Try searching for some groups to join.]"
              top="0"
              width="313" />
             <panel
diff --git a/indra/newview/skins/default/xui/en/panel_pick_info.xml b/indra/newview/skins/default/xui/en/panel_pick_info.xml
index 375f369ba729c3c8827240700d8cecab5bfb4e69..097813131ff63df046852b23cdc2f34ab41a8f96 100644
--- a/indra/newview/skins/default/xui/en/panel_pick_info.xml
+++ b/indra/newview/skins/default/xui/en/panel_pick_info.xml
@@ -16,7 +16,7 @@
      image_overlay="BackArrow_Off"
      layout="topleft"
      name="back_btn"
-     left="10"
+     left="11"
      tab_stop="false"
      top="2"
      width="23" />
@@ -27,7 +27,7 @@
      layout="topleft"
      left_pad="10"
      name="title"
-     text_color="white"
+     text_color="LtGray"
      top="0"
      value="Pick Info"
      use_ellipses="true"
@@ -36,12 +36,12 @@
      color="DkGray2"
      opaque="true"
      follows="all"
-     height="500"
+     height="502"
      layout="topleft"
-     left="10"
-     top_pad="5"
+     left="9"
+     top_pad="10"
      name="profile_scroll"
-     width="313">
+     width="310">
     <panel
      name="scroll_content_panel"
      follows="left|top|right"
@@ -57,10 +57,10 @@
          follows="left|top|right"
          height="197"
          layout="topleft"
-         left="10"
+         left="11"
          name="pick_snapshot"
-         top="20"
-         width="280" />
+         top="10"
+         width="272" />
         <text_editor
          allow_scroll="false"
          bg_visible="false"
@@ -115,8 +115,8 @@
      follows="left|right|bottom"
      height="35"
      layout="topleft"
-     top_pad="8"
-     left="10"
+     top_pad="5"
+     left="9"
      name="buttons">
         <button
          follows="bottom|left"
@@ -126,24 +126,22 @@
          left="0"
          name="teleport_btn"
          top="0"
-         width="90" />
+         width="101" />
         <button
          follows="bottom|left"
          height="23"
          label="Map"
          layout="topleft"
-         left_pad="10"
+         left_pad="3"
          name="show_on_map_btn"
-         top="0"
-         width="90" />
+         width="100" />
         <button
          follows="bottom|left"
          height="23"
          label="Edit"
          layout="topleft"
-         right="-1"
          name="edit_btn"
-         top="0"
-         width="90" />
+         left_pad="3"
+         width="101" />
     </panel>
 </panel>
diff --git a/indra/newview/skins/default/xui/en/panel_pick_list_item.xml b/indra/newview/skins/default/xui/en/panel_pick_list_item.xml
index 9bcce1685e8618204978f70c0aa449475b80fdd4..8b25fb5d2a6c74c4329e739ab3dbad154fba8b44 100644
--- a/indra/newview/skins/default/xui/en/panel_pick_list_item.xml
+++ b/indra/newview/skins/default/xui/en/panel_pick_list_item.xml
@@ -76,6 +76,6 @@
      left_pad="5"
      right="-8"
      name="info_chevron"
-     top_delta="15"
+     top_delta="24"
      width="20" />
 </panel>
diff --git a/indra/newview/skins/default/xui/en/panel_picks.xml b/indra/newview/skins/default/xui/en/panel_picks.xml
index d31f4d039f9e5e6c335e6545dd0d7385a63bfade..887a89d5185d570ee9c3ab131bd133aa52f48bea 100644
--- a/indra/newview/skins/default/xui/en/panel_picks.xml
+++ b/indra/newview/skins/default/xui/en/panel_picks.xml
@@ -1,5 +1,8 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes" ?>
 <panel
+bg_opaque_color="DkGray2"
+       background_visible="true"
+       background_opaque="true"
  follows="all"
  height="540"
  label="Picks"
@@ -70,13 +73,15 @@
     </accordion_tab>
  </accordion>
    <panel
-         background_visible="true"
+bg_opaque_color="DkGray2"
+       background_visible="true"
+       background_opaque="true"
          bevel_style="none"
          enabled="false"
          auto_resize="false"
          follows="bottom"
-         left="0"
-         height="18"
+         left="1"
+         height="27"
          label="bottom_panel"
          layout="topleft"
          name="edit_panel"
@@ -90,9 +95,9 @@
              image_unselected="OptionsMenu_Off"
               image_disabled="OptionsMenu_Disabled"
              layout="topleft"
-             left="0"
+             left="10"
              name="gear_menu_btn"
-             top="5"
+             top="9"
              width="18" />
             <button
              follows="bottom|left"
@@ -104,7 +109,7 @@
              left_pad="15"
              name="new_btn"
              tool_tip="Create a new pick or classified at the current location"
-             top="5"
+             top="9"
              width="18" />
             <button
              follows="bottom|right"
@@ -115,14 +120,17 @@
              layout="topleft"
              name="trash_btn"
              right="-10"
-             top="5"
+             top="9"
              width="18" />
         </panel>
         <panel
+ bg_opaque_color="DkGray"
+       background_visible="true"
+       background_opaque="true"
          layout="topleft"
          left="0"
          height="30"
-         top_pad="10"
+         top_pad="7"
          name="buttons_cucks"
          width="313">
        <button
@@ -131,35 +139,33 @@
          height="23"
          label="Info"
          layout="topleft"
-         left="5"
+         left="2"
          name="info_btn"
          tab_stop="false"
          tool_tip="Show pick information"
-         top="0"
-         width="55" />
+         top="5"
+         width="95" />
         <button
          enabled="false"
          follows="bottom|left"
          height="23"
          label="Teleport"
          layout="topleft"
-         left_pad="5"
+         left_pad="3"
          name="teleport_btn"
          tab_stop="false"
          tool_tip="Teleport to the corresponding area"
-         top="0"
-         width="77" />
+         width="117" />
         <button
          enabled="false"
          follows="bottom|left"
          height="23"
          label="Map"
          layout="topleft"
-         left_pad="5"
+         left_pad="3"
          name="show_on_map_btn"
          tab_stop="false"
          tool_tip="Show the corresponding area on the World Map"
-         top="0"
-         width="50" />
+         width="90" />
         </panel>
 </panel>
diff --git a/indra/newview/skins/default/xui/en/widgets/button.xml b/indra/newview/skins/default/xui/en/widgets/button.xml
index 74d8478551334ab7782229f75b3c25a72641410c..1b34a731a574d729be20c51e54dc4e6107a44402 100644
--- a/indra/newview/skins/default/xui/en/widgets/button.xml
+++ b/indra/newview/skins/default/xui/en/widgets/button.xml
@@ -7,10 +7,9 @@
         image_selected="PushButton_Selected"
         image_disabled_selected="PushButton_Selected_Disabled"
         image_disabled="PushButton_Disabled"
-        image_left_pad="0"
-        image_right_pad="0"
         image_top_pad="0"
         image_bottom_pad="0"
+        imgoverlay_label_space="1"
         label_color="ButtonLabelColor"
         label_color_selected="ButtonLabelSelectedColor"
         label_color_disabled="ButtonLabelDisabledColor"
diff --git a/indra/newview/skins/default/xui/en/widgets/inspector.xml b/indra/newview/skins/default/xui/en/widgets/inspector.xml
index 8ec206023e5b89128caf1413e76393cf2e9b7ce7..428b2ce03b0427c1245722f973db79c64cb26bf0 100644
--- a/indra/newview/skins/default/xui/en/widgets/inspector.xml
+++ b/indra/newview/skins/default/xui/en/widgets/inspector.xml
@@ -1,10 +1,9 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<!-- See also settings.xml UIFloater* settings for configuration -->
 <inspector name="inspector"
-          bg_opaque_color="DkGray_66"
-          background_visible="true"
-          bg_opaque_image="none"
-          background_opaque="true"
-          bg_alpha_image="none"
-		  text_color="InspectorTipTextColor"
- />
+           bg_opaque_color="DkGray_66"
+           background_visible="true"
+           bg_opaque_image="Inspector_Hover"
+           background_opaque="true"
+           bg_alpha_image="none"
+           mouse_opaque="true" 
+           text_color="InspectorTipTextColor"/>
diff --git a/indra/newview/skins/default/xui/en/widgets/tool_tip.xml b/indra/newview/skins/default/xui/en/widgets/tool_tip.xml
index a19201f7c33ff1db56c5ef28ad2d3524d0e3dac7..9ca15ae50d39a63ed1715620436b7811161ddba1 100644
--- a/indra/newview/skins/default/xui/en/widgets/tool_tip.xml
+++ b/indra/newview/skins/default/xui/en/widgets/tool_tip.xml
@@ -1,12 +1,11 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<!-- See also settings.xml UIFloater* settings for configuration -->
 <tool_tip name="tooltip"
           max_width="200"
           padding="4"
           wrap="true"
           font="SansSerif"
+          mouse_opaque="false" 
           bg_opaque_image="Tooltip"
           background_opaque="true"
           background_visible="true"
-		  text_color="ToolTipTextColor"
- />
+		      text_color="ToolTipTextColor"/>
diff --git a/indra/newview/skins/default/xui/ja/floater_buy_currency.xml b/indra/newview/skins/default/xui/ja/floater_buy_currency.xml
index ffdcf838d3f30f8a97cd2cd673d3f51c0d3f94a5..357b3682ba0dd01e894a3292c366fa9bc22176f6 100644
--- a/indra/newview/skins/default/xui/ja/floater_buy_currency.xml
+++ b/indra/newview/skins/default/xui/ja/floater_buy_currency.xml
@@ -46,7 +46,7 @@
 		L$ [AMT]
 	</text>
 	<text name="currency_links">
-		[http://www.secondlife.com/my/account/payment_method_management.php?lang=ja-JP payment method] | [http://www.secondlife.com/my/account/currency.php?lang=ja-JP currency] | [http://www.secondlife.com/my/account/exchange_rates.php?lang=ja-JP exchange rate]
+		[http://www.secondlife.com/my/account/payment_method_management.php?lang=ja-JP 支払方法] | [http://www.secondlife.com/my/account/currency.php?lang=ja-JP 通貨] | [http://www.secondlife.com/my/account/exchange_rates.php?lang=ja-JP 換算レート]
 	</text>
 	<text name="exchange_rate_note">
 		金額を再入力して最新換算レートを確認します。
diff --git a/indra/newview/skins/default/xui/ja/panel_side_tray.xml b/indra/newview/skins/default/xui/ja/panel_side_tray.xml
index ce5f0b940c2384ecf97e823c69e7822a1aaea4bd..48636f1e3b9963969ba470500715481fdfb1e356 100644
--- a/indra/newview/skins/default/xui/ja/panel_side_tray.xml
+++ b/indra/newview/skins/default/xui/ja/panel_side_tray.xml
@@ -2,26 +2,26 @@
 <!-- Side tray cannot show background because it is always
 	partially on screen to hold tab buttons. -->
 <side_tray name="sidebar">
-	<sidetray_tab description="サイドバーを表示・非表示" name="sidebar_openclose"/>
-	<sidetray_tab description="ホーム。" name="sidebar_home">
+	<sidetray_tab description="サイドバーを表示・非表示" name="sidebar_openclose" tab_title="サイドバーを開く・閉じる"/>
+	<sidetray_tab description="ホーム。" name="sidebar_home" tab_title="ホーム">
 		<panel label="ホーム" name="panel_home"/>
 	</sidetray_tab>
-	<sidetray_tab description="あなたの公開プロフィールとピックを編集してください。" name="sidebar_me">
+	<sidetray_tab description="あなたの公開プロフィールとピックを編集してください。" name="sidebar_me" tab_title="マイ プロフィール">
 		<panel label="ミー" name="panel_me"/>
 	</sidetray_tab>
-	<sidetray_tab description="フレンド、連絡先、近くの人を探してください。" name="sidebar_people">
+	<sidetray_tab description="フレンド、連絡先、近くの人を探してください。" name="sidebar_people" tab_title="人">
 		<panel_container name="panel_container">
 			<panel label="グループ情報" name="panel_group_info_sidetray"/>
 			<panel label="ブロックされた住人とオブジェクト" name="panel_block_list_sidetray"/>
 		</panel_container>
 	</sidetray_tab>
-	<sidetray_tab description="行きたい場所、行ったことのある場所を探してください。" label="場所" name="sidebar_places">
+	<sidetray_tab description="行きたい場所、行ったことのある場所を探してください。" label="場所" name="sidebar_places" tab_title="場所">
 		<panel label="場所" name="panel_places"/>
 	</sidetray_tab>
-	<sidetray_tab description="あなたの持ち物を眺めてください。" name="sidebar_inventory">
+	<sidetray_tab description="あなたの持ち物を眺めてください。" name="sidebar_inventory" tab_title="マイ 持ち物">
 		<panel label="持ち物を編集" name="sidepanel_inventory"/>
 	</sidetray_tab>
-	<sidetray_tab description="あなたの容姿や現在の見た目を変更してください。" name="sidebar_appearance">
+	<sidetray_tab description="あなたの容姿や現在の見た目を変更してください。" name="sidebar_appearance" tab_title="マイ 容姿">
 		<panel label="容姿の編集" name="sidepanel_appearance"/>
 	</sidetray_tab>
 </side_tray>