diff --git a/autobuild.xml b/autobuild.xml
index a86c8fd866b9f71dfd668ad1a3c1774ffd208738..05e0ac28aef6940f09acf2648eeb82d30a8b3111 100644
--- a/autobuild.xml
+++ b/autobuild.xml
@@ -1770,9 +1770,9 @@
             <key>archive</key>
             <map>
               <key>hash</key>
-              <string>dde928cb24d22a267004a8c17669ba65</string>
+              <string>8aedfdcf670348c18a9991ae1b384a61</string>
               <key>url</key>
-              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-google-perftools/rev/226426/arch/Linux/installer/google_perftools-1.7-linux-20110412.tar.bz2</string>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-google-perftools/rev/262672/arch/Linux/installer/gperftools-2.0-linux-20120727.tar.bz2</string>
             </map>
             <key>name</key>
             <string>linux</string>
@@ -1782,9 +1782,9 @@
             <key>archive</key>
             <map>
               <key>hash</key>
-              <string>8308f7bd68bb7083655753b7abe7225f</string>
+              <string>f62841804acb91e1309603a84f3f0ce8</string>
               <key>url</key>
-              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-google-perftools/rev/226287/arch/CYGWIN/installer/google_perftools-1.7-windows-20110411.tar.bz2</string>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-google-perftools/rev/262672/arch/CYGWIN/installer/gperftools-2.0-windows-20120727.tar.bz2</string>
             </map>
             <key>name</key>
             <string>windows</string>
diff --git a/indra/llcharacter/llmotioncontroller.cpp b/indra/llcharacter/llmotioncontroller.cpp
index 4f6351709ede6eb70ddc24df82aaaa17fcaa8ba6..829dda999378d04735344fe25f5f50d33ed65e1f 100644
--- a/indra/llcharacter/llmotioncontroller.cpp
+++ b/indra/llcharacter/llmotioncontroller.cpp
@@ -29,8 +29,6 @@
 //-----------------------------------------------------------------------------
 #include "linden_common.h"
 
-#include "llmemtype.h"
-
 #include "llmotioncontroller.h"
 #include "llkeyframemotion.h"
 #include "llmath.h"
@@ -335,7 +333,6 @@ void LLMotionController::removeMotionInstance(LLMotion* motionp)
 //-----------------------------------------------------------------------------
 LLMotion* LLMotionController::createMotion( const LLUUID &id )
 {
-	LLMemType mt(LLMemType::MTYPE_ANIMATION);
 	// do we have an instance of this motion for this character?
 	LLMotion *motion = findMotion(id);
 
diff --git a/indra/llcommon/CMakeLists.txt b/indra/llcommon/CMakeLists.txt
index 36a8319189c6069eee94b7f9c6721b0c9074f41a..1812e39b36460f89baf0d1c37f149808b3068716 100644
--- a/indra/llcommon/CMakeLists.txt
+++ b/indra/llcommon/CMakeLists.txt
@@ -53,7 +53,7 @@ set(llcommon_SOURCE_FILES
     lleventfilter.cpp
     llevents.cpp
     lleventtimer.cpp
-    llfasttimer_class.cpp
+    llfasttimer.cpp
     llfile.cpp
     llfindlocale.cpp
     llfixedbuffer.cpp
@@ -71,7 +71,6 @@ set(llcommon_SOURCE_FILES
     llmd5.cpp
     llmemory.cpp
     llmemorystream.cpp
-    llmemtype.cpp
     llmetrics.cpp
     llmetricperformancetester.cpp
     llmortician.cpp
@@ -167,7 +166,6 @@ set(llcommon_HEADER_FILES
     lleventemitter.h
     llextendedstatus.h
     llfasttimer.h
-    llfasttimer_class.h
     llfile.h
     llfindlocale.h
     llfixedbuffer.h
@@ -196,7 +194,6 @@ set(llcommon_HEADER_FILES
     llmd5.h
     llmemory.h
     llmemorystream.h
-    llmemtype.h
     llmetrics.h
     llmetricperformancetester.h
     llmortician.h
@@ -242,6 +239,7 @@ set(llcommon_HEADER_FILES
     llthread.h
     llthreadsafequeue.h
     lltimer.h
+    lltrace.h
     lltreeiterators.h
     lltypeinfolookup.h
     lluri.h
diff --git a/indra/llcommon/llallocator.cpp b/indra/llcommon/llallocator.cpp
index 87654b5b97dc7b6bbab4c65aa25355f19cb41d40..34fc28d8cc4699349cefd235b31c44706c322cc1 100644
--- a/indra/llcommon/llallocator.cpp
+++ b/indra/llcommon/llallocator.cpp
@@ -35,28 +35,6 @@
 DECLARE_bool(heap_profile_use_stack_trace);
 //DECLARE_double(tcmalloc_release_rate);
 
-// static
-void LLAllocator::pushMemType(S32 type)
-{
-    if(isProfiling())
-    {
-    	PushMemType(type);
-    }
-}
-
-// static
-S32 LLAllocator::popMemType()
-{
-    if (isProfiling())
-    {
-    	return PopMemType();
-    }
-    else
-    {
-        return -1;
-    }
-}
-
 void LLAllocator::setProfilingEnabled(bool should_enable)
 {
     // NULL disables dumping to disk
@@ -94,17 +72,6 @@ std::string LLAllocator::getRawProfile()
 // stub implementations for when tcmalloc is disabled
 //
 
-// static
-void LLAllocator::pushMemType(S32 type)
-{
-}
-
-// static
-S32 LLAllocator::popMemType()
-{
-    return -1;
-}
-
 void LLAllocator::setProfilingEnabled(bool should_enable)
 {
 }
diff --git a/indra/llcommon/llallocator.h b/indra/llcommon/llallocator.h
index a91dd57d1445cc470e97f2ed4bbef58343d35fcb..d26ad73c5bc064eac3a0d4b45d66d43e3de0d92a 100644
--- a/indra/llcommon/llallocator.h
+++ b/indra/llcommon/llallocator.h
@@ -29,16 +29,10 @@
 
 #include <string>
 
-#include "llmemtype.h"
 #include "llallocator_heap_profile.h"
 
 class LL_COMMON_API LLAllocator {
     friend class LLMemoryView;
-    friend class LLMemType;
-
-private:
-	static void pushMemType(S32 type);
-	static S32 popMemType();
 
 public:
     void setProfilingEnabled(bool should_enable);
diff --git a/indra/llcommon/llfasttimer_class.cpp b/indra/llcommon/llfasttimer.cpp
similarity index 62%
rename from indra/llcommon/llfasttimer_class.cpp
rename to indra/llcommon/llfasttimer.cpp
index 463f558c2c3c42fe025b8503ca3ae0ea07af4acd..0abaf7306387b9c2eaff9d97b9cc8b370c0bae94 100644
--- a/indra/llcommon/llfasttimer_class.cpp
+++ b/indra/llcommon/llfasttimer.cpp
@@ -1,5 +1,5 @@
 /** 
- * @file llfasttimer_class.cpp
+ * @file llfasttimer.cpp
  * @brief Implementation of the fast timer.
  *
  * $LicenseInfo:firstyear=2004&license=viewerlgpl$
@@ -64,19 +64,12 @@ BOOL LLFastTimer::sMetricLog = FALSE;
 LLMutex* LLFastTimer::sLogLock = NULL;
 std::queue<LLSD> LLFastTimer::sLogQueue;
 
-#define USE_RDTSC 0
-
 #if LL_LINUX || LL_SOLARIS
 U64 LLFastTimer::sClockResolution = 1000000000; // Nanosecond resolution
 #else
 U64 LLFastTimer::sClockResolution = 1000000; // Microsecond resolution
 #endif
 
-std::vector<LLFastTimer::FrameState>* LLFastTimer::sTimerInfos = NULL;
-U64				LLFastTimer::sTimerCycles = 0;
-U32				LLFastTimer::sTimerCalls = 0;
-
-
 // FIXME: move these declarations to the relevant modules
 
 // helper functions
@@ -109,52 +102,35 @@ static timer_tree_dfs_iterator_t end_timer_tree()
 	return timer_tree_dfs_iterator_t(); 
 }
 
-
-
 // factory class that creates NamedTimers via static DeclareTimer objects
 class NamedTimerFactory : public LLSingleton<NamedTimerFactory>
 {
 public:
 	NamedTimerFactory()
-		: mActiveTimerRoot(NULL),
-		  mTimerRoot(NULL),
-		  mAppTimer(NULL),
-		  mRootFrameState(NULL)
+	:	mTimerRoot(NULL)
 	{}
 
 	/*virtual */ void initSingleton()
 	{
 		mTimerRoot = new LLFastTimer::NamedTimer("root");
-
-		mActiveTimerRoot = new LLFastTimer::NamedTimer("Frame");
-		mActiveTimerRoot->setCollapsed(false);
-
-		mRootFrameState = new LLFastTimer::FrameState(mActiveTimerRoot);
-		mRootFrameState->mParent = &mTimerRoot->getFrameState();
-		mActiveTimerRoot->setParent(mTimerRoot);
-
-		mAppTimer = new LLFastTimer(mRootFrameState);
+		mRootFrameState.setNamedTimer(mTimerRoot);
+		mTimerRoot->setFrameState(&mRootFrameState);
+		mTimerRoot->mParent = mTimerRoot;
+		mTimerRoot->setCollapsed(false);
+		mRootFrameState.mParent = &mRootFrameState;
 	}
 
 	~NamedTimerFactory()
 	{
 		std::for_each(mTimers.begin(), mTimers.end(), DeletePairedPointer());
 
-		delete mAppTimer;
-		delete mActiveTimerRoot; 
 		delete mTimerRoot;
-		delete mRootFrameState;
 	}
 
-	LLFastTimer::NamedTimer& createNamedTimer(const std::string& name)
+	LLFastTimer::NamedTimer& createNamedTimer(const std::string& name, LLFastTimer::FrameState* state)
 	{
-		timer_map_t::iterator found_it = mTimers.find(name);
-		if (found_it != mTimers.end())
-		{
-			return *found_it->second;
-		}
-
 		LLFastTimer::NamedTimer* timer = new LLFastTimer::NamedTimer(name);
+		timer->setFrameState(state);
 		timer->setParent(mTimerRoot);
 		mTimers.insert(std::make_pair(name, timer));
 
@@ -171,12 +147,9 @@ class NamedTimerFactory : public LLSingleton<NamedTimerFactory>
 		return NULL;
 	}
 
-	LLFastTimer::NamedTimer* getActiveRootTimer() { return mActiveTimerRoot; }
 	LLFastTimer::NamedTimer* getRootTimer() { return mTimerRoot; }
-	const LLFastTimer* getAppTimer() { return mAppTimer; }
-	LLFastTimer::FrameState& getRootFrameState() { return *mRootFrameState; }
 
-	typedef std::map<std::string, LLFastTimer::NamedTimer*> timer_map_t;
+	typedef std::multimap<std::string, LLFastTimer::NamedTimer*> timer_map_t;
 	timer_map_t::iterator beginTimers() { return mTimers.begin(); }
 	timer_map_t::iterator endTimers() { return mTimers.end(); }
 	S32 timerCount() { return mTimers.size(); }
@@ -184,55 +157,19 @@ class NamedTimerFactory : public LLSingleton<NamedTimerFactory>
 private:
 	timer_map_t mTimers;
 
-	LLFastTimer::NamedTimer*		mActiveTimerRoot;
 	LLFastTimer::NamedTimer*		mTimerRoot;
-	LLFastTimer*						mAppTimer;
-	LLFastTimer::FrameState*		mRootFrameState;
+	LLFastTimer::FrameState			mRootFrameState;
 };
 
-void update_cached_pointers_if_changed()
-{
-	// detect when elements have moved and update cached pointers
-	static LLFastTimer::FrameState* sFirstTimerAddress = NULL;
-	if (&*(LLFastTimer::getFrameStateList().begin()) != sFirstTimerAddress)
-	{
-		LLFastTimer::DeclareTimer::updateCachedPointers();
-	}
-	sFirstTimerAddress = &*(LLFastTimer::getFrameStateList().begin());
-}
-
 LLFastTimer::DeclareTimer::DeclareTimer(const std::string& name, bool open )
-:	mTimer(NamedTimerFactory::instance().createNamedTimer(name))
+:	mTimer(NamedTimerFactory::instance().createNamedTimer(name, &mFrameState))
 {
 	mTimer.setCollapsed(!open);
-	mFrameState = &mTimer.getFrameState();
-	update_cached_pointers_if_changed();
 }
 
 LLFastTimer::DeclareTimer::DeclareTimer(const std::string& name)
-:	mTimer(NamedTimerFactory::instance().createNamedTimer(name))
+:	mTimer(NamedTimerFactory::instance().createNamedTimer(name, &mFrameState))
 {
-	mFrameState = &mTimer.getFrameState();
-	update_cached_pointers_if_changed();
-}
-
-// static
-void LLFastTimer::DeclareTimer::updateCachedPointers()
-{
-	// propagate frame state pointers to timer declarations
-	for (instance_iter it = beginInstances(); it != endInstances(); ++it)
-	{
-		// update cached pointer
-		it->mFrameState = &it->mTimer.getFrameState();
-	}
-
-	// also update frame states of timers on stack
-	LLFastTimer* cur_timerp = LLFastTimer::sCurTimerData.mCurTimer;
-	while(cur_timerp->mLastTimerData.mCurTimer != cur_timerp)	
-	{
-		cur_timerp->mFrameState = &cur_timerp->mFrameState->mTimer->getFrameState();
-		cur_timerp = cur_timerp->mLastTimerData.mCurTimer;
-	}
 }
 
 //static
@@ -244,7 +181,7 @@ U64 LLFastTimer::countsPerSecond() // counts per second for the *32-bit* timer
 #else // windows or x86-mac or x86-linux or x86-solaris
 U64 LLFastTimer::countsPerSecond() // counts per second for the *32-bit* timer
 {
-#if USE_RDTSC || !LL_WINDOWS
+#if LL_FASTTIMER_USE_RDTSC || !LL_WINDOWS
 	//getCPUFrequency returns MHz and sCPUClockFrequency wants to be in Hz
 	static U64 sCPUClockFrequency = U64(LLProcessorInfo().getCPUFrequency()*1000000.0);
 
@@ -265,14 +202,13 @@ U64 LLFastTimer::countsPerSecond() // counts per second for the *32-bit* timer
 }
 #endif
 
-LLFastTimer::FrameState::FrameState(LLFastTimer::NamedTimer* timerp)
+LLFastTimer::FrameState::FrameState()
 :	mActiveCount(0),
 	mCalls(0),
 	mSelfTimeCounter(0),
 	mParent(NULL),
 	mLastCaller(NULL),
-	mMoveUpTree(false),
-	mTimer(timerp)
+	mMoveUpTree(false)
 {}
 
 
@@ -280,15 +216,12 @@ LLFastTimer::NamedTimer::NamedTimer(const std::string& name)
 :	mName(name),
 	mCollapsed(true),
 	mParent(NULL),
-	mTotalTimeCounter(0),
+	mTreeTimeCounter(0),
 	mCountAverage(0),
 	mCallAverage(0),
-	mNeedsSorting(false)
+	mNeedsSorting(false),
+	mFrameState(NULL)
 {
-	info_list_t& frame_state_list = getFrameStateList();
-	mFrameStateIndex = frame_state_list.size();
-	getFrameStateList().push_back(FrameState(this));
-
 	mCountHistory = new U32[HISTORY_NUM];
 	memset(mCountHistory, 0, sizeof(U32) * HISTORY_NUM);
 	mCallHistory = new U32[HISTORY_NUM];
@@ -355,6 +288,7 @@ S32 LLFastTimer::NamedTimer::getDepth()
 	while(timerp)
 	{
 		depth++;
+		if (timerp->getParent() == timerp) break;
 		timerp = timerp->mParent;
 	}
 	return depth;
@@ -369,15 +303,6 @@ void LLFastTimer::NamedTimer::processTimes()
 	accumulateTimings();
 }
 
-// sort timer info structs by depth first traversal order
-struct SortTimersDFS
-{
-	bool operator()(const LLFastTimer::FrameState& i1, const LLFastTimer::FrameState& i2)
-	{
-		return i1.mTimer->getFrameStateIndex() < i2.mTimer->getFrameStateIndex();
-	}
-};
-
 // sort child timers by name
 struct SortTimerByName
 {
@@ -425,8 +350,8 @@ void LLFastTimer::NamedTimer::buildHierarchy()
 		{
 			// since ancestors have already been visited, reparenting won't affect tree traversal
 			//step up tree, bringing our descendants with us
-			//llinfos << "Moving " << timerp->getName() << " from child of " << timerp->getParent()->getName() <<
-			//	" to child of " << timerp->getParent()->getParent()->getName() << llendl;
+			LL_DEBUGS("FastTimers") << "Moving " << timerp->getName() << " from child of " << timerp->getParent()->getName() <<
+				" to child of " << timerp->getParent()->getParent()->getName() << LL_ENDL;
 			timerp->setParent(timerp->getParent()->getParent());
 			timerp->getFrameState().mMoveUpTree = false;
 
@@ -458,12 +383,14 @@ void LLFastTimer::NamedTimer::accumulateTimings()
 	LLFastTimer* cur_timer = sCurTimerData.mCurTimer;
 	// root defined by parent pointing to self
 	CurTimerData* cur_data = &sCurTimerData;
-	while(cur_timer->mLastTimerData.mCurTimer != cur_timer)
+	while(cur_timer && cur_timer->mLastTimerData.mCurTimer != cur_timer)
 	{
 		U32 cumulative_time_delta = cur_time - cur_timer->mStartTime;
 		U32 self_time_delta = cumulative_time_delta - cur_data->mChildTime;
 		cur_data->mChildTime = 0;
-		cur_timer->mFrameState->mSelfTimeCounter += self_time_delta;
+		cur_data->mFrameState->mSelfTimeCounter += self_time_delta;
+		cur_data->mFrameState->mTotalTimeCounter += cumulative_time_delta;
+
 		cur_timer->mStartTime = cur_time;
 
 		cur_data = &cur_timer->mLastTimerData;
@@ -473,15 +400,15 @@ void LLFastTimer::NamedTimer::accumulateTimings()
 	}
 
 	// traverse tree in DFS post order, or bottom up
-	for(timer_tree_bottom_up_iterator_t it = begin_timer_tree_bottom_up(*NamedTimerFactory::instance().getActiveRootTimer());
+	for(timer_tree_bottom_up_iterator_t it = begin_timer_tree_bottom_up(*NamedTimerFactory::instance().getRootTimer());
 		it != end_timer_tree_bottom_up();
 		++it)
 	{
 		NamedTimer* timerp = (*it);
-		timerp->mTotalTimeCounter = timerp->getFrameState().mSelfTimeCounter;
+		timerp->mTreeTimeCounter = timerp->getFrameState().mSelfTimeCounter;
 		for (child_const_iter child_it = timerp->beginChildren(); child_it != timerp->endChildren(); ++child_it)
 		{
-			timerp->mTotalTimeCounter += (*child_it)->mTotalTimeCounter;
+			timerp->mTreeTimeCounter += (*child_it)->mTreeTimeCounter;
 		}
 
 		S32 cur_frame = sCurFrameIndex;
@@ -490,8 +417,8 @@ void LLFastTimer::NamedTimer::accumulateTimings()
 			// update timer history
 			int hidx = cur_frame % HISTORY_NUM;
 
-			timerp->mCountHistory[hidx] = timerp->mTotalTimeCounter;
-			timerp->mCountAverage = ((U64)timerp->mCountAverage * cur_frame + timerp->mTotalTimeCounter) / (cur_frame+1);
+			timerp->mCountHistory[hidx] = timerp->mTreeTimeCounter;
+			timerp->mCountAverage = ((U64)timerp->mCountAverage * cur_frame + timerp->mTreeTimeCounter) / (cur_frame+1);
 			timerp->mCallHistory[hidx] = timerp->getFrameState().mCalls;
 			timerp->mCallAverage = ((U64)timerp->mCallAverage * cur_frame + timerp->getFrameState().mCalls) / (cur_frame+1);
 		}
@@ -507,12 +434,12 @@ void LLFastTimer::NamedTimer::resetFrame()
 		static S32 call_count = 0;
 		if (call_count % 100 == 0)
 		{
-			llinfos << "countsPerSecond (32 bit): " << countsPerSecond() << llendl;
-			llinfos << "get_clock_count (64 bit): " << get_clock_count() << llendl;
-			llinfos << "LLProcessorInfo().getCPUFrequency() " << LLProcessorInfo().getCPUFrequency() << llendl;
-			llinfos << "getCPUClockCount32() " << getCPUClockCount32() << llendl;
-			llinfos << "getCPUClockCount64() " << getCPUClockCount64() << llendl;
-			llinfos << "elapsed sec " << ((F64)getCPUClockCount64())/((F64)LLProcessorInfo().getCPUFrequency()*1000000.0) << llendl;
+			LL_DEBUGS("FastTimers") << "countsPerSecond (32 bit): " << countsPerSecond() << LL_ENDL;
+			LL_DEBUGS("FastTimers") << "get_clock_count (64 bit): " << get_clock_count() << llendl;
+			LL_DEBUGS("FastTimers") << "LLProcessorInfo().getCPUFrequency() " << LLProcessorInfo().getCPUFrequency() << LL_ENDL;
+			LL_DEBUGS("FastTimers") << "getCPUClockCount32() " << getCPUClockCount32() << LL_ENDL;
+			LL_DEBUGS("FastTimers") << "getCPUClockCount64() " << getCPUClockCount64() << LL_ENDL;
+			LL_DEBUGS("FastTimers") << "elapsed sec " << ((F64)getCPUClockCount64())/((F64)LLProcessorInfo().getCPUFrequency()*1000000.0) << LL_ENDL;
 		}
 		call_count++;
 
@@ -544,48 +471,22 @@ void LLFastTimer::NamedTimer::resetFrame()
 		}
 	}
 
-
-	// tag timers by position in depth first traversal of tree
-	S32 index = 0;
-	for(timer_tree_dfs_iterator_t it = begin_timer_tree(*NamedTimerFactory::instance().getRootTimer());
-		it != end_timer_tree();
-		++it)
-	{
-		NamedTimer* timerp = (*it);
-		
-		timerp->mFrameStateIndex = index;
-		index++;
-
-		llassert_always(timerp->mFrameStateIndex < (S32)getFrameStateList().size());
-	}
-
-	// sort timers by DFS traversal order to improve cache coherency
-	std::sort(getFrameStateList().begin(), getFrameStateList().end(), SortTimersDFS());
-
-	// update pointers into framestatelist now that we've sorted it
-	DeclareTimer::updateCachedPointers();
-
 	// reset for next frame
+	for (instance_iter it = beginInstances(); it != endInstances(); ++it)
 	{
-		for (instance_iter it = beginInstances(); it != endInstances(); ++it)
-		{
-			NamedTimer& timer = *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)
-			{
-				info.mParent = &timer.mParent->getFrameState();
-			}
+		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();
 		}
 	}
-
-	//sTimerCycles = 0;
-	//sTimerCalls = 0;
 }
 
 //static
@@ -600,7 +501,7 @@ void LLFastTimer::NamedTimer::reset()
 	// root defined by parent pointing to self
 	CurTimerData* cur_data = &sCurTimerData;
 	LLFastTimer* cur_timer = cur_data->mCurTimer;
-	while(cur_timer->mLastTimerData.mCurTimer != cur_timer)
+	while(cur_timer && cur_timer->mLastTimerData.mCurTimer != cur_timer)
 	{
 		cur_timer->mStartTime = cur_time;
 		cur_data->mChildTime = 0;
@@ -630,17 +531,6 @@ void LLFastTimer::NamedTimer::reset()
 	sCurFrameIndex = 0;
 }
 
-//static 
-LLFastTimer::info_list_t& LLFastTimer::getFrameStateList() 
-{ 
-	if (!sTimerInfos) 
-	{ 
-		sTimerInfos = new info_list_t(); 
-	} 
-	return *sTimerInfos; 
-}
-
-
 U32 LLFastTimer::NamedTimer::getHistoricalCount(S32 history_index) const
 {
 	S32 history_idx = (getLastFrameIndex() + history_index) % LLFastTimer::NamedTimer::HISTORY_NUM;
@@ -655,18 +545,7 @@ U32 LLFastTimer::NamedTimer::getHistoricalCalls(S32 history_index ) const
 
 LLFastTimer::FrameState& LLFastTimer::NamedTimer::getFrameState() const
 {
-	llassert_always(mFrameStateIndex >= 0);
-	if (this == NamedTimerFactory::instance().getActiveRootTimer()) 
-	{
-		return NamedTimerFactory::instance().getRootFrameState();
-	}
-	return getFrameStateList()[mFrameStateIndex];
-}
-
-// static
-LLFastTimer::NamedTimer& LLFastTimer::NamedTimer::getRootNamedTimer()
-{ 
-	return *NamedTimerFactory::instance().getActiveRootTimer(); 
+	return *mFrameState;
 }
 
 std::vector<LLFastTimer::NamedTimer*>::const_iterator LLFastTimer::NamedTimer::beginChildren()
@@ -764,158 +643,16 @@ const LLFastTimer::NamedTimer* LLFastTimer::getTimerByName(const std::string& na
 	return NamedTimerFactory::instance().getTimerByName(name);
 }
 
-LLFastTimer::LLFastTimer(LLFastTimer::FrameState* state)
-:	mFrameState(state)
-{
-	U32 start_time = getCPUClockCount32();
-	mStartTime = start_time;
-	mFrameState->mActiveCount++;
-	LLFastTimer::sCurTimerData.mCurTimer = this;
-	LLFastTimer::sCurTimerData.mFrameState = mFrameState;
-	LLFastTimer::sCurTimerData.mChildTime = 0;
-	mLastTimerData = LLFastTimer::sCurTimerData;
-}
-
-
-//////////////////////////////////////////////////////////////////////////////
-//
-// Important note: These implementations must be FAST!
-//
-
-
-#if LL_WINDOWS
-//
-// Windows implementation of CPU clock
-//
-
-//
-// NOTE: put back in when we aren't using platform sdk anymore
-//
-// because MS has different signatures for these functions in winnt.h
-// need to rename them to avoid conflicts
-//#define _interlockedbittestandset _renamed_interlockedbittestandset
-//#define _interlockedbittestandreset _renamed_interlockedbittestandreset
-//#include <intrin.h>
-//#undef _interlockedbittestandset
-//#undef _interlockedbittestandreset
-
-//inline U32 LLFastTimer::getCPUClockCount32()
+//LLFastTimer::LLFastTimer(LLFastTimer::FrameState* state)
+//:	mFrameState(state)
 //{
-//	U64 time_stamp = __rdtsc();
-//	return (U32)(time_stamp >> 8);
+//	U32 start_time = getCPUClockCount32();
+//	mStartTime = start_time;
+//	mFrameState->mActiveCount++;
+//	LLFastTimer::sCurTimerData.mCurTimer = this;
+//	LLFastTimer::sCurTimerData.mFrameState = mFrameState;
+//	LLFastTimer::sCurTimerData.mChildTime = 0;
+//	mLastTimerData = LLFastTimer::sCurTimerData;
 //}
-//
-//// return full timer value, *not* shifted by 8 bits
-//inline U64 LLFastTimer::getCPUClockCount64()
-//{
-//	return __rdtsc();
-//}
-
-// shift off lower 8 bits for lower resolution but longer term timing
-// on 1Ghz machine, a 32-bit word will hold ~1000 seconds of timing
-#if USE_RDTSC
-U32 LLFastTimer::getCPUClockCount32()
-{
-	U32 ret_val;
-	__asm
-	{
-        _emit   0x0f
-        _emit   0x31
-		shr eax,8
-		shl edx,24
-		or eax, edx
-		mov dword ptr [ret_val], eax
-	}
-    return ret_val;
-}
 
-// return full timer value, *not* shifted by 8 bits
-U64 LLFastTimer::getCPUClockCount64()
-{
-	U64 ret_val;
-	__asm
-	{
-        _emit   0x0f
-        _emit   0x31
-		mov eax,eax
-		mov edx,edx
-		mov dword ptr [ret_val+4], edx
-		mov dword ptr [ret_val], eax
-	}
-    return ret_val;
-}
-
-std::string LLFastTimer::sClockType = "rdtsc";
-
-#else
-//LL_COMMON_API U64 get_clock_count(); // in lltimer.cpp
-// These use QueryPerformanceCounter, which is arguably fine and also works on AMD architectures.
-U32 LLFastTimer::getCPUClockCount32()
-{
-	return (U32)(get_clock_count()>>8);
-}
-
-U64 LLFastTimer::getCPUClockCount64()
-{
-	return get_clock_count();
-}
-
-std::string LLFastTimer::sClockType = "QueryPerformanceCounter";
-#endif
-
-#endif
-
-
-#if (LL_LINUX || LL_SOLARIS) && !(defined(__i386__) || defined(__amd64__))
-//
-// Linux and Solaris implementation of CPU clock - non-x86.
-// This is accurate but SLOW!  Only use out of desperation.
-//
-// Try to use the MONOTONIC clock if available, this is a constant time counter
-// with nanosecond resolution (but not necessarily accuracy) and attempts are
-// made to synchronize this value between cores at kernel start. It should not
-// be affected by CPU frequency. If not available use the REALTIME clock, but
-// this may be affected by NTP adjustments or other user activity affecting
-// the system time.
-U64 LLFastTimer::getCPUClockCount64()
-{
-	struct timespec tp;
-	
-#ifdef CLOCK_MONOTONIC // MONOTONIC supported at build-time?
-	if (-1 == clock_gettime(CLOCK_MONOTONIC,&tp)) // if MONOTONIC isn't supported at runtime then ouch, try REALTIME
-#endif
-		clock_gettime(CLOCK_REALTIME,&tp);
-
-	return (tp.tv_sec*LLFastTimer::sClockResolution)+tp.tv_nsec;        
-}
-
-U32 LLFastTimer::getCPUClockCount32()
-{
-	return (U32)(LLFastTimer::getCPUClockCount64() >> 8);
-}
-
-std::string LLFastTimer::sClockType = "clock_gettime";
-
-#endif // (LL_LINUX || LL_SOLARIS) && !(defined(__i386__) || defined(__amd64__))
-
-
-#if (LL_LINUX || LL_SOLARIS || LL_DARWIN) && (defined(__i386__) || defined(__amd64__))
-//
-// Mac+Linux+Solaris FAST x86 implementation of CPU clock
-U32 LLFastTimer::getCPUClockCount32()
-{
-	U64 x;
-	__asm__ volatile (".byte 0x0f, 0x31": "=A"(x));
-	return (U32)(x >> 8);
-}
-
-U64 LLFastTimer::getCPUClockCount64()
-{
-	U64 x;
-	__asm__ volatile (".byte 0x0f, 0x31": "=A"(x));
-	return x;
-}
-
-std::string LLFastTimer::sClockType = "rdtsc";
-#endif
 
diff --git a/indra/llcommon/llfasttimer.h b/indra/llcommon/llfasttimer.h
index 2b25f2fabbd6883744b6ea36e122e994ef9b88a6..4660fad5e3a334e97154e31604ec94d029f49bdd 100644
--- a/indra/llcommon/llfasttimer.h
+++ b/indra/llcommon/llfasttimer.h
@@ -1,6 +1,6 @@
 /**
  * @file llfasttimer.h
- * @brief Inline implementations of fast timers.
+ * @brief Declaration of a fast timer.
  *
  * $LicenseInfo:firstyear=2004&license=viewerlgpl$
  * Second Life Viewer Source Code
@@ -27,9 +27,364 @@
 #ifndef LL_FASTTIMER_H
 #define LL_FASTTIMER_H
 
-// Implementation of getCPUClockCount32() and getCPUClockCount64 are now in llfastertimer_class.cpp.
+#include "llinstancetracker.h"
 
-// pull in the actual class definition
-#include "llfasttimer_class.h"
+#define FAST_TIMER_ON 1
+#define DEBUG_FAST_TIMER_THREADS 1
+
+class LLMutex;
+
+#include <queue>
+#include "llsd.h"
+
+#define LL_FASTTIMER_USE_RDTSC 1
+
+
+LL_COMMON_API void assert_main_thread();
+
+class LL_COMMON_API LLFastTimer
+{
+public:
+	class NamedTimer;
+
+	struct LL_COMMON_API FrameState
+	{
+		FrameState();
+		void setNamedTimer(class NamedTimer* timerp) { mTimer = timerp; }
+
+		U32 				mSelfTimeCounter;
+		U32 				mTotalTimeCounter;
+		U32 				mCalls;
+		FrameState*			mParent;		// info for caller timer
+		FrameState*			mLastCaller;	// used to bootstrap tree construction
+		class NamedTimer*	mTimer;
+		U16					mActiveCount;	// number of timers with this ID active on stack
+		bool				mMoveUpTree;	// needs to be moved up the tree of timers at the end of frame
+	};
+
+	// stores a "named" timer instance to be reused via multiple LLFastTimer stack instances
+	class LL_COMMON_API NamedTimer
+	:	public LLInstanceTracker<NamedTimer>
+	{
+		friend class DeclareTimer;
+	public:
+		~NamedTimer();
+
+		enum { HISTORY_NUM = 300 };
+
+		const std::string& getName() const { return mName; }
+		NamedTimer* getParent() const { return mParent; }
+		void setParent(NamedTimer* parent);
+		S32 getDepth();
+		std::string getToolTip(S32 history_index = -1);
+
+		typedef std::vector<NamedTimer*>::const_iterator child_const_iter;
+		child_const_iter beginChildren();
+		child_const_iter endChildren();
+		std::vector<NamedTimer*>& getChildren();
+
+		void setCollapsed(bool collapsed) { mCollapsed = collapsed; }
+		bool getCollapsed() const { return mCollapsed; }
+
+		U32 getCountAverage() const { return mCountAverage; }
+		U32 getCallAverage() const { return mCallAverage; }
+
+		U32 getHistoricalCount(S32 history_index = 0) const;
+		U32 getHistoricalCalls(S32 history_index = 0) const;
+
+		void setFrameState(FrameState* state) { mFrameState = state; state->setNamedTimer(this); }
+		FrameState& getFrameState() const;
+
+	private:
+		friend class LLFastTimer;
+		friend class NamedTimerFactory;
+
+		//
+		// methods
+		//
+		NamedTimer(const std::string& name);
+		// recursive call to gather total time from children
+		static void accumulateTimings();
+
+		// updates cumulative times and hierarchy,
+		// can be called multiple times in a frame, at any point
+		static void processTimes();
+
+		static void buildHierarchy();
+		static void resetFrame();
+		static void reset();
+
+		//
+		// members
+		//
+		FrameState*		mFrameState;
+
+		std::string	mName;
+
+		// sum of recorded self time and tree time of all children timers (might not match actual recorded time of children if topology is incomplete
+		U32 		mTreeTimeCounter; 
+
+		U32 		mCountAverage;
+		U32			mCallAverage;
+
+		U32*		mCountHistory;
+		U32*		mCallHistory;
+
+		// tree structure
+		NamedTimer*					mParent;				// NamedTimer of caller(parent)
+		std::vector<NamedTimer*>	mChildren;
+		bool						mCollapsed;				// don't show children
+		bool						mNeedsSorting;			// sort children whenever child added
+	};
+
+	// used to statically declare a new named timer
+	class LL_COMMON_API DeclareTimer
+	:	public LLInstanceTracker<DeclareTimer>
+	{
+		friend class LLFastTimer;
+	public:
+		DeclareTimer(const std::string& name, bool open);
+		DeclareTimer(const std::string& name);
+
+		NamedTimer& getNamedTimer() { return mTimer; }
+
+	private:
+		FrameState		mFrameState;
+		NamedTimer&		mTimer;
+	};
+
+public:
+	//LLFastTimer(LLFastTimer::FrameState* state);
+
+	LL_FORCE_INLINE LLFastTimer(LLFastTimer::DeclareTimer& timer)
+	{
+#if FAST_TIMER_ON
+		LLFastTimer::FrameState* frame_state = &timer.mFrameState;
+		mStartTime = getCPUClockCount32();
+
+		frame_state->mActiveCount++;
+		frame_state->mCalls++;
+		// keep current parent as long as it is active when we are
+		frame_state->mMoveUpTree |= (frame_state->mParent->mActiveCount == 0);
+
+		LLFastTimer::CurTimerData* cur_timer_data = &LLFastTimer::sCurTimerData;
+		mLastTimerData = *cur_timer_data;
+		cur_timer_data->mCurTimer = this;
+		cur_timer_data->mFrameState = frame_state;
+		cur_timer_data->mChildTime = 0;
+#endif
+#if DEBUG_FAST_TIMER_THREADS
+#if !LL_RELEASE
+		assert_main_thread();
+#endif
+#endif
+	}
+
+	LL_FORCE_INLINE ~LLFastTimer()
+	{
+#if FAST_TIMER_ON
+		LLFastTimer::FrameState* frame_state = LLFastTimer::sCurTimerData.mFrameState;
+		U32 total_time = getCPUClockCount32() - mStartTime;
+
+		frame_state->mSelfTimeCounter += total_time - LLFastTimer::sCurTimerData.mChildTime;
+		frame_state->mTotalTimeCounter += total_time;
+		frame_state->mActiveCount--;
+
+		// store last caller to bootstrap tree creation
+		// do this in the destructor in case of recursion to get topmost caller
+		frame_state->mLastCaller = mLastTimerData.mFrameState;
+
+		// we are only tracking self time, so subtract our total time delta from parents
+		mLastTimerData.mChildTime += total_time;
+
+		LLFastTimer::sCurTimerData = mLastTimerData;
+#endif
+	}
+
+public:
+	static LLMutex*			sLogLock;
+	static std::queue<LLSD> sLogQueue;
+	static BOOL				sLog;
+	static BOOL				sMetricLog;
+	static std::string		sLogName;
+	static bool 			sPauseHistory;
+	static bool 			sResetHistory;
+
+	// call this once a frame to reset timers
+	static void nextFrame();
+
+	// dumps current cumulative frame stats to log
+	// call nextFrame() to reset timers
+	static void dumpCurTimes();
+
+	// call this to reset timer hierarchy, averages, etc.
+	static void reset();
+
+	static U64 countsPerSecond();
+	static S32 getLastFrameIndex() { return sLastFrameIndex; }
+	static S32 getCurFrameIndex() { return sCurFrameIndex; }
+
+	static void writeLog(std::ostream& os);
+	static const NamedTimer* getTimerByName(const std::string& name);
+
+	struct CurTimerData
+	{
+		LLFastTimer*	mCurTimer;
+		FrameState*		mFrameState;
+		U32				mChildTime;
+	};
+	static CurTimerData		sCurTimerData;
+
+private:
+
+
+	//////////////////////////////////////////////////////////////////////////////
+	//
+	// Important note: These implementations must be FAST!
+	//
+
+
+#if LL_WINDOWS
+	//
+	// Windows implementation of CPU clock
+	//
+
+	//
+	// NOTE: put back in when we aren't using platform sdk anymore
+	//
+	// because MS has different signatures for these functions in winnt.h
+	// need to rename them to avoid conflicts
+	//#define _interlockedbittestandset _renamed_interlockedbittestandset
+	//#define _interlockedbittestandreset _renamed_interlockedbittestandreset
+	//#include <intrin.h>
+	//#undef _interlockedbittestandset
+	//#undef _interlockedbittestandreset
+
+	//inline U32 LLFastTimer::getCPUClockCount32()
+	//{
+	//	U64 time_stamp = __rdtsc();
+	//	return (U32)(time_stamp >> 8);
+	//}
+	//
+	//// return full timer value, *not* shifted by 8 bits
+	//inline U64 LLFastTimer::getCPUClockCount64()
+	//{
+	//	return __rdtsc();
+	//}
+
+	// shift off lower 8 bits for lower resolution but longer term timing
+	// on 1Ghz machine, a 32-bit word will hold ~1000 seconds of timing
+#if LL_FASTTIMER_USE_RDTSC
+	static U32 getCPUClockCount32()
+	{
+		U32 ret_val;
+		__asm
+		{
+			_emit   0x0f
+				_emit   0x31
+				shr eax,8
+				shl edx,24
+				or eax, edx
+				mov dword ptr [ret_val], eax
+		}
+		return ret_val;
+	}
+
+	// return full timer value, *not* shifted by 8 bits
+	static U64 getCPUClockCount64()
+	{
+		U64 ret_val;
+		__asm
+		{
+			_emit   0x0f
+				_emit   0x31
+				mov eax,eax
+				mov edx,edx
+				mov dword ptr [ret_val+4], edx
+				mov dword ptr [ret_val], eax
+		}
+		return ret_val;
+	}
+
+#else
+	//LL_COMMON_API U64 get_clock_count(); // in lltimer.cpp
+	// These use QueryPerformanceCounter, which is arguably fine and also works on AMD architectures.
+	static U32 getCPUClockCount32()
+	{
+		return (U32)(get_clock_count()>>8);
+	}
+
+	static U64 getCPUClockCount64()
+	{
+		return get_clock_count();
+	}
+
+#endif
+
+#endif
+
+
+#if (LL_LINUX || LL_SOLARIS) && !(defined(__i386__) || defined(__amd64__))
+	//
+	// Linux and Solaris implementation of CPU clock - non-x86.
+	// This is accurate but SLOW!  Only use out of desperation.
+	//
+	// Try to use the MONOTONIC clock if available, this is a constant time counter
+	// with nanosecond resolution (but not necessarily accuracy) and attempts are
+	// made to synchronize this value between cores at kernel start. It should not
+	// be affected by CPU frequency. If not available use the REALTIME clock, but
+	// this may be affected by NTP adjustments or other user activity affecting
+	// the system time.
+	static U64 getCPUClockCount64()
+	{
+		struct timespec tp;
+
+#ifdef CLOCK_MONOTONIC // MONOTONIC supported at build-time?
+		if (-1 == clock_gettime(CLOCK_MONOTONIC,&tp)) // if MONOTONIC isn't supported at runtime then ouch, try REALTIME
+#endif
+			clock_gettime(CLOCK_REALTIME,&tp);
+
+		return (tp.tv_sec*sClockResolution)+tp.tv_nsec;        
+	}
+
+	static U32 getCPUClockCount32()
+	{
+		return (U32)(getCPUClockCount64() >> 8);
+	}
+
+#endif // (LL_LINUX || LL_SOLARIS) && !(defined(__i386__) || defined(__amd64__))
+
+
+#if (LL_LINUX || LL_SOLARIS || LL_DARWIN) && (defined(__i386__) || defined(__amd64__))
+	//
+	// Mac+Linux+Solaris FAST x86 implementation of CPU clock
+	static U32 getCPUClockCount32()
+	{
+		U64 x;
+		__asm__ volatile (".byte 0x0f, 0x31": "=A"(x));
+		return (U32)(x >> 8);
+	}
+
+	static U64 getCPUClockCount64()
+	{
+		U64 x;
+		__asm__ volatile (".byte 0x0f, 0x31": "=A"(x));
+		return x;
+	}
+
+#endif
+
+	static U64 sClockResolution;
+
+	static S32				sCurFrameIndex;
+	static S32				sLastFrameIndex;
+	static U64				sLastFrameTime;
+
+	U32							mStartTime;
+	LLFastTimer::CurTimerData	mLastTimerData;
+
+};
+
+typedef class LLFastTimer LLFastTimer;
 
 #endif // LL_LLFASTTIMER_H
diff --git a/indra/llcommon/llfasttimer_class.h b/indra/llcommon/llfasttimer_class.h
deleted file mode 100644
index f481e968a6badaea8dba11a83eed24fc1dc6bfc1..0000000000000000000000000000000000000000
--- a/indra/llcommon/llfasttimer_class.h
+++ /dev/null
@@ -1,276 +0,0 @@
-/**
- * @file llfasttimer_class.h
- * @brief Declaration of a fast timer.
- *
- * $LicenseInfo:firstyear=2004&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- * 
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- * 
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- * 
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * 
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
- * $/LicenseInfo$
- */
-
-#ifndef LL_FASTTIMER_CLASS_H
-#define LL_FASTTIMER_CLASS_H
-
-#include "llinstancetracker.h"
-
-#define FAST_TIMER_ON 1
-#define TIME_FAST_TIMERS 0
-#define DEBUG_FAST_TIMER_THREADS 1
-
-class LLMutex;
-
-#include <queue>
-#include "llsd.h"
-
-LL_COMMON_API void assert_main_thread();
-
-class LL_COMMON_API LLFastTimer
-{
-public:
-	class NamedTimer;
-
-	struct LL_COMMON_API FrameState
-	{
-		FrameState(NamedTimer* timerp);
-
-		U32 				mSelfTimeCounter;
-		U32 				mCalls;
-		FrameState*			mParent;		// info for caller timer
-		FrameState*			mLastCaller;	// used to bootstrap tree construction
-		NamedTimer*			mTimer;
-		U16					mActiveCount;	// number of timers with this ID active on stack
-		bool				mMoveUpTree;	// needs to be moved up the tree of timers at the end of frame
-	};
-
-	// stores a "named" timer instance to be reused via multiple LLFastTimer stack instances
-	class LL_COMMON_API NamedTimer
-	:	public LLInstanceTracker<NamedTimer>
-	{
-		friend class DeclareTimer;
-	public:
-		~NamedTimer();
-
-		enum { HISTORY_NUM = 300 };
-
-		const std::string& getName() const { return mName; }
-		NamedTimer* getParent() const { return mParent; }
-		void setParent(NamedTimer* parent);
-		S32 getDepth();
-		std::string getToolTip(S32 history_index = -1);
-
-		typedef std::vector<NamedTimer*>::const_iterator child_const_iter;
-		child_const_iter beginChildren();
-		child_const_iter endChildren();
-		std::vector<NamedTimer*>& getChildren();
-
-		void setCollapsed(bool collapsed) { mCollapsed = collapsed; }
-		bool getCollapsed() const { return mCollapsed; }
-
-		U32 getCountAverage() const { return mCountAverage; }
-		U32 getCallAverage() const { return mCallAverage; }
-
-		U32 getHistoricalCount(S32 history_index = 0) const;
-		U32 getHistoricalCalls(S32 history_index = 0) const;
-
-		static NamedTimer& getRootNamedTimer();
-
-		S32 getFrameStateIndex() const { return mFrameStateIndex; }
-
-		FrameState& getFrameState() const;
-
-	private:
-		friend class LLFastTimer;
-		friend class NamedTimerFactory;
-
-		//
-		// methods
-		//
-		NamedTimer(const std::string& name);
-		// recursive call to gather total time from children
-		static void accumulateTimings();
-
-		// updates cumulative times and hierarchy,
-		// can be called multiple times in a frame, at any point
-		static void processTimes();
-
-		static void buildHierarchy();
-		static void resetFrame();
-		static void reset();
-
-		//
-		// members
-		//
-		S32			mFrameStateIndex;
-
-		std::string	mName;
-
-		U32 		mTotalTimeCounter;
-
-		U32 		mCountAverage;
-		U32			mCallAverage;
-
-		U32*		mCountHistory;
-		U32*		mCallHistory;
-
-		// tree structure
-		NamedTimer*					mParent;				// NamedTimer of caller(parent)
-		std::vector<NamedTimer*>	mChildren;
-		bool						mCollapsed;				// don't show children
-		bool						mNeedsSorting;			// sort children whenever child added
-	};
-
-	// used to statically declare a new named timer
-	class LL_COMMON_API DeclareTimer
-	:	public LLInstanceTracker<DeclareTimer>
-	{
-		friend class LLFastTimer;
-	public:
-		DeclareTimer(const std::string& name, bool open);
-		DeclareTimer(const std::string& name);
-
-		static void updateCachedPointers();
-
-	private:
-		NamedTimer&		mTimer;
-		FrameState*		mFrameState;
-	};
-
-public:
-	LLFastTimer(LLFastTimer::FrameState* state);
-
-	LL_FORCE_INLINE LLFastTimer(LLFastTimer::DeclareTimer& timer)
-	:	mFrameState(timer.mFrameState)
-	{
-#if TIME_FAST_TIMERS
-		U64 timer_start = getCPUClockCount64();
-#endif
-#if FAST_TIMER_ON
-		LLFastTimer::FrameState* frame_state = mFrameState;
-		mStartTime = getCPUClockCount32();
-
-		frame_state->mActiveCount++;
-		frame_state->mCalls++;
-		// keep current parent as long as it is active when we are
-		frame_state->mMoveUpTree |= (frame_state->mParent->mActiveCount == 0);
-
-		LLFastTimer::CurTimerData* cur_timer_data = &LLFastTimer::sCurTimerData;
-		mLastTimerData = *cur_timer_data;
-		cur_timer_data->mCurTimer = this;
-		cur_timer_data->mFrameState = frame_state;
-		cur_timer_data->mChildTime = 0;
-#endif
-#if TIME_FAST_TIMERS
-		U64 timer_end = getCPUClockCount64();
-		sTimerCycles += timer_end - timer_start;
-#endif
-#if DEBUG_FAST_TIMER_THREADS
-#if !LL_RELEASE
-		assert_main_thread();
-#endif
-#endif
-	}
-
-	LL_FORCE_INLINE ~LLFastTimer()
-	{
-#if TIME_FAST_TIMERS
-		U64 timer_start = getCPUClockCount64();
-#endif
-#if FAST_TIMER_ON
-		LLFastTimer::FrameState* frame_state = mFrameState;
-		U32 total_time = getCPUClockCount32() - mStartTime;
-
-		frame_state->mSelfTimeCounter += total_time - LLFastTimer::sCurTimerData.mChildTime;
-		frame_state->mActiveCount--;
-
-		// store last caller to bootstrap tree creation
-		// do this in the destructor in case of recursion to get topmost caller
-		frame_state->mLastCaller = mLastTimerData.mFrameState;
-
-		// we are only tracking self time, so subtract our total time delta from parents
-		mLastTimerData.mChildTime += total_time;
-
-		LLFastTimer::sCurTimerData = mLastTimerData;
-#endif
-#if TIME_FAST_TIMERS
-		U64 timer_end = getCPUClockCount64();
-		sTimerCycles += timer_end - timer_start;
-		sTimerCalls++;
-#endif
-	}
-
-public:
-	static LLMutex*			sLogLock;
-	static std::queue<LLSD> sLogQueue;
-	static BOOL				sLog;
-	static BOOL				sMetricLog;
-	static std::string		sLogName;
-	static bool 			sPauseHistory;
-	static bool 			sResetHistory;
-	static U64				sTimerCycles;
-	static U32				sTimerCalls;
-
-	typedef std::vector<FrameState> info_list_t;
-	static info_list_t& getFrameStateList();
-
-
-	// call this once a frame to reset timers
-	static void nextFrame();
-
-	// dumps current cumulative frame stats to log
-	// call nextFrame() to reset timers
-	static void dumpCurTimes();
-
-	// call this to reset timer hierarchy, averages, etc.
-	static void reset();
-
-	static U64 countsPerSecond();
-	static S32 getLastFrameIndex() { return sLastFrameIndex; }
-	static S32 getCurFrameIndex() { return sCurFrameIndex; }
-
-	static void writeLog(std::ostream& os);
-	static const NamedTimer* getTimerByName(const std::string& name);
-
-	struct CurTimerData
-	{
-		LLFastTimer*	mCurTimer;
-		FrameState*		mFrameState;
-		U32				mChildTime;
-	};
-	static CurTimerData		sCurTimerData;
-	static std::string sClockType;
-
-private:
-	static U32 getCPUClockCount32();
-	static U64 getCPUClockCount64();
-	static U64 sClockResolution;
-
-	static S32				sCurFrameIndex;
-	static S32				sLastFrameIndex;
-	static U64				sLastFrameTime;
-	static info_list_t*		sTimerInfos;
-
-	U32							mStartTime;
-	LLFastTimer::FrameState*	mFrameState;
-	LLFastTimer::CurTimerData	mLastTimerData;
-
-};
-
-typedef class LLFastTimer LLFastTimer;
-
-#endif // LL_LLFASTTIMER_CLASS_H
diff --git a/indra/llcommon/llmemory.h b/indra/llcommon/llmemory.h
index 9dd776ff57922271068e38ebd2ac82cafd537f23..6a2323e7d87af6ba61ec143b25a34d52d943615f 100644
--- a/indra/llcommon/llmemory.h
+++ b/indra/llcommon/llmemory.h
@@ -26,7 +26,10 @@
 #ifndef LLMEMORY_H
 #define LLMEMORY_H
 
-#include "llmemtype.h"
+#include "linden_common.h"
+
+class LLMutex ;
+
 inline void* ll_aligned_malloc( size_t size, int align )
 {
 	void* mem = malloc( size + (align - 1) + sizeof(void*) );
diff --git a/indra/llcommon/llmemtype.cpp b/indra/llcommon/llmemtype.cpp
deleted file mode 100644
index 6290a7158fac475b1932373d750aedec2b52d6c3..0000000000000000000000000000000000000000
--- a/indra/llcommon/llmemtype.cpp
+++ /dev/null
@@ -1,232 +0,0 @@
-/** 
- * @file llmemtype.cpp
- * @brief Simple memory allocation/deallocation tracking stuff here
- *
- * $LicenseInfo:firstyear=2002&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- * 
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- * 
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- * 
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * 
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
- * $/LicenseInfo$
- */
-
-#include "llmemtype.h"
-#include "llallocator.h"
-
-std::vector<char const *> LLMemType::DeclareMemType::mNameList;
-
-LLMemType::DeclareMemType LLMemType::MTYPE_INIT("Init");
-LLMemType::DeclareMemType LLMemType::MTYPE_STARTUP("Startup");
-LLMemType::DeclareMemType LLMemType::MTYPE_MAIN("Main");
-LLMemType::DeclareMemType LLMemType::MTYPE_FRAME("Frame");
-
-LLMemType::DeclareMemType LLMemType::MTYPE_GATHER_INPUT("GatherInput");
-LLMemType::DeclareMemType LLMemType::MTYPE_JOY_KEY("JoyKey");
-
-LLMemType::DeclareMemType LLMemType::MTYPE_IDLE("Idle");
-LLMemType::DeclareMemType LLMemType::MTYPE_IDLE_PUMP("IdlePump");
-LLMemType::DeclareMemType LLMemType::MTYPE_IDLE_NETWORK("IdleNetwork");
-LLMemType::DeclareMemType LLMemType::MTYPE_IDLE_UPDATE_REGIONS("IdleUpdateRegions");
-LLMemType::DeclareMemType LLMemType::MTYPE_IDLE_UPDATE_VIEWER_REGION("IdleUpdateViewerRegion");
-LLMemType::DeclareMemType LLMemType::MTYPE_IDLE_UPDATE_SURFACE("IdleUpdateSurface");
-LLMemType::DeclareMemType LLMemType::MTYPE_IDLE_UPDATE_PARCEL_OVERLAY("IdleUpdateParcelOverlay");
-LLMemType::DeclareMemType LLMemType::MTYPE_IDLE_AUDIO("IdleAudio");
-
-LLMemType::DeclareMemType LLMemType::MTYPE_CACHE_PROCESS_PENDING("CacheProcessPending");
-LLMemType::DeclareMemType LLMemType::MTYPE_CACHE_PROCESS_PENDING_ASKS("CacheProcessPendingAsks");
-LLMemType::DeclareMemType LLMemType::MTYPE_CACHE_PROCESS_PENDING_REPLIES("CacheProcessPendingReplies");
-
-LLMemType::DeclareMemType LLMemType::MTYPE_MESSAGE_CHECK_ALL("MessageCheckAll");
-LLMemType::DeclareMemType LLMemType::MTYPE_MESSAGE_PROCESS_ACKS("MessageProcessAcks");
-
-LLMemType::DeclareMemType LLMemType::MTYPE_RENDER("Render");
-LLMemType::DeclareMemType LLMemType::MTYPE_SLEEP("Sleep");
-
-LLMemType::DeclareMemType LLMemType::MTYPE_NETWORK("Network");
-LLMemType::DeclareMemType LLMemType::MTYPE_PHYSICS("Physics");
-LLMemType::DeclareMemType LLMemType::MTYPE_INTERESTLIST("InterestList");
-
-LLMemType::DeclareMemType LLMemType::MTYPE_IMAGEBASE("ImageBase");
-LLMemType::DeclareMemType LLMemType::MTYPE_IMAGERAW("ImageRaw");
-LLMemType::DeclareMemType LLMemType::MTYPE_IMAGEFORMATTED("ImageFormatted");
-		
-LLMemType::DeclareMemType LLMemType::MTYPE_APPFMTIMAGE("AppFmtImage");
-LLMemType::DeclareMemType LLMemType::MTYPE_APPRAWIMAGE("AppRawImage");
-LLMemType::DeclareMemType LLMemType::MTYPE_APPAUXRAWIMAGE("AppAuxRawImage");
-		
-LLMemType::DeclareMemType LLMemType::MTYPE_DRAWABLE("Drawable");
-
-LLMemType::DeclareMemType LLMemType::MTYPE_OBJECT("Object");
-LLMemType::DeclareMemType LLMemType::MTYPE_OBJECT_PROCESS_UPDATE("ObjectProcessUpdate");
-LLMemType::DeclareMemType LLMemType::MTYPE_OBJECT_PROCESS_UPDATE_CORE("ObjectProcessUpdateCore");
-
-LLMemType::DeclareMemType LLMemType::MTYPE_DISPLAY("Display");
-LLMemType::DeclareMemType LLMemType::MTYPE_DISPLAY_UPDATE("DisplayUpdate");
-LLMemType::DeclareMemType LLMemType::MTYPE_DISPLAY_UPDATE_CAMERA("DisplayUpdateCam");
-LLMemType::DeclareMemType LLMemType::MTYPE_DISPLAY_UPDATE_GEOM("DisplayUpdateGeom");
-LLMemType::DeclareMemType LLMemType::MTYPE_DISPLAY_SWAP("DisplaySwap");
-LLMemType::DeclareMemType LLMemType::MTYPE_DISPLAY_UPDATE_HUD("DisplayUpdateHud");
-LLMemType::DeclareMemType LLMemType::MTYPE_DISPLAY_GEN_REFLECTION("DisplayGenRefl");
-LLMemType::DeclareMemType LLMemType::MTYPE_DISPLAY_IMAGE_UPDATE("DisplayImageUpdate");
-LLMemType::DeclareMemType LLMemType::MTYPE_DISPLAY_STATE_SORT("DisplayStateSort");
-LLMemType::DeclareMemType LLMemType::MTYPE_DISPLAY_SKY("DisplaySky");
-LLMemType::DeclareMemType LLMemType::MTYPE_DISPLAY_RENDER_GEOM("DisplayRenderGeom");
-LLMemType::DeclareMemType LLMemType::MTYPE_DISPLAY_RENDER_FLUSH("DisplayRenderFlush");
-LLMemType::DeclareMemType LLMemType::MTYPE_DISPLAY_RENDER_UI("DisplayRenderUI");
-LLMemType::DeclareMemType LLMemType::MTYPE_DISPLAY_RENDER_ATTACHMENTS("DisplayRenderAttach");
-
-LLMemType::DeclareMemType LLMemType::MTYPE_VERTEX_DATA("VertexData");
-LLMemType::DeclareMemType LLMemType::MTYPE_VERTEX_CONSTRUCTOR("VertexConstr");
-LLMemType::DeclareMemType LLMemType::MTYPE_VERTEX_DESTRUCTOR("VertexDestr");
-LLMemType::DeclareMemType LLMemType::MTYPE_VERTEX_CREATE_VERTICES("VertexCreateVerts");
-LLMemType::DeclareMemType LLMemType::MTYPE_VERTEX_CREATE_INDICES("VertexCreateIndices");
-LLMemType::DeclareMemType LLMemType::MTYPE_VERTEX_DESTROY_BUFFER("VertexDestroyBuff");	
-LLMemType::DeclareMemType LLMemType::MTYPE_VERTEX_DESTROY_INDICES("VertexDestroyIndices");
-LLMemType::DeclareMemType LLMemType::MTYPE_VERTEX_UPDATE_VERTS("VertexUpdateVerts");
-LLMemType::DeclareMemType LLMemType::MTYPE_VERTEX_UPDATE_INDICES("VertexUpdateIndices");
-LLMemType::DeclareMemType LLMemType::MTYPE_VERTEX_ALLOCATE_BUFFER("VertexAllocateBuffer");
-LLMemType::DeclareMemType LLMemType::MTYPE_VERTEX_RESIZE_BUFFER("VertexResizeBuffer");
-LLMemType::DeclareMemType LLMemType::MTYPE_VERTEX_MAP_BUFFER("VertexMapBuffer");
-LLMemType::DeclareMemType LLMemType::MTYPE_VERTEX_MAP_BUFFER_VERTICES("VertexMapBufferVerts");
-LLMemType::DeclareMemType LLMemType::MTYPE_VERTEX_MAP_BUFFER_INDICES("VertexMapBufferIndices");
-LLMemType::DeclareMemType LLMemType::MTYPE_VERTEX_UNMAP_BUFFER("VertexUnmapBuffer");
-LLMemType::DeclareMemType LLMemType::MTYPE_VERTEX_SET_STRIDE("VertexSetStride");
-LLMemType::DeclareMemType LLMemType::MTYPE_VERTEX_SET_BUFFER("VertexSetBuffer");
-LLMemType::DeclareMemType LLMemType::MTYPE_VERTEX_SETUP_VERTEX_BUFFER("VertexSetupVertBuff");
-LLMemType::DeclareMemType LLMemType::MTYPE_VERTEX_CLEANUP_CLASS("VertexCleanupClass");
-
-LLMemType::DeclareMemType LLMemType::MTYPE_SPACE_PARTITION("SpacePartition");
-
-LLMemType::DeclareMemType LLMemType::MTYPE_PIPELINE("Pipeline");
-LLMemType::DeclareMemType LLMemType::MTYPE_PIPELINE_INIT("PipelineInit");
-LLMemType::DeclareMemType LLMemType::MTYPE_PIPELINE_CREATE_BUFFERS("PipelineCreateBuffs");
-LLMemType::DeclareMemType LLMemType::MTYPE_PIPELINE_RESTORE_GL("PipelineRestroGL");
-LLMemType::DeclareMemType LLMemType::MTYPE_PIPELINE_UNLOAD_SHADERS("PipelineUnloadShaders");
-LLMemType::DeclareMemType LLMemType::MTYPE_PIPELINE_LIGHTING_DETAIL("PipelineLightingDetail");
-LLMemType::DeclareMemType LLMemType::MTYPE_PIPELINE_GET_POOL_TYPE("PipelineGetPoolType");
-LLMemType::DeclareMemType LLMemType::MTYPE_PIPELINE_ADD_POOL("PipelineAddPool");
-LLMemType::DeclareMemType LLMemType::MTYPE_PIPELINE_ALLOCATE_DRAWABLE("PipelineAllocDrawable");
-LLMemType::DeclareMemType LLMemType::MTYPE_PIPELINE_ADD_OBJECT("PipelineAddObj");
-LLMemType::DeclareMemType LLMemType::MTYPE_PIPELINE_CREATE_OBJECTS("PipelineCreateObjs");
-LLMemType::DeclareMemType LLMemType::MTYPE_PIPELINE_UPDATE_MOVE("PipelineUpdateMove");
-LLMemType::DeclareMemType LLMemType::MTYPE_PIPELINE_UPDATE_GEOM("PipelineUpdateGeom");
-LLMemType::DeclareMemType LLMemType::MTYPE_PIPELINE_MARK_VISIBLE("PipelineMarkVisible");
-LLMemType::DeclareMemType LLMemType::MTYPE_PIPELINE_MARK_MOVED("PipelineMarkMoved");
-LLMemType::DeclareMemType LLMemType::MTYPE_PIPELINE_MARK_SHIFT("PipelineMarkShift");
-LLMemType::DeclareMemType LLMemType::MTYPE_PIPELINE_SHIFT_OBJECTS("PipelineShiftObjs");
-LLMemType::DeclareMemType LLMemType::MTYPE_PIPELINE_MARK_TEXTURED("PipelineMarkTextured");
-LLMemType::DeclareMemType LLMemType::MTYPE_PIPELINE_MARK_REBUILD("PipelineMarkRebuild");
-LLMemType::DeclareMemType LLMemType::MTYPE_PIPELINE_UPDATE_CULL("PipelineUpdateCull");
-LLMemType::DeclareMemType LLMemType::MTYPE_PIPELINE_STATE_SORT("PipelineStateSort");
-LLMemType::DeclareMemType LLMemType::MTYPE_PIPELINE_POST_SORT("PipelinePostSort");
-		
-LLMemType::DeclareMemType LLMemType::MTYPE_PIPELINE_RENDER_HUD_ELS("PipelineHudEls");
-LLMemType::DeclareMemType LLMemType::MTYPE_PIPELINE_RENDER_HL("PipelineRenderHL");
-LLMemType::DeclareMemType LLMemType::MTYPE_PIPELINE_RENDER_GEOM("PipelineRenderGeom");
-LLMemType::DeclareMemType LLMemType::MTYPE_PIPELINE_RENDER_GEOM_DEFFERRED("PipelineRenderGeomDef");
-LLMemType::DeclareMemType LLMemType::MTYPE_PIPELINE_RENDER_GEOM_POST_DEF("PipelineRenderGeomPostDef");
-LLMemType::DeclareMemType LLMemType::MTYPE_PIPELINE_RENDER_GEOM_SHADOW("PipelineRenderGeomShadow");
-LLMemType::DeclareMemType LLMemType::MTYPE_PIPELINE_RENDER_SELECT("PipelineRenderSelect");
-LLMemType::DeclareMemType LLMemType::MTYPE_PIPELINE_REBUILD_POOLS("PipelineRebuildPools");
-LLMemType::DeclareMemType LLMemType::MTYPE_PIPELINE_QUICK_LOOKUP("PipelineQuickLookup");
-LLMemType::DeclareMemType LLMemType::MTYPE_PIPELINE_RENDER_OBJECTS("PipelineRenderObjs");
-LLMemType::DeclareMemType LLMemType::MTYPE_PIPELINE_GENERATE_IMPOSTOR("PipelineGenImpostors");
-LLMemType::DeclareMemType LLMemType::MTYPE_PIPELINE_RENDER_BLOOM("PipelineRenderBloom");
-
-LLMemType::DeclareMemType LLMemType::MTYPE_UPKEEP_POOLS("UpkeepPools");
-
-LLMemType::DeclareMemType LLMemType::MTYPE_AVATAR("Avatar");
-LLMemType::DeclareMemType LLMemType::MTYPE_AVATAR_MESH("AvatarMesh");
-LLMemType::DeclareMemType LLMemType::MTYPE_PARTICLES("Particles");
-LLMemType::DeclareMemType LLMemType::MTYPE_REGIONS("Regions");
-
-LLMemType::DeclareMemType LLMemType::MTYPE_INVENTORY("Inventory");
-LLMemType::DeclareMemType LLMemType::MTYPE_INVENTORY_DRAW("InventoryDraw");
-LLMemType::DeclareMemType LLMemType::MTYPE_INVENTORY_BUILD_NEW_VIEWS("InventoryBuildNewViews");
-LLMemType::DeclareMemType LLMemType::MTYPE_INVENTORY_DO_FOLDER("InventoryDoFolder");
-LLMemType::DeclareMemType LLMemType::MTYPE_INVENTORY_POST_BUILD("InventoryPostBuild");
-LLMemType::DeclareMemType LLMemType::MTYPE_INVENTORY_FROM_XML("InventoryFromXML");
-LLMemType::DeclareMemType LLMemType::MTYPE_INVENTORY_CREATE_NEW_ITEM("InventoryCreateNewItem");
-LLMemType::DeclareMemType LLMemType::MTYPE_INVENTORY_VIEW_INIT("InventoryViewInit");
-LLMemType::DeclareMemType LLMemType::MTYPE_INVENTORY_VIEW_SHOW("InventoryViewShow");
-LLMemType::DeclareMemType LLMemType::MTYPE_INVENTORY_VIEW_TOGGLE("InventoryViewToggle");
-
-LLMemType::DeclareMemType LLMemType::MTYPE_ANIMATION("Animation");
-LLMemType::DeclareMemType LLMemType::MTYPE_VOLUME("Volume");
-LLMemType::DeclareMemType LLMemType::MTYPE_PRIMITIVE("Primitive");
-		
-LLMemType::DeclareMemType LLMemType::MTYPE_SCRIPT("Script");
-LLMemType::DeclareMemType LLMemType::MTYPE_SCRIPT_RUN("ScriptRun");
-LLMemType::DeclareMemType LLMemType::MTYPE_SCRIPT_BYTECODE("ScriptByteCode");
-		
-LLMemType::DeclareMemType LLMemType::MTYPE_IO_PUMP("IoPump");
-LLMemType::DeclareMemType LLMemType::MTYPE_IO_TCP("IoTCP");
-LLMemType::DeclareMemType LLMemType::MTYPE_IO_BUFFER("IoBuffer");
-LLMemType::DeclareMemType LLMemType::MTYPE_IO_HTTP_SERVER("IoHttpServer");
-LLMemType::DeclareMemType LLMemType::MTYPE_IO_SD_SERVER("IoSDServer");
-LLMemType::DeclareMemType LLMemType::MTYPE_IO_SD_CLIENT("IoSDClient");
-LLMemType::DeclareMemType LLMemType::MTYPE_IO_URL_REQUEST("IOUrlRequest");
-
-LLMemType::DeclareMemType LLMemType::MTYPE_DIRECTX_INIT("DirectXInit");
-
-LLMemType::DeclareMemType LLMemType::MTYPE_TEMP1("Temp1");
-LLMemType::DeclareMemType LLMemType::MTYPE_TEMP2("Temp2");
-LLMemType::DeclareMemType LLMemType::MTYPE_TEMP3("Temp3");
-LLMemType::DeclareMemType LLMemType::MTYPE_TEMP4("Temp4");
-LLMemType::DeclareMemType LLMemType::MTYPE_TEMP5("Temp5");
-LLMemType::DeclareMemType LLMemType::MTYPE_TEMP6("Temp6");
-LLMemType::DeclareMemType LLMemType::MTYPE_TEMP7("Temp7");
-LLMemType::DeclareMemType LLMemType::MTYPE_TEMP8("Temp8");
-LLMemType::DeclareMemType LLMemType::MTYPE_TEMP9("Temp9");
-
-LLMemType::DeclareMemType LLMemType::MTYPE_OTHER("Other");
-
-
-LLMemType::DeclareMemType::DeclareMemType(char const * st)
-{
-	mID = (S32)mNameList.size();
-	mName = st;
-
-	mNameList.push_back(mName);
-}
-
-LLMemType::DeclareMemType::~DeclareMemType()
-{
-}
-
-LLMemType::LLMemType(LLMemType::DeclareMemType& dt)
-{
-	mTypeIndex = dt.mID;
-	LLAllocator::pushMemType(dt.mID);
-}
-
-LLMemType::~LLMemType()
-{
-	LLAllocator::popMemType();
-}
-
-char const * LLMemType::getNameFromID(S32 id)
-{
-	if (id < 0 || id >= (S32)DeclareMemType::mNameList.size())
-	{
-		return "INVALID";
-	}
-
-	return DeclareMemType::mNameList[id];
-}
-
-//--------------------------------------------------------------------------------------------------
diff --git a/indra/llcommon/llmemtype.h b/indra/llcommon/llmemtype.h
deleted file mode 100644
index 4945dbaf6058ccd266baf55254959e2b561b0f49..0000000000000000000000000000000000000000
--- a/indra/llcommon/llmemtype.h
+++ /dev/null
@@ -1,242 +0,0 @@
-/** 
- * @file llmemtype.h
- * @brief Runtime memory usage debugging utilities.
- *
- * $LicenseInfo:firstyear=2005&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- * 
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- * 
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- * 
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * 
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
- * $/LicenseInfo$
- */
-
-#ifndef LL_MEMTYPE_H
-#define LL_MEMTYPE_H
-
-//----------------------------------------------------------------------------
-//----------------------------------------------------------------------------
-
-//----------------------------------------------------------------------------
-
-#include "linden_common.h"
-//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-// WARNING: Never commit with MEM_TRACK_MEM == 1
-//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-#define MEM_TRACK_MEM (0 && LL_WINDOWS)
-
-#include <vector>
-
-#define MEM_TYPE_NEW(T)
-
-class LL_COMMON_API LLMemType
-{
-public:
-
-	// class we'll initialize all instances of as
-	// static members of MemType.  Then use
-	// to construct any new mem type.
-	class LL_COMMON_API DeclareMemType
-	{
-	public:
-		DeclareMemType(char const * st);
-		~DeclareMemType();
-	
-		S32 mID;
-		char const * mName;
-		
-		// array so we can map an index ID to Name
-		static std::vector<char const *> mNameList;
-	};
-
-	LLMemType(DeclareMemType& dt);
-	~LLMemType();
-
-	static char const * getNameFromID(S32 id);
-
-	static DeclareMemType MTYPE_INIT;
-	static DeclareMemType MTYPE_STARTUP;
-	static DeclareMemType MTYPE_MAIN;
-	static DeclareMemType MTYPE_FRAME;
-
-	static DeclareMemType MTYPE_GATHER_INPUT;
-	static DeclareMemType MTYPE_JOY_KEY;
-
-	static DeclareMemType MTYPE_IDLE;
-	static DeclareMemType MTYPE_IDLE_PUMP;
-	static DeclareMemType MTYPE_IDLE_NETWORK;
-	static DeclareMemType MTYPE_IDLE_UPDATE_REGIONS;
-	static DeclareMemType MTYPE_IDLE_UPDATE_VIEWER_REGION;
-	static DeclareMemType MTYPE_IDLE_UPDATE_SURFACE;
-	static DeclareMemType MTYPE_IDLE_UPDATE_PARCEL_OVERLAY;
-	static DeclareMemType MTYPE_IDLE_AUDIO;
-
-	static DeclareMemType MTYPE_CACHE_PROCESS_PENDING;
-	static DeclareMemType MTYPE_CACHE_PROCESS_PENDING_ASKS;
-	static DeclareMemType MTYPE_CACHE_PROCESS_PENDING_REPLIES;
-
-	static DeclareMemType MTYPE_MESSAGE_CHECK_ALL;
-	static DeclareMemType MTYPE_MESSAGE_PROCESS_ACKS;
-
-	static DeclareMemType MTYPE_RENDER;
-	static DeclareMemType MTYPE_SLEEP;
-
-	static DeclareMemType MTYPE_NETWORK;
-	static DeclareMemType MTYPE_PHYSICS;
-	static DeclareMemType MTYPE_INTERESTLIST;
-
-	static DeclareMemType MTYPE_IMAGEBASE;
-	static DeclareMemType MTYPE_IMAGERAW;
-	static DeclareMemType MTYPE_IMAGEFORMATTED;
-	
-	static DeclareMemType MTYPE_APPFMTIMAGE;
-	static DeclareMemType MTYPE_APPRAWIMAGE;
-	static DeclareMemType MTYPE_APPAUXRAWIMAGE;
-	
-	static DeclareMemType MTYPE_DRAWABLE;
-	
-	static DeclareMemType MTYPE_OBJECT;
-	static DeclareMemType MTYPE_OBJECT_PROCESS_UPDATE;
-	static DeclareMemType MTYPE_OBJECT_PROCESS_UPDATE_CORE;
-
-	static DeclareMemType MTYPE_DISPLAY;
-	static DeclareMemType MTYPE_DISPLAY_UPDATE;
-	static DeclareMemType MTYPE_DISPLAY_UPDATE_CAMERA;
-	static DeclareMemType MTYPE_DISPLAY_UPDATE_GEOM;
-	static DeclareMemType MTYPE_DISPLAY_SWAP;
-	static DeclareMemType MTYPE_DISPLAY_UPDATE_HUD;
-	static DeclareMemType MTYPE_DISPLAY_GEN_REFLECTION;
-	static DeclareMemType MTYPE_DISPLAY_IMAGE_UPDATE;
-	static DeclareMemType MTYPE_DISPLAY_STATE_SORT;
-	static DeclareMemType MTYPE_DISPLAY_SKY;
-	static DeclareMemType MTYPE_DISPLAY_RENDER_GEOM;
-	static DeclareMemType MTYPE_DISPLAY_RENDER_FLUSH;
-	static DeclareMemType MTYPE_DISPLAY_RENDER_UI;
-	static DeclareMemType MTYPE_DISPLAY_RENDER_ATTACHMENTS;
-
-	static DeclareMemType MTYPE_VERTEX_DATA;
-	static DeclareMemType MTYPE_VERTEX_CONSTRUCTOR;
-	static DeclareMemType MTYPE_VERTEX_DESTRUCTOR;
-	static DeclareMemType MTYPE_VERTEX_CREATE_VERTICES;
-	static DeclareMemType MTYPE_VERTEX_CREATE_INDICES;
-	static DeclareMemType MTYPE_VERTEX_DESTROY_BUFFER;	
-	static DeclareMemType MTYPE_VERTEX_DESTROY_INDICES;
-	static DeclareMemType MTYPE_VERTEX_UPDATE_VERTS;
-	static DeclareMemType MTYPE_VERTEX_UPDATE_INDICES;
-	static DeclareMemType MTYPE_VERTEX_ALLOCATE_BUFFER;
-	static DeclareMemType MTYPE_VERTEX_RESIZE_BUFFER;
-	static DeclareMemType MTYPE_VERTEX_MAP_BUFFER;
-	static DeclareMemType MTYPE_VERTEX_MAP_BUFFER_VERTICES;
-	static DeclareMemType MTYPE_VERTEX_MAP_BUFFER_INDICES;
-	static DeclareMemType MTYPE_VERTEX_UNMAP_BUFFER;
-	static DeclareMemType MTYPE_VERTEX_SET_STRIDE;
-	static DeclareMemType MTYPE_VERTEX_SET_BUFFER;
-	static DeclareMemType MTYPE_VERTEX_SETUP_VERTEX_BUFFER;
-	static DeclareMemType MTYPE_VERTEX_CLEANUP_CLASS;
-
-	static DeclareMemType MTYPE_SPACE_PARTITION;
-
-	static DeclareMemType MTYPE_PIPELINE;
-	static DeclareMemType MTYPE_PIPELINE_INIT;
-	static DeclareMemType MTYPE_PIPELINE_CREATE_BUFFERS;
-	static DeclareMemType MTYPE_PIPELINE_RESTORE_GL;
-	static DeclareMemType MTYPE_PIPELINE_UNLOAD_SHADERS;
-	static DeclareMemType MTYPE_PIPELINE_LIGHTING_DETAIL;
-	static DeclareMemType MTYPE_PIPELINE_GET_POOL_TYPE;
-	static DeclareMemType MTYPE_PIPELINE_ADD_POOL;
-	static DeclareMemType MTYPE_PIPELINE_ALLOCATE_DRAWABLE;
-	static DeclareMemType MTYPE_PIPELINE_ADD_OBJECT;
-	static DeclareMemType MTYPE_PIPELINE_CREATE_OBJECTS;
-	static DeclareMemType MTYPE_PIPELINE_UPDATE_MOVE;
-	static DeclareMemType MTYPE_PIPELINE_UPDATE_GEOM;
-	static DeclareMemType MTYPE_PIPELINE_MARK_VISIBLE;
-	static DeclareMemType MTYPE_PIPELINE_MARK_MOVED;
-	static DeclareMemType MTYPE_PIPELINE_MARK_SHIFT;
-	static DeclareMemType MTYPE_PIPELINE_SHIFT_OBJECTS;
-	static DeclareMemType MTYPE_PIPELINE_MARK_TEXTURED;
-	static DeclareMemType MTYPE_PIPELINE_MARK_REBUILD;
-	static DeclareMemType MTYPE_PIPELINE_UPDATE_CULL;
-	static DeclareMemType MTYPE_PIPELINE_STATE_SORT;
-	static DeclareMemType MTYPE_PIPELINE_POST_SORT;
-	
-	static DeclareMemType MTYPE_PIPELINE_RENDER_HUD_ELS;
-	static DeclareMemType MTYPE_PIPELINE_RENDER_HL;
-	static DeclareMemType MTYPE_PIPELINE_RENDER_GEOM;
-	static DeclareMemType MTYPE_PIPELINE_RENDER_GEOM_DEFFERRED;
-	static DeclareMemType MTYPE_PIPELINE_RENDER_GEOM_POST_DEF;
-	static DeclareMemType MTYPE_PIPELINE_RENDER_GEOM_SHADOW;
-	static DeclareMemType MTYPE_PIPELINE_RENDER_SELECT;
-	static DeclareMemType MTYPE_PIPELINE_REBUILD_POOLS;
-	static DeclareMemType MTYPE_PIPELINE_QUICK_LOOKUP;
-	static DeclareMemType MTYPE_PIPELINE_RENDER_OBJECTS;
-	static DeclareMemType MTYPE_PIPELINE_GENERATE_IMPOSTOR;
-	static DeclareMemType MTYPE_PIPELINE_RENDER_BLOOM;
-
-	static DeclareMemType MTYPE_UPKEEP_POOLS;
-
-	static DeclareMemType MTYPE_AVATAR;
-	static DeclareMemType MTYPE_AVATAR_MESH;
-	static DeclareMemType MTYPE_PARTICLES;
-	static DeclareMemType MTYPE_REGIONS;
-
-	static DeclareMemType MTYPE_INVENTORY;
-	static DeclareMemType MTYPE_INVENTORY_DRAW;
-	static DeclareMemType MTYPE_INVENTORY_BUILD_NEW_VIEWS;
-	static DeclareMemType MTYPE_INVENTORY_DO_FOLDER;
-	static DeclareMemType MTYPE_INVENTORY_POST_BUILD;
-	static DeclareMemType MTYPE_INVENTORY_FROM_XML;
-	static DeclareMemType MTYPE_INVENTORY_CREATE_NEW_ITEM;
-	static DeclareMemType MTYPE_INVENTORY_VIEW_INIT;
-	static DeclareMemType MTYPE_INVENTORY_VIEW_SHOW;
-	static DeclareMemType MTYPE_INVENTORY_VIEW_TOGGLE;
-
-	static DeclareMemType MTYPE_ANIMATION;
-	static DeclareMemType MTYPE_VOLUME;
-	static DeclareMemType MTYPE_PRIMITIVE;
-	
-	static DeclareMemType MTYPE_SCRIPT;
-	static DeclareMemType MTYPE_SCRIPT_RUN;
-	static DeclareMemType MTYPE_SCRIPT_BYTECODE;
-	
-	static DeclareMemType MTYPE_IO_PUMP;
-	static DeclareMemType MTYPE_IO_TCP;
-	static DeclareMemType MTYPE_IO_BUFFER;
-	static DeclareMemType MTYPE_IO_HTTP_SERVER;
-	static DeclareMemType MTYPE_IO_SD_SERVER;
-	static DeclareMemType MTYPE_IO_SD_CLIENT;
-	static DeclareMemType MTYPE_IO_URL_REQUEST;
-
-	static DeclareMemType MTYPE_DIRECTX_INIT;
-
-	static DeclareMemType MTYPE_TEMP1;
-	static DeclareMemType MTYPE_TEMP2;
-	static DeclareMemType MTYPE_TEMP3;
-	static DeclareMemType MTYPE_TEMP4;
-	static DeclareMemType MTYPE_TEMP5;
-	static DeclareMemType MTYPE_TEMP6;
-	static DeclareMemType MTYPE_TEMP7;
-	static DeclareMemType MTYPE_TEMP8;
-	static DeclareMemType MTYPE_TEMP9;
-
-	static DeclareMemType MTYPE_OTHER; // Special; used by display code
-
-	S32 mTypeIndex;
-};
-
-//----------------------------------------------------------------------------
-
-#endif
-
diff --git a/indra/llcommon/llstat.cpp b/indra/llcommon/llstat.cpp
index b82d52797e9cd63fc80b2319fe547483996a5138..b46d2e58b2bbb7cbfbef9b408c59e0fe06f2ca42 100644
--- a/indra/llcommon/llstat.cpp
+++ b/indra/llcommon/llstat.cpp
@@ -37,856 +37,49 @@
 
 
 // statics
-S32	            LLPerfBlock::sStatsFlags = LLPerfBlock::LLSTATS_NO_OPTIONAL_STATS;       // Control what is being recorded
-LLPerfBlock::stat_map_t    LLPerfBlock::sStatMap;    // Map full path string to LLStatTime objects, tracks all active objects
-std::string        LLPerfBlock::sCurrentStatPath = "";    // Something like "/total_time/physics/physics step"
-
-//------------------------------------------------------------------------
-// Live config file to trigger stats logging
-static const char    STATS_CONFIG_FILE_NAME[]            = "/dev/shm/simperf/simperf_proc_config.llsd";
-static const F32    STATS_CONFIG_REFRESH_RATE            = 5.0;        // seconds
-
-class LLStatsConfigFile : public LLLiveFile
-{
-public:
-    LLStatsConfigFile()
-        : LLLiveFile(filename(), STATS_CONFIG_REFRESH_RATE),
-        mChanged(false), mStatsp(NULL) { }
-
-    static std::string filename();
-    
-protected:
-    /* virtual */ bool loadFile();
-
-public:
-    void init(LLPerfStats* statsp);
-    static LLStatsConfigFile& instance();
-        // return the singleton stats config file
-
-    bool mChanged;
-
-protected:
-    LLPerfStats*    mStatsp;
-};
-
-std::string LLStatsConfigFile::filename()
-{
-    return STATS_CONFIG_FILE_NAME;
-}
-
-void LLStatsConfigFile::init(LLPerfStats* statsp)
-{
-    mStatsp = statsp;
-}
-
-LLStatsConfigFile& LLStatsConfigFile::instance()
-{
-    static LLStatsConfigFile the_file;
-    return the_file;
-}
-
-
-/* virtual */
-// Load and parse the stats configuration file
-bool LLStatsConfigFile::loadFile()
-{
-    if (!mStatsp)
-    {
-        llwarns << "Tries to load performance configure file without initializing LPerfStats" << llendl;
-        return false;
-    }
-    mChanged = true;
-    
-    LLSD stats_config;
-    {
-        llifstream file(filename().c_str());
-        if (file.is_open())
-        {
-            LLSDSerialize::fromXML(stats_config, file);
-            if (stats_config.isUndefined())
-            {
-                llinfos << "Performance statistics configuration file ill-formed, not recording statistics" << llendl;
-                mStatsp->setReportPerformanceDuration( 0.f );
-                return false;
-            }
-        }
-        else 
-        {    // File went away, turn off stats if it was on
-            if ( mStatsp->frameStatsIsRunning() )
-            {
-                llinfos << "Performance statistics configuration file deleted, not recording statistics" << llendl;
-                mStatsp->setReportPerformanceDuration( 0.f );
-            }
-            return true;
-        }
-    }
-
-    F32 duration = 0.f;
-    F32 interval = 0.f;
-	S32 flags = LLPerfBlock::LLSTATS_BASIC_STATS;
-
-    const char * w = "duration";
-    if (stats_config.has(w))
-    {
-        duration = (F32)stats_config[w].asReal();
-    } 
-    w = "interval";
-    if (stats_config.has(w))
-    {
-        interval = (F32)stats_config[w].asReal();
-    } 
-    w = "flags";
-    if (stats_config.has(w))
-    {
-		flags = (S32)stats_config[w].asInteger();
-		if (flags == LLPerfBlock::LLSTATS_NO_OPTIONAL_STATS &&
-			duration > 0)
-		{   // No flags passed in, but have a duration, so reset to basic stats
-			flags = LLPerfBlock::LLSTATS_BASIC_STATS;
-		}
-    } 
-
-    mStatsp->setReportPerformanceDuration( duration, flags );
-    mStatsp->setReportPerformanceInterval( interval );
-
-    if ( duration > 0 )
-    {
-        if ( interval == 0.f )
-        {
-            llinfos << "Recording performance stats every frame for " << duration << " sec" << llendl;
-        }
-        else
-        {
-            llinfos << "Recording performance stats every " << interval << " seconds for " << duration << " seconds" << llendl;
-        }
-    }
-    else
-    {
-        llinfos << "Performance stats recording turned off" << llendl;
-    }
-	return true;
-}
-
-
-//------------------------------------------------------------------------
-
-LLPerfStats::LLPerfStats(const std::string& process_name, S32 process_pid) : 
-    mFrameStatsFileFailure(FALSE),
-    mSkipFirstFrameStats(FALSE),
-    mProcessName(process_name),
-    mProcessPID(process_pid),
-    mReportPerformanceStatInterval(1.f),
-    mReportPerformanceStatEnd(0.0) 
-{ }
-
-LLPerfStats::~LLPerfStats()
-{
-    LLPerfBlock::clearDynamicStats();
-    mFrameStatsFile.close();
-}
-
-void LLPerfStats::init()
-{
-    // Initialize the stats config file instance.
-    (void) LLStatsConfigFile::instance().init(this);
-    (void) LLStatsConfigFile::instance().checkAndReload();
-}
-
-// Open file for statistics
-void    LLPerfStats::openPerfStatsFile()
-{
-    if ( !mFrameStatsFile
-        && !mFrameStatsFileFailure )
-    {
-        std::string stats_file = llformat("/dev/shm/simperf/%s_proc.%d.llsd", mProcessName.c_str(), mProcessPID);
-        mFrameStatsFile.close();
-        mFrameStatsFile.clear();
-        mFrameStatsFile.open(stats_file, llofstream::out);
-        if ( mFrameStatsFile.fail() )
-        {
-            llinfos << "Error opening statistics log file " << stats_file << llendl;
-            mFrameStatsFileFailure = TRUE;
-        }
-        else
-        {
-            LLSD process_info = LLSD::emptyMap();
-            process_info["name"] = mProcessName;
-            process_info["pid"] = (LLSD::Integer) mProcessPID;
-            process_info["stat_rate"] = (LLSD::Integer) mReportPerformanceStatInterval;
-            // Add process-specific info.
-            addProcessHeaderInfo(process_info);
-
-            mFrameStatsFile << LLSDNotationStreamer(process_info) << std::endl; 
-        }
-    }
-}
-
-// Dump out performance metrics over some time interval
-void LLPerfStats::dumpIntervalPerformanceStats()
-{
-    // Ensure output file is OK
-    openPerfStatsFile();
-
-    if ( mFrameStatsFile )
-    {
-        LLSD stats = LLSD::emptyMap();
-
-        LLStatAccum::TimeScale scale;
-        if ( getReportPerformanceInterval() == 0.f )
-        {
-            scale = LLStatAccum::SCALE_PER_FRAME;
-        }
-        else if ( getReportPerformanceInterval() < 0.5f )
-        {
-            scale = LLStatAccum::SCALE_100MS;
-        }
-        else
-        {
-            scale = LLStatAccum::SCALE_SECOND;
-        }
-
-        // Write LLSD into log
-        stats["utc_time"] = (LLSD::String) LLError::utcTime();
-        stats["timestamp"] = U64_to_str((totalTime() / 1000) + (gUTCOffset * 1000));    // milliseconds since epoch
-        stats["frame_number"] = (LLSD::Integer) LLFrameTimer::getFrameCount();
-
-        // Add process-specific frame info.
-        addProcessFrameInfo(stats, scale);
-        LLPerfBlock::addStatsToLLSDandReset( stats, scale );
-
-        mFrameStatsFile << LLSDNotationStreamer(stats) << std::endl; 
-    }
-}
-
-// Set length of performance stat recording.  
-// If turning stats on, caller must provide flags
-void    LLPerfStats::setReportPerformanceDuration( F32 seconds, S32 flags /* = LLSTATS_NO_OPTIONAL_STATS */ )
-{ 
-	if ( seconds <= 0.f )
-	{
-		mReportPerformanceStatEnd = 0.0;
-		LLPerfBlock::setStatsFlags(LLPerfBlock::LLSTATS_NO_OPTIONAL_STATS);		// Make sure all recording is off
-		mFrameStatsFile.close();
-		LLPerfBlock::clearDynamicStats();
-	}
-	else
-	{
-		mReportPerformanceStatEnd = LLFrameTimer::getElapsedSeconds() + ((F64) seconds);
-		// Clear failure flag to try and create the log file once
-		mFrameStatsFileFailure = FALSE;
-		mSkipFirstFrameStats = TRUE;		// Skip the first report (at the end of this frame)
-		LLPerfBlock::setStatsFlags(flags);
-	}
-}
-
-void LLPerfStats::updatePerFrameStats()
-{
-    (void) LLStatsConfigFile::instance().checkAndReload();
-	static LLFrameTimer performance_stats_timer;
-	if ( frameStatsIsRunning() )
-	{
-		if ( mReportPerformanceStatInterval == 0 )
-		{	// Record info every frame
-			if ( mSkipFirstFrameStats )
-			{	// Skip the first time - was started this frame
-				mSkipFirstFrameStats = FALSE;
-			}
-			else
-			{
-				dumpIntervalPerformanceStats();
-			}
-		}
-		else
-		{
-			performance_stats_timer.setTimerExpirySec( getReportPerformanceInterval() );
-			if (performance_stats_timer.checkExpirationAndReset( mReportPerformanceStatInterval ))
-			{
-				dumpIntervalPerformanceStats();
-			}
-		}
-		
-		if ( LLFrameTimer::getElapsedSeconds() > mReportPerformanceStatEnd )
-		{	// Reached end of time, clear it to stop reporting
-			setReportPerformanceDuration(0.f);			// Don't set mReportPerformanceStatEnd directly	
-            llinfos << "Recording performance stats completed" << llendl;
-		}
-	}
-}
-
-
 //------------------------------------------------------------------------
-
-U64 LLStatAccum::sScaleTimes[NUM_SCALES] =
-{
-	USEC_PER_SEC / 10,				// 100 millisec
-	USEC_PER_SEC * 1,				// seconds
-	USEC_PER_SEC * 60,				// minutes
-#if ENABLE_LONG_TIME_STATS
-	// enable these when more time scales are desired
-	USEC_PER_SEC * 60*60,			// hours
-	USEC_PER_SEC * 24*60*60,		// days
-	USEC_PER_SEC * 7*24*60*60,		// weeks
-#endif
-};
-
-
-
-LLStatAccum::LLStatAccum(bool useFrameTimer)
-	: mUseFrameTimer(useFrameTimer),
-	  mRunning(FALSE),
-	  mLastTime(0),
-	  mLastSampleValue(0.0),
-	  mLastSampleValid(FALSE)
-{
-}
-
-LLStatAccum::~LLStatAccum()
-{
-}
-
-
-
-void LLStatAccum::reset(U64 when)
-{
-	mRunning = TRUE;
-	mLastTime = when;
-
-	for (int i = 0; i < NUM_SCALES; ++i)
-	{
-		mBuckets[i].accum = 0.0;
-		mBuckets[i].endTime = when + sScaleTimes[i];
-		mBuckets[i].lastValid = false;
-	}
-}
-
-void LLStatAccum::sum(F64 value)
-{
-	sum(value, getCurrentUsecs());
-}
-
-void LLStatAccum::sum(F64 value, U64 when)
-{
-	if (!mRunning)
-	{
-		reset(when);
-		return;
-	}
-	if (when < mLastTime)
-	{
-		// This happens a LOT on some dual core systems.
-		lldebugs << "LLStatAccum::sum clock has gone backwards from "
-			<< mLastTime << " to " << when << ", resetting" << llendl;
-
-		reset(when);
-		return;
-	}
-
-	// how long is this value for
-	U64 timeSpan = when - mLastTime;
-
-	for (int i = 0; i < NUM_SCALES; ++i)
-	{
-		Bucket& bucket = mBuckets[i];
-
-		if (when < bucket.endTime)
-		{
-			bucket.accum += value;
-		}
-		else
-		{
-			U64 timeScale = sScaleTimes[i];
-
-			U64 timeLeft = when - bucket.endTime;
-				// how much time is left after filling this bucket
-			
-			if (timeLeft < timeScale)
-			{
-				F64 valueLeft = value * timeLeft / timeSpan;
-
-				bucket.lastValid = true;
-				bucket.lastAccum = bucket.accum + (value - valueLeft);
-				bucket.accum = valueLeft;
-				bucket.endTime += timeScale;
-			}
-			else
-			{
-				U64 timeTail = timeLeft % timeScale;
-
-				bucket.lastValid = true;
-				bucket.lastAccum = value * timeScale / timeSpan;
-				bucket.accum = value * timeTail / timeSpan;
-				bucket.endTime += (timeLeft - timeTail) + timeScale;
-			}
-		}
-	}
-
-	mLastTime = when;
-}
-
-
-F32 LLStatAccum::meanValue(TimeScale scale) const
-{
-	if (!mRunning)
-	{
-		return 0.0;
-	}
-	if ( scale == SCALE_PER_FRAME )
-	{	// Per-frame not supported here
-		scale = SCALE_100MS;
-	}
-
-	if (scale < 0 || scale >= NUM_SCALES)
-	{
-		llwarns << "llStatAccum::meanValue called for unsupported scale: "
-			<< scale << llendl;
-		return 0.0;
-	}
-
-	const Bucket& bucket = mBuckets[scale];
-
-	F64 value = bucket.accum;
-	U64 timeLeft = bucket.endTime - mLastTime;
-	U64 scaleTime = sScaleTimes[scale];
-
-	if (bucket.lastValid)
-	{
-		value += bucket.lastAccum * timeLeft / scaleTime;
-	}
-	else if (timeLeft < scaleTime)
-	{
-		value *= scaleTime / (scaleTime - timeLeft);
-	}
-	else
-	{
-		value = 0.0;
-	}
-
-	return (F32)(value / scaleTime);
-}
-
-
-U64 LLStatAccum::getCurrentUsecs() const
-{
-	if (mUseFrameTimer)
-	{
-		return LLFrameTimer::getTotalTime();
-	}
-	else
-	{
-		return totalTime();
-	}
-}
-
-
-// ------------------------------------------------------------------------
-
-LLStatRate::LLStatRate(bool use_frame_timer)
-	: LLStatAccum(use_frame_timer)
-{
-}
-
-void LLStatRate::count(U32 value)
-{
-	sum((F64)value * sScaleTimes[SCALE_SECOND]);
-}
-
-
-void LLStatRate::mark()
- { 
-	// Effectively the same as count(1), but sets mLastSampleValue
-	U64 when = getCurrentUsecs();
-
-	if ( mRunning 
-		 && (when > mLastTime) )
-	{	// Set mLastSampleValue to the time from the last mark()
-		F64 duration = ((F64)(when - mLastTime)) / sScaleTimes[SCALE_SECOND];
-		if ( duration > 0.0 )
-		{
-			mLastSampleValue = 1.0 / duration;
-		}
-		else
-		{
-			mLastSampleValue = 0.0;
-		}
-	}
-
-	sum( (F64) sScaleTimes[SCALE_SECOND], when);
- }
-
-
-// ------------------------------------------------------------------------
-
-
-LLStatMeasure::LLStatMeasure(bool use_frame_timer)
-	: LLStatAccum(use_frame_timer)
-{
-}
-
-void LLStatMeasure::sample(F64 value)
-{
-	U64 when = getCurrentUsecs();
-
-	if (mLastSampleValid)
-	{
-		F64 avgValue = (value + mLastSampleValue) / 2.0;
-		F64 interval = (F64)(when - mLastTime);
-
-		sum(avgValue * interval, when);
-	}
-	else
-	{
-		reset(when);
-	}
-
-	mLastSampleValid = TRUE;
-	mLastSampleValue = value;
-}
-
-
-// ------------------------------------------------------------------------
-
-LLStatTime::LLStatTime(const std::string & key)
-	: LLStatAccum(false),
-	  mFrameNumber(LLFrameTimer::getFrameCount()),
-	  mTotalTimeInFrame(0),
-	  mKey(key)
-#if LL_DEBUG
-	  , mRunning(FALSE)
-#endif
-{
-}
-
-void LLStatTime::start()
-{
-	// Reset frame accumluation if the frame number has changed
-	U32 frame_number = LLFrameTimer::getFrameCount();
-	if ( frame_number != mFrameNumber )
-	{
-		mFrameNumber = frame_number;
-		mTotalTimeInFrame = 0;
-	}
-
-	sum(0.0);
-
-#if LL_DEBUG
-	// Shouldn't be running already
-	llassert( !mRunning );
-	mRunning = TRUE;
-#endif
-}
-
-void LLStatTime::stop()
-{
-	U64 end_time = getCurrentUsecs();
-	U64 duration = end_time - mLastTime;
-	sum(F64(duration), end_time);
-	//llinfos << "mTotalTimeInFrame incremented from  " << mTotalTimeInFrame << " to " << (mTotalTimeInFrame + duration) << llendl; 
-	mTotalTimeInFrame += duration;
-
-#if LL_DEBUG
-	mRunning = FALSE;
-#endif
-}
-
-/* virtual */ F32 LLStatTime::meanValue(TimeScale scale) const
-{
-    if ( LLStatAccum::SCALE_PER_FRAME == scale )
-    {
-        return (F32)mTotalTimeInFrame;
-    }
-    else
-    {
-        return LLStatAccum::meanValue(scale);
-    }
-}
-
-
-// ------------------------------------------------------------------------
-
-
-// Use this constructor for pre-defined LLStatTime objects
-LLPerfBlock::LLPerfBlock(LLStatTime* stat ) : mPredefinedStat(stat), mDynamicStat(NULL)
-{
-    if (mPredefinedStat)
-    {
-        // If dynamic stats are turned on, this will create a separate entry in the stat map.
-        initDynamicStat(mPredefinedStat->mKey);
-
-        // Start predefined stats.  These stats are not part of the stat map.
-        mPredefinedStat->start();
-    }
-}
-
-// Use this constructor for normal, optional LLPerfBlock time slices
-LLPerfBlock::LLPerfBlock( const char* key ) : mPredefinedStat(NULL), mDynamicStat(NULL)
-{
-    if ((sStatsFlags & LLSTATS_BASIC_STATS) == 0)
-	{	// These are off unless the base set is enabled
-		return;
-	}
-
-	initDynamicStat(key);
-}
-
-	
-// Use this constructor for dynamically created LLPerfBlock time slices
-// that are only enabled by specific control flags
-LLPerfBlock::LLPerfBlock( const char* key1, const char* key2, S32 flags ) : mPredefinedStat(NULL), mDynamicStat(NULL)
-{
-    if ((sStatsFlags & flags) == 0)
-	{
-		return;
-	}
-
-    if (NULL == key2 || strlen(key2) == 0)
-    {
-        initDynamicStat(key1);
-    }
-    else
-    {
-        std::ostringstream key;
-        key << key1 << "_" << key2;
-        initDynamicStat(key.str());
-    }
-}
-
-// Set up the result data map if dynamic stats are enabled
-void LLPerfBlock::initDynamicStat(const std::string& key)
-{
-    // Early exit if dynamic stats aren't enabled.
-    if (sStatsFlags == LLSTATS_NO_OPTIONAL_STATS) 
-		return;
-
-    mLastPath = sCurrentStatPath;		// Save and restore current path
-    sCurrentStatPath += "/" + key;		// Add key to current path
-
-    // See if the LLStatTime object already exists
-    stat_map_t::iterator iter = sStatMap.find(sCurrentStatPath);
-    if ( iter == sStatMap.end() )
-    {
-        // StatEntry object doesn't exist, so create it
-        mDynamicStat = new StatEntry( key );
-        sStatMap[ sCurrentStatPath ] = mDynamicStat;	// Set the entry for this path
-    }
-    else
-    {
-        // Found this path in the map, use the object there
-        mDynamicStat = (*iter).second;		// Get StatEntry for the current path
-    }
-
-    if (mDynamicStat)
-    {
-        mDynamicStat->mStat.start();
-        mDynamicStat->mCount++;
-    }
-    else
-    {
-        llwarns << "Initialized NULL dynamic stat at '" << sCurrentStatPath << "'" << llendl;
-       sCurrentStatPath = mLastPath;
-    }
-}
-
-
-// Destructor does the time accounting
-LLPerfBlock::~LLPerfBlock()
-{
-    if (mPredefinedStat) mPredefinedStat->stop();
-    if (mDynamicStat)
-    {
-        mDynamicStat->mStat.stop();
-        sCurrentStatPath = mLastPath;	// Restore the path in case sStatsEnabled changed during this block
-    }
-}
-
-
-// Clear the map of any dynamic stats.  Static routine
-void LLPerfBlock::clearDynamicStats()
-{
-    std::for_each(sStatMap.begin(), sStatMap.end(), DeletePairedPointer());
-    sStatMap.clear();
-}
-
-// static - Extract the stat info into LLSD
-void LLPerfBlock::addStatsToLLSDandReset( LLSD & stats,
-										  LLStatAccum::TimeScale scale )
-{
-    // If we aren't in per-frame scale, we need to go from second to microsecond.
-    U32 scale_adjustment = 1;
-    if (LLStatAccum::SCALE_PER_FRAME != scale)
-    {
-        scale_adjustment = USEC_PER_SEC;
-    }
-	stat_map_t::iterator iter = sStatMap.begin();
-	for ( ; iter != sStatMap.end(); ++iter )
-	{	// Put the entry into LLSD "/full/path/to/stat/" = microsecond total time
-		const std::string & stats_full_path = (*iter).first;
-
-		StatEntry * stat = (*iter).second;
-		if (stat)
-		{
-            if (stat->mCount > 0)
-            {
-                stats[stats_full_path] = LLSD::emptyMap();
-                stats[stats_full_path]["us"] = (LLSD::Integer) (scale_adjustment * stat->mStat.meanValue(scale));
-                if (stat->mCount > 1)
-                {
-                    stats[stats_full_path]["count"] = (LLSD::Integer) stat->mCount;
-                }
-                stat->mCount = 0;
-            }
-		}
-		else
-		{	// Shouldn't have a NULL pointer in the map.
-            llwarns << "Unexpected NULL dynamic stat at '" << stats_full_path << "'" << llendl;
-		}
-	}	
-}
-
-
-// ------------------------------------------------------------------------
-
 LLTimer LLStat::sTimer;
 LLFrameTimer LLStat::sFrameTimer;
 
-void LLStat::init()
+void LLStat::reset()
 {
-	llassert(mNumBins > 0);
 	mNumValues = 0;
 	mLastValue = 0.f;
-	mLastTime = 0.f;
-	mCurBin = (mNumBins-1);
+	delete[] mBins;
+	mBins      = new ValueEntry[mNumBins];
+	mCurBin = mNumBins-1;
 	mNextBin = 0;
-	mBins      = new F32[mNumBins];
-	mBeginTime = new F64[mNumBins];
-	mTime      = new F64[mNumBins];
-	mDT        = new F32[mNumBins];
-	for (U32 i = 0; i < mNumBins; i++)
-	{
-		mBins[i]      = 0.f;
-		mBeginTime[i] = 0.0;
-		mTime[i]      = 0.0;
-		mDT[i]        = 0.f;
-	}
-
-	if (!mName.empty())
-	{
-		stat_map_t::iterator iter = getStatList().find(mName);
-		if (iter != getStatList().end())
-			llwarns << "LLStat with duplicate name: " << mName << llendl;
-		getStatList().insert(std::make_pair(mName, this));
-	}
-}
-
-LLStat::stat_map_t& LLStat::getStatList()
-{
-	static LLStat::stat_map_t stat_list;
-	return stat_list;
 }
 
-LLStat::LLStat(const U32 num_bins, const BOOL use_frame_timer)
-	: mUseFrameTimer(use_frame_timer),
-	  mNumBins(num_bins)
+LLStat::LLStat(std::string name, BOOL use_frame_timer)
+:	LLInstanceTracker<LLStat, std::string>(name),
+	mUseFrameTimer(use_frame_timer),
+	mNumBins(50),
+	mName(name),
+	mBins(NULL)
 {
-	init();
-}
+	llassert(mNumBins > 0);
+	mLastTime  = 0.f;
 
-LLStat::LLStat(std::string name, U32 num_bins, BOOL use_frame_timer)
-	: mUseFrameTimer(use_frame_timer),
-	  mNumBins(num_bins),
-	  mName(name)
-{
-	init();
+	reset();
 }
 
 LLStat::~LLStat()
 {
 	delete[] mBins;
-	delete[] mBeginTime;
-	delete[] mTime;
-	delete[] mDT;
-
-	if (!mName.empty())
-	{
-		// handle multiple entries with the same name
-		stat_map_t::iterator iter = getStatList().find(mName);
-		while (iter != getStatList().end() && iter->second != this)
-			++iter;
-		getStatList().erase(iter);
-	}
-}
-
-void LLStat::reset()
-{
-	U32 i;
-
-	mNumValues = 0;
-	mLastValue = 0.f;
-	mCurBin = (mNumBins-1);
-	delete[] mBins;
-	delete[] mBeginTime;
-	delete[] mTime;
-	delete[] mDT;
-	mBins      = new F32[mNumBins];
-	mBeginTime = new F64[mNumBins];
-	mTime      = new F64[mNumBins];
-	mDT        = new F32[mNumBins];
-	for (i = 0; i < mNumBins; i++)
-	{
-		mBins[i]      = 0.f;
-		mBeginTime[i] = 0.0;
-		mTime[i]      = 0.0;
-		mDT[i]        = 0.f;
-	}
-}
-
-void LLStat::setBeginTime(const F64 time)
-{
-	mBeginTime[mNextBin] = time;
-}
-
-void LLStat::addValueTime(const F64 time, const F32 value)
-{
-	if (mNumValues < mNumBins)
-	{
-		mNumValues++;
-	}
-
-	// Increment the bin counters.
-	mCurBin++;
-	if ((U32)mCurBin == mNumBins)
-	{
-		mCurBin = 0;
-	}
-	mNextBin++;
-	if ((U32)mNextBin == mNumBins)
-	{
-		mNextBin = 0;
-	}
-
-	mBins[mCurBin] = value;
-	mTime[mCurBin] = time;
-	mDT[mCurBin] = (F32)(mTime[mCurBin] - mBeginTime[mCurBin]);
-	//this value is used to prime the min/max calls
-	mLastTime = mTime[mCurBin];
-	mLastValue = value;
-
-	// Set the begin time for the next stat segment.
-	mBeginTime[mNextBin] = mTime[mCurBin];
-	mTime[mNextBin] = mTime[mCurBin];
-	mDT[mNextBin] = 0.f;
-}
-
-void LLStat::start()
-{
-	if (mUseFrameTimer)
-	{
-		mBeginTime[mNextBin] = sFrameTimer.getElapsedSeconds();
-	}
-	else
-	{
-		mBeginTime[mNextBin] = sTimer.getElapsedTimeF64();
-	}
 }
+//
+//void LLStat::start()
+//{
+//	if (mUseFrameTimer)
+//	{
+//		mBins[mNextBin].mBeginTime = sFrameTimer.getElapsedSeconds();
+//	}
+//	else
+//	{
+//		mBins[mNextBin].mBeginTime = sTimer.getElapsedTimeF64();
+//	}
+//}
 
 void LLStat::addValue(const F32 value)
 {
@@ -897,41 +90,41 @@ void LLStat::addValue(const F32 value)
 
 	// Increment the bin counters.
 	mCurBin++;
-	if ((U32)mCurBin == mNumBins)
+	if (mCurBin >= mNumBins)
 	{
 		mCurBin = 0;
 	}
 	mNextBin++;
-	if ((U32)mNextBin == mNumBins)
+	if (mNextBin >= mNumBins)
 	{
 		mNextBin = 0;
 	}
 
-	mBins[mCurBin] = value;
+	mBins[mCurBin].mValue = value;
 	if (mUseFrameTimer)
 	{
-		mTime[mCurBin] = sFrameTimer.getElapsedSeconds();
+		mBins[mCurBin].mTime = sFrameTimer.getElapsedSeconds();
 	}
 	else
 	{
-		mTime[mCurBin] = sTimer.getElapsedTimeF64();
+		mBins[mCurBin].mTime = sTimer.getElapsedTimeF64();
 	}
-	mDT[mCurBin] = (F32)(mTime[mCurBin] - mBeginTime[mCurBin]);
+	mBins[mCurBin].mDT = (F32)(mBins[mCurBin].mTime - mBins[mCurBin].mBeginTime);
 
 	//this value is used to prime the min/max calls
-	mLastTime = mTime[mCurBin];
+	mLastTime = mBins[mCurBin].mTime;
 	mLastValue = value;
 
 	// Set the begin time for the next stat segment.
-	mBeginTime[mNextBin] = mTime[mCurBin];
-	mTime[mNextBin] = mTime[mCurBin];
-	mDT[mNextBin] = 0.f;
+	mBins[mNextBin].mBeginTime = mBins[mCurBin].mTime;
+	mBins[mNextBin].mTime = mBins[mCurBin].mTime;
+	mBins[mNextBin].mDT = 0.f;
 }
 
 
 F32 LLStat::getMax() const
 {
-	U32 i;
+	S32 i;
 	F32 current_max = mLastValue;
 	if (mNumBins == 0)
 	{
@@ -942,13 +135,13 @@ F32 LLStat::getMax() const
 		for (i = 0; (i < mNumBins) && (i < mNumValues); i++)
 		{
 			// Skip the bin we're currently filling.
-			if (i == (U32)mNextBin)
+			if (i == mNextBin)
 			{
 				continue;
 			}
-			if (mBins[i] > current_max)
+			if (mBins[i].mValue > current_max)
 			{
-				current_max = mBins[i];
+				current_max = mBins[i].mValue;
 			}
 		}
 	}
@@ -957,17 +150,17 @@ F32 LLStat::getMax() const
 
 F32 LLStat::getMean() const
 {
-	U32 i;
+	S32 i;
 	F32 current_mean = 0.f;
-	U32 samples = 0;
+	S32 samples = 0;
 	for (i = 0; (i < mNumBins) && (i < mNumValues); i++)
 	{
 		// Skip the bin we're currently filling.
-		if (i == (U32)mNextBin)
+		if (i == mNextBin)
 		{
 			continue;
 		}
-		current_mean += mBins[i];
+		current_mean += mBins[i].mValue;
 		samples++;
 	}
 
@@ -985,7 +178,7 @@ F32 LLStat::getMean() const
 
 F32 LLStat::getMin() const
 {
-	U32 i;
+	S32 i;
 	F32 current_min = mLastValue;
 
 	if (mNumBins == 0)
@@ -997,53 +190,19 @@ F32 LLStat::getMin() const
 		for (i = 0; (i < mNumBins) && (i < mNumValues); i++)
 		{
 			// Skip the bin we're currently filling.
-			if (i == (U32)mNextBin)
+			if (i == mNextBin)
 			{
 				continue;
 			}
-			if (mBins[i] < current_min)
+			if (mBins[i].mValue < current_min)
 			{
-				current_min = mBins[i];
+				current_min = mBins[i].mValue;
 			}
 		}
 	}
 	return current_min;
 }
 
-F32 LLStat::getSum() const
-{
-	U32 i;
-	F32 sum = 0.f;
-	for (i = 0; (i < mNumBins) && (i < mNumValues); i++)
-	{
-		// Skip the bin we're currently filling.
-		if (i == (U32)mNextBin)
-		{
-			continue;
-		}
-		sum += mBins[i];
-	}
-
-	return sum;
-}
-
-F32 LLStat::getSumDuration() const
-{
-	U32 i;
-	F32 sum = 0.f;
-	for (i = 0; (i < mNumBins) && (i < mNumValues); i++)
-	{
-		// Skip the bin we're currently filling.
-		if (i == (U32)mNextBin)
-		{
-			continue;
-		}
-		sum += mDT[i];
-	}
-
-	return sum;
-}
-
 F32 LLStat::getPrev(S32 age) const
 {
 	S32 bin;
@@ -1059,7 +218,7 @@ F32 LLStat::getPrev(S32 age) const
 		// Bogus for bin we're currently working on.
 		return 0.f;
 	}
-	return mBins[bin];
+	return mBins[bin].mValue;
 }
 
 F32 LLStat::getPrevPerSec(S32 age) const
@@ -1077,107 +236,34 @@ F32 LLStat::getPrevPerSec(S32 age) const
 		// Bogus for bin we're currently working on.
 		return 0.f;
 	}
-	return mBins[bin] / mDT[bin];
-}
-
-F64 LLStat::getPrevBeginTime(S32 age) const
-{
-	S32 bin;
-	bin = mCurBin - age;
-
-	while (bin < 0)
-	{
-		bin += mNumBins;
-	}
-
-	if (bin == mNextBin)
-	{
-		// Bogus for bin we're currently working on.
-		return 0.f;
-	}
-
-	return mBeginTime[bin];
-}
-
-F64 LLStat::getPrevTime(S32 age) const
-{
-	S32 bin;
-	bin = mCurBin - age;
-
-	while (bin < 0)
-	{
-		bin += mNumBins;
-	}
-
-	if (bin == mNextBin)
-	{
-		// Bogus for bin we're currently working on.
-		return 0.f;
-	}
-
-	return mTime[bin];
-}
-
-F32 LLStat::getBin(S32 bin) const
-{
-	return mBins[bin];
-}
-
-F32 LLStat::getBinPerSec(S32 bin) const
-{
-	return mBins[bin] / mDT[bin];
-}
-
-F64 LLStat::getBinBeginTime(S32 bin) const
-{
-	return mBeginTime[bin];
-}
-
-F64 LLStat::getBinTime(S32 bin) const
-{
-	return mTime[bin];
+	return mBins[bin].mValue / mBins[bin].mDT;
 }
 
 F32 LLStat::getCurrent() const
 {
-	return mBins[mCurBin];
+	return mBins[mCurBin].mValue;
 }
 
 F32 LLStat::getCurrentPerSec() const
 {
-	return mBins[mCurBin] / mDT[mCurBin];
-}
-
-F64 LLStat::getCurrentBeginTime() const
-{
-	return mBeginTime[mCurBin];
-}
-
-F64 LLStat::getCurrentTime() const
-{
-	return mTime[mCurBin];
-}
-
-F32 LLStat::getCurrentDuration() const
-{
-	return mDT[mCurBin];
+	return mBins[mCurBin].mValue / mBins[mCurBin].mDT;
 }
 
 F32 LLStat::getMeanPerSec() const
 {
-	U32 i;
+	S32 i;
 	F32 value = 0.f;
 	F32 dt    = 0.f;
 
 	for (i = 0; (i < mNumBins) && (i < mNumValues); i++)
 	{
 		// Skip the bin we're currently filling.
-		if (i == (U32)mNextBin)
+		if (i == mNextBin)
 		{
 			continue;
 		}
-		value += mBins[i];
-		dt    += mDT[i];
+		value += mBins[i].mValue;
+		dt    += mBins[i].mDT;
 	}
 
 	if (dt > 0.f)
@@ -1190,73 +276,47 @@ F32 LLStat::getMeanPerSec() const
 	}
 }
 
-F32 LLStat::getMeanDuration() const
-{
-	F32 dur = 0.0f;
-	U32 count = 0;
-	for (U32 i=0; (i < mNumBins) && (i < mNumValues); i++)
-	{
-		if (i == (U32)mNextBin)
-		{
-			continue;
-		}
-		dur += mDT[i];
-		count++;
-	}
-
-	if (count > 0)
-	{
-		dur /= F32(count);
-		return dur;
-	}
-	else
-	{
-		return 0.f;
-	}
-}
-
 F32 LLStat::getMaxPerSec() const
 {
-	U32 i;
 	F32 value;
 
 	if (mNextBin != 0)
 	{
-		value = mBins[0]/mDT[0];
+		value = mBins[0].mValue/mBins[0].mDT;
 	}
 	else if (mNumValues > 0)
 	{
-		value = mBins[1]/mDT[1];
+		value = mBins[1].mValue/mBins[1].mDT;
 	}
 	else
 	{
 		value = 0.f;
 	}
 
-	for (i = 0; (i < mNumBins) && (i < mNumValues); i++)
+	for (S32 i = 0; (i < mNumBins) && (i < mNumValues); i++)
 	{
 		// Skip the bin we're currently filling.
-		if (i == (U32)mNextBin)
+		if (i == mNextBin)
 		{
 			continue;
 		}
-		value = llmax(value, mBins[i]/mDT[i]);
+		value = llmax(value, mBins[i].mValue/mBins[i].mDT);
 	}
 	return value;
 }
 
 F32 LLStat::getMinPerSec() const
 {
-	U32 i;
+	S32 i;
 	F32 value;
 	
 	if (mNextBin != 0)
 	{
-		value = mBins[0]/mDT[0];
+		value = mBins[0].mValue/mBins[0].mDT;
 	}
 	else if (mNumValues > 0)
 	{
-		value = mBins[1]/mDT[1];
+		value = mBins[1].mValue/mBins[0].mDT;
 	}
 	else
 	{
@@ -1266,25 +326,15 @@ F32 LLStat::getMinPerSec() const
 	for (i = 0; (i < mNumBins) && (i < mNumValues); i++)
 	{
 		// Skip the bin we're currently filling.
-		if (i == (U32)mNextBin)
+		if (i == mNextBin)
 		{
 			continue;
 		}
-		value = llmin(value, mBins[i]/mDT[i]);
+		value = llmin(value, mBins[i].mValue/mBins[i].mDT);
 	}
 	return value;
 }
 
-F32 LLStat::getMinDuration() const
-{
-	F32 dur = 0.0f;
-	for (U32 i=0; (i < mNumBins) && (i < mNumValues); i++)
-	{
-		dur = llmin(dur, mDT[i]);
-	}
-	return dur;
-}
-
 U32 LLStat::getNumValues() const
 {
 	return mNumValues;
@@ -1295,17 +345,8 @@ S32 LLStat::getNumBins() const
 	return mNumBins;
 }
 
-S32 LLStat::getCurBin() const
-{
-	return mCurBin;
-}
-
 S32 LLStat::getNextBin() const
 {
 	return mNextBin;
 }
 
-F64 LLStat::getLastTime() const
-{
-	return mLastTime;
-}
diff --git a/indra/llcommon/llstat.h b/indra/llcommon/llstat.h
index 1a8404cc0719488b8d497605181a44996e95c715..82a246275d5f2f16f1bb608e83cba5fe728f3275 100644
--- a/indra/llcommon/llstat.h
+++ b/indra/llcommon/llstat.h
@@ -27,309 +27,70 @@
 #ifndef LL_LLSTAT_H
 #define LL_LLSTAT_H
 
-#include <deque>
 #include <map>
 
 #include "lltimer.h"
 #include "llframetimer.h"
-#include "llfile.h"
+#include "llinstancetracker.h"
 
 class	LLSD;
 
-// Set this if longer stats are needed
-#define ENABLE_LONG_TIME_STATS	0
-
-//
-// Accumulates statistics for an arbitrary length of time.
-// Does this by maintaining a chain of accumulators, each one
-// accumulation the results of the parent.  Can scale to arbitrary
-// amounts of time with very low memory cost.
-//
-
-class LL_COMMON_API LLStatAccum
-{
-protected:
-	LLStatAccum(bool use_frame_timer);
-	virtual ~LLStatAccum();
-
-public:
-	enum TimeScale {
-		SCALE_100MS,
-		SCALE_SECOND,
-		SCALE_MINUTE,
-#if ENABLE_LONG_TIME_STATS
-		SCALE_HOUR,
-		SCALE_DAY,
-		SCALE_WEEK,
-#endif
-		NUM_SCALES,			// Use to size storage arrays
-		SCALE_PER_FRAME		// For latest frame information - should be after NUM_SCALES since this doesn't go into the time buckets
-	};
-
-	static U64 sScaleTimes[NUM_SCALES];
-
-	virtual F32 meanValue(TimeScale scale) const;
-		// see the subclasses for the specific meaning of value
-
-	F32 meanValueOverLast100ms()  const { return meanValue(SCALE_100MS);  }
-	F32 meanValueOverLastSecond() const	{ return meanValue(SCALE_SECOND); }
-	F32 meanValueOverLastMinute() const	{ return meanValue(SCALE_MINUTE); }
-
-	void reset(U64 when);
-
-	void sum(F64 value);
-	void sum(F64 value, U64 when);
-
-	U64 getCurrentUsecs() const;
-		// Get current microseconds based on timer type
-
-	BOOL	mUseFrameTimer;
-	BOOL	mRunning;
-
-	U64		mLastTime;
-	
-	struct Bucket
-	{
-		Bucket() :
-			accum(0.0),
-			endTime(0),
-			lastValid(false),
-			lastAccum(0.0)
-		{}
-
-		F64	accum;
-		U64	endTime;
-
-		bool	lastValid;
-		F64	lastAccum;
-	};
-
-	Bucket	mBuckets[NUM_SCALES];
-
-	BOOL 	mLastSampleValid;
-	F64 	mLastSampleValue;
-};
-
-class LL_COMMON_API LLStatMeasure : public LLStatAccum
-	// gathers statistics about things that are measured
-	// ex.: tempature, time dilation
-{
-public:
-	LLStatMeasure(bool use_frame_timer = true);
-
-	void sample(F64);
-	void sample(S32 v) { sample((F64)v); }
-	void sample(U32 v) { sample((F64)v); }
-	void sample(S64 v) { sample((F64)v); }
-	void sample(U64 v) { sample((F64)v); }
-};
-
-
-class LL_COMMON_API LLStatRate : public LLStatAccum
-	// gathers statistics about things that can be counted over time
-	// ex.: LSL instructions executed, messages sent, simulator frames completed
-	// renders it in terms of rate of thing per second
-{
-public:
-	LLStatRate(bool use_frame_timer = true);
-
-	void count(U32);
-		// used to note that n items have occured
-	
-	void mark();
-		// used for counting the rate thorugh a point in the code
-};
-
-
-class LL_COMMON_API LLStatTime : public LLStatAccum
-	// gathers statistics about time spent in a block of code
-	// measure average duration per second in the block
-{
-public:
-	LLStatTime( const std::string & key = "undefined" );
-
-	U32		mFrameNumber;		// Current frame number
-	U64		mTotalTimeInFrame;	// Total time (microseconds) accumulated during the last frame
-
-	void	setKey( const std::string & key )		{ mKey = key;	};
-
-	virtual F32 meanValue(TimeScale scale) const;
-
-private:
-	void start();				// Start and stop measuring time block
-	void stop();
-
-	std::string		mKey;		// Tag representing this time block
-
-#if LL_DEBUG
-	BOOL			mRunning;	// TRUE if start() has been called
-#endif
-
-	friend class LLPerfBlock;
-};
-
-// ----------------------------------------------------------------------------
-
-
-// Use this class on the stack to record statistics about an area of code
-class LL_COMMON_API LLPerfBlock
-{
-public:
-    struct StatEntry
-    {
-            StatEntry(const std::string& key) : mStat(LLStatTime(key)), mCount(0) {}
-            LLStatTime  mStat;
-            U32         mCount;
-    };
-    typedef std::map<std::string, StatEntry*>		stat_map_t;
-
-	// Use this constructor for pre-defined LLStatTime objects
-	LLPerfBlock(LLStatTime* stat);
-
-	// Use this constructor for normal, optional LLPerfBlock time slices
-	LLPerfBlock( const char* key );
-
-	// Use this constructor for dynamically created LLPerfBlock time slices
-	// that are only enabled by specific control flags
-	LLPerfBlock( const char* key1, const char* key2, S32 flags = LLSTATS_BASIC_STATS );
-
-	~LLPerfBlock();
-
-	enum
-	{	// Stats bitfield flags
-		LLSTATS_NO_OPTIONAL_STATS	= 0x00,		// No optional stats gathering, just pre-defined LLStatTime objects
-		LLSTATS_BASIC_STATS			= 0x01,		// Gather basic optional runtime stats
-		LLSTATS_SCRIPT_FUNCTIONS	= 0x02,		// Include LSL function calls
-	};
-	static void setStatsFlags( S32 flags )	{ sStatsFlags = flags;	};
-	static S32  getStatsFlags()				{ return sStatsFlags;	};
-
-	static void clearDynamicStats();		// Reset maps to clear out dynamic objects
-	static void addStatsToLLSDandReset( LLSD & stats,		// Get current information and clear time bin
-										LLStatAccum::TimeScale scale );
-
-private:
-	// Initialize dynamically created LLStatTime objects
-    void initDynamicStat(const std::string& key);
-
-	std::string				mLastPath;				// Save sCurrentStatPath when this is called
-	LLStatTime * 			mPredefinedStat;		// LLStatTime object to get data
-	StatEntry *				mDynamicStat;   		// StatEntryobject to get data
-
-	static S32				sStatsFlags;			// Control what is being recorded
-    static stat_map_t		sStatMap;				// Map full path string to LLStatTime objects
-	static std::string		sCurrentStatPath;		// Something like "frame/physics/physics step"
-};
-
-// ----------------------------------------------------------------------------
-
-class LL_COMMON_API LLPerfStats
-{
-public:
-    LLPerfStats(const std::string& process_name = "unknown", S32 process_pid = 0);
-    virtual ~LLPerfStats();
-
-    virtual void init();    // Reset and start all stat timers
-    virtual void updatePerFrameStats();
-    // Override these function to add process-specific information to the performance log header and per-frame logging.
-    virtual void addProcessHeaderInfo(LLSD& info) { /* not implemented */ }
-    virtual void addProcessFrameInfo(LLSD& info, LLStatAccum::TimeScale scale) { /* not implemented */ }
-
-    // High-resolution frame stats
-    BOOL    frameStatsIsRunning()                                { return (mReportPerformanceStatEnd > 0.);        };
-    F32     getReportPerformanceInterval() const                { return mReportPerformanceStatInterval;        };
-    void    setReportPerformanceInterval( F32 interval )        { mReportPerformanceStatInterval = interval;    };
-    void    setReportPerformanceDuration( F32 seconds, S32 flags = LLPerfBlock::LLSTATS_NO_OPTIONAL_STATS );
-    void    setProcessName(const std::string& process_name) { mProcessName = process_name; }
-    void    setProcessPID(S32 process_pid) { mProcessPID = process_pid; }
-
-protected:
-    void    openPerfStatsFile();                    // Open file for high resolution metrics logging
-    void    dumpIntervalPerformanceStats();
-
-    llofstream      mFrameStatsFile;            // File for per-frame stats
-    BOOL            mFrameStatsFileFailure;        // Flag to prevent repeat opening attempts
-    BOOL            mSkipFirstFrameStats;        // Flag to skip one (partial) frame report
-    std::string     mProcessName;
-    S32             mProcessPID;
-
-private:
-    F32 mReportPerformanceStatInterval;    // Seconds between performance stats
-    F64 mReportPerformanceStatEnd;        // End time (seconds) for performance stats
-};
-
 // ----------------------------------------------------------------------------
-class LL_COMMON_API LLStat
+class LL_COMMON_API LLStat : public LLInstanceTracker<LLStat, std::string>
 {
-private:
-	typedef std::multimap<std::string, LLStat*> stat_map_t;
-
-	void init();
-	static stat_map_t& getStatList();
-
 public:
-	LLStat(U32 num_bins = 32, BOOL use_frame_timer = FALSE);
-	LLStat(std::string name, U32 num_bins = 32, BOOL use_frame_timer = FALSE);
+	LLStat(std::string name = std::string(), BOOL use_frame_timer = FALSE);
 	~LLStat();
 
-	void reset();
-
-	void start();	// Start the timer for the current "frame", otherwise uses the time tracked from
+	//void start();	// Start the timer for the current "frame", otherwise uses the time tracked from
 					// the last addValue
+	void reset();
 	void addValue(const F32 value = 1.f); // Adds the current value being tracked, and tracks the DT.
 	void addValue(const S32 value) { addValue((F32)value); }
 	void addValue(const U32 value) { addValue((F32)value); }
 
-	void setBeginTime(const F64 time);
-	void addValueTime(const F64 time, const F32 value = 1.f);
-	
-	S32 getCurBin() const;
 	S32 getNextBin() const;
 	
-	F32 getCurrent() const;
-	F32 getCurrentPerSec() const;
-	F64 getCurrentBeginTime() const;
-	F64 getCurrentTime() const;
-	F32 getCurrentDuration() const;
-	
 	F32 getPrev(S32 age) const;				// Age is how many "addValues" previously - zero is current
 	F32 getPrevPerSec(S32 age) const;		// Age is how many "addValues" previously - zero is current
-	F64 getPrevBeginTime(S32 age) const;
-	F64 getPrevTime(S32 age) const;
-	
-	F32 getBin(S32 bin) const;
-	F32 getBinPerSec(S32 bin) const;
-	F64 getBinBeginTime(S32 bin) const;
-	F64 getBinTime(S32 bin) const;
 
-	F32 getMax() const;
-	F32 getMaxPerSec() const;
+	F32 getCurrent() const;
+	F32 getCurrentPerSec() const;
 	
-	F32 getMean() const;
-	F32 getMeanPerSec() const;
-	F32 getMeanDuration() const;
-
 	F32 getMin() const;
 	F32 getMinPerSec() const;
-	F32 getMinDuration() const;
 
-	F32 getSum() const;
-	F32 getSumDuration() const;
+	F32 getMean() const;
+	F32 getMeanPerSec() const;
+	
+	F32 getMax() const;
+	F32 getMaxPerSec() const;
 
 	U32 getNumValues() const;
 	S32 getNumBins() const;
 
-	F64 getLastTime() const;
 private:
-	BOOL mUseFrameTimer;
+	bool mUseFrameTimer;
 	U32 mNumValues;
 	U32 mNumBins;
 	F32 mLastValue;
 	F64 mLastTime;
-	F32 *mBins;
-	F64 *mBeginTime;
-	F64 *mTime;
-	F32 *mDT;
+
+	struct ValueEntry
+	{
+		ValueEntry()
+		:	mValue(0.f),
+			mBeginTime(0.0),
+			mTime(0.0),
+			mDT(0.f)
+		{}
+		F32 mValue;
+		F64 mBeginTime;
+		F64 mTime;
+		F32 mDT;
+	};
+	ValueEntry* mBins;
+
 	S32 mCurBin;
 	S32 mNextBin;
 	
@@ -337,17 +98,6 @@ class LL_COMMON_API LLStat
 
 	static LLTimer sTimer;
 	static LLFrameTimer sFrameTimer;
-	
-public:
-	static LLStat* getStat(const std::string& name)
-	{
-		// return the first stat that matches 'name'
-		stat_map_t::iterator iter = getStatList().find(name);
-		if (iter != getStatList().end())
-			return iter->second;
-		else
-			return NULL;
-	}
 };
 	
 #endif // LL_STAT_
diff --git a/indra/llcommon/lltrace.h b/indra/llcommon/lltrace.h
new file mode 100644
index 0000000000000000000000000000000000000000..f3ee90a7213a049d50ad631ab325ebe29de431c2
--- /dev/null
+++ b/indra/llcommon/lltrace.h
@@ -0,0 +1,169 @@
+/** 
+ * @file lltrace.h
+ * @brief Runtime statistics accumulation.
+ *
+ * $LicenseInfo:firstyear=2001&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2012, Linden Research, Inc.
+ * 
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ * 
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * 
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLTRACE_H
+#define LL_LLTRACE_H
+
+namespace LLTrace
+{
+	class Stat
+	{
+	public:
+		Stat(const char* name)
+		:	mName(name)
+		{}
+		void record() {}
+		void record(int value) {}
+		void record(float value) {}
+	private:
+		const std::string mName;
+	};
+
+	class BlockTimer
+	{
+	public:
+		BlockTimer(const char* name)
+		:	mName(name)
+		{}
+
+		struct Accumulator
+		{
+			U32 						mTotalTimeCounter;
+			U32 						mChildTimeCounter;
+			U32 						mCalls;
+			Accumulator*				mParent;		// info for caller timer
+			Accumulator*				mLastCaller;	// used to bootstrap tree construction
+			const BlockTimer*			mTimer;			// points to block timer associated with this storage
+			U8							mActiveCount;	// number of timers with this ID active on stack
+			bool						mMoveUpTree;	// needs to be moved up the tree of timers at the end of frame
+			std::vector<Accumulator*>	mChildren;		// currently assumed child timers
+		};
+
+		struct RecorderStackEntry
+		{
+			struct Recorder*	mRecorder;
+			Accumulator*		mAccumulator;
+			U32					mChildTime;
+		};
+
+		struct Recorder
+		{
+			LL_FORCE_INLINE Recorder(BlockTimer& block_timer)
+			:	mLastRecorder(sCurRecorder)
+			{
+				mStartTime = getCPUClockCount32();
+				Accumulator* accumulator = ???; // get per-thread accumulator
+				accumulator->mActiveCount++;
+				accumulator->mCalls++;
+				accumulator->mMoveUpTree |= (accumulator->mParent->mActiveCount == 0);
+
+				// push new timer on stack
+				sCurRecorder.mRecorder = this;
+				sCurRecorder.mAccumulator = accumulator;
+				sCurRecorder.mChildTime = 0;
+			}
+
+			LL_FORCE_INLINE ~Recorder()
+			{
+				U32 total_time = getCPUClockCount32() - mStartTime;
+
+				Accumulator* accumulator = sCurRecorder.mAccumulator;
+				accumulator->mTotalTimeCounter += total_time;
+				accumulator->mChildTimeCounter += sCurRecorder.mChildTime;
+				accumulator->mActiveCount--;
+
+				accumulator->mLastCaller = mLastRecorder->mAccumulator;
+				mLastRecorder->mChildTime += total_time;
+
+				// pop stack
+				sCurRecorder = mLastRecorder;
+			}
+
+			RecorderStackEntry mLastRecorder;
+			U32 mStartTime;
+		};
+
+	private:
+		U32 getCPUClockCount32()
+		{
+			U32 ret_val;
+			__asm
+			{
+				_emit   0x0f
+					_emit   0x31
+					shr eax,8
+					shl edx,24
+					or eax, edx
+					mov dword ptr [ret_val], eax
+			}
+			return ret_val;
+		}
+
+		// return full timer value, *not* shifted by 8 bits
+		static U64 getCPUClockCount64()
+		{
+			U64 ret_val;
+			__asm
+			{
+				_emit   0x0f
+					_emit   0x31
+					mov eax,eax
+					mov edx,edx
+					mov dword ptr [ret_val+4], edx
+					mov dword ptr [ret_val], eax
+			}
+			return ret_val;
+		}
+
+		const std::string mName;
+		static RecorderStackEntry* sCurRecorder;
+	};
+
+	BlockTimer::RecorderStackEntry BlockTimer::sCurRecorder;
+
+	class TimeInterval 
+	{
+	public:
+		void start() {}
+		void stop() {}
+		void resume() {}
+	};
+
+	class SamplingTimeInterval
+	{
+	public:
+		void start() {}
+		void stop() {}
+		void resume() {}
+	};
+
+}
+
+#define TOKEN_PASTE_ACTUAL(x, y) x##y
+#define TOKEN_PASTE(x, y) TOKEN_PASTE_ACTUAL(x, y)
+#define RECORD_BLOCK_TIME(block_timer) LLTrace::BlockTimer::Recorder TOKEN_PASTE(block_time_recorder, __COUNTER__)(block_timer);
+
+#endif // LL_LLTRACE_H
diff --git a/indra/llimage/llimage.cpp b/indra/llimage/llimage.cpp
index e6b838c5b260ce93da7f0753aaaa0314ccd3027f..2bbbf895eca702337a8219c795fb8ddbfd6cc872 100644
--- a/indra/llimage/llimage.cpp
+++ b/indra/llimage/llimage.cpp
@@ -30,7 +30,6 @@
 
 #include "llmath.h"
 #include "v4coloru.h"
-#include "llmemtype.h"
 
 #include "llimagebmp.h"
 #include "llimagetga.h"
@@ -96,8 +95,7 @@ LLImageBase::LLImageBase()
 	  mHeight(0),
 	  mComponents(0),
 	  mBadBufferAllocation(false),
-	  mAllowOverSize(false),
-	  mMemType(LLMemType::MTYPE_IMAGEBASE)
+	  mAllowOverSize(false)
 {
 }
 
@@ -167,8 +165,6 @@ void LLImageBase::deleteData()
 // virtual
 U8* LLImageBase::allocateData(S32 size)
 {
-	LLMemType mt1(mMemType);
-	
 	if (size < 0)
 	{
 		size = mWidth * mHeight * mComponents;
@@ -213,7 +209,6 @@ U8* LLImageBase::allocateData(S32 size)
 // virtual
 U8* LLImageBase::reallocateData(S32 size)
 {
-	LLMemType mt1(mMemType);
 	U8 *new_datap = (U8*)ALLOCATE_MEM(sPrivatePoolp, size);
 	if (!new_datap)
 	{
@@ -279,14 +274,12 @@ S32 LLImageRaw::sRawImageCount = 0;
 LLImageRaw::LLImageRaw()
 	: LLImageBase()
 {
-	mMemType = LLMemType::MTYPE_IMAGERAW;
 	++sRawImageCount;
 }
 
 LLImageRaw::LLImageRaw(U16 width, U16 height, S8 components)
 	: LLImageBase()
 {
-	mMemType = LLMemType::MTYPE_IMAGERAW;
 	//llassert( S32(width) * S32(height) * S32(components) <= MAX_IMAGE_DATA_SIZE );
 	allocateDataSize(width, height, components);
 	++sRawImageCount;
@@ -295,8 +288,6 @@ LLImageRaw::LLImageRaw(U16 width, U16 height, S8 components)
 LLImageRaw::LLImageRaw(U8 *data, U16 width, U16 height, S8 components, bool no_copy)
 	: LLImageBase()
 {
-	mMemType = LLMemType::MTYPE_IMAGERAW;
-
 	if(no_copy)
 	{
 		setDataAndSize(data, width, height, components);
@@ -375,29 +366,6 @@ BOOL LLImageRaw::resize(U16 width, U16 height, S8 components)
 	return TRUE;
 }
 
-#if 0
-U8 * LLImageRaw::getSubImage(U32 x_pos, U32 y_pos, U32 width, U32 height) const
-{
-	LLMemType mt1(mMemType);
-	U8 *data = new U8[width*height*getComponents()];
-
-	// Should do some simple bounds checking
-	if (!data)
-	{
-		llerrs << "Out of memory in LLImageRaw::getSubImage" << llendl;
-		return NULL;
-	}
-
-	U32 i;
-	for (i = y_pos; i < y_pos+height; i++)
-	{
-		memcpy(data + i*width*getComponents(),		/* Flawfinder: ignore */
-				getData() + ((y_pos + i)*getWidth() + x_pos)*getComponents(), getComponents()*width);
-	}
-	return data;
-}
-#endif
-
 BOOL LLImageRaw::setSubImage(U32 x_pos, U32 y_pos, U32 width, U32 height,
 							 const U8 *data, U32 stride, BOOL reverse_y)
 {
@@ -462,7 +430,6 @@ void LLImageRaw::clear(U8 r, U8 g, U8 b, U8 a)
 // Reverses the order of the rows in the image
 void LLImageRaw::verticalFlip()
 {
-	LLMemType mt1(mMemType);
 	S32 row_bytes = getWidth() * getComponents();
 	llassert(row_bytes > 0);
 	std::vector<U8> line_buffer(row_bytes);
@@ -595,7 +562,6 @@ void LLImageRaw::composite( LLImageRaw* src )
 // Src and dst can be any size.  Src has 4 components.  Dst has 3 components.
 void LLImageRaw::compositeScaled4onto3(LLImageRaw* src)
 {
-	LLMemType mt1(mMemType);
 	llinfos << "compositeScaled4onto3" << llendl;
 
 	LLImageRaw* dst = this;  // Just for clarity.
@@ -837,7 +803,6 @@ void LLImageRaw::copyUnscaled3onto4( LLImageRaw* src )
 // Src and dst can be any size.  Src and dst have same number of components.
 void LLImageRaw::copyScaled( LLImageRaw* src )
 {
-	LLMemType mt1(mMemType);
 	LLImageRaw* dst = this;  // Just for clarity.
 
 	llassert_always( (1 == src->getComponents()) || (3 == src->getComponents()) || (4 == src->getComponents()) );
@@ -866,57 +831,9 @@ void LLImageRaw::copyScaled( LLImageRaw* src )
 	}
 }
 
-#if 0
-//scale down image by not blending a pixel with its neighbors.
-BOOL LLImageRaw::scaleDownWithoutBlending( S32 new_width, S32 new_height)
-{
-	LLMemType mt1(mMemType);
-
-	S8 c = getComponents() ;
-	llassert((1 == c) || (3 == c) || (4 == c) );
-
-	S32 old_width = getWidth();
-	S32 old_height = getHeight();
-	
-	S32 new_data_size = old_width * new_height * c ;
-	llassert_always(new_data_size > 0);
-
-	F32 ratio_x = (F32)old_width / new_width ;
-	F32 ratio_y = (F32)old_height / new_height ;
-	if( ratio_x < 1.0f || ratio_y < 1.0f )
-	{
-		return TRUE;  // Nothing to do.
-	}
-	ratio_x -= 1.0f ;
-	ratio_y -= 1.0f ;
-
-	U8* new_data = allocateMemory(new_data_size) ;
-	llassert_always(new_data != NULL) ;
-
-	U8* old_data = getData() ;
-	S32 i, j, k, s, t;
-	for(i = 0, s = 0, t = 0 ; i < new_height ; i++)
-	{
-		for(j = 0 ; j < new_width ; j++)
-		{
-			for(k = 0 ; k < c ; k++)
-			{
-				new_data[s++] = old_data[t++] ;
-			}
-			t += (S32)(ratio_x * c + 0.1f) ;
-		}
-		t += (S32)(ratio_y * old_width * c + 0.1f) ;
-	}
-
-	setDataAndSize(new_data, new_width, new_height, c) ;
-	
-	return TRUE ;
-}
-#endif
 
 BOOL LLImageRaw::scale( S32 new_width, S32 new_height, BOOL scale_image_data )
 {
-	LLMemType mt1(mMemType);
 	llassert((1 == getComponents()) || (3 == getComponents()) || (4 == getComponents()) );
 
 	S32 old_width = getWidth();
@@ -1346,7 +1263,6 @@ LLImageFormatted::LLImageFormatted(S8 codec)
 	  mDiscardLevel(-1),
 	  mLevels(0)
 {
-	mMemType = LLMemType::MTYPE_IMAGEFORMATTED;
 }
 
 // virtual
diff --git a/indra/llimage/llimage.h b/indra/llimage/llimage.h
index 99023351c2b0646cffcaab6d45a56c8f1837ab3c..b6caa730f19a2dede856c28f6246909140fc47ac 100644
--- a/indra/llimage/llimage.h
+++ b/indra/llimage/llimage.h
@@ -30,7 +30,6 @@
 #include "lluuid.h"
 #include "llstring.h"
 #include "llthread.h"
-#include "llmemtype.h"
 
 const S32 MIN_IMAGE_MIP =  2; // 4x4, only used for expand/contract power of 2
 const S32 MAX_IMAGE_MIP = 11; // 2048x2048
@@ -176,8 +175,6 @@ class LLImageBase : public LLThreadSafeRefCount
 	bool mAllowOverSize ;
 
 	static LLPrivateMemoryPool* sPrivatePoolp ;
-public:
-	LLMemType::DeclareMemType& mMemType; // debug
 };
 
 // Raw representation of an image (used for textures, and other uncompressed formats
@@ -211,8 +208,7 @@ class LLImageRaw : public LLImageBase
 	void contractToPowerOfTwo(S32 max_dim = MAX_IMAGE_SIZE, BOOL scale_image = TRUE);
 	void biasedScaleToPowerOfTwo(S32 max_dim = MAX_IMAGE_SIZE);
 	BOOL scale( S32 new_width, S32 new_height, BOOL scale_image = TRUE );
-	//BOOL scaleDownWithoutBlending( S32 new_width, S32 new_height) ;
-
+	
 	// Fill the buffer with a constant color
 	void fill( const LLColor4U& color );
 
diff --git a/indra/llimage/llimagej2c.cpp b/indra/llimage/llimagej2c.cpp
index 452aad25cb9f462d417e2f7cb8427a45e40a2adc..5412f98ee5d2918182e6141b3108fa8ff411a964 100755
--- a/indra/llimage/llimagej2c.cpp
+++ b/indra/llimage/llimagej2c.cpp
@@ -26,7 +26,6 @@
 
 #include "lldir.h"
 #include "llimagej2c.h"
-#include "llmemtype.h"
 #include "lltimer.h"
 #include "llmath.h"
 #include "llmemory.h"
@@ -161,7 +160,6 @@ BOOL LLImageJ2C::decode(LLImageRaw *raw_imagep, F32 decode_time)
 BOOL LLImageJ2C::decodeChannels(LLImageRaw *raw_imagep, F32 decode_time, S32 first_channel, S32 max_channel_count )
 {
 	LLTimer elapsed;
-	LLMemType mt1(mMemType);
 
 	BOOL res = TRUE;
 	
@@ -227,7 +225,6 @@ BOOL LLImageJ2C::encode(const LLImageRaw *raw_imagep, F32 encode_time)
 BOOL LLImageJ2C::encode(const LLImageRaw *raw_imagep, const char* comment_text, F32 encode_time)
 {
 	LLTimer elapsed;
-	LLMemType mt1(mMemType);
 	resetLastError();
 	BOOL res = mImpl->encodeImpl(*this, *raw_imagep, comment_text, encode_time, mReversible);
 	if (!mLastError.empty())
@@ -404,7 +401,6 @@ BOOL LLImageJ2C::loadAndValidate(const std::string &filename)
 
 BOOL LLImageJ2C::validate(U8 *data, U32 file_size)
 {
-	LLMemType mt1(mMemType);
 
 	resetLastError();
 	
diff --git a/indra/llimage/tests/llimageworker_test.cpp b/indra/llimage/tests/llimageworker_test.cpp
index 08476fb72cce4c4143d2805b7ed2c10d1f05007c..e255d65b43bca62c3705325204787d80113defc7 100644
--- a/indra/llimage/tests/llimageworker_test.cpp
+++ b/indra/llimage/tests/llimageworker_test.cpp
@@ -49,8 +49,7 @@ mWidth(0),
 mHeight(0),
 mComponents(0),
 mBadBufferAllocation(false),
-mAllowOverSize(false),
-mMemType(LLMemType::MTYPE_IMAGEBASE)
+mAllowOverSize(false)
 {
 }
 LLImageBase::~LLImageBase() {}
diff --git a/indra/llinventory/llinventory.h b/indra/llinventory/llinventory.h
index a5cfe59bda347b615f674c351b6050cc362bf2af..4dda41d325fe5a751e857944ab7078145d26decd 100644
--- a/indra/llinventory/llinventory.h
+++ b/indra/llinventory/llinventory.h
@@ -30,7 +30,6 @@
 #include "lldarray.h"
 #include "llfoldertype.h"
 #include "llinventorytype.h"
-#include "llmemtype.h"
 #include "llpermissions.h"
 #include "llrefcount.h"
 #include "llsaleinfo.h"
@@ -54,7 +53,6 @@ class LLInventoryObject : public LLRefCount
 	// Initialization
 	//--------------------------------------------------------------------
 public:
-	MEM_TYPE_NEW(LLMemType::MTYPE_INVENTORY);
 	LLInventoryObject();
 	LLInventoryObject(const LLUUID& uuid, 
 					  const LLUUID& parent_uuid,
@@ -129,7 +127,6 @@ class LLInventoryItem : public LLInventoryObject
 	// Initialization
 	//--------------------------------------------------------------------
 public:
-	MEM_TYPE_NEW(LLMemType::MTYPE_INVENTORY);
 	LLInventoryItem(const LLUUID& uuid,
 					const LLUUID& parent_uuid,
 					const LLPermissions& permissions,
@@ -242,7 +239,6 @@ class LLInventoryCategory : public LLInventoryObject
 	// Initialization
 	//--------------------------------------------------------------------
 public:
-	MEM_TYPE_NEW(LLMemType::MTYPE_INVENTORY);
 	LLInventoryCategory(const LLUUID& uuid, const LLUUID& parent_uuid,
 						LLFolderType::EType preferred_type,
 						const std::string& name);
diff --git a/indra/llkdu/tests/llimagej2ckdu_test.cpp b/indra/llkdu/tests/llimagej2ckdu_test.cpp
index b675153b2ede472fed851b75dc37f79f9c6a4da3..62c245f125b78bafeee2dda6db0ea138e21fcdcf 100755
--- a/indra/llkdu/tests/llimagej2ckdu_test.cpp
+++ b/indra/llkdu/tests/llimagej2ckdu_test.cpp
@@ -58,8 +58,7 @@ mWidth(0),
 mHeight(0),
 mComponents(0),
 mBadBufferAllocation(false),
-mAllowOverSize(false),
-mMemType(LLMemType::MTYPE_IMAGEBASE)
+mAllowOverSize(false)
 { }
 LLImageBase::~LLImageBase() { }
 U8* LLImageBase::allocateData(S32 ) { return NULL; }
diff --git a/indra/llmath/llvolume.cpp b/indra/llmath/llvolume.cpp
index 53d56e96dac6a9c4fedd218c3cea755b4f9fb173..c85e1b1fb3f4d569c51391ae5d251116d671824b 100644
--- a/indra/llmath/llvolume.cpp
+++ b/indra/llmath/llvolume.cpp
@@ -35,7 +35,6 @@
 #include <cmath>
 
 #include "llerror.h"
-#include "llmemtype.h"
 
 #include "llvolumemgr.h"
 #include "v2math.h"
@@ -378,8 +377,6 @@ class LLVolumeOctreeRebound : public LLOctreeTravelerDepthFirst<LLVolumeTriangle
 
 LLProfile::Face* LLProfile::addCap(S16 faceID)
 {
-	LLMemType m1(LLMemType::MTYPE_VOLUME);
-	
 	Face *face   = vector_append(mFaces, 1);
 	
 	face->mIndex = 0;
@@ -392,8 +389,6 @@ LLProfile::Face* LLProfile::addCap(S16 faceID)
 
 LLProfile::Face* LLProfile::addFace(S32 i, S32 count, F32 scaleU, S16 faceID, BOOL flat)
 {
-	LLMemType m1(LLMemType::MTYPE_VOLUME);
-	
 	Face *face   = vector_append(mFaces, 1);
 	
 	face->mIndex = i;
@@ -409,7 +404,6 @@ LLProfile::Face* LLProfile::addFace(S32 i, S32 count, F32 scaleU, S16 faceID, BO
 //static
 S32 LLProfile::getNumNGonPoints(const LLProfileParams& params, S32 sides, F32 offset, F32 bevel, F32 ang_scale, S32 split)
 { // this is basically LLProfile::genNGon stripped down to only the operations that influence the number of points
-	LLMemType m1(LLMemType::MTYPE_VOLUME);
 	S32 np = 0;
 
 	// Generate an n-sided "circular" path.
@@ -475,8 +469,6 @@ S32 LLProfile::getNumNGonPoints(const LLProfileParams& params, S32 sides, F32 of
 // filleted and chamfered corners
 void LLProfile::genNGon(const LLProfileParams& params, S32 sides, F32 offset, F32 bevel, F32 ang_scale, S32 split)
 {
-	LLMemType m1(LLMemType::MTYPE_VOLUME);
-	
 	// Generate an n-sided "circular" path.
 	// 0 is (1,0), and we go counter-clockwise along a circular path from there.
 	const F32 tableScale[] = { 1, 1, 1, 0.5f, 0.707107f, 0.53f, 0.525f, 0.5f };
@@ -730,8 +722,6 @@ LLProfile::Face* LLProfile::addHole(const LLProfileParams& params, BOOL flat, F3
 S32 LLProfile::getNumPoints(const LLProfileParams& params, BOOL path_open,F32 detail, S32 split,
 						 BOOL is_sculpted, S32 sculpt_size)
 { // this is basically LLProfile::generate stripped down to only operations that influence the number of points
-	LLMemType m1(LLMemType::MTYPE_VOLUME);
-	
 	if (detail < MIN_LOD)
 	{
 		detail = MIN_LOD;
@@ -842,8 +832,6 @@ S32 LLProfile::getNumPoints(const LLProfileParams& params, BOOL path_open,F32 de
 BOOL LLProfile::generate(const LLProfileParams& params, BOOL path_open,F32 detail, S32 split,
 						 BOOL is_sculpted, S32 sculpt_size)
 {
-	LLMemType m1(LLMemType::MTYPE_VOLUME);
-	
 	if ((!mDirty) && (!is_sculpted))
 	{
 		return FALSE;
@@ -1116,8 +1104,6 @@ BOOL LLProfile::generate(const LLProfileParams& params, BOOL path_open,F32 detai
 
 BOOL LLProfileParams::importFile(LLFILE *fp)
 {
-	LLMemType m1(LLMemType::MTYPE_VOLUME);
-	
 	const S32 BUFSIZE = 16384;
 	char buffer[BUFSIZE];	/* Flawfinder: ignore */
 	// *NOTE: changing the size or type of these buffers will require
@@ -1193,8 +1179,6 @@ BOOL LLProfileParams::exportFile(LLFILE *fp) const
 
 BOOL LLProfileParams::importLegacyStream(std::istream& input_stream)
 {
-	LLMemType m1(LLMemType::MTYPE_VOLUME);
-	
 	const S32 BUFSIZE = 16384;
 	char buffer[BUFSIZE];	/* Flawfinder: ignore */
 	// *NOTE: changing the size or type of these buffers will require
@@ -1286,7 +1270,6 @@ bool LLProfileParams::fromLLSD(LLSD& sd)
 
 void LLProfileParams::copyParams(const LLProfileParams &params)
 {
-	LLMemType m1(LLMemType::MTYPE_VOLUME);
 	setCurveType(params.getCurveType());
 	setBegin(params.getBegin());
 	setEnd(params.getEnd());
@@ -1503,8 +1486,6 @@ const LLVector2 LLPathParams::getEndScale() const
 
 S32 LLPath::getNumPoints(const LLPathParams& params, F32 detail)
 { // this is basically LLPath::generate stripped down to only the operations that influence the number of points
-	LLMemType m1(LLMemType::MTYPE_VOLUME);
-	
 	if (detail < MIN_LOD)
 	{
 		detail = MIN_LOD;
@@ -1554,8 +1535,6 @@ S32 LLPath::getNumPoints(const LLPathParams& params, F32 detail)
 BOOL LLPath::generate(const LLPathParams& params, F32 detail, S32 split,
 					  BOOL is_sculpted, S32 sculpt_size)
 {
-	LLMemType m1(LLMemType::MTYPE_VOLUME);
-	
 	if ((!mDirty) && (!is_sculpted))
 	{
 		return FALSE;
@@ -1683,8 +1662,6 @@ BOOL LLPath::generate(const LLPathParams& params, F32 detail, S32 split,
 BOOL LLDynamicPath::generate(const LLPathParams& params, F32 detail, S32 split,
 							 BOOL is_sculpted, S32 sculpt_size)
 {
-	LLMemType m1(LLMemType::MTYPE_VOLUME);
-	
 	mOpen = TRUE; // Draw end caps
 	if (getPathLength() == 0)
 	{
@@ -1706,8 +1683,6 @@ BOOL LLDynamicPath::generate(const LLPathParams& params, F32 detail, S32 split,
 
 BOOL LLPathParams::importFile(LLFILE *fp)
 {
-	LLMemType m1(LLMemType::MTYPE_VOLUME);
-	
 	const S32 BUFSIZE = 16384;
 	char buffer[BUFSIZE];	/* Flawfinder: ignore */
 	// *NOTE: changing the size or type of these buffers will require
@@ -1852,8 +1827,6 @@ BOOL LLPathParams::exportFile(LLFILE *fp) const
 
 BOOL LLPathParams::importLegacyStream(std::istream& input_stream)
 {
-	LLMemType m1(LLMemType::MTYPE_VOLUME);
-	
 	const S32 BUFSIZE = 16384;
 	char buffer[BUFSIZE];	/* Flawfinder: ignore */
 	// *NOTE: changing the size or type of these buffers will require
@@ -2061,8 +2034,6 @@ S32 LLVolume::sNumMeshPoints = 0;
 LLVolume::LLVolume(const LLVolumeParams &params, const F32 detail, const BOOL generate_single_face, const BOOL is_unique)
 	: mParams(params)
 {
-	LLMemType m1(LLMemType::MTYPE_VOLUME);
-	
 	mUnique = is_unique;
 	mFaceMask = 0x0;
 	mDetail = detail;
@@ -2134,7 +2105,6 @@ LLVolume::~LLVolume()
 
 BOOL LLVolume::generate()
 {
-	LLMemType m1(LLMemType::MTYPE_VOLUME);
 	llassert_always(mProfilep);
 	
 	//Added 10.03.05 Dave Parks
@@ -2730,8 +2700,6 @@ S32	LLVolume::getNumFaces() const
 
 void LLVolume::createVolumeFaces()
 {
-	LLMemType m1(LLMemType::MTYPE_VOLUME);
-
 	if (mGenerateSingleFace)
 	{
 		// do nothing
@@ -2903,8 +2871,6 @@ F32 LLVolume::sculptGetSurfaceArea()
 // create placeholder shape
 void LLVolume::sculptGeneratePlaceholder()
 {
-	LLMemType m1(LLMemType::MTYPE_VOLUME);
-	
 	S32 sizeS = mPathp->mPath.size();
 	S32 sizeT = mProfilep->mProfile.size();
 	
@@ -2941,9 +2907,6 @@ void LLVolume::sculptGenerateMapVertices(U16 sculpt_width, U16 sculpt_height, S8
 	BOOL sculpt_mirror = sculpt_type & LL_SCULPT_FLAG_MIRROR;
 	BOOL reverse_horizontal = (sculpt_invert ? !sculpt_mirror : sculpt_mirror);  // XOR
 	
-	
-	LLMemType m1(LLMemType::MTYPE_VOLUME);
-	
 	S32 sizeS = mPathp->mPath.size();
 	S32 sizeT = mProfilep->mProfile.size();
 	
@@ -3092,7 +3055,6 @@ void sculpt_calc_mesh_resolution(U16 width, U16 height, U8 type, F32 detail, S32
 // sculpt replaces generate() for sculpted surfaces
 void LLVolume::sculpt(U16 sculpt_width, U16 sculpt_height, S8 sculpt_components, const U8* sculpt_data, S32 sculpt_level)
 {
-	LLMemType m1(LLMemType::MTYPE_VOLUME);
     U8 sculpt_type = mParams.getSculptType();
 
 	BOOL data_is_empty = FALSE;
@@ -3229,7 +3191,6 @@ bool LLVolumeParams::operator<(const LLVolumeParams &params) const
 
 void LLVolumeParams::copyParams(const LLVolumeParams &params)
 {
-	LLMemType m1(LLMemType::MTYPE_VOLUME);
 	mProfileParams.copyParams(params.mProfileParams);
 	mPathParams.copyParams(params.mPathParams);
 	mSculptID = params.getSculptID();
@@ -3601,8 +3562,6 @@ bool LLVolumeParams::validate(U8 prof_curve, F32 prof_begin, F32 prof_end, F32 h
 
 S32 *LLVolume::getTriangleIndices(U32 &num_indices) const
 {
-	LLMemType m1(LLMemType::MTYPE_VOLUME);
-	
 	S32 expected_num_triangle_indices = getNumTriangleIndices();
 	if (expected_num_triangle_indices > MAX_VOLUME_TRIANGLE_INDICES)
 	{
@@ -4330,8 +4289,6 @@ void LLVolume::generateSilhouetteVertices(std::vector<LLVector3> &vertices,
 										  const LLMatrix3& norm_mat_in,
 										  S32 face_mask)
 {
-	LLMemType m1(LLMemType::MTYPE_VOLUME);
-
 	LLMatrix4a mat;
 	mat.loadu(mat_in);
 
@@ -4793,241 +4750,8 @@ BOOL equalTriangle(const S32 *a, const S32 *b)
 	return FALSE;
 }
 
-BOOL LLVolume::cleanupTriangleData( const S32 num_input_vertices,
-									const std::vector<Point>& input_vertices,
-									const S32 num_input_triangles,
-									S32 *input_triangles,
-									S32 &num_output_vertices,
-									LLVector3 **output_vertices,
-									S32 &num_output_triangles,
-									S32 **output_triangles)
-{
-	LLMemType m1(LLMemType::MTYPE_VOLUME);
-	
-	/* Testing: avoid any cleanup
-	static BOOL skip_cleanup = TRUE;
-	if ( skip_cleanup )
-	{
-		num_output_vertices = num_input_vertices;
-		num_output_triangles = num_input_triangles;
-
-		*output_vertices = new LLVector3[num_input_vertices];
-		for (S32 index = 0; index < num_input_vertices; index++)
-		{
-			(*output_vertices)[index] = input_vertices[index].mPos;
-		}
-
-		*output_triangles = new S32[num_input_triangles*3];
-		memcpy(*output_triangles, input_triangles, 3*num_input_triangles*sizeof(S32));		// Flawfinder: ignore
-		return TRUE;
-	}
-	*/
-
-	// Here's how we do this:
-	// Create a structure which contains the original vertex index and the
-	// LLVector3 data.
-	// "Sort" the data by the vectors
-	// Create an array the size of the old vertex list, with a mapping of
-	// old indices to new indices.
-	// Go through triangles, shift so the lowest index is first
-	// Sort triangles by first index
-	// Remove duplicate triangles
-	// Allocate and pack new triangle data.
-
-	//LLTimer cleanupTimer;
-	//llinfos << "In vertices: " << num_input_vertices << llendl;
-	//llinfos << "In triangles: " << num_input_triangles << llendl;
-
-	S32 i;
-	typedef std::multiset<LLVertexIndexPair*, lessVertex> vertex_set_t;
-	vertex_set_t vertex_list;
-
-	LLVertexIndexPair *pairp = NULL;
-	for (i = 0; i < num_input_vertices; i++)
-	{
-		LLVertexIndexPair *new_pairp = new LLVertexIndexPair(input_vertices[i].mPos, i);
-		vertex_list.insert(new_pairp);
-	}
-
-	// Generate the vertex mapping and the list of vertices without
-	// duplicates.  This will crash if there are no vertices.
-	llassert(num_input_vertices > 0); // check for no vertices!
-	S32 *vertex_mapping = new S32[num_input_vertices];
-	LLVector3 *new_vertices = new LLVector3[num_input_vertices];
-	LLVertexIndexPair *prev_pairp = NULL;
-
-	S32 new_num_vertices;
-
-	new_num_vertices = 0;
-	for (vertex_set_t::iterator iter = vertex_list.begin(),
-			 end = vertex_list.end();
-		 iter != end; iter++)
-	{
-		pairp = *iter;
-		if (!prev_pairp || ((pairp->mVertex - prev_pairp->mVertex).magVecSquared() >= VERTEX_SLOP_SQRD))	
-		{
-			new_vertices[new_num_vertices] = pairp->mVertex;
-			//llinfos << "Added vertex " << new_num_vertices << " : " << pairp->mVertex << llendl;
-			new_num_vertices++;
-			// Update the previous
-			prev_pairp = pairp;
-		}
-		else
-		{
-			//llinfos << "Removed duplicate vertex " << pairp->mVertex << ", distance magVecSquared() is " << (pairp->mVertex - prev_pairp->mVertex).magVecSquared() << llendl;
-		}
-		vertex_mapping[pairp->mIndex] = new_num_vertices - 1;
-	}
-
-	// Iterate through triangles and remove degenerates, re-ordering vertices
-	// along the way.
-	S32 *new_triangles = new S32[num_input_triangles * 3];
-	S32 new_num_triangles = 0;
-
-	for (i = 0; i < num_input_triangles; i++)
-	{
-		S32 v1 = i*3;
-		S32 v2 = v1 + 1;
-		S32 v3 = v1 + 2;
-
-		//llinfos << "Checking triangle " << input_triangles[v1] << ":" << input_triangles[v2] << ":" << input_triangles[v3] << llendl;
-		input_triangles[v1] = vertex_mapping[input_triangles[v1]];
-		input_triangles[v2] = vertex_mapping[input_triangles[v2]];
-		input_triangles[v3] = vertex_mapping[input_triangles[v3]];
-
-		if ((input_triangles[v1] == input_triangles[v2])
-			|| (input_triangles[v1] == input_triangles[v3])
-			|| (input_triangles[v2] == input_triangles[v3]))
-		{
-			//llinfos << "Removing degenerate triangle " << input_triangles[v1] << ":" << input_triangles[v2] << ":" << input_triangles[v3] << llendl;
-			// Degenerate triangle, skip
-			continue;
-		}
-
-		if (input_triangles[v1] < input_triangles[v2])
-		{
-			if (input_triangles[v1] < input_triangles[v3])
-			{
-				// (0 < 1) && (0 < 2)
-				new_triangles[new_num_triangles*3] = input_triangles[v1];
-				new_triangles[new_num_triangles*3+1] = input_triangles[v2];
-				new_triangles[new_num_triangles*3+2] = input_triangles[v3];
-			}
-			else
-			{
-				// (0 < 1) && (2 < 0)
-				new_triangles[new_num_triangles*3] = input_triangles[v3];
-				new_triangles[new_num_triangles*3+1] = input_triangles[v1];
-				new_triangles[new_num_triangles*3+2] = input_triangles[v2];
-			}
-		}
-		else if (input_triangles[v2] < input_triangles[v3])
-		{
-			// (1 < 0) && (1 < 2)
-			new_triangles[new_num_triangles*3] = input_triangles[v2];
-			new_triangles[new_num_triangles*3+1] = input_triangles[v3];
-			new_triangles[new_num_triangles*3+2] = input_triangles[v1];
-		}
-		else
-		{
-			// (1 < 0) && (2 < 1)
-			new_triangles[new_num_triangles*3] = input_triangles[v3];
-			new_triangles[new_num_triangles*3+1] = input_triangles[v1];
-			new_triangles[new_num_triangles*3+2] = input_triangles[v2];
-		}
-		new_num_triangles++;
-	}
-
-	if (new_num_triangles == 0)
-	{
-		llwarns << "Created volume object with 0 faces." << llendl;
-		delete[] new_triangles;
-		delete[] vertex_mapping;
-		delete[] new_vertices;
-		return FALSE;
-	}
-
-	typedef std::set<S32*, lessTriangle> triangle_set_t;
-	triangle_set_t triangle_list;
-
-	for (i = 0; i < new_num_triangles; i++)
-	{
-		triangle_list.insert(&new_triangles[i*3]);
-	}
-
-	// Sort through the triangle list, and delete duplicates
-
-	S32 *prevp = NULL;
-	S32 *curp = NULL;
-
-	S32 *sorted_tris = new S32[new_num_triangles*3];
-	S32 cur_tri = 0;
-	for (triangle_set_t::iterator iter = triangle_list.begin(),
-			 end = triangle_list.end();
-		 iter != end; iter++)
-	{
-		curp = *iter;
-		if (!prevp || !equalTriangle(prevp, curp))
-		{
-			//llinfos << "Added triangle " << *curp << ":" << *(curp+1) << ":" << *(curp+2) << llendl;
-			sorted_tris[cur_tri*3] = *curp;
-			sorted_tris[cur_tri*3+1] = *(curp+1);
-			sorted_tris[cur_tri*3+2] = *(curp+2);
-			cur_tri++;
-			prevp = curp;
-		}
-		else
-		{
-			//llinfos << "Skipped triangle " << *curp << ":" << *(curp+1) << ":" << *(curp+2) << llendl;
-		}
-	}
-
-	*output_vertices = new LLVector3[new_num_vertices];
-	num_output_vertices = new_num_vertices;
-	for (i = 0; i < new_num_vertices; i++)
-	{
-		(*output_vertices)[i] = new_vertices[i];
-	}
-
-	*output_triangles = new S32[cur_tri*3];
-	num_output_triangles = cur_tri;
-	memcpy(*output_triangles, sorted_tris, 3*cur_tri*sizeof(S32));		/* Flawfinder: ignore */
-
-	/*
-	llinfos << "Out vertices: " << num_output_vertices << llendl;
-	llinfos << "Out triangles: " << num_output_triangles << llendl;
-	for (i = 0; i < num_output_vertices; i++)
-	{
-		llinfos << i << ":" << (*output_vertices)[i] << llendl;
-	}
-	for (i = 0; i < num_output_triangles; i++)
-	{
-		llinfos << i << ":" << (*output_triangles)[i*3] << ":" << (*output_triangles)[i*3+1] << ":" << (*output_triangles)[i*3+2] << llendl;
-	}
-	*/
-
-	//llinfos << "Out vertices: " << num_output_vertices << llendl;
-	//llinfos << "Out triangles: " << num_output_triangles << llendl;
-	delete[] vertex_mapping;
-	vertex_mapping = NULL;
-	delete[] new_vertices;
-	new_vertices = NULL;
-	delete[] new_triangles;
-	new_triangles = NULL;
-	delete[] sorted_tris;
-	sorted_tris = NULL;
-	triangle_list.clear();
-	std::for_each(vertex_list.begin(), vertex_list.end(), DeletePointer());
-	vertex_list.clear();
-	
-	return TRUE;
-}
-
-
 BOOL LLVolumeParams::importFile(LLFILE *fp)
 {
-	LLMemType m1(LLMemType::MTYPE_VOLUME);
-	
 	//llinfos << "importing volume" << llendl;
 	const S32 BUFSIZE = 16384;
 	char buffer[BUFSIZE];	/* Flawfinder: ignore */
@@ -5082,8 +4806,6 @@ BOOL LLVolumeParams::exportFile(LLFILE *fp) const
 
 BOOL LLVolumeParams::importLegacyStream(std::istream& input_stream)
 {
-	LLMemType m1(LLMemType::MTYPE_VOLUME);
-	
 	//llinfos << "importing volume" << llendl;
 	const S32 BUFSIZE = 16384;
 	// *NOTE: changing the size or type of this buffer will require
@@ -5123,8 +4845,6 @@ BOOL LLVolumeParams::importLegacyStream(std::istream& input_stream)
 
 BOOL LLVolumeParams::exportLegacyStream(std::ostream& output_stream) const
 {
-	LLMemType m1(LLMemType::MTYPE_VOLUME);
-	
 	output_stream <<"\tshape 0\n";
 	output_stream <<"\t{\n";
 	mPathParams.exportLegacyStream(output_stream);
@@ -6340,8 +6060,6 @@ void	LerpPlanarVertex(LLVolumeFace::VertexData& v0,
 
 BOOL LLVolumeFace::createUnCutCubeCap(LLVolume* volume, BOOL partial_build)
 {
-	LLMemType m1(LLMemType::MTYPE_VOLUME);
-	
 	const std::vector<LLVolume::Point>& mesh = volume->getMesh();
 	const std::vector<LLVector3>& profile = volume->getProfile().mProfile;
 	S32 max_s = volume->getProfile().getTotal();
@@ -6492,8 +6210,6 @@ BOOL LLVolumeFace::createUnCutCubeCap(LLVolume* volume, BOOL partial_build)
 
 BOOL LLVolumeFace::createCap(LLVolume* volume, BOOL partial_build)
 {
-	LLMemType m1(LLMemType::MTYPE_VOLUME);
-	
 	if (!(mTypeMask & HOLLOW_MASK) && 
 		!(mTypeMask & OPEN_MASK) && 
 		((volume->getParams().getPathParams().getBegin()==0.0f)&&
@@ -6880,8 +6596,6 @@ BOOL LLVolumeFace::createCap(LLVolume* volume, BOOL partial_build)
 
 void LLVolumeFace::createBinormals()
 {
-	LLMemType m1(LLMemType::MTYPE_VOLUME);
-	
 	if (!mBinormals)
 	{
 		allocateBinormals(mNumVertices);
@@ -7152,8 +6866,6 @@ void LLVolumeFace::appendFace(const LLVolumeFace& face, LLMatrix4& mat_in, LLMat
 
 BOOL LLVolumeFace::createSide(LLVolume* volume, BOOL partial_build)
 {
-	LLMemType m1(LLMemType::MTYPE_VOLUME);
-	
 	BOOL flat = mTypeMask & FLAT_MASK;
 
 	U8 sculpt_type = volume->getParams().getSculptType();
diff --git a/indra/llmath/llvolume.h b/indra/llmath/llvolume.h
index 2e6f9e2f719e4745e03bf7b73e8fb4075b6f2bd5..c845556557bf54ce19fba3737271b003190b6e68 100644
--- a/indra/llmath/llvolume.h
+++ b/indra/llmath/llvolume.h
@@ -1023,17 +1023,6 @@ class LLVolume : public LLRefCount
 								   LLVector3* normal = NULL,
 								   LLVector3* bi_normal = NULL);
 	
-	// The following cleans up vertices and triangles,
-	// getting rid of degenerate triangles and duplicate vertices,
-	// and allocates new arrays with the clean data.
-	static BOOL cleanupTriangleData( const S32 num_input_vertices,
-								const std::vector<Point> &input_vertices,
-								const S32 num_input_triangles,
-								S32 *input_triangles,
-								S32 &num_output_vertices,
-								LLVector3 **output_vertices,
-								S32 &num_output_triangles,
-								S32 **output_triangles);
 	LLFaceID generateFaceMask();
 
 	BOOL isFaceMaskValid(LLFaceID face_mask);
diff --git a/indra/llmath/llvolumemgr.cpp b/indra/llmath/llvolumemgr.cpp
index c60b75008837f770c63c324e57f917f5f6e97153..9083273ee547a5c5fe713598a953ac16c15068b6 100644
--- a/indra/llmath/llvolumemgr.cpp
+++ b/indra/llmath/llvolumemgr.cpp
@@ -26,7 +26,6 @@
 #include "linden_common.h"
 
 #include "llvolumemgr.h"
-#include "llmemtype.h"
 #include "llvolume.h"
 
 
@@ -182,7 +181,6 @@ void LLVolumeMgr::insertGroup(LLVolumeLODGroup* volgroup)
 // protected
 LLVolumeLODGroup* LLVolumeMgr::createNewGroup(const LLVolumeParams& volume_params)
 {
-	LLMemType m1(LLMemType::MTYPE_VOLUME);
 	LLVolumeLODGroup* volgroup = new LLVolumeLODGroup(volume_params);
 	insertGroup(volgroup);
 	return volgroup;
@@ -297,7 +295,6 @@ LLVolume* LLVolumeLODGroup::refLOD(const S32 detail)
 	mRefs++;
 	if (mVolumeLODs[detail].isNull())
 	{
-		LLMemType m1(LLMemType::MTYPE_VOLUME);
 		mVolumeLODs[detail] = new LLVolume(mVolumeParams, mDetailScales[detail]);
 	}
 	mLODRefs[detail]++;
diff --git a/indra/llmessage/llbuffer.cpp b/indra/llmessage/llbuffer.cpp
index 250cace6e96825881a16fe34b94efafc5bb689e8..01da20f06029efc12e828a201f45e48827528ab7 100644
--- a/indra/llmessage/llbuffer.cpp
+++ b/indra/llmessage/llbuffer.cpp
@@ -30,7 +30,6 @@
 #include "llbuffer.h"
 
 #include "llmath.h"
-#include "llmemtype.h"
 #include "llstl.h"
 #include "llthread.h"
 
@@ -44,7 +43,6 @@ LLSegment::LLSegment() :
 	mData(NULL),
 	mSize(0)
 {
-	LLMemType m1(LLMemType::MTYPE_IO_BUFFER);
 }
 
 LLSegment::LLSegment(S32 channel, U8* data, S32 data_len) :
@@ -52,12 +50,10 @@ LLSegment::LLSegment(S32 channel, U8* data, S32 data_len) :
 	mData(data),
 	mSize(data_len)
 {
-	LLMemType m1(LLMemType::MTYPE_IO_BUFFER);
 }
 
 LLSegment::~LLSegment()
 {
-	LLMemType m1(LLMemType::MTYPE_IO_BUFFER);
 }
 
 bool LLSegment::isOnChannel(S32 channel) const
@@ -104,7 +100,6 @@ LLHeapBuffer::LLHeapBuffer() :
 	mNextFree(NULL),
 	mReclaimedBytes(0)
 {
-	LLMemType m1(LLMemType::MTYPE_IO_BUFFER);
 	const S32 DEFAULT_HEAP_BUFFER_SIZE = 16384;
 	allocate(DEFAULT_HEAP_BUFFER_SIZE);
 }
@@ -115,7 +110,6 @@ LLHeapBuffer::LLHeapBuffer(S32 size) :
 	mNextFree(NULL),
 	mReclaimedBytes(0)
 {
-	LLMemType m1(LLMemType::MTYPE_IO_BUFFER);
 	allocate(size);
 }
 
@@ -125,7 +119,6 @@ LLHeapBuffer::LLHeapBuffer(const U8* src, S32 len) :
 	mNextFree(NULL),
 	mReclaimedBytes(0)
 {
-	LLMemType m1(LLMemType::MTYPE_IO_BUFFER);
 	if((len > 0) && src)
 	{
 		allocate(len);
@@ -139,7 +132,6 @@ LLHeapBuffer::LLHeapBuffer(const U8* src, S32 len) :
 // virtual
 LLHeapBuffer::~LLHeapBuffer()
 {
-	LLMemType m1(LLMemType::MTYPE_IO_BUFFER);
 	delete[] mBuffer;
 	mBuffer = NULL;
 	mSize = 0;
@@ -157,7 +149,6 @@ bool LLHeapBuffer::createSegment(
 	S32 size,
 	LLSegment& segment)
 {
-	LLMemType m1(LLMemType::MTYPE_IO_BUFFER);
 	// get actual size of the segment.
 	S32 actual_size = llmin(size, (mSize - S32(mNextFree - mBuffer)));
 
@@ -212,7 +203,6 @@ bool LLHeapBuffer::containsSegment(const LLSegment& segment) const
 
 void LLHeapBuffer::allocate(S32 size)
 {
-	LLMemType m1(LLMemType::MTYPE_IO_BUFFER);
 	mReclaimedBytes = 0;	
 	mBuffer = new U8[size];
 	if(mBuffer)
@@ -230,12 +220,10 @@ LLBufferArray::LLBufferArray() :
 	mNextBaseChannel(0),
 	mMutexp(NULL)
 {
-	LLMemType m1(LLMemType::MTYPE_IO_BUFFER);
 }
 
 LLBufferArray::~LLBufferArray()
 {
-	LLMemType m1(LLMemType::MTYPE_IO_BUFFER);
 	std::for_each(mBuffers.begin(), mBuffers.end(), DeletePointer());
 
 	delete mMutexp;
@@ -314,7 +302,6 @@ bool LLBufferArray::append(S32 channel, const U8* src, S32 len)
 {
 	LLMutexLock lock(mMutexp) ;
 
-	LLMemType m1(LLMemType::MTYPE_IO_BUFFER);
 	std::vector<LLSegment> segments;
 	if(copyIntoBuffers(channel, src, len, segments))
 	{
@@ -329,7 +316,6 @@ bool LLBufferArray::prepend(S32 channel, const U8* src, S32 len)
 {
 	ASSERT_LLBUFFERARRAY_MUTEX_LOCKED
 
-	LLMemType m1(LLMemType::MTYPE_IO_BUFFER);
 	std::vector<LLSegment> segments;
 	if(copyIntoBuffers(channel, src, len, segments))
 	{
@@ -345,7 +331,6 @@ bool LLBufferArray::insertAfter(
 	const U8* src,
 	S32 len)
 {
-	LLMemType m1(LLMemType::MTYPE_IO_BUFFER);
 	std::vector<LLSegment> segments;
 
 	LLMutexLock lock(mMutexp) ;
@@ -366,7 +351,6 @@ LLBufferArray::segment_iterator_t LLBufferArray::splitAfter(U8* address)
 {
 	ASSERT_LLBUFFERARRAY_MUTEX_LOCKED
 
-	LLMemType m1(LLMemType::MTYPE_IO_BUFFER);
 	segment_iterator_t end = mSegments.end();
 	segment_iterator_t it = getSegment(address);
 	if(it == end)
@@ -414,7 +398,6 @@ LLBufferArray::segment_iterator_t LLBufferArray::constructSegmentAfter(
 	LLSegment& segment)
 {
 	ASSERT_LLBUFFERARRAY_MUTEX_LOCKED
-	LLMemType m1(LLMemType::MTYPE_IO_BUFFER);
 	segment_iterator_t rv = mSegments.begin();
 	segment_iterator_t end = mSegments.end();
 	if(!address)
@@ -578,7 +561,6 @@ U8* LLBufferArray::readAfter(
 	U8* dest,
 	S32& len) const
 {
-	LLMemType m1(LLMemType::MTYPE_IO_BUFFER);
 	U8* rv = start;
 	if(!dest || len <= 0)
 	{
@@ -642,7 +624,6 @@ U8* LLBufferArray::seek(
 	S32 delta) const
 {
 	ASSERT_LLBUFFERARRAY_MUTEX_LOCKED
-	LLMemType m1(LLMemType::MTYPE_IO_BUFFER);
 	const_segment_iterator_t it;
 	const_segment_iterator_t end = mSegments.end();
 	U8* rv = start;
@@ -786,8 +767,6 @@ U8* LLBufferArray::seek(
 //test use only
 bool LLBufferArray::takeContents(LLBufferArray& source)
 {
-	LLMemType m1(LLMemType::MTYPE_IO_BUFFER);
-
 	LLMutexLock lock(mMutexp);
 	source.lock();
 
@@ -813,7 +792,6 @@ LLBufferArray::segment_iterator_t LLBufferArray::makeSegment(
 	S32 len)
 {
 	ASSERT_LLBUFFERARRAY_MUTEX_LOCKED
-	LLMemType m1(LLMemType::MTYPE_IO_BUFFER);
 	// start at the end of the buffers, because it is the most likely
 	// to have free space.
 	LLSegment segment;
@@ -852,7 +830,6 @@ LLBufferArray::segment_iterator_t LLBufferArray::makeSegment(
 bool LLBufferArray::eraseSegment(const segment_iterator_t& erase_iter)
 {
 	ASSERT_LLBUFFERARRAY_MUTEX_LOCKED
-	LLMemType m1(LLMemType::MTYPE_IO_BUFFER);
 
 	// Find out which buffer contains the segment, and if it is found,
 	// ask it to reclaim the memory.
@@ -885,7 +862,6 @@ bool LLBufferArray::copyIntoBuffers(
 	std::vector<LLSegment>& segments)
 {
 	ASSERT_LLBUFFERARRAY_MUTEX_LOCKED
-	LLMemType m1(LLMemType::MTYPE_IO_BUFFER);
 	if(!src || !len) return false;
 	S32 copied = 0;
 	LLSegment segment;
diff --git a/indra/llmessage/llbufferstream.cpp b/indra/llmessage/llbufferstream.cpp
index 8d8ad05ad5c61d483626d2c88f67e3d1bc968f88..a51a48edc3cca4f155bab0c23c0cf453d3260ff9 100644
--- a/indra/llmessage/llbufferstream.cpp
+++ b/indra/llmessage/llbufferstream.cpp
@@ -30,7 +30,6 @@
 #include "llbufferstream.h"
 
 #include "llbuffer.h"
-#include "llmemtype.h"
 #include "llthread.h"
 
 static const S32 DEFAULT_OUTPUT_SEGMENT_SIZE = 1024 * 4;
@@ -44,19 +43,16 @@ LLBufferStreamBuf::LLBufferStreamBuf(
 	mChannels(channels),
 	mBuffer(buffer)
 {
-	LLMemType m1(LLMemType::MTYPE_IO_BUFFER);
 }
 
 LLBufferStreamBuf::~LLBufferStreamBuf()
 {
-	LLMemType m1(LLMemType::MTYPE_IO_BUFFER);
 	sync();
 }
 
 // virtual
 int LLBufferStreamBuf::underflow()
 {
-	LLMemType m1(LLMemType::MTYPE_IO_BUFFER);
 	//lldebugs << "LLBufferStreamBuf::underflow()" << llendl;
 	if(!mBuffer)
 	{
@@ -129,7 +125,6 @@ int LLBufferStreamBuf::underflow()
 // virtual
 int LLBufferStreamBuf::overflow(int c)
 {
-	LLMemType m1(LLMemType::MTYPE_IO_BUFFER);
 	if(!mBuffer)
 	{
 		return EOF;
@@ -169,7 +164,6 @@ int LLBufferStreamBuf::overflow(int c)
 // virtual
 int LLBufferStreamBuf::sync()
 {
-	LLMemType m1(LLMemType::MTYPE_IO_BUFFER);
 	int return_value = -1;
 	if(!mBuffer)
 	{
@@ -251,7 +245,6 @@ streampos LLBufferStreamBuf::seekoff(
 	std::ios::openmode which)
 #endif
 {
-	LLMemType m1(LLMemType::MTYPE_IO_BUFFER);
 	if(!mBuffer
 	   || ((way == std::ios::beg) && (off < 0))
 	   || ((way == std::ios::end) && (off > 0)))
@@ -343,10 +336,8 @@ LLBufferStream::LLBufferStream(
 	std::iostream(&mStreamBuf),
 	mStreamBuf(channels, buffer)
 {
-	LLMemType m1(LLMemType::MTYPE_IO_BUFFER);
 }
 
 LLBufferStream::~LLBufferStream()
 {
-	LLMemType m1(LLMemType::MTYPE_IO_BUFFER);
 }
diff --git a/indra/llmessage/llcachename.cpp b/indra/llmessage/llcachename.cpp
index 479efabb5f68836d31a658e35ab1e1874a4ed4f5..8f4af1984c7170beddab830091d7ed390f868ff8 100644
--- a/indra/llmessage/llcachename.cpp
+++ b/indra/llmessage/llcachename.cpp
@@ -36,7 +36,6 @@
 #include "llsdserialize.h"
 #include "lluuid.h"
 #include "message.h"
-#include "llmemtype.h"
 
 #include <boost/regex.hpp>
 
@@ -663,7 +662,6 @@ boost::signals2::connection LLCacheName::get(const LLUUID& id, bool is_group, ol
 
 void LLCacheName::processPending()
 {
-	LLMemType mt_pp(LLMemType::MTYPE_CACHE_PROCESS_PENDING);
 	const F32 SECS_BETWEEN_PROCESS = 0.1f;
 	if(!impl.mProcessTimer.checkExpirationAndReset(SECS_BETWEEN_PROCESS))
 	{
@@ -769,7 +767,6 @@ std::string LLCacheName::getDefaultLastName()
 
 void LLCacheName::Impl::processPendingAsks()
 {
-	LLMemType mt_ppa(LLMemType::MTYPE_CACHE_PROCESS_PENDING_ASKS);
 	sendRequest(_PREHASH_UUIDNameRequest, mAskNameQueue);
 	sendRequest(_PREHASH_UUIDGroupNameRequest, mAskGroupQueue);
 	mAskNameQueue.clear();
@@ -778,7 +775,6 @@ void LLCacheName::Impl::processPendingAsks()
 
 void LLCacheName::Impl::processPendingReplies()
 {
-	LLMemType mt_ppr(LLMemType::MTYPE_CACHE_PROCESS_PENDING_REPLIES);
 	// First call all the callbacks, because they might send messages.
 	for(ReplyQueue::iterator it = mReplyQueue.begin(); it != mReplyQueue.end(); ++it)
 	{
diff --git a/indra/llmessage/llcircuit.cpp b/indra/llmessage/llcircuit.cpp
index e0410906fb6d6ae974eaabba31902bd6058814d5..0c2d4b823d25e87a3530411edfe77b121562a692 100644
--- a/indra/llmessage/llcircuit.cpp
+++ b/indra/llmessage/llcircuit.cpp
@@ -679,7 +679,6 @@ void LLCircuitData::checkPacketInID(TPACKETID id, BOOL receive_resent)
 		setPacketInID((id + 1) % LL_MAX_OUT_PACKET_ID);
 
         mLastPacketGap = 0;
-        mOutOfOrderRate.count(0);
 		return;
 	}
 
@@ -775,7 +774,6 @@ void LLCircuitData::checkPacketInID(TPACKETID id, BOOL receive_resent)
 
 		}
 	}
-    mOutOfOrderRate.count(gap);
     mLastPacketGap = gap;
 }
 
diff --git a/indra/llmessage/llcircuit.h b/indra/llmessage/llcircuit.h
index d1c400c6a2491a278772f1c8559b0904650fa2db..430d6358f77673280e3a84cb8773dd165a666ba3 100644
--- a/indra/llmessage/llcircuit.h
+++ b/indra/llmessage/llcircuit.h
@@ -40,7 +40,6 @@
 #include "llpacketack.h"
 #include "lluuid.h"
 #include "llthrottle.h"
-#include "llstat.h"
 
 //
 // Constants
@@ -126,8 +125,6 @@ class LLCircuitData
 	S32			getUnackedPacketCount() const	{ return mUnackedPacketCount; }
 	S32			getUnackedPacketBytes() const	{ return mUnackedPacketBytes; }
 	F64         getNextPingSendTime() const { return mNextPingSendTime; }
-    F32         getOutOfOrderRate(LLStatAccum::TimeScale scale = LLStatAccum::SCALE_MINUTE) 
-                    { return mOutOfOrderRate.meanValue(scale); }
     U32         getLastPacketGap() const { return mLastPacketGap; }
     LLHost      getHost() const { return mHost; }
 	F64			getLastPacketInTime() const		{ return mLastPacketInTime;	}
@@ -275,7 +272,6 @@ class LLCircuitData
 	LLTimer	mExistenceTimer;	    // initialized when circuit created, used to track bandwidth numbers
 
 	S32		mCurrentResendCount;	// Number of resent packets since last spam
-    LLStatRate  mOutOfOrderRate;    // Rate of out of order packets coming in.
     U32     mLastPacketGap;         // Gap in sequence number of last packet.
 
 	const F32 mHeartbeatInterval;
diff --git a/indra/llmessage/lliohttpserver.cpp b/indra/llmessage/lliohttpserver.cpp
index 987f386aa38545959ad082c84990ad00291a5501..1236fc8b71c917c30a37bfdd7d9f3274241172d7 100644
--- a/indra/llmessage/lliohttpserver.cpp
+++ b/indra/llmessage/lliohttpserver.cpp
@@ -37,12 +37,10 @@
 #include "lliopipe.h"
 #include "lliosocket.h"
 #include "llioutil.h"
-#include "llmemtype.h"
 #include "llmemorystream.h"
 #include "llpumpio.h"
 #include "llsd.h"
 #include "llsdserialize_xml.h"
-#include "llstat.h"
 #include "llstl.h"
 #include "lltimer.h"
 
@@ -141,6 +139,11 @@ class LLHTTPPipe : public LLIOPipe
 };
 
 static LLFastTimer::DeclareTimer FTM_PROCESS_HTTP_PIPE("HTTP Pipe");
+static LLFastTimer::DeclareTimer FTM_PROCESS_HTTP_GET("HTTP Get");
+static LLFastTimer::DeclareTimer FTM_PROCESS_HTTP_PUT("HTTP Put");
+static LLFastTimer::DeclareTimer FTM_PROCESS_HTTP_POST("HTTP Post");
+static LLFastTimer::DeclareTimer FTM_PROCESS_HTTP_DELETE("HTTP Delete");
+
 LLIOPipe::EStatus LLHTTPPipe::process_impl(
 	const LLChannelDescriptors& channels,
     buffer_ptr_t& buffer,
@@ -177,12 +180,12 @@ LLIOPipe::EStatus LLHTTPPipe::process_impl(
 		std::string verb = context[CONTEXT_REQUEST][CONTEXT_VERB];
 		if(verb == HTTP_VERB_GET)
 		{
-            LLPerfBlock getblock("http_get");   
+			LLFastTimer _(FTM_PROCESS_HTTP_GET);
 			mNode.get(LLHTTPNode::ResponsePtr(mResponse), context);
 		}
 		else if(verb == HTTP_VERB_PUT)
 		{
-            LLPerfBlock putblock("http_put");
+			LLFastTimer _(FTM_PROCESS_HTTP_PUT);
 			LLSD input;
 			if (mNode.getContentType() == LLHTTPNode::CONTENT_TYPE_LLSD)
 			{
@@ -198,7 +201,7 @@ LLIOPipe::EStatus LLHTTPPipe::process_impl(
 		}
 		else if(verb == HTTP_VERB_POST)
 		{
-            LLPerfBlock postblock("http_post");
+			LLFastTimer _(FTM_PROCESS_HTTP_POST);
 			LLSD input;
 			if (mNode.getContentType() == LLHTTPNode::CONTENT_TYPE_LLSD)
 			{
@@ -214,7 +217,7 @@ LLIOPipe::EStatus LLHTTPPipe::process_impl(
 		}
 		else if(verb == HTTP_VERB_DELETE)
 		{
-            LLPerfBlock delblock("http_delete");
+			LLFastTimer _(FTM_PROCESS_HTTP_DELETE);
 			mNode.del(LLHTTPNode::ResponsePtr(mResponse), context);
 		}		
 		else if(verb == HTTP_VERB_OPTIONS)
@@ -443,7 +446,6 @@ LLIOPipe::EStatus LLHTTPResponseHeader::process_impl(
 {
 	LLFastTimer t(FTM_PROCESS_HTTP_HEADER);
 	PUMP_DEBUG;
-	LLMemType m1(LLMemType::MTYPE_IO_HTTP_SERVER);
 	if(eos)
 	{
 		PUMP_DEBUG;
@@ -587,13 +589,11 @@ LLHTTPResponder::LLHTTPResponder(const LLHTTPNode& tree, const LLSD& ctx) :
 	mContentLength(0),
 	mRootNode(tree)
 {
-	LLMemType m1(LLMemType::MTYPE_IO_HTTP_SERVER);
 }
 
 // virtual
 LLHTTPResponder::~LLHTTPResponder()
 {
-	LLMemType m1(LLMemType::MTYPE_IO_HTTP_SERVER);
 	//lldebugs << "destroying LLHTTPResponder" << llendl;
 }
 
@@ -603,7 +603,6 @@ bool LLHTTPResponder::readHeaderLine(
 	U8* dest,
 	S32& len)
 {
-	LLMemType m1(LLMemType::MTYPE_IO_HTTP_SERVER);
 	--len;
 	U8* last = buffer->readAfter(channels.in(), mLastRead, dest, len);
 	dest[len] = '\0';
@@ -628,7 +627,6 @@ void LLHTTPResponder::markBad(
 	const LLChannelDescriptors& channels,
 	buffer_ptr_t buffer)
 {
-	LLMemType m1(LLMemType::MTYPE_IO_HTTP_SERVER);
 	mState = STATE_SHORT_CIRCUIT;
 	LLBufferStream out(channels, buffer.get());
 	out << HTTP_VERSION_STR << " 400 Bad Request\r\n\r\n<html>\n"
@@ -648,7 +646,6 @@ LLIOPipe::EStatus LLHTTPResponder::process_impl(
 {
 	LLFastTimer t(FTM_PROCESS_HTTP_RESPONDER);
 	PUMP_DEBUG;
-	LLMemType m1(LLMemType::MTYPE_IO_HTTP_SERVER);
 	LLIOPipe::EStatus status = STATUS_OK;
 
 	// parsing headers
diff --git a/indra/llmessage/lliosocket.cpp b/indra/llmessage/lliosocket.cpp
index d5b4d4582107700ee7ab7cbe67933f47d35b30cf..0287026659a1b4406356a4cecfd5592a0e2e31b9 100644
--- a/indra/llmessage/lliosocket.cpp
+++ b/indra/llmessage/lliosocket.cpp
@@ -33,7 +33,6 @@
 
 #include "llbuffer.h"
 #include "llhost.h"
-#include "llmemtype.h"
 #include "llpumpio.h"
 
 //
@@ -100,7 +99,6 @@ void ll_debug_socket(const char* msg, apr_socket_t* apr_sock)
 // static
 LLSocket::ptr_t LLSocket::create(apr_pool_t* pool, EType type, U16 port)
 {
-	LLMemType m1(LLMemType::MTYPE_IO_TCP);
 	LLSocket::ptr_t rv;
 	apr_socket_t* socket = NULL;
 	apr_pool_t* new_pool = NULL;
@@ -198,7 +196,6 @@ LLSocket::ptr_t LLSocket::create(apr_pool_t* pool, EType type, U16 port)
 // static
 LLSocket::ptr_t LLSocket::create(apr_socket_t* socket, apr_pool_t* pool)
 {
-	LLMemType m1(LLMemType::MTYPE_IO_TCP);
 	LLSocket::ptr_t rv;
 	if(!socket)
 	{
@@ -240,12 +237,10 @@ LLSocket::LLSocket(apr_socket_t* socket, apr_pool_t* pool) :
 	mPort(PORT_INVALID)
 {
 	ll_debug_socket("Constructing wholely formed socket", mSocket);
-	LLMemType m1(LLMemType::MTYPE_IO_TCP);
 }
 
 LLSocket::~LLSocket()
 {
-	LLMemType m1(LLMemType::MTYPE_IO_TCP);
 	// *FIX: clean up memory we are holding.
 	if(mSocket)
 	{
@@ -265,7 +260,6 @@ LLSocket::~LLSocket()
 
 void LLSocket::setBlocking(S32 timeout)
 {
-	LLMemType m1(LLMemType::MTYPE_IO_TCP);
 	// set up the socket options
 	ll_apr_warn_status(apr_socket_timeout_set(mSocket, timeout));
 	ll_apr_warn_status(apr_socket_opt_set(mSocket, APR_SO_NONBLOCK, 0));
@@ -276,7 +270,6 @@ void LLSocket::setBlocking(S32 timeout)
 
 void LLSocket::setNonBlocking()
 {
-	LLMemType m1(LLMemType::MTYPE_IO_TCP);
 	// set up the socket options
 	ll_apr_warn_status(apr_socket_timeout_set(mSocket, 0));
 	ll_apr_warn_status(apr_socket_opt_set(mSocket, APR_SO_NONBLOCK, 1));
@@ -293,12 +286,10 @@ LLIOSocketReader::LLIOSocketReader(LLSocket::ptr_t socket) :
 	mSource(socket),
 	mInitialized(false)
 {
-	LLMemType m1(LLMemType::MTYPE_IO_TCP);
 }
 
 LLIOSocketReader::~LLIOSocketReader()
 {
-	LLMemType m1(LLMemType::MTYPE_IO_TCP);
 	//lldebugs << "Destroying LLIOSocketReader" << llendl;
 }
 
@@ -314,7 +305,6 @@ LLIOPipe::EStatus LLIOSocketReader::process_impl(
 {
 	LLFastTimer t(FTM_PROCESS_SOCKET_READER);
 	PUMP_DEBUG;
-	LLMemType m1(LLMemType::MTYPE_IO_TCP);
 	if(!mSource) return STATUS_PRECONDITION_NOT_MET;
 	if(!mInitialized)
 	{
@@ -396,12 +386,10 @@ LLIOSocketWriter::LLIOSocketWriter(LLSocket::ptr_t socket) :
 	mLastWritten(NULL),
 	mInitialized(false)
 {
-	LLMemType m1(LLMemType::MTYPE_IO_TCP);
 }
 
 LLIOSocketWriter::~LLIOSocketWriter()
 {
-	LLMemType m1(LLMemType::MTYPE_IO_TCP);
 	//lldebugs << "Destroying LLIOSocketWriter" << llendl;
 }
 
@@ -416,7 +404,6 @@ LLIOPipe::EStatus LLIOSocketWriter::process_impl(
 {
 	LLFastTimer t(FTM_PROCESS_SOCKET_WRITER);
 	PUMP_DEBUG;
-	LLMemType m1(LLMemType::MTYPE_IO_TCP);
 	if(!mDestination) return STATUS_PRECONDITION_NOT_MET;
 	if(!mInitialized)
 	{
@@ -550,12 +537,10 @@ LLIOServerSocket::LLIOServerSocket(
 	mInitialized(false),
 	mResponseTimeout(DEFAULT_CHAIN_EXPIRY_SECS)
 {
-	LLMemType m1(LLMemType::MTYPE_IO_TCP);
 }
 
 LLIOServerSocket::~LLIOServerSocket()
 {
-	LLMemType m1(LLMemType::MTYPE_IO_TCP);
 	//lldebugs << "Destroying LLIOServerSocket" << llendl;
 }
 
@@ -575,7 +560,6 @@ LLIOPipe::EStatus LLIOServerSocket::process_impl(
 {
 	LLFastTimer t(FTM_PROCESS_SERVER_SOCKET);
 	PUMP_DEBUG;
-	LLMemType m1(LLMemType::MTYPE_IO_TCP);
 	if(!pump)
 	{
 		llwarns << "Need a pump for server socket." << llendl;
diff --git a/indra/llmessage/llmessagetemplate.h b/indra/llmessage/llmessagetemplate.h
index 16d825d33b15dd1b464d9fd5502824a00f8586f0..ae8e0087c14d84c590d2f178ce7b8f2469bcc7e6 100644
--- a/indra/llmessage/llmessagetemplate.h
+++ b/indra/llmessage/llmessagetemplate.h
@@ -29,7 +29,6 @@
 
 #include "lldarray.h"
 #include "message.h" // TODO: babbage: Remove...
-#include "llstat.h"
 #include "llstl.h"
 
 class LLMsgVarData
@@ -263,6 +262,7 @@ enum EMsgDeprecation
 	MD_DEPRECATED
 };
 
+
 class LLMessageTemplate
 {
 public:
@@ -364,7 +364,6 @@ class LLMessageTemplate
 	{
 		if (mHandlerFunc)
 		{
-            LLPerfBlock msg_cb_time("msg_cb", mName);
 			mHandlerFunc(msgsystem, mUserData);
 			return TRUE;
 		}
diff --git a/indra/llmessage/llpumpio.cpp b/indra/llmessage/llpumpio.cpp
index f3ef4f26844f394c6964e02a3f3228d36f78c47c..0623e99f0aad069598e0c0e1439df0f81981e8ab 100644
--- a/indra/llmessage/llpumpio.cpp
+++ b/indra/llmessage/llpumpio.cpp
@@ -34,9 +34,7 @@
 #include "apr_poll.h"
 
 #include "llapr.h"
-#include "llmemtype.h"
 #include "llstl.h"
-#include "llstat.h"
 
 // These should not be enabled in production, but they can be
 // intensely useful during development for finding certain kinds of
@@ -153,7 +151,6 @@ struct ll_delete_apr_pollset_fd_client_data
 	typedef std::pair<LLIOPipe::ptr_t, apr_pollfd_t> pipe_conditional_t;
 	void operator()(const pipe_conditional_t& conditional)
 	{
-		LLMemType m1(LLMemType::MTYPE_IO_PUMP);
 		S32* client_id = (S32*)conditional.second.client_data;
 		delete client_id;
 	}
@@ -177,19 +174,16 @@ LLPumpIO::LLPumpIO(apr_pool_t* pool) :
 {
 	mCurrentChain = mRunningChains.end();
 
-	LLMemType m1(LLMemType::MTYPE_IO_PUMP);
 	initialize(pool);
 }
 
 LLPumpIO::~LLPumpIO()
 {
-	LLMemType m1(LLMemType::MTYPE_IO_PUMP);
 	cleanup();
 }
 
 bool LLPumpIO::prime(apr_pool_t* pool)
 {
-	LLMemType m1(LLMemType::MTYPE_IO_PUMP);
 	cleanup();
 	initialize(pool);
 	return ((pool == NULL) ? false : true);
@@ -197,7 +191,6 @@ bool LLPumpIO::prime(apr_pool_t* pool)
 
 bool LLPumpIO::addChain(const chain_t& chain, F32 timeout, bool has_curl_request)
 {
-	LLMemType m1(LLMemType::MTYPE_IO_PUMP);
 	if(chain.empty()) return false;
 
 #if LL_THREADS_APR
@@ -233,7 +226,6 @@ bool LLPumpIO::addChain(
 	LLSD context,
 	F32 timeout)
 {
-	LLMemType m1(LLMemType::MTYPE_IO_PUMP);
 
 	// remember that if the caller is providing a full link
 	// description, we need to have that description matched to a
@@ -311,7 +303,6 @@ static std::string events_2_string(apr_int16_t events)
 
 bool LLPumpIO::setConditional(LLIOPipe* pipe, const apr_pollfd_t* poll)
 {
-	LLMemType m1(LLMemType::MTYPE_IO_PUMP);
 	if(!pipe) return false;
 	ll_debug_poll_fd("Set conditional", poll);
 
@@ -423,7 +414,6 @@ bool LLPumpIO::sleepChain(F64 seconds)
 
 bool LLPumpIO::copyCurrentLinkInfo(links_t& links) const
 {
-	LLMemType m1(LLMemType::MTYPE_IO_PUMP);
 	if(mRunningChains.end() == mCurrentChain)
 	{
 		return false;
@@ -441,6 +431,7 @@ void LLPumpIO::pump()
 }
 
 static LLFastTimer::DeclareTimer FTM_PUMP_IO("Pump IO");
+static LLFastTimer::DeclareTimer FTM_PUMP_POLL("Pump Poll");
 
 LLPumpIO::current_chain_t LLPumpIO::removeRunningChain(LLPumpIO::current_chain_t& run_chain) 
 {
@@ -454,7 +445,6 @@ LLPumpIO::current_chain_t LLPumpIO::removeRunningChain(LLPumpIO::current_chain_t
 //timeout is in microseconds
 void LLPumpIO::pump(const S32& poll_timeout)
 {
-	LLMemType m1(LLMemType::MTYPE_IO_PUMP);
 	LLFastTimer t1(FTM_PUMP_IO);
 	//llinfos << "LLPumpIO::pump()" << llendl;
 
@@ -536,7 +526,7 @@ void LLPumpIO::pump(const S32& poll_timeout)
 		S32 count = 0;
 		S32 client_id = 0;
         {
-            LLPerfBlock polltime("pump_poll");
+			LLFastTimer _(FTM_PUMP_POLL);
             apr_pollset_poll(mPollset, poll_timeout, &count, &poll_fd);
         }
 		PUMP_DEBUG;
@@ -747,7 +737,6 @@ void LLPumpIO::pump(const S32& poll_timeout)
 
 bool LLPumpIO::respond(LLIOPipe* pipe)
 {
-	LLMemType m1(LLMemType::MTYPE_IO_PUMP);
 	if(NULL == pipe) return false;
 
 #if LL_THREADS_APR
@@ -766,7 +755,6 @@ bool LLPumpIO::respond(
 	LLIOPipe::buffer_ptr_t data,
 	LLSD context)
 {
-	LLMemType m1(LLMemType::MTYPE_IO_PUMP);
 	// if the caller is providing a full link description, we need to
 	// have that description matched to a particular buffer.
 	if(!data) return false;
@@ -789,7 +777,6 @@ static LLFastTimer::DeclareTimer FTM_PUMP_CALLBACK_CHAIN("Chain");
 
 void LLPumpIO::callback()
 {
-	LLMemType m1(LLMemType::MTYPE_IO_PUMP);
 	//llinfos << "LLPumpIO::callback()" << llendl;
 	if(true)
 	{
@@ -840,7 +827,6 @@ void LLPumpIO::control(LLPumpIO::EControl op)
 
 void LLPumpIO::initialize(apr_pool_t* pool)
 {
-	LLMemType m1(LLMemType::MTYPE_IO_PUMP);
 	if(!pool) return;
 #if LL_THREADS_APR
 	// SJB: Windows defaults to NESTED and OSX defaults to UNNESTED, so use UNNESTED explicitly.
@@ -852,7 +838,6 @@ void LLPumpIO::initialize(apr_pool_t* pool)
 
 void LLPumpIO::cleanup()
 {
-	LLMemType m1(LLMemType::MTYPE_IO_PUMP);
 #if LL_THREADS_APR
 	if(mChainsMutex) apr_thread_mutex_destroy(mChainsMutex);
 	if(mCallbackMutex) apr_thread_mutex_destroy(mCallbackMutex);
@@ -875,7 +860,6 @@ void LLPumpIO::cleanup()
 
 void LLPumpIO::rebuildPollset()
 {
-	LLMemType m1(LLMemType::MTYPE_IO_PUMP);
 //	lldebugs << "LLPumpIO::rebuildPollset()" << llendl;
 	if(mPollset)
 	{
@@ -928,7 +912,6 @@ void LLPumpIO::rebuildPollset()
 void LLPumpIO::processChain(LLChainInfo& chain)
 {
 	PUMP_DEBUG;
-	LLMemType m1(LLMemType::MTYPE_IO_PUMP);
 	LLIOPipe::EStatus status = LLIOPipe::STATUS_OK;
 	links_t::iterator it = chain.mHead;
 	links_t::iterator end = chain.mChainLinks.end();
@@ -1130,7 +1113,6 @@ bool LLPumpIO::handleChainError(
 	LLChainInfo& chain,
 	LLIOPipe::EStatus error)
 {
-	LLMemType m1(LLMemType::MTYPE_IO_PUMP);
 	links_t::reverse_iterator rit;
 	if(chain.mHead == chain.mChainLinks.end())
 	{
@@ -1194,13 +1176,11 @@ LLPumpIO::LLChainInfo::LLChainInfo() :
 	mEOS(false),
 	mHasCurlRequest(false)
 {
-	LLMemType m1(LLMemType::MTYPE_IO_PUMP);
 	mTimer.setTimerExpirySec(DEFAULT_CHAIN_EXPIRY_SECS);
 }
 
 void LLPumpIO::LLChainInfo::setTimeoutSeconds(F32 timeout)
 {
-	LLMemType m1(LLMemType::MTYPE_IO_PUMP);
 	if(timeout > 0.0f)
 	{
 		mTimer.start();
@@ -1215,7 +1195,6 @@ void LLPumpIO::LLChainInfo::setTimeoutSeconds(F32 timeout)
 
 void LLPumpIO::LLChainInfo::adjustTimeoutSeconds(F32 delta)
 {
-	LLMemType m1(LLMemType::MTYPE_IO_PUMP);
 	if(mTimer.getStarted())
 	{
 		F64 expiry = mTimer.expiresAt();
diff --git a/indra/llmessage/llsdrpcclient.cpp b/indra/llmessage/llsdrpcclient.cpp
index 91fd070f0744b6ac24252ee1563cdc3d06f0e545..fcda0e81a3d59de6eddc8e509cbe5296fff51516 100644
--- a/indra/llmessage/llsdrpcclient.cpp
+++ b/indra/llmessage/llsdrpcclient.cpp
@@ -31,7 +31,6 @@
 
 #include "llbufferstream.h"
 #include "llfiltersd2xmlrpc.h"
-#include "llmemtype.h"
 #include "llpumpio.h"
 #include "llsd.h"
 #include "llsdserialize.h"
@@ -50,18 +49,15 @@ LLSDRPCResponse::LLSDRPCResponse() :
 	mIsError(false),
 	mIsFault(false)
 {
-	LLMemType m1(LLMemType::MTYPE_IO_SD_CLIENT);
 }
 
 // virtual
 LLSDRPCResponse::~LLSDRPCResponse()
 {
-	LLMemType m1(LLMemType::MTYPE_IO_SD_CLIENT);
 }
 
 bool LLSDRPCResponse::extractResponse(const LLSD& sd)
 {
-	LLMemType m1(LLMemType::MTYPE_IO_SD_CLIENT);
 	bool rv = true;
 	if(sd.has(LLSDRPC_RESPONSE_NAME))
 	{
@@ -94,7 +90,6 @@ LLIOPipe::EStatus LLSDRPCResponse::process_impl(
 {
 	LLFastTimer t(FTM_SDRPC_RESPONSE);
 	PUMP_DEBUG;
-	LLMemType m1(LLMemType::MTYPE_IO_SD_CLIENT);
 	if(mIsError)
 	{
 		error(pump);
@@ -119,13 +114,11 @@ LLSDRPCClient::LLSDRPCClient() :
 	mState(STATE_NONE),
 	mQueue(EPBQ_PROCESS)
 {
-	LLMemType m1(LLMemType::MTYPE_IO_SD_CLIENT);
 }
 
 // virtual
 LLSDRPCClient::~LLSDRPCClient()
 {
-	LLMemType m1(LLMemType::MTYPE_IO_SD_CLIENT);
 }
 
 bool LLSDRPCClient::call(
@@ -135,7 +128,6 @@ bool LLSDRPCClient::call(
 	LLSDRPCResponse* response,
 	EPassBackQueue queue)
 {
-	LLMemType m1(LLMemType::MTYPE_IO_SD_CLIENT);
 	//llinfos << "RPC: " << uri << "." << method << "(" << *parameter << ")"
 	//		<< llendl;
 	if(method.empty() || !response)
@@ -162,7 +154,6 @@ bool LLSDRPCClient::call(
 	LLSDRPCResponse* response,
 	EPassBackQueue queue)
 {
-	LLMemType m1(LLMemType::MTYPE_IO_SD_CLIENT);
 	//llinfos << "RPC: " << uri << "." << method << "(" << parameter << ")"
 	//		<< llendl;
 	if(method.empty() || parameter.empty() || !response)
@@ -193,7 +184,6 @@ LLIOPipe::EStatus LLSDRPCClient::process_impl(
 {
 	LLFastTimer t(FTM_PROCESS_SDRPC_CLIENT);
 	PUMP_DEBUG;
-	LLMemType m1(LLMemType::MTYPE_IO_SD_CLIENT);
 	if((STATE_NONE == mState) || (!pump))
 	{
 		// You should have called the call() method already.
diff --git a/indra/llmessage/llsdrpcserver.cpp b/indra/llmessage/llsdrpcserver.cpp
index 9f776aca72a252220fbf4b9f659d376a88a18125..f26ee52f7187112a5c5eaa72951e11eb554ea82d 100644
--- a/indra/llmessage/llsdrpcserver.cpp
+++ b/indra/llmessage/llsdrpcserver.cpp
@@ -31,7 +31,6 @@
 
 #include "llbuffer.h"
 #include "llbufferstream.h"
-#include "llmemtype.h"
 #include "llpumpio.h"
 #include "llsdserialize.h"
 #include "llstl.h"
@@ -58,12 +57,10 @@ LLSDRPCServer::LLSDRPCServer() :
 	mPump(NULL),
 	mLock(0)
 {
-	LLMemType m1(LLMemType::MTYPE_IO_SD_SERVER);
 }
 
 LLSDRPCServer::~LLSDRPCServer()
 {
-	LLMemType m1(LLMemType::MTYPE_IO_SD_SERVER);
 	std::for_each(
 		mMethods.begin(),
 		mMethods.end(),
@@ -109,7 +106,6 @@ LLIOPipe::EStatus LLSDRPCServer::process_impl(
 {
 	LLFastTimer t(FTM_PROCESS_SDRPC_SERVER);
 	PUMP_DEBUG;
-	LLMemType m1(LLMemType::MTYPE_IO_SD_SERVER);
 //	lldebugs << "LLSDRPCServer::process_impl" << llendl;
 	// Once we have all the data, We need to read the sd on
 	// the the in channel, and respond on  the out channel
@@ -253,7 +249,6 @@ ESDRPCSStatus LLSDRPCServer::callMethod(
 	const LLChannelDescriptors& channels,
 	LLBufferArray* response)
 {
-	LLMemType m1(LLMemType::MTYPE_IO_SD_SERVER);
 	// Try to find the method in the method table.
 	ESDRPCSStatus rv = ESDRPCS_DONE;
 	method_map_t::iterator it = mMethods.find(method);
@@ -292,7 +287,6 @@ ESDRPCSStatus LLSDRPCServer::callbackMethod(
 	const LLChannelDescriptors& channels,
 	LLBufferArray* response)
 {
-	LLMemType m1(LLMemType::MTYPE_IO_SD_SERVER);
 	// Try to find the method in the callback method table.
 	ESDRPCSStatus rv = ESDRPCS_DONE;
 	method_map_t::iterator it = mCallbackMethods.find(method);
@@ -320,7 +314,6 @@ void LLSDRPCServer::buildFault(
 	S32 code,
 	const std::string& msg)
 {
-	LLMemType m1(LLMemType::MTYPE_IO_SD_SERVER);
 	LLBufferStream ostr(channels, data);
 	ostr << FAULT_PART_1 << code << FAULT_PART_2 << msg << FAULT_PART_3;
 	llinfos << "LLSDRPCServer::buildFault: " << code << ", " << msg << llendl;
@@ -332,7 +325,6 @@ void LLSDRPCServer::buildResponse(
 	LLBufferArray* data,
 	const LLSD& response)
 {
-	LLMemType m1(LLMemType::MTYPE_IO_SD_SERVER);
 	LLBufferStream ostr(channels, data);
 	ostr << RESPONSE_PART_1;
 	LLSDSerialize::toNotation(response, ostr);
diff --git a/indra/llmessage/llurlrequest.cpp b/indra/llmessage/llurlrequest.cpp
index f3f00072054df6f6d4d664f78fb3e6d41598e3f8..5831c3c1c1ff25872e24ae7e4de4bb106fe86d7d 100644
--- a/indra/llmessage/llurlrequest.cpp
+++ b/indra/llmessage/llurlrequest.cpp
@@ -34,7 +34,6 @@
 #include <openssl/ssl.h>
 #include "llcurl.h"
 #include "llioutil.h"
-#include "llmemtype.h"
 #include "llproxy.h"
 #include "llpumpio.h"
 #include "llsd.h"
@@ -81,7 +80,6 @@ LLURLRequestDetail::LLURLRequestDetail() :
 	mIsBodyLimitSet(false),
     mSSLVerifyCallback(NULL)
 {
-	LLMemType m1(LLMemType::MTYPE_IO_URL_REQUEST);
 	mCurlRequest = new LLCurlEasyRequest();
 	
 	if(!mCurlRequest->isValid()) //failed.
@@ -93,7 +91,6 @@ LLURLRequestDetail::LLURLRequestDetail() :
 
 LLURLRequestDetail::~LLURLRequestDetail()
 {
-	LLMemType m1(LLMemType::MTYPE_IO_URL_REQUEST);
 	delete mCurlRequest;
 	mLastRead = NULL;
 }
@@ -156,7 +153,6 @@ std::string LLURLRequest::actionAsVerb(LLURLRequest::ERequestAction action)
 LLURLRequest::LLURLRequest(LLURLRequest::ERequestAction action) :
 	mAction(action)
 {
-	LLMemType m1(LLMemType::MTYPE_IO_URL_REQUEST);
 	initialize();
 }
 
@@ -165,21 +161,18 @@ LLURLRequest::LLURLRequest(
 	const std::string& url) :
 	mAction(action)
 {
-	LLMemType m1(LLMemType::MTYPE_IO_URL_REQUEST);
 	initialize();
 	setURL(url);
 }
 
 LLURLRequest::~LLURLRequest()
 {
-	LLMemType m1(LLMemType::MTYPE_IO_URL_REQUEST);
 	delete mDetail;
 	mDetail = NULL ;
 }
 
 void LLURLRequest::setURL(const std::string& url)
 {
-	LLMemType m1(LLMemType::MTYPE_IO_URL_REQUEST);
 	mDetail->mURL = url;
 }
 
@@ -190,7 +183,6 @@ std::string LLURLRequest::getURL() const
 
 void LLURLRequest::addHeader(const char* header)
 {
-	LLMemType m1(LLMemType::MTYPE_IO_URL_REQUEST);
 	mDetail->mCurlRequest->slist_append(header);
 }
 
@@ -202,7 +194,6 @@ void LLURLRequest::setBodyLimit(U32 size)
 
 void LLURLRequest::setCallback(LLURLRequestComplete* callback)
 {
-	LLMemType m1(LLMemType::MTYPE_IO_URL_REQUEST);
 	mCompletionCallback = callback;
 	mDetail->mCurlRequest->setHeaderCallback(&headerCallback, (void*)callback);
 }
@@ -267,8 +258,6 @@ LLIOPipe::EStatus LLURLRequest::handleError(
 	LLIOPipe::EStatus status,
 	LLPumpIO* pump)
 {
-	LLMemType m1(LLMemType::MTYPE_IO_URL_REQUEST);
-	
 	if(!isValid())
 	{
 		return STATUS_EXPIRED ;
@@ -302,7 +291,6 @@ LLIOPipe::EStatus LLURLRequest::process_impl(
 {
 	LLFastTimer t(FTM_PROCESS_URL_REQUEST);
 	PUMP_DEBUG;
-	LLMemType m1(LLMemType::MTYPE_IO_URL_REQUEST);
 	//llinfos << "LLURLRequest::process_impl()" << llendl;
 	if (!buffer) return STATUS_ERROR;
 	
@@ -455,7 +443,6 @@ LLIOPipe::EStatus LLURLRequest::process_impl(
 
 void LLURLRequest::initialize()
 {
-	LLMemType m1(LLMemType::MTYPE_IO_URL_REQUEST);
 	mState = STATE_INITIALIZED;
 	mDetail = new LLURLRequestDetail;
 
@@ -476,7 +463,6 @@ bool LLURLRequest::configure()
 {
 	LLFastTimer t(FTM_URL_REQUEST_CONFIGURE);
 	
-	LLMemType m1(LLMemType::MTYPE_IO_URL_REQUEST);
 	bool rv = false;
 	S32 bytes = mDetail->mResponseBuffer->countAfter(
    		mDetail->mChannels.in(),
@@ -556,7 +542,6 @@ size_t LLURLRequest::downCallback(
 	size_t nmemb,
 	void* user)
 {
-	LLMemType m1(LLMemType::MTYPE_IO_URL_REQUEST);
 	LLURLRequest* req = (LLURLRequest*)user;
 	if(STATE_WAITING_FOR_RESPONSE == req->mState)
 	{
@@ -592,7 +577,6 @@ size_t LLURLRequest::upCallback(
 	size_t nmemb,
 	void* user)
 {
-	LLMemType m1(LLMemType::MTYPE_IO_URL_REQUEST);
 	LLURLRequest* req = (LLURLRequest*)user;
 	S32 bytes = llmin(
 		(S32)(size * nmemb),
@@ -690,7 +674,6 @@ LLIOPipe::EStatus LLContextURLExtractor::process_impl(
 {
 	LLFastTimer t(FTM_PROCESS_URL_EXTRACTOR);
 	PUMP_DEBUG;
-	LLMemType m1(LLMemType::MTYPE_IO_URL_REQUEST);
 	// The destination host is in the context.
 	if(context.isUndefined() || !mRequest)
 	{
@@ -718,13 +701,11 @@ LLIOPipe::EStatus LLContextURLExtractor::process_impl(
 LLURLRequestComplete::LLURLRequestComplete() :
 	mRequestStatus(LLIOPipe::STATUS_ERROR)
 {
-	LLMemType m1(LLMemType::MTYPE_IO_URL_REQUEST);
 }
 
 // virtual
 LLURLRequestComplete::~LLURLRequestComplete()
 {
-	LLMemType m1(LLMemType::MTYPE_IO_URL_REQUEST);
 }
 
 //virtual 
@@ -763,7 +744,6 @@ void LLURLRequestComplete::noResponse()
 
 void LLURLRequestComplete::responseStatus(LLIOPipe::EStatus status)
 {
-	LLMemType m1(LLMemType::MTYPE_IO_URL_REQUEST);
 	mRequestStatus = status;
 }
 
diff --git a/indra/llmessage/message.cpp b/indra/llmessage/message.cpp
index 6a425cfe98a1c7d8a4545365393f526d4237aea4..ae95087377f4fe19197189c6e42c37c14429d536 100644
--- a/indra/llmessage/message.cpp
+++ b/indra/llmessage/message.cpp
@@ -80,7 +80,6 @@
 #include "v3math.h"
 #include "v4math.h"
 #include "lltransfertargetvfile.h"
-#include "llmemtype.h"
 
 // Constants
 //const char* MESSAGE_LOG_FILENAME = "message.log";
@@ -793,7 +792,6 @@ S32	LLMessageSystem::getReceiveBytes() const
 
 void LLMessageSystem::processAcks()
 {
-	LLMemType mt_pa(LLMemType::MTYPE_MESSAGE_PROCESS_ACKS);
 	F64 mt_sec = getMessageTimeSeconds();
 	{
 		gTransferManager.updateTransfers();
@@ -4020,7 +4018,6 @@ void LLMessageSystem::setTimeDecodesSpamThreshold( F32 seconds )
 // TODO: babbage: move gServicePump in to LLMessageSystem?
 bool LLMessageSystem::checkAllMessages(S64 frame_count, LLPumpIO* http_pump)
 {
-	LLMemType mt_cam(LLMemType::MTYPE_MESSAGE_CHECK_ALL);
 	if(checkMessages(frame_count))
 	{
 		return true;
diff --git a/indra/llprimitive/llprimitive.cpp b/indra/llprimitive/llprimitive.cpp
index 6dee1927838f1d7e54ca0d3212963644f8410552..946251f38399a24933a46b61843de41c80e1c130 100755
--- a/indra/llprimitive/llprimitive.cpp
+++ b/indra/llprimitive/llprimitive.cpp
@@ -27,7 +27,6 @@
 #include "linden_common.h"
 
 #include "material_codes.h"
-#include "llmemtype.h"
 #include "llerror.h"
 #include "message.h"
 #include "llprimitive.h"
@@ -189,7 +188,6 @@ void LLPrimitive::clearTextureList()
 // static
 LLPrimitive *LLPrimitive::createPrimitive(LLPCode p_code)
 {
-	LLMemType m1(LLMemType::MTYPE_PRIMITIVE);
 	LLPrimitive *retval = new LLPrimitive();
 	
 	if (retval)
@@ -207,7 +205,6 @@ LLPrimitive *LLPrimitive::createPrimitive(LLPCode p_code)
 //===============================================================
 void LLPrimitive::init_primitive(LLPCode p_code)
 {
-	LLMemType m1(LLMemType::MTYPE_PRIMITIVE);
 	clearTextureList();
 	mPrimitiveCode = p_code;
 }
@@ -705,7 +702,6 @@ S32	face_index_from_id(LLFaceID face_ID, const std::vector<LLProfile::Face>& fac
 
 BOOL LLPrimitive::setVolume(const LLVolumeParams &volume_params, const S32 detail, bool unique_volume)
 {
-	LLMemType m1(LLMemType::MTYPE_VOLUME);
 	LLVolume *volumep;
 	if (unique_volume)
 	{
diff --git a/indra/llprimitive/llprimtexturelist.cpp b/indra/llprimitive/llprimtexturelist.cpp
index 36e04df7b7d5208ac4228b7582ab361504e24ae3..7ef87ed382059ae529eab2fb220fbe11235a1065 100644
--- a/indra/llprimitive/llprimtexturelist.cpp
+++ b/indra/llprimitive/llprimtexturelist.cpp
@@ -28,7 +28,6 @@
 
 #include "llprimtexturelist.h"
 #include "lltextureentry.h"
-#include "llmemtype.h"
 
 // static 
 //int (TMyClass::*pt2Member)(float, char, char) = NULL;                // C++
@@ -367,7 +366,6 @@ S32 LLPrimTextureList::size() const
 // sets the size of the mEntryList container
 void LLPrimTextureList::setSize(S32 new_size)
 {
-	LLMemType m1(LLMemType::MTYPE_PRIMITIVE);
 	if (new_size < 0)
 	{
 		new_size = 0;
diff --git a/indra/llrender/llgl.cpp b/indra/llrender/llgl.cpp
index 0b56b3889c90eed03253981e3bc18ed81496ed30..9e4857b6bca5b864e1f3a060df7d6148dde09e6f 100644
--- a/indra/llrender/llgl.cpp
+++ b/indra/llrender/llgl.cpp
@@ -44,7 +44,6 @@
 #include "llmath.h"
 #include "m4math.h"
 #include "llstring.h"
-#include "llmemtype.h"
 #include "llstacktrace.h"
 
 #include "llglheaders.h"
@@ -2323,7 +2322,6 @@ void LLGLNamePool::release(GLuint name)
 //static
 void LLGLNamePool::upkeepPools()
 {
-	LLMemType mt(LLMemType::MTYPE_UPKEEP_POOLS);
 	for (tracker_t::instance_iter iter = beginInstances(); iter != endInstances(); ++iter)
 	{
 		LLGLNamePool & pool = *iter;
diff --git a/indra/llrender/llrendertarget.cpp b/indra/llrender/llrendertarget.cpp
index cc5c2323809b40c43b79f843fe19fbd0997558e2..cd1c5322434ee11fd59edb75e6add0eeaad6e080 100644
--- a/indra/llrender/llrendertarget.cpp
+++ b/indra/llrender/llrendertarget.cpp
@@ -51,11 +51,13 @@ void check_framebuffer_status()
 }
 
 bool LLRenderTarget::sUseFBO = false;
+U32 LLRenderTarget::sCurFBO = 0;
 
 LLRenderTarget::LLRenderTarget() :
 	mResX(0),
 	mResY(0),
 	mFBO(0),
+	mPreviousFBO(0),
 	mDepth(0),
 	mStencil(0),
 	mUseDepth(false),
@@ -107,6 +109,9 @@ void LLRenderTarget::resize(U32 resx, U32 resy, U32 color_fmt)
 
 bool LLRenderTarget::allocate(U32 resx, U32 resy, U32 color_fmt, bool depth, bool stencil, LLTexUnit::eTextureType usage, bool use_fbo, S32 samples)
 {
+	resx = llmin(resx, (U32) 4096);
+	resy = llmin(resy, (U32) 4096);
+
 	stop_glerror();
 	release();
 	stop_glerror();
@@ -146,7 +151,7 @@ bool LLRenderTarget::allocate(U32 resx, U32 resy, U32 color_fmt, bool depth, boo
 				glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, LLTexUnit::getInternalType(mUsage), mDepth, 0);
 				stop_glerror();
 			}
-			glBindFramebuffer(GL_FRAMEBUFFER, 0);
+			glBindFramebuffer(GL_FRAMEBUFFER, sCurFBO);
 		}
 		
 		stop_glerror();
@@ -224,7 +229,7 @@ bool LLRenderTarget::addColorAttachment(U32 color_fmt)
 
 		check_framebuffer_status();
 		
-		glBindFramebuffer(GL_FRAMEBUFFER, 0);
+		glBindFramebuffer(GL_FRAMEBUFFER, sCurFBO);
 	}
 
 	mTex.push_back(tex);
@@ -313,7 +318,7 @@ void LLRenderTarget::shareDepthBuffer(LLRenderTarget& target)
 
 		check_framebuffer_status();
 
-		glBindFramebuffer(GL_FRAMEBUFFER, 0);
+		glBindFramebuffer(GL_FRAMEBUFFER, sCurFBO);
 
 		target.mUseDepth = true;
 	}
@@ -376,9 +381,13 @@ void LLRenderTarget::bindTarget()
 {
 	if (mFBO)
 	{
+		mPreviousFBO = sCurFBO;
+
 		stop_glerror();
 		
 		glBindFramebuffer(GL_FRAMEBUFFER, mFBO);
+		sCurFBO = mFBO;
+
 		stop_glerror();
 		if (gGLManager.mHasDrawBuffers)
 		{ //setup multiple render targets
@@ -404,16 +413,6 @@ void LLRenderTarget::bindTarget()
 	sBoundTarget = this;
 }
 
-// static
-void LLRenderTarget::unbindTarget()
-{
-	if (gGLManager.mHasFramebufferObject)
-	{
-		glBindFramebuffer(GL_FRAMEBUFFER, 0);
-	}
-	sBoundTarget = NULL;
-}
-
 void LLRenderTarget::clear(U32 mask_in)
 {
 	U32 mask = GL_COLOR_BUFFER_BIT;
@@ -479,7 +478,8 @@ void LLRenderTarget::flush(bool fetch_depth)
 	else
 	{
 		stop_glerror();
-		glBindFramebuffer(GL_FRAMEBUFFER, 0);
+		glBindFramebuffer(GL_FRAMEBUFFER, mPreviousFBO);
+		sCurFBO = mPreviousFBO;
 		stop_glerror();
 	}
 }
@@ -509,7 +509,7 @@ void LLRenderTarget::copyContents(LLRenderTarget& source, S32 srcX0, S32 srcY0,
 		stop_glerror();
 		glCopyTexSubImage2D(LLTexUnit::getInternalType(mUsage), 0, srcX0, srcY0, dstX0, dstY0, dstX1, dstY1);
 		stop_glerror();
-		glBindFramebuffer(GL_FRAMEBUFFER, 0);
+		glBindFramebuffer(GL_FRAMEBUFFER, sCurFBO);
 		stop_glerror();
 	}
 	else
@@ -526,7 +526,7 @@ void LLRenderTarget::copyContents(LLRenderTarget& source, S32 srcX0, S32 srcY0,
 		stop_glerror();
 		glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
 		stop_glerror();
-		glBindFramebuffer(GL_FRAMEBUFFER, 0);
+		glBindFramebuffer(GL_FRAMEBUFFER, sCurFBO);
 		stop_glerror();
 	}
 }
@@ -552,7 +552,7 @@ void LLRenderTarget::copyContentsToFramebuffer(LLRenderTarget& source, S32 srcX0
 		stop_glerror();
 		glBlitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
 		stop_glerror();
-		glBindFramebuffer(GL_FRAMEBUFFER, 0);
+		glBindFramebuffer(GL_FRAMEBUFFER, sCurFBO);
 		stop_glerror();
 	}
 }
diff --git a/indra/llrender/llrendertarget.h b/indra/llrender/llrendertarget.h
index e1a51304f1747f0be9a10c00450f2f3355c370ee..cf15f66d318c8902bff8d4fd74cd33736d8c591c 100644
--- a/indra/llrender/llrendertarget.h
+++ b/indra/llrender/llrendertarget.h
@@ -63,6 +63,7 @@ class LLRenderTarget
 	//whether or not to use FBO implementation
 	static bool sUseFBO; 
 	static U32 sBytesAllocated;
+	static U32 sCurFBO;
 
 	LLRenderTarget();
 	~LLRenderTarget();
@@ -96,9 +97,6 @@ class LLRenderTarget
 	//applies appropriate viewport
 	void bindTarget();
 
-	//unbind target for rendering
-	static void unbindTarget();
-	
 	//clear render targer, clears depth buffer if present,
 	//uses scissor rect if in copy-to-texture mode
 	void clear(U32 mask = 0xFFFFFFFF);
@@ -148,6 +146,7 @@ class LLRenderTarget
 	std::vector<U32> mTex;
 	std::vector<U32> mInternalFormat;
 	U32 mFBO;
+	U32 mPreviousFBO;
 	U32 mDepth;
 	bool mStencil;
 	bool mUseDepth;
diff --git a/indra/llrender/llvertexbuffer.cpp b/indra/llrender/llvertexbuffer.cpp
index 28a14b23b916dc7d6619c6704edf4b55b6710e41..11b2681e52d36a2d06b82c32984210a287c33a45 100644
--- a/indra/llrender/llvertexbuffer.cpp
+++ b/indra/llrender/llvertexbuffer.cpp
@@ -31,7 +31,6 @@
 #include "llvertexbuffer.h"
 // #include "llrender.h"
 #include "llglheaders.h"
-#include "llmemtype.h"
 #include "llrender.h"
 #include "llvector4a.h"
 #include "llshadermgr.h"
@@ -858,7 +857,6 @@ void LLVertexBuffer::unbind()
 //static
 void LLVertexBuffer::cleanupClass()
 {
-	LLMemType mt2(LLMemType::MTYPE_VERTEX_CLEANUP_CLASS);
 	unbind();
 	
 	sStreamIBOPool.cleanup();
@@ -939,8 +937,6 @@ LLVertexBuffer::LLVertexBuffer(U32 typemask, S32 usage) :
 	mMappable(false),
 	mFence(NULL)
 {
-	LLMemType mt2(LLMemType::MTYPE_VERTEX_CONSTRUCTOR);
-
 	mMappable = (mUsage == GL_DYNAMIC_DRAW_ARB && !sDisableVBOMapping);
 
 	//zero out offsets
@@ -1000,7 +996,6 @@ S32 LLVertexBuffer::getSize() const
 //virtual
 LLVertexBuffer::~LLVertexBuffer()
 {
-	LLMemType mt2(LLMemType::MTYPE_VERTEX_DESTRUCTOR);
 	destroyGLBuffer();
 	destroyGLIndices();
 
@@ -1120,8 +1115,6 @@ void LLVertexBuffer::releaseIndices()
 
 void LLVertexBuffer::createGLBuffer(U32 size)
 {
-	LLMemType mt2(LLMemType::MTYPE_VERTEX_CREATE_VERTICES);
-	
 	if (mGLBuffer)
 	{
 		destroyGLBuffer();
@@ -1151,8 +1144,6 @@ void LLVertexBuffer::createGLBuffer(U32 size)
 
 void LLVertexBuffer::createGLIndices(U32 size)
 {
-	LLMemType mt2(LLMemType::MTYPE_VERTEX_CREATE_INDICES);
-	
 	if (mGLIndices)
 	{
 		destroyGLIndices();
@@ -1187,7 +1178,6 @@ void LLVertexBuffer::createGLIndices(U32 size)
 
 void LLVertexBuffer::destroyGLBuffer()
 {
-	LLMemType mt2(LLMemType::MTYPE_VERTEX_DESTROY_BUFFER);
 	if (mGLBuffer)
 	{
 		if (mMappedDataUsingVBOs)
@@ -1208,7 +1198,6 @@ void LLVertexBuffer::destroyGLBuffer()
 
 void LLVertexBuffer::destroyGLIndices()
 {
-	LLMemType mt2(LLMemType::MTYPE_VERTEX_DESTROY_INDICES);
 	if (mGLIndices)
 	{
 		if (mMappedIndexDataUsingVBOs)
@@ -1229,8 +1218,6 @@ void LLVertexBuffer::destroyGLIndices()
 
 void LLVertexBuffer::updateNumVerts(S32 nverts)
 {
-	LLMemType mt2(LLMemType::MTYPE_VERTEX_UPDATE_VERTS);
-
 	llassert(nverts >= 0);
 
 	if (nverts > 65536)
@@ -1253,8 +1240,6 @@ void LLVertexBuffer::updateNumVerts(S32 nverts)
 
 void LLVertexBuffer::updateNumIndices(S32 nindices)
 {
-	LLMemType mt2(LLMemType::MTYPE_VERTEX_UPDATE_INDICES);
-
 	llassert(nindices >= 0);
 
 	U32 needed_size = sizeof(U16) * nindices;
@@ -1271,8 +1256,6 @@ void LLVertexBuffer::updateNumIndices(S32 nindices)
 
 void LLVertexBuffer::allocateBuffer(S32 nverts, S32 nindices, bool create)
 {
-	LLMemType mt2(LLMemType::MTYPE_VERTEX_ALLOCATE_BUFFER);
-	
 	stop_glerror();
 
 	if (nverts < 0 || nindices < 0 ||
@@ -1423,8 +1406,6 @@ void LLVertexBuffer::resizeBuffer(S32 newnverts, S32 newnindices)
 	llassert(newnverts >= 0);
 	llassert(newnindices >= 0);
 
-	LLMemType mt2(LLMemType::MTYPE_VERTEX_RESIZE_BUFFER);
-	
 	updateNumVerts(newnverts);		
 	updateNumIndices(newnindices);
 	
@@ -1472,7 +1453,6 @@ static LLFastTimer::DeclareTimer FTM_VBO_MAP_BUFFER("VBO Map");
 volatile U8* LLVertexBuffer::mapVertexBuffer(S32 type, S32 index, S32 count, bool map_range)
 {
 	bindGLBuffer(true);
-	LLMemType mt2(LLMemType::MTYPE_VERTEX_MAP_BUFFER);
 	if (mFinal)
 	{
 		llerrs << "LLVertexBuffer::mapVeretxBuffer() called on a finalized buffer." << llendl;
@@ -1521,7 +1501,6 @@ volatile U8* LLVertexBuffer::mapVertexBuffer(S32 type, S32 index, S32 count, boo
 
 		if (!mVertexLocked)
 		{
-			LLMemType mt_v(LLMemType::MTYPE_VERTEX_MAP_BUFFER_VERTICES);
 			mVertexLocked = true;
 			sMappedCount++;
 			stop_glerror();	
@@ -1652,7 +1631,6 @@ static LLFastTimer::DeclareTimer FTM_VBO_MAP_INDEX("IBO Map");
 
 volatile U8* LLVertexBuffer::mapIndexBuffer(S32 index, S32 count, bool map_range)
 {
-	LLMemType mt2(LLMemType::MTYPE_VERTEX_MAP_BUFFER);
 	bindGLIndices(true);
 	if (mFinal)
 	{
@@ -1699,8 +1677,6 @@ volatile U8* LLVertexBuffer::mapIndexBuffer(S32 index, S32 count, bool map_range
 
 		if (!mIndexLocked)
 		{
-			LLMemType mt_v(LLMemType::MTYPE_VERTEX_MAP_BUFFER_INDICES);
-
 			mIndexLocked = true;
 			sMappedCount++;
 			stop_glerror();	
@@ -1823,7 +1799,6 @@ static LLFastTimer::DeclareTimer FTM_IBO_FLUSH_RANGE("Flush IBO Range");
 
 void LLVertexBuffer::unmapBuffer()
 {
-	LLMemType mt2(LLMemType::MTYPE_VERTEX_UNMAP_BUFFER);
 	if (!useVBOs())
 	{
 		return; //nothing to unmap
@@ -2177,7 +2152,6 @@ void LLVertexBuffer::setBuffer(U32 data_mask)
 {
 	flush();
 
-	LLMemType mt2(LLMemType::MTYPE_VERTEX_SET_BUFFER);
 	//set up pointers if the data mask is different ...
 	bool setup = (sLastMask != data_mask);
 
@@ -2319,7 +2293,6 @@ void LLVertexBuffer::setBuffer(U32 data_mask)
 // virtual (default)
 void LLVertexBuffer::setupVertexBuffer(U32 data_mask)
 {
-	LLMemType mt2(LLMemType::MTYPE_VERTEX_SETUP_VERTEX_BUFFER);
 	stop_glerror();
 	volatile U8* base = useVBOs() ? (U8*) mAlignedOffset : mMappedData;
 
diff --git a/indra/llui/llfloater.cpp b/indra/llui/llfloater.cpp
index 90251ac7c657b77036d6db1f06c90ece4a60c954..d14fe441fbe52dea336b7057852c41332fcdecfa 100644
--- a/indra/llui/llfloater.cpp
+++ b/indra/llui/llfloater.cpp
@@ -1105,17 +1105,26 @@ void LLFloater::handleReshape(const LLRect& new_rect, bool by_user)
 	const LLRect old_rect = getRect();
 	LLView::handleReshape(new_rect, by_user);
 
-	if (by_user && !isMinimized())
+	if (by_user && !getHost())
 	{
-		storeRectControl();
-		mPositioning = LLFloaterEnums::POSITIONING_RELATIVE;
-		LLRect screen_rect = calcScreenRect();
-		mPosition = LLCoordGL(screen_rect.getCenterX(), screen_rect.getCenterY()).convert();
+		static_cast<LLFloaterView*>(getParent())->adjustToFitScreen(this, !isMinimized());
 	}
 
 	// if not minimized, adjust all snapped dependents to new shape
 	if (!isMinimized())
 	{
+		if (by_user)
+		{
+			if (isDocked())
+			{
+				setDocked( false, false);
+			}
+			storeRectControl();
+			mPositioning = LLFloaterEnums::POSITIONING_RELATIVE;
+			LLRect screen_rect = calcScreenRect();
+			mPosition = LLCoordGL(screen_rect.getCenterX(), screen_rect.getCenterY()).convert();
+		}
+
 		// gather all snapped dependents
 		for(handle_set_iter_t dependent_it = mDependents.begin();
 			dependent_it != mDependents.end(); ++dependent_it)
@@ -1711,56 +1720,10 @@ void LLFloater::onClickHelp( LLFloater* self )
 	}
 }
 
-// static 
-LLFloater* LLFloater::getClosableFloaterFromFocus()
-{
-	LLFloater* focused_floater = NULL;
-	LLInstanceTracker<LLFloater>::instance_iter it = beginInstances();
-	LLInstanceTracker<LLFloater>::instance_iter end_it = endInstances();
-	for (; it != end_it; ++it)
-	{
-		if (it->hasFocus())
-		{
-			LLFloater& floater = *it;
-			focused_floater = &floater;
-			break;
-		}
-	}
-
-	if (it == endInstances())
-	{
-		// nothing found, return
-		return NULL;
-	}
-
-	// The focused floater may not be closable,
-	// Find and close a parental floater that is closeable, if any.
-	LLFloater* prev_floater = NULL;
-	for(LLFloater* floater_to_close = focused_floater;
-		NULL != floater_to_close; 
-		floater_to_close = gFloaterView->getParentFloater(floater_to_close))
-	{
-		if(floater_to_close->isCloseable())
-		{
-			return floater_to_close;
-		}
-
-		// If floater has as parent root view
-		// gFloaterView->getParentFloater(floater_to_close) returns
-		// the same floater_to_close, so we need to check this.
-		if (prev_floater == floater_to_close) {
-			break;
-		}
-		prev_floater = floater_to_close;
-	}
-
-	return NULL;
-}
-
 // static
-void LLFloater::closeFocusedFloater()
+void LLFloater::closeFrontmostFloater()
 {
-	LLFloater* floater_to_close = LLFloater::getClosableFloaterFromFocus();
+	LLFloater* floater_to_close = gFloaterView->getFrontmostClosableFloater();
 	if(floater_to_close)
 	{
 		floater_to_close->closeFloater();
@@ -2478,6 +2441,24 @@ void LLFloaterView::highlightFocusedFloater()
 	}
 }
 
+LLFloater* LLFloaterView::getFrontmostClosableFloater()
+{
+	child_list_const_iter_t child_it;
+	LLFloater* frontmost_floater = NULL;
+
+	for ( child_it = getChildList()->begin(); child_it != getChildList()->end(); ++child_it)
+	{
+		frontmost_floater = (LLFloater *)(*child_it);
+
+		if (frontmost_floater->isInVisibleChain() && frontmost_floater->isCloseable())
+		{
+			return frontmost_floater;
+		}
+	}
+
+	return NULL;
+}
+
 void LLFloaterView::unhighlightFocusedFloater()
 {
 	for ( child_list_const_iter_t child_it = getChildList()->begin(); child_it != getChildList()->end(); ++child_it)
diff --git a/indra/llui/llfloater.h b/indra/llui/llfloater.h
index 64d6dcea0444afeffcd7de5758e1a40fe3953884..0484ca622b084aff314c6bd86d76e62589c05644 100644
--- a/indra/llui/llfloater.h
+++ b/indra/llui/llfloater.h
@@ -325,12 +325,10 @@ class LLFloater : public LLPanel, public LLInstanceTracker<LLFloater>
 
 	virtual void    setTornOff(bool torn_off) { mTornOff = torn_off; }
 
-	// Return a closeable floater, if any, given the current focus.
-	static LLFloater* getClosableFloaterFromFocus(); 
 
-	// Close the floater returned by getClosableFloaterFromFocus() and 
+	// Close the floater returned by getFrontmostClosableFloater() and 
 	// handle refocusing.
-	static void		closeFocusedFloater();
+	static void		closeFrontmostFloater();
 
 //	LLNotification::Params contextualNotification(const std::string& name) 
 //	{ 
@@ -559,6 +557,7 @@ class LLFloaterView : public LLUICtrl
 	S32 getZOrder(LLFloater* child);
 
 	void setFloaterSnapView(LLHandle<LLView> snap_view) {mSnapView = snap_view; }
+	LLFloater* getFrontmostClosableFloater(); 
 
 private:
 	void hiddenFloaterClosed(LLFloater* floater);
diff --git a/indra/llui/llmenugl.cpp b/indra/llui/llmenugl.cpp
index efb9848a909593c0a2e68fa05744d5371bc6c2d4..cd6cc6a75e18ae4b8f7fe4edc75d73b329b4dd5f 100644
--- a/indra/llui/llmenugl.cpp
+++ b/indra/llui/llmenugl.cpp
@@ -1764,6 +1764,25 @@ bool LLMenuGL::addChild(LLView* view, S32 tab_group)
 	return false;
 }
 
+// Used in LLContextMenu and in LLTogleableMenu
+// to add an item of context menu branch
+bool LLMenuGL::addContextChild(LLView* view, S32 tab_group)
+{
+	LLContextMenu* context = dynamic_cast<LLContextMenu*>(view);
+	if (context)
+		return appendContextSubMenu(context);
+
+	LLMenuItemSeparatorGL* separator = dynamic_cast<LLMenuItemSeparatorGL*>(view);
+	if (separator)
+		return append(separator);
+
+	LLMenuItemGL* item = dynamic_cast<LLMenuItemGL*>(view);
+	if (item)
+		return append(item);
+
+	return false;
+}
+
 void LLMenuGL::removeChild( LLView* ctrl)
 {
 	// previously a dynamic_cast with if statement to check validity
@@ -2501,6 +2520,30 @@ BOOL LLMenuGL::appendMenu( LLMenuGL* menu )
 	return success;
 }
 
+// add a context menu branch
+BOOL LLMenuGL::appendContextSubMenu(LLMenuGL *menu)
+{
+	if (menu == this)
+	{
+		llerrs << "Can't attach a context menu to itself" << llendl;
+	}
+
+	LLContextMenuBranch *item;
+	LLContextMenuBranch::Params p;
+	p.name = menu->getName();
+	p.label = menu->getLabel();
+	p.branch = (LLContextMenu *)menu;
+	p.enabled_color=LLUIColorTable::instance().getColor("MenuItemEnabledColor");
+	p.disabled_color=LLUIColorTable::instance().getColor("MenuItemDisabledColor");
+	p.highlight_bg_color=LLUIColorTable::instance().getColor("MenuItemHighlightBgColor");
+	p.highlight_fg_color=LLUIColorTable::instance().getColor("MenuItemHighlightFgColor");
+
+	item = LLUICtrlFactory::create<LLContextMenuBranch>(p);
+	LLMenuGL::sMenuContainer->addChild(item->getBranch());
+
+	return append( item );
+}
+
 void LLMenuGL::setEnabledSubMenus(BOOL enable)
 {
 	setEnabled(enable);
@@ -3725,39 +3768,6 @@ void LLTearOffMenu::closeTearOff()
 	mMenu->setDropShadowed(TRUE);
 }
 
-
-//-----------------------------------------------------------------------------
-// class LLContextMenuBranch
-// A branch to another context menu
-//-----------------------------------------------------------------------------
-class LLContextMenuBranch : public LLMenuItemGL
-{
-public:
-	struct Params : public LLInitParam::Block<Params, LLMenuItemGL::Params>
-	{
-		Mandatory<LLContextMenu*> branch;
-	};
-
-	LLContextMenuBranch(const Params&);
-
-	virtual ~LLContextMenuBranch()
-	{}
-
-	// called to rebuild the draw label
-	virtual void	buildDrawLabel( void );
-
-	// onCommit() - do the primary funcationality of the menu item.
-	virtual void	onCommit( void );
-
-	LLContextMenu*	getBranch() { return mBranch.get(); }
-	void			setHighlight( BOOL highlight );
-
-protected:
-	void	showSubMenu();
-
-	LLHandle<LLContextMenu> mBranch;
-};
-
 LLContextMenuBranch::LLContextMenuBranch(const LLContextMenuBranch::Params& p) 
 :	LLMenuItemGL(p),
 	mBranch( p.branch()->getHandle() )
@@ -4034,44 +4044,8 @@ void LLContextMenu::draw()
 	LLMenuGL::draw();
 }
 
-BOOL LLContextMenu::appendContextSubMenu(LLContextMenu *menu)
-{
-	
-	if (menu == this)
-	{
-		llerrs << "Can't attach a context menu to itself" << llendl;
-	}
-
-	LLContextMenuBranch *item;
-	LLContextMenuBranch::Params p;
-	p.name = menu->getName();
-	p.label = menu->getLabel();
-	p.branch = menu;
-	p.enabled_color=LLUIColorTable::instance().getColor("MenuItemEnabledColor");
-	p.disabled_color=LLUIColorTable::instance().getColor("MenuItemDisabledColor");
-	p.highlight_bg_color=LLUIColorTable::instance().getColor("MenuItemHighlightBgColor");
-	p.highlight_fg_color=LLUIColorTable::instance().getColor("MenuItemHighlightFgColor");
-	
-	item = LLUICtrlFactory::create<LLContextMenuBranch>(p);
-	LLMenuGL::sMenuContainer->addChild(item->getBranch());
-
-	return append( item );
-}
-
 bool LLContextMenu::addChild(LLView* view, S32 tab_group)
 {
-	LLContextMenu* context = dynamic_cast<LLContextMenu*>(view);
-	if (context)
-		return appendContextSubMenu(context);
-
-	LLMenuItemSeparatorGL* separator = dynamic_cast<LLMenuItemSeparatorGL*>(view);
-	if (separator)
-		return append(separator);
-
-	LLMenuItemGL* item = dynamic_cast<LLMenuItemGL*>(view);
-	if (item)
-		return append(item);
-
-	return false;
+	return addContextChild(view, tab_group);
 }
 
diff --git a/indra/llui/llmenugl.h b/indra/llui/llmenugl.h
index 67b3e1fbe669587bc41ef47fb58cf9a262395dc1..00899020bc087e00f75274c66a385dbaed8ccd32 100644
--- a/indra/llui/llmenugl.h
+++ b/indra/llui/llmenugl.h
@@ -519,6 +519,9 @@ class LLMenuGL
 	void resetScrollPositionOnShow(bool reset_scroll_pos) { mResetScrollPositionOnShow = reset_scroll_pos; }
 	bool isScrollPositionOnShowReset() { return mResetScrollPositionOnShow; }
 
+	// add a context menu branch
+	BOOL appendContextSubMenu(LLMenuGL *menu);
+
 protected:
 	void createSpilloverBranch();
 	void cleanupSpilloverBranch();
@@ -528,6 +531,10 @@ class LLMenuGL
 	// add a menu - this will create a cascading menu
 	virtual BOOL appendMenu( LLMenuGL* menu );
 
+	// Used in LLContextMenu and in LLTogleableMenu
+	// to add an item of context menu branch
+	bool addContextChild(LLView* view, S32 tab_group);
+
 	// TODO: create accessor methods for these?
 	typedef std::list< LLMenuItemGL* > item_list_t;
 	item_list_t mItems;
@@ -679,8 +686,6 @@ class LLContextMenu
 
 	virtual bool	addChild			(LLView* view, S32 tab_group = 0);
 
-			BOOL	appendContextSubMenu(LLContextMenu *menu);
-
 			LLHandle<LLContextMenu> getHandle() { return getDerivedHandle<LLContextMenu>(); }
 
 			LLView*	getSpawningView() const		{ return mSpawningViewHandle.get(); }
@@ -694,6 +699,38 @@ class LLContextMenu
 };
 
 
+//-----------------------------------------------------------------------------
+// class LLContextMenuBranch
+// A branch to another context menu
+//-----------------------------------------------------------------------------
+class LLContextMenuBranch : public LLMenuItemGL
+{
+public:
+	struct Params : public LLInitParam::Block<Params, LLMenuItemGL::Params>
+	{
+		Mandatory<LLContextMenu*> branch;
+	};
+
+	LLContextMenuBranch(const Params&);
+
+	virtual ~LLContextMenuBranch()
+	{}
+
+	// called to rebuild the draw label
+	virtual void	buildDrawLabel( void );
+
+	// onCommit() - do the primary funcationality of the menu item.
+	virtual void	onCommit( void );
+
+	LLContextMenu*	getBranch() { return mBranch.get(); }
+	void			setHighlight( BOOL highlight );
+
+protected:
+	void	showSubMenu();
+
+	LLHandle<LLContextMenu> mBranch;
+};
+
 
 //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 // Class LLMenuBarGL
diff --git a/indra/llui/llresizebar.cpp b/indra/llui/llresizebar.cpp
index 87aeb4d7a74b6755b58263c84ccaff2ac92b05d7..ba90fa5e0c57287d11f60a77ce0d59c057dd4b65 100644
--- a/indra/llui/llresizebar.cpp
+++ b/indra/llui/llresizebar.cpp
@@ -139,13 +139,6 @@ BOOL LLResizeBar::handleHover(S32 x, S32 y, MASK mask)
 		
 		if( valid_rect.localPointInRect( screen_x, screen_y ) && mResizingView )
 		{
-			// undock floater when user resize it
-			LLFloater* parent = dynamic_cast<LLFloater*>( getParent());
-			if (parent && parent->isDocked())
-			{
-				parent->setDocked( false, false);
-			}
-
 			// Resize the parent
 			LLRect orig_rect = mResizingView->getRect();
 			LLRect scaled_rect = orig_rect;
@@ -219,20 +212,66 @@ BOOL LLResizeBar::handleHover(S32 x, S32 y, MASK mask)
 
 			// update last valid mouse cursor position based on resized view's actual size
 			LLRect new_rect = mResizingView->getRect();
+
 			switch(mSide)
 			{
 			case LEFT:
-				mDragLastScreenX += new_rect.mLeft - orig_rect.mLeft;
+			{
+				S32 actual_delta_x = new_rect.mLeft - orig_rect.mLeft;
+				if (actual_delta_x != delta_x)
+				{
+					// restore everything by left
+					new_rect.mBottom = orig_rect.mBottom;
+					new_rect.mTop = orig_rect.mTop;
+					new_rect.mRight = orig_rect.mRight;
+					mResizingView->setShape(new_rect, true);
+				}
+				mDragLastScreenX += actual_delta_x;
+
 				break;
+			}
 			case RIGHT:
+			{
+				S32 actual_delta_x = new_rect.mRight - orig_rect.mRight;
+				if (actual_delta_x != delta_x)
+				{
+					// restore everything by left
+					new_rect.mBottom = orig_rect.mBottom;
+					new_rect.mTop = orig_rect.mTop;
+					new_rect.mLeft = orig_rect.mLeft;
+					mResizingView->setShape(new_rect, true);
+				}
 				mDragLastScreenX += new_rect.mRight - orig_rect.mRight;
 				break;
+			}
 			case TOP:
+			{
+				S32 actual_delta_y = new_rect.mTop - orig_rect.mTop;
+				if (actual_delta_y != delta_y)
+				{
+					// restore everything by left
+					new_rect.mBottom = orig_rect.mBottom;
+					new_rect.mLeft = orig_rect.mLeft;
+					new_rect.mRight = orig_rect.mRight;
+					mResizingView->setShape(new_rect, true);
+				}
 				mDragLastScreenY += new_rect.mTop - orig_rect.mTop;
 				break;
+			}
 			case BOTTOM:
+			{
+				S32 actual_delta_y = new_rect.mBottom - orig_rect.mBottom;
+				if (actual_delta_y != delta_y)
+				{
+					// restore everything by left
+					new_rect.mTop = orig_rect.mTop;
+					new_rect.mLeft = orig_rect.mLeft;
+					new_rect.mRight = orig_rect.mRight;
+					mResizingView->setShape(new_rect, true);
+				}
 				mDragLastScreenY += new_rect.mBottom- orig_rect.mBottom;
 				break;
+			}
 			default:
 				break;
 			}
diff --git a/indra/llui/llresizehandle.cpp b/indra/llui/llresizehandle.cpp
index c3a51c36c94a037c3a5c3a408066ac08307c4567..24794305ac0c42ba895b4a8930ab18c2d4e48623 100644
--- a/indra/llui/llresizehandle.cpp
+++ b/indra/llui/llresizehandle.cpp
@@ -257,23 +257,65 @@ BOOL LLResizeHandle::handleHover(S32 x, S32 y, MASK mask)
 			
 			// update last valid mouse cursor position based on resized view's actual size
 			LLRect new_rect = resizing_view->getRect();
+			S32 actual_delta_x = 0;
+			S32 actual_delta_y = 0;
 			switch(mCorner)
 			{
 			case LEFT_TOP:
-				mDragLastScreenX += new_rect.mLeft - orig_rect.mLeft;
-				mDragLastScreenY += new_rect.mTop - orig_rect.mTop;
+				actual_delta_x = new_rect.mLeft - orig_rect.mLeft;
+				actual_delta_y = new_rect.mTop - orig_rect.mTop;
+				if (actual_delta_x != delta_x
+					|| actual_delta_y != delta_y)
+				{
+					new_rect.mRight = orig_rect.mRight;
+					new_rect.mBottom = orig_rect.mBottom;
+					resizing_view->setShape(new_rect, true);
+				}
+
+				mDragLastScreenX += actual_delta_x;
+				mDragLastScreenY += actual_delta_y;
 				break;
 			case LEFT_BOTTOM:
-				mDragLastScreenX += new_rect.mLeft - orig_rect.mLeft;
-				mDragLastScreenY += new_rect.mBottom- orig_rect.mBottom;
+				actual_delta_x = new_rect.mLeft - orig_rect.mLeft;
+				actual_delta_y = new_rect.mBottom - orig_rect.mBottom;
+				if (actual_delta_x != delta_x
+					|| actual_delta_y != delta_y)
+				{
+					new_rect.mRight = orig_rect.mRight;
+					new_rect.mTop = orig_rect.mTop;
+					resizing_view->setShape(new_rect, true);
+				}
+
+				mDragLastScreenX += actual_delta_x;
+				mDragLastScreenY += actual_delta_y;
 				break;
 			case RIGHT_TOP:
-				mDragLastScreenX += new_rect.mRight - orig_rect.mRight;
-				mDragLastScreenY += new_rect.mTop - orig_rect.mTop;
+				actual_delta_x = new_rect.mRight - orig_rect.mRight;
+				actual_delta_y = new_rect.mTop - orig_rect.mTop;
+				if (actual_delta_x != delta_x
+					|| actual_delta_y != delta_y)
+				{
+					new_rect.mLeft = orig_rect.mLeft;
+					new_rect.mBottom = orig_rect.mBottom;
+					resizing_view->setShape(new_rect, true);
+				}
+
+				mDragLastScreenX += actual_delta_x;
+				mDragLastScreenY += actual_delta_y;
 				break;
 			case RIGHT_BOTTOM:
-				mDragLastScreenX += new_rect.mRight - orig_rect.mRight;
-				mDragLastScreenY += new_rect.mBottom- orig_rect.mBottom;
+				actual_delta_x = new_rect.mRight - orig_rect.mRight;
+				actual_delta_y = new_rect.mBottom - orig_rect.mBottom;
+				if (actual_delta_x != delta_x
+					|| actual_delta_y != delta_y)
+				{
+					new_rect.mLeft = orig_rect.mLeft;
+					new_rect.mTop = orig_rect.mTop;
+					resizing_view->setShape(new_rect, true);
+				}
+
+				mDragLastScreenX += actual_delta_x;
+				mDragLastScreenY += actual_delta_y;
 				break;
 			default:
 				break;
diff --git a/indra/llui/llstatbar.cpp b/indra/llui/llstatbar.cpp
index 04cce7878e4611170a8164aeecef09afce4f5791..a21d7aa6a1714fc6afd93d5af816666cabfd463b 100644
--- a/indra/llui/llstatbar.cpp
+++ b/indra/llui/llstatbar.cpp
@@ -45,7 +45,7 @@ LLStatBar::LLStatBar(const Params& p)
 	  mUnitLabel(p.unit_label),
 	  mMinBar(p.bar_min),
 	  mMaxBar(p.bar_max),
-	  mStatp(LLStat::getStat(p.stat)),
+	  mStatp(LLStat::getInstance(p.stat)),
 	  mTickSpacing(p.tick_spacing),
 	  mLabelSpacing(p.label_spacing),
 	  mPrecision(p.precision),
diff --git a/indra/llui/llstatbar.h b/indra/llui/llstatbar.h
index 513fff323454128fc46e50c16c2545d94bc3ff03..7e636d0aa7ea17232083059b12b034ab95e6881f 100644
--- a/indra/llui/llstatbar.h
+++ b/indra/llui/llstatbar.h
@@ -59,10 +59,10 @@ class LLStatBar : public LLView
 			  label_spacing("label_spacing", 10.0f),
 			  precision("precision", 0),
 			  update_rate("update_rate", 5.0f),
-			  show_per_sec("show_per_sec", TRUE),
+			  show_per_sec("show_per_sec", true),
 			  show_bar("show_bar", TRUE),
-			  show_history("show_history", FALSE),
-			  show_mean("show_mean", TRUE),
+			  show_history("show_history", false),
+			  show_mean("show_mean", true),
 			  stat("stat")
 		{
 			changeDefault(follows.flags, FOLLOWS_TOP | FOLLOWS_LEFT);
diff --git a/indra/llui/lltexteditor.cpp b/indra/llui/lltexteditor.cpp
index 144b6960a1b03cf090f599207e7c02a5b5410097..46fbd1e6a0f72c442a6d358e1ef92ff6d261e4ba 100644
--- a/indra/llui/lltexteditor.cpp
+++ b/indra/llui/lltexteditor.cpp
@@ -239,7 +239,8 @@ LLTextEditor::Params::Params()
 	show_line_numbers("show_line_numbers", false),
 	default_color("default_color"),
     commit_on_focus_lost("commit_on_focus_lost", false),
-	show_context_menu("show_context_menu")
+	show_context_menu("show_context_menu"),
+	enable_tooltip_paste("enable_tooltip_paste")
 {
 	addSynonym(prevalidate_callback, "text_type");
 }
@@ -258,7 +259,8 @@ LLTextEditor::LLTextEditor(const LLTextEditor::Params& p) :
 	mTabsToNextField(p.ignore_tab),
 	mPrevalidateFunc(p.prevalidate_callback()),
 	mContextMenu(NULL),
-	mShowContextMenu(p.show_context_menu)
+	mShowContextMenu(p.show_context_menu),
+	mEnableTooltipPaste(p.enable_tooltip_paste)
 {
 	mSourceID.generate();
 
@@ -1411,6 +1413,23 @@ void LLTextEditor::pasteHelper(bool is_primary)
 
 	// Clean up string (replace tabs and remove characters that our fonts don't support).
 	LLWString clean_string(paste);
+	cleanStringForPaste(clean_string);
+
+	// Insert the new text into the existing text.
+
+	//paste text with linebreaks.
+	pasteTextWithLinebreaks(clean_string);
+
+	deselect();
+
+	onKeyStroke();
+	mParseOnTheFly = TRUE;
+}
+
+
+// Clean up string (replace tabs and remove characters that our fonts don't support).
+void LLTextEditor::cleanStringForPaste(LLWString & clean_string)
+{
 	LLWStringUtil::replaceTabsWithSpaces(clean_string, SPACES_PER_TAB);
 	if( mAllowEmbeddedItems )
 	{
@@ -1429,10 +1448,11 @@ void LLTextEditor::pasteHelper(bool is_primary)
 			}
 		}
 	}
+}
 
-	// Insert the new text into the existing text.
 
-	//paste text with linebreaks.
+void LLTextEditor::pasteTextWithLinebreaks(LLWString & clean_string)
+{
 	std::basic_string<llwchar>::size_type start = 0;
 	std::basic_string<llwchar>::size_type pos = clean_string.find('\n',start);
 	
@@ -1451,15 +1471,8 @@ void LLTextEditor::pasteHelper(bool is_primary)
 
 	std::basic_string<llwchar> str = std::basic_string<llwchar>(clean_string,start,clean_string.length()-start);
 	setCursorPos(mCursorPos + insert(mCursorPos, str, FALSE, LLTextSegmentPtr()));
-
-	deselect();
-
-	onKeyStroke();
-	mParseOnTheFly = TRUE;
 }
 
-
-
 // copy selection to primary
 void LLTextEditor::copyPrimary()
 {
@@ -1680,19 +1693,50 @@ BOOL LLTextEditor::handleKeyHere(KEY key, MASK mask )
 	{
 		return FALSE;
 	}
-		
+
 	if (mReadOnly && mScroller)
 	{
 		handled = (mScroller && mScroller->handleKeyHere( key, mask ))
 				|| handleSelectionKey(key, mask)
 				|| handleControlKey(key, mask);
+	}
+	else 
+	{
+		if (mEnableTooltipPaste &&
+			LLToolTipMgr::instance().toolTipVisible() && 
+			KEY_TAB == key)
+		{	// Paste the first line of a tooltip into the editor
+			std::string message;
+			LLToolTipMgr::instance().getToolTipMessage(message);
+			LLWString tool_tip_text(utf8str_to_wstring(message));
+
+			if (tool_tip_text.size() > 0)
+			{
+				// Delete any selected characters (the tooltip text replaces them)
+				if(hasSelection())
+				{
+					deleteSelection(TRUE);
+				}
+
+				std::basic_string<llwchar>::size_type pos = tool_tip_text.find('\n',0);
+				if (pos != -1)
+				{	// Extract the first line of the tooltip
+					tool_tip_text = std::basic_string<llwchar>(tool_tip_text, 0, pos);
+				}
+
+				// Add the text
+				cleanStringForPaste(tool_tip_text);
+				pasteTextWithLinebreaks(tool_tip_text);
+				handled = TRUE;
+			}
+		}
+		else
+		{	// Normal key handling
+			handled = handleNavigationKey( key, mask )
+					|| handleSelectionKey(key, mask)
+					|| handleControlKey(key, mask)
+					|| handleSpecialKey(key, mask);
 		}
-		else 
-		{
-		handled = handleNavigationKey( key, mask )
-				|| handleSelectionKey(key, mask)
-				|| handleControlKey(key, mask)
-				|| handleSpecialKey(key, mask);
 	}
 
 	if( handled )
diff --git a/indra/llui/lltexteditor.h b/indra/llui/lltexteditor.h
index 40821ae9fbc58f994a81f58e03ca1522bcc5b46a..e60fe03e58f86d0bb6ed4d8d0fa0174357501b86 100644
--- a/indra/llui/lltexteditor.h
+++ b/indra/llui/lltexteditor.h
@@ -64,7 +64,8 @@ class LLTextEditor :
 								ignore_tab,
 								show_line_numbers,
 								commit_on_focus_lost,
-								show_context_menu;
+								show_context_menu,
+								enable_tooltip_paste;
 
 		//colors
 		Optional<LLUIColor>		default_color;
@@ -288,6 +289,8 @@ class LLTextEditor :
 	// Methods
 	//
 	void	        pasteHelper(bool is_primary);
+	void			cleanStringForPaste(LLWString & clean_string);
+	void			pasteTextWithLinebreaks(LLWString & clean_string);
 
 	void			drawLineNumbers();
 
@@ -321,6 +324,7 @@ class LLTextEditor :
 	BOOL			mAllowEmbeddedItems;
 	bool			mShowContextMenu;
 	bool			mParseOnTheFly;
+	bool			mEnableTooltipPaste;
 
 	LLUUID			mSourceID;
 
diff --git a/indra/llui/lltoggleablemenu.cpp b/indra/llui/lltoggleablemenu.cpp
index e4d1a37569ef939f56cdc6c81693c4ff166dd428..00d52fe10d3b7079eac171df552874138e70966f 100644
--- a/indra/llui/lltoggleablemenu.cpp
+++ b/indra/llui/lltoggleablemenu.cpp
@@ -101,3 +101,8 @@ bool LLToggleableMenu::toggleVisibility()
 
 	return true;
 }
+
+bool LLToggleableMenu::addChild(LLView* view, S32 tab_group)
+{
+	return addContextChild(view, tab_group);
+}
diff --git a/indra/llui/lltoggleablemenu.h b/indra/llui/lltoggleablemenu.h
index 2094bd776fde012e1334ac64aacca8a7ad5b09fb..4717b0d0ba3b4ee7c7550daff015ff0c574eb23c 100644
--- a/indra/llui/lltoggleablemenu.h
+++ b/indra/llui/lltoggleablemenu.h
@@ -47,6 +47,8 @@ class LLToggleableMenu : public LLMenuGL
 
 	virtual void handleVisibilityChange (BOOL curVisibilityIn);
 
+	virtual bool addChild (LLView* view, S32 tab_group = 0);
+
 	const LLRect& getButtonRect() const { return mButtonRect; }
 
 	// Converts the given local button rect to a screen rect
diff --git a/indra/llui/lltooltip.cpp b/indra/llui/lltooltip.cpp
index f737d48abfaade2245b71b1c486a80663a7bae54..7f1566d64a427b936633f6584f9ff247f8621fec 100644
--- a/indra/llui/lltooltip.cpp
+++ b/indra/llui/lltooltip.cpp
@@ -390,6 +390,15 @@ bool LLToolTip::hasClickCallback()
 	return mHasClickCallback; 
 }
 
+void LLToolTip::getToolTipMessage(std::string & message)
+{
+	if (mTextBox)
+	{
+		message = mTextBox->getText();
+	}
+}
+
+
 
 //
 // LLToolTipMgr
@@ -594,5 +603,14 @@ void LLToolTipMgr::updateToolTipVisibility()
 }
 
 
+// Return the current tooltip text
+void LLToolTipMgr::getToolTipMessage(std::string & message)
+{
+	if (toolTipVisible())
+	{
+		mToolTip->getToolTipMessage(message);
+	}
+}
+
 
 // EOF
diff --git a/indra/llui/lltooltip.h b/indra/llui/lltooltip.h
index d71a944c3d14231f0b0582200563ac006d502bed..fad127fc4cd440d980115bd66333c0ca2616d21b 100644
--- a/indra/llui/lltooltip.h
+++ b/indra/llui/lltooltip.h
@@ -105,6 +105,8 @@ class LLToolTip : public LLPanel
 	LLToolTip(const Params& p);
 	void initFromParams(const LLToolTip::Params& params);
 
+	void getToolTipMessage(std::string & message);
+
 private:
 	class LLTextBox*	mTextBox;
 	class LLButton*     mInfoButton;
@@ -142,6 +144,8 @@ class LLToolTipMgr : public LLSingleton<LLToolTipMgr>
 	LLRect getMouseNearRect();
 	void updateToolTipVisibility();
 
+	void getToolTipMessage(std::string & message);
+
 private:
 	void createToolTip(const LLToolTip::Params& params);
 
diff --git a/indra/llwindow/llwindowwin32.cpp b/indra/llwindow/llwindowwin32.cpp
index 9a4dd41c4e789c87da8b6118ac99d8b16dca75d9..43c0090993ee7774b352350c65df3abd6ff10a6f 100644
--- a/indra/llwindow/llwindowwin32.cpp
+++ b/indra/llwindow/llwindowwin32.cpp
@@ -58,7 +58,6 @@
 #include <dinput.h>
 #include <Dbt.h.>
 
-#include "llmemtype.h"
 // culled from winuser.h
 #ifndef WM_MOUSEWHEEL /* Added to be compatible with later SDK's */
 const S32	WM_MOUSEWHEEL = 0x020A;
@@ -1773,8 +1772,6 @@ void LLWindowWin32::gatherInput()
 	MSG		msg;
 	int		msg_count = 0;
 
-	LLMemType m1(LLMemType::MTYPE_GATHER_INPUT);
-
 	while ((msg_count < MAX_MESSAGE_PER_UPDATE) && PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
 	{
 		mCallbacks->handlePingWatchdog(this, "Main:TranslateGatherInput");
diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt
index 0031362210c1b9e7b02087331a4ec01a0b6659f5..04ea646100389fb7b343ec3ca1f4c536ae919787 100755
--- a/indra/newview/CMakeLists.txt
+++ b/indra/newview/CMakeLists.txt
@@ -212,7 +212,6 @@ set(viewer_SOURCE_FILES
     llfloaterinspect.cpp
     llfloaterinventory.cpp
     llfloaterjoystick.cpp
-    llfloaterlagmeter.cpp
     llfloaterland.cpp
     llfloaterlandholdings.cpp
     llfloatermap.cpp
@@ -333,7 +332,6 @@ set(viewer_SOURCE_FILES
     llmarketplacenotifications.cpp
     llmediactrl.cpp
     llmediadataclient.cpp
-    llmemoryview.cpp
     llmeshrepository.cpp
     llmimetypes.cpp
     llmorphview.cpp
@@ -788,7 +786,6 @@ set(viewer_HEADER_FILES
     llfloaterinspect.h
     llfloaterinventory.h
     llfloaterjoystick.h
-    llfloaterlagmeter.h
     llfloaterland.h
     llfloaterlandholdings.h
     llfloatermap.h
@@ -909,7 +906,6 @@ set(viewer_HEADER_FILES
     llmarketplacenotifications.h
     llmediactrl.h
     llmediadataclient.h
-    llmemoryview.h
     llmeshrepository.h
     llmimetypes.h
     llmorphview.h
diff --git a/indra/newview/app_settings/logcontrol.xml b/indra/newview/app_settings/logcontrol.xml
index 64122bbb6ce9ac782faf15ba47ad80ad2e57583d..92a241857e02e055ce8c0ba7a71d06257b86e635 100755
--- a/indra/newview/app_settings/logcontrol.xml
+++ b/indra/newview/app_settings/logcontrol.xml
@@ -48,6 +48,6 @@
 						-->
 						</array>
 				</map>
-			</array>
+      </array>
 	</map>
 </llsd>
diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index 5e42fc29f79769d94397f78347d81edada7e912f..7497a273ea72db867bd1cd230796ed249dc58ce1 100755
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -5179,7 +5179,7 @@
       <key>Comment</key>
       <string>Center the focal point of the minimap.</string>
       <key>Persist</key>
-      <integer>0</integer>
+      <integer>1</integer>
       <key>Type</key>
       <string>Boolean</string>
       <key>Value</key>
diff --git a/indra/newview/app_settings/shaders/class1/deferred/fxaaF.glsl b/indra/newview/app_settings/shaders/class1/deferred/fxaaF.glsl
index e02a7b405b866b7d18bec0698475a0dfafdbe474..2cef8f2a5d2a61b2d9857a91e2ac3ae4163da7e4 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/fxaaF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/fxaaF.glsl
@@ -2093,7 +2093,6 @@ uniform sampler2D diffuseMap;
 uniform vec2 rcp_screen_res;
 uniform vec4 rcp_frame_opt;
 uniform vec4 rcp_frame_opt2;
-uniform vec2 screen_res;
 VARYING vec2 vary_fragcoord;
 VARYING vec2 vary_tc;
 
diff --git a/indra/newview/gpu_table.txt b/indra/newview/gpu_table.txt
index 777d54a5c3037a0198f72bbcf97b29e231141dde..4ea139617d1f2d8da11b3c24d222121b6574127d 100644
--- a/indra/newview/gpu_table.txt
+++ b/indra/newview/gpu_table.txt
@@ -312,35 +312,65 @@ NVIDIA G 315					.*NVIDIA .*315(M)?.*						2		1
 NVIDIA G 320M					.*NVIDIA .*320(M)?.*						2		1
 NVIDIA G 405					.*NVIDIA .*405(M)?.*						1		1
 NVIDIA G 410M					.*NVIDIA .*410(M)?.*						1		1
-NVIDIA GT 120M					.*NVIDIA .*GT *120(M)?.*					2		1
+
+
+NVIDIA GT 120M					.*NVIDIA .*GT *120M.*						2		1
+NVIDIA GT 130M					.*NVIDIA .*GT *130M.*						2		1
+NVIDIA GT 140M					.*NVIDIA .*GT *140M.*						2		1
+NVIDIA GT 150M					.*NVIDIA .*GT *150M.*						2		1
+NVIDIA GT 160M					.*NVIDIA .*GT *160M.*						2		1
+NVIDIA GT 220M					.*NVIDIA .*GT *220M.*						2		1
+NVIDIA GT 230M					.*NVIDIA .*GT *230M.*						2		1
+NVIDIA GT 240M					.*NVIDIA .*GT *240M.*						2		1
+NVIDIA GT 250M					.*NVIDIA .*GT *250M.*						2		1
+NVIDIA GT 260M					.*NVIDIA .*GT *260M.*						2		1
+NVIDIA GT 320M					.*NVIDIA .*GT *320M.*						2		1
+NVIDIA GT 325M					.*NVIDIA .*GT *325M.*						0		1
+NVIDIA GT 330M					.*NVIDIA .*GT *330M.*						3		1
+NVIDIA GT 335M					.*NVIDIA .*GT *335M.*						1		1
+NVIDIA GT 340M					.*NVIDIA .*GT *340M.*						2		1
+NVIDIA GT 415M					.*NVIDIA .*GT *415M.*						2		1
+NVIDIA GT 420M					.*NVIDIA .*GT *420M.*						2		1
+NVIDIA GT 425M					.*NVIDIA .*GT *425M.*						3		1
+NVIDIA GT 430M					.*NVIDIA .*GT *430M.*						3		1
+NVIDIA GT 435M					.*NVIDIA .*GT *435M.*						3		1
+NVIDIA GT 440M					.*NVIDIA .*GT *440M.*						3		1
+NVIDIA GT 445M					.*NVIDIA .*GT *445M.*						3		1
+NVIDIA GT 450M					.*NVIDIA .*GT *450M.*						3		1
+NVIDIA GT 520M					.*NVIDIA .*GT *52.M.*						3		1
+NVIDIA GT 530M					.*NVIDIA .*GT *530M.*						3		1
+NVIDIA GT 540M					.*NVIDIA .*GT *54.M.*						3		1
+NVIDIA GT 550M					.*NVIDIA .*GT *550M.*						3		1
+NVIDIA GT 555M					.*NVIDIA .*GT *555M.*						3		1
 NVIDIA GT 120					.*NVIDIA .*GT.*120							2		1
-NVIDIA GT 130M					.*NVIDIA .*GT *130(M)?.*					2		1
-NVIDIA GT 140M					.*NVIDIA .*GT *140(M)?.*					2		1
-NVIDIA GT 150M					.*NVIDIA .*GT(S)? *150(M)?.*				2		1
-NVIDIA GT 160M					.*NVIDIA .*GT *160(M)?.*					2		1
-NVIDIA GT 220M					.*NVIDIA .*GT *220(M)?.*					2		1
-NVIDIA GT 230M					.*NVIDIA .*GT *230(M)?.*					2		1
-NVIDIA GT 240M					.*NVIDIA .*GT *240(M)?.*					2		1
-NVIDIA GT 250M					.*NVIDIA .*GT *250(M)?.*					2		1
-NVIDIA GT 260M					.*NVIDIA .*GT *260(M)?.*					2		1
-NVIDIA GT 320M					.*NVIDIA .*GT *320(M)?.*					2		1
-NVIDIA GT 325M					.*NVIDIA .*GT *325(M)?.*					0		1
-NVIDIA GT 330M					.*NVIDIA .*GT *330(M)?.*					3		1
-NVIDIA GT 335M					.*NVIDIA .*GT *335(M)?.*					1		1
-NVIDIA GT 340M					.*NVIDIA .*GT *340(M)?.*					2		1
-NVIDIA GT 415M					.*NVIDIA .*GT *415(M)?.*					2		1
-NVIDIA GT 420M					.*NVIDIA .*GT *420(M)?.*					2		1
-NVIDIA GT 425M					.*NVIDIA .*GT *425(M)?.*					3		1
-NVIDIA GT 430M					.*NVIDIA .*GT *430(M)?.*					3		1
-NVIDIA GT 435M					.*NVIDIA .*GT *435(M)?.*					3		1
-NVIDIA GT 440M					.*NVIDIA .*GT *440(M)?.*					3		1
-NVIDIA GT 445M					.*NVIDIA .*GT *445(M)?.*					3		1
-NVIDIA GT 450M					.*NVIDIA .*GT *450(M)?.*					3		1
-NVIDIA GT 520M					.*NVIDIA .*GT *52.(M)?.*					3		1
-NVIDIA GT 530M					.*NVIDIA .*GT *530(M)?.*					3		1
-NVIDIA GT 540M					.*NVIDIA .*GT *54.(M)?.*					3		1
-NVIDIA GT 550M					.*NVIDIA .*GT *550(M)?.*					3		1
-NVIDIA GT 555M					.*NVIDIA .*GT *555(M)?.*					3		1
+NVIDIA GT 130					.*NVIDIA .*GT *130.*						2		1
+NVIDIA GT 140					.*NVIDIA .*GT *140.*						2		1
+NVIDIA GT 150					.*NVIDIA .*GT *150.*						2		1
+NVIDIA GT 160					.*NVIDIA .*GT *160.*						2		1
+NVIDIA GT 220					.*NVIDIA .*GT *220.*						2		1
+NVIDIA GT 230					.*NVIDIA .*GT *230.*						2		1
+NVIDIA GT 240					.*NVIDIA .*GT *240.*						2		1
+NVIDIA GT 250					.*NVIDIA .*GT *250.*						2		1
+NVIDIA GT 260					.*NVIDIA .*GT *260.*						2		1
+NVIDIA GT 320					.*NVIDIA .*GT *320.*						2		1
+NVIDIA GT 325					.*NVIDIA .*GT *325.*						0		1
+NVIDIA GT 330					.*NVIDIA .*GT *330.*						3		1
+NVIDIA GT 335					.*NVIDIA .*GT *335.*						1		1
+NVIDIA GT 340					.*NVIDIA .*GT *340.*						2		1
+NVIDIA GT 415					.*NVIDIA .*GT *415.*						2		1
+NVIDIA GT 420					.*NVIDIA .*GT *420.*						2		1
+NVIDIA GT 425					.*NVIDIA .*GT *425.*						3		1
+NVIDIA GT 430					.*NVIDIA .*GT *430.*						3		1
+NVIDIA GT 435					.*NVIDIA .*GT *435.*						3		1
+NVIDIA GT 440					.*NVIDIA .*GT *440.*						3		1
+NVIDIA GT 445					.*NVIDIA .*GT *445.*						3		1
+NVIDIA GT 450					.*NVIDIA .*GT *450.*						3		1
+NVIDIA GT 520					.*NVIDIA .*GT *52..*						3		1
+NVIDIA GT 530					.*NVIDIA .*GT *530.*						3		1
+NVIDIA GT 540					.*NVIDIA .*GT *54..*						3		1
+NVIDIA GT 550					.*NVIDIA .*GT *550.*						3		1
+NVIDIA GT 555					.*NVIDIA .*GT *555.*						3		1
+NVIDIA GTS 150					.*NVIDIA .*GTS*150(M)?.*					2		1
 NVIDIA GTS 160M					.*NVIDIA .*GT(S)? *160(M)?.*				2		1
 NVIDIA GTS 240					.*NVIDIA .*GTS *24.*						3		1
 NVIDIA GTS 250					.*NVIDIA .*GTS *25.*						3		1
diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp
index c9458857d14e8cf46df6a0639cae1526f9978883..c3ac6151695f7e8541b140bf58a4f80e6e57f574 100644
--- a/indra/newview/llappviewer.cpp
+++ b/indra/newview/llappviewer.cpp
@@ -730,10 +730,6 @@ bool LLAppViewer::init()
 
     mAlloc.setProfilingEnabled(gSavedSettings.getBOOL("MemProfiling"));
 
-#if LL_RECORD_VIEWER_STATS
-	LLViewerStatsRecorder::initClass();
-#endif
-
     // *NOTE:Mani - LLCurl::initClass is not thread safe. 
     // Called before threads are created.
     LLCurl::initClass(gSavedSettings.getF32("CurlRequestTimeOut"), 
@@ -800,9 +796,6 @@ bool LLAppViewer::init()
 	//////////////////////////////////////////////////////////////////////////////
 	// *FIX: The following code isn't grouped into functions yet.
 
-	// Statistics / debug timer initialization
-	init_statistics();
-	
 	//
 	// Various introspection concerning the libs we're using - particularly
 	// the libs involved in getting to a full login screen.
@@ -1188,9 +1181,10 @@ static LLFastTimer::DeclareTimer FTM_SERVICE_CALLBACK("Callback");
 static LLFastTimer::DeclareTimer FTM_AGENT_AUTOPILOT("Autopilot");
 static LLFastTimer::DeclareTimer FTM_AGENT_UPDATE("Update");
 
+LLFastTimer::DeclareTimer FTM_FRAME("Frame", true);
+
 bool LLAppViewer::mainLoop()
 {
-	LLMemType mt1(LLMemType::MTYPE_MAIN);
 	mMainloopTimeout = new LLWatchdogTimeout();
 	
 	//-------------------------------------------
@@ -1226,7 +1220,8 @@ bool LLAppViewer::mainLoop()
 	// Handle messages
 	while (!LLApp::isExiting())
 	{
-		LLFastTimer::nextFrame(); // Should be outside of any timer instances
+		LLFastTimer _(FTM_FRAME);
+		LLFastTimer::nextFrame(); 
 
 		//clear call stack records
 		llclearcallstacks;
@@ -1290,7 +1285,6 @@ bool LLAppViewer::mainLoop()
 					&& (gHeadlessClient || !gViewerWindow->getShowProgress())
 					&& !gFocusMgr.focusLocked())
 				{
-					LLMemType mjk(LLMemType::MTYPE_JOY_KEY);
 					joystick->scanJoystick();
 					gKeyboard->scanKeyboard();
 				}
@@ -1304,7 +1298,6 @@ bool LLAppViewer::mainLoop()
 
 					if (gAres != NULL && gAres->isInitialized())
 					{
-						LLMemType mt_ip(LLMemType::MTYPE_IDLE_PUMP);
 						pingMainloopTimeout("Main:ServicePump");				
 						LLFastTimer t4(FTM_PUMP);
 						{
@@ -1354,7 +1347,6 @@ bool LLAppViewer::mainLoop()
 
 			// Sleep and run background threads
 			{
-				LLMemType mt_sleep(LLMemType::MTYPE_SLEEP);
 				LLFastTimer t2(FTM_SLEEP);
 				
 				// yield some time to the os based on command line option
@@ -1918,10 +1910,6 @@ bool LLAppViewer::cleanup()
 
 	LLMetricPerformanceTesterBasic::cleanClass() ;
 
-#if LL_RECORD_VIEWER_STATS
-	LLViewerStatsRecorder::cleanupClass();
-#endif
-
 	llinfos << "Cleaning up Media and Textures" << llendflush;
 
 	//Note:
@@ -3161,8 +3149,6 @@ void LLAppViewer::writeSystemInfo()
 	LL_INFOS("SystemInfo") << "OS: " << getOSInfo().getOSStringSimple() << LL_ENDL;
 	LL_INFOS("SystemInfo") << "OS info: " << getOSInfo() << LL_ENDL;
 
-	LL_INFOS("SystemInfo") << "Timers: " << LLFastTimer::sClockType << LL_ENDL;
-
 	writeDebugInfo(); // Save out debug_info.log early, in case of crash.
 }
 
@@ -4147,7 +4133,6 @@ static LLFastTimer::DeclareTimer FTM_VLMANAGER("VL Manager");
 ///////////////////////////////////////////////////////
 void LLAppViewer::idle()
 {
-	LLMemType mt_idle(LLMemType::MTYPE_IDLE);
 	pingMainloopTimeout("Main:Idle");
 	
 	// Update frame timers
@@ -4260,7 +4245,6 @@ void LLAppViewer::idle()
 		// of SEND_STATS_PERIOD so that the initial stats report will
 		// be sent immediately.
 		static LLFrameStatsTimer viewer_stats_timer(SEND_STATS_PERIOD);
-		reset_statistics();
 
 		// Update session stats every large chunk of time
 		// *FIX: (???) SAMANTHA
@@ -4320,7 +4304,7 @@ void LLAppViewer::idle()
 		idle_afk_check();
 
 		//  Update statistics for this frame
-		update_statistics(gFrameCount);
+		update_statistics();
 	}
 
 	////////////////////////////////////////
@@ -4746,7 +4730,6 @@ static LLFastTimer::DeclareTimer FTM_CHECK_REGION_CIRCUIT("Check Region Circuit"
 
 void LLAppViewer::idleNetwork()
 {
-	LLMemType mt_in(LLMemType::MTYPE_IDLE_NETWORK);
 	pingMainloopTimeout("idleNetwork");
 	
 	gObjectList.mNumNewObjects = 0;
diff --git a/indra/newview/llappviewer.h b/indra/newview/llappviewer.h
index ae3c795d1e2d9ced65bc77cfd79072a2b33adbab..cdf4426469c48fe0f51a48bf50b42dd7e829e4a0 100644
--- a/indra/newview/llappviewer.h
+++ b/indra/newview/llappviewer.h
@@ -41,6 +41,9 @@ class LLTextureFetch;
 class LLWatchdogTimeout;
 class LLUpdaterService;
 
+extern LLFastTimer::DeclareTimer FTM_FRAME;
+
+
 class LLAppViewer : public LLApp
 {
 public:
diff --git a/indra/newview/llappviewerlinux.cpp b/indra/newview/llappviewerlinux.cpp
index e8d8efdc0a9c2dc03b82180fd9ea4d6ea33fbbb5..869565216864d5c81633d6e3e8ebf3079f47cb4c 100644
--- a/indra/newview/llappviewerlinux.cpp
+++ b/indra/newview/llappviewerlinux.cpp
@@ -31,7 +31,6 @@
 #include "llcommandlineparser.h"
 
 #include "lldiriterator.h"
-#include "llmemtype.h"
 #include "llurldispatcher.h"		// SLURL from other app instance
 #include "llviewernetwork.h"
 #include "llviewercontrol.h"
@@ -71,8 +70,6 @@ static void exceptionTerminateHandler()
 
 int main( int argc, char **argv ) 
 {
-	LLMemType mt1(LLMemType::MTYPE_STARTUP);
-
 #if LL_SOLARIS && defined(__sparc)
 	asm ("ta\t6");		 // NOTE:  Make sure memory alignment is enforced on SPARC
 #endif
diff --git a/indra/newview/llappviewermacosx.cpp b/indra/newview/llappviewermacosx.cpp
index c2916717bd415f80fa6243c4780ec117229f145e..4d340cafa9dfed9769b5a56382e32886a611fd35 100644
--- a/indra/newview/llappviewermacosx.cpp
+++ b/indra/newview/llappviewermacosx.cpp
@@ -33,8 +33,6 @@
 #include "llappviewermacosx.h"
 #include "llcommandlineparser.h"
 
-#include "llmemtype.h"
-
 #include "llviewernetwork.h"
 #include "llviewercontrol.h"
 #include "llmd5.h"
@@ -67,8 +65,6 @@ namespace
 
 int main( int argc, char **argv ) 
 {
-	LLMemType mt1(LLMemType::MTYPE_STARTUP);
-
 #if LL_SOLARIS && defined(__sparc)
 	asm ("ta\t6");		 // NOTE:  Make sure memory alignment is enforced on SPARC
 #endif
diff --git a/indra/newview/llappviewerwin32.cpp b/indra/newview/llappviewerwin32.cpp
index 53c77fa22e52e09d13448a06c980c3903a78f488..3956e88ced24aaba5d3bc8307129052f0f929726 100644
--- a/indra/newview/llappviewerwin32.cpp
+++ b/indra/newview/llappviewerwin32.cpp
@@ -32,7 +32,6 @@
 
 #include "llappviewerwin32.h"
 
-#include "llmemtype.h"
 
 #include "llwindowwin32.h" // *FIX: for setting gIconResource.
 #include "llgl.h"
@@ -117,8 +116,6 @@ int APIENTRY WINMAIN(HINSTANCE hInstance,
 	#endif // _DEBUG
 #endif // INCLUDE_VLD
 
-	LLMemType mt1(LLMemType::MTYPE_STARTUP);
-
 	const S32 MAX_HEAPS = 255;
 	DWORD heap_enable_lfh_error[MAX_HEAPS];
 	S32 num_heaps = 0;
diff --git a/indra/newview/lldebugview.cpp b/indra/newview/lldebugview.cpp
index 29b1d23d7df24737563a50305aeba8f86510c506..aeecf054b8ba5245c1f0cf800bd39057a355e90f 100644
--- a/indra/newview/lldebugview.cpp
+++ b/indra/newview/lldebugview.cpp
@@ -30,7 +30,6 @@
 
 // library includes
 #include "llfasttimerview.h"
-#include "llmemoryview.h"
 #include "llconsole.h"
 #include "lltextureview.h"
 #include "llresmgr.h"
@@ -38,7 +37,6 @@
 #include "llviewercontrol.h"
 #include "llviewerwindow.h"
 #include "llappviewer.h"
-#include "llmemoryview.h"
 #include "llsceneview.h"
 #include "llviewertexture.h"
 #include "llfloaterreg.h"
@@ -103,13 +101,6 @@ void LLDebugView::init()
 	
 	r.setLeftTopAndSize(25, rect.getHeight() - 50, (S32) (gViewerWindow->getWindowRectScaled().getWidth() * 0.75f), 
 									 (S32) (gViewerWindow->getWindowRectScaled().getHeight() * 0.75f));
-	LLMemoryView::Params mp;
-	mp.name("memory");
-	mp.rect(r);
-	mp.follows.flags(FOLLOWS_TOP | FOLLOWS_LEFT);
-	mp.visible(false);
-	mMemoryView = LLUICtrlFactory::create<LLMemoryView>(mp);
-	addChild(mMemoryView);
 
 	r.set(150, rect.getHeight() - 50, 820, 100);
 	LLTextureView::Params tvp;
diff --git a/indra/newview/lldrawable.cpp b/indra/newview/lldrawable.cpp
index 4eda2b92b3224d52c891471dbe5ec981e1b004a9..46ec1abec18ced1e850df4bf6a0c025a0f00ef08 100644
--- a/indra/newview/lldrawable.cpp
+++ b/indra/newview/lldrawable.cpp
@@ -256,8 +256,6 @@ S32 LLDrawable::findReferences(LLDrawable *drawablep)
 
 LLFace*	LLDrawable::addFace(LLFacePool *poolp, LLViewerTexture *texturep)
 {
-	LLMemType mt(LLMemType::MTYPE_DRAWABLE);
-	
 	LLFace *face = new LLFace(this, mVObjp);
 	if (!face) llerrs << "Allocating new Face: " << mFaces.size() << llendl;
 	
@@ -280,8 +278,6 @@ LLFace*	LLDrawable::addFace(LLFacePool *poolp, LLViewerTexture *texturep)
 
 LLFace*	LLDrawable::addFace(const LLTextureEntry *te, LLViewerTexture *texturep)
 {
-	LLMemType mt(LLMemType::MTYPE_DRAWABLE);
-	
 	LLFace *face;
 	face = new LLFace(this, mVObjp);
 
@@ -763,8 +759,6 @@ void LLDrawable::updateDistance(LLCamera& camera, bool force_update)
 
 void LLDrawable::updateTexture()
 {
-	LLMemType mt(LLMemType::MTYPE_DRAWABLE);
-	
 	if (isDead())
 	{
 		llwarns << "Dead drawable updating texture!" << llendl;
diff --git a/indra/newview/lldrawable.h b/indra/newview/lldrawable.h
index b1e32bdb5b95a9eb445eb3079da0863e86f52133..4608d16fec66cc1ccfb2cbe1916e41238d2cd91a 100644
--- a/indra/newview/lldrawable.h
+++ b/indra/newview/lldrawable.h
@@ -38,7 +38,6 @@
 #include "llvector4a.h"
 #include "llquaternion.h"
 #include "xform.h"
-#include "llmemtype.h"
 #include "lldarray.h"
 #include "llviewerobject.h"
 #include "llrect.h"
@@ -87,7 +86,6 @@ class LLDrawable : public LLRefCount
 	}
 
 	LLDrawable()				{ init(); }
-	MEM_TYPE_NEW(LLMemType::MTYPE_DRAWABLE);
 	
 	void markDead();			// Mark this drawable as dead
 	BOOL isDead() const			{ return isState(DEAD); }
diff --git a/indra/newview/lldrawpoolavatar.cpp b/indra/newview/lldrawpoolavatar.cpp
index 730ad1a364b105484254777ca5c485de35ed930d..59161d063eb1090dca9110b3d9fe907ae553ba1b 100644
--- a/indra/newview/lldrawpoolavatar.cpp
+++ b/indra/newview/lldrawpoolavatar.cpp
@@ -1272,6 +1272,9 @@ void LLDrawPoolAvatar::updateRiggedFaceVertexBuffer(LLVOAvatar* avatar, LLFace*
 		face->setGeomIndex(0);
 		face->setIndicesIndex(0);
 		
+		//rigged faces do not batch textures
+		face->setTextureIndex(255);
+
 		if (buffer.isNull() || buffer->getTypeMask() != data_mask || !buffer->isWriteable())
 		{ //make a new buffer
 			if (sShaderLevel > 0)
diff --git a/indra/newview/lldrawpoolbump.cpp b/indra/newview/lldrawpoolbump.cpp
index a264eae30263c14ffd60d04491e92ad7eb909d8e..1b0b11298c302d0b95c8ed48ec56532d7c001ed1 100644
--- a/indra/newview/lldrawpoolbump.cpp
+++ b/indra/newview/lldrawpoolbump.cpp
@@ -1192,7 +1192,7 @@ static LLFastTimer::DeclareTimer FTM_BUMP_SOURCE_MIN_MAX("Min/Max");
 static LLFastTimer::DeclareTimer FTM_BUMP_SOURCE_RGB2LUM("RGB to Luminance");
 static LLFastTimer::DeclareTimer FTM_BUMP_SOURCE_RESCALE("Rescale");
 static LLFastTimer::DeclareTimer FTM_BUMP_SOURCE_GEN_NORMAL("Generate Normal");
-static LLFastTimer::DeclareTimer FTM_BUMP_SOURCE_CREATE("Create");
+static LLFastTimer::DeclareTimer FTM_BUMP_SOURCE_CREATE("Bump Source Create");
 
 // static
 void LLBumpImageList::onSourceLoaded( BOOL success, LLViewerTexture *src_vi, LLImageRaw* src, LLUUID& source_asset_id, EBumpEffect bump_code )
diff --git a/indra/newview/llface.cpp b/indra/newview/llface.cpp
index 4a0c94df33fa40d789f41c70656774e0901cd19e..c2c9183e572d54e8e8654e1e58c274286087351a 100644
--- a/indra/newview/llface.cpp
+++ b/indra/newview/llface.cpp
@@ -262,8 +262,6 @@ void LLFace::setPool(LLFacePool* pool)
 
 void LLFace::setPool(LLFacePool* new_pool, LLViewerTexture *texturep)
 {
-	LLMemType mt1(LLMemType::MTYPE_DRAWABLE);
-	
 	if (!new_pool)
 	{
 		llerrs << "Setting pool to null!" << llendl;
@@ -441,8 +439,6 @@ U16 LLFace::getGeometryAvatar(
 						LLStrider<F32>		 &vertex_weights,
 						LLStrider<LLVector4> &clothing_weights)
 {
-	LLMemType mt1(LLMemType::MTYPE_DRAWABLE);
-
 	if (mVertexBuffer.notNull())
 	{
 		mVertexBuffer->getVertexStrider      (vertices, mGeomIndex, mGeomCount);
@@ -458,8 +454,6 @@ U16 LLFace::getGeometryAvatar(
 U16 LLFace::getGeometry(LLStrider<LLVector3> &vertices, LLStrider<LLVector3> &normals,
 					    LLStrider<LLVector2> &tex_coords, LLStrider<U16> &indicesp)
 {
-	LLMemType mt1(LLMemType::MTYPE_DRAWABLE);
-	
 	if (mVertexBuffer.notNull())
 	{
 		mVertexBuffer->getVertexStrider(vertices,   mGeomIndex, mGeomCount);
@@ -769,8 +763,6 @@ bool less_than_max_mag(const LLVector4a& vec)
 BOOL LLFace::genVolumeBBoxes(const LLVolume &volume, S32 f,
 								const LLMatrix4& mat_vert_in, const LLMatrix3& mat_normal_in, BOOL global_volume)
 {
-	LLMemType mt1(LLMemType::MTYPE_DRAWABLE);
-
 	//get bounding box
 	if (mDrawablep->isState(LLDrawable::REBUILD_VOLUME | LLDrawable::REBUILD_POSITION | LLDrawable::REBUILD_RIGGED))
 	{
diff --git a/indra/newview/llfasttimerview.cpp b/indra/newview/llfasttimerview.cpp
index 9664aa7dbe2e5026cf17a6ff171fe1452397445e..4dfb93f1bca3359ace15787dc845598b2a710266 100644
--- a/indra/newview/llfasttimerview.cpp
+++ b/indra/newview/llfasttimerview.cpp
@@ -95,7 +95,6 @@ LLFastTimerView::LLFastTimerView(const LLSD& key)
 	mHoverBarIndex = -1;
 	FTV_NUM_TIMERS = LLFastTimer::NamedTimer::instanceCount();
 	mPrintStats = -1;	
-	mAverageCyclesPerTimer = 0;
 }
 
 void LLFastTimerView::onPause()
@@ -161,7 +160,7 @@ LLFastTimer::NamedTimer* LLFastTimerView::getLegendID(S32 y)
 
 BOOL LLFastTimerView::handleDoubleClick(S32 x, S32 y, MASK mask)
 {
-	for(timer_tree_iterator_t it = begin_timer_tree(LLFastTimer::NamedTimer::getRootNamedTimer());
+	for(timer_tree_iterator_t it = begin_timer_tree(getFrameTimer());
 		it != end_timer_tree();
 		++it)
 	{
@@ -258,7 +257,7 @@ BOOL LLFastTimerView::handleHover(S32 x, S32 y, MASK mask)
 		}
 
 		S32 i = 0;
-		for(timer_tree_iterator_t it = begin_timer_tree(LLFastTimer::NamedTimer::getRootNamedTimer());
+		for(timer_tree_iterator_t it = begin_timer_tree(getFrameTimer());
 			it != end_timer_tree();
 			++it, ++i)
 		{
@@ -379,12 +378,6 @@ void LLFastTimerView::draw()
 	S32 xleft = margin;
 	S32 ytop = margin;
 	
-	mAverageCyclesPerTimer = LLFastTimer::sTimerCalls == 0 
-		? 0 
-		: llround(lerp((F32)mAverageCyclesPerTimer, (F32)(LLFastTimer::sTimerCycles / (U64)LLFastTimer::sTimerCalls), 0.1f));
-	LLFastTimer::sTimerCycles = 0;
-	LLFastTimer::sTimerCalls = 0;
-
 	// Draw some help
 	{
 		
@@ -392,10 +385,6 @@ void LLFastTimerView::draw()
 		y = height - ytop;
 		texth = (S32)LLFontGL::getFontMonospace()->getLineHeight();
 
-#if TIME_FAST_TIMERS
-		tdesc = llformat("Cycles per timer call: %d", mAverageCyclesPerTimer);
-		LLFontGL::getFontMonospace()->renderUTF8(tdesc, 0, x, y, LLColor4::white, LLFontGL::LEFT, LLFontGL::TOP);
-#else
 		char modedesc[][32] = {
 			"2 x Average ",
 			"Max         ",
@@ -419,7 +408,6 @@ void LLFastTimerView::draw()
 
 		LLFontGL::getFontMonospace()->renderUTF8(std::string("[Right-Click log selected] [ALT-Click toggle counts] [ALT-SHIFT-Click sub hidden]"),
 										 0, x, y, LLColor4::white, LLFontGL::LEFT, LLFontGL::TOP);
-#endif
 		y -= (texth + 2);
 	}
 
@@ -431,11 +419,11 @@ void LLFastTimerView::draw()
 
 	y -= (texth + 2);
 
-	sTimerColors[&LLFastTimer::NamedTimer::getRootNamedTimer()] = LLColor4::grey;
+	sTimerColors[&getFrameTimer()] = LLColor4::grey;
 
 	F32 hue = 0.f;
 
-	for (timer_tree_iterator_t it = begin_timer_tree(LLFastTimer::NamedTimer::getRootNamedTimer());
+	for (timer_tree_iterator_t it = begin_timer_tree(getFrameTimer());
 		it != timer_tree_iterator_t();
 		++it)
 	{
@@ -460,7 +448,7 @@ void LLFastTimerView::draw()
 		S32 cur_line = 0;
 		ft_display_idx.clear();
 		std::map<LLFastTimer::NamedTimer*, S32> display_line;
-		for (timer_tree_iterator_t it = begin_timer_tree(LLFastTimer::NamedTimer::getRootNamedTimer());
+		for (timer_tree_iterator_t it = begin_timer_tree(getFrameTimer());
 			it != timer_tree_iterator_t();
 			++it)
 		{
@@ -526,6 +514,7 @@ void LLFastTimerView::draw()
 			while(!is_child_of_hover_item && next_parent)
 			{
 				is_child_of_hover_item = (mHoverID == next_parent);
+				if (next_parent->getParent() == next_parent) break;
 				next_parent = next_parent->getParent();
 			}
 
@@ -570,7 +559,7 @@ void LLFastTimerView::draw()
 		U64 totalticks;
 		if (!LLFastTimer::sPauseHistory)
 		{
-			U64 ticks = LLFastTimer::NamedTimer::getRootNamedTimer().getHistoricalCount(mScrollIndex);
+			U64 ticks = getFrameTimer().getHistoricalCount(mScrollIndex);
 
 			if (LLFastTimer::getCurFrameIndex() >= 10)
 			{
@@ -610,7 +599,7 @@ void LLFastTimerView::draw()
 			totalticks = 0;
 			for (S32 j=0; j<histmax; j++)
 			{
-				U64 ticks = LLFastTimer::NamedTimer::getRootNamedTimer().getHistoricalCount(j);
+				U64 ticks = getFrameTimer().getHistoricalCount(j);
 
 				if (ticks > totalticks)
 					totalticks = ticks;
@@ -716,7 +705,7 @@ void LLFastTimerView::draw()
 			LLFastTimer::NamedTimer* prev_id = NULL;
 
 			S32 i = 0;
-			for(timer_tree_iterator_t it = begin_timer_tree(LLFastTimer::NamedTimer::getRootNamedTimer());
+			for(timer_tree_iterator_t it = begin_timer_tree(getFrameTimer());
 				it != end_timer_tree();
 				++it, ++i)
 			{
@@ -793,6 +782,7 @@ void LLFastTimerView::draw()
 					while(!is_child_of_hover_item && next_parent)
 					{
 						is_child_of_hover_item = (mHoverID == next_parent);
+						if (next_parent->getParent() == next_parent) break;
 						next_parent = next_parent->getParent();
 					}
 
@@ -879,7 +869,7 @@ void LLFastTimerView::draw()
 			}
 			
 			U64 cur_max = 0;
-			for(timer_tree_iterator_t it = begin_timer_tree(LLFastTimer::NamedTimer::getRootNamedTimer());
+			for(timer_tree_iterator_t it = begin_timer_tree(getFrameTimer());
 				it != end_timer_tree();
 				++it)
 			{
@@ -980,7 +970,7 @@ void LLFastTimerView::draw()
 	{
 		std::string legend_stat;
 		bool first = true;
-		for(timer_tree_iterator_t it = begin_timer_tree(LLFastTimer::NamedTimer::getRootNamedTimer());
+		for(timer_tree_iterator_t it = begin_timer_tree(getFrameTimer());
 			it != end_timer_tree();
 			++it)
 		{
@@ -1002,7 +992,7 @@ void LLFastTimerView::draw()
 
 		std::string timer_stat;
 		first = true;
-		for(timer_tree_iterator_t it = begin_timer_tree(LLFastTimer::NamedTimer::getRootNamedTimer());
+		for(timer_tree_iterator_t it = begin_timer_tree(getFrameTimer());
 			it != end_timer_tree();
 			++it)
 		{
@@ -1563,3 +1553,9 @@ void	LLFastTimerView::onClickCloseBtn()
 	setVisible(false);
 }
 
+LLFastTimer::NamedTimer& LLFastTimerView::getFrameTimer()
+{
+	return FTM_FRAME.getNamedTimer();
+}
+
+
diff --git a/indra/newview/llfasttimerview.h b/indra/newview/llfasttimerview.h
index a349e7ad4c9324c3e3e8a7f3e5273c872f263c83..5766cfa0b0525f0012d75c641dbed57e2d60f25b 100644
--- a/indra/newview/llfasttimerview.h
+++ b/indra/newview/llfasttimerview.h
@@ -46,6 +46,7 @@ class LLFastTimerView : public LLFloater
 	static LLSD analyzePerformanceLogDefault(std::istream& is) ;
 	static void exportCharts(const std::string& base, const std::string& target);
 	void onPause();
+	LLFastTimer::NamedTimer& getFrameTimer();
 
 public:
 
@@ -90,7 +91,6 @@ class LLFastTimerView : public LLFloater
 	S32 mHoverBarIndex;
 	LLFrameTimer mHighlightTimer;
 	S32 mPrintStats;
-	S32 mAverageCyclesPerTimer;
 	LLRect mGraphRect;
 };
 
diff --git a/indra/newview/llflexibleobject.cpp b/indra/newview/llflexibleobject.cpp
index ef412a6bbf2d8a3aeec0b92edeb7579aa2209b54..a37e27363ff110aac0024b5bd26303e24157b20b 100644
--- a/indra/newview/llflexibleobject.cpp
+++ b/indra/newview/llflexibleobject.cpp
@@ -48,7 +48,7 @@ std::vector<LLVolumeImplFlexible*> LLVolumeImplFlexible::sInstanceList;
 std::vector<S32> LLVolumeImplFlexible::sUpdateDelay;
 
 static LLFastTimer::DeclareTimer FTM_FLEXIBLE_REBUILD("Rebuild");
-static LLFastTimer::DeclareTimer FTM_DO_FLEXIBLE_UPDATE("Update");
+static LLFastTimer::DeclareTimer FTM_DO_FLEXIBLE_UPDATE("Flexible Update");
 
 // LLFlexibleObjectData::pack/unpack now in llprimitive.cpp
 
@@ -364,7 +364,7 @@ void LLVolumeImplFlexible::doIdleUpdate()
 				if	(visible)
 				{
 					if (!drawablep->isState(LLDrawable::IN_REBUILD_Q1) &&
-					mVO->getPixelArea() > 256.f)
+						pixel_area > 256.f)
 					{
 						U32 id;
 				
diff --git a/indra/newview/llfloaterbulkpermission.cpp b/indra/newview/llfloaterbulkpermission.cpp
index 90f40628a824c180a450f8a356570adbe9d1f08c..39b6e465f3fa32e27cc608f0fe32020b4bbec5d3 100644
--- a/indra/newview/llfloaterbulkpermission.cpp
+++ b/indra/newview/llfloaterbulkpermission.cpp
@@ -336,8 +336,6 @@ void LLFloaterBulkPermission::handleInventory(LLViewerObject* viewer_obj, LLInve
 
 void LLFloaterBulkPermission::updateInventory(LLViewerObject* object, LLViewerInventoryItem* item, U8 key, bool is_new)
 {
-	LLMemType mt(LLMemType::MTYPE_OBJECT);
-	
 	// This slices the object into what we're concerned about on the viewer. 
 	// The simulator will take the permissions and transfer ownership.
 	LLPointer<LLViewerInventoryItem> task_item =
diff --git a/indra/newview/llfloatercamera.cpp b/indra/newview/llfloatercamera.cpp
index 21b58d3e3dcf2f0c7115a57f9a48da6bbbf3f000..c85d048c5a9163aa98848ac7161b3cb210f3e5db 100644
--- a/indra/newview/llfloatercamera.cpp
+++ b/indra/newview/llfloatercamera.cpp
@@ -330,6 +330,10 @@ void LLFloaterCamera::onClose(bool app_quitting)
 	//We don't care of camera mode if app is quitting
 	if(app_quitting)
 		return;
+	// It is necessary to reset mCurrMode to CAMERA_CTRL_MODE_PAN so 
+	// to avoid seeing an empty floater when reopening the control.
+	if (mCurrMode == CAMERA_CTRL_MODE_FREE_CAMERA)
+		mCurrMode = CAMERA_CTRL_MODE_PAN;
 	// When mCurrMode is in CAMERA_CTRL_MODE_PAN
 	// switchMode won't modify mPrevMode, so force it here.
 	// It is needed to correctly return to previous mode on open, see EXT-2727.
diff --git a/indra/newview/llfloaterjoystick.cpp b/indra/newview/llfloaterjoystick.cpp
index c37798c330d5186d86950978566c027831c43f41..d0c22d25f2b4d25f66067ff43b833df6ecaea89f 100644
--- a/indra/newview/llfloaterjoystick.cpp
+++ b/indra/newview/llfloaterjoystick.cpp
@@ -33,6 +33,7 @@
 #include "llerror.h"
 #include "llrect.h"
 #include "llstring.h"
+#include "llstat.h"
 
 // project includes
 #include "lluictrlfactory.h"
@@ -83,7 +84,8 @@ BOOL LLFloaterJoystick::postBuild()
 
 	for (U32 i = 0; i < 6; i++)
 	{
-		mAxisStats[i] = new LLStat(4);
+		std::string stat_name(llformat("Joystick axis %d", i));
+		mAxisStats[i] = new LLStat(stat_name, 4);
 		std::string axisname = llformat("axis%d", i);
 		mAxisStatsBar[i] = getChild<LLStatBar>(axisname);
 		if (mAxisStatsBar[i])
diff --git a/indra/newview/llfloaterlagmeter.cpp b/indra/newview/llfloaterlagmeter.cpp
deleted file mode 100644
index 68b1770bb2c40a444d6df496d90ad0a799b7d6d2..0000000000000000000000000000000000000000
--- a/indra/newview/llfloaterlagmeter.cpp
+++ /dev/null
@@ -1,375 +0,0 @@
-/** 
- * @file llfloaterlagmeter.cpp
- * @brief The "Lag-o-Meter" floater used to tell users what is causing lag.
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- * 
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- * 
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- * 
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * 
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
- * $/LicenseInfo$
- */
-
-#include "llviewerprecompiledheaders.h"
-
-#include "llfloaterlagmeter.h"
-
-#include "lluictrlfactory.h"
-#include "llviewerstats.h"
-#include "llviewertexture.h"
-#include "llviewercontrol.h"
-#include "llappviewer.h"
-
-#include "lltexturefetch.h"
-
-#include "llbutton.h"
-#include "llfocusmgr.h"
-#include "lltextbox.h"
-
-const std::string LAG_CRITICAL_IMAGE_NAME = "lag_status_critical.tga";
-const std::string LAG_WARNING_IMAGE_NAME  = "lag_status_warning.tga";
-const std::string LAG_GOOD_IMAGE_NAME     = "lag_status_good.tga";
-
-LLFloaterLagMeter::LLFloaterLagMeter(const LLSD& key)
-	:	LLFloater(key)
-{
-	mCommitCallbackRegistrar.add("LagMeter.ClickShrink",  boost::bind(&LLFloaterLagMeter::onClickShrink, this));	
-}
-
-BOOL LLFloaterLagMeter::postBuild()
-{
-	// Don't let this window take keyboard focus -- it's confusing to
-	// lose arrow-key driving when testing lag.
-	setIsChrome(TRUE);
-	
-	// were we shrunk last time?
-	if (isShrunk())
-	{
-		onClickShrink();
-	}
-	
-	mClientButton = getChild<LLButton>("client_lagmeter");
-	mClientText = getChild<LLTextBox>("client_text");
-	mClientCause = getChild<LLTextBox>("client_lag_cause");
-
-	mNetworkButton = getChild<LLButton>("network_lagmeter");
-	mNetworkText = getChild<LLTextBox>("network_text");
-	mNetworkCause = getChild<LLTextBox>("network_lag_cause");
-
-	mServerButton = getChild<LLButton>("server_lagmeter");
-	mServerText = getChild<LLTextBox>("server_text");
-	mServerCause = getChild<LLTextBox>("server_lag_cause");
-
-	std::string config_string = getString("client_frame_rate_critical_fps", mStringArgs);
-	mClientFrameTimeCritical = 1.0f / (float)atof( config_string.c_str() );
-	config_string = getString("client_frame_rate_warning_fps", mStringArgs);
-	mClientFrameTimeWarning = 1.0f / (float)atof( config_string.c_str() );
-
-	config_string = getString("network_packet_loss_critical_pct", mStringArgs);
-	mNetworkPacketLossCritical = (float)atof( config_string.c_str() );
-	config_string = getString("network_packet_loss_warning_pct", mStringArgs);
-	mNetworkPacketLossWarning = (float)atof( config_string.c_str() );
-
-	config_string = getString("network_ping_critical_ms", mStringArgs);
-	mNetworkPingCritical = (float)atof( config_string.c_str() );
-	config_string = getString("network_ping_warning_ms", mStringArgs);
-	mNetworkPingWarning = (float)atof( config_string.c_str() );
-	config_string = getString("server_frame_rate_critical_fps", mStringArgs);
-
-	mServerFrameTimeCritical = 1000.0f / (float)atof( config_string.c_str() );
-	config_string = getString("server_frame_rate_warning_fps", mStringArgs);
-	mServerFrameTimeWarning = 1000.0f / (float)atof( config_string.c_str() );
-	config_string = getString("server_single_process_max_time_ms", mStringArgs);
-	mServerSingleProcessMaxTime = (float)atof( config_string.c_str() );
-
-//	mShrunk = false;
-	config_string = getString("max_width_px", mStringArgs);
-	mMaxWidth = atoi( config_string.c_str() );
-	config_string = getString("min_width_px", mStringArgs);
-	mMinWidth = atoi( config_string.c_str() );
-
-	mStringArgs["[CLIENT_FRAME_RATE_CRITICAL]"] = getString("client_frame_rate_critical_fps");
-	mStringArgs["[CLIENT_FRAME_RATE_WARNING]"] = getString("client_frame_rate_warning_fps");
-
-	mStringArgs["[NETWORK_PACKET_LOSS_CRITICAL]"] = getString("network_packet_loss_critical_pct");
-	mStringArgs["[NETWORK_PACKET_LOSS_WARNING]"] = getString("network_packet_loss_warning_pct");
-
-	mStringArgs["[NETWORK_PING_CRITICAL]"] = getString("network_ping_critical_ms");
-	mStringArgs["[NETWORK_PING_WARNING]"] = getString("network_ping_warning_ms");
-
-	mStringArgs["[SERVER_FRAME_RATE_CRITICAL]"] = getString("server_frame_rate_critical_fps");
-	mStringArgs["[SERVER_FRAME_RATE_WARNING]"] = getString("server_frame_rate_warning_fps");
-
-//	childSetAction("minimize", onClickShrink, this);
-	updateControls(isShrunk()); // if expanded append colon to the labels (EXT-4079)
-
-	return TRUE;
-}
-LLFloaterLagMeter::~LLFloaterLagMeter()
-{
-	// save shrunk status for next time
-//	gSavedSettings.setBOOL("LagMeterShrunk", mShrunk);
-	// expand so we save the large window rectangle
-	if (isShrunk())
-	{
-		onClickShrink();
-	}
-}
-
-void LLFloaterLagMeter::draw()
-{
-	determineClient();
-	determineNetwork();
-	determineServer();
-
-	LLFloater::draw();
-}
-
-void LLFloaterLagMeter::determineClient()
-{
-	F32 client_frame_time = LLViewerStats::getInstance()->mFPSStat.getMeanDuration();
-	bool find_cause = false;
-
-	if (!gFocusMgr.getAppHasFocus())
-	{
-		mClientButton->setImageUnselected(LLUI::getUIImage(LAG_GOOD_IMAGE_NAME));
-		mClientText->setText( getString("client_frame_time_window_bg_msg", mStringArgs) );
-		mClientCause->setText( LLStringUtil::null );
-	}
-	else if(client_frame_time >= mClientFrameTimeCritical)
-	{
-		mClientButton->setImageUnselected(LLUI::getUIImage(LAG_CRITICAL_IMAGE_NAME));
-		mClientText->setText( getString("client_frame_time_critical_msg", mStringArgs) );
-		find_cause = true;
-	}
-	else if(client_frame_time >= mClientFrameTimeWarning)
-	{
-		mClientButton->setImageUnselected(LLUI::getUIImage(LAG_WARNING_IMAGE_NAME));
-		mClientText->setText( getString("client_frame_time_warning_msg", mStringArgs) );
-		find_cause = true;
-	}
-	else
-	{
-		mClientButton->setImageUnselected(LLUI::getUIImage(LAG_GOOD_IMAGE_NAME));
-		mClientText->setText( getString("client_frame_time_normal_msg", mStringArgs) );
-		mClientCause->setText( LLStringUtil::null );
-	}	
-
-	if(find_cause)
-	{
-		if(gSavedSettings.getF32("RenderFarClip") > 128)
-		{
-			mClientCause->setText( getString("client_draw_distance_cause_msg", mStringArgs) );
-		}
-		else if(LLAppViewer::instance()->getTextureFetch()->getNumRequests() > 2)
-		{
-			mClientCause->setText( getString("client_texture_loading_cause_msg", mStringArgs) );
-		}
-		else if((BYTES_TO_MEGA_BYTES(LLViewerTexture::sBoundTextureMemoryInBytes)) > LLViewerTexture::sMaxBoundTextureMemInMegaBytes)
-		{
-			mClientCause->setText( getString("client_texture_memory_cause_msg", mStringArgs) );
-		}
-		else 
-		{
-			mClientCause->setText( getString("client_complex_objects_cause_msg", mStringArgs) );
-		}
-	}
-}
-
-void LLFloaterLagMeter::determineNetwork()
-{
-	F32 packet_loss = LLViewerStats::getInstance()->mPacketsLostPercentStat.getMean();
-	F32 ping_time = LLViewerStats::getInstance()->mSimPingStat.getMean();
-	bool find_cause_loss = false;
-	bool find_cause_ping = false;
-
-	// *FIXME: We can't blame a large ping time on anything in
-	// particular if the frame rate is low, because a low frame
-	// rate is a sure recipe for bad ping times right now until
-	// the network handlers are de-synched from the rendering.
-	F32 client_frame_time_ms = 1000.0f * LLViewerStats::getInstance()->mFPSStat.getMeanDuration();
-	
-	if(packet_loss >= mNetworkPacketLossCritical)
-	{
-		mNetworkButton->setImageUnselected(LLUI::getUIImage(LAG_CRITICAL_IMAGE_NAME));
-		mNetworkText->setText( getString("network_packet_loss_critical_msg", mStringArgs) );
-		find_cause_loss = true;
-	}
-	else if(ping_time >= mNetworkPingCritical)
-	{
-		mNetworkButton->setImageUnselected(LLUI::getUIImage(LAG_CRITICAL_IMAGE_NAME));
-		if (client_frame_time_ms < mNetworkPingCritical)
-		{
-			mNetworkText->setText( getString("network_ping_critical_msg", mStringArgs) );
-			find_cause_ping = true;
-		}
-	}
-	else if(packet_loss >= mNetworkPacketLossWarning)
-	{
-		mNetworkButton->setImageUnselected(LLUI::getUIImage(LAG_WARNING_IMAGE_NAME));
-		mNetworkText->setText( getString("network_packet_loss_warning_msg", mStringArgs) );
-		find_cause_loss = true;
-	}
-	else if(ping_time >= mNetworkPingWarning)
-	{
-		mNetworkButton->setImageUnselected(LLUI::getUIImage(LAG_WARNING_IMAGE_NAME));
-		if (client_frame_time_ms < mNetworkPingWarning)
-		{
-			mNetworkText->setText( getString("network_ping_warning_msg", mStringArgs) );
-			find_cause_ping = true;
-		}
-	}
-	else
-	{
-		mNetworkButton->setImageUnselected(LLUI::getUIImage(LAG_GOOD_IMAGE_NAME));
-		mNetworkText->setText( getString("network_performance_normal_msg", mStringArgs) );
-	}
-
-	if(find_cause_loss)
- 	{
-		mNetworkCause->setText( getString("network_packet_loss_cause_msg", mStringArgs) );
- 	}
-	else if(find_cause_ping)
-	{
-		mNetworkCause->setText( getString("network_ping_cause_msg", mStringArgs) );
-	}
-	else
-	{
-		mNetworkCause->setText( LLStringUtil::null );
-	}
-}
-
-void LLFloaterLagMeter::determineServer()
-{
-	F32 sim_frame_time = LLViewerStats::getInstance()->mSimFrameMsec.getCurrent();
-	bool find_cause = false;
-
-	if(sim_frame_time >= mServerFrameTimeCritical)
-	{
-		mServerButton->setImageUnselected(LLUI::getUIImage(LAG_CRITICAL_IMAGE_NAME));
-		mServerText->setText( getString("server_frame_time_critical_msg", mStringArgs) );
-		find_cause = true;
-	}
-	else if(sim_frame_time >= mServerFrameTimeWarning)
-	{
-		mServerButton->setImageUnselected(LLUI::getUIImage(LAG_WARNING_IMAGE_NAME));
-		mServerText->setText( getString("server_frame_time_warning_msg", mStringArgs) );
-		find_cause = true;
-	}
-	else
-	{
-		mServerButton->setImageUnselected(LLUI::getUIImage(LAG_GOOD_IMAGE_NAME));
-		mServerText->setText( getString("server_frame_time_normal_msg", mStringArgs) );
-		mServerCause->setText( LLStringUtil::null );
-	}	
-
-	if(find_cause)
-	{
-		if(LLViewerStats::getInstance()->mSimSimPhysicsMsec.getCurrent() > mServerSingleProcessMaxTime)
-		{
-			mServerCause->setText( getString("server_physics_cause_msg", mStringArgs) );
-		}
-		else if(LLViewerStats::getInstance()->mSimScriptMsec.getCurrent() > mServerSingleProcessMaxTime)
-		{
-			mServerCause->setText( getString("server_scripts_cause_msg", mStringArgs) );
-		}
-		else if(LLViewerStats::getInstance()->mSimNetMsec.getCurrent() > mServerSingleProcessMaxTime)
-		{
-			mServerCause->setText( getString("server_net_cause_msg", mStringArgs) );
-		}
-		else if(LLViewerStats::getInstance()->mSimAgentMsec.getCurrent() > mServerSingleProcessMaxTime)
-		{
-			mServerCause->setText( getString("server_agent_cause_msg", mStringArgs) );
-		}
-		else if(LLViewerStats::getInstance()->mSimImagesMsec.getCurrent() > mServerSingleProcessMaxTime)
-		{
-			mServerCause->setText( getString("server_images_cause_msg", mStringArgs) );
-		}
-		else
-		{
-			mServerCause->setText( getString("server_generic_cause_msg", mStringArgs) );
-		}
-	}
-}
-
-void LLFloaterLagMeter::updateControls(bool shrink)
-{
-//	LLFloaterLagMeter * self = (LLFloaterLagMeter*)data;
-
-	LLButton * button = getChild<LLButton>("minimize");
-	S32 delta_width = mMaxWidth -mMinWidth;
-	LLRect r = getRect();
-
-	if(!shrink)
-	{
-		setTitle(getString("max_title_msg", mStringArgs) );
-		// make left edge appear to expand
-		r.translate(-delta_width, 0);
-		setRect(r);
-		reshape(mMaxWidth, getRect().getHeight());
-		
-		getChild<LLUICtrl>("client")->setValue(getString("client_text_msg", mStringArgs) + ":");
-		getChild<LLUICtrl>("network")->setValue(getString("network_text_msg",mStringArgs) + ":");
-		getChild<LLUICtrl>("server")->setValue(getString("server_text_msg", mStringArgs) + ":");
-
-		// usually "<<"
-		button->setLabel( getString("smaller_label", mStringArgs) );
-	}
-	else
-	{
-		setTitle( getString("min_title_msg", mStringArgs) );
-		// make left edge appear to collapse
-		r.translate(delta_width, 0);
-		setRect(r);
-		reshape(mMinWidth, getRect().getHeight());
-		
-		getChild<LLUICtrl>("client")->setValue(getString("client_text_msg", mStringArgs) );
-		getChild<LLUICtrl>("network")->setValue(getString("network_text_msg",mStringArgs) );
-		getChild<LLUICtrl>("server")->setValue(getString("server_text_msg", mStringArgs) );
-
-		// usually ">>"
-		button->setLabel( getString("bigger_label", mStringArgs) );
-	}
-	// Don't put keyboard focus on the button
-	button->setFocus(FALSE);
-
-//	self->mClientText->setVisible(self->mShrunk);
-//	self->mClientCause->setVisible(self->mShrunk);
-//	self->getChildView("client_help")->setVisible( self->mShrunk);
-
-//	self->mNetworkText->setVisible(self->mShrunk);
-//	self->mNetworkCause->setVisible(self->mShrunk);
-//	self->getChildView("network_help")->setVisible( self->mShrunk);
-
-//	self->mServerText->setVisible(self->mShrunk);
-//	self->mServerCause->setVisible(self->mShrunk);
-//	self->getChildView("server_help")->setVisible( self->mShrunk);
-
-//	self->mShrunk = !self->mShrunk;
-}
-
-BOOL LLFloaterLagMeter::isShrunk()
-{
-	return gSavedSettings.getBOOL("LagMeterShrunk");
-}
-
-void LLFloaterLagMeter::onClickShrink()  // toggle "LagMeterShrunk"
-{
-	bool shrunk = isShrunk();
-	updateControls(!shrunk);
-	gSavedSettings.setBOOL("LagMeterShrunk", !shrunk);
-}
diff --git a/indra/newview/llfloaterlagmeter.h b/indra/newview/llfloaterlagmeter.h
deleted file mode 100644
index eef69556014c4537a36a85c1de8dcacab1efbffa..0000000000000000000000000000000000000000
--- a/indra/newview/llfloaterlagmeter.h
+++ /dev/null
@@ -1,80 +0,0 @@
-/** 
- * @file llfloaterlagmeter.h
- * @brief The "Lag-o-Meter" floater used to tell users what is causing lag.
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- * 
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- * 
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- * 
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * 
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
- * $/LicenseInfo$
- */
-
-#ifndef LLFLOATERLAGMETER_H
-#define LLFLOATERLAGMETER_H
-
-#include "llfloater.h"
-
-class LLTextBox;
-
-class LLFloaterLagMeter : public LLFloater
-{
-	friend class LLFloaterReg;
-	
-public:
-	/*virtual*/ void draw();
-	/*virtual*/ BOOL postBuild();	
-private:
-	
-	LLFloaterLagMeter(const LLSD& key);
-	/*virtual*/ ~LLFloaterLagMeter();
-	void determineClient();
-	void determineNetwork();
-	void determineServer();
-	void updateControls(bool shrink);
-	BOOL isShrunk();
-
-	void onClickShrink();
-
-	bool mShrunk;
-	S32 mMaxWidth, mMinWidth;
-
-	F32 mClientFrameTimeCritical;
-	F32 mClientFrameTimeWarning;
-	LLButton * mClientButton;
-	LLTextBox * mClientText;
-	LLTextBox * mClientCause;
-
-	F32 mNetworkPacketLossCritical;
-	F32 mNetworkPacketLossWarning;
-	F32 mNetworkPingCritical;
-	F32 mNetworkPingWarning;
-	LLButton * mNetworkButton;
-	LLTextBox * mNetworkText;
-	LLTextBox * mNetworkCause;
-
-	F32 mServerFrameTimeCritical;
-	F32 mServerFrameTimeWarning;
-	F32 mServerSingleProcessMaxTime;
-	LLButton * mServerButton;
-	LLTextBox * mServerText;
-	LLTextBox * mServerCause;
-
-	LLStringUtil::format_map_t mStringArgs;
-};
-
-#endif
diff --git a/indra/newview/llfloaterland.cpp b/indra/newview/llfloaterland.cpp
index 55f3d548ec67c08b60bc83a9584d6d903e2c2c90..be743d57d25afc5ef8b3cc0c1d0e18879c2fd9ed 100644
--- a/indra/newview/llfloaterland.cpp
+++ b/indra/newview/llfloaterland.cpp
@@ -783,8 +783,9 @@ void LLPanelLandGeneral::refresh()
 			mBtnReleaseLand->setEnabled( can_release );
 		}
 
-		BOOL use_pass = parcel->getParcelFlag(PF_USE_PASS_LIST) && !LLViewerParcelMgr::getInstance()->isCollisionBanned();;
+		BOOL use_pass = parcel->getOwnerID()!= gAgent.getID() && parcel->getParcelFlag(PF_USE_PASS_LIST) && !LLViewerParcelMgr::getInstance()->isCollisionBanned();;
 		mBtnBuyPass->setEnabled(use_pass);
+
 	}
 }
 
diff --git a/indra/newview/llfloatermap.cpp b/indra/newview/llfloatermap.cpp
index a65e9e911a9fb91c6624361ff377ffbace99bbdc..473e2938bee8873d20ea6caeeb9f8613769d1842 100644
--- a/indra/newview/llfloatermap.cpp
+++ b/indra/newview/llfloatermap.cpp
@@ -122,16 +122,13 @@ BOOL LLFloaterMap::handleDoubleClick(S32 x, S32 y, MASK mask)
 
 	LLVector3d pos_global = mMap->viewPosToGlobal(x, y);
 	
-	// If we're not tracking a beacon already, double-click will set one 
-	if (!LLTracker::isTracking(NULL))
+	LLTracker::stopTracking(NULL);
+	LLFloaterWorldMap* world_map = LLFloaterWorldMap::getInstance();
+	if (world_map)
 	{
-		LLFloaterWorldMap* world_map = LLFloaterWorldMap::getInstance();
-		if (world_map)
-		{
-			world_map->trackLocation(pos_global);
-		}
+		world_map->trackLocation(pos_global);
 	}
-	
+
 	if (gSavedSettings.getBOOL("DoubleClickTeleport"))
 	{
 		// If DoubleClickTeleport is on, double clicking the minimap will teleport there
@@ -249,3 +246,8 @@ void LLFloaterMap::handleZoom(const LLSD& userdata)
 		mMap->setScale(scale);
 	}
 }
+
+LLFloaterMap* LLFloaterMap::getInstance()
+{
+	return LLFloaterReg::getTypedInstance<LLFloaterMap>("mini_map");
+}
diff --git a/indra/newview/llfloatermap.h b/indra/newview/llfloatermap.h
index 8a1b965e628bf89442107057a31e8f50d5f2fbb3..ff2fb2053598a274326fc0d532a704580bee37a2 100644
--- a/indra/newview/llfloatermap.h
+++ b/indra/newview/llfloatermap.h
@@ -39,6 +39,7 @@ class LLFloaterMap : public LLFloater
 {
 public:
 	LLFloaterMap(const LLSD& key);
+	static LLFloaterMap* getInstance();
 	virtual ~LLFloaterMap();
 	
 	/*virtual*/ BOOL 	postBuild();
diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp
index fce0b7c9c92ebe0a4a6eb16e510d17fdeb596f62..e831f9de7c512ebac7880c3f2a1463ec992c4f02 100644
--- a/indra/newview/llinventorybridge.cpp
+++ b/indra/newview/llinventorybridge.cpp
@@ -3205,6 +3205,7 @@ void LLFolderBridge::buildContextMenuBaseOptions(U32 flags)
 
 	const LLUUID trash_id = model->findCategoryUUIDForType(LLFolderType::FT_TRASH);
 	const LLUUID lost_and_found_id = model->findCategoryUUIDForType(LLFolderType::FT_LOST_AND_FOUND);
+	const LLUUID favorites = model->findCategoryUUIDForType(LLFolderType::FT_FAVORITE);
 
 	if (lost_and_found_id == mUUID)
 	{
@@ -3218,7 +3219,10 @@ void LLFolderBridge::buildContextMenuBaseOptions(U32 flags)
 		mDisabledItems.push_back(std::string("New Clothes"));
 		mDisabledItems.push_back(std::string("New Body Parts"));
 	}
-
+	if (favorites == mUUID)
+	{
+		mDisabledItems.push_back(std::string("New Folder"));
+	}
 	if(trash_id == mUUID)
 	{
 		// This is the trash.
@@ -4658,6 +4662,10 @@ void LLCallingCardBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
 		{
 			disabled_items.push_back(std::string("Share"));
 		}
+		if ((flags & FIRST_SELECTED_ITEM) == 0)
+		{
+		disabled_items.push_back(std::string("Open"));
+		}
 		addOpenRightClickMenuOption(items);
 		items.push_back(std::string("Properties"));
 
@@ -5624,7 +5632,8 @@ void LLWearableBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
 
 		items.push_back(std::string("Wearable Edit"));
 
-		if ((flags & FIRST_SELECTED_ITEM) == 0)
+		bool modifiable = !gAgentWearables.isWearableModifiable(item->getUUID());
+		if (((flags & FIRST_SELECTED_ITEM) == 0) || modifiable)
 		{
 			disabled_items.push_back(std::string("Wearable Edit"));
 		}
diff --git a/indra/newview/llinventoryfunctions.cpp b/indra/newview/llinventoryfunctions.cpp
index e98d3f88a6aeacc37c50c9516dcbe99f9a27ed7d..68732024de311f4b9aebd7921bbeab0f6ca5a9be 100644
--- a/indra/newview/llinventoryfunctions.cpp
+++ b/indra/newview/llinventoryfunctions.cpp
@@ -959,7 +959,6 @@ void LLSaveFolderState::setApply(BOOL apply)
 
 void LLSaveFolderState::doFolder(LLFolderViewFolder* folder)
 {
-	LLMemType mt(LLMemType::MTYPE_INVENTORY_DO_FOLDER);
 	LLInvFVBridge* bridge = (LLInvFVBridge*)folder->getListener();
 	if(!bridge) return;
 	
diff --git a/indra/newview/llinventorypanel.cpp b/indra/newview/llinventorypanel.cpp
index 05c81957c6265308f72d4cca752a720586f32322..f7567baa2b81da4dddfcf332964c4978ab6e04ff 100644
--- a/indra/newview/llinventorypanel.cpp
+++ b/indra/newview/llinventorypanel.cpp
@@ -44,6 +44,7 @@
 #include "llinventoryfunctions.h"
 #include "llinventorymodelbackgroundfetch.h"
 #include "llsidepanelinventory.h"
+#include "lltrans.h"
 #include "llviewerattachmenu.h"
 #include "llviewerfoldertype.h"
 #include "llvoavatarself.h"
@@ -191,8 +192,6 @@ void LLInventoryPanel::buildFolderView(const LLInventoryPanel::Params& params)
 
 void LLInventoryPanel::initFromParams(const LLInventoryPanel::Params& params)
 {
-	LLMemType mt(LLMemType::MTYPE_INVENTORY_POST_BUILD);
-
 	mCommitCallbackRegistrar.pushScope(); // registered as a widget; need to push callback scope ourselves
 	
 	buildFolderView(params);
@@ -975,7 +974,6 @@ bool LLInventoryPanel::beginIMSession()
 	std::set<LLUUID> selected_items = mFolderRoot->getSelectionList();
 
 	std::string name;
-	static int session_num = 1;
 
 	LLDynamicArray<LLUUID> members;
 	EInstantMessage type = IM_SESSION_CONFERENCE_START;
@@ -1055,7 +1053,7 @@ bool LLInventoryPanel::beginIMSession()
 
 	if (name.empty())
 	{
-		name = llformat("Session %d", session_num++);
+		name = LLTrans::getString("conference-title");
 	}
 
 	LLUUID session_id = gIMMgr->addSession(name, type, members[0], members);
diff --git a/indra/newview/llmemoryview.cpp b/indra/newview/llmemoryview.cpp
deleted file mode 100644
index c0a323d6cb3afeb81838d5bf35d9f70c41037624..0000000000000000000000000000000000000000
--- a/indra/newview/llmemoryview.cpp
+++ /dev/null
@@ -1,333 +0,0 @@
-/** 
- * @file llmemoryview.cpp
- * @brief LLMemoryView class implementation
- *
- * $LicenseInfo:firstyear=2001&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- * 
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- * 
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- * 
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * 
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
- * $/LicenseInfo$
- */
-
-#include "llviewerprecompiledheaders.h"
-
-#include "llmemoryview.h"
-
-#include "llappviewer.h"
-#include "llallocator_heap_profile.h"
-#include "llgl.h"						// LLGLSUIDefault
-#include "llviewerwindow.h"
-#include "llviewercontrol.h"
-
-#include <sstream>
-#include <boost/algorithm/string/split.hpp>
-
-#include "llmemory.h"
-
-LLMemoryView::LLMemoryView(const LLMemoryView::Params& p)
-:	LLView(p),
-	mPaused(FALSE),
-	//mDelay(120),
-    mAlloc(NULL)
-{
-}
-
-LLMemoryView::~LLMemoryView()
-{
-}
-
-BOOL LLMemoryView::handleMouseDown(S32 x, S32 y, MASK mask)
-{
-	if (mask & MASK_SHIFT)
-	{
-	}
-	else if (mask & MASK_CONTROL)
-	{
-	}
-	else
-	{
-		mPaused = !mPaused;
-	}
-	return TRUE;
-}
-
-BOOL LLMemoryView::handleMouseUp(S32 x, S32 y, MASK mask)
-{
-	return TRUE;
-}
-
-
-BOOL LLMemoryView::handleHover(S32 x, S32 y, MASK mask)
-{
-	return FALSE;
-}
-
-void LLMemoryView::refreshProfile()
-{
-	/*
-    LLAllocator & alloc = LLAppViewer::instance()->getAllocator();
-    if(alloc.isProfiling()) {
-        std::string profile_text = alloc.getRawProfile();
-
-        boost::algorithm::split(mLines, profile_text, boost::bind(std::equal_to<llwchar>(), '\n', _1));
-    } else {
-        mLines.clear();
-    }
-	*/
-    if (mAlloc == NULL) {
-        mAlloc = &LLAppViewer::instance()->getAllocator();
-    }
-
-	mLines.clear();
-
- 	if(mAlloc->isProfiling()) 
-	{
-		const LLAllocatorHeapProfile &prof = mAlloc->getProfile();
-		for(size_t i = 0; i < prof.mLines.size(); ++i)
-		{
-			std::stringstream ss;
-			ss << "Unfreed Mem: " << (prof.mLines[i].mLiveSize >> 20) << " M     Trace: ";
-			for(size_t k = 0; k < prof.mLines[i].mTrace.size(); ++k)
-			{
-				ss << LLMemType::getNameFromID(prof.mLines[i].mTrace[k]) << "  ";
-			}
-			mLines.push_back(utf8string_to_wstring(ss.str()));
-		}
-	}
-}
-
-void LLMemoryView::draw()
-{
-	const S32 UPDATE_INTERVAL = 60;
-	const S32 MARGIN_AMT = 10; 
-	static S32 curUpdate = UPDATE_INTERVAL;
-    static LLUIColor s_console_color = LLUIColorTable::instance().getColor("ConsoleBackground", LLColor4U::black);	
-
-	// setup update interval
-	if (curUpdate >= UPDATE_INTERVAL)
-	{
-		refreshProfile();
-		curUpdate = 0;
-	}
-	curUpdate++;
-
-	// setup window properly
-	S32 height = (S32) (gViewerWindow->getWindowRectScaled().getHeight()*0.75f);
-	S32 width = (S32) (gViewerWindow->getWindowRectScaled().getWidth() * 0.9f);
-	setRect(LLRect().setLeftTopAndSize(getRect().mLeft, getRect().mTop, width, height));
-	
-	// setup window color
-	F32 console_opacity = llclamp(gSavedSettings.getF32("ConsoleBackgroundOpacity"), 0.f, 1.f);
-	LLColor4 color = s_console_color;
-	color.mV[VALPHA] *= console_opacity;
-
-	LLGLSUIDefault gls_ui;
-	gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
-	gl_rect_2d(0, height, width, 0, color);
-	
-    LLFontGL * font = LLFontGL::getFontSansSerifSmall(); 
-
-	// draw remaining lines
-	F32 y_pos = 0.f;
-    F32 y_off = 0.f;
-
-	F32 line_height = font->getLineHeight();
-    S32 target_width = width - 2 * MARGIN_AMT;
-
-	// cut off lines on bottom
-	U32 max_lines = U32((height - 2 * line_height) / line_height);
-	y_pos = height - MARGIN_AMT - line_height;
-    y_off = 0.f;
-
-#if !MEM_TRACK_MEM
-	std::vector<LLWString>::const_iterator end = mLines.end();
-    if(mLines.size() > max_lines) {
-        end = mLines.begin() + max_lines;
-    }
-    for (std::vector<LLWString>::const_iterator i = mLines.begin(); i != end; ++i)
-	{
-		font->render(*i, 0, MARGIN_AMT, y_pos -  y_off,
-            LLColor4::white,
-			LLFontGL::LEFT, 
-			LLFontGL::BASELINE,
-            LLFontGL::NORMAL,
-			LLFontGL::DROP_SHADOW,
-			S32_MAX,
-			target_width
-			);
-		y_off += line_height;
-	}
-
-#else
-	LLMemTracker::getInstance()->preDraw(mPaused) ;
-
-	{
-		F32 x_pos = MARGIN_AMT ;
-		U32 lines = 0 ;
-		const char* str = LLMemTracker::getInstance()->getNextLine() ;
-		while(str != NULL)
-		{
-			lines++ ;
-			font->renderUTF8(str, 0, x_pos, y_pos -  y_off,
-				LLColor4::white,
-				LLFontGL::LEFT, 
-				LLFontGL::BASELINE,
-				LLFontGL::NORMAL,
-				LLFontGL::DROP_SHADOW,
-				S32_MAX,
-				target_width,
-				NULL, FALSE);
-		
-			str = LLMemTracker::getInstance()->getNextLine() ;
-			y_off += line_height;
-
-			if(lines >= max_lines)
-			{
-				lines = 0 ;
-				x_pos += 512.f ;
-				if(x_pos + 512.f > target_width)
-				{
-					break ;
-				}
-
-				y_pos = height - MARGIN_AMT - line_height;
-				y_off = 0.f;
-			}
-		}
-	}
-
-	LLMemTracker::getInstance()->postDraw() ;
-#endif
-
-#if MEM_TRACK_TYPE
-
-	S32 left, top, right, bottom;
-	S32 x, y;
-
-	S32 margin = 10;
-	S32 texth = LLFontGL::getFontMonospace()->getLineHeight();
-
-	S32 xleft = margin;
-	S32 ytop = height - margin;
-	S32 labelwidth = 0;
-	S32 maxmaxbytes = 1;
-
-	// Make sure all timers are accounted for
-	// Set 'MT_OTHER' to unaccounted ticks last frame
-	{
-		S32 display_memtypes[LLMemType::MTYPE_NUM_TYPES];
-		for (S32 i=0; i < LLMemType::MTYPE_NUM_TYPES; i++)
-		{
-			display_memtypes[i] = 0;
-		}
-		for (S32 i=0; i < MTV_DISPLAY_NUM; i++)
-		{
-			S32 tidx = mtv_display_table[i].memtype;
-			display_memtypes[tidx]++;
-		}
-		LLMemType::sMemCount[LLMemType::MTYPE_OTHER] = 0;
-		LLMemType::sMaxMemCount[LLMemType::MTYPE_OTHER] = 0;
-		for (S32 tidx = 0; tidx < LLMemType::MTYPE_NUM_TYPES; tidx++)
-		{
-			if (display_memtypes[tidx] == 0)
-			{
-				LLMemType::sMemCount[LLMemType::MTYPE_OTHER] += LLMemType::sMemCount[tidx];
-				LLMemType::sMaxMemCount[LLMemType::MTYPE_OTHER] += LLMemType::sMaxMemCount[tidx];
-			}
-		}
-	}
-	
-	// Labels
-	{
-		y = ytop;
-		S32 peak = 0;
-		for (S32 i=0; i<MTV_DISPLAY_NUM; i++)
-		{
-			x = xleft;
-
-			int tidx = mtv_display_table[i].memtype;
-			S32 bytes = LLMemType::sMemCount[tidx];
-			S32 maxbytes = LLMemType::sMaxMemCount[tidx];
-			maxmaxbytes = llmax(maxbytes, maxmaxbytes);
-			peak += maxbytes;
-			S32 mbytes = bytes >> 20;
-
-			tdesc = llformat("%s [%4d MB] in %06d NEWS",mtv_display_table[i].desc,mbytes, LLMemType::sNewCount[tidx]);
-			LLFontGL::getFontMonospace()->renderUTF8(tdesc, 0, x, y, LLColor4::white, LLFontGL::LEFT, LLFontGL::TOP);
-			
-			y -= (texth + 2);
-
-			S32 textw = LLFontGL::getFontMonospace()->getWidth(tdesc);
-			if (textw > labelwidth)
-				labelwidth = textw;
-		}
-
-		S32 num_avatars = 0;
-		S32 num_motions = 0;
-		S32 num_loading_motions = 0;
-		S32 num_loaded_motions = 0;
-		S32 num_active_motions = 0;
-		S32 num_deprecated_motions = 0;
-		for (std::vector<LLCharacter*>::iterator iter = LLCharacter::sInstances.begin();
-			 iter != LLCharacter::sInstances.end(); ++iter)
-		{
-			num_avatars++;
-			(*iter)->getMotionController().incMotionCounts(num_motions, num_loading_motions, num_loaded_motions, num_active_motions, num_deprecated_motions);
-		}
-		
-		x = xleft;
-		tdesc = llformat("Total Bytes: %d MB Overhead: %d KB Avs %d Motions:%d Loading:%d Loaded:%d Active:%d Dep:%d",
-						 LLMemType::sTotalMem >> 20, LLMemType::sOverheadMem >> 10,
-						 num_avatars, num_motions, num_loading_motions, num_loaded_motions, num_active_motions, num_deprecated_motions);
-		LLFontGL::getFontMonospace()->renderUTF8(tdesc, 0, x, y, LLColor4::white, LLFontGL::LEFT, LLFontGL::TOP);
-	}
-
-	// Bars
-	y = ytop;
-	labelwidth += 8;
-	S32 barw = width - labelwidth - xleft - margin;
-	for (S32 i=0; i<MTV_DISPLAY_NUM; i++)
-	{
-		x = xleft + labelwidth;
-
-		int tidx = mtv_display_table[i].memtype;
-		S32 bytes = LLMemType::sMemCount[tidx];
-		F32 frac = (F32)bytes / (F32)maxmaxbytes;
-		S32 w = (S32)(frac * (F32)barw);
-		left = x; right = x + w;
-		top = y; bottom = y - texth;		
-		gl_rect_2d(left, top, right, bottom, *mtv_display_table[i].color);
-
-		S32 maxbytes = LLMemType::sMaxMemCount[tidx];
-		F32 frac2 = (F32)maxbytes / (F32)maxmaxbytes;
-		S32 w2 = (S32)(frac2 * (F32)barw);
-		left = x + w + 1; right = x + w2;
-		top = y; bottom = y - texth;
-		LLColor4 tcolor = *mtv_display_table[i].color;
-		tcolor.setAlpha(.5f);
-		gl_rect_2d(left, top, right, bottom, tcolor);
-		
-		y -= (texth + 2);
-	}
-
-	dumpData();
-
-#endif
-	
-	LLView::draw();
-}
diff --git a/indra/newview/llmemoryview.h b/indra/newview/llmemoryview.h
deleted file mode 100644
index dc4849a9c4aaf9e0d39fe1a238d0f2789da2620f..0000000000000000000000000000000000000000
--- a/indra/newview/llmemoryview.h
+++ /dev/null
@@ -1,62 +0,0 @@
-/** 
- * @file llmemoryview.h
- * @brief LLMemoryView class definition
- *
- * $LicenseInfo:firstyear=2001&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- * 
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- * 
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- * 
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * 
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
- * $/LicenseInfo$
- */
-
-#ifndef LL_LLMEMORYVIEW_H
-#define LL_LLMEMORYVIEW_H
-
-#include "llview.h"
-
-class LLAllocator;
-
-class LLMemoryView : public LLView
-{
-public:
-	struct Params : public LLInitParam::Block<Params, LLView::Params>
-	{
-		Params()
-		{
-			changeDefault(mouse_opaque, true);
-			changeDefault(visible, false);
-		}
-	};
-	LLMemoryView(const LLMemoryView::Params&);
-	virtual ~LLMemoryView();
-
-	virtual BOOL handleMouseDown(S32 x, S32 y, MASK mask);
-	virtual BOOL handleMouseUp(S32 x, S32 y, MASK mask);
-	virtual BOOL handleHover(S32 x, S32 y, MASK mask);
-	virtual void draw();
-
-	void refreshProfile();
-
-private:
-    std::vector<LLWString> mLines;
-	LLAllocator* mAlloc;
-	BOOL mPaused ;
-
-};
-
-#endif
diff --git a/indra/newview/llnearbychatbar.cpp b/indra/newview/llnearbychatbar.cpp
index f8f0f7d243688c497783935dfbe5cd052a4a67c2..c00dc4bc89dd70a5b99b9b70dcb92d4f74f23234 100644
--- a/indra/newview/llnearbychatbar.cpp
+++ b/indra/newview/llnearbychatbar.cpp
@@ -203,7 +203,12 @@ BOOL LLNearbyChatBar::handleKeyHere( KEY key, MASK mask )
 		sendChat(CHAT_TYPE_SHOUT);
 		handled = TRUE;
 	}
-
+	else if (KEY_RETURN == key && mask == MASK_SHIFT)
+	{
+		// whisper
+		sendChat(CHAT_TYPE_WHISPER);
+		handled = TRUE;
+	}
 	return handled;
 }
 
@@ -390,12 +395,6 @@ void LLNearbyChatBar::sendChat( EChatType type )
 
 	gAgent.stopTyping();
 
-	// If the user wants to stop chatting on hitting return, lose focus
-	// and go out of chat mode.
-	if (gSavedSettings.getBOOL("CloseChatOnReturn"))
-	{
-		stopChat();
-	}
 }
 
 void LLNearbyChatBar::showNearbyChatPanel(bool show)
@@ -446,7 +445,12 @@ void LLNearbyChatBar::onChatBoxCommit()
 	{
 		sendChat(CHAT_TYPE_NORMAL);
 	}
-
+	// If the user wants to stop chatting on hitting return, lose focus
+	// and go out of chat mode.
+	if (gSavedSettings.getBOOL("CloseChatOnReturn"))
+	{
+		stopChat();
+	}
 	gAgent.stopTyping();
 }
 
diff --git a/indra/newview/lloutfitslist.cpp b/indra/newview/lloutfitslist.cpp
index ef5ef2ddc82353bfc2e70d7d2ea8cfb60d574775..c15b6bd0d35020c33f10033592d0e42f56fb7aad 100644
--- a/indra/newview/lloutfitslist.cpp
+++ b/indra/newview/lloutfitslist.cpp
@@ -117,6 +117,8 @@ class LLOutfitListGearMenu
 		registrar.add("Gear.Rename", boost::bind(&LLOutfitListGearMenu::onRename, this));
 		registrar.add("Gear.Delete", boost::bind(&LLOutfitsList::removeSelected, mOutfitList));
 		registrar.add("Gear.Create", boost::bind(&LLOutfitListGearMenu::onCreate, this, _2));
+		registrar.add("Gear.Collapse", boost::bind(&LLOutfitsList::collapse_all_folders, mOutfitList));
+		registrar.add("Gear.Expand", boost::bind(&LLOutfitsList::expand_all_folders, mOutfitList));
 
 		registrar.add("Gear.WearAdd", boost::bind(&LLOutfitListGearMenu::onAdd, this));
 
@@ -743,6 +745,34 @@ void LLOutfitsList::getSelectedItemsUUIDs(uuid_vec_t& selected_uuids) const
 	}
 }
 
+void LLOutfitsList::collapse_all_folders()
+{
+	for (outfits_map_t::iterator iter = mOutfitsMap.begin();
+			iter != mOutfitsMap.end();
+			++iter)
+	{
+		LLAccordionCtrlTab*	tab = iter->second;
+		if(tab && tab->isExpanded())
+		{
+			tab->changeOpenClose(true);
+		}
+	}
+}
+
+void LLOutfitsList::expand_all_folders()
+{
+	for (outfits_map_t::iterator iter = mOutfitsMap.begin();
+			iter != mOutfitsMap.end();
+			++iter)
+	{
+		LLAccordionCtrlTab*	tab = iter->second;
+		if(tab && !tab->isExpanded())
+		{
+			tab->changeOpenClose(false);
+		}
+	}
+}
+
 boost::signals2::connection LLOutfitsList::setSelectionChangeCallback(selection_change_callback_t cb)
 {
 	return mSelectionChangeSignal.connect(cb);
diff --git a/indra/newview/lloutfitslist.h b/indra/newview/lloutfitslist.h
index a0598737f1a8ab20727a0d7e477708f1a14ebf7f..2e3fb3f4882598e8d2897c89a1eb3177f6346382 100644
--- a/indra/newview/lloutfitslist.h
+++ b/indra/newview/lloutfitslist.h
@@ -108,6 +108,16 @@ class LLOutfitsList : public LLPanelAppearanceTab
 	 */
 	bool hasItemSelected();
 
+	/**
+	Collapses all outfit accordions.
+	*/
+	void collapse_all_folders();
+	/**
+	Expands all outfit accordions.
+	*/
+	void expand_all_folders();
+
+
 private:
 
 	void onOutfitsRemovalConfirmation(const LLSD& notification, const LLSD& response);
diff --git a/indra/newview/llpanellandmarks.cpp b/indra/newview/llpanellandmarks.cpp
index 68a3b6d1cdd5957b8abb76ed6d0676ad1bb2e4b1..d6fccb97053ca4cb1c643db4e036b073918c0d31 100644
--- a/indra/newview/llpanellandmarks.cpp
+++ b/indra/newview/llpanellandmarks.cpp
@@ -418,12 +418,13 @@ void LLLandmarksPanel::setItemSelected(const LLUUID& obj_id, BOOL take_keyboard_
 bool LLLandmarksPanel::isLandmarkSelected() const 
 {
 	LLFolderViewItem* current_item = getCurSelectedItem();
-	if(current_item && current_item->getListener()->getInventoryType() == LLInventoryType::IT_LANDMARK)
-	{
-		return true;
-	}
+	return current_item && current_item->getListener()->getInventoryType() == LLInventoryType::IT_LANDMARK;
+}
 
-	return false;
+bool LLLandmarksPanel::isFolderSelected() const
+{
+	LLFolderViewItem* current_item = getCurSelectedItem();
+	return current_item && current_item->getListener()->getInventoryType() == LLInventoryType::IT_CATEGORY;
 }
 
 bool LLLandmarksPanel::isReceivedFolderSelected() const
@@ -720,7 +721,7 @@ void LLLandmarksPanel::initListCommandsHandlers()
 void LLLandmarksPanel::updateListCommands()
 {
 	bool add_folder_enabled = isActionEnabled("category");
-	bool trash_enabled = isActionEnabled("delete");
+	bool trash_enabled = isActionEnabled("delete") && (isFolderSelected() || isLandmarkSelected());
 
 	// keep Options & Add Landmark buttons always enabled
 	mListCommands->getChildView(ADD_FOLDER_BUTTON_NAME)->setEnabled(add_folder_enabled);
diff --git a/indra/newview/llpanellandmarks.h b/indra/newview/llpanellandmarks.h
index b2f4e92473f587a0bce100d3e0d4da6f051e1bce..4e787317baff74f987a7daaaa22dae61d80c04d9 100644
--- a/indra/newview/llpanellandmarks.h
+++ b/indra/newview/llpanellandmarks.h
@@ -84,6 +84,7 @@ class LLLandmarksPanel : public LLPanelPlacesTab, LLRemoteParcelInfoObserver
 	 * @return true - if current selected panel is not null and selected item is a landmark
 	 */
 	bool isLandmarkSelected() const;
+	bool isFolderSelected() const;
 	bool isReceivedFolderSelected() const;
 	void doActionOnCurSelectedLandmark(LLLandmarkList::loaded_callback_t cb);
 	LLFolderViewItem* getCurSelectedItem() const;
diff --git a/indra/newview/llpanelmaininventory.cpp b/indra/newview/llpanelmaininventory.cpp
index 9f3273da2d9e22739fd58e1155abae657ba6726e..28cfb5b282874d69f8e692a31b0f7325c3836e64 100644
--- a/indra/newview/llpanelmaininventory.cpp
+++ b/indra/newview/llpanelmaininventory.cpp
@@ -105,7 +105,6 @@ LLPanelMainInventory::LLPanelMainInventory(const LLPanel::Params& p)
 	  mMenuAdd(NULL),
 	  mNeedUploadCost(true)
 {
-	LLMemType mt(LLMemType::MTYPE_INVENTORY_VIEW_INIT);
 	// Menu Callbacks (non contex menus)
 	mCommitCallbackRegistrar.add("Inventory.DoToSelected", boost::bind(&LLPanelMainInventory::doToSelected, this, _2));
 	mCommitCallbackRegistrar.add("Inventory.CloseAllFolders", boost::bind(&LLPanelMainInventory::closeAllFolders, this));
@@ -604,7 +603,6 @@ void LLPanelMainInventory::setFilterTextFromFilter()
 
 void LLPanelMainInventory::toggleFindOptions()
 {
-	LLMemType mt(LLMemType::MTYPE_INVENTORY_VIEW_TOGGLE);
 	LLFloater *floater = getFinder();
 	if (!floater)
 	{
@@ -726,7 +724,6 @@ void LLFloaterInventoryFinder::updateElementsFromFilter()
 
 void LLFloaterInventoryFinder::draw()
 {
-	LLMemType mt(LLMemType::MTYPE_INVENTORY_DRAW);
 	U64 filter = 0xffffffffffffffffULL;
 	BOOL filtered_by_all_types = TRUE;
 
diff --git a/indra/newview/llpanelplaces.cpp b/indra/newview/llpanelplaces.cpp
index 6d321d4716cb1ed708215f4f8be9da6f9d3e5ccb..6c2a01fc82fdad1bbd1f66abf38ea3e3d9c52f45 100644
--- a/indra/newview/llpanelplaces.cpp
+++ b/indra/newview/llpanelplaces.cpp
@@ -366,6 +366,7 @@ void LLPanelPlaces::onOpen(const LLSD& key)
 
 	if (key.size() != 0)
 	{
+		isLandmarkEditModeOn = false;
 		std::string key_type = key["type"].asString();
 		if (key_type == LANDMARK_TAB_INFO_TYPE)
 		{
@@ -392,7 +393,6 @@ void LLPanelPlaces::onOpen(const LLSD& key)
 			mPlaceInfoType = key_type;
 			mPosGlobal.setZero();
 			mItem = NULL;
-			isLandmarkEditModeOn = false;
 			togglePlaceInfoPanel(TRUE);
 
 			if (mPlaceInfoType == AGENT_INFO_TYPE)
diff --git a/indra/newview/llpanelteleporthistory.cpp b/indra/newview/llpanelteleporthistory.cpp
index c63d89fc9812706427b7b41282a38184ca31e8f7..0756faf5c0c80e19e36673d5d52c7003b745d609 100644
--- a/indra/newview/llpanelteleporthistory.cpp
+++ b/indra/newview/llpanelteleporthistory.cpp
@@ -972,6 +972,11 @@ void LLTeleportHistoryPanel::onCollapseAllFolders()
 		mItemContainers.get(n)->setDisplayChildren(false);
 	}
 	mHistoryAccordion->arrange();
+
+	if (mLastSelectedFlatlList)
+	{
+		mLastSelectedFlatlList->resetSelection();
+	}
 }
 
 void LLTeleportHistoryPanel::onClearTeleportHistory()
diff --git a/indra/newview/llpaneltopinfobar.cpp b/indra/newview/llpaneltopinfobar.cpp
index 280cc11179670ea84450245460433d7890a1cf7f..1830086da29fcf7c6ce867acb39d431834db0962 100644
--- a/indra/newview/llpaneltopinfobar.cpp
+++ b/indra/newview/llpaneltopinfobar.cpp
@@ -64,9 +64,6 @@ class LLPanelTopInfoBar::LLParcelChangeObserver : public LLParcelObserver
 
 LLPanelTopInfoBar::LLPanelTopInfoBar(): mParcelChangedObserver(0)
 {
-	LLUICtrl::CommitCallbackRegistry::currentRegistrar()
-			.add("TopInfoBar.Action", boost::bind(&LLPanelTopInfoBar::onContextMenuItemClicked, this, _2));
-
 	buildFromFile( "panel_topinfo_bar.xml");
 }
 
@@ -132,6 +129,11 @@ void LLPanelTopInfoBar::handleLoginComplete()
 
 BOOL LLPanelTopInfoBar::handleRightMouseDown(S32 x, S32 y, MASK mask)
 {
+	if(!LLUICtrl::CommitCallbackRegistry::getValue("TopInfoBar.Action"))
+	{
+		LLUICtrl::CommitCallbackRegistry::currentRegistrar()
+				.add("TopInfoBar.Action", boost::bind(&LLPanelTopInfoBar::onContextMenuItemClicked, this, _2));
+	}
 	show_topinfobar_context_menu(this, x, y);
 	return TRUE;
 }
diff --git a/indra/newview/llpolymesh.cpp b/indra/newview/llpolymesh.cpp
index 70f3b5335e2ea332d2bdfc7ca6fe3b1793c13de6..e26fcc74bdb462f814801836d945f7018322d574 100644
--- a/indra/newview/llpolymesh.cpp
+++ b/indra/newview/llpolymesh.cpp
@@ -750,8 +750,6 @@ const LLVector2 &LLPolyMeshSharedData::getUVs(U32 index)
 //-----------------------------------------------------------------------------
 LLPolyMesh::LLPolyMesh(LLPolyMeshSharedData *shared_data, LLPolyMesh *reference_mesh)
 {       
-	LLMemType mt(LLMemType::MTYPE_AVATAR_MESH);
-
 	llassert(shared_data);
 
 	mSharedData = shared_data;
diff --git a/indra/newview/llsidepanelappearance.cpp b/indra/newview/llsidepanelappearance.cpp
index 853656905c9dc3b90c585064e65aa475e13eed23..d909a218e387c83314517b8b3b246cf764d13c9f 100644
--- a/indra/newview/llsidepanelappearance.cpp
+++ b/indra/newview/llsidepanelappearance.cpp
@@ -456,10 +456,10 @@ void LLSidepanelAppearance::refreshCurrentOutfitName(const std::string& name)
 void LLSidepanelAppearance::editWearable(LLWearable *wearable, LLView *data, BOOL disable_camera_switch)
 {
 	LLFloaterSidePanelContainer::showPanel("appearance", LLSD());
-
 	LLSidepanelAppearance *panel = dynamic_cast<LLSidepanelAppearance*>(data);
 	if (panel)
 	{
+		panel->showOutfitsInventoryPanel();
 		panel->showWearableEditPanel(wearable, disable_camera_switch);
 	}
 }
diff --git a/indra/newview/llspatialpartition.cpp b/indra/newview/llspatialpartition.cpp
index 06c87e57fc77a6baa32ec02b3f983f6b5a0fd3e5..508347839213760af583ebe2085567f1b4c59a7b 100644
--- a/indra/newview/llspatialpartition.cpp
+++ b/indra/newview/llspatialpartition.cpp
@@ -55,7 +55,7 @@
 #include "llviewershadermgr.h"
 
 static LLFastTimer::DeclareTimer FTM_FRUSTUM_CULL("Frustum Culling");
-static LLFastTimer::DeclareTimer FTM_CULL_REBOUND("Cull Rebound");
+static LLFastTimer::DeclareTimer FTM_CULL_REBOUND("Cull Rebound Partition");
 
 const F32 SG_OCCLUSION_FUDGE = 0.25f;
 #define SG_DISCARD_TOLERANCE 0.01f
@@ -376,7 +376,6 @@ LLSpatialGroup::~LLSpatialGroup()
 		}
 	}
 
-	LLMemType mt(LLMemType::MTYPE_SPACE_PARTITION);
 	clearDrawMap();
 	clearAtlasList() ;
 }
@@ -615,8 +614,6 @@ void LLSpatialGroup::validateDrawMap()
 
 BOOL LLSpatialGroup::updateInGroup(LLDrawable *drawablep, BOOL immediate)
 {
-	LLMemType mt(LLMemType::MTYPE_SPACE_PARTITION);
-		
 	drawablep->updateSpatialExtents();
 
 	OctreeNode* parent = mOctreeNode->getOctParent();
@@ -638,7 +635,6 @@ BOOL LLSpatialGroup::updateInGroup(LLDrawable *drawablep, BOOL immediate)
 
 BOOL LLSpatialGroup::addObject(LLDrawable *drawablep, BOOL add_all, BOOL from_octree)
 {
-	LLMemType mt(LLMemType::MTYPE_SPACE_PARTITION);
 	if (!from_octree)
 	{
 		mOctreeNode->insert(drawablep);
@@ -664,7 +660,6 @@ BOOL LLSpatialGroup::addObject(LLDrawable *drawablep, BOOL add_all, BOOL from_oc
 
 void LLSpatialGroup::rebuildGeom()
 {
-	LLMemType mt(LLMemType::MTYPE_SPACE_PARTITION);
 	if (!isDead())
 	{
 		mSpatialPartition->rebuildGeom(this);
@@ -876,7 +871,6 @@ LLSpatialGroup* LLSpatialGroup::getParent()
 
 BOOL LLSpatialGroup::removeObject(LLDrawable *drawablep, BOOL from_octree)
 {
-	LLMemType mt(LLMemType::MTYPE_SPACE_PARTITION);
 	unbound();
 	if (mOctreeNode && !from_octree)
 	{
@@ -913,7 +907,6 @@ BOOL LLSpatialGroup::removeObject(LLDrawable *drawablep, BOOL from_octree)
 
 void LLSpatialGroup::shift(const LLVector4a &offset)
 {
-	LLMemType mt(LLMemType::MTYPE_SPACE_PARTITION);
 	LLVector4a t = mOctreeNode->getCenter();
 	t.add(offset);	
 	mOctreeNode->setCenter(t);
@@ -968,8 +961,6 @@ void LLSpatialGroup::setState(U32 state)
 
 void LLSpatialGroup::setState(U32 state, S32 mode) 
 {
-	LLMemType mt(LLMemType::MTYPE_SPACE_PARTITION);
-
 	llassert(state <= LLSpatialGroup::STATE_MASK);
 	
 	if (mode > STATE_MODE_SINGLE)
@@ -1026,8 +1017,6 @@ void LLSpatialGroup::clearState(U32 state, S32 mode)
 {
 	llassert(state <= LLSpatialGroup::STATE_MASK);
 
-	LLMemType mt(LLMemType::MTYPE_SPACE_PARTITION);
-	
 	if (mode > STATE_MODE_SINGLE)
 	{
 		if (mode == STATE_MODE_DIFF)
@@ -1084,8 +1073,6 @@ class LLSpatialSetOcclusionStateDiff : public LLSpatialSetOcclusionState
 
 void LLSpatialGroup::setOcclusionState(U32 state, S32 mode) 
 {
-	LLMemType mt(LLMemType::MTYPE_SPACE_PARTITION);
-	
 	if (mode > STATE_MODE_SINGLE)
 	{
 		if (mode == STATE_MODE_DIFF)
@@ -1150,8 +1137,6 @@ class LLSpatialClearOcclusionStateDiff : public LLSpatialClearOcclusionState
 
 void LLSpatialGroup::clearOcclusionState(U32 state, S32 mode)
 {
-	LLMemType mt(LLMemType::MTYPE_SPACE_PARTITION);
-	
 	if (mode > STATE_MODE_SINGLE)
 	{
 		if (mode == STATE_MODE_DIFF)
@@ -1203,7 +1188,6 @@ LLSpatialGroup::LLSpatialGroup(OctreeNode* node, LLSpatialPartition* part) :
 	ll_assert_aligned(this,16);
 	
 	sNodeCount++;
-	LLMemType mt(LLMemType::MTYPE_SPACE_PARTITION);
 
 	mViewAngle.splat(0.f);
 	mLastUpdateViewAngle.splat(-1.f);
@@ -1389,7 +1373,6 @@ BOOL LLSpatialGroup::changeLOD()
 
 void LLSpatialGroup::handleInsertion(const TreeNode* node, LLDrawable* drawablep)
 {
-	LLMemType mt(LLMemType::MTYPE_SPACE_PARTITION);
 	addObject(drawablep, FALSE, TRUE);
 	unbound();
 	setState(OBJECT_DIRTY);
@@ -1397,14 +1380,12 @@ void LLSpatialGroup::handleInsertion(const TreeNode* node, LLDrawable* drawablep
 
 void LLSpatialGroup::handleRemoval(const TreeNode* node, LLDrawable* drawable)
 {
-	LLMemType mt(LLMemType::MTYPE_SPACE_PARTITION);
 	removeObject(drawable, TRUE);
 	setState(OBJECT_DIRTY);
 }
 
 void LLSpatialGroup::handleDestruction(const TreeNode* node)
 {
-	LLMemType mt(LLMemType::MTYPE_SPACE_PARTITION);
 	setState(DEAD);
 	
 	for (element_iter i = getDataBegin(); i != getDataEnd(); ++i)
@@ -1446,7 +1427,6 @@ void LLSpatialGroup::handleStateChange(const TreeNode* node)
 
 void LLSpatialGroup::handleChildAddition(const OctreeNode* parent, OctreeNode* child) 
 {
-	LLMemType mt(LLMemType::MTYPE_SPACE_PARTITION);
 	if (child->getListenerCount() == 0)
 	{
 		new LLSpatialGroup(child, mSpatialPartition);
@@ -1792,7 +1772,6 @@ void LLSpatialGroup::doOcclusion(LLCamera* camera)
 LLSpatialPartition::LLSpatialPartition(U32 data_mask, BOOL render_by_group, U32 buffer_usage)
 : mRenderByGroup(render_by_group), mBridge(NULL)
 {
-	LLMemType mt(LLMemType::MTYPE_SPACE_PARTITION);
 	mOcclusionEnabled = TRUE;
 	mDrawableType = 0;
 	mPartitionType = LLViewerRegion::PARTITION_NONE;
@@ -1816,8 +1795,6 @@ LLSpatialPartition::LLSpatialPartition(U32 data_mask, BOOL render_by_group, U32
 
 LLSpatialPartition::~LLSpatialPartition()
 {
-	LLMemType mt(LLMemType::MTYPE_SPACE_PARTITION);
-	
 	delete mOctree;
 	mOctree = NULL;
 }
@@ -1825,8 +1802,6 @@ LLSpatialPartition::~LLSpatialPartition()
 
 LLSpatialGroup *LLSpatialPartition::put(LLDrawable *drawablep, BOOL was_visible)
 {
-	LLMemType mt(LLMemType::MTYPE_SPACE_PARTITION);
-		
 	drawablep->updateSpatialExtents();
 
 	//keep drawable from being garbage collected
@@ -1848,8 +1823,6 @@ LLSpatialGroup *LLSpatialPartition::put(LLDrawable *drawablep, BOOL was_visible)
 
 BOOL LLSpatialPartition::remove(LLDrawable *drawablep, LLSpatialGroup *curp)
 {
-	LLMemType mt(LLMemType::MTYPE_SPACE_PARTITION);
-	
 	if (!curp->removeObject(drawablep))
 	{
 		OCT_ERRS << "Failed to remove drawable from octree!" << llendl;
@@ -1866,8 +1839,6 @@ BOOL LLSpatialPartition::remove(LLDrawable *drawablep, LLSpatialGroup *curp)
 
 void LLSpatialPartition::move(LLDrawable *drawablep, LLSpatialGroup *curp, BOOL immediate)
 {
-	LLMemType mt(LLMemType::MTYPE_SPACE_PARTITION);
-		
 	// sanity check submitted by open source user bushing Spatula
 	// who was seeing crashing here. (See VWR-424 reported by Bunny Mayne)
 	if (!drawablep)
@@ -1924,7 +1895,6 @@ class LLSpatialShift : public LLSpatialGroup::OctreeTraveler
 
 void LLSpatialPartition::shift(const LLVector4a &offset)
 { //shift octree node bounding boxes by offset
-	LLMemType mt(LLMemType::MTYPE_SPACE_PARTITION);
 	LLSpatialShift shifter(offset);
 	shifter.traverse(mOctree);
 }
@@ -2338,7 +2308,6 @@ class LLOctreeDirty : public LLOctreeTraveler<LLDrawable>
 
 void LLSpatialPartition::restoreGL()
 {
-	LLMemType mt(LLMemType::MTYPE_SPACE_PARTITION);
 }
 
 void LLSpatialPartition::resetVertexBuffers()
@@ -2381,7 +2350,6 @@ BOOL LLSpatialPartition::visibleObjectsInFrustum(LLCamera& camera)
 
 S32 LLSpatialPartition::cull(LLCamera &camera, std::vector<LLDrawable *>* results, BOOL for_select)
 {
-	LLMemType mt(LLMemType::MTYPE_SPACE_PARTITION);
 #if LL_OCTREE_PARANOIA_CHECK
 	((LLSpatialGroup*)mOctree->getListener(0))->checkStates();
 #endif
@@ -4439,8 +4407,6 @@ void LLSpatialPartition::renderDebug()
 		sCurMaxTexPriority = 0.f;
 	}
 
-	LLMemType mt(LLMemType::MTYPE_SPACE_PARTITION);
-	
 	LLGLDisable cullface(GL_CULL_FACE);
 	LLGLEnable blend(GL_BLEND);
 	gGL.setSceneBlendType(LLRender::BT_ALPHA);
diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp
index 42648b82c2df2c8aa3f64f535f0b5222590a05f9..1e7c325d308e5ff1187cf02243f97cac2921a3fb 100755
--- a/indra/newview/llstartup.cpp
+++ b/indra/newview/llstartup.cpp
@@ -312,8 +312,6 @@ void update_texture_fetch()
 // true when all initialization done.
 bool idle_startup()
 {
-	LLMemType mt1(LLMemType::MTYPE_STARTUP);
-	
 	const F32 PRECACHING_DELAY = gSavedSettings.getF32("PrecachingDelay");
 	static LLTimer timeout;
 	static S32 timeout_count = 0;
@@ -1420,7 +1418,7 @@ bool idle_startup()
 		display_startup();
 
 		//reset statistics
-		LLViewerStats::getInstance()->resetStats();
+		LLViewerStats::instance().resetStats();
 
 		display_startup();
 		//
@@ -1949,7 +1947,7 @@ bool idle_startup()
 			llinfos << "gAgentStartLocation : " << gAgentStartLocation << llendl;
 			LLSLURL start_slurl = LLStartUp::getStartSLURL();
 			LL_DEBUGS("AppInit") << "start slurl "<<start_slurl.asString()<<LL_ENDL;
-
+			
 			if (((start_slurl.getType() == LLSLURL::LOCATION) && (gAgentStartLocation == "url")) ||
 				((start_slurl.getType() == LLSLURL::LAST_LOCATION) && (gAgentStartLocation == "last")) ||
 				((start_slurl.getType() == LLSLURL::HOME_LOCATION) && (gAgentStartLocation == "home")))
@@ -2296,7 +2294,7 @@ bool login_alert_status(const LLSD& notification, const LLSD& response)
       //      break;
         case 2:     // Teleport
             // Restart the login process, starting at our home locaton
-			LLStartUp::setStartSLURL(LLSLURL(LLSLURL::SIM_LOCATION_HOME));
+	  LLStartUp::setStartSLURL(LLSLURL(LLSLURL::SIM_LOCATION_HOME));
             LLStartUp::setStartupState( STATE_LOGIN_CLEANUP );
             break;
         default:
diff --git a/indra/newview/llstatusbar.cpp b/indra/newview/llstatusbar.cpp
index ff69c6e9fd7d1f95b6ca8e7f71ad22f0576db784..4892de9da0a15d334fd2472058246d1a5d3f5abe 100644
--- a/indra/newview/llstatusbar.cpp
+++ b/indra/newview/llstatusbar.cpp
@@ -37,7 +37,6 @@
 #include "llviewercontrol.h"
 #include "llfloaterbuycurrency.h"
 #include "llbuycurrencyhtml.h"
-#include "llfloaterlagmeter.h"
 #include "llpanelnearbymedia.h"
 #include "llpanelvolumepulldown.h"
 #include "llfloaterregioninfo.h"
diff --git a/indra/newview/llsurface.cpp b/indra/newview/llsurface.cpp
index f64a72a616c8a0673d9c6756fdcf8735befb1d15..ec11a23eb8c290915177331e1b9436910b2a9532 100644
--- a/indra/newview/llsurface.cpp
+++ b/indra/newview/llsurface.cpp
@@ -62,8 +62,6 @@ LLColor4U MAX_WATER_COLOR(0, 48, 96, 240);
 
 
 S32 LLSurface::sTextureSize = 256;
-S32 LLSurface::sTexelsUpdated = 0;
-F32 LLSurface::sTextureUpdateTime = 0.f;
 
 // ---------------- LLSurface:: Public Members ---------------
 
@@ -647,7 +645,6 @@ void LLSurface::updatePatchVisibilities(LLAgent &agent)
 
 BOOL LLSurface::idleUpdate(F32 max_update_time)
 {
-	LLMemType mt_ius(LLMemType::MTYPE_IDLE_UPDATE_SURFACE);
 	if (!gPipeline.hasRenderType(LLPipeline::RENDER_TYPE_TERRAIN))
 	{
 		return FALSE;
diff --git a/indra/newview/llsurface.h b/indra/newview/llsurface.h
index 8052fb0d18d7b7b579a02ae47b23392987a5398f..9d24bf8771b987d8f210af2eef6b88b5fc4a04d9 100644
--- a/indra/newview/llsurface.h
+++ b/indra/newview/llsurface.h
@@ -169,9 +169,6 @@ class LLSurface
 	
 	F32 mDetailTextureScale;	//  Number of times to repeat detail texture across this surface 
 
-	static F32 sTextureUpdateTime;
-	static S32 sTexelsUpdated;
-
 protected:
 	void createSTexture();
 	void createWaterTexture();
diff --git a/indra/newview/lltexturefetch.cpp b/indra/newview/lltexturefetch.cpp
index 7adf5212c280826476972313a21859dd1836f5f6..216a022774976b18dd48d5e2f0760873f7ba033c 100644
--- a/indra/newview/lltexturefetch.cpp
+++ b/indra/newview/lltexturefetch.cpp
@@ -50,6 +50,7 @@
 #include "llviewertexture.h"
 #include "llviewerregion.h"
 #include "llviewerstats.h"
+#include "llviewerstatsrecorder.h"
 #include "llviewerassetstats.h"
 #include "llworld.h"
 #include "llsdutil.h"
@@ -151,7 +152,7 @@ class LLTextureFetchWorker : public LLWorkerClass
 	/*virtual*/ bool doWork(S32 param); // Called from LLWorkerThread::processRequest()
 	/*virtual*/ void finishWork(S32 param, bool completed); // called from finishRequest() (WORK THREAD)
 	/*virtual*/ bool deleteOK(); // called from update() (WORK THREAD)
-	
+
 	~LLTextureFetchWorker();
 	// void relese() { --mActiveCount; }
 
@@ -364,7 +365,7 @@ class HTTPGetResponder : public LLCurl::Responder
 					gTotalTextureBytesPerBoostLevel[tex->getBoostLevel()] += data_size ;
 				}
 			}
-		
+
 			if (worker->mMetricsStartTime)
 			{
 				LLViewerAssetStatsFF::record_response_thread1(LLViewerAssetType::AT_TEXTURE,
@@ -379,7 +380,7 @@ class HTTPGetResponder : public LLCurl::Responder
 		}
 		else
 		{
-			llwarns << "Worker not found: " << mID << llendl;
+ 			llwarns << "Worker not found: " << mID << llendl;
 		}
 
 		mFetcher->getCurlRequest().completeRequest(data_size);
@@ -701,7 +702,7 @@ LLTextureFetchWorker::LLTextureFetchWorker(LLTextureFetch* fetcher,
 	  mDelay(-1.f)
 {
 	mCanUseNET = mUrl.empty() ;
-	
+
 	calcWorkPriority();
 	mType = host.isOk() ? LLImageBase::TYPE_AVATAR_BAKE : LLImageBase::TYPE_NORMAL;
 // 	llinfos << "Create: " << mID << " mHost:" << host << " Discard=" << discard << llendl;
@@ -1739,6 +1740,7 @@ S32 LLTextureFetchWorker::callbackHttpGet(const LLChannelDescriptors& channels,
 		LL_DEBUGS("Texture") << "HTTP RECEIVED: " << mID.asString() << " Bytes: " << data_size << LL_ENDL;
 		if (data_size > 0)
 		{
+			LLViewerStatsRecorder::instance().textureFetch(data_size);
 			// *TODO: set the formatted image data here directly to avoid the copy
 			mBuffer = (U8*)ALLOCATE_MEM(LLImageBase::getPrivatePool(), data_size);
 			buffer->readAfter(channels.in(), NULL, mBuffer, data_size);
@@ -1773,6 +1775,7 @@ S32 LLTextureFetchWorker::callbackHttpGet(const LLChannelDescriptors& channels,
 	mLoaded = TRUE;
 	setPriority(LLWorkerThread::PRIORITY_HIGH | mWorkPriority);
 
+	LLViewerStatsRecorder::instance().log(0.2f);
 	return data_size ;
 }
 
@@ -2068,7 +2071,7 @@ void LLTextureFetch::deleteRequest(const LLUUID& id, bool cancel)
 {
 	lockQueue() ;
 	LLTextureFetchWorker* worker = getWorkerAfterLock(id);
-	unlockQueue() ;
+		unlockQueue() ;
 
 	removeRequest(worker, cancel);
 }
@@ -2078,7 +2081,7 @@ void LLTextureFetch::removeRequest(LLTextureFetchWorker* worker, bool cancel)
 	if(!worker)
 	{
 		return;
-	}
+}
 
 	lockQueue() ;
 	size_t erased_1 = mRequestMap.erase(worker->mID);
@@ -2095,13 +2098,13 @@ void LLTextureFetch::removeRequest(LLTextureFetchWorker* worker, bool cancel)
 void LLTextureFetch::deleteAllRequests()
 {
 	while(1)
-	{
-		lockQueue();
+{ 
+	lockQueue() ;
 		if(mRequestMap.empty())
 		{
-			unlockQueue() ;
+	unlockQueue() ;
 			break;
-		}
+}
 
 		LLTextureFetchWorker* worker = mRequestMap.begin()->second;
 		unlockQueue() ;
@@ -2111,7 +2114,7 @@ void LLTextureFetch::deleteAllRequests()
 }
 
 S32 LLTextureFetch::getNumRequests() 
-{ 
+{
 	lockQueue() ;
 	S32 size = (S32)mRequestMap.size(); 
 	unlockQueue() ;
@@ -2204,7 +2207,7 @@ bool LLTextureFetch::updateRequestPriority(const LLUUID& id, F32 priority)
 	{
 		worker->lockWorkMutex();
 		worker->setImagePriority(priority);
-		worker->unlockWorkMutex();		
+		worker->unlockWorkMutex();
 		res = true;
 	}
 	return res;
@@ -2286,7 +2289,7 @@ S32 LLTextureFetch::update(F32 max_time_ms)
 {
 	static LLCachedControl<F32> band_width(gSavedSettings,"ThrottleBandwidthKBPS");
 
-	mMaxBandwidth = band_width ;
+		mMaxBandwidth = band_width ;
 
 	S32 res = LLWorkerThread::update(max_time_ms);
 	
@@ -2297,7 +2300,7 @@ S32 LLTextureFetch::update(F32 max_time_ms)
 		// won't work so don't bother trying
 		if (LLStartUp::getStartupState() > STATE_AGENT_SEND)
 		{
-			sendRequestListToSimulators();			
+			sendRequestListToSimulators();
 		}
 	}
 
@@ -2672,6 +2675,9 @@ bool LLTextureFetch::receiveImageHeader(const LLHost& host, const LLUUID& id, U8
 		return false;
 	}
 
+	LLViewerStatsRecorder::instance().textureFetch(data_size);
+	LLViewerStatsRecorder::instance().log(0.1f);
+
 	worker->lockWorkMutex();
 
 	//	Copy header data into image object
@@ -2718,6 +2724,9 @@ bool LLTextureFetch::receiveImagePacket(const LLHost& host, const LLUUID& id, U1
 		return false;
 	}
 
+	LLViewerStatsRecorder::instance().textureFetch(data_size);
+	LLViewerStatsRecorder::instance().log(0.1f);
+
 	worker->lockWorkMutex();
 	
 	res = worker->insertPacket(packet_num, data, data_size);
@@ -3329,7 +3338,7 @@ bool LLTextureFetchDebugger::processStartDebug(F32 max_time)
 	}
 
 	//collect statistics
-	mTotalFetchingTime = gDebugTimers[0].getElapsedTimeF32() - mTotalFetchingTime;
+	mTotalFetchingTime = gTextureTimer.getElapsedTimeF32() - mTotalFetchingTime;
 	
 	std::set<LLUUID> fetched_textures;
 	S32 size = mFetchingHistory.size();
@@ -3418,20 +3427,18 @@ void LLTextureFetchDebugger::tryToStopDebug()
 	}
 
 	if(update(0.005f))
-	{
-		//unlock the fetcher
-		mFetcher->lockFetcher(false);
+		{
+	//unlock the fetcher
+	mFetcher->lockFetcher(false);
 		mFetcher->resetLoadSource();
-		mFreezeHistory = FALSE;		
+	mFreezeHistory = FALSE;
 		mStopDebug = FALSE;
 
 		if(mClearHistory)
 		{
 			mFetchingHistory.clear();
 			init();	
-			mTotalFetchingTime = gDebugTimers[0].getElapsedTimeF32(); //reset
-		}
-	}
+	mTotalFetchingTime = gTextureTimer.getElapsedTimeF32(); //reset
 }
 
 //called in the main thread and when the fetching queue is empty
@@ -3647,7 +3654,7 @@ S32 LLTextureFetchDebugger::fillCurlQueue()
 		headers.push_back("Accept: image/x-j2c");
 		mCurlGetRequest->getByteRange(texture_url, headers, 0, requestedSize, 0x10000, new LLDebuggerHTTPResponder(this, i));
 		
-		mFetchingHistory[i].mCurlState = FetchEntry::CURL_IN_PROGRESS;
+			mFetchingHistory[i].mCurlState = FetchEntry::CURL_IN_PROGRESS;
 		counter--;
 		if(counter < 1)
 		{
@@ -3677,7 +3684,7 @@ void LLTextureFetchDebugger::debugGLTextureCreation()
 			}
 		}
 	}
-	
+
 	mGLCreationTime = -1.f;
 	mTempIndex = 0;
 	mHistoryListIndex = 0;
@@ -3713,7 +3720,7 @@ bool LLTextureFetchDebugger::processGLCreation(F32 max_time)
 
 	if(mGLCreationTime < 0.f)
 	{
-		mGLCreationTime = mTimer.getElapsedTimeF32() ;
+	mGLCreationTime = mTimer.getElapsedTimeF32() ;
 	}
 	else
 	{
@@ -3787,7 +3794,7 @@ void LLTextureFetchDebugger::debugRefetchVisibleFromCache()
 
 	clearTextures();
 	mFetcher->setLoadSource(LLTextureFetch::FROM_ALL);
-	
+
 	mTimer.reset();
 	mFetcher->lockFetcher(false);
 	mRefetchVisCacheTime = -1.f;
@@ -3891,7 +3898,7 @@ bool LLTextureFetchDebugger::update(F32 max_time)
 	case GL_TEX:
 		if(processGLCreation(max_time))
 		{
-			mState = IDLE;
+		mState = IDLE;
 			mTempTexList.clear();
 		}
 		break;
diff --git a/indra/newview/lltexturefetch.h b/indra/newview/lltexturefetch.h
index f5072a79f16dc9ef566bfd9608f0615b0fb5215a..7ffa58660eb1bc9c3a221e4e35a8b12cfecce3a7 100644
--- a/indra/newview/lltexturefetch.h
+++ b/indra/newview/lltexturefetch.h
@@ -35,6 +35,7 @@
 #include "lltextureinfo.h"
 #include "llapr.h"
 #include "llimageworker.h"
+#include "llstat.h"
 //#include "lltexturecache.h"
 
 class LLViewerTexture;
@@ -171,7 +172,7 @@ class LLTextureFetch : public LLWorkerThread
 	LLTextureCache* mTextureCache;
 	LLImageDecodeThread* mImageDecodeThread;
 	LLCurlTextureRequest* mCurlGetRequest;
-
+	
 	// Map of all requests by UUID
 	typedef std::map<LLUUID,LLTextureFetchWorker*> map_t;
 	map_t mRequestMap;
@@ -221,7 +222,7 @@ class LLTextureFetch : public LLWorkerThread
 	//debug use
 	LLTextureFetchDebugger* mFetchDebugger;
 	bool mFetcherLocked;
-	
+
 	e_tex_source mFetchSource;
 	e_tex_source mOriginFetchSource;
 
@@ -361,11 +362,11 @@ class LLTextureFetchDebugger
 	
 	void setCurlGetRequest(LLCurlTextureRequest* request) { mCurlGetRequest = request;}
 	LLCurlTextureRequest* getCurlGetRequest() { return mCurlGetRequest;}
-
+	
 	void startWork(e_debug_state state);
 	void setStopDebug() {mStopDebug = TRUE;}
 	void tryToStopDebug(); //stop everything
-	
+
 	void callbackCacheRead(S32 id, bool success, LLImageFormatted* image,
 						   S32 imagesize, BOOL islocal);
 	void callbackCacheWrite(S32 id, bool success);
diff --git a/indra/newview/lltoastalertpanel.cpp b/indra/newview/lltoastalertpanel.cpp
index 8fef2ed6d1204151d0d46c25f3fcc85535312994..3f75f8da5e0212e88c034b37f367c87947e5b452 100644
--- a/indra/newview/lltoastalertpanel.cpp
+++ b/indra/newview/lltoastalertpanel.cpp
@@ -357,6 +357,7 @@ LLToastAlertPanel::LLToastAlertPanel( LLNotificationPtr notification, bool modal
 	if (mLineEditor)
 	{
 		mLineEditor->selectAll();
+		mLineEditor->setFocus(TRUE);
 	}
 	if(mDefaultOption >= 0)
 	{
diff --git a/indra/newview/llviewerassetstats.cpp b/indra/newview/llviewerassetstats.cpp
index 4c59fd037195925fe656ac3d99a5085061381173..e556743cbf23bb17785f76251f877bbd9625de40 100755
--- a/indra/newview/llviewerassetstats.cpp
+++ b/indra/newview/llviewerassetstats.cpp
@@ -369,8 +369,8 @@ LLViewerAssetStats::asLLSD(bool compact_output)
 		std::string rez_status_name = LLVOAvatar::rezStatusToString(rez_stat);
 		avatar_info[avatar_nearby_tag][rez_status_name] = mAvatarRezStates[rez_stat];
 	}
-	avatar_info[avatar_phase_stats_tag]["cloud"] = mPhaseStats["cloud"].getData();
-	avatar_info[avatar_phase_stats_tag]["cloud-or-gray"] = mPhaseStats["cloud-or-gray"].getData();
+	avatar_info[avatar_phase_stats_tag]["cloud"] = mPhaseStats["cloud"].asLLSD();
+	avatar_info[avatar_phase_stats_tag]["cloud-or-gray"] = mPhaseStats["cloud-or-gray"].asLLSD();
 	ret[avatar_tag] = avatar_info;
 	
 	return ret;
diff --git a/indra/newview/llviewerdisplay.cpp b/indra/newview/llviewerdisplay.cpp
index d58ee05fb6bb25d1bb9d938df9a33d40c79c1d17..ffeea2f4df936aa827557f97016c393394a18b69 100644
--- a/indra/newview/llviewerdisplay.cpp
+++ b/indra/newview/llviewerdisplay.cpp
@@ -168,7 +168,6 @@ static LLFastTimer::DeclareTimer FTM_UPDATE_CAMERA("Update Camera");
 void display_update_camera()
 {
 	LLFastTimer t(FTM_UPDATE_CAMERA);
-	LLMemType mt_uc(LLMemType::MTYPE_DISPLAY_UPDATE_CAMERA);
 	// TODO: cut draw distance down if customizing avatar?
 	// TODO: cut draw distance on per-parcel basis?
 
@@ -218,7 +217,7 @@ static LLFastTimer::DeclareTimer FTM_UPDATE_SKY("Update Sky");
 static LLFastTimer::DeclareTimer FTM_UPDATE_TEXTURES("Update Textures");
 static LLFastTimer::DeclareTimer FTM_IMAGE_UPDATE("Update Images");
 static LLFastTimer::DeclareTimer FTM_IMAGE_UPDATE_CLASS("Class");
-static LLFastTimer::DeclareTimer FTM_IMAGE_UPDATE_BUMP("Bump");
+static LLFastTimer::DeclareTimer FTM_IMAGE_UPDATE_BUMP("Image Update Bump");
 static LLFastTimer::DeclareTimer FTM_IMAGE_UPDATE_LIST("List");
 static LLFastTimer::DeclareTimer FTM_IMAGE_UPDATE_DELETE("Delete");
 static LLFastTimer::DeclareTimer FTM_RESIZE_WINDOW("Resize Window");
@@ -230,7 +229,6 @@ static LLFastTimer::DeclareTimer FTM_TELEPORT_DISPLAY("Teleport Display");
 // Paint the display!
 void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
 {
-	LLMemType mt_render(LLMemType::MTYPE_RENDER);
 	LLFastTimer t(FTM_RENDER);
 
 	if (gWindowResized)
@@ -581,7 +579,6 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
 	
 	if (!gDisconnected)
 	{
-		LLMemType mt_du(LLMemType::MTYPE_DISPLAY_UPDATE);
 		LLAppViewer::instance()->pingMainloopTimeout("Display:Update");
 		if (gPipeline.hasRenderType(LLPipeline::RENDER_TYPE_HUD))
 		{ //don't draw hud objects in this frame
@@ -603,7 +600,6 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
 		// *TODO: merge these two methods
 		{
 			LLFastTimer t(FTM_HUD_UPDATE);
-			LLMemType mt_uh(LLMemType::MTYPE_DISPLAY_UPDATE_HUD);
 			LLHUDManager::getInstance()->updateEffects();
 			LLHUDObject::updateAll();
 			stop_glerror();
@@ -611,7 +607,6 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
 
 		{
 			LLFastTimer t(FTM_DISPLAY_UPDATE_GEOM);
-			LLMemType mt_ug(LLMemType::MTYPE_DISPLAY_UPDATE_GEOM);
 			const F32 max_geom_update_time = 0.005f*10.f*gFrameIntervalSeconds; // 50 ms/second update time
 			gPipeline.createObjects(max_geom_update_time);
 			gPipeline.processPartitionQ();
@@ -672,8 +667,6 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
 		LLAppViewer::instance()->pingMainloopTimeout("Display:Swap");
 		
 		{ 
-			LLMemType mt_ds(LLMemType::MTYPE_DISPLAY_SWAP);
-
 			if (gResizeScreenTexture)
 			{
 				gResizeScreenTexture = FALSE;
@@ -732,7 +725,6 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
 
 		//if (!for_snapshot)
 		{
-			LLMemType mt_gw(LLMemType::MTYPE_DISPLAY_GEN_REFLECTION);
 			LLAppViewer::instance()->pingMainloopTimeout("Display:Imagery");
 			gPipeline.generateWaterReflection(*LLViewerCamera::getInstance());
 			gPipeline.generateHighlight(*LLViewerCamera::getInstance());
@@ -752,7 +744,6 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
 		LLAppViewer::instance()->pingMainloopTimeout("Display:UpdateImages");
 		
 		{
-			LLMemType mt_iu(LLMemType::MTYPE_DISPLAY_IMAGE_UPDATE);
 			LLFastTimer t(FTM_IMAGE_UPDATE);
 			
 			{
@@ -796,7 +787,6 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
 		LLAppViewer::instance()->pingMainloopTimeout("Display:StateSort");
 		{
 			LLViewerCamera::sCurCameraID = LLViewerCamera::CAMERA_WORLD;
-			LLMemType mt_ss(LLMemType::MTYPE_DISPLAY_STATE_SORT);
 			gPipeline.stateSort(*LLViewerCamera::getInstance(), result);
 			stop_glerror();
 				
@@ -818,7 +808,6 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
 		LLPipeline::sUseOcclusion = occlusion;
 
 		{
-			LLMemType mt_ds(LLMemType::MTYPE_DISPLAY_SKY);
 			LLAppViewer::instance()->pingMainloopTimeout("Display:Sky");
 			LLFastTimer t(FTM_UPDATE_SKY);	
 			gSky.updateSky();
@@ -907,7 +896,6 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
 				&& !gRestoreGL)
 		{
 			LLViewerCamera::sCurCameraID = LLViewerCamera::CAMERA_WORLD;
-			LLMemType mt_rg(LLMemType::MTYPE_DISPLAY_RENDER_GEOM);
 
 			if (gSavedSettings.getBOOL("RenderDepthPrePass") && LLGLSLShader::sNoFixedFunction)
 			{
@@ -968,7 +956,6 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
 		
 		if (to_texture)
 		{
-			LLMemType mt_rf(LLMemType::MTYPE_DISPLAY_RENDER_FLUSH);
 			if (LLPipeline::sRenderDeferred && !LLPipeline::sUnderWaterRender)
 			{
 				gPipeline.mDeferredScreen.flush();
@@ -1035,7 +1022,6 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
 
 void render_hud_attachments()
 {
-	LLMemType mt_ra(LLMemType::MTYPE_DISPLAY_RENDER_ATTACHMENTS);
 	gGL.matrixMode(LLRender::MM_PROJECTION);
 	gGL.pushMatrix();
 	gGL.matrixMode(LLRender::MM_MODELVIEW);
@@ -1225,7 +1211,6 @@ static LLFastTimer::DeclareTimer FTM_SWAP("Swap");
 
 void render_ui(F32 zoom_factor, int subfield)
 {
-	LLMemType mt_ru(LLMemType::MTYPE_DISPLAY_RENDER_UI);
 	LLGLState::checkStates();
 	
 	glh::matrix4f saved_view = glh_get_current_modelview();
diff --git a/indra/newview/llviewerfloaterreg.cpp b/indra/newview/llviewerfloaterreg.cpp
index 1f7cf0cdd449b9e6d76362e472d93866039dd7c8..69586e363463fe9b39ecdf9f1f2f9e2dec3fb01a 100644
--- a/indra/newview/llviewerfloaterreg.cpp
+++ b/indra/newview/llviewerfloaterreg.cpp
@@ -73,7 +73,6 @@
 #include "llfloaterinspect.h"
 #include "llfloaterinventory.h"
 #include "llfloaterjoystick.h"
-#include "llfloaterlagmeter.h"
 #include "llfloaterland.h"
 #include "llfloaterlandholdings.h"
 #include "llfloatermap.h"
@@ -227,7 +226,6 @@ void LLViewerFloaterReg::registerFloaters()
 	LLNotificationsUI::registerFloater();
 	LLFloaterDisplayNameUtil::registerFloater();
 	
-	LLFloaterReg::add("lagmeter", "floater_lagmeter.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterLagMeter>);
 	LLFloaterReg::add("land_holdings", "floater_land_holdings.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterLandHoldings>);
 	
 	LLFloaterReg::add("mem_leaking", "floater_mem_leaking.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterMemLeak>);
diff --git a/indra/newview/llviewerkeyboard.cpp b/indra/newview/llviewerkeyboard.cpp
index 1aa9fd8a45d5a52db01e09a736a06aa4cbcdc78b..f5d3341c66dbeac6df7025cfe6d52fc42b230cd5 100644
--- a/indra/newview/llviewerkeyboard.cpp
+++ b/indra/newview/llviewerkeyboard.cpp
@@ -160,6 +160,11 @@ void agent_push_backward( EKeystate s )
 		camera_move_backward(s);
 		return;
 	}
+	else if (gAgentAvatarp->isSitting())
+	{
+		gAgentCamera.changeCameraToThirdPerson();
+		return;
+	}
 	agent_push_forwardbackward(s, -1, LLAgent::DOUBLETAP_BACKWARD);
 }
 
diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp
index 01a54509ef06cf32265091fd08df6a4cfa8a4401..4ec498dc338a55f8adb3f980e9c5d0078f8e812a 100644
--- a/indra/newview/llviewermenu.cpp
+++ b/indra/newview/llviewermenu.cpp
@@ -341,7 +341,8 @@ LLMenuParcelObserver::~LLMenuParcelObserver()
 
 void LLMenuParcelObserver::changed()
 {
-	gMenuHolder->childSetEnabled("Land Buy Pass", LLPanelLandGeneral::enableBuyPass(NULL));
+	LLParcel *parcel = LLViewerParcelMgr::getInstance()->getParcelSelection()->getParcel();
+	gMenuHolder->childSetEnabled("Land Buy Pass", LLPanelLandGeneral::enableBuyPass(NULL) && !(parcel->getOwnerID()== gAgent.getID()));
 	
 	BOOL buyable = enable_buy_land(NULL);
 	gMenuHolder->childSetEnabled("Land Buy", buyable);
@@ -1316,22 +1317,6 @@ class LLAdvancedPrintAgentInfo : public view_listener_t
 	}
 };
 
-
-
-////////////////////////////////
-// PRINT TEXTURE MEMORY STATS //
-////////////////////////////////
-
-
-class LLAdvancedPrintTextureMemoryStats : public view_listener_t
-{
-	bool handleEvent(const LLSD& userdata)
-	{
-		output_statistics(NULL);
-		return true;
-	}
-};
-
 //////////////////
 // DEBUG CLICKS //
 //////////////////
@@ -3463,6 +3448,20 @@ bool enable_sitdown_self()
     return isAgentAvatarValid() && !gAgentAvatarp->isSitting() && !gAgent.getFlying();
 }
 
+class LLCheckPanelPeopleTab : public view_listener_t
+{
+	bool handleEvent(const LLSD& userdata)
+		{
+			std::string panel_name = userdata.asString();
+
+			LLPanel *panel = LLFloaterSidePanelContainer::getPanel("people", panel_name);
+			if(panel && panel->isInVisibleChain())
+			{
+				return true;
+			}
+			return false;
+		}
+};
 // Toggle one of "People" panel tabs in side tray.
 class LLTogglePanelPeopleTab : public view_listener_t
 {
@@ -3940,6 +3939,7 @@ class LLViewToggleUI : public view_listener_t
 		if (option == 0) // OK
 		{
 			gViewerWindow->setUIVisibility(!gViewerWindow->getUIVisibility());
+			LLPanelStandStopFlying::getInstance()->setVisible(gViewerWindow->getUIVisibility());
 		}
 	}
 };
@@ -8432,7 +8432,6 @@ void initialize_menus()
 	commit.add("Advanced.DumpFocusHolder", boost::bind(&handle_dump_focus) );
 	view_listener_t::addMenu(new LLAdvancedPrintSelectedObjectInfo(), "Advanced.PrintSelectedObjectInfo");
 	view_listener_t::addMenu(new LLAdvancedPrintAgentInfo(), "Advanced.PrintAgentInfo");
-	view_listener_t::addMenu(new LLAdvancedPrintTextureMemoryStats(), "Advanced.PrintTextureMemoryStats");
 	view_listener_t::addMenu(new LLAdvancedToggleDebugClicks(), "Advanced.ToggleDebugClicks");
 	view_listener_t::addMenu(new LLAdvancedCheckDebugClicks(), "Advanced.CheckDebugClicks");
 	view_listener_t::addMenu(new LLAdvancedCheckDebugViews(), "Advanced.CheckDebugViews");
@@ -8551,6 +8550,7 @@ void initialize_menus()
 
 	// we don't use boost::bind directly to delay side tray construction
 	view_listener_t::addMenu( new LLTogglePanelPeopleTab(), "SideTray.PanelPeopleTab");
+	view_listener_t::addMenu( new LLCheckPanelPeopleTab(), "SideTray.CheckPanelPeopleTab");
 
 	 // Avatar pie menu
 	view_listener_t::addMenu(new LLObjectMute(), "Avatar.Mute");
diff --git a/indra/newview/llviewermenufile.cpp b/indra/newview/llviewermenufile.cpp
index dc2ea4bd1f48d98be0cd2655b5c6538b9f2bae0a..be78603e2d628be3c212098af58c5b1593b4177d 100644
--- a/indra/newview/llviewermenufile.cpp
+++ b/indra/newview/llviewermenufile.cpp
@@ -34,6 +34,7 @@
 #include "llfilepicker.h"
 #include "llfloaterreg.h"
 #include "llbuycurrencyhtml.h"
+#include "llfloatermap.h"
 #include "llfloatermodelpreview.h"
 #include "llfloatersnapshot.h"
 #include "llimage.h"
@@ -475,7 +476,7 @@ class LLFileEnableCloseWindow : public view_listener_t
 {
 	bool handleEvent(const LLSD& userdata)
 	{
-		bool new_value = NULL != LLFloater::getClosableFloaterFromFocus();
+		bool new_value = NULL != gFloaterView->getFrontmostClosableFloater();
 		return new_value;
 	}
 };
@@ -484,8 +485,7 @@ class LLFileCloseWindow : public view_listener_t
 {
 	bool handleEvent(const LLSD& userdata)
 	{
-		LLFloater::closeFocusedFloater();
-
+		LLFloater::closeFrontmostFloater();
 		return true;
 	}
 };
@@ -494,7 +494,7 @@ class LLFileEnableCloseAllWindows : public view_listener_t
 {
 	bool handleEvent(const LLSD& userdata)
 	{
-		bool open_children = gFloaterView->allChildrenClosed();
+		bool open_children = gFloaterView->allChildrenClosed() && !LLFloaterSnapshot::getInstance()->isInVisibleChain();
 		return !open_children;
 	}
 };
@@ -505,7 +505,7 @@ class LLFileCloseAllWindows : public view_listener_t
 	{
 		bool app_quitting = false;
 		gFloaterView->closeAllChildren(app_quitting);
-
+		LLFloaterSnapshot::getInstance()->closeFloater(app_quitting);
 		return true;
 	}
 };
diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp
index 903f4437a7ea11bcf1d53529fcf8ef39f78beb34..85ea54383863deb20b4bbaeb05720e3655cb5622 100755
--- a/indra/newview/llviewermessage.cpp
+++ b/indra/newview/llviewermessage.cpp
@@ -3007,11 +3007,11 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
 				}
 				else
 				{
-					LLNotification::Params params("TeleportOffered");
-					params.substitutions = args;
-					params.payload = payload;
-					LLPostponedNotification::add<LLPostponedOfferNotification>(	params, from_id, false);
-				}
+			    LLNotification::Params params("TeleportOffered");
+			    params.substitutions = args;
+			    params.payload = payload;
+			    LLPostponedNotification::add<LLPostponedOfferNotification>(	params, from_id, false);
+			}
 
 			}
 		}
@@ -3102,10 +3102,10 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
 			}
 			else
 			{
-				// do not show a message box, because you're about to be
-				// teleported.
-				LLNotifications::instance().forceResponse(LLNotification::Params("TeleportOffered").payload(payload), 0);
-			}
+			// do not show a message box, because you're about to be
+			// teleported.
+			LLNotifications::instance().forceResponse(LLNotification::Params("TeleportOffered").payload(payload), 0);
+		}
 		}
 		break;
 
@@ -4276,7 +4276,7 @@ void send_agent_update(BOOL force_send, BOOL send_reliable)
 		msg_number += 1;
 		if (head_rot_chg < THRESHOLD_HEAD_ROT_QDOT)
 		{
-			//LL_INFOS("Messaging") << " head rot " << head_rotation << LL_ENDL;
+			//LL_INFOS("Messaging") << "head rot " << head_rotation << LL_ENDL;
 			LL_INFOS("Messaging") << "msg " << msg_number << ", frame " << LLFrameTimer::getFrameCount() << ", head_rot_chg " << head_rot_chg << LL_ENDL;
 		}
 		if (cam_rot_chg.magVec() > ROTATION_THRESHOLD) 
@@ -4295,7 +4295,7 @@ void send_agent_update(BOOL force_send, BOOL send_reliable)
 		{
 			LL_INFOS("Messaging") << "msg " << msg_number << ", frame " << LLFrameTimer::getFrameCount() << ", dcf = " << control_flag_change << LL_ENDL;
 		}
-		*/
+*/
 
 		duplicate_count = 0;
 	}
@@ -4420,7 +4420,6 @@ extern U32 gObjectBits;
 
 void process_object_update(LLMessageSystem *mesgsys, void **user_data)
 {	
-	LLMemType mt(LLMemType::MTYPE_OBJECT);
 	// Update the data counters
 	if (mesgsys->getReceiveCompressedSize())
 	{
@@ -4437,7 +4436,6 @@ void process_object_update(LLMessageSystem *mesgsys, void **user_data)
 
 void process_compressed_object_update(LLMessageSystem *mesgsys, void **user_data)
 {
-	LLMemType mt(LLMemType::MTYPE_OBJECT);
 	// Update the data counters
 	if (mesgsys->getReceiveCompressedSize())
 	{
@@ -4454,7 +4452,6 @@ void process_compressed_object_update(LLMessageSystem *mesgsys, void **user_data
 
 void process_cached_object_update(LLMessageSystem *mesgsys, void **user_data)
 {
-	LLMemType mt(LLMemType::MTYPE_OBJECT);
 	// Update the data counters
 	if (mesgsys->getReceiveCompressedSize())
 	{
@@ -4472,7 +4469,6 @@ void process_cached_object_update(LLMessageSystem *mesgsys, void **user_data)
 
 void process_terse_object_update_improved(LLMessageSystem *mesgsys, void **user_data)
 {
-	LLMemType mt(LLMemType::MTYPE_OBJECT);
 	if (mesgsys->getReceiveCompressedSize())
 	{
 		gObjectBits += mesgsys->getReceiveCompressedSize() * 8;
@@ -4485,7 +4481,7 @@ void process_terse_object_update_improved(LLMessageSystem *mesgsys, void **user_
 	gObjectList.processCompressedObjectUpdate(mesgsys, user_data, OUT_TERSE_IMPROVED);
 }
 
-static LLFastTimer::DeclareTimer FTM_PROCESS_OBJECTS("Process Objects");
+static LLFastTimer::DeclareTimer FTM_PROCESS_OBJECTS("Process Kill Objects");
 
 
 void process_kill_object(LLMessageSystem *mesgsys, void **user_data)
@@ -5629,14 +5625,14 @@ static void process_money_balance_reply_extended(LLMessageSystem* msg)
 bool handle_prompt_for_maturity_level_change_callback(const LLSD& notification, const LLSD& response)
 {
 	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
-	
+
 	if (0 == option)
 	{
 		// set the preference to the maturity of the region we're calling
 		U8 preferredMaturity = static_cast<U8>(notification["payload"]["_region_access"].asInteger());
 		gSavedSettings.setU32("PreferredMaturity", static_cast<U32>(preferredMaturity));
 	}
-	
+
 	return false;
 }
 
@@ -5699,7 +5695,7 @@ bool handle_special_notification(std::string notificationID, LLSD& llsdBlock)
 			gAgent.clearTeleportRequest();
 			maturityLevelNotification = LLNotificationsUtil::add(notificationID+"_AdultsOnlyContent", llsdBlock);
 			returnValue = true;
-
+	
 			notifySuffix = "_NotifyAdultsOnly";
 		}
 		else if (gAgent.prefersPG() || gAgent.prefersMature())
@@ -5796,7 +5792,7 @@ bool handle_teleport_access_blocked(LLSD& llsdBlock)
 			maturityLevelNotification = LLNotificationsUtil::add(notificationID+"_PreferencesOutOfSync", llsdBlock, llsdBlock, handle_prompt_for_maturity_level_change_callback);
 			returnValue = true;
 		}
-	}
+		}
 
 	if ((maturityLevelNotification == NULL) || maturityLevelNotification->isIgnored())
 	{
@@ -5962,8 +5958,8 @@ void process_alert_core(const std::string& message, BOOL modal)
 		std::string alert_name(message.substr(ALERT_PREFIX.length()));
 		if (!handle_special_alerts(alert_name))
 		{
-			LLNotificationsUtil::add(alert_name);
-		}
+		LLNotificationsUtil::add(alert_name);
+	}
 	}
 	else if (message.find(NOTIFY_PREFIX) == 0)
 	{
diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp
index 444bbb27769e6933d473c8676729d7b48411599e..aba1d131e1d05616516505afdfc5b28c9104d27d 100644
--- a/indra/newview/llviewerobject.cpp
+++ b/indra/newview/llviewerobject.cpp
@@ -875,7 +875,6 @@ U32 LLViewerObject::processUpdateMessage(LLMessageSystem *mesgsys,
 					 const EObjectUpdateType update_type,
 					 LLDataPacker *dp)
 {
-	LLMemType mt(LLMemType::MTYPE_OBJECT);
 	U32 retval = 0x0;
 	
 	// If region is removed from the list it is also deleted.
@@ -2044,7 +2043,7 @@ U32 LLViewerObject::processUpdateMessage(LLMessageSystem *mesgsys,
 		if (new_angv != old_angv)
 		{
 			if (flagUsePhysics())
-			{
+		{
 				resetRot();
 			}
 			else
@@ -2052,7 +2051,7 @@ U32 LLViewerObject::processUpdateMessage(LLMessageSystem *mesgsys,
 				resetRotTime();
 			}
 		}
-
+		
 		// Set the rotation of the object followed by adjusting for the accumulated angular velocity (llSetTargetOmega)
 		setRotation(new_rot * mAngularVelocityRot);
 		setChanged(ROTATED | SILHOUETTE);
@@ -2341,8 +2340,6 @@ void LLViewerObject::interpolateLinearMotion(const F64 & time, const F32 & dt)
 
 BOOL LLViewerObject::setData(const U8 *datap, const U32 data_size)
 {
-	LLMemType mt(LLMemType::MTYPE_OBJECT);
-	
 	delete [] mData;
 
 	if (datap)
@@ -2384,8 +2381,6 @@ void LLViewerObject::doUpdateInventory(
 	U8 key,
 	bool is_new)
 {
-	LLMemType mt(LLMemType::MTYPE_OBJECT);
-
 	LLViewerInventoryItem* old_item = NULL;
 	if(TASK_INVENTORY_ITEM_KEY == key)
 	{
@@ -2469,8 +2464,6 @@ void LLViewerObject::saveScript(
 	BOOL active,
 	bool is_new)
 {
-	LLMemType mt(LLMemType::MTYPE_OBJECT);
-
 	/*
 	 * XXXPAM Investigate not making this copy.  Seems unecessary, but I'm unsure about the
 	 * interaction with doUpdateInventory() called below.
@@ -2546,8 +2539,6 @@ void LLViewerObject::dirtyInventory()
 
 void LLViewerObject::registerInventoryListener(LLVOInventoryListener* listener, void* user_data)
 {
-	LLMemType mt(LLMemType::MTYPE_OBJECT);
-	
 	LLInventoryCallbackInfo* info = new LLInventoryCallbackInfo;
 	info->mListener = listener;
 	info->mInventoryData = user_data;
@@ -2645,8 +2636,6 @@ S32 LLFilenameAndTask::sCount = 0;
 // static
 void LLViewerObject::processTaskInv(LLMessageSystem* msg, void** user_data)
 {
-	LLMemType mt(LLMemType::MTYPE_OBJECT);
-	
 	LLUUID task_id;
 	msg->getUUIDFast(_PREHASH_InventoryData, _PREHASH_TaskID, task_id);
 	LLViewerObject* object = gObjectList.findObject(task_id);
@@ -2733,8 +2722,6 @@ void LLViewerObject::processTaskInvFile(void** user_data, S32 error_code, LLExtS
 
 void LLViewerObject::loadTaskInvFile(const std::string& filename)
 {
-	LLMemType mt(LLMemType::MTYPE_OBJECT);
-	
 	std::string filename_and_local_path = gDirUtilp->getExpandedFilename(LL_PATH_CACHE, filename);
 	llifstream ifs(filename_and_local_path);
 	if(ifs.good())
@@ -2858,8 +2845,6 @@ void LLViewerObject::updateInventory(
 	U8 key,
 	bool is_new)
 {
-	LLMemType mt(LLMemType::MTYPE_OBJECT);
-
 	std::list<LLUUID>::iterator begin = mPendingInventoryItemsIDs.begin();
 	std::list<LLUUID>::iterator end = mPendingInventoryItemsIDs.end();
 
@@ -3883,8 +3868,6 @@ std::string LLViewerObject::getMediaURL() const
 
 void LLViewerObject::setMediaURL(const std::string& media_url)
 {
-	LLMemType mt(LLMemType::MTYPE_OBJECT);
-	
 	if (!mMedia)
 	{
 		mMedia = new LLViewerObjectMedia;
@@ -3934,8 +3917,6 @@ BOOL LLViewerObject::setMaterial(const U8 material)
 
 void LLViewerObject::setNumTEs(const U8 num_tes)
 {
-	LLMemType mt(LLMemType::MTYPE_OBJECT);
-	
 	U32 i;
 	if (num_tes != getNumTEs())
 	{
@@ -5436,7 +5417,7 @@ void LLViewerObject::applyAngularVelocity(F32 dt)
 		
 		// calculate the delta increment based on the object's angular velocity
 		dQ.setQuat(angle, ang_vel);
-
+		
 		// accumulate the angular velocity rotations to re-apply in the case of an object update
 		mAngularVelocityRot *= dQ;
 		
diff --git a/indra/newview/llviewerobject.h b/indra/newview/llviewerobject.h
index 277bd1c430bf04a30cabe9b75505ba2345fd75e8..02b4f84785d40964280a94ca88d3b0634d29e6fb 100644
--- a/indra/newview/llviewerobject.h
+++ b/indra/newview/llviewerobject.h
@@ -34,7 +34,6 @@
 #include "llhudicon.h"
 #include "llinventory.h"
 #include "llrefcount.h"
-#include "llmemtype.h"
 #include "llprimitive.h"
 #include "lluuid.h"
 #include "llvoinventorylistener.h"
@@ -128,7 +127,6 @@ class LLViewerObject : public LLPrimitive, public LLRefCount, public LLGLUpdate
 	typedef const child_list_t const_child_list_t;
 
 	LLViewerObject(const LLUUID &id, const LLPCode pcode, LLViewerRegion *regionp, BOOL is_global = FALSE);
-	MEM_TYPE_NEW(LLMemType::MTYPE_OBJECT);
 
 	virtual void markDead();				// Mark this object as dead, and clean up its references
 	BOOL isDead() const									{return mDead;}
diff --git a/indra/newview/llviewerobjectlist.cpp b/indra/newview/llviewerobjectlist.cpp
index e399b45cba00d0b799cc03e09346e9bb7ec5e21c..88bb087742ad2b1d51814aa0d83bb923bf0529fa 100644
--- a/indra/newview/llviewerobjectlist.cpp
+++ b/indra/newview/llviewerobjectlist.cpp
@@ -230,7 +230,6 @@ void LLViewerObjectList::processUpdateCore(LLViewerObject* objectp,
 										   LLDataPacker* dpp, 
 										   BOOL just_created)
 {
-	LLMemType mt(LLMemType::MTYPE_OBJECT_PROCESS_UPDATE_CORE);
 	LLMessageSystem* msg = gMessageSystem;
 
 	// ignore returned flags
@@ -283,7 +282,6 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys,
 											 const EObjectUpdateType update_type,
 											 bool cached, bool compressed)
 {
-	LLMemType mt(LLMemType::MTYPE_OBJECT_PROCESS_UPDATE);
 	LLFastTimer t(FTM_PROCESS_OBJECTS);	
 	
 	LLVector3d camera_global = gAgentCamera.getCameraPositionGlobal();
@@ -334,6 +332,7 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys,
 
 	U64 region_handle;
 	mesgsys->getU64Fast(_PREHASH_RegionData, _PREHASH_RegionHandle, region_handle);
+	
 	LLViewerRegion *regionp = LLWorld::getInstance()->getRegionFromHandle(region_handle);
 
 	if (!regionp)
@@ -345,16 +344,14 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys,
 	U8 compressed_dpbuffer[2048];
 	LLDataPackerBinaryBuffer compressed_dp(compressed_dpbuffer, 2048);
 	LLDataPacker *cached_dpp = NULL;
-
-#if LL_RECORD_VIEWER_STATS
-	LLViewerStatsRecorder::instance()->beginObjectUpdateEvents(regionp);
-#endif
+	LLViewerStatsRecorder& recorder = LLViewerStatsRecorder::instance();
 
 	for (i = 0; i < num_objects; i++)
 	{
 		// timer is unused?
 		LLTimer update_timer;
 		BOOL justCreated = FALSE;
+		S32	msg_size = 0;
 
 		if (cached)
 		{
@@ -362,6 +359,7 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys,
 			U32 crc;
 			mesgsys->getU32Fast(_PREHASH_ObjectData, _PREHASH_ID, id, i);
 			mesgsys->getU32Fast(_PREHASH_ObjectData, _PREHASH_CRC, crc, i);
+			msg_size += sizeof(U32) * 2;
 		
 			// Lookup data packer and add this id to cache miss lists if necessary.
 			U8 cache_miss_type = LLViewerRegion::CACHE_MISS_TYPE_NONE;
@@ -377,9 +375,7 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys,
 			else
 			{
 				// Cache Miss.
-				#if LL_RECORD_VIEWER_STATS
-				LLViewerStatsRecorder::instance()->recordCacheMissEvent(id, update_type, cache_miss_type);
-				#endif
+				recorder.cacheMissEvent(id, update_type, cache_miss_type, msg_size);
 
 				continue; // no data packer, skip this object
 			}
@@ -422,6 +418,8 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys,
 		else if (update_type != OUT_FULL) // !compressed, !OUT_FULL ==> OUT_FULL_CACHED only?
 		{
 			mesgsys->getU32Fast(_PREHASH_ObjectData, _PREHASH_ID, local_id, i);
+			msg_size += sizeof(U32);
+
 			getUUIDFromLocal(fullid,
 							local_id,
 							gMessageSystem->getSenderIP(),
@@ -436,6 +434,8 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys,
 		{
 			mesgsys->getUUIDFast(_PREHASH_ObjectData, _PREHASH_FullID, fullid, i);
 			mesgsys->getU32Fast(_PREHASH_ObjectData, _PREHASH_ID, local_id, i);
+			msg_size += sizeof(LLUUID);
+			msg_size += sizeof(U32);
 			// llinfos << "Full Update, obj " << local_id << ", global ID" << fullid << "from " << mesgsys->getSender() << llendl;
 		}
 		objectp = findObject(fullid);
@@ -481,9 +481,7 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys,
 				if (update_type == OUT_TERSE_IMPROVED)
 				{
 					// llinfos << "terse update for an unknown object (compressed):" << fullid << llendl;
-					#if LL_RECORD_VIEWER_STATS
-					LLViewerStatsRecorder::instance()->recordObjectUpdateFailure(local_id, update_type);
-					#endif
+					recorder.objectUpdateFailure(local_id, update_type, msg_size);
 					continue;
 				}
 			}
@@ -495,22 +493,20 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys,
 				if (update_type != OUT_FULL)
 				{
 					//llinfos << "terse update for an unknown object:" << fullid << llendl;
-					#if LL_RECORD_VIEWER_STATS
-					LLViewerStatsRecorder::instance()->recordObjectUpdateFailure(local_id, update_type);
-					#endif
+					recorder.objectUpdateFailure(local_id, update_type, msg_size);
 					continue;
 				}
 
 				mesgsys->getU8Fast(_PREHASH_ObjectData, _PREHASH_PCode, pcode, i);
+				msg_size += sizeof(U8);
+
 			}
 #ifdef IGNORE_DEAD
 			if (mDeadObjects.find(fullid) != mDeadObjects.end())
 			{
 				mNumDeadObjectUpdates++;
 				//llinfos << "update for a dead object:" << fullid << llendl;
-				#if LL_RECORD_VIEWER_STATS
-				LLViewerStatsRecorder::instance()->recordObjectUpdateFailure(local_id, update_type);
-				#endif
+				recorder.objectUpdateFailure(local_id, update_type, msg_size);
 				continue;
 			}
 #endif
@@ -519,9 +515,7 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys,
 			if (!objectp)
 			{
 				llinfos << "createObject failure for object: " << fullid << llendl;
-				#if LL_RECORD_VIEWER_STATS
-				LLViewerStatsRecorder::instance()->recordObjectUpdateFailure(local_id, update_type);
-				#endif
+				recorder.objectUpdateFailure(local_id, update_type, msg_size);
 				continue;
 			}
 			justCreated = TRUE;
@@ -547,12 +541,8 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys,
 			if (update_type != OUT_TERSE_IMPROVED) // OUT_FULL_COMPRESSED only?
 			{
 				bCached = true;
-				#if LL_RECORD_VIEWER_STATS
 				LLViewerRegion::eCacheUpdateResult result = objectp->mRegionp->cacheFullUpdate(objectp, compressed_dp);
-				LLViewerStatsRecorder::instance()->recordCacheFullUpdate(local_id, update_type, result, objectp);
-				#else
-				objectp->mRegionp->cacheFullUpdate(objectp, compressed_dp);
-				#endif
+				recorder.cacheFullUpdate(local_id, update_type, result, objectp, msg_size);
 			}
 		}
 		else if (cached) // Cache hit only?
@@ -568,16 +558,12 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys,
 			}
 			processUpdateCore(objectp, user_data, i, update_type, NULL, justCreated);
 		}
-		#if LL_RECORD_VIEWER_STATS
-		LLViewerStatsRecorder::instance()->recordObjectUpdateEvent(local_id, update_type, objectp);
-		#endif
+		recorder.objectUpdateEvent(local_id, update_type, objectp, msg_size);
 		objectp->setLastUpdateType(update_type);
 		objectp->setLastUpdateCached(bCached);
 	}
 
-#if LL_RECORD_VIEWER_STATS
-	LLViewerStatsRecorder::instance()->endObjectUpdateEvents();
-#endif
+	recorder.log(0.2f);
 
 	LLVOAvatar::cullAvatarsByPixelArea();
 }
@@ -866,8 +852,6 @@ class LLPhysicsFlagsResponder : public LLCurl::Responder
 
 void LLViewerObjectList::update(LLAgent &agent, LLWorld &world)
 {
-	LLMemType mt(LLMemType::MTYPE_OBJECT);
-
 	// Update globals
 	LLViewerObject::setVelocityInterpolate( gSavedSettings.getBOOL("VelocityInterpolate") );
 	LLViewerObject::setPingInterpolate( gSavedSettings.getBOOL("PingInterpolate") );
@@ -915,12 +899,12 @@ void LLViewerObjectList::update(LLAgent &agent, LLWorld &world)
 	static std::vector<LLViewerObject*> idle_list;
 
 	U32 idle_count = 0;
-		
+	
 	static LLFastTimer::DeclareTimer idle_copy("Idle Copy");
 
 	{
 		LLFastTimer t(idle_copy);
-		
+
  		for (std::vector<LLPointer<LLViewerObject> >::iterator active_iter = mActiveObjects.begin();
 			active_iter != mActiveObjects.end(); active_iter++)
 		{
@@ -929,9 +913,9 @@ void LLViewerObjectList::update(LLAgent &agent, LLWorld &world)
 			{
 				if (idle_count >= idle_list.size())
 				{
-					idle_list.push_back( objectp );
-				}
-				else
+				idle_list.push_back( objectp );
+			}
+			else
 				{
 					idle_list[idle_count] = objectp;
 				}
@@ -948,7 +932,7 @@ void LLViewerObjectList::update(LLAgent &agent, LLWorld &world)
 	std::vector<LLViewerObject*>::iterator idle_end = idle_list.begin()+idle_count;
 
 	if (gSavedSettings.getBOOL("FreezeTime"))
-	{	
+	{
 		
 		for (std::vector<LLViewerObject*>::iterator iter = idle_list.begin();
 			iter != idle_end; iter++)
@@ -1179,7 +1163,6 @@ void LLViewerObjectList::clearDebugText()
 
 void LLViewerObjectList::cleanupReferences(LLViewerObject *objectp)
 {
-	LLMemType mt(LLMemType::MTYPE_OBJECT);
 	if (mDeadObjects.find(objectp->mID) != mDeadObjects.end())
 	{
 		llinfos << "Object " << objectp->mID << " already on dead list!" << llendl;	
@@ -1407,7 +1390,6 @@ void LLViewerObjectList::removeFromActiveList(LLViewerObject* objectp)
 
 void LLViewerObjectList::updateActive(LLViewerObject *objectp)
 {
-	LLMemType mt(LLMemType::MTYPE_OBJECT);
 	if (objectp->isDead())
 	{
 		return; // We don't update dead objects!
@@ -1424,10 +1406,10 @@ void LLViewerObjectList::updateActive(LLViewerObject *objectp)
 			{
 				mActiveObjects.push_back(objectp);
 				objectp->setListIndex(mActiveObjects.size()-1);
-				objectp->setOnActiveList(TRUE);
-			}
-			else
-			{
+			objectp->setOnActiveList(TRUE);
+		}
+		else
+		{
 				llassert(idx < mActiveObjects.size());
 				llassert(mActiveObjects[idx] == objectp);
 
@@ -1553,13 +1535,13 @@ void LLViewerObjectList::shiftObjects(const LLVector3 &offset)
 
 	{
 		LLFastTimer t(FTM_PIPELINE_SHIFT);
-		gPipeline.shiftObjects(offset);
+	gPipeline.shiftObjects(offset);
 	}
 
 	{
 		LLFastTimer t(FTM_REGION_SHIFT);
-		LLWorld::getInstance()->shiftRegions(offset);
-	}
+	LLWorld::getInstance()->shiftRegions(offset);
+}
 }
 
 void LLViewerObjectList::repartitionObjects()
@@ -1886,7 +1868,6 @@ void LLViewerObjectList::resetObjectBeacons()
 
 LLViewerObject *LLViewerObjectList::createObjectViewer(const LLPCode pcode, LLViewerRegion *regionp)
 {
-	LLMemType mt(LLMemType::MTYPE_OBJECT);
 	LLUUID fullid;
 	fullid.generate();
 
@@ -1907,13 +1888,9 @@ LLViewerObject *LLViewerObjectList::createObjectViewer(const LLPCode pcode, LLVi
 }
 
 
-static LLFastTimer::DeclareTimer FTM_CREATE_OBJECT("Create Object");
-
 LLViewerObject *LLViewerObjectList::createObject(const LLPCode pcode, LLViewerRegion *regionp,
 												 const LLUUID &uuid, const U32 local_id, const LLHost &sender)
 {
-	LLMemType mt(LLMemType::MTYPE_OBJECT);
-	LLFastTimer t(FTM_CREATE_OBJECT);
 	
 	LLUUID fullid;
 	if (uuid == LLUUID::null)
@@ -1977,7 +1954,6 @@ S32 LLViewerObjectList::findReferences(LLDrawable *drawablep) const
 
 void LLViewerObjectList::orphanize(LLViewerObject *childp, U32 parent_id, U32 ip, U32 port)
 {
-	LLMemType mt(LLMemType::MTYPE_OBJECT);
 #ifdef ORPHAN_SPAM
 	llinfos << "Orphaning object " << childp->getID() << " with parent " << parent_id << llendl;
 #endif
diff --git a/indra/newview/llviewerparceloverlay.cpp b/indra/newview/llviewerparceloverlay.cpp
index a0cf2fc803634023f0a9f33dc989a8fa9195b210..a1c12c5cd6ead81bfc950b2fc4ff811ffd13933d 100644
--- a/indra/newview/llviewerparceloverlay.cpp
+++ b/indra/newview/llviewerparceloverlay.cpp
@@ -828,7 +828,6 @@ void LLViewerParcelOverlay::updateGL()
 
 void LLViewerParcelOverlay::idleUpdate(bool force_update)
 {
-	LLMemType mt_iup(LLMemType::MTYPE_IDLE_UPDATE_PARCEL_OVERLAY);
 	if (gGLManager.mIsDisabled)
 	{
 		return;
diff --git a/indra/newview/llviewerpartsim.cpp b/indra/newview/llviewerpartsim.cpp
index 345023dbfa42bf0138772bddb458a42a459a9c3f..6bd9f66b9c482e564ac34dbcb4434aefdfe84971 100644
--- a/indra/newview/llviewerpartsim.cpp
+++ b/indra/newview/llviewerpartsim.cpp
@@ -79,7 +79,6 @@ LLViewerPart::LLViewerPart() :
 	mVPCallback(NULL),
 	mImagep(NULL)
 {
-	LLMemType mt(LLMemType::MTYPE_PARTICLES);
 	mPartSourcep = NULL;
 
 	++LLViewerPartSim::sParticleCount2 ;
@@ -87,7 +86,6 @@ LLViewerPart::LLViewerPart() :
 
 LLViewerPart::~LLViewerPart()
 {
-	LLMemType mt(LLMemType::MTYPE_PARTICLES);
 	mPartSourcep = NULL;
 
 	--LLViewerPartSim::sParticleCount2 ;
@@ -95,7 +93,6 @@ LLViewerPart::~LLViewerPart()
 
 void LLViewerPart::init(LLPointer<LLViewerPartSource> sourcep, LLViewerTexture *imagep, LLVPCallback cb)
 {
-	LLMemType mt(LLMemType::MTYPE_PARTICLES);
 	mPartID = LLViewerPart::sNextPartID;
 	LLViewerPart::sNextPartID++;
 	mFlags = 0x00f;
@@ -120,7 +117,6 @@ void LLViewerPart::init(LLPointer<LLViewerPartSource> sourcep, LLViewerTexture *
 LLViewerPartGroup::LLViewerPartGroup(const LLVector3 &center_agent, const F32 box_side, bool hud)
  : mHud(hud)
 {
-	LLMemType mt(LLMemType::MTYPE_PARTICLES);
 	mVOPartGroupp = NULL;
 	mUniformParticles = TRUE;
 
@@ -177,7 +173,6 @@ LLViewerPartGroup::LLViewerPartGroup(const LLVector3 &center_agent, const F32 bo
 
 LLViewerPartGroup::~LLViewerPartGroup()
 {
-	LLMemType mt(LLMemType::MTYPE_PARTICLES);
 	cleanup();
 	
 	S32 count = (S32) mParticles.size();
@@ -192,7 +187,6 @@ LLViewerPartGroup::~LLViewerPartGroup()
 
 void LLViewerPartGroup::cleanup()
 {
-	LLMemType mt(LLMemType::MTYPE_PARTICLES);
 	if (mVOPartGroupp)
 	{
 		if (!mVOPartGroupp->isDead())
@@ -205,7 +199,6 @@ void LLViewerPartGroup::cleanup()
 
 BOOL LLViewerPartGroup::posInGroup(const LLVector3 &pos, const F32 desired_size)
 {
-	LLMemType mt(LLMemType::MTYPE_PARTICLES);
 	if ((pos.mV[VX] < mMinObjPos.mV[VX])
 		|| (pos.mV[VY] < mMinObjPos.mV[VY])
 		|| (pos.mV[VZ] < mMinObjPos.mV[VZ]))
@@ -233,8 +226,6 @@ BOOL LLViewerPartGroup::posInGroup(const LLVector3 &pos, const F32 desired_size)
 
 BOOL LLViewerPartGroup::addPart(LLViewerPart* part, F32 desired_size)
 {
-	LLMemType mt(LLMemType::MTYPE_PARTICLES);
-
 	if (part->mFlags & LLPartData::LL_PART_HUD && !mHud)
 	{
 		return FALSE;
@@ -261,7 +252,6 @@ BOOL LLViewerPartGroup::addPart(LLViewerPart* part, F32 desired_size)
 
 void LLViewerPartGroup::updateParticles(const F32 lastdt)
 {
-	LLMemType mt(LLMemType::MTYPE_PARTICLES);
 	F32 dt;
 	
 	LLVector3 gravity(0.f, 0.f, GRAVITY);
@@ -429,7 +419,6 @@ void LLViewerPartGroup::updateParticles(const F32 lastdt)
 
 void LLViewerPartGroup::shift(const LLVector3 &offset)
 {
-	LLMemType mt(LLMemType::MTYPE_PARTICLES);
 	mCenterAgent += offset;
 	mMinObjPos += offset;
 	mMaxObjPos += offset;
@@ -442,8 +431,6 @@ void LLViewerPartGroup::shift(const LLVector3 &offset)
 
 void LLViewerPartGroup::removeParticlesByID(const U32 source_id)
 {
-	LLMemType mt(LLMemType::MTYPE_PARTICLES);
-
 	for (S32 i = 0; i < (S32)mParticles.size(); i++)
 	{
 		if(mParticles[i]->mPartSourcep->getID() == source_id)
@@ -475,7 +462,6 @@ void LLViewerPartSim::checkParticleCount(U32 size)
 
 LLViewerPartSim::LLViewerPartSim()
 {
-	LLMemType mt(LLMemType::MTYPE_PARTICLES);
 	sMaxParticleCount = llmin(gSavedSettings.getS32("RenderMaxPartCount"), LL_MAX_PARTICLE_COUNT);
 	static U32 id_seed = 0;
 	mID = ++id_seed;
@@ -484,7 +470,6 @@ LLViewerPartSim::LLViewerPartSim()
 
 void LLViewerPartSim::destroyClass()
 {
-	LLMemType mt(LLMemType::MTYPE_PARTICLES);
 	S32 i;
 	S32 count;
 
@@ -500,9 +485,9 @@ void LLViewerPartSim::destroyClass()
 	mViewerPartSources.clear();
 }
 
+//static
 BOOL LLViewerPartSim::shouldAddPart()
 {
-	LLMemType mt(LLMemType::MTYPE_PARTICLES);
 	if (sParticleCount > PART_THROTTLE_THRESHOLD*sMaxParticleCount)
 	{
 
@@ -525,7 +510,6 @@ BOOL LLViewerPartSim::shouldAddPart()
 
 void LLViewerPartSim::addPart(LLViewerPart* part)
 {
-	LLMemType mt(LLMemType::MTYPE_PARTICLES);
 	if (sParticleCount < MAX_PART_COUNT)
 	{
 		put(part);
@@ -541,7 +525,6 @@ void LLViewerPartSim::addPart(LLViewerPart* part)
 
 LLViewerPartGroup *LLViewerPartSim::put(LLViewerPart* part)
 {
-	LLMemType mt(LLMemType::MTYPE_PARTICLES);
 	const F32 MAX_MAG = 1000000.f*1000000.f; // 1 million
 	LLViewerPartGroup *return_group = NULL ;
 	if (part->mPosAgent.magVecSquared() > MAX_MAG || !part->mPosAgent.isFinite())
@@ -599,7 +582,6 @@ LLViewerPartGroup *LLViewerPartSim::put(LLViewerPart* part)
 
 LLViewerPartGroup *LLViewerPartSim::createViewerPartGroup(const LLVector3 &pos_agent, const F32 desired_size, bool hud)
 {
-	LLMemType mt(LLMemType::MTYPE_PARTICLES);
 	//find a box that has a center position divisible by PART_SIM_BOX_SIDE that encompasses
 	//pos_agent
 	LLViewerPartGroup *groupp = new LLViewerPartGroup(pos_agent, desired_size, hud);
@@ -632,8 +614,6 @@ static LLFastTimer::DeclareTimer FTM_SIMULATE_PARTICLES("Simulate Particles");
 
 void LLViewerPartSim::updateSimulation()
 {
-	LLMemType mt(LLMemType::MTYPE_PARTICLES);
-	
 	static LLFrameTimer update_timer;
 
 	const F32 dt = llmin(update_timer.getElapsedTimeAndResetF32(), 0.1f);
@@ -800,7 +780,6 @@ void LLViewerPartSim::updatePartBurstRate()
 
 void LLViewerPartSim::addPartSource(LLPointer<LLViewerPartSource> sourcep)
 {
-	LLMemType mt(LLMemType::MTYPE_PARTICLES);
 	if (!sourcep)
 	{
 		llwarns << "Null part source!" << llendl;
@@ -817,7 +796,6 @@ void LLViewerPartSim::removeLastCreatedSource()
 
 void LLViewerPartSim::cleanupRegion(LLViewerRegion *regionp)
 {
-	LLMemType mt(LLMemType::MTYPE_PARTICLES);
 	for (group_list_t::iterator i = mViewerPartGroups.begin(); i != mViewerPartGroups.end(); )
 	{
 		group_list_t::iterator iter = i++;
@@ -832,7 +810,6 @@ void LLViewerPartSim::cleanupRegion(LLViewerRegion *regionp)
 
 void LLViewerPartSim::clearParticlesByID(const U32 system_id)
 {
-	LLMemType mt(LLMemType::MTYPE_PARTICLES);
 	for (group_list_t::iterator g = mViewerPartGroups.begin(); g != mViewerPartGroups.end(); ++g)
 	{
 		(*g)->removeParticlesByID(system_id);
@@ -850,7 +827,6 @@ void LLViewerPartSim::clearParticlesByID(const U32 system_id)
 
 void LLViewerPartSim::clearParticlesByOwnerID(const LLUUID& task_id)
 {
-	LLMemType mt(LLMemType::MTYPE_PARTICLES);
 	for (source_list_t::iterator iter = mViewerPartSources.begin(); iter != mViewerPartSources.end(); ++iter)
 	{
 		if ((*iter)->getOwnerUUID() == task_id)
diff --git a/indra/newview/llviewerpartsim.h b/indra/newview/llviewerpartsim.h
index c9959c63ec23376039ff6b059eb2664577c09a6c..c91fcf0691f986f6b3c34f8da93cd144c1e1c5fb 100644
--- a/indra/newview/llviewerpartsim.h
+++ b/indra/newview/llviewerpartsim.h
@@ -142,7 +142,7 @@ class LLViewerPartSim : public LLSingleton<LLViewerPartSim>
 
 	void cleanupRegion(LLViewerRegion *regionp);
 
-	BOOL shouldAddPart(); // Just decides whether this particle should be added or not (for particle count capping)
+	static BOOL shouldAddPart(); // Just decides whether this particle should be added or not (for particle count capping)
 	F32 maxRate() // Return maximum particle generation rate
 	{
 		if (sParticleCount >= MAX_PART_COUNT)
diff --git a/indra/newview/llviewerpartsource.cpp b/indra/newview/llviewerpartsource.cpp
index 4af92e79ffd959e13a0d8798d91b6fbda74a6d3d..b311f659fbd891f027b26903badd4b2bbc5242c7 100644
--- a/indra/newview/llviewerpartsource.cpp
+++ b/indra/newview/llviewerpartsource.cpp
@@ -90,7 +90,6 @@ void LLViewerPartSource::setStart()
 LLViewerPartSourceScript::LLViewerPartSourceScript(LLViewerObject *source_objp) :
 	LLViewerPartSource(LL_PART_SOURCE_SCRIPT)
 {
-	LLMemType mt(LLMemType::MTYPE_PARTICLES);
 	llassert(source_objp);
 	mSourceObjectp = source_objp;
 	mPosAgent = mSourceObjectp->getPositionAgent();
@@ -102,7 +101,6 @@ LLViewerPartSourceScript::LLViewerPartSourceScript(LLViewerObject *source_objp)
 
 void LLViewerPartSourceScript::setDead()
 {
-	LLMemType mt(LLMemType::MTYPE_PARTICLES);
 	mIsDead = TRUE;
 	mSourceObjectp = NULL;
 	mTargetObjectp = NULL;
@@ -113,7 +111,6 @@ void LLViewerPartSourceScript::update(const F32 dt)
 	if( mIsSuspended )
 		return;
 
-	LLMemType mt(LLMemType::MTYPE_PARTICLES);
 	F32 old_update_time = mLastUpdateTime;
 	mLastUpdateTime += dt;
 
@@ -394,7 +391,6 @@ void LLViewerPartSourceScript::update(const F32 dt)
 // static
 LLPointer<LLViewerPartSourceScript> LLViewerPartSourceScript::unpackPSS(LLViewerObject *source_objp, LLPointer<LLViewerPartSourceScript> pssp, const S32 block_num)
 {
-	LLMemType mt(LLMemType::MTYPE_PARTICLES);
 	if (!pssp)
 	{
 		if (LLPartSysData::isNullPS(block_num))
@@ -436,7 +432,6 @@ LLPointer<LLViewerPartSourceScript> LLViewerPartSourceScript::unpackPSS(LLViewer
 
 LLPointer<LLViewerPartSourceScript> LLViewerPartSourceScript::unpackPSS(LLViewerObject *source_objp, LLPointer<LLViewerPartSourceScript> pssp, LLDataPacker &dp)
 {
-	LLMemType mt(LLMemType::MTYPE_PARTICLES);
 	if (!pssp)
 	{
 		LLPointer<LLViewerPartSourceScript> new_pssp = new LLViewerPartSourceScript(source_objp);
@@ -470,8 +465,6 @@ LLPointer<LLViewerPartSourceScript> LLViewerPartSourceScript::unpackPSS(LLViewer
 /* static */
 LLPointer<LLViewerPartSourceScript> LLViewerPartSourceScript::createPSS(LLViewerObject *source_objp, const LLPartSysData& particle_parameters)
 {
-	LLMemType mt(LLMemType::MTYPE_PARTICLES);
-
 	LLPointer<LLViewerPartSourceScript> new_pssp = new LLViewerPartSourceScript(source_objp);
 
 	new_pssp->mPartSysData = particle_parameters;
@@ -487,13 +480,11 @@ LLPointer<LLViewerPartSourceScript> LLViewerPartSourceScript::createPSS(LLViewer
 
 void LLViewerPartSourceScript::setImage(LLViewerTexture *imagep)
 {
-	LLMemType mt(LLMemType::MTYPE_PARTICLES);
 	mImagep = imagep;
 }
 
 void LLViewerPartSourceScript::setTargetObject(LLViewerObject *objp)
 {
-	LLMemType mt(LLMemType::MTYPE_PARTICLES);
 	mTargetObjectp = objp;
 }
 
@@ -509,7 +500,6 @@ LLViewerPartSourceSpiral::LLViewerPartSourceSpiral(const LLVector3 &pos) :
 
 void LLViewerPartSourceSpiral::setDead()
 {
-	LLMemType mt(LLMemType::MTYPE_PARTICLES);
 	mIsDead = TRUE;
 	mSourceObjectp = NULL;
 }
@@ -517,7 +507,6 @@ void LLViewerPartSourceSpiral::setDead()
 
 void LLViewerPartSourceSpiral::updatePart(LLViewerPart &part, const F32 dt)
 {
-	LLMemType mt(LLMemType::MTYPE_PARTICLES);
 	F32 frac = part.mLastUpdateTime/part.mMaxAge;
 
 	LLVector3 center_pos;
@@ -542,7 +531,6 @@ void LLViewerPartSourceSpiral::updatePart(LLViewerPart &part, const F32 dt)
 
 void LLViewerPartSourceSpiral::update(const F32 dt)
 {
-	LLMemType mt(LLMemType::MTYPE_PARTICLES);
 	if (!mImagep)
 	{
 		mImagep = LLViewerTextureManager::getFetchedTextureFromFile("pixiesmall.j2c");
@@ -588,7 +576,6 @@ void LLViewerPartSourceSpiral::update(const F32 dt)
 
 void LLViewerPartSourceSpiral::setSourceObject(LLViewerObject *objp)
 {
-	LLMemType mt(LLMemType::MTYPE_PARTICLES);
 	mSourceObjectp = objp;
 }
 
@@ -612,7 +599,6 @@ LLViewerPartSourceBeam::~LLViewerPartSourceBeam()
 
 void LLViewerPartSourceBeam::setDead()
 {
-	LLMemType mt(LLMemType::MTYPE_PARTICLES);
 	mIsDead = TRUE;
 	mSourceObjectp = NULL;
 	mTargetObjectp = NULL;
@@ -626,7 +612,6 @@ void LLViewerPartSourceBeam::setColor(const LLColor4 &color)
 
 void LLViewerPartSourceBeam::updatePart(LLViewerPart &part, const F32 dt)
 {
-	LLMemType mt(LLMemType::MTYPE_PARTICLES);
 	F32 frac = part.mLastUpdateTime/part.mMaxAge;
 
 	LLViewerPartSource *ps = (LLViewerPartSource*)part.mPartSourcep;
@@ -671,7 +656,6 @@ void LLViewerPartSourceBeam::updatePart(LLViewerPart &part, const F32 dt)
 
 void LLViewerPartSourceBeam::update(const F32 dt)
 {
-	LLMemType mt(LLMemType::MTYPE_PARTICLES);
 	const F32 RATE = 0.025f;
 
 	mLastUpdateTime += dt;
@@ -743,13 +727,11 @@ void LLViewerPartSourceBeam::update(const F32 dt)
 
 void LLViewerPartSourceBeam::setSourceObject(LLViewerObject* objp)
 {
-	LLMemType mt(LLMemType::MTYPE_PARTICLES);
 	mSourceObjectp = objp;
 }
 
 void LLViewerPartSourceBeam::setTargetObject(LLViewerObject* objp)
 {
-	LLMemType mt(LLMemType::MTYPE_PARTICLES);
 	mTargetObjectp = objp;
 }
 
@@ -764,7 +746,6 @@ LLViewerPartSourceChat::LLViewerPartSourceChat(const LLVector3 &pos) :
 
 void LLViewerPartSourceChat::setDead()
 {
-	LLMemType mt(LLMemType::MTYPE_PARTICLES);
 	mIsDead = TRUE;
 	mSourceObjectp = NULL;
 }
@@ -772,7 +753,6 @@ void LLViewerPartSourceChat::setDead()
 
 void LLViewerPartSourceChat::updatePart(LLViewerPart &part, const F32 dt)
 {
-	LLMemType mt(LLMemType::MTYPE_PARTICLES);
 	F32 frac = part.mLastUpdateTime/part.mMaxAge;
 
 	LLVector3 center_pos;
@@ -797,7 +777,6 @@ void LLViewerPartSourceChat::updatePart(LLViewerPart &part, const F32 dt)
 
 void LLViewerPartSourceChat::update(const F32 dt)
 {
-	LLMemType mt(LLMemType::MTYPE_PARTICLES);
 	if (!mImagep)
 	{
 		mImagep = LLViewerTextureManager::getFetchedTextureFromFile("pixiesmall.j2c");
@@ -853,7 +832,6 @@ void LLViewerPartSourceChat::update(const F32 dt)
 
 void LLViewerPartSourceChat::setSourceObject(LLViewerObject *objp)
 {
-	LLMemType mt(LLMemType::MTYPE_PARTICLES);
 	mSourceObjectp = objp;
 }
 
diff --git a/indra/newview/llviewerprecompiledheaders.h b/indra/newview/llviewerprecompiledheaders.h
index 6c8a827ba3f9e107e6db93555773f4ea341fa580..0316f7997345be5022544791910ad6ee13feae07 100644
--- a/indra/newview/llviewerprecompiledheaders.h
+++ b/indra/newview/llviewerprecompiledheaders.h
@@ -59,8 +59,6 @@
 #include "indra_constants.h"
 #include "llinitparam.h"
 
-//#include "linden_common.h"
-//#include "llpreprocessor.h"
 #include "llallocator.h"
 #include "llapp.h"
 #include "llcriticaldamp.h"
@@ -77,10 +75,8 @@
 #include "llprocessor.h"
 #include "llrefcount.h"
 #include "llsafehandle.h"
-//#include "llsecondlifeurls.h"
 #include "llsd.h"
 #include "llsingleton.h"
-#include "llstat.h"
 #include "llstl.h"
 #include "llstrider.h"
 #include "llstring.h"
@@ -88,11 +84,8 @@
 #include "llthread.h"
 #include "lltimer.h"
 #include "lluuidhashmap.h"
-//#include "processor.h"
 #include "stdenums.h"
 #include "stdtypes.h"
-//#include "string_table.h"
-//#include "timer.h"
 #include "timing.h"
 #include "u64.h"
 
diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp
index effa368b7ac251e6603e7ba4edd945b1f1f5c561..31e3820a2174c9167c7970e27ed4065231a69393 100644
--- a/indra/newview/llviewerregion.cpp
+++ b/indra/newview/llviewerregion.cpp
@@ -720,7 +720,6 @@ void LLViewerRegion::dirtyHeights()
 
 BOOL LLViewerRegion::idleUpdate(F32 max_update_time)
 {
-	LLMemType mt_ivr(LLMemType::MTYPE_IDLE_UPDATE_VIEWER_REGION);
 	// did_update returns TRUE if we did at least one significant update
 	BOOL did_update = mImpl->mLandp->idleUpdate(max_update_time);
 	
@@ -1343,11 +1342,8 @@ void LLViewerRegion::requestCacheMisses()
 
 	mCacheDirty = TRUE ;
 	// llinfos << "KILLDEBUG Sent cache miss full " << full_count << " crc " << crc_count << llendl;
-	#if LL_RECORD_VIEWER_STATS
-	LLViewerStatsRecorder::instance()->beginObjectUpdateEvents(this);
-	LLViewerStatsRecorder::instance()->recordRequestCacheMissesEvent(full_count + crc_count);
-	LLViewerStatsRecorder::instance()->endObjectUpdateEvents();
-	#endif
+	LLViewerStatsRecorder::instance().requestCacheMissesEvent(full_count + crc_count);
+	LLViewerStatsRecorder::instance().log(0.2f);
 }
 
 void LLViewerRegion::dumpCache()
diff --git a/indra/newview/llviewerstats.cpp b/indra/newview/llviewerstats.cpp
index d1c6b7ea7913419608a6e1696e1c796b78dd1d17..da87cc2673f17525de169f048158b895403058a6 100755
--- a/indra/newview/llviewerstats.cpp
+++ b/indra/newview/llviewerstats.cpp
@@ -66,137 +66,134 @@ class StatAttributes
 {
 public:
 	StatAttributes(const char* name,
-				   const BOOL enabled,
-				   const BOOL is_timer)
+				   const BOOL enabled)
 		: mName(name),
-		  mEnabled(enabled),
-		  mIsTimer(is_timer)
+		  mEnabled(enabled)
 	{
 	}
 	
 	std::string mName;
 	BOOL mEnabled;
-	BOOL mIsTimer;
 };
 
 const StatAttributes STAT_INFO[LLViewerStats::ST_COUNT] =
 {
 	// ST_VERSION
-	StatAttributes("Version", TRUE, FALSE),
+	StatAttributes("Version", TRUE),
 	// ST_AVATAR_EDIT_SECONDS
-	StatAttributes("Seconds in Edit Appearence", FALSE, TRUE),
+	StatAttributes("Seconds in Edit Appearence", FALSE),
 	// ST_TOOLBOX_SECONDS
-	StatAttributes("Seconds using Toolbox", FALSE, TRUE),
+	StatAttributes("Seconds using Toolbox", FALSE),
 	// ST_CHAT_COUNT
-	StatAttributes("Chat messages sent", FALSE, FALSE),
+	StatAttributes("Chat messages sent", FALSE),
 	// ST_IM_COUNT
-	StatAttributes("IMs sent", FALSE, FALSE),
+	StatAttributes("IMs sent", FALSE),
 	// ST_FULLSCREEN_BOOL
-	StatAttributes("Fullscreen mode", FALSE, FALSE),
+	StatAttributes("Fullscreen mode", FALSE),
 	// ST_RELEASE_COUNT
-	StatAttributes("Object release count", FALSE, FALSE),
+	StatAttributes("Object release count", FALSE),
 	// ST_CREATE_COUNT
-	StatAttributes("Object create count", FALSE, FALSE),
+	StatAttributes("Object create count", FALSE),
 	// ST_REZ_COUNT
-	StatAttributes("Object rez count", FALSE, FALSE),
+	StatAttributes("Object rez count", FALSE),
 	// ST_FPS_10_SECONDS
-	StatAttributes("Seconds below 10 FPS", FALSE, TRUE),
+	StatAttributes("Seconds below 10 FPS", FALSE),
 	// ST_FPS_2_SECONDS
-	StatAttributes("Seconds below 2 FPS", FALSE, TRUE),
+	StatAttributes("Seconds below 2 FPS", FALSE),
 	// ST_MOUSELOOK_SECONDS
-	StatAttributes("Seconds in Mouselook", FALSE, TRUE),
+	StatAttributes("Seconds in Mouselook", FALSE),
 	// ST_FLY_COUNT
-	StatAttributes("Fly count", FALSE, FALSE),
+	StatAttributes("Fly count", FALSE),
 	// ST_TELEPORT_COUNT
-	StatAttributes("Teleport count", FALSE, FALSE),
+	StatAttributes("Teleport count", FALSE),
 	// ST_OBJECT_DELETE_COUNT
-	StatAttributes("Objects deleted", FALSE, FALSE),
+	StatAttributes("Objects deleted", FALSE),
 	// ST_SNAPSHOT_COUNT
-	StatAttributes("Snapshots taken", FALSE, FALSE),
+	StatAttributes("Snapshots taken", FALSE),
 	// ST_UPLOAD_SOUND_COUNT
-	StatAttributes("Sounds uploaded", FALSE, FALSE),
+	StatAttributes("Sounds uploaded", FALSE),
 	// ST_UPLOAD_TEXTURE_COUNT
-	StatAttributes("Textures uploaded", FALSE, FALSE),
+	StatAttributes("Textures uploaded", FALSE),
 	// ST_EDIT_TEXTURE_COUNT
-	StatAttributes("Changes to textures on objects", FALSE, FALSE),
+	StatAttributes("Changes to textures on objects", FALSE),
 	// ST_KILLED_COUNT
-	StatAttributes("Number of times killed", FALSE, FALSE),
+	StatAttributes("Number of times killed", FALSE),
 	// ST_FRAMETIME_JITTER
-	StatAttributes("Average delta between sucessive frame times", FALSE, FALSE),
+	StatAttributes("Average delta between successive frame times", FALSE),
 	// ST_FRAMETIME_SLEW
-	StatAttributes("Average delta between frame time and mean", FALSE, FALSE),
+	StatAttributes("Average delta between frame time and mean", FALSE),
 	// ST_INVENTORY_TOO_LONG
-	StatAttributes("Inventory took too long to load", FALSE, FALSE),
+	StatAttributes("Inventory took too long to load", FALSE),
 	// ST_WEARABLES_TOO_LONG
-	StatAttributes("Wearables took too long to load", FALSE, FALSE),
+	StatAttributes("Wearables took too long to load", FALSE),
 	// ST_LOGIN_SECONDS
-	StatAttributes("Time between LoginRequest and LoginReply", FALSE, FALSE),
+	StatAttributes("Time between LoginRequest and LoginReply", FALSE),
 	// ST_LOGIN_TIMEOUT_COUNT
-	StatAttributes("Number of login attempts that timed out", FALSE, FALSE),
+	StatAttributes("Number of login attempts that timed out", FALSE),
 	// ST_HAS_BAD_TIMER
-	StatAttributes("Known bad timer if != 0.0", FALSE, FALSE),
+	StatAttributes("Known bad timer if != 0.0", FALSE),
 	// ST_DOWNLOAD_FAILED
-	StatAttributes("Number of times LLAssetStorage::getAssetData() has failed", FALSE, FALSE),
+	StatAttributes("Number of times LLAssetStorage::getAssetData() has failed", FALSE),
 	// ST_LSL_SAVE_COUNT
-	StatAttributes("Number of times user has saved a script", FALSE, FALSE),
+	StatAttributes("Number of times user has saved a script", FALSE),
 	// ST_UPLOAD_ANIM_COUNT
-	StatAttributes("Animations uploaded", FALSE, FALSE),
+	StatAttributes("Animations uploaded", FALSE),
 	// ST_FPS_8_SECONDS
-	StatAttributes("Seconds below 8 FPS", FALSE, TRUE),
+	StatAttributes("Seconds below 8 FPS", FALSE),
 	// ST_SIM_FPS_20_SECONDS
-	StatAttributes("Seconds with sim FPS below 20", FALSE, TRUE),
+	StatAttributes("Seconds with sim FPS below 20", FALSE),
 	// ST_PHYS_FPS_20_SECONDS
-	StatAttributes("Seconds with physics FPS below 20", FALSE, TRUE),
+	StatAttributes("Seconds with physics FPS below 20", FALSE),
 	// ST_LOSS_05_SECONDS
-	StatAttributes("Seconds with packet loss > 5%", FALSE, TRUE),
+	StatAttributes("Seconds with packet loss > 5%", FALSE),
 	// ST_FPS_DROP_50_RATIO
-	StatAttributes("Ratio of frames 2x longer than previous", FALSE, FALSE),
+	StatAttributes("Ratio of frames 2x longer than previous", FALSE),
 	// ST_ENABLE_VBO
-	StatAttributes("Vertex Buffers Enabled", TRUE, FALSE),
+	StatAttributes("Vertex Buffers Enabled", TRUE),
 	// ST_DELTA_BANDWIDTH
-	StatAttributes("Increase/Decrease in bandwidth based on packet loss", FALSE, FALSE),
+	StatAttributes("Increase/Decrease in bandwidth based on packet loss", FALSE),
 	// ST_MAX_BANDWIDTH
-	StatAttributes("Max bandwidth setting", FALSE, FALSE),
+	StatAttributes("Max bandwidth setting", FALSE),
 	// ST_LIGHTING_DETAIL
-	StatAttributes("Lighting Detail", FALSE, FALSE),
+	StatAttributes("Lighting Detail", FALSE),
 	// ST_VISIBLE_AVATARS
-	StatAttributes("Visible Avatars", FALSE, FALSE),
+	StatAttributes("Visible Avatars", FALSE),
 	// ST_SHADER_OJECTS
-	StatAttributes("Object Shaders", FALSE, FALSE),
+	StatAttributes("Object Shaders", FALSE),
 	// ST_SHADER_ENVIRONMENT
-	StatAttributes("Environment Shaders", FALSE, FALSE),
+	StatAttributes("Environment Shaders", FALSE),
 	// ST_VISIBLE_DRAW_DIST
-	StatAttributes("Draw Distance", FALSE, FALSE),
+	StatAttributes("Draw Distance", FALSE),
 	// ST_VISIBLE_CHAT_BUBBLES
-	StatAttributes("Chat Bubbles Enabled", FALSE, FALSE),
+	StatAttributes("Chat Bubbles Enabled", FALSE),
 	// ST_SHADER_AVATAR
-	StatAttributes("Avatar Shaders", FALSE, FALSE),
+	StatAttributes("Avatar Shaders", FALSE),
 	// ST_FRAME_SECS
-	StatAttributes("FRAME_SECS", FALSE, FALSE),
+	StatAttributes("FRAME_SECS", FALSE),
 	// ST_UPDATE_SECS
-	StatAttributes("UPDATE_SECS", FALSE, FALSE),
+	StatAttributes("UPDATE_SECS", FALSE),
 	// ST_NETWORK_SECS
-	StatAttributes("NETWORK_SECS", FALSE, FALSE),
+	StatAttributes("NETWORK_SECS", FALSE),
 	// ST_IMAGE_SECS
-	StatAttributes("IMAGE_SECS", FALSE, FALSE),
+	StatAttributes("IMAGE_SECS", FALSE),
 	// ST_REBUILD_SECS
-	StatAttributes("REBUILD_SECS", FALSE, FALSE),
+	StatAttributes("REBUILD_SECS", FALSE),
 	// ST_RENDER_SECS
-	StatAttributes("RENDER_SECS", FALSE, FALSE),
+	StatAttributes("RENDER_SECS", FALSE),
 	// ST_CROSSING_AVG
-	StatAttributes("CROSSING_AVG", FALSE, FALSE),
+	StatAttributes("CROSSING_AVG", FALSE),
 	// ST_CROSSING_MAX
-	StatAttributes("CROSSING_MAX", FALSE, FALSE),
+	StatAttributes("CROSSING_MAX", FALSE),
 	// ST_LIBXUL_WIDGET_USED
-	StatAttributes("LibXUL Widget used", FALSE, FALSE), // Unused
+	StatAttributes("LibXUL Widget used", FALSE), // Unused
 	// ST_WINDOW_WIDTH
-	StatAttributes("Window width", FALSE, FALSE),
+	StatAttributes("Window width", FALSE),
 	// ST_WINDOW_HEIGHT
-	StatAttributes("Window height", FALSE, FALSE),
+	StatAttributes("Window height", FALSE),
 	// ST_TEX_BAKES
-	StatAttributes("Texture Bakes", FALSE, FALSE),
+	StatAttributes("Texture Bakes", FALSE),
 	// ST_TEX_REBAKES
-	StatAttributes("Texture Rebakes", FALSE, FALSE)
+	StatAttributes("Texture Rebakes", FALSE)
 
 };
 
@@ -207,16 +204,11 @@ LLViewerStats::LLViewerStats() :
 	mAssetKBitStat("assetkbitstat"),
 	mTextureKBitStat("texturekbitstat"),
 	mVFSPendingOperations("vfspendingoperations"),
-	mObjectsDrawnStat("objectsdrawnstat"),
-	mObjectsCulledStat("objectsculledstat"),
-	mObjectsTestedStat("objectstestedstat"),
-	mObjectsComparedStat("objectscomparedstat"),
-	mObjectsOccludedStat("objectsoccludedstat"),
 	mFPSStat("fpsstat"),
 	mPacketsInStat("packetsinstat"),
 	mPacketsLostStat("packetsloststat"),
 	mPacketsOutStat("packetsoutstat"),
-	mPacketsLostPercentStat("packetslostpercentstat", 64),
+	mPacketsLostPercentStat("packetslostpercentstat"),
 	mTexturePacketsStat("texturepacketsstat"),
 	mActualInKBitStat("actualinkbitstat"),
 	mActualOutKBitStat("actualoutkbitstat"),
@@ -258,12 +250,12 @@ LLViewerStats::LLViewerStats() :
 	mPhysicsLODTasks("physicslodtasks"),
 	mPhysicsMemoryAllocated("physicsmemoryallocated"),
 	mSimPingStat("simpingstat"),
-	mNumImagesStat("numimagesstat", 32, TRUE),
-	mNumRawImagesStat("numrawimagesstat", 32, TRUE),
-	mGLTexMemStat("gltexmemstat", 32, TRUE),
-	mGLBoundMemStat("glboundmemstat", 32, TRUE),
-	mRawMemStat("rawmemstat", 32, TRUE),
-	mFormattedMemStat("formattedmemstat", 32, TRUE),
+	mNumImagesStat("numimagesstat", TRUE),
+	mNumRawImagesStat("numrawimagesstat", TRUE),
+	mGLTexMemStat("gltexmemstat", TRUE),
+	mGLBoundMemStat("glboundmemstat", TRUE),
+	mRawMemStat("rawmemstat", TRUE),
+	mFormattedMemStat("formattedmemstat", TRUE),
 	mNumObjectsStat("numobjectsstat"),
 	mNumActiveObjectsStat("numactiveobjectsstat"),
 	mNumNewObjectsStat("numnewobjectsstat"),
@@ -284,25 +276,21 @@ LLViewerStats::LLViewerStats() :
 	mAgentPositionSnaps.reset();
 }
 
-LLViewerStats::~LLViewerStats()
-{
-}
-
 void LLViewerStats::resetStats()
 {
-	LLViewerStats::getInstance()->mKBitStat.reset();
-	LLViewerStats::getInstance()->mLayersKBitStat.reset();
-	LLViewerStats::getInstance()->mObjectKBitStat.reset();
-	LLViewerStats::getInstance()->mTextureKBitStat.reset();
-	LLViewerStats::getInstance()->mVFSPendingOperations.reset();
-	LLViewerStats::getInstance()->mAssetKBitStat.reset();
-	LLViewerStats::getInstance()->mPacketsInStat.reset();
-	LLViewerStats::getInstance()->mPacketsLostStat.reset();
-	LLViewerStats::getInstance()->mPacketsOutStat.reset();
-	LLViewerStats::getInstance()->mFPSStat.reset();
-	LLViewerStats::getInstance()->mTexturePacketsStat.reset();
-	
-	LLViewerStats::getInstance()->mAgentPositionSnaps.reset();
+	LLViewerStats& stats = LLViewerStats::instance();
+	stats.mKBitStat.reset();
+	stats.mLayersKBitStat.reset();
+	stats.mObjectKBitStat.reset();
+	stats.mTextureKBitStat.reset();
+	stats.mVFSPendingOperations.reset();
+	stats.mAssetKBitStat.reset();
+	stats.mPacketsInStat.reset();
+	stats.mPacketsLostStat.reset();
+	stats.mPacketsOutStat.reset();
+	stats.mFPSStat.reset();
+	stats.mTexturePacketsStat.reset();
+	stats.mAgentPositionSnaps.reset();
 }
 
 
@@ -327,55 +315,55 @@ void LLViewerStats::updateFrameStats(const F64 time_diff)
 {
 	if (mPacketsLostPercentStat.getCurrent() > 5.0)
 	{
-		incStat(LLViewerStats::ST_LOSS_05_SECONDS, time_diff);
+		incStat(ST_LOSS_05_SECONDS, time_diff);
 	}
 	
 	if (mSimFPS.getCurrent() < 20.f && mSimFPS.getCurrent() > 0.f)
 	{
-		incStat(LLViewerStats::ST_SIM_FPS_20_SECONDS, time_diff);
+		incStat(ST_SIM_FPS_20_SECONDS, time_diff);
 	}
 	
 	if (mSimPhysicsFPS.getCurrent() < 20.f && mSimPhysicsFPS.getCurrent() > 0.f)
 	{
-		incStat(LLViewerStats::ST_PHYS_FPS_20_SECONDS, time_diff);
+		incStat(ST_PHYS_FPS_20_SECONDS, time_diff);
 	}
 		
 	if (time_diff >= 0.5)
 	{
-		incStat(LLViewerStats::ST_FPS_2_SECONDS, time_diff);
+		incStat(ST_FPS_2_SECONDS, time_diff);
 	}
 	if (time_diff >= 0.125)
 	{
-		incStat(LLViewerStats::ST_FPS_8_SECONDS, time_diff);
+		incStat(ST_FPS_8_SECONDS, time_diff);
 	}
 	if (time_diff >= 0.1)
 	{
-		incStat(LLViewerStats::ST_FPS_10_SECONDS, time_diff);
+		incStat(ST_FPS_10_SECONDS, time_diff);
 	}
 
 	if (gFrameCount && mLastTimeDiff > 0.0)
 	{
 		// new "stutter" meter
-		setStat(LLViewerStats::ST_FPS_DROP_50_RATIO,
-				(getStat(LLViewerStats::ST_FPS_DROP_50_RATIO) * (F64)(gFrameCount - 1) + 
+		setStat(ST_FPS_DROP_50_RATIO,
+				(getStat(ST_FPS_DROP_50_RATIO) * (F64)(gFrameCount - 1) + 
 				 (time_diff >= 2.0 * mLastTimeDiff ? 1.0 : 0.0)) / gFrameCount);
 			
 
 		// old stats that were never really used
-		setStat(LLViewerStats::ST_FRAMETIME_JITTER,
-				(getStat(LLViewerStats::ST_FRAMETIME_JITTER) * (gFrameCount - 1) + 
+		setStat(ST_FRAMETIME_JITTER,
+				(getStat(ST_FRAMETIME_JITTER) * (gFrameCount - 1) + 
 				 fabs(mLastTimeDiff - time_diff) / mLastTimeDiff) / gFrameCount);
 			
 		F32 average_frametime = gRenderStartTime.getElapsedTimeF32() / (F32)gFrameCount;
-		setStat(LLViewerStats::ST_FRAMETIME_SLEW,
-				(getStat(LLViewerStats::ST_FRAMETIME_SLEW) * (gFrameCount - 1) + 
+		setStat(ST_FRAMETIME_SLEW,
+				(getStat(ST_FRAMETIME_SLEW) * (gFrameCount - 1) + 
 				 fabs(average_frametime - time_diff) / average_frametime) / gFrameCount);
 
 		F32 max_bandwidth = gViewerThrottle.getMaxBandwidth();
 		F32 delta_bandwidth = gViewerThrottle.getCurrentBandwidth() - max_bandwidth;
-		setStat(LLViewerStats::ST_DELTA_BANDWIDTH, delta_bandwidth / 1024.f);
+		setStat(ST_DELTA_BANDWIDTH, delta_bandwidth / 1024.f);
 
-		setStat(LLViewerStats::ST_MAX_BANDWIDTH, max_bandwidth / 1024.f);
+		setStat(ST_MAX_BANDWIDTH, max_bandwidth / 1024.f);
 		
 	}
 	
@@ -398,160 +386,13 @@ void LLViewerStats::addToMessage(LLSD &body) const
 		}
 	}
 	
-	body["AgentPositionSnaps"] = mAgentPositionSnaps.getData();
+	body["AgentPositionSnaps"] = mAgentPositionSnaps.asLLSD();
 	llinfos << "STAT: AgentPositionSnaps: Mean = " << mAgentPositionSnaps.getMean() << "; StdDev = " << mAgentPositionSnaps.getStdDev() 
 			<< "; Count = " << mAgentPositionSnaps.getCount() << llendl;
 }
 
-// static
-// const std::string LLViewerStats::statTypeToText(EStatType type)
-// {
-// 	if (type >= 0 && type < ST_COUNT)
-// 	{
-// 		return STAT_INFO[type].mName;
-// 	}
-// 	else
-// 	{
-// 		return "Unknown statistic";
-// 	}
-// }
-
 // *NOTE:Mani The following methods used to exist in viewer.cpp
 // Moving them here, but not merging them into LLViewerStats yet.
-void reset_statistics()
-{
-	if (LLSurface::sTextureUpdateTime)
-	{
-		LLSurface::sTexelsUpdated = 0;
-		LLSurface::sTextureUpdateTime = 0.f;
-	}
-}
-
-
-void output_statistics(void*)
-{
-	llinfos << "Number of orphans: " << gObjectList.getOrphanCount() << llendl;
-	llinfos << "Number of dead objects: " << gObjectList.mNumDeadObjects << llendl;
-	llinfos << "Num images: " << gTextureList.getNumImages() << llendl;
-	llinfos << "Texture usage: " << LLImageGL::sGlobalTextureMemoryInBytes << llendl;
-	llinfos << "Texture working set: " << LLImageGL::sBoundTextureMemoryInBytes << llendl;
-	llinfos << "Raw usage: " << LLImageRaw::sGlobalRawMemory << llendl;
-	llinfos << "Formatted usage: " << LLImageFormatted::sGlobalFormattedMemory << llendl;
-	llinfos << "Zombie Viewer Objects: " << LLViewerObject::getNumZombieObjects() << llendl;
-	llinfos << "Number of lights: " << gPipeline.getLightCount() << llendl;
-
-	llinfos << "Memory Usage:" << llendl;
-	llinfos << "--------------------------------" << llendl;
-	llinfos << "Pipeline:" << llendl;
-	llinfos << llendl;
-
-#if LL_SMARTHEAP
-	llinfos << "--------------------------------" << llendl;
-	{
-		llinfos << "sizeof(LLVOVolume) = " << sizeof(LLVOVolume) << llendl;
-
-		U32 total_pool_size = 0;
-		U32 total_used_size = 0;
-		MEM_POOL_INFO pool_info;
-		MEM_POOL_STATUS pool_status;
-		U32 pool_num = 0;
-		for(pool_status = MemPoolFirst( &pool_info, 1 ); 
-			pool_status != MEM_POOL_END; 
-			pool_status = MemPoolNext( &pool_info, 1 ) )
-		{
-			llinfos << "Pool #" << pool_num << llendl;
-			if( MEM_POOL_OK != pool_status )
-			{
-				llwarns << "Pool not ok" << llendl;
-				continue;
-			}
-
-			llinfos << "Pool blockSizeFS " << pool_info.blockSizeFS
-				<< " pageSize " << pool_info.pageSize
-				<< llendl;
-
-			U32 pool_count = MemPoolCount(pool_info.pool);
-			llinfos << "Blocks " << pool_count << llendl;
-
-			U32 pool_size = MemPoolSize( pool_info.pool );
-			if( pool_size == MEM_ERROR_RET )
-			{
-				llinfos << "MemPoolSize() failed (" << pool_num << ")" << llendl;
-			}
-			else
-			{
-				llinfos << "MemPool Size " << pool_size / 1024 << "K" << llendl;
-			}
-
-			total_pool_size += pool_size;
-
-			if( !MemPoolLock( pool_info.pool ) )
-			{
-				llinfos << "MemPoolLock failed (" << pool_num << ") " << llendl;
-				continue;
-			}
-
-			U32 used_size = 0; 
-			MEM_POOL_ENTRY entry;
-			entry.entry = NULL;
-			while( MemPoolWalk( pool_info.pool, &entry ) == MEM_POOL_OK )
-			{
-				if( entry.isInUse )
-				{
-					used_size += entry.size;
-				}
-			}
-
-			MemPoolUnlock( pool_info.pool );
-
-			llinfos << "MemPool Used " << used_size/1024 << "K" << llendl;
-			total_used_size += used_size;
-			pool_num++;
-		}
-		
-		llinfos << "Total Pool Size " << total_pool_size/1024 << "K" << llendl;
-		llinfos << "Total Used Size " << total_used_size/1024 << "K" << llendl;
-
-	}
-#endif
-
-	llinfos << "--------------------------------" << llendl;
-	llinfos << "Avatar Memory (partly overlaps with above stats):" << llendl;
-	LLTexLayerStaticImageList::getInstance()->dumpByteCount();
-	LLVOAvatarSelf::dumpScratchTextureByteCount();
-	LLTexLayerSetBuffer::dumpTotalByteCount();
-	LLVOAvatarSelf::dumpTotalLocalTextureByteCount();
-	LLTexLayerParamAlpha::dumpCacheByteCount();
-	LLVOAvatar::dumpBakedStatus();
-
-	llinfos << llendl;
-
-	llinfos << "Object counts:" << llendl;
-	S32 i;
-	S32 obj_counts[256];
-//	S32 app_angles[256];
-	for (i = 0; i < 256; i++)
-	{
-		obj_counts[i] = 0;
-	}
-	for (i = 0; i < gObjectList.getNumObjects(); i++)
-	{
-		LLViewerObject *objectp = gObjectList.getObject(i);
-		if (objectp)
-		{
-			obj_counts[objectp->getPCode()]++;
-		}
-	}
-	for (i = 0; i < 256; i++)
-	{
-		if (obj_counts[i])
-		{
-			llinfos << LLPrimitive::pCodeToString(i) << ":" << obj_counts[i] << llendl;
-		}
-	}
-}
-
-
 U32		gTotalLandIn = 0, gTotalLandOut = 0;
 U32		gTotalWaterIn = 0, gTotalWaterOut = 0;
 
@@ -569,20 +410,15 @@ U32     gTotalTextureBytesPerBoostLevel[LLViewerTexture::MAX_GL_IMAGE_CATEGORY]
 extern U32  gVisCompared;
 extern U32  gVisTested;
 
-std::map<S32,LLFrameTimer> gDebugTimers;
-std::map<S32,std::string> gDebugTimerLabel;
-
-void init_statistics()
-{
-	// Label debug timers
-	gDebugTimerLabel[0] = "Texture";
-}
+LLFrameTimer gTextureTimer;
 
-void update_statistics(U32 frame_count)
+void update_statistics()
 {
 	gTotalWorldBytes += gVLManager.getTotalBytes();
 	gTotalObjectBytes += gObjectBits / 8;
 
+	LLViewerStats& stats = LLViewerStats::instance();
+
 	// make sure we have a valid time delta for this frame
 	if (gFrameIntervalSeconds > 0.f)
 	{
@@ -599,51 +435,47 @@ void update_statistics(U32 frame_count)
 			LLViewerStats::getInstance()->incStat(LLViewerStats::ST_TOOLBOX_SECONDS, gFrameIntervalSeconds);
 		}
 	}
-	LLViewerStats::getInstance()->setStat(LLViewerStats::ST_ENABLE_VBO, (F64)gSavedSettings.getBOOL("RenderVBOEnable"));
-	LLViewerStats::getInstance()->setStat(LLViewerStats::ST_LIGHTING_DETAIL, (F64)gPipeline.getLightingDetail());
-	LLViewerStats::getInstance()->setStat(LLViewerStats::ST_DRAW_DIST, (F64)gSavedSettings.getF32("RenderFarClip"));
-	LLViewerStats::getInstance()->setStat(LLViewerStats::ST_CHAT_BUBBLES, (F64)gSavedSettings.getBOOL("UseChatBubbles"));
-#if 0 // 1.9.2
-	LLViewerStats::getInstance()->setStat(LLViewerStats::ST_SHADER_OBJECTS, (F64)gSavedSettings.getS32("VertexShaderLevelObject"));
-	LLViewerStats::getInstance()->setStat(LLViewerStats::ST_SHADER_AVATAR, (F64)gSavedSettings.getBOOL("VertexShaderLevelAvatar"));
-	LLViewerStats::getInstance()->setStat(LLViewerStats::ST_SHADER_ENVIRONMENT, (F64)gSavedSettings.getBOOL("VertexShaderLevelEnvironment"));
-#endif
-	LLViewerStats::getInstance()->setStat(LLViewerStats::ST_FRAME_SECS, gDebugView->mFastTimerView->getTime("Frame"));
+	stats.setStat(LLViewerStats::ST_ENABLE_VBO, (F64)gSavedSettings.getBOOL("RenderVBOEnable"));
+	stats.setStat(LLViewerStats::ST_LIGHTING_DETAIL, (F64)gPipeline.getLightingDetail());
+	stats.setStat(LLViewerStats::ST_DRAW_DIST, (F64)gSavedSettings.getF32("RenderFarClip"));
+	stats.setStat(LLViewerStats::ST_CHAT_BUBBLES, (F64)gSavedSettings.getBOOL("UseChatBubbles"));
+
+	stats.setStat(LLViewerStats::ST_FRAME_SECS, gDebugView->mFastTimerView->getTime("Frame"));
 	F64 idle_secs = gDebugView->mFastTimerView->getTime("Idle");
 	F64 network_secs = gDebugView->mFastTimerView->getTime("Network");
-	LLViewerStats::getInstance()->setStat(LLViewerStats::ST_UPDATE_SECS, idle_secs - network_secs);
-	LLViewerStats::getInstance()->setStat(LLViewerStats::ST_NETWORK_SECS, network_secs);
-	LLViewerStats::getInstance()->setStat(LLViewerStats::ST_IMAGE_SECS, gDebugView->mFastTimerView->getTime("Update Images"));
-	LLViewerStats::getInstance()->setStat(LLViewerStats::ST_REBUILD_SECS, gDebugView->mFastTimerView->getTime("Sort Draw State"));
-	LLViewerStats::getInstance()->setStat(LLViewerStats::ST_RENDER_SECS, gDebugView->mFastTimerView->getTime("Geometry"));
+	stats.setStat(LLViewerStats::ST_UPDATE_SECS, idle_secs - network_secs);
+	stats.setStat(LLViewerStats::ST_NETWORK_SECS, network_secs);
+	stats.setStat(LLViewerStats::ST_IMAGE_SECS, gDebugView->mFastTimerView->getTime("Update Images"));
+	stats.setStat(LLViewerStats::ST_REBUILD_SECS, gDebugView->mFastTimerView->getTime("Sort Draw State"));
+	stats.setStat(LLViewerStats::ST_RENDER_SECS, gDebugView->mFastTimerView->getTime("Geometry"));
 		
 	LLCircuitData *cdp = gMessageSystem->mCircuitInfo.findCircuit(gAgent.getRegion()->getHost());
 	if (cdp)
 	{
-		LLViewerStats::getInstance()->mSimPingStat.addValue(cdp->getPingDelay());
+		stats.mSimPingStat.addValue(cdp->getPingDelay());
 		gAvgSimPing = ((gAvgSimPing * (F32)gSimPingCount) + (F32)(cdp->getPingDelay())) / ((F32)gSimPingCount + 1);
 		gSimPingCount++;
 	}
 	else
 	{
-		LLViewerStats::getInstance()->mSimPingStat.addValue(10000);
+		stats.mSimPingStat.addValue(10000);
 	}
 
-	LLViewerStats::getInstance()->mFPSStat.addValue(1);
+	stats.mFPSStat.addValue(1);
 	F32 layer_bits = (F32)(gVLManager.getLandBits() + gVLManager.getWindBits() + gVLManager.getCloudBits());
-	LLViewerStats::getInstance()->mLayersKBitStat.addValue(layer_bits/1024.f);
-	LLViewerStats::getInstance()->mObjectKBitStat.addValue(gObjectBits/1024.f);
-	LLViewerStats::getInstance()->mVFSPendingOperations.addValue(LLVFile::getVFSThread()->getPending());
-	LLViewerStats::getInstance()->mAssetKBitStat.addValue(gTransferManager.getTransferBitsIn(LLTCT_ASSET)/1024.f);
+	stats.mLayersKBitStat.addValue(layer_bits/1024.f);
+	stats.mObjectKBitStat.addValue(gObjectBits/1024.f);
+	stats.mVFSPendingOperations.addValue(LLVFile::getVFSThread()->getPending());
+	stats.mAssetKBitStat.addValue(gTransferManager.getTransferBitsIn(LLTCT_ASSET)/1024.f);
 	gTransferManager.resetTransferBitsIn(LLTCT_ASSET);
 
 	if (LLAppViewer::getTextureFetch()->getNumRequests() == 0)
 	{
-		gDebugTimers[0].pause();
+		gTextureTimer.pause();
 	}
 	else
 	{
-		gDebugTimers[0].unpause();
+		gTextureTimer.unpause();
 	}
 	
 	{
@@ -655,7 +487,7 @@ void update_statistics(U32 frame_count)
 			visible_avatar_frames = 1.f;
 			avg_visible_avatars = (avg_visible_avatars * (F32)(visible_avatar_frames - 1.f) + visible_avatars) / visible_avatar_frames;
 		}
-		LLViewerStats::getInstance()->setStat(LLViewerStats::ST_VISIBLE_AVATARS, (F64)avg_visible_avatars);
+		stats.setStat(LLViewerStats::ST_VISIBLE_AVATARS, (F64)avg_visible_avatars);
 	}
 	LLWorld::getInstance()->updateNetStats();
 	LLWorld::getInstance()->requestCacheMisses();
@@ -671,15 +503,14 @@ void update_statistics(U32 frame_count)
 		static LLFrameTimer texture_stats_timer;
 		if (texture_stats_timer.getElapsedTimeF32() >= texture_stats_freq)
 		{
-			LLViewerStats::getInstance()->mTextureKBitStat.addValue(LLViewerTextureList::sTextureBits/1024.f);
-			LLViewerStats::getInstance()->mTexturePacketsStat.addValue(LLViewerTextureList::sTexturePackets);
+			stats.mTextureKBitStat.addValue(LLViewerTextureList::sTextureBits/1024.f);
+			stats.mTexturePacketsStat.addValue(LLViewerTextureList::sTexturePackets);
 			gTotalTextureBytes += LLViewerTextureList::sTextureBits / 8;
 			LLViewerTextureList::sTextureBits = 0;
 			LLViewerTextureList::sTexturePackets = 0;
 			texture_stats_timer.reset();
 		}
 	}
-
 }
 
 class ViewerStatsResponder : public LLHTTPClient::Responder
@@ -857,10 +688,7 @@ void send_stats()
 	S32 window_height = gViewerWindow->getWindowHeightRaw();
 	S32 window_size = (window_width * window_height) / 1024;
 	misc["string_1"] = llformat("%d", window_size);
-	if (gDebugTimers.find(0) != gDebugTimers.end() && gFrameTimeSeconds > 0)
-	{
-		misc["string_2"] = llformat("Texture Time: %.2f, Total Time: %.2f", gDebugTimers[0].getElapsedTimeF32(), gFrameTimeSeconds);
-	}
+	misc["string_2"] = llformat("Texture Time: %.2f, Total Time: %.2f", gTextureTimer.getElapsedTimeF32(), gFrameTimeSeconds);
 
 // 	misc["int_1"] = LLSD::Integer(gSavedSettings.getU32("RenderQualityPerformance")); // Steve: 1.21
 // 	misc["int_2"] = LLSD::Integer(gFrameStalls); // Steve: 1.21
@@ -943,7 +771,7 @@ void LLViewerStats::PhaseMap::clearPhases()
 	mPhaseMap.clear();
 }
 
-LLSD LLViewerStats::PhaseMap::dumpPhases()
+LLSD LLViewerStats::PhaseMap::asLLSD()
 {
 	LLSD result;
 	for (phase_map_t::iterator iter = mPhaseMap.begin(); iter != mPhaseMap.end(); ++iter)
diff --git a/indra/newview/llviewerstats.h b/indra/newview/llviewerstats.h
index 554e4d647ee17dc546792471bd6709de9f453252..0d8f2a45c0a97ee259c211ccb5eeeba3b3c27507 100755
--- a/indra/newview/llviewerstats.h
+++ b/indra/newview/llviewerstats.h
@@ -33,92 +33,85 @@
 class LLViewerStats : public LLSingleton<LLViewerStats>
 {
 public:
-	LLStat mKBitStat;
-	LLStat mLayersKBitStat;
-	LLStat mObjectKBitStat;
-	LLStat mAssetKBitStat;
-	LLStat mTextureKBitStat;
-	LLStat mVFSPendingOperations;
-	LLStat mObjectsDrawnStat;
-	LLStat mObjectsCulledStat;
-	LLStat mObjectsTestedStat;
-	LLStat mObjectsComparedStat;
-	LLStat mObjectsOccludedStat;
-	LLStat mFPSStat;
-	LLStat mPacketsInStat;
-	LLStat mPacketsLostStat;
-	LLStat mPacketsOutStat;
-	LLStat mPacketsLostPercentStat;
-	LLStat mTexturePacketsStat;
-	LLStat mActualInKBitStat;	// From the packet ring (when faking a bad connection)
-	LLStat mActualOutKBitStat;	// From the packet ring (when faking a bad connection)
-	LLStat mTrianglesDrawnStat;
+	LLStat	mKBitStat,
+			mLayersKBitStat,
+			mObjectKBitStat,
+			mAssetKBitStat,
+			mTextureKBitStat,
+			mVFSPendingOperations,
+			mFPSStat,
+			mPacketsInStat,
+			mPacketsLostStat,
+			mPacketsOutStat,
+			mPacketsLostPercentStat,
+			mTexturePacketsStat,
+			mActualInKBitStat,	// From the packet ring (when faking a bad connection)
+			mActualOutKBitStat,	// From the packet ring (when faking a bad connection)
+			mTrianglesDrawnStat;
 
 	// Simulator stats
-	LLStat mSimTimeDilation;
-
-	LLStat mSimFPS;
-	LLStat mSimPhysicsFPS;
-	LLStat mSimAgentUPS;
-	LLStat mSimScriptEPS;
-
-	LLStat mSimFrameMsec;
-	LLStat mSimNetMsec;
-	LLStat mSimSimOtherMsec;
-	LLStat mSimSimPhysicsMsec;
-
-	LLStat mSimSimPhysicsStepMsec;
-	LLStat mSimSimPhysicsShapeUpdateMsec;
-	LLStat mSimSimPhysicsOtherMsec;
-
-	LLStat mSimSimAIStepMsec;
-	LLStat mSimSimSkippedSilhouetteSteps;
-	LLStat mSimSimPctSteppedCharacters;
-
-	LLStat mSimAgentMsec;
-	LLStat mSimImagesMsec;
-	LLStat mSimScriptMsec;
-	LLStat mSimSpareMsec;
-	LLStat mSimSleepMsec;
-	LLStat mSimPumpIOMsec;
-
-	LLStat mSimMainAgents;
-	LLStat mSimChildAgents;
-	LLStat mSimObjects;
-	LLStat mSimActiveObjects;
-	LLStat mSimActiveScripts;
-	LLStat mSimPctScriptsRun;
-
-	LLStat mSimInPPS;
-	LLStat mSimOutPPS;
-	LLStat mSimPendingDownloads;
-	LLStat mSimPendingUploads;
-	LLStat mSimPendingLocalUploads;
-	LLStat mSimTotalUnackedBytes;
-
-	LLStat mPhysicsPinnedTasks;
-	LLStat mPhysicsLODTasks;
-	LLStat mPhysicsMemoryAllocated;
-
-	LLStat mSimPingStat;
-
-	LLStat mNumImagesStat;
-	LLStat mNumRawImagesStat;
-	LLStat mGLTexMemStat;
-	LLStat mGLBoundMemStat;
-	LLStat mRawMemStat;
-	LLStat mFormattedMemStat;
-
-	LLStat mNumObjectsStat;
-	LLStat mNumActiveObjectsStat;
-	LLStat mNumNewObjectsStat;
-	LLStat mNumSizeCulledStat;
-	LLStat mNumVisCulledStat;
+	LLStat	mSimTimeDilation;
+
+	LLStat	mSimFPS,
+			mSimPhysicsFPS,
+			mSimAgentUPS,
+			mSimScriptEPS;
+
+	LLStat	mSimFrameMsec,
+			mSimNetMsec,
+			mSimSimOtherMsec,
+			mSimSimPhysicsMsec;
+
+	LLStat	mSimSimPhysicsStepMsec,
+			mSimSimPhysicsShapeUpdateMsec,
+			mSimSimPhysicsOtherMsec,
+			mSimSimAIStepMsec,
+			mSimSimSkippedSilhouetteSteps,
+			mSimSimPctSteppedCharacters;
+
+	LLStat	mSimAgentMsec,
+			mSimImagesMsec,
+			mSimScriptMsec,
+			mSimSpareMsec,
+			mSimSleepMsec,
+			mSimPumpIOMsec;
+
+	LLStat	mSimMainAgents,
+			mSimChildAgents,
+			mSimObjects,
+			mSimActiveObjects,
+			mSimActiveScripts,
+			mSimPctScriptsRun;
+
+	LLStat	mSimInPPS,
+			mSimOutPPS,
+			mSimPendingDownloads,
+			mSimPendingUploads,
+			mSimPendingLocalUploads,
+			mSimTotalUnackedBytes;
+
+	LLStat	mPhysicsPinnedTasks,
+			mPhysicsLODTasks,
+			mPhysicsMemoryAllocated;
+
+	LLStat	mSimPingStat;
+
+	LLStat	mNumImagesStat,
+			mNumRawImagesStat,
+			mGLTexMemStat,
+			mGLBoundMemStat,
+			mRawMemStat,
+			mFormattedMemStat;
+
+	LLStat	mNumObjectsStat,
+			mNumActiveObjectsStat,
+			mNumNewObjectsStat,
+			mNumSizeCulledStat,
+			mNumVisCulledStat;
 
 	void resetStats();
 public:
-	// If you change this, please also add a corresponding text label
-	// in statTypeToText in llviewerstats.cpp
+	// If you change this, please also add a corresponding text label in llviewerstats.cpp
 	enum EStatType
 	{
 		ST_VERSION = 0,
@@ -183,9 +176,7 @@ class LLViewerStats : public LLSingleton<LLViewerStats>
 		ST_COUNT = 58
 	};
 
-
 	LLViewerStats();
-	~LLViewerStats();
 
 	// all return latest value of given stat
 	F64 getStat(EStatType type) const;
@@ -206,7 +197,7 @@ class LLViewerStats : public LLSingleton<LLViewerStats>
 		U32 mCountOfNextUpdatesToIgnore;
 
 		inline StatsAccumulator()
-		{
+		{	
 			reset();
 		}
 
@@ -266,7 +257,7 @@ class LLViewerStats : public LLSingleton<LLViewerStats>
 			mCountOfNextUpdatesToIgnore = 0;
 		}
 		
-		inline LLSD getData() const
+		inline LLSD asLLSD() const
 		{
 			LLSD data;
 			data["mean"] = getMean();
@@ -296,7 +287,7 @@ class LLViewerStats : public LLSingleton<LLViewerStats>
 		void			stopPhase(const std::string& phase_name);
 		void			stopAllPhases();
 		void			clearPhases();
-		LLSD			dumpPhases();
+		LLSD			asLLSD();
 		static StatsAccumulator& getPhaseStats(const std::string& phase_name);
 		static void recordPhaseStat(const std::string& phase_name, F32 value);
 	};
@@ -310,14 +301,10 @@ class LLViewerStats : public LLSingleton<LLViewerStats>
 static const F32 SEND_STATS_PERIOD = 300.0f;
 
 // The following are from (older?) statistics code found in appviewer.
-void init_statistics();
-void reset_statistics();
-void output_statistics(void*);
-void update_statistics(U32 frame_count);
+void update_statistics();
 void send_stats();
 
-extern std::map<S32,LLFrameTimer> gDebugTimers;
-extern std::map<S32,std::string> gDebugTimerLabel;
+extern LLFrameTimer gTextureTimer;
 extern U32	gTotalTextureBytes;
 extern U32  gTotalObjectBytes;
 extern U32  gTotalTextureBytesPerBoostLevel[] ;
diff --git a/indra/newview/llviewerstatsrecorder.cpp b/indra/newview/llviewerstatsrecorder.cpp
index e9d21b4848e4c6d8069df681eaf66cee337a96aa..91e485d01b7b6e19827f8c746e3c29ddd5b5bfaf 100644
--- a/indra/newview/llviewerstatsrecorder.cpp
+++ b/indra/newview/llviewerstatsrecorder.cpp
@@ -27,7 +27,6 @@
 #include "llviewerprecompiledheaders.h"
 #include "llviewerstatsrecorder.h"
 
-#if LL_RECORD_VIEWER_STATS
 
 #include "llfile.h"
 #include "llviewerregion.h"
@@ -45,9 +44,8 @@ LLViewerStatsRecorder* LLViewerStatsRecorder::sInstance = NULL;
 LLViewerStatsRecorder::LLViewerStatsRecorder() :
 	mObjectCacheFile(NULL),
 	mTimer(),
-	mRegionp(NULL),
-	mStartTime(0.f),
-	mProcessingTime(0.f)
+	mStartTime(0.0),
+	mLastSnapshotTime(0.0)
 {
 	if (NULL != sInstance)
 	{
@@ -61,112 +59,77 @@ LLViewerStatsRecorder::~LLViewerStatsRecorder()
 {
 	if (mObjectCacheFile != NULL)
 	{
+		// last chance snapshot
+		writeToLog(0.f);
 		LLFile::close(mObjectCacheFile);
 		mObjectCacheFile = NULL;
 	}
 }
 
-// static
-void LLViewerStatsRecorder::initClass()
-{
-	sInstance = new LLViewerStatsRecorder();
-}
-
-// static
-void LLViewerStatsRecorder::cleanupClass()
-{
-	delete sInstance;
-	sInstance = NULL;
-}
-
-
-void LLViewerStatsRecorder::initStatsRecorder(LLViewerRegion *regionp)
-{
-	if (mObjectCacheFile == NULL)
-	{
-		mStartTime = LLTimer::getTotalTime();
-		mObjectCacheFile = LLFile::fopen(STATS_FILE_NAME, "wb");
-		if (mObjectCacheFile)
-		{	// Write column headers
-			std::ostringstream data_msg;
-			data_msg << "EventTime, "
-				<< "ProcessingTime, "
-				<< "CacheHits, "
-				<< "CacheFullMisses, "
-				<< "CacheCrcMisses, "
-				<< "FullUpdates, "
-				<< "TerseUpdates, "
-				<< "CacheMissRequests, "
-				<< "CacheMissResponses, "
-				<< "CacheUpdateDupes, "
-				<< "CacheUpdateChanges, "
-				<< "CacheUpdateAdds, "
-				<< "CacheUpdateReplacements, "
-				<< "UpdateFailures"
-				<< "\n";
-
-			fwrite(data_msg.str().c_str(), 1, data_msg.str().size(), mObjectCacheFile );
-		}
-	}
-}
-
-void LLViewerStatsRecorder::beginObjectUpdateEvents(LLViewerRegion *regionp)
-{
-	initStatsRecorder(regionp);
-	mRegionp = regionp;
-	mProcessingTime = LLTimer::getTotalTime();
-	clearStats();
-}
-
 void LLViewerStatsRecorder::clearStats()
 {
 	mObjectCacheHitCount = 0;
+	mObjectCacheHitSize = 0;
 	mObjectCacheMissFullCount = 0;
+	mObjectCacheMissFullSize = 0;
 	mObjectCacheMissCrcCount = 0;
+	mObjectCacheMissCrcSize = 0;
 	mObjectFullUpdates = 0;
+	mObjectFullUpdatesSize = 0;
 	mObjectTerseUpdates = 0;
+	mObjectTerseUpdatesSize = 0;
 	mObjectCacheMissRequests = 0;
 	mObjectCacheMissResponses = 0;
+	mObjectCacheMissResponsesSize = 0;
 	mObjectCacheUpdateDupes = 0;
 	mObjectCacheUpdateChanges = 0;
 	mObjectCacheUpdateAdds = 0;
 	mObjectCacheUpdateReplacements = 0;
 	mObjectUpdateFailures = 0;
+	mObjectUpdateFailuresSize = 0;
+	mTextureFetchSize = 0;
 }
 
 
-void LLViewerStatsRecorder::recordObjectUpdateFailure(U32 local_id, const EObjectUpdateType update_type)
+void LLViewerStatsRecorder::recordObjectUpdateFailure(U32 local_id, const EObjectUpdateType update_type, S32 msg_size)
 {
 	mObjectUpdateFailures++;
+	mObjectUpdateFailuresSize += msg_size;
 }
 
-void LLViewerStatsRecorder::recordCacheMissEvent(U32 local_id, const EObjectUpdateType update_type, U8 cache_miss_type)
+void LLViewerStatsRecorder::recordCacheMissEvent(U32 local_id, const EObjectUpdateType update_type, U8 cache_miss_type, S32 msg_size)
 {
 	if (LLViewerRegion::CACHE_MISS_TYPE_FULL == cache_miss_type)
 	{
 		mObjectCacheMissFullCount++;
+		mObjectCacheMissFullSize += msg_size;
 	}
 	else
 	{
 		mObjectCacheMissCrcCount++;
+		mObjectCacheMissCrcSize += msg_size;
 	}
 }
 
-void LLViewerStatsRecorder::recordObjectUpdateEvent(U32 local_id, const EObjectUpdateType update_type, LLViewerObject * objectp)
+void LLViewerStatsRecorder::recordObjectUpdateEvent(U32 local_id, const EObjectUpdateType update_type, LLViewerObject * objectp, S32 msg_size)
 {
 	switch (update_type)
 	{
 	case OUT_FULL:
 		mObjectFullUpdates++;
+		mObjectFullUpdatesSize += msg_size;
 		break;
 	case OUT_TERSE_IMPROVED:
 		mObjectTerseUpdates++;
+		mObjectTerseUpdatesSize += msg_size;
 		break;
 	case OUT_FULL_COMPRESSED:
 		mObjectCacheMissResponses++;
+		mObjectCacheMissResponsesSize += msg_size;
 		break;
 	case OUT_FULL_CACHED:
 		mObjectCacheHitCount++;
+		mObjectCacheHitSize += msg_size;
 		break;
 	default:
 		llwarns << "Unknown update_type" << llendl;
@@ -174,7 +137,7 @@ void LLViewerStatsRecorder::recordObjectUpdateEvent(U32 local_id, const EObjectU
 	};
 }
 
-void LLViewerStatsRecorder::recordCacheFullUpdate(U32 local_id, const EObjectUpdateType update_type, LLViewerRegion::eCacheUpdateResult update_result, LLViewerObject* objectp)
+void LLViewerStatsRecorder::recordCacheFullUpdate(U32 local_id, const EObjectUpdateType update_type, LLViewerRegion::eCacheUpdateResult update_result, LLViewerObject* objectp, S32 msg_size)
 {
 	switch (update_result)
 	{
@@ -201,9 +164,15 @@ void LLViewerStatsRecorder::recordRequestCacheMissesEvent(S32 count)
 	mObjectCacheMissRequests += count;
 }
 
-void LLViewerStatsRecorder::endObjectUpdateEvents()
+void LLViewerStatsRecorder::writeToLog( F32 interval )
 {
-	llinfos << "ILX: " 
+	F64 delta_time = LLTimer::getTotalSeconds() - mLastSnapshotTime;
+	S32 total_objects = mObjectCacheHitCount + mObjectCacheMissCrcCount + mObjectCacheMissFullCount + mObjectFullUpdates + mObjectTerseUpdates + mObjectCacheMissRequests + mObjectCacheMissResponses + mObjectCacheUpdateDupes + mObjectCacheUpdateChanges + mObjectCacheUpdateAdds + mObjectCacheUpdateReplacements + mObjectUpdateFailures;
+
+	if ( delta_time < interval || total_objects == 0) return;
+
+	mLastSnapshotTime = LLTimer::getTotalSeconds();
+	lldebugs << "ILX: " 
 		<< mObjectCacheHitCount << " hits, " 
 		<< mObjectCacheMissFullCount << " full misses, "
 		<< mObjectCacheMissCrcCount << " crc misses, "
@@ -218,41 +187,81 @@ void LLViewerStatsRecorder::endObjectUpdateEvents()
 		<< mObjectUpdateFailures << " update failures"
 		<< llendl;
 
-	S32 total_objects = mObjectCacheHitCount + mObjectCacheMissCrcCount + mObjectCacheMissFullCount + mObjectFullUpdates + mObjectTerseUpdates + mObjectCacheMissRequests + mObjectCacheMissResponses + mObjectCacheUpdateDupes + mObjectCacheUpdateChanges + mObjectCacheUpdateAdds + mObjectCacheUpdateReplacements + mObjectUpdateFailures;
-	if (mObjectCacheFile != NULL &&
-		total_objects > 0)
+	if (mObjectCacheFile == NULL)
 	{
-		std::ostringstream data_msg;
-		F32 processing32 = (F32) ((LLTimer::getTotalTime() - mProcessingTime) / 1000.0);
-
-		data_msg << getTimeSinceStart()
-			<< ", " << processing32
-			<< ", " << mObjectCacheHitCount
-			<< ", " << mObjectCacheMissFullCount
-			<< ", " << mObjectCacheMissCrcCount
-			<< ", " << mObjectFullUpdates
-			<< ", " << mObjectTerseUpdates
-			<< ", " << mObjectCacheMissRequests
-			<< ", " << mObjectCacheMissResponses
-			<< ", " << mObjectCacheUpdateDupes
-			<< ", " << mObjectCacheUpdateChanges
-			<< ", " << mObjectCacheUpdateAdds
-			<< ", " << mObjectCacheUpdateReplacements
-			<< ", " << mObjectUpdateFailures
-			<< "\n";
+		mStartTime = LLTimer::getTotalSeconds();
+		mObjectCacheFile = LLFile::fopen(STATS_FILE_NAME, "wb");
+		if (mObjectCacheFile)
+		{	// Write column headers
+			std::ostringstream data_msg;
+			data_msg << "EventTime(ms)\t"
+				<< "Cache Hits\t"
+				<< "Cache Full Misses\t"
+				<< "Cache Crc Misses\t"
+				<< "Full Updates\t"
+				<< "Terse Updates\t"
+				<< "Cache Miss Requests\t"
+				<< "Cache Miss Responses\t"
+				<< "Cache Update Dupes\t"
+				<< "Cache Update Changes\t"
+				<< "Cache Update Adds\t"
+				<< "Cache Update Replacements\t"
+				<< "Update Failures\t"
+				<< "Cache Hits bps\t"
+				<< "Cache Full Misses bps\t"
+				<< "Cache Crc Misses bps\t"
+				<< "Full Updates bps\t"
+				<< "Terse Updates bps\t"
+				<< "Cache Miss Responses bps\t"
+				<< "Texture Fetch bps\t"
+				<< "\n";
 
-		fwrite(data_msg.str().c_str(), 1, data_msg.str().size(), mObjectCacheFile );
+			fwrite(data_msg.str().c_str(), 1, data_msg.str().size(), mObjectCacheFile );
+		}
+		else
+		{
+			llwarns << "Couldn't open " << STATS_FILE_NAME << " for logging." << llendl;
+			return;
+		}
 	}
 
+	std::ostringstream data_msg;
+
+	data_msg << getTimeSinceStart()
+		<< "\t " << mObjectCacheHitCount
+		<< "\t" << mObjectCacheMissFullCount
+		<< "\t" << mObjectCacheMissCrcCount
+		<< "\t" << mObjectFullUpdates
+		<< "\t" << mObjectTerseUpdates
+		<< "\t" << mObjectCacheMissRequests
+		<< "\t" << mObjectCacheMissResponses
+		<< "\t" << mObjectCacheUpdateDupes
+		<< "\t" << mObjectCacheUpdateChanges
+		<< "\t" << mObjectCacheUpdateAdds
+		<< "\t" << mObjectCacheUpdateReplacements
+		<< "\t" << mObjectUpdateFailures
+		<< "\t" << (mObjectCacheHitSize * 8 / delta_time)
+		<< "\t" << (mObjectCacheMissFullSize * 8 / delta_time)
+		<< "\t" << (mObjectCacheMissCrcSize * 8 / delta_time)
+		<< "\t" << (mObjectFullUpdatesSize * 8 / delta_time)
+		<< "\t" << (mObjectTerseUpdatesSize * 8 / delta_time)
+		<< "\t" << (mObjectCacheMissResponsesSize * 8 / delta_time)
+		<< "\t" << (mTextureFetchSize * 8 / delta_time)
+		<< "\n";
+
+	fwrite(data_msg.str().c_str(), 1, data_msg.str().size(), mObjectCacheFile );
 	clearStats();
 }
 
 F32 LLViewerStatsRecorder::getTimeSinceStart()
 {
-	return (F32) ((LLTimer::getTotalTime() - mStartTime) / 1000.0);
+	return (F32) (LLTimer::getTotalSeconds() - mStartTime);
 }
 
-#endif
+void LLViewerStatsRecorder::recordTextureFetch( S32 msg_size )
+{
+	mTextureFetchSize += msg_size;
+}
 
 
 
diff --git a/indra/newview/llviewerstatsrecorder.h b/indra/newview/llviewerstatsrecorder.h
index 612ac380f7f9c92ef13f9c79cfbb91e0f6686550..ce6dd63ec564ae22f0a49d7184bc5fe4694f25b7 100644
--- a/indra/newview/llviewerstatsrecorder.h
+++ b/indra/newview/llviewerstatsrecorder.h
@@ -32,66 +32,114 @@
 // for analysis.
 
 // This is normally 0.  Set to 1 to enable viewer stats recording
-#define LL_RECORD_VIEWER_STATS	0
+#define LL_RECORD_VIEWER_STATS	1
 
 
-#if LL_RECORD_VIEWER_STATS
 #include "llframetimer.h"
 #include "llviewerobject.h"
 #include "llviewerregion.h"
 
 class LLMutex;
-class LLViewerRegion;
 class LLViewerObject;
 
-class LLViewerStatsRecorder
+class LLViewerStatsRecorder : public LLSingleton<LLViewerStatsRecorder>
 {
  public:
+	LOG_CLASS(LLViewerStatsRecorder);	 
 	LLViewerStatsRecorder();
 	~LLViewerStatsRecorder();
 
-	static void initClass();
-	static void cleanupClass();
-	static LLViewerStatsRecorder* instance() {return sInstance; }
+	void objectUpdateFailure(U32 local_id, const EObjectUpdateType update_type, S32 msg_size)
+	{
+#if LL_RECORD_VIEWER_STATS
+		recordObjectUpdateFailure(local_id, update_type, msg_size);
+#endif
+	}
 
-	void initStatsRecorder(LLViewerRegion *regionp);
+	void cacheMissEvent(U32 local_id, const EObjectUpdateType update_type, U8 cache_miss_type, S32 msg_size)
+	{
+#if LL_RECORD_VIEWER_STATS
+		recordCacheMissEvent(local_id, update_type, cache_miss_type, msg_size);
+#endif
+	}
 
-	void beginObjectUpdateEvents(LLViewerRegion *regionp);
-	void recordObjectUpdateFailure(U32 local_id, const EObjectUpdateType update_type);
-	void recordCacheMissEvent(U32 local_id, const EObjectUpdateType update_type, U8 cache_miss_type);
-	void recordObjectUpdateEvent(U32 local_id, const EObjectUpdateType update_type, LLViewerObject * objectp);
-	void recordCacheFullUpdate(U32 local_id, const EObjectUpdateType update_type, LLViewerRegion::eCacheUpdateResult update_result, LLViewerObject* objectp);
-	void recordRequestCacheMissesEvent(S32 count);
-	void endObjectUpdateEvents();
+	void objectUpdateEvent(U32 local_id, const EObjectUpdateType update_type, LLViewerObject * objectp, S32 msg_size)
+	{
+#if LL_RECORD_VIEWER_STATS
+		recordObjectUpdateEvent(local_id, update_type, objectp, msg_size);
+#endif
+	}
+
+	void cacheFullUpdate(U32 local_id, const EObjectUpdateType update_type, LLViewerRegion::eCacheUpdateResult update_result, LLViewerObject* objectp, S32 msg_size)
+	{
+#if LL_RECORD_VIEWER_STATS
+		recordCacheFullUpdate(local_id, update_type, update_result, objectp, msg_size);
+#endif
+	}
+
+	void requestCacheMissesEvent(S32 count)
+	{
+#if LL_RECORD_VIEWER_STATS
+		recordRequestCacheMissesEvent(count);
+#endif
+	}
+
+	void textureFetch(S32 msg_size)
+	{
+#if LL_RECORD_VIEWER_STATS
+		recordTextureFetch(msg_size);
+#endif
+	}
+
+	void log(F32 interval)
+	{
+#if LL_RECORD_VIEWER_STATS
+		writeToLog(interval);
+#endif
+	}
 
 	F32 getTimeSinceStart();
 
 private:
+	void recordObjectUpdateFailure(U32 local_id, const EObjectUpdateType update_type, S32 msg_size);
+	void recordCacheMissEvent(U32 local_id, const EObjectUpdateType update_type, U8 cache_miss_type, S32 msg_size);
+	void recordObjectUpdateEvent(U32 local_id, const EObjectUpdateType update_type, LLViewerObject * objectp, S32 msg_size);
+	void recordCacheFullUpdate(U32 local_id, const EObjectUpdateType update_type, LLViewerRegion::eCacheUpdateResult update_result, LLViewerObject* objectp, S32 msg_size);
+	void recordRequestCacheMissesEvent(S32 count);
+	void recordTextureFetch(S32 msg_size);
+	void writeToLog(F32 interval);
+
 	static LLViewerStatsRecorder* sInstance;
 
 	LLFILE *	mObjectCacheFile;		// File to write data into
 	LLFrameTimer	mTimer;
-	LLViewerRegion*	mRegionp;
 	F64			mStartTime;
-	F64			mProcessingTime;
+	F64			mLastSnapshotTime;
 
 	S32			mObjectCacheHitCount;
+	S32			mObjectCacheHitSize;
 	S32			mObjectCacheMissFullCount;
+	S32			mObjectCacheMissFullSize;
 	S32			mObjectCacheMissCrcCount;
+	S32			mObjectCacheMissCrcSize;
 	S32			mObjectFullUpdates;
+	S32			mObjectFullUpdatesSize;
 	S32			mObjectTerseUpdates;
+	S32			mObjectTerseUpdatesSize;
 	S32			mObjectCacheMissRequests;
 	S32			mObjectCacheMissResponses;
+	S32			mObjectCacheMissResponsesSize;
 	S32			mObjectCacheUpdateDupes;
 	S32			mObjectCacheUpdateChanges;
 	S32			mObjectCacheUpdateAdds;
 	S32			mObjectCacheUpdateReplacements;
 	S32			mObjectUpdateFailures;
+	S32			mObjectUpdateFailuresSize;
+	S32			mTextureFetchSize;
 
 
 	void	clearStats();
 };
-#endif	// LL_RECORD_VIEWER_STATS
 
 #endif // LLVIEWERSTATSRECORDER_H
 
diff --git a/indra/newview/llviewertexteditor.cpp b/indra/newview/llviewertexteditor.cpp
index 99102309a16fdd0fcdd3cdfa23929dcce44aa54a..122d8f4a961e46fbb0091822ee8feccc673ddba9 100644
--- a/indra/newview/llviewertexteditor.cpp
+++ b/indra/newview/llviewertexteditor.cpp
@@ -1144,6 +1144,14 @@ void LLViewerTextEditor::openEmbeddedTexture( LLInventoryItem* item, llwchar wc
 	{
 		preview->setAuxItem( item );
 		preview->setNotecardInfo(mNotecardInventoryID, mObjectID);
+		if (preview->hasString("Title"))
+		{
+			LLStringUtil::format_map_t args;
+			args["[NAME]"] = item->getName();
+			LLUIString title = preview->getString("Title", args);
+			preview->setTitle(title.getString());
+		}
+		preview->getChild<LLUICtrl>("desc")->setValue(item->getDescription());
 	}
 }
 
diff --git a/indra/newview/llviewertexture.cpp b/indra/newview/llviewertexture.cpp
index 8eb8717de2d49edc3947a4e2f4cec190a68aa04f..b0f8f60d1ec744a3305776b3173e8451478ccafd 100644
--- a/indra/newview/llviewertexture.cpp
+++ b/indra/newview/llviewertexture.cpp
@@ -39,7 +39,6 @@
 #include "llimagebmp.h"
 #include "llimagej2c.h"
 #include "llimagetga.h"
-#include "llmemtype.h"
 #include "llstl.h"
 #include "llvfile.h"
 #include "llvfs.h"
@@ -413,8 +412,8 @@ void LLViewerTexture::initClass()
 	
 	if(gSavedSettings.getBOOL("TextureFetchDebuggerEnabled"))
 	{
-		sTexelPixelRatio = gSavedSettings.getF32("TexelPixelRatio");
-	}
+	sTexelPixelRatio = gSavedSettings.getF32("TexelPixelRatio");
+}
 }
 
 // static
@@ -2240,7 +2239,7 @@ void LLViewerFetchedTexture::forceToDeleteRequest()
 		mIsFetching = FALSE ;
 	}
 		
-	resetTextureStats();
+		resetTextureStats();
 
 	mDesiredDiscardLevel = getMaxDiscardLevel() + 1;
 }
@@ -2289,9 +2288,9 @@ void LLViewerFetchedTexture::setLoadedCallback( loaded_callback_func loaded_call
 	if(mPauseLoadedCallBacks)
 	{
 		if(!pause)
-		{
-			unpauseLoadedCallbacks(src_callback_list) ;
-		}
+	{
+		unpauseLoadedCallbacks(src_callback_list) ;
+	}
 	}
 	else if(pause)
 	{
diff --git a/indra/newview/llviewertexturelist.cpp b/indra/newview/llviewertexturelist.cpp
index e4669cde345f0b89a34c0d32679181a386fb9467..17d8e5e4fa8c5417e9eebfcebdea9e40ab610054 100644
--- a/indra/newview/llviewertexturelist.cpp
+++ b/indra/newview/llviewertexturelist.cpp
@@ -67,12 +67,12 @@ void (*LLViewerTextureList::sUUIDCallback)(void **, const LLUUID&) = NULL;
 U32 LLViewerTextureList::sTextureBits = 0;
 U32 LLViewerTextureList::sTexturePackets = 0;
 S32 LLViewerTextureList::sNumImages = 0;
-LLStat LLViewerTextureList::sNumImagesStat(32, TRUE);
-LLStat LLViewerTextureList::sNumRawImagesStat(32, TRUE);
-LLStat LLViewerTextureList::sGLTexMemStat(32, TRUE);
-LLStat LLViewerTextureList::sGLBoundMemStat(32, TRUE);
-LLStat LLViewerTextureList::sRawMemStat(32, TRUE);
-LLStat LLViewerTextureList::sFormattedMemStat(32, TRUE);
+LLStat LLViewerTextureList::sNumImagesStat("Num Images", TRUE);
+LLStat LLViewerTextureList::sNumRawImagesStat("Num Raw Images", TRUE);
+LLStat LLViewerTextureList::sGLTexMemStat("GL Texture Mem", TRUE);
+LLStat LLViewerTextureList::sGLBoundMemStat("GL Bound Mem", TRUE);
+LLStat LLViewerTextureList::sRawMemStat("Raw Image Mem", TRUE);
+LLStat LLViewerTextureList::sFormattedMemStat("Formatted Image Mem", TRUE);
 
 LLViewerTextureList gTextureList;
 static LLFastTimer::DeclareTimer FTM_PROCESS_IMAGES("Process Images");
@@ -613,8 +613,8 @@ void LLViewerTextureList::updateImages(F32 max_time)
 	if(gTeleportDisplay)
 	{
 		if(!cleared)
-		{
-			clearFetchingRequests();
+	{
+		clearFetchingRequests();
 			gPipeline.clearRebuildGroups();
 			cleared = TRUE;
 		}
@@ -783,7 +783,7 @@ void LLViewerTextureList::updateImagesDecodePriorities()
 					imagep->setInactive() ;										
 				}
 			}
-
+			
 			if (!imagep->isInImageList())
 			{
 				continue;
@@ -806,9 +806,9 @@ void LLViewerTextureList::updateImagesDecodePriorities()
 				imagep->setDecodePriority(decode_priority);
 				mImageList.insert(imagep);
 			}
+			}
 		}
 	}
-}
 
 void LLViewerTextureList::setDebugFetching(LLViewerFetchedTexture* tex, S32 debug_level)
 {
@@ -981,8 +981,8 @@ F32 LLViewerTextureList::updateImagesFetchTextures(F32 max_time)
             if (!SKIP_LOW_PRIO || (SKIP_LOW_PRIO && ((imagep->getDecodePriority() > MIN_PRIORITY_THRESHOLD) || imagep->hasFetcher())))
             {
                 entries.push_back(imagep);
-                update_counter--;
-            }
+			update_counter--;
+		}
 
 			iter2++;
 			total_update_count--;
@@ -1006,14 +1006,6 @@ F32 LLViewerTextureList::updateImagesFetchTextures(F32 max_time)
 			break;
 		}
 	}
-	//if (fetch_count == 0)
-	//{
-	//	gDebugTimers[0].pause();
-	//}
-	//else
-	//{
-	//	gDebugTimers[0].unpause();
-	//}
 	return image_op_timer.getElapsedTimeF32();
 }
 
@@ -1385,7 +1377,6 @@ void LLViewerTextureList::receiveImagePacket(LLMessageSystem *msg, void **user_d
 {
 	static LLCachedControl<bool> log_texture_traffic(gSavedSettings,"LogTextureNetworkTraffic") ;
 
-	LLMemType mt1(LLMemType::MTYPE_APPFMTIMAGE);
 	LLFastTimer t(FTM_PROCESS_IMAGES);
 	
 	// Receives image packet, copy into image object,
diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp
index 1798d554b9fb12d4d942bf3f3f9c8db63ed65dd0..8b50e56fb3d4406a040a28b2b1f0589c56ac5fca 100755
--- a/indra/newview/llviewerwindow.cpp
+++ b/indra/newview/llviewerwindow.cpp
@@ -77,6 +77,7 @@
 #include "llmediaentry.h"
 #include "llurldispatcher.h"
 #include "raytrace.h"
+#include "llstat.h"
 
 // newview includes
 #include "llagent.h"
@@ -334,27 +335,24 @@ class LLDebugText
 		
 		if (gSavedSettings.getBOOL("DebugShowTime"))
 		{
-			const U32 y_inc2 = 15;
-			for (std::map<S32,LLFrameTimer>::reverse_iterator iter = gDebugTimers.rbegin();
-				 iter != gDebugTimers.rend(); ++iter)
 			{
-				S32 idx = iter->first;
-				LLFrameTimer& timer = iter->second;
+			const U32 y_inc2 = 15;
+				LLFrameTimer& timer = gTextureTimer;
 				F32 time = timer.getElapsedTimeF32();
 				S32 hours = (S32)(time / (60*60));
 				S32 mins = (S32)((time - hours*(60*60)) / 60);
 				S32 secs = (S32)((time - hours*(60*60) - mins*60));
-				std::string label = gDebugTimerLabel[idx];
-				if (label.empty()) label = llformat("Debug: %d", idx);
-				addText(xpos, ypos, llformat(" %s: %d:%02d:%02d", label.c_str(), hours,mins,secs)); ypos += y_inc2;
+				addText(xpos, ypos, llformat("Texture: %d:%02d:%02d", hours,mins,secs)); ypos += y_inc2;
 			}
 			
+			{
 			F32 time = gFrameTimeSeconds;
 			S32 hours = (S32)(time / (60*60));
 			S32 mins = (S32)((time - hours*(60*60)) / 60);
 			S32 secs = (S32)((time - hours*(60*60) - mins*60));
 			addText(xpos, ypos, llformat("Time: %d:%02d:%02d", hours,mins,secs)); ypos += y_inc;
 		}
+		}
 		
 #if LL_WINDOWS
 		if (gSavedSettings.getBOOL("DebugShowMemory"))
@@ -1542,7 +1540,8 @@ LLViewerWindow::LLViewerWindow(const Params& p)
 	mResDirty(false),
 	mStatesDirty(false),
 	mCurrResolutionIndex(0),
-	mProgressView(NULL)
+	mProgressView(NULL),
+	mMouseVelocityStat(new LLStat("Mouse Velocity"))
 {
 	// gKeyboard is still NULL, so it doesn't do LLWindowListener any good to
 	// pass its value right now. Instead, pass it a nullary function that
@@ -1559,7 +1558,7 @@ LLViewerWindow::LLViewerWindow(const Params& p)
 	LLNotifications::instance().setIgnoreAllNotifications(ignore);
 	if (ignore)
 	{
-		llinfos << "NOTE: ALL NOTIFICATIONS THAT OCCUR WILL GET ADDED TO IGNORE LIST FOR LATER RUNS." << llendl;
+	llinfos << "NOTE: ALL NOTIFICATIONS THAT OCCUR WILL GET ADDED TO IGNORE LIST FOR LATER RUNS." << llendl;
 	}
 
 	// Default to application directory.
@@ -2072,6 +2071,8 @@ LLViewerWindow::~LLViewerWindow()
 
 	delete mDebugText;
 	mDebugText = NULL;
+
+	delete mMouseVelocityStat;
 }
 
 
@@ -3245,7 +3246,7 @@ void LLViewerWindow::updateMouseDelta()
 		mouse_vel.setVec((F32) dx, (F32) dy);
 	}
     
-	mMouseVelocityStat.addValue(mouse_vel.magVec());
+	mMouseVelocityStat->addValue(mouse_vel.magVec());
 }
 
 void LLViewerWindow::updateKeyboardFocus()
@@ -4234,15 +4235,49 @@ BOOL LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei
 		image_height = llmin(image_height, window_height);
 	}
 
+	S32 original_width = 0;
+	S32 original_height = 0;
+	bool reset_deferred = false;
+
+	LLRenderTarget scratch_space;
+
 	F32 scale_factor = 1.0f ;
 	if (!keep_window_aspect || (image_width > window_width) || (image_height > window_height))
 	{	
+		if ((image_width > window_width || image_height > window_height) && LLPipeline::sRenderDeferred && !show_ui)
+		{
+			if (scratch_space.allocate(image_width, image_height, GL_RGBA, true, true))
+			{
+				original_width = gPipeline.mDeferredScreen.getWidth();
+				original_height = gPipeline.mDeferredScreen.getHeight();
+
+				if (gPipeline.allocateScreenBuffer(image_width, image_height))
+				{
+					window_width = image_width;
+					window_height = image_height;
+					snapshot_width = image_width;
+					snapshot_height = image_height;
+					reset_deferred = true;
+					mWorldViewRectRaw.set(0, image_height, image_width, 0);
+					scratch_space.bindTarget();
+				}
+				else
+				{
+					scratch_space.release();
+					gPipeline.allocateScreenBuffer(original_width, original_height);
+				}
+			}
+		}
+
+		if (!reset_deferred)
+		{
 		// if image cropping or need to enlarge the scene, compute a scale_factor
 		F32 ratio = llmin( (F32)window_width / image_width , (F32)window_height / image_height) ;
 		snapshot_width  = (S32)(ratio * image_width) ;
 		snapshot_height = (S32)(ratio * image_height) ;
 		scale_factor = llmax(1.0f, 1.0f / ratio) ;
 	}
+	}
 	
 	if (show_ui && scale_factor > 1.f)
 	{
@@ -4430,6 +4465,15 @@ BOOL LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei
 		gPipeline.resetDrawOrders();
 	}
 
+	if (reset_deferred)
+	{
+		mWorldViewRectRaw = window_rect;
+		scratch_space.flush();
+		scratch_space.release();
+		gPipeline.allocateScreenBuffer(original_width, original_height);
+		
+	}
+
 	if (high_res)
 	{
 		send_agent_resume();
diff --git a/indra/newview/llviewerwindow.h b/indra/newview/llviewerwindow.h
index 6efcaeaf18add8c01ba20c0d8912547e4c8edb0d..5f475fe145b2a79bf32a8b904cb578d0e3dd06c9 100644
--- a/indra/newview/llviewerwindow.h
+++ b/indra/newview/llviewerwindow.h
@@ -41,7 +41,6 @@
 #include "llcursortypes.h"
 #include "llwindowcallbacks.h"
 #include "lltimer.h"
-#include "llstat.h"
 #include "llmousehandler.h"
 #include "llhandle.h"
 #include "llinitparam.h"
@@ -50,7 +49,7 @@
 #include <boost/signals2.hpp>
 #include <boost/scoped_ptr.hpp>
 
-
+class LLStat;
 class LLView;
 class LLViewerObject;
 class LLUUID;
@@ -251,7 +250,7 @@ class LLViewerWindow : public LLWindowCallbacks
 	S32				getCurrentMouseDX()		const	{ return mCurrentMouseDelta.mX; }
 	S32				getCurrentMouseDY()		const	{ return mCurrentMouseDelta.mY; }
 	LLCoordGL		getCurrentMouseDelta()	const	{ return mCurrentMouseDelta; }
-	LLStat *		getMouseVelocityStat()		{ return &mMouseVelocityStat; }
+	LLStat*			getMouseVelocityStat()		{ return mMouseVelocityStat; }
 	BOOL			getLeftMouseDown()	const	{ return mLeftMouseDown; }
 	BOOL			getMiddleMouseDown()	const	{ return mMiddleMouseDown; }
 	BOOL			getRightMouseDown()	const	{ return mRightMouseDown; }
@@ -428,7 +427,7 @@ class LLViewerWindow : public LLWindowCallbacks
 	LLCoordGL		mCurrentMousePoint;			// last mouse position in GL coords
 	LLCoordGL		mLastMousePoint;		// Mouse point at last frame.
 	LLCoordGL		mCurrentMouseDelta;		//amount mouse moved this frame
-	LLStat			mMouseVelocityStat;
+	LLStat*			mMouseVelocityStat;
 	BOOL			mLeftMouseDown;
 	BOOL			mMiddleMouseDown;
 	BOOL			mRightMouseDown;
diff --git a/indra/newview/llvlcomposition.cpp b/indra/newview/llvlcomposition.cpp
index ec932501e5eb5ce30c7802f5a42a7d77b754fdf3..abb515348068ace099458dd50e717898cd6f5b17 100644
--- a/indra/newview/llvlcomposition.cpp
+++ b/indra/newview/llvlcomposition.cpp
@@ -457,8 +457,6 @@ BOOL LLVLComposition::generateTexture(const F32 x, const F32 y,
 		texturep->createGLTexture(0, raw);
 	}
 	texturep->setSubImage(raw, tex_x_begin, tex_y_begin, tex_x_end - tex_x_begin, tex_y_end - tex_y_begin);
-	LLSurface::sTextureUpdateTime += gen_timer.getElapsedTimeF32();
-	LLSurface::sTexelsUpdated += (tex_x_end - tex_x_begin) * (tex_y_end - tex_y_begin);
 
 	for (S32 i = 0; i < 4; i++)
 	{
diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp
index 366b6004bee8420b316fd227b7512c532446d999..d366455a62d2a0dcd77fbc0ad4ea24b49dd5d1d4 100755
--- a/indra/newview/llvoavatar.cpp
+++ b/indra/newview/llvoavatar.cpp
@@ -695,7 +695,6 @@ LLVOAvatar::LLVOAvatar(const LLUUID& id,
 	mLastRezzedStatus(-1)
 
 {
-	LLMemType mt(LLMemType::MTYPE_AVATAR);
 	//VTResume();  // VTune
 	
 	// mVoiceVisualizer is created by the hud effects manager and uses the HUD Effects pipeline
@@ -1739,8 +1738,6 @@ LLViewerObject* LLVOAvatar::lineSegmentIntersectRiggedAttachments(const LLVector
 //-----------------------------------------------------------------------------
 BOOL LLVOAvatar::parseSkeletonFile(const std::string& filename)
 {
-	LLMemType mt(LLMemType::MTYPE_AVATAR);
-	
 	//-------------------------------------------------------------------------
 	// parse the file
 	//-------------------------------------------------------------------------
@@ -1782,8 +1779,6 @@ BOOL LLVOAvatar::parseSkeletonFile(const std::string& filename)
 //-----------------------------------------------------------------------------
 BOOL LLVOAvatar::setupBone(const LLVOAvatarBoneInfo* info, LLViewerJoint* parent, S32 &volume_num, S32 &joint_num)
 {
-	LLMemType mt(LLMemType::MTYPE_AVATAR);
-	
 	LLViewerJoint* joint = NULL;
 
 	if (info->mIsJoint)
@@ -1849,8 +1844,6 @@ BOOL LLVOAvatar::setupBone(const LLVOAvatarBoneInfo* info, LLViewerJoint* parent
 //-----------------------------------------------------------------------------
 BOOL LLVOAvatar::buildSkeleton(const LLVOAvatarSkeletonInfo *info)
 {
-	LLMemType mt(LLMemType::MTYPE_AVATAR);
-	
 	//-------------------------------------------------------------------------
 	// allocate joints
 	//-------------------------------------------------------------------------
@@ -1921,8 +1914,6 @@ void LLVOAvatar::startDefaultMotions()
 //-----------------------------------------------------------------------------
 void LLVOAvatar::buildCharacter()
 {
-	LLMemType mt(LLMemType::MTYPE_AVATAR);
-	
 	//-------------------------------------------------------------------------
 	// remove all references to our existing skeleton
 	// so we can rebuild it
@@ -2072,8 +2063,6 @@ void LLVOAvatar::buildCharacter()
 //-----------------------------------------------------------------------------
 void LLVOAvatar::releaseMeshData()
 {
-	LLMemType mt(LLMemType::MTYPE_AVATAR);
-	
 	if (sInstances.size() < AVATAR_RELEASE_THRESHOLD || mIsDummy)
 	{
 		return;
@@ -2128,7 +2117,6 @@ void LLVOAvatar::releaseMeshData()
 void LLVOAvatar::restoreMeshData()
 {
 	llassert(!isSelf());
-	LLMemType mt(LLMemType::MTYPE_AVATAR);
 	
 	//llinfos << "Restoring" << llendl;
 	mMeshValid = TRUE;
@@ -2344,8 +2332,6 @@ U32 LLVOAvatar::processUpdateMessage(LLMessageSystem *mesgsys,
 									 U32 block_num, const EObjectUpdateType update_type,
 									 LLDataPacker *dp)
 {
-	LLMemType mt(LLMemType::MTYPE_AVATAR);
-	
 	LLVector3 old_vel = getVelocity();
 	const BOOL has_name = !getNVPair("FirstName");
 
@@ -2425,7 +2411,6 @@ void LLVOAvatar::dumpAnimationState()
 //------------------------------------------------------------------------
 void LLVOAvatar::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time)
 {
-	LLMemType mt(LLMemType::MTYPE_AVATAR);
 	LLFastTimer t(FTM_AVATAR_UPDATE);
 
 	if (isDead())
@@ -3463,8 +3448,6 @@ bool LLVOAvatar::isVisuallyMuted() const
 //------------------------------------------------------------------------
 BOOL LLVOAvatar::updateCharacter(LLAgent &agent)
 {
-	LLMemType mt(LLMemType::MTYPE_AVATAR);
-
 	// clear debug text
 	mDebugText.clear();
 	if (LLVOAvatar::sShowAnimationDebug)
@@ -4793,8 +4776,6 @@ const LLUUID& LLVOAvatar::getStepSound() const
 //-----------------------------------------------------------------------------
 void LLVOAvatar::processAnimationStateChanges()
 {
-	LLMemType mt(LLMemType::MTYPE_AVATAR);
-	
 	if ( isAnyAnimationSignaled(AGENT_WALK_ANIMS, NUM_AGENT_WALK_ANIMS) )
 	{
 		startMotion(ANIM_AGENT_WALK_ADJUST);
@@ -4885,8 +4866,6 @@ void LLVOAvatar::processAnimationStateChanges()
 //-----------------------------------------------------------------------------
 BOOL LLVOAvatar::processSingleAnimationStateChange( const LLUUID& anim_id, BOOL start )
 {
-	LLMemType mt(LLMemType::MTYPE_AVATAR);
-	
 	BOOL result = FALSE;
 
 	if ( start ) // start animation
@@ -5021,8 +5000,6 @@ LLUUID LLVOAvatar::remapMotionID(const LLUUID& id)
 //-----------------------------------------------------------------------------
 BOOL LLVOAvatar::startMotion(const LLUUID& id, F32 time_offset)
 {
-	LLMemType mt(LLMemType::MTYPE_AVATAR);
-
 	lldebugs << "motion requested " << id.asString() << " " << gAnimLibrary.animationName(id) << llendl;
 
 	LLUUID remap_id = remapMotionID(id);
@@ -5851,8 +5828,6 @@ BOOL LLVOAvatar::isActive() const
 //-----------------------------------------------------------------------------
 void LLVOAvatar::setPixelAreaAndAngle(LLAgent &agent)
 {
-	LLMemType mt(LLMemType::MTYPE_AVATAR);
-
 	if (mDrawable.isNull())
 	{
 		return;
@@ -7297,8 +7272,6 @@ void LLVOAvatar::processAvatarAppearance( LLMessageSystem* mesgsys )
 		return;
 	}
 	
-	LLMemType mt(LLMemType::MTYPE_AVATAR);
-
 	BOOL is_first_appearance_message = !mFirstAppearanceMessageReceived;
 	mFirstAppearanceMessageReceived = TRUE;
 
@@ -7499,7 +7472,6 @@ void LLVOAvatar::onBakedTextureMasksLoaded( BOOL success, LLViewerFetchedTexture
 	if (!userdata) return;
 
 	//llinfos << "onBakedTextureMasksLoaded: " << src_vi->getID() << llendl;
-	const LLMemType mt(LLMemType::MTYPE_AVATAR);
 	const LLUUID id = src_vi->getID();
  
 	LLTextureMaskData* maskData = (LLTextureMaskData*) userdata;
diff --git a/indra/newview/llvoavatarself.cpp b/indra/newview/llvoavatarself.cpp
index 7a81063f8331ea4c5d619f53aea2839371c6d971..ed84e8103df5c8aeda177a6d6a67b4d5b57b33ea 100755
--- a/indra/newview/llvoavatarself.cpp
+++ b/indra/newview/llvoavatarself.cpp
@@ -257,8 +257,6 @@ BOOL LLVOAvatarSelf::loadAvatarSelf()
 
 BOOL LLVOAvatarSelf::buildSkeletonSelf(const LLVOAvatarSkeletonInfo *info)
 {
-	LLMemType mt(LLMemType::MTYPE_AVATAR);
-
 	// add special-purpose "screen" joint
 	mScreenp = new LLViewerJoint("mScreen", NULL);
 	// for now, put screen at origin, as it is only used during special
@@ -652,8 +650,6 @@ BOOL LLVOAvatarSelf::loadLayersets()
 // virtual
 BOOL LLVOAvatarSelf::updateCharacter(LLAgent &agent)
 {
-	LLMemType mt(LLMemType::MTYPE_AVATAR);
-
 	// update screen joint size
 	if (mScreenp)
 	{
@@ -1008,8 +1004,6 @@ void LLVOAvatarSelf::idleUpdateTractorBeam()
 // virtual
 void LLVOAvatarSelf::restoreMeshData()
 {
-	LLMemType mt(LLMemType::MTYPE_AVATAR);
-	
 	//llinfos << "Restoring" << llendl;
 	mMeshValid = TRUE;
 	updateJointLODs();
@@ -2226,7 +2220,7 @@ void LLVOAvatarSelf::sendAppearanceChangeMetrics()
 	{
 		LLCurlRequest::headers_t headers;
 		LLHTTPClient::post(caps_url,
-						   msg,
+							msg,
 						   new ViewerAppearanceChangeMetricsResponder(report_sequence,
 																	  report_sequence,
 																	  reporting_started));
diff --git a/indra/newview/llvograss.cpp b/indra/newview/llvograss.cpp
index 566c33c0afc1b7fb7b73d6feef2945f47eac8457..4dca87652da8d7135ceadeb01acc6a0df8d579d7 100644
--- a/indra/newview/llvograss.cpp
+++ b/indra/newview/llvograss.cpp
@@ -675,7 +675,6 @@ static LLFastTimer::DeclareTimer FTM_REBUILD_GRASS_VB("Grass VB");
 
 void LLGrassPartition::getGeometry(LLSpatialGroup* group)
 {
-	LLMemType mt(LLMemType::MTYPE_SPACE_PARTITION);
 	LLFastTimer ftm(FTM_REBUILD_GRASS_VB);
 
 	std::sort(mFaceList.begin(), mFaceList.end(), LLFace::CompareDistanceGreater());
diff --git a/indra/newview/llvopartgroup.cpp b/indra/newview/llvopartgroup.cpp
index e4f9915e9357463bc8d4d0625383e2a0477d79a0..fa34a6f1f56d5558bc86e22cb202b097e0006116 100644
--- a/indra/newview/llvopartgroup.cpp
+++ b/indra/newview/llvopartgroup.cpp
@@ -599,7 +599,6 @@ static LLFastTimer::DeclareTimer FTM_REBUILD_PARTICLE_GEOM("Particle Geom");
 
 void LLParticlePartition::getGeometry(LLSpatialGroup* group)
 {
-	LLMemType mt(LLMemType::MTYPE_SPACE_PARTITION);
 	LLFastTimer ftm(FTM_REBUILD_PARTICLE_GEOM);
 
 	std::sort(mFaceList.begin(), mFaceList.end(), LLFace::CompareDistanceGreater());
diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp
index e99898a83c4a3dab4b62d0b7f7f5be785ac2c04a..813fa72cc3fbc315707c6914c52f1f54ea57797a 100644
--- a/indra/newview/llvovolume.cpp
+++ b/indra/newview/llvovolume.cpp
@@ -3961,7 +3961,6 @@ static LLFastTimer::DeclareTimer FTM_REGISTER_FACE("Register Face");
 void LLVolumeGeometryManager::registerFace(LLSpatialGroup* group, LLFace* facep, U32 type)
 {
 	LLFastTimer t(FTM_REGISTER_FACE);
-	LLMemType mt(LLMemType::MTYPE_SPACE_PARTITION);
 
 	if (facep->getViewerObject()->isSelected() && LLSelectMgr::getInstance()->mHideSelectedObjects)
 	{
@@ -4888,11 +4887,19 @@ void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, std::
 				facep->setTextureIndex(cur_tex);
 				texture_list.push_back(tex);
 
-				//if (can_batch_texture(facep))
-				{
+				if (can_batch_texture(facep))
+				{ //populate texture_list with any textures that can be batched
+				  //move i to the next unbatchable face
 					while (i != faces.end())
 					{
 						facep = *i;
+						
+						if (!can_batch_texture(facep))
+						{ //face is bump mapped or has an animated texture matrix -- can't 
+							//batch more than 1 texture at a time
+							break;
+						}
+
 						if (facep->getTexture() != tex)
 						{
 							if (distance_sort)
@@ -4918,12 +4925,6 @@ void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, std::
 								cur_tex++;
 							}
 
-							if (!can_batch_texture(facep))
-							{ //face is bump mapped or has an animated texture matrix -- can't 
-								//batch more than 1 texture at a time
-								break;
-							}
-
 							if (cur_tex >= texture_index_channels)
 							{ //cut batches when index channels are depleted
 								break;
diff --git a/indra/newview/llvowlsky.cpp b/indra/newview/llvowlsky.cpp
index a33f42cf8477cd277111a1ece858539e86f285c0..7f17fd3e5626efe95d9a38314b70cbe6ecdb3607 100644
--- a/indra/newview/llvowlsky.cpp
+++ b/indra/newview/llvowlsky.cpp
@@ -301,7 +301,7 @@ void LLVOWLSky::restoreGL()
 	gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_ALL, TRUE);
 }
 
-static LLFastTimer::DeclareTimer FTM_GEO_SKY("Sky Geometry");
+static LLFastTimer::DeclareTimer FTM_GEO_SKY("Windlight Sky Geometry");
 
 BOOL LLVOWLSky::updateGeometry(LLDrawable * drawable)
 {
diff --git a/indra/newview/llworld.cpp b/indra/newview/llworld.cpp
index 78ee3e4fd98d8da4c7834c5cf1a8ac46d4556eb5..43152c9025c87af90c0b027619325ef85e9ae9b2 100644
--- a/indra/newview/llworld.cpp
+++ b/indra/newview/llworld.cpp
@@ -138,7 +138,6 @@ void LLWorld::destroyClass()
 
 LLViewerRegion* LLWorld::addRegion(const U64 &region_handle, const LLHost &host)
 {
-	LLMemType mt(LLMemType::MTYPE_REGIONS);
 	llinfos << "Add region with handle: " << region_handle << " on host " << host << llendl;
 	LLViewerRegion *regionp = getRegionFromHandle(region_handle);
 	if (regionp)
@@ -644,7 +643,6 @@ void LLWorld::updateVisibilities()
 
 void LLWorld::updateRegions(F32 max_update_time)
 {
-	LLMemType mt_ur(LLMemType::MTYPE_IDLE_UPDATE_REGIONS);
 	LLTimer update_timer;
 	BOOL did_one = FALSE;
 	
@@ -1159,7 +1157,7 @@ void send_agent_resume()
 	}
 
 	// Reset the FPS counter to avoid an invalid fps
-	LLViewerStats::getInstance()->mFPSStat.start();
+	LLViewerStats::getInstance()->mFPSStat.reset();
 
 	LLAppViewer::instance()->resumeMainloopTimeout();
 }
@@ -1194,7 +1192,7 @@ void LLWorld::getAvatars(uuid_vec_t* avatar_ids, std::vector<LLVector3d>* positi
 	{
 		LLVOAvatar* pVOAvatar = (LLVOAvatar*) *iter;
 
-		if (!pVOAvatar->isDead() && !pVOAvatar->isSelf())
+		if (!pVOAvatar->isDead() && !pVOAvatar->isSelf() && !pVOAvatar->mIsDummy)
 		{
 			LLVector3d pos_global = pVOAvatar->getPositionGlobal();
 			LLUUID uuid = pVOAvatar->getID();
diff --git a/indra/newview/llworldmapview.cpp b/indra/newview/llworldmapview.cpp
index a3ccf87cfc9540dcabafdb9d0858d6d473b0ad3d..ccc513b80d68940020365fb3adaf3f118c8dedcc 100644
--- a/indra/newview/llworldmapview.cpp
+++ b/indra/newview/llworldmapview.cpp
@@ -1320,7 +1320,7 @@ void LLWorldMapView::drawTrackingCircle( const LLRect& rect, S32 x, S32 y, const
 
 	gGL.matrixMode(LLRender::MM_MODELVIEW);
 	gGL.pushMatrix();
-	gGL.translatef((F32)x, (F32)y, 0.f);
+	gGL.translatef((F32)x * LLUI::sGLScaleFactor.mV[VX], (F32)y * LLUI::sGLScaleFactor.mV[VY], 0.f);
 	gl_washer_segment_2d(inner_radius, outer_radius, start_theta, end_theta, 40, color, color);
 	gGL.popMatrix();
 
diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp
index 920bac93a2184085120b52ed27fa66596917e200..86791a37fbff3d998199f26703a23e57b88bef21 100644
--- a/indra/newview/pipeline.cpp
+++ b/indra/newview/pipeline.cpp
@@ -35,7 +35,6 @@
 #include "llviewercontrol.h"
 #include "llfasttimer.h"
 #include "llfontgl.h"
-#include "llmemtype.h"
 #include "llnamevalue.h"
 #include "llpointer.h"
 #include "llprimitive.h"
@@ -464,8 +463,6 @@ void LLPipeline::connectRefreshCachedSettingsSafe(const std::string name)
 
 void LLPipeline::init()
 {
-	LLMemType mt(LLMemType::MTYPE_PIPELINE_INIT);
-
 	refreshCachedSettings();
 
 	gOctreeMaxCapacity = gSavedSettings.getU32("OctreeMaxNodeCapacity");
@@ -777,7 +774,7 @@ void LLPipeline::allocatePhysicsBuffer()
 	}
 }
 
-void LLPipeline::allocateScreenBuffer(U32 resX, U32 resY)
+bool LLPipeline::allocateScreenBuffer(U32 resX, U32 resY)
 {
 	refreshCachedSettings();
 	U32 samples = RenderFSAASamples;
@@ -787,8 +784,13 @@ void LLPipeline::allocateScreenBuffer(U32 resX, U32 resY)
 	// - if not multisampled, shrink resolution and try again (favor X resolution over Y)
 	// Make sure to call "releaseScreenBuffers" after each failure to cleanup the partially loaded state
 
+	bool ret = true;
+
 	if (!allocateScreenBuffer(resX, resY, samples))
 	{
+		//failed to allocate at requested specification, return false
+		ret = false;
+
 		releaseScreenBuffers();
 		//reduce number of samples 
 		while (samples > 0)
@@ -796,7 +798,7 @@ void LLPipeline::allocateScreenBuffer(U32 resX, U32 resY)
 			samples /= 2;
 			if (allocateScreenBuffer(resX, resY, samples))
 			{ //success
-				return;
+				return ret;
 			}
 			releaseScreenBuffers();
 		}
@@ -809,20 +811,22 @@ void LLPipeline::allocateScreenBuffer(U32 resX, U32 resY)
 			resY /= 2;
 			if (allocateScreenBuffer(resX, resY, samples))
 			{
-				return;
+				return ret;
 			}
 			releaseScreenBuffers();
 
 			resX /= 2;
 			if (allocateScreenBuffer(resX, resY, samples))
 			{
-				return;
+				return ret;
 			}
 			releaseScreenBuffers();
 		}
 
 		llwarns << "Unable to allocate screen buffer at any resolution!" << llendl;
 	}
+
+	return ret;
 }
 
 
@@ -867,7 +871,7 @@ bool LLPipeline::allocateScreenBuffer(U32 resX, U32 resY, U32 samples)
 		if (!mScreen.allocate(resX, resY, GL_RGBA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE, samples)) return false;
 		if (samples > 0)
 		{
-			if (!mFXAABuffer.allocate(nhpo2(resX), nhpo2(resY), GL_RGBA, FALSE, FALSE, LLTexUnit::TT_TEXTURE, FALSE, samples)) return false;
+			if (!mFXAABuffer.allocate(resX, resY, GL_RGBA, FALSE, FALSE, LLTexUnit::TT_TEXTURE, FALSE, samples)) return false;
 		}
 		else
 		{
@@ -901,7 +905,7 @@ bool LLPipeline::allocateScreenBuffer(U32 resX, U32 resY, U32 samples)
 			}
 		}
 
-		U32 width = nhpo2(U32(resX*scale))/2;
+		U32 width = (U32)(resX*scale);
 		U32 height = width;
 
 		if (shadow_detail > 1)
@@ -1127,7 +1131,6 @@ void LLPipeline::releaseScreenBuffers()
 void LLPipeline::createGLBuffers()
 {
 	stop_glerror();
-	LLMemType mt_cb(LLMemType::MTYPE_PIPELINE_CREATE_BUFFERS);
 	assertInitialized();
 
 	updateRenderDeferred();
@@ -1264,7 +1267,6 @@ void LLPipeline::createLUTBuffers()
 
 void LLPipeline::restoreGL()
 {
-	LLMemType mt_cb(LLMemType::MTYPE_PIPELINE_RESTORE_GL);
 	assertInitialized();
 
 	if (mVertexShadersEnabled)
@@ -1326,7 +1328,6 @@ BOOL LLPipeline::canUseAntiAliasing() const
 
 void LLPipeline::unloadShaders()
 {
-	LLMemType mt_us(LLMemType::MTYPE_PIPELINE_UNLOAD_SHADERS);
 	LLViewerShaderMgr::instance()->unloadShaders();
 
 	mVertexShadersLoaded = 0;
@@ -1358,7 +1359,6 @@ S32 LLPipeline::getMaxLightingDetail() const
 
 S32 LLPipeline::setLightingDetail(S32 level)
 {
-	LLMemType mt_ld(LLMemType::MTYPE_PIPELINE_LIGHTING_DETAIL);
 	refreshCachedSettings();
 
 	if (level < 0)
@@ -1520,7 +1520,6 @@ LLDrawPool *LLPipeline::findPool(const U32 type, LLViewerTexture *tex0)
 
 LLDrawPool *LLPipeline::getPool(const U32 type,	LLViewerTexture *tex0)
 {
-	LLMemType mt(LLMemType::MTYPE_PIPELINE);
 	LLDrawPool *poolp = findPool(type, tex0);
 	if (poolp)
 	{
@@ -1537,7 +1536,6 @@ LLDrawPool *LLPipeline::getPool(const U32 type,	LLViewerTexture *tex0)
 // static
 LLDrawPool* LLPipeline::getPoolFromTE(const LLTextureEntry* te, LLViewerTexture* imagep)
 {
-	LLMemType mt(LLMemType::MTYPE_PIPELINE);
 	U32 type = getPoolTypeFromTE(te, imagep);
 	return gPipeline.getPool(type, imagep);
 }
@@ -1545,8 +1543,6 @@ LLDrawPool* LLPipeline::getPoolFromTE(const LLTextureEntry* te, LLViewerTexture*
 //static 
 U32 LLPipeline::getPoolTypeFromTE(const LLTextureEntry* te, LLViewerTexture* imagep)
 {
-	LLMemType mt_gpt(LLMemType::MTYPE_PIPELINE_GET_POOL_TYPE);
-	
 	if (!te || !imagep)
 	{
 		return 0;
@@ -1575,7 +1571,6 @@ U32 LLPipeline::getPoolTypeFromTE(const LLTextureEntry* te, LLViewerTexture* ima
 
 void LLPipeline::addPool(LLDrawPool *new_poolp)
 {
-	LLMemType mt_a(LLMemType::MTYPE_PIPELINE_ADD_POOL);
 	assertInitialized();
 	mPools.insert(new_poolp);
 	addToQuickLookup( new_poolp );
@@ -1583,7 +1578,6 @@ void LLPipeline::addPool(LLDrawPool *new_poolp)
 
 void LLPipeline::allocDrawable(LLViewerObject *vobj)
 {
-	LLMemType mt_ad(LLMemType::MTYPE_PIPELINE_ALLOCATE_DRAWABLE);
 	LLDrawable *drawable = new LLDrawable();
 	vobj->mDrawable = drawable;
 	
@@ -1697,8 +1691,6 @@ void LLPipeline::removeMutedAVsLights(LLVOAvatar* muted_avatar)
 
 U32 LLPipeline::addObject(LLViewerObject *vobj)
 {
-	LLMemType mt_ao(LLMemType::MTYPE_PIPELINE_ADD_OBJECT);
-
 	if (RenderDelayCreation)
 	{
 		mCreateQ.push_back(vobj);
@@ -1714,7 +1706,6 @@ U32 LLPipeline::addObject(LLViewerObject *vobj)
 void LLPipeline::createObjects(F32 max_dtime)
 {
 	LLFastTimer ftm(FTM_PIPELINE_CREATE);
-	LLMemType mt(LLMemType::MTYPE_PIPELINE_CREATE_OBJECTS);
 
 	LLTimer update_timer;
 
@@ -1900,7 +1891,6 @@ static LLFastTimer::DeclareTimer FTM_UPDATE_MOVE("Update Move");
 void LLPipeline::updateMove()
 {
 	LLFastTimer t(FTM_UPDATE_MOVE);
-	LLMemType mt_um(LLMemType::MTYPE_PIPELINE_UPDATE_MOVE);
 
 	if (FreezeTime)
 	{
@@ -2253,7 +2243,6 @@ static LLFastTimer::DeclareTimer FTM_CULL("Object Culling");
 void LLPipeline::updateCull(LLCamera& camera, LLCullResult& result, S32 water_clip, LLPlane* planep)
 {
 	LLFastTimer t(FTM_CULL);
-	LLMemType mt_uc(LLMemType::MTYPE_PIPELINE_UPDATE_CULL);
 
 	grabReferences(result);
 
@@ -2607,7 +2596,6 @@ void LLPipeline::rebuildPriorityGroups()
 {
 	LLFastTimer t(FTM_REBUILD_PRIORITY_GROUPS);
 	LLTimer update_timer;
-	LLMemType mt(LLMemType::MTYPE_PIPELINE);
 	assertInitialized();
 
 	gMeshRepo.notifyLoadedMeshes();
@@ -2678,7 +2666,6 @@ void LLPipeline::rebuildGroups()
 void LLPipeline::updateGeom(F32 max_dtime)
 {
 	LLTimer update_timer;
-	LLMemType mt(LLMemType::MTYPE_PIPELINE_UPDATE_GEOM);
 	LLPointer<LLDrawable> drawablep;
 
 	LLFastTimer t(FTM_GEO_UPDATE);
@@ -2772,8 +2759,6 @@ void LLPipeline::updateGeom(F32 max_dtime)
 
 void LLPipeline::markVisible(LLDrawable *drawablep, LLCamera& camera)
 {
-	LLMemType mt(LLMemType::MTYPE_PIPELINE_MARK_VISIBLE);
-
 	if(drawablep && !drawablep->isDead())
 	{
 		if (drawablep->isSpatialBridge())
@@ -2813,8 +2798,6 @@ void LLPipeline::markVisible(LLDrawable *drawablep, LLCamera& camera)
 
 void LLPipeline::markMoved(LLDrawable *drawablep, BOOL damped_motion)
 {
-	LLMemType mt_mm(LLMemType::MTYPE_PIPELINE_MARK_MOVED);
-
 	if (!drawablep)
 	{
 		//llerrs << "Sending null drawable to moved list!" << llendl;
@@ -2859,8 +2842,6 @@ void LLPipeline::markMoved(LLDrawable *drawablep, BOOL damped_motion)
 
 void LLPipeline::markShift(LLDrawable *drawablep)
 {
-	LLMemType mt(LLMemType::MTYPE_PIPELINE_MARK_SHIFT);
-
 	if (!drawablep || drawablep->isDead())
 	{
 		return;
@@ -2886,8 +2867,6 @@ static LLFastTimer::DeclareTimer FTM_SHIFT_HUD("Shift HUD");
 
 void LLPipeline::shiftObjects(const LLVector3 &offset)
 {
-	LLMemType mt(LLMemType::MTYPE_PIPELINE_SHIFT_OBJECTS);
-
 	assertInitialized();
 
 	glClear(GL_DEPTH_BUFFER_BIT);
@@ -2941,8 +2920,6 @@ void LLPipeline::shiftObjects(const LLVector3 &offset)
 
 void LLPipeline::markTextured(LLDrawable *drawablep)
 {
-	LLMemType mt(LLMemType::MTYPE_PIPELINE_MARK_TEXTURED);
-
 	if (drawablep && !drawablep->isDead() && assertInitialized())
 	{
 		mRetexturedList.insert(drawablep);
@@ -2993,8 +2970,6 @@ void LLPipeline::markMeshDirty(LLSpatialGroup* group)
 
 void LLPipeline::markRebuild(LLSpatialGroup* group, BOOL priority)
 {
-	LLMemType mt(LLMemType::MTYPE_PIPELINE);
-	
 	if (group && !group->isDead() && group->mSpatialPartition)
 	{
 		if (group->mSpatialPartition->mPartitionType == LLViewerRegion::PARTITION_HUD)
@@ -3034,8 +3009,6 @@ void LLPipeline::markRebuild(LLSpatialGroup* group, BOOL priority)
 
 void LLPipeline::markRebuild(LLDrawable *drawablep, LLDrawable::EDrawableFlags flag, BOOL priority)
 {
-	LLMemType mt(LLMemType::MTYPE_PIPELINE_MARK_REBUILD);
-
 	if (drawablep && !drawablep->isDead() && assertInitialized())
 	{
 		if (!drawablep->isState(LLDrawable::BUILT))
@@ -3082,7 +3055,6 @@ void LLPipeline::stateSort(LLCamera& camera, LLCullResult &result)
 	}
 
 	LLFastTimer ftm(FTM_STATESORT);
-	LLMemType mt(LLMemType::MTYPE_PIPELINE_STATE_SORT);
 
 	//LLVertexBuffer::unbind();
 
@@ -3183,7 +3155,6 @@ void LLPipeline::stateSort(LLCamera& camera, LLCullResult &result)
 
 void LLPipeline::stateSort(LLSpatialGroup* group, LLCamera& camera)
 {
-	LLMemType mt(LLMemType::MTYPE_PIPELINE_STATE_SORT);
 	if (group->changeLOD())
 	{
 		for (LLSpatialGroup::element_iter i = group->getDataBegin(); i != group->getDataEnd(); ++i)
@@ -3202,7 +3173,6 @@ void LLPipeline::stateSort(LLSpatialGroup* group, LLCamera& camera)
 
 void LLPipeline::stateSort(LLSpatialBridge* bridge, LLCamera& camera)
 {
-	LLMemType mt(LLMemType::MTYPE_PIPELINE_STATE_SORT);
 	if (bridge->getSpatialGroup()->changeLOD())
 	{
 		bool force_update = false;
@@ -3212,8 +3182,6 @@ void LLPipeline::stateSort(LLSpatialBridge* bridge, LLCamera& camera)
 
 void LLPipeline::stateSort(LLDrawable* drawablep, LLCamera& camera)
 {
-	LLMemType mt(LLMemType::MTYPE_PIPELINE_STATE_SORT);
-		
 	if (!drawablep
 		|| drawablep->isDead() 
 		|| !hasRenderType(drawablep->getRenderType()))
@@ -3504,7 +3472,6 @@ void renderSoundHighlights(LLDrawable* drawablep)
 
 void LLPipeline::postSort(LLCamera& camera)
 {
-	LLMemType mt(LLMemType::MTYPE_PIPELINE_POST_SORT);
 	LLFastTimer ftm(FTM_STATESORT_POSTSORT);
 
 	assertInitialized();
@@ -3756,7 +3723,6 @@ void LLPipeline::postSort(LLCamera& camera)
 
 void render_hud_elements()
 {
-	LLMemType mt_rhe(LLMemType::MTYPE_PIPELINE_RENDER_HUD_ELS);
 	LLFastTimer t(FTM_RENDER_UI);
 	gPipeline.disableLights();		
 	
@@ -3811,8 +3777,6 @@ void render_hud_elements()
 
 void LLPipeline::renderHighlights()
 {
-	LLMemType mt(LLMemType::MTYPE_PIPELINE_RENDER_HL);
-
 	assertInitialized();
 
 	// Draw 3D UI elements here (before we clear the Z buffer in POOL_HUD)
@@ -3976,7 +3940,6 @@ U32 LLPipeline::sCurRenderPoolType = 0 ;
 
 void LLPipeline::renderGeom(LLCamera& camera, BOOL forceVBOUpdate)
 {
-	LLMemType mt(LLMemType::MTYPE_PIPELINE_RENDER_GEOM);
 	LLFastTimer t(FTM_RENDER_GEOMETRY);
 
 	assertInitialized();
@@ -4229,7 +4192,6 @@ void LLPipeline::renderGeomDeferred(LLCamera& camera)
 {
 	LLAppViewer::instance()->pingMainloopTimeout("Pipeline:RenderGeomDeferred");
 
-	LLMemType mt_rgd(LLMemType::MTYPE_PIPELINE_RENDER_GEOM_DEFFERRED);
 	LLFastTimer t(FTM_RENDER_GEOMETRY);
 
 	LLFastTimer t2(FTM_DEFERRED_POOLS);
@@ -4326,7 +4288,6 @@ void LLPipeline::renderGeomDeferred(LLCamera& camera)
 
 void LLPipeline::renderGeomPostDeferred(LLCamera& camera)
 {
-	LLMemType mt_rgpd(LLMemType::MTYPE_PIPELINE_RENDER_GEOM_POST_DEF);
 	LLFastTimer t(FTM_POST_DEFERRED_POOLS);
 	U32 cur_type = 0;
 
@@ -4422,7 +4383,6 @@ void LLPipeline::renderGeomPostDeferred(LLCamera& camera)
 
 void LLPipeline::renderGeomShadow(LLCamera& camera)
 {
-	LLMemType mt_rgs(LLMemType::MTYPE_PIPELINE_RENDER_GEOM_SHADOW);
 	U32 cur_type = 0;
 	
 	LLGLEnable cull(GL_CULL_FACE);
@@ -4576,8 +4536,6 @@ void LLPipeline::renderPhysicsDisplay()
 
 void LLPipeline::renderDebug()
 {
-	LLMemType mt(LLMemType::MTYPE_PIPELINE);
-
 	assertInitialized();
 
 	bool hud_only = hasRenderType(LLPipeline::RENDER_TYPE_HUD);
@@ -5230,7 +5188,6 @@ static LLFastTimer::DeclareTimer FTM_REBUILD_POOLS("Rebuild Pools");
 void LLPipeline::rebuildPools()
 {
 	LLFastTimer t(FTM_REBUILD_POOLS);
-	LLMemType mt(LLMemType::MTYPE_PIPELINE_REBUILD_POOLS);
 
 	assertInitialized();
 
@@ -5270,8 +5227,6 @@ void LLPipeline::rebuildPools()
 
 void LLPipeline::addToQuickLookup( LLDrawPool* new_poolp )
 {
-	LLMemType mt(LLMemType::MTYPE_PIPELINE_QUICK_LOOKUP);
-
 	assertInitialized();
 
 	switch( new_poolp->getType() )
@@ -5437,7 +5392,6 @@ void LLPipeline::removePool( LLDrawPool* poolp )
 void LLPipeline::removeFromQuickLookup( LLDrawPool* poolp )
 {
 	assertInitialized();
-	LLMemType mt(LLMemType::MTYPE_PIPELINE);
 	switch( poolp->getType() )
 	{
 	case LLDrawPool::POOL_SIMPLE:
@@ -6860,7 +6814,6 @@ void LLPipeline::doResetVertexBuffers()
 
 void LLPipeline::renderObjects(U32 type, U32 mask, BOOL texture, BOOL batch_texture)
 {
-	LLMemType mt_ro(LLMemType::MTYPE_PIPELINE_RENDER_OBJECTS);
 	assertInitialized();
 	gGL.loadMatrix(gGLModelView);
 	gGLLastMatrix = NULL;
@@ -6933,7 +6886,6 @@ static LLFastTimer::DeclareTimer FTM_RENDER_BLOOM("Bloom");
 
 void LLPipeline::renderBloom(BOOL for_snapshot, F32 zoom_factor, int subfield)
 {
-	LLMemType mt_ru(LLMemType::MTYPE_PIPELINE_RENDER_BLOOM);
 	if (!(gPipeline.canUseVertexShaders() &&
 		sRenderGlow))
 	{
@@ -7085,11 +7037,11 @@ void LLPipeline::renderBloom(BOOL for_snapshot, F32 zoom_factor, int subfield)
 
 	gGlowProgram.unbind();
 
-	if (LLRenderTarget::sUseFBO)
+	/*if (LLRenderTarget::sUseFBO)
 	{
 		LLFastTimer ftm(FTM_RENDER_BLOOM_FBO);
 		glBindFramebuffer(GL_FRAMEBUFFER, 0);
-	}
+	}*/
 
 	gGLViewport[0] = gViewerWindow->getWorldViewRectRaw().mLeft;
 	gGLViewport[1] = gViewerWindow->getWorldViewRectRaw().mBottom;
@@ -7965,10 +7917,6 @@ void LLPipeline::renderDeferredLighting()
 		gGL.popMatrix();
 		stop_glerror();
 
-		//copy depth and stencil from deferred screen
-		//mScreen.copyContents(mDeferredScreen, 0, 0, mDeferredScreen.getWidth(), mDeferredScreen.getHeight(),
-		//					0, 0, mScreen.getWidth(), mScreen.getHeight(), GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT, GL_NEAREST);
-
 		mScreen.bindTarget();
 		// clear color buffer here - zeroing alpha (glow) is important or it will accumulate against sky
 		glClearColor(0,0,0,0);
@@ -8740,8 +8688,6 @@ void LLPipeline::generateWaterReflection(LLCamera& camera_in)
 		}
 		last_update = LLDrawPoolWater::sNeedsReflectionUpdate && LLDrawPoolWater::sNeedsDistortionUpdate;
 
-		LLRenderTarget::unbindTarget();
-
 		LLPipeline::sReflectionRender = FALSE;
 
 		if (!LLRenderTarget::sUseFBO)
@@ -9999,7 +9945,6 @@ static LLFastTimer::DeclareTimer FTM_IMPOSTOR_RESIZE("Impostor Resize");
 
 void LLPipeline::generateImpostor(LLVOAvatar* avatar)
 {
-	LLMemType mt_gi(LLMemType::MTYPE_PIPELINE_GENERATE_IMPOSTOR);
 	LLGLState::checkStates();
 	LLGLState::checkTextureChannels();
 	LLGLState::checkClientArrays();
diff --git a/indra/newview/pipeline.h b/indra/newview/pipeline.h
index fd2a1e06cd47f094135fce9f89d1e56fa28f84bc..318053355a9415d84d26fc9920febfd67c194c0f 100644
--- a/indra/newview/pipeline.h
+++ b/indra/newview/pipeline.h
@@ -119,8 +119,14 @@ class LLPipeline
 	void createGLBuffers();
 	void createLUTBuffers();
 
-	void allocateScreenBuffer(U32 resX, U32 resY);
+	//allocate the largest screen buffer possible up to resX, resY
+	//returns true if full size buffer allocated, false if some other size is allocated
+	bool allocateScreenBuffer(U32 resX, U32 resY);
+
+	//attempt to allocate screen buffers at resX, resY
+	//returns true if allocation successful, false otherwise
 	bool allocateScreenBuffer(U32 resX, U32 resY, U32 samples);
+
 	void allocatePhysicsBuffer();
 	
 	void resetVertexBuffers(LLDrawable* drawable);
diff --git a/indra/newview/skins/default/xui/da/floater_lagmeter.xml b/indra/newview/skins/default/xui/da/floater_lagmeter.xml
deleted file mode 100644
index 149d174c34aab9d3b862f91af2cb669b44e131cb..0000000000000000000000000000000000000000
--- a/indra/newview/skins/default/xui/da/floater_lagmeter.xml
+++ /dev/null
@@ -1,151 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_lagmeter" title="LAG METER">
-	<floater.string name="max_title_msg">
-		Lag måler
-	</floater.string>
-	<floater.string name="max_width_px">
-		360
-	</floater.string>
-	<floater.string name="min_title_msg">
-		Lag
-	</floater.string>
-	<floater.string name="min_width_px">
-		90
-	</floater.string>
-	<floater.string name="client_text_msg">
-		Klient
-	</floater.string>
-	<floater.string name="client_frame_rate_critical_fps">
-		10
-	</floater.string>
-	<floater.string name="client_frame_rate_warning_fps">
-		15
-	</floater.string>
-	<floater.string name="client_frame_time_window_bg_msg">
-		Normal, vindue i baggrund
-	</floater.string>
-	<floater.string name="client_frame_time_critical_msg">
-		Klients billeder/sek under [CLIENT_FRAME_RATE_CRITICAL]
-	</floater.string>
-	<floater.string name="client_frame_time_warning_msg">
-		Klients billeder/sek mellem [CLIENT_FRAME_RATE_CRITICAL] og [CLIENT_FRAME_RATE_WARNING]
-	</floater.string>
-	<floater.string name="client_frame_time_normal_msg">
-		Normal
-	</floater.string>
-	<floater.string name="client_draw_distance_cause_msg">
-		Mulig årsag: &apos;Vis afstand&apos; sat for højt i grafik indstillinger
-	</floater.string>
-	<floater.string name="client_texture_loading_cause_msg">
-		Mulig årsag: Billeder hentes
-	</floater.string>
-	<floater.string name="client_texture_memory_cause_msg">
-		Mulig årsag: For mange billeder i hukommelse
-	</floater.string>
-	<floater.string name="client_complex_objects_cause_msg">
-		Mulig årsag: For mange komplekse objekter i scenariet
-	</floater.string>
-	<floater.string name="network_text_msg">
-		Netværk
-	</floater.string>
-	<floater.string name="network_packet_loss_critical_pct">
-		10
-	</floater.string>
-	<floater.string name="network_packet_loss_warning_pct">
-		5
-	</floater.string>
-	<floater.string name="network_packet_loss_critical_msg">
-		Forbindelsen mister over [NETWORK_PACKET_LOSS_CRITICAL]% pakker
-	</floater.string>
-	<floater.string name="network_packet_loss_warning_msg">
-		Forbindelsen mister [NETWORK_PACKET_LOSS_WARNING]%-[NETWORK_PACKET_LOSS_CRITICAL]% pakker
-	</floater.string>
-	<floater.string name="network_performance_normal_msg">
-		Normal
-	</floater.string>
-	<floater.string name="network_ping_critical_ms">
-		600
-	</floater.string>
-	<floater.string name="network_ping_warning_ms">
-		300
-	</floater.string>
-	<floater.string name="network_ping_critical_msg">
-		Forbindelsens ping tider er over [NETWORK_PING_CRITICAL] ms
-	</floater.string>
-	<floater.string name="network_ping_warning_msg">
-		Forbindelsens ping tider er [NETWORK_PING_WARNING]-[NETWORK_PING_CRITICAL] ms
-	</floater.string>
-	<floater.string name="network_packet_loss_cause_msg">
-		Muligvis dårlig forbindelse eller &apos;båndbredde&apos; sat for højt i netværksopsætning.
-	</floater.string>
-	<floater.string name="network_ping_cause_msg">
-		Muligvis dårlig forbindelse eller fil delings program.
-	</floater.string>
-	<floater.string name="server_text_msg">
-		Server
-	</floater.string>
-	<floater.string name="server_frame_rate_critical_fps">
-		20
-	</floater.string>
-	<floater.string name="server_frame_rate_warning_fps">
-		30
-	</floater.string>
-	<floater.string name="server_single_process_max_time_ms">
-		20
-	</floater.string>
-	<floater.string name="server_frame_time_critical_msg">
-		Simulator framerate er under [SERVER_FRAME_RATE_CRITICAL]
-	</floater.string>
-	<floater.string name="server_frame_time_warning_msg">
-		Simulator framerate er mellem [SERVER_FRAME_RATE_CRITICAL] og [SERVER_FRAME_RATE_WARNING]
-	</floater.string>
-	<floater.string name="server_frame_time_normal_msg">
-		Normal
-	</floater.string>
-	<floater.string name="server_physics_cause_msg">
-		Mulig årsag: For mange fysiske objekter
-	</floater.string>
-	<floater.string name="server_scripts_cause_msg">
-		Mulig årsag: For mange objekter med script
-	</floater.string>
-	<floater.string name="server_net_cause_msg">
-		Mulig årsag: For meget netværks trafik
-	</floater.string>
-	<floater.string name="server_agent_cause_msg">
-		Mulig årsag: For mange avatarer i bevægelse i regionen
-	</floater.string>
-	<floater.string name="server_images_cause_msg">
-		Mulig årsag: For mange billed udregninger
-	</floater.string>
-	<floater.string name="server_generic_cause_msg">
-		Mulig årsag: Simulator belastning for stor
-	</floater.string>
-	<floater.string name="smaller_label">
-		&gt;&gt;
-	</floater.string>
-	<floater.string name="bigger_label">
-		&lt;&lt;
-	</floater.string>
-	<button label="" label_selected="" name="client_lagmeter" tool_tip="Status for klient lag"/>
-	<text name="client">
-		Klient
-	</text>
-	<text name="client_text">
-		Normal
-	</text>
-	<button label="" label_selected="" name="network_lagmeter" tool_tip="Network lag status"/>
-	<text name="network">
-		Netværk
-	</text>
-	<text name="network_text">
-		Normal
-	</text>
-	<button label="" label_selected="" name="server_lagmeter" tool_tip="Status for server lag"/>
-	<text name="server">
-		Server
-	</text>
-	<text name="server_text">
-		Normal
-	</text>
-	<button label="&gt;&gt;" name="minimize" tool_tip="Ændre størrelse"/>
-</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_lagmeter.xml b/indra/newview/skins/default/xui/de/floater_lagmeter.xml
deleted file mode 100644
index 45ff37c14753d6f2fc886de9e23c5b8f58fe9cf5..0000000000000000000000000000000000000000
--- a/indra/newview/skins/default/xui/de/floater_lagmeter.xml
+++ /dev/null
@@ -1,151 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_lagmeter" title="LAG METER">
-	<floater.string name="max_title_msg">
-		Lag-Anzeige
-	</floater.string>
-	<floater.string name="max_width_px">
-		350
-	</floater.string>
-	<floater.string name="min_title_msg">
-		Lag
-	</floater.string>
-	<floater.string name="min_width_px">
-		90
-	</floater.string>
-	<floater.string name="client_text_msg">
-		Client
-	</floater.string>
-	<floater.string name="client_frame_rate_critical_fps">
-		10
-	</floater.string>
-	<floater.string name="client_frame_rate_warning_fps">
-		15
-	</floater.string>
-	<floater.string name="client_frame_time_window_bg_msg">
-		Normal, Fenster im Hintergrund
-	</floater.string>
-	<floater.string name="client_frame_time_critical_msg">
-		Client-Frame-Rate unter [CLIENT_FRAME_RATE_CRITICAL]
-	</floater.string>
-	<floater.string name="client_frame_time_warning_msg">
-		Client-Frame-Rate zwischen [CLIENT_FRAME_RATE_CRITICAL] und [CLIENT_FRAME_RATE_WARNING]
-	</floater.string>
-	<floater.string name="client_frame_time_normal_msg">
-		Normal
-	</floater.string>
-	<floater.string name="client_draw_distance_cause_msg">
-		Mögliche Ursache: Sichtweite zu groß
-	</floater.string>
-	<floater.string name="client_texture_loading_cause_msg">
-		Mögliche Ursache: Bilder werden geladen
-	</floater.string>
-	<floater.string name="client_texture_memory_cause_msg">
-		Mögliche Ursache: Zu viele Bilder im Speicher
-	</floater.string>
-	<floater.string name="client_complex_objects_cause_msg">
-		Mögliche Ursache: Zu viele komplexe Objekte in der Szene
-	</floater.string>
-	<floater.string name="network_text_msg">
-		Netzwerk
-	</floater.string>
-	<floater.string name="network_packet_loss_critical_pct">
-		10
-	</floater.string>
-	<floater.string name="network_packet_loss_warning_pct">
-		5
-	</floater.string>
-	<floater.string name="network_packet_loss_critical_msg">
-		Paketverlust der Verbindung übersteigt [NETWORK_PACKET_LOSS_CRITICAL]%
-	</floater.string>
-	<floater.string name="network_packet_loss_warning_msg">
-		Paketverlust der Verbindung liegt bei [NETWORK_PACKET_LOSS_WARNING]%-[NETWORK_PACKET_LOSS_CRITICAL]%
-	</floater.string>
-	<floater.string name="network_performance_normal_msg">
-		Normal
-	</floater.string>
-	<floater.string name="network_ping_critical_ms">
-		600
-	</floater.string>
-	<floater.string name="network_ping_warning_ms">
-		300
-	</floater.string>
-	<floater.string name="network_ping_critical_msg">
-		Ping-Zeit der Verbindung übersteigt [NETWORK_PING_CRITICAL] ms
-	</floater.string>
-	<floater.string name="network_ping_warning_msg">
-		Ping-Zeit der Verbindung liegt bei [NETWORK_PING_WARNING]-[NETWORK_PING_CRITICAL] ms
-	</floater.string>
-	<floater.string name="network_packet_loss_cause_msg">
-		Möglicherweise schlechte Verbindung oder zu hoher Wert für „Bandbreite“.
-	</floater.string>
-	<floater.string name="network_ping_cause_msg">
-		Möglicherweise schlechte Verbindung oder File-Sharing-Anwendung.
-	</floater.string>
-	<floater.string name="server_text_msg">
-		Server
-	</floater.string>
-	<floater.string name="server_frame_rate_critical_fps">
-		20
-	</floater.string>
-	<floater.string name="server_frame_rate_warning_fps">
-		30
-	</floater.string>
-	<floater.string name="server_single_process_max_time_ms">
-		20
-	</floater.string>
-	<floater.string name="server_frame_time_critical_msg">
-		Simulator-Frame-Rate liegt unter [SERVER_FRAME_RATE_CRITICAL]
-	</floater.string>
-	<floater.string name="server_frame_time_warning_msg">
-		Simulator-Frame-Rate liegt zwischen [SERVER_FRAME_RATE_CRITICAL] und [SERVER_FRAME_RATE_WARNING]
-	</floater.string>
-	<floater.string name="server_frame_time_normal_msg">
-		Normal
-	</floater.string>
-	<floater.string name="server_physics_cause_msg">
-		Mögliche Ursache: Zu viele physische Objekte
-	</floater.string>
-	<floater.string name="server_scripts_cause_msg">
-		Mögliche Ursache: Zu viele geskriptete Objekte
-	</floater.string>
-	<floater.string name="server_net_cause_msg">
-		Mögliche Ursache: Zu viel Netzwerktraffic
-	</floater.string>
-	<floater.string name="server_agent_cause_msg">
-		Mögliche Ursache: Zu viele Personen in Bewegung in der Region
-	</floater.string>
-	<floater.string name="server_images_cause_msg">
-		Mögliche Ursache: Zu viele Bildberechnungen
-	</floater.string>
-	<floater.string name="server_generic_cause_msg">
-		Mögliche Ursache: Zu hohe Simulator-Last
-	</floater.string>
-	<floater.string name="smaller_label">
-		&gt;&gt;
-	</floater.string>
-	<floater.string name="bigger_label">
-		&lt;&lt;
-	</floater.string>
-	<button name="client_lagmeter" tool_tip="Client-Lag-Status"/>
-	<text name="client">
-		Client
-	</text>
-	<text name="client_text">
-		Normal
-	</text>
-	<button name="network_lagmeter" tool_tip="Netzwerk-Lag-Status"/>
-	<text name="network">
-		Netzwerk
-	</text>
-	<text name="network_text">
-		Normal
-	</text>
-	<button name="server_lagmeter" tool_tip="Server-Lag-Status"/>
-	<text name="server">
-		Server
-	</text>
-	<text name="server_text">
-		Normal
-	</text>
-	<button label="&gt;&gt; " name="minimize" tool_tip="Fenstergröße ändern"/>
-</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_lagmeter.xml b/indra/newview/skins/default/xui/en/floater_lagmeter.xml
deleted file mode 100644
index b24c745bdd0bc67fc0cbf085af4fbd09335b8238..0000000000000000000000000000000000000000
--- a/indra/newview/skins/default/xui/en/floater_lagmeter.xml
+++ /dev/null
@@ -1,336 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater
- legacy_header_height="18"
- height="170"
- layout="topleft"
- name="floater_lagmeter"
- help_topic="floater_lagmeter"
- save_rect="true"
- title="LAG METER"
- width="350">
-    <floater.string
-     name="max_title_msg">
-        Lag Meter
-    </floater.string>
-    <floater.string
-     name="max_width_px">
-        360
-    </floater.string>
-    <floater.string
-     name="min_title_msg">
-        Lag
-    </floater.string>
-    <floater.string
-     name="min_width_px">
-        90
-    </floater.string>
-    <floater.string
-     name="client_text_msg">
-        Client
-    </floater.string>
-    <floater.string
-     name="client_frame_rate_critical_fps">
-        10
-    </floater.string>
-    <floater.string
-     name="client_frame_rate_warning_fps">
-        15
-    </floater.string>
-    <floater.string
-     name="client_frame_time_window_bg_msg">
-        Normal, window in background
-    </floater.string>
-    <floater.string
-     name="client_frame_time_critical_msg">
-        Client frame rate below [CLIENT_FRAME_RATE_CRITICAL]
-    </floater.string>
-    <floater.string
-     name="client_frame_time_warning_msg">
-        Client frame rate between [CLIENT_FRAME_RATE_CRITICAL] and [CLIENT_FRAME_RATE_WARNING]
-    </floater.string>
-    <floater.string
-     name="client_frame_time_normal_msg">
-        Normal
-    </floater.string>
-    <floater.string
-     name="client_draw_distance_cause_msg">
-        Possible cause: Draw distance set too high
-    </floater.string>
-    <floater.string
-     name="client_texture_loading_cause_msg">
-        Possible cause: Images loading
-    </floater.string>
-    <floater.string
-     name="client_texture_memory_cause_msg">
-        Possible cause: Too many images in memory
-    </floater.string>
-    <floater.string
-     name="client_complex_objects_cause_msg">
-        Possible cause: Too many complex objects in scene
-    </floater.string>
-    <floater.string
-     name="network_text_msg">
-        Network
-    </floater.string>
-    <floater.string
-     name="network_packet_loss_critical_pct">
-        10
-    </floater.string>
-    <floater.string
-     name="network_packet_loss_warning_pct">
-        5
-    </floater.string>
-    <floater.string
-     name="network_packet_loss_critical_msg">
-        Connection is dropping over [NETWORK_PACKET_LOSS_CRITICAL]% of packets
-    </floater.string>
-    <floater.string
-     name="network_packet_loss_warning_msg">
-        Connection is dropping [NETWORK_PACKET_LOSS_WARNING]%-[NETWORK_PACKET_LOSS_CRITICAL]% of packets
-    </floater.string>
-    <floater.string
-     name="network_performance_normal_msg">
-        Normal
-    </floater.string>
-    <floater.string
-     name="network_ping_critical_ms">
-        600
-    </floater.string>
-    <floater.string
-     name="network_ping_warning_ms">
-        300
-    </floater.string>
-    <floater.string
-     name="network_ping_critical_msg">
-        Connection ping time is over [NETWORK_PING_CRITICAL] ms
-    </floater.string>
-    <floater.string
-     name="network_ping_warning_msg">
-        Connection ping time is [NETWORK_PING_WARNING]-[NETWORK_PING_CRITICAL] ms
-    </floater.string>
-    <floater.string
-     name="network_packet_loss_cause_msg">
-        Possible bad connection or &apos;Bandwidth&apos; pref too high.
-    </floater.string>
-    <floater.string
-     name="network_ping_cause_msg">
-        Possible bad connection or file-sharing app.
-    </floater.string>
-    <floater.string
-     name="server_text_msg">
-        Server
-    </floater.string>
-    <floater.string
-     name="server_frame_rate_critical_fps">
-        20
-    </floater.string>
-    <floater.string
-     name="server_frame_rate_warning_fps">
-        30
-    </floater.string>
-    <floater.string
-     name="server_single_process_max_time_ms">
-        20
-    </floater.string>
-    <floater.string
-     name="server_frame_time_critical_msg">
-        Simulator framerate below [SERVER_FRAME_RATE_CRITICAL]
-    </floater.string>
-    <floater.string
-     name="server_frame_time_warning_msg">
-        Simulator framerate between [SERVER_FRAME_RATE_CRITICAL] and [SERVER_FRAME_RATE_WARNING]
-    </floater.string>
-    <floater.string
-     name="server_frame_time_normal_msg">
-        Normal
-    </floater.string>
-    <floater.string
-     name="server_physics_cause_msg">
-        Possible Cause: Too many physical objects
-    </floater.string>
-    <floater.string
-     name="server_scripts_cause_msg">
-        Possible Cause: Too many scripted objects
-    </floater.string>
-    <floater.string
-     name="server_net_cause_msg">
-        Possible Cause: Too much network traffic
-    </floater.string>
-    <floater.string
-     name="server_agent_cause_msg">
-        Possible Cause: Too many moving people in region
-    </floater.string>
-    <floater.string
-     name="server_images_cause_msg">
-        Possible Cause: Too many image calculations
-    </floater.string>
-    <floater.string
-     name="server_generic_cause_msg">
-        Possible Cause: Simulator load too heavy
-    </floater.string>
-    <floater.string
-     name="smaller_label">
-        &gt;&gt;
-    </floater.string>
-    <floater.string
-     name="bigger_label">
-        &lt;&lt;
-    </floater.string>
-    <button
-     follows="top|left"
-     height="16"
-     image_selected="lag_status_good.tga"
-     image_unselected="lag_status_good.tga"
-     layout="topleft"
-     left="8"
-     name="client_lagmeter"
-     tab_stop="false"
-     tool_tip="Client lag status"
-     top="24"
-     width="16" />
-    <text
-     type="string"
-     length="1"
-     follows="left|top"
-     font="SansSerif"
-     height="16"
-     layout="topleft"
-     left_pad="3"
-     name="client"
-     top_delta="0"
-     width="128">
-        Client
-    </text>
-    <text
-     invisiblity_control="LagMeterShrunk"
-     type="string"
-     length="1"
-     bottom="40"
-     follows="left|top"
-     font="SansSerif"
-     height="16"
-     layout="topleft"
-     left="110"
-     name="client_text"
-     right="-10">
-        Normal
-    </text>
-    <text
-     invisiblity_control="LagMeterShrunk"
-     bottom="56"
-     follows="left|top"
-     height="16"
-     layout="topleft"
-     left="40"
-     name="client_lag_cause"
-     right="-32" />
-    <button
-     follows="top|left"
-     height="16"
-     image_selected="lag_status_good.tga"
-     image_unselected="lag_status_good.tga"
-     layout="topleft"
-     left="8"
-     name="network_lagmeter"
-     tab_stop="false"
-     tool_tip="Network lag status"
-     top="64"
-     width="16" />
-    <text
-     type="string"
-     length="1"
-     follows="left|top"
-     font="SansSerif"
-     height="16"
-     layout="topleft"
-     left_pad="3"
-     name="network"
-     top_delta="0"
-     width="128">
-        Network
-    </text>
-    <text
-     invisiblity_control="LagMeterShrunk"
-     type="string"
-     length="1"
-     bottom="80"
-     follows="left|top"
-     font="SansSerif"
-     height="16"
-     layout="topleft"
-     left="110"
-     name="network_text"
-     right="-10">
-        Normal
-    </text>
-    <text
-     invisiblity_control="LagMeterShrunk"
-     bottom="96"
-     follows="left|top"
-     height="16"
-     layout="topleft"
-     left="40"
-     name="network_lag_cause"
-     right="-32" />
-    <button
-     follows="top|left"
-     height="16"
-     image_selected="lag_status_good.tga"
-     image_unselected="lag_status_good.tga"
-     layout="topleft"
-     left="8"
-     name="server_lagmeter"
-     tab_stop="false"
-     tool_tip="Server lag status"
-     top="104"
-     width="16" />
-    <text
-     type="string"
-     length="1"
-     follows="left|top"
-     font="SansSerif"
-     height="16"
-     layout="topleft"
-     left_pad="3"
-     name="server"
-     top_delta="0"
-     width="60">
-        Server
-    </text>
-    <text
-     invisiblity_control="LagMeterShrunk"
-     type="string"
-     length="1"
-     bottom="120"
-     follows="left|top"
-     font="SansSerif"
-     height="16"
-     layout="topleft"
-     left="110"
-     name="server_text"
-     right="-10">
-        Normal
-    </text>
-    <text
-     invisiblity_control="LagMeterShrunk"
-     bottom="136"
-     follows="left|top"
-     height="16"
-     layout="topleft"
-     left="40"
-     name="server_lag_cause"
-     right="-32" />
-    <button
-     follows="left|top"
-     height="20"
-     label="&gt;&gt;"
-     layout="topleft"
-     left="10"
-     name="minimize"
-	 tool_tip="Toggle floater size"
-     top_delta="24"
-     width="40">
-        <button.commit_callback
-         function="LagMeter.ClickShrink" />
-    </button>
-</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_texture_ctrl.xml b/indra/newview/skins/default/xui/en/floater_texture_ctrl.xml
index 2e29c61cb28456fc75cc401082ba6de07dad57b2..6021ba0a5ab8b8ebea4da81876c637009ba4fbd0 100644
--- a/indra/newview/skins/default/xui/en/floater_texture_ctrl.xml
+++ b/indra/newview/skins/default/xui/en/floater_texture_ctrl.xml
@@ -134,16 +134,6 @@
      top_delta="-25"
      name="Pipette"
      width="28" />
-   <check_box
-     follows="left|bottom"
-     height="20"
-     initial_value="true"
-     label="Live Preview"
-     layout="topleft"
-     left="4"
-     name="apply_immediate_check"
-     top="262"
-     width="120" />
    <text
      follows="left|bottom"
      height="20"
diff --git a/indra/newview/skins/default/xui/en/floater_tools.xml b/indra/newview/skins/default/xui/en/floater_tools.xml
index 5204efbf6564229f20917b912bc42a41ce989c03..436e9f8fed65dfbfa6af5aa751c4c227d8e9400f 100644
--- a/indra/newview/skins/default/xui/en/floater_tools.xml
+++ b/indra/newview/skins/default/xui/en/floater_tools.xml
@@ -2994,7 +2994,7 @@ even though the user gets a free copy.
                          use_ellipses="true"
 			 read_only="true"
 			 name="media_info"
-			 width="280" />
+			 width="180" />
       <web_browser
         visible="false"
         enabled="false"
diff --git a/indra/newview/skins/default/xui/en/floater_ui_preview.xml b/indra/newview/skins/default/xui/en/floater_ui_preview.xml
index 06d43272935f1f8f245094e9482bb35a7f41f651..eb0129483152a1db937bffe1e57f015067cc3928 100644
--- a/indra/newview/skins/default/xui/en/floater_ui_preview.xml
+++ b/indra/newview/skins/default/xui/en/floater_ui_preview.xml
@@ -5,7 +5,7 @@
  height="640"
  layout="topleft"
  min_height="230"
- min_width="650"
+ min_width="750"
  name="gui_preview_tool"
  help_topic="gui_preview_tool"
  single_instance="true"
diff --git a/indra/newview/skins/default/xui/en/menu_outfit_gear.xml b/indra/newview/skins/default/xui/en/menu_outfit_gear.xml
index fc7272b9047f8e5073d2bbfaae90abb9408fb6f2..3b8ace6308697a8daea29684c4b7c5f7709c8825 100644
--- a/indra/newview/skins/default/xui/en/menu_outfit_gear.xml
+++ b/indra/newview/skins/default/xui/en/menu_outfit_gear.xml
@@ -194,6 +194,20 @@
             <!-- copied from menu_inventory_add.xml -->
 
     <menu_item_separator name="sepatator2" />
+    <menu_item_call
+     label="Expand all folders"
+     layout="topleft"
+     name="expand">
+        <on_click
+         function="Gear.Expand" />
+    </menu_item_call>
+    <menu_item_call
+     label="Collapse all folders"
+     layout="topleft"
+     name="collapse">
+        <on_click
+         function="Gear.Collapse" />
+    </menu_item_call>
     <menu_item_call
      label="Rename Outfit"
      layout="topleft"
diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml
index 1aa55acf2d8a573bf75b23d3113b09c88fa468d2..c6d9f9ef8f3812b476c1a90a6981aa3d2bd859e2 100644
--- a/indra/newview/skins/default/xui/en/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/en/menu_viewer.xml
@@ -276,30 +276,39 @@
              parameter="gestures" />
         </menu_item_check>
         <menu_item_separator/>
-        <menu_item_call
+        <menu_item_check
          label="Friends"
          name="My Friends"
          shortcut="control|shift|F">
-            <menu_item_call.on_click
+            <menu_item_check.on_check
+             function="SideTray.CheckPanelPeopleTab"
+             parameter="friends_panel" />
+            <menu_item_check.on_click
              function="SideTray.PanelPeopleTab"
              parameter="friends_panel" />
-            </menu_item_call>
-        <menu_item_call
+            </menu_item_check>
+        <menu_item_check
          label="Groups"
          name="My Groups"
          shortcut="control|shift|G">
-            <menu_item_call.on_click
+         	<menu_item_check.on_check
+             function="SideTray.CheckPanelPeopleTab"
+             parameter="groups_panel" />
+            <menu_item_check.on_click
              function="SideTray.PanelPeopleTab"
              parameter="groups_panel" />
-        </menu_item_call>
-        <menu_item_call
+        </menu_item_check>
+        <menu_item_check
          label="Nearby people"
          name="Active Speakers"
          shortcut="control|shift|A">
-            <menu_item_call.on_click
+        	 <menu_item_check.on_check
+             function="SideTray.CheckPanelPeopleTab"
+             parameter="nearby_panel" />
+            <menu_item_check.on_click
               function="SideTray.PanelPeopleTab"
               parameter="nearby_panel" />
-        </menu_item_call>
+        </menu_item_check>
         <menu_item_call
          label="Block List"
          name="Block List">
diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml
index f0a126724b7a477138e6ab09c9aea8d0f884b263..a273d9113c81abf682885dab92dd0166e781bdfa 100644
--- a/indra/newview/skins/default/xui/en/notifications.xml
+++ b/indra/newview/skins/default/xui/en/notifications.xml
@@ -7567,18 +7567,6 @@ You locally updated a [RESOLUTION] baked texture for '[BODYREGION]' after [TIME]
    name="LivePreviewUnavailable"
    type="alert">
    
-We cannot display a preview of this texture because it is no-copy and/or no-transfer.
-  <usetemplate
-    ignoretext="Warn me that Live Preview mode is not available for no-copy and/or no-transfer textures"
-    name="okignore"
-    yestext="OK"/>
-  </notification>
-
-  <notification
-   icon="alertmodal.tga"
-   name="LivePreviewUnavailable"
-   type="alert">
-   
 We cannot display a preview of this texture because it is no-copy and/or no-transfer.
   <usetemplate
     ignoretext="Warn me that Live Preview mode is not available for no-copy and/or no-transfer textures"
@@ -8090,7 +8078,7 @@ Do you wish to continue?
    icon="alertmodal.tga"
    name="PathfindingLinksets_MismatchOnRestricted"
    type="alertmodal">
-Some selected linksets cannot be set to be '[REQUESTED_TYPE]' because of permission restrictions on the linkset.  These linksets will be set to be '[RESTRICTED_TYPE]' instead.
+    Some selected linksets cannot be set to be '[REQUESTED_TYPE]' because of permission restrictions on the linkset.  These linksets will be set to be '[RESTRICTED_TYPE]' instead.
 
 Do you wish to continue?
     <tag>confirm</tag>
@@ -8105,7 +8093,7 @@ Do you wish to continue?
    icon="alertmodal.tga"
    name="PathfindingLinksets_MismatchOnVolume"
    type="alertmodal">
-Some selected linksets cannot be set to be '[REQUESTED_TYPE]' because the shape is non-convex.
+    Some selected linksets cannot be set to be '[REQUESTED_TYPE]' because the shape is non-convex.
 
 Do you wish to continue?
     <tag>confirm</tag>
@@ -8122,7 +8110,7 @@ Do you wish to continue?
    type="alertmodal">
 Some selected linksets will have the Phantom flag toggled.
 
-Some selected linksets cannot be set to be '[REQUESTED_TYPE]' because of permission restrictions on the linkset.  These linksets will be set to be '[RESTRICTED_TYPE]' instead.
+    Some selected linksets cannot be set to be '[REQUESTED_TYPE]' because of permission restrictions on the linkset.  These linksets will be set to be '[RESTRICTED_TYPE]' instead.
 
 Do you wish to continue?
     <tag>confirm</tag>
@@ -8156,7 +8144,7 @@ Do you wish to continue?
    type="alertmodal">
 Some selected linksets cannot be set to be '[REQUESTED_TYPE]' because of permission restrictions on the linkset.  These linksets will be set to be '[RESTRICTED_TYPE]' instead.
 
-Some selected linksets cannot be set to be '[REQUESTED_TYPE]' because the shape is non-convex. These linksets&apos; use types will not change.
+ Some selected linksets cannot be set to be '[REQUESTED_TYPE]' because the shape is non-convex. These linksets&apos; use types will not change.
 
 Do you wish to continue?
     <tag>confirm</tag>
diff --git a/indra/newview/skins/default/xui/en/panel_group_roles.xml b/indra/newview/skins/default/xui/en/panel_group_roles.xml
index eea26061256279f29de0a5410ccfbb3ea5a0ff8b..df91ad8b5e537d6cd03cad1c95f0bdf115e13ab3 100644
--- a/indra/newview/skins/default/xui/en/panel_group_roles.xml
+++ b/indra/newview/skins/default/xui/en/panel_group_roles.xml
@@ -254,7 +254,7 @@ things in this group. There&apos;s a broad variety of Abilities.
          column_padding="0"
          draw_stripes="true"
          height="200"
-         follows="left|top"
+         follows="left|top|right"
          layout="topleft"
          left="0"
          right="-1"
diff --git a/indra/newview/skins/default/xui/en/panel_media_settings_general.xml b/indra/newview/skins/default/xui/en/panel_media_settings_general.xml
index cdf14572fe440b8676a269179972d6f767d4bf49..e844a15118c7f4570b26ce40ebe1fb22b95385ee 100644
--- a/indra/newview/skins/default/xui/en/panel_media_settings_general.xml
+++ b/indra/newview/skins/default/xui/en/panel_media_settings_general.xml
@@ -30,7 +30,7 @@
     (This page does not pass the specified whitelist)
   </text>
   <line_editor 
-   max_length="1024"
+   max_length_bytes="1024"
    bottom_delta="-24" 
    enabled="true" 
    follows="left|top" 
diff --git a/indra/newview/skins/default/xui/en/panel_script_ed.xml b/indra/newview/skins/default/xui/en/panel_script_ed.xml
index f6a8af097355f99a354ba45868823b708b595416..765b07ed8b36ab74a03c2dbcb3645764bcc4c958 100644
--- a/indra/newview/skins/default/xui/en/panel_script_ed.xml
+++ b/indra/newview/skins/default/xui/en/panel_script_ed.xml
@@ -158,6 +158,7 @@
      text_readonly_color="DkGray"
      width="487"
      show_line_numbers="true" 
+     enable_tooltip_paste="true"
      word_wrap="true">
         Loading...
     </text_editor>
diff --git a/indra/newview/skins/default/xui/en/sidepanel_task_info.xml b/indra/newview/skins/default/xui/en/sidepanel_task_info.xml
index e9a787cef092bca5530c4a947ef14eedb853e306..f1ae14809f531ce73d948065ec5e5230beda1301 100644
--- a/indra/newview/skins/default/xui/en/sidepanel_task_info.xml
+++ b/indra/newview/skins/default/xui/en/sidepanel_task_info.xml
@@ -292,6 +292,10 @@
           label="Open"
           name="Open"
           value="Open" />
+       <combo_box.item
+          label="Zoom"
+          name="Zoom"
+          value="Zoom" />
     </combo_box>
     <panel
         border="false"
diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml
index 15eb46c348fa7613c92f65c51091ebc87a0b7af5..2a2dc6dca11391cf4e749504d35f542aef9d6d6f 100644
--- a/indra/newview/skins/default/xui/en/strings.xml
+++ b/indra/newview/skins/default/xui/en/strings.xml
@@ -1447,7 +1447,7 @@ integer llScriptDanger(vector pos)
 Returns TRUE if pos is over public land, sandbox land, land that doesn&apos;t allow everyone to edit and build, or land that doesn&apos;t allow outside scripts
 	</string>
 	<string name="LSLTipText_llDialog" translate="false">
-llDialog(key avatar, string message, list buttons, integer chat_channel
+llDialog(key avatar, string message, list buttons, integer chat_channel)
 Shows a dialog box on the avatar&apos;s screen with a message and up to 12 buttons.
 If a button is pressed, the avatar says the text of the button label on chat_channel.
 	</string>
diff --git a/indra/newview/skins/default/xui/es/floater_lagmeter.xml b/indra/newview/skins/default/xui/es/floater_lagmeter.xml
deleted file mode 100644
index 227689a1947d9a71f5f4d1cb9da78ef726a041fc..0000000000000000000000000000000000000000
--- a/indra/newview/skins/default/xui/es/floater_lagmeter.xml
+++ /dev/null
@@ -1,154 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_lagmeter" title="MEDIDOR DEL LAG">
-	<floater.string name="max_title_msg">
-		Medidor del lag
-	</floater.string>
-	<floater.string name="max_width_px">
-		360
-	</floater.string>
-	<floater.string name="min_title_msg">
-		Lag
-	</floater.string>
-	<floater.string name="min_width_px">
-		90
-	</floater.string>
-	<floater.string name="client_text_msg">
-		Cliente
-	</floater.string>
-	<floater.string name="client_frame_rate_critical_fps">
-		10
-	</floater.string>
-	<floater.string name="client_frame_rate_warning_fps">
-		15
-	</floater.string>
-	<floater.string name="client_frame_time_window_bg_msg">
-		Normal, ventana en segundo plano
-	</floater.string>
-	<floater.string name="client_frame_time_critical_msg">
-		Frames del cliente valorados por debajo de [CLIENT_FRAME_RATE_CRITICAL]
-	</floater.string>
-	<floater.string name="client_frame_time_warning_msg">
-		Frames del cliente valorados entre [CLIENT_FRAME_RATE_CRITICAL] y [CLIENT_FRAME_RATE_WARNING]
-	</floater.string>
-	<floater.string name="client_frame_time_normal_msg">
-		Normal
-	</floater.string>
-	<floater.string name="client_draw_distance_cause_msg">
-		Posible causa: distancia de dibujo fijada muy alta
-	</floater.string>
-	<floater.string name="client_texture_loading_cause_msg">
-		Posible causa: imágenes cargándose
-	</floater.string>
-	<floater.string name="client_texture_memory_cause_msg">
-		Posible causa: demasiadas imágenes en la memoria
-	</floater.string>
-	<floater.string name="client_complex_objects_cause_msg">
-		Posible causa: demasiados objetos complejos en la escena
-	</floater.string>
-	<floater.string name="network_text_msg">
-		Red
-	</floater.string>
-	<floater.string name="network_packet_loss_critical_pct">
-		10
-	</floater.string>
-	<floater.string name="network_packet_loss_warning_pct">
-		5
-	</floater.string>
-	<floater.string name="network_packet_loss_critical_msg">
-		La conexión deja caer más del [NETWORK_PACKET_LOSS_CRITICAL]% de los paquetes
-	</floater.string>
-	<floater.string name="network_packet_loss_warning_msg">
-		La conexión deja caer [NETWORK_PACKET_LOSS_WARNING]%-[NETWORK_PACKET_LOSS_CRITICAL]% de los paquetes
-	</floater.string>
-	<floater.string name="network_performance_normal_msg">
-		Normal
-	</floater.string>
-	<floater.string name="network_ping_critical_ms">
-		600
-	</floater.string>
-	<floater.string name="network_ping_warning_ms">
-		300
-	</floater.string>
-	<floater.string name="network_ping_critical_msg">
-		El tiempo de conexión -ping- supera los [NETWORK_PING_CRITICAL] ms
-	</floater.string>
-	<floater.string name="network_ping_warning_msg">
-		El tiempo de conexión -ping- es de [NETWORK_PING_WARNING]-[NETWORK_PING_CRITICAL] ms
-	</floater.string>
-	<floater.string name="network_packet_loss_cause_msg">
-		Quizá una mala conexión o un ancho de banda fijado demasiado alto.
-	</floater.string>
-	<floater.string name="network_ping_cause_msg">
-		Quizá una mala conexión o una aplicación de archivos compartidos.
-	</floater.string>
-	<floater.string name="server_text_msg">
-		Servidor
-	</floater.string>
-	<floater.string name="server_frame_rate_critical_fps">
-		20
-	</floater.string>
-	<floater.string name="server_frame_rate_warning_fps">
-		30
-	</floater.string>
-	<floater.string name="server_single_process_max_time_ms">
-		20
-	</floater.string>
-	<floater.string name="server_frame_time_critical_msg">
-		Frecuencia (framerate) por debajo de [SERVER_FRAME_RATE_CRITICAL]
-	</floater.string>
-	<floater.string name="server_frame_time_warning_msg">
-		Frecuencia (framerate) entre [SERVER_FRAME_RATE_CRITICAL] y [SERVER_FRAME_RATE_WARNING]
-	</floater.string>
-	<floater.string name="server_frame_time_normal_msg">
-		Normal
-	</floater.string>
-	<floater.string name="server_physics_cause_msg">
-		Posible causa: demasiados objetos físicos
-	</floater.string>
-	<floater.string name="server_scripts_cause_msg">
-		Posible causa: demasiados objetos con script
-	</floater.string>
-	<floater.string name="server_net_cause_msg">
-		Posible causa: demasiado tráfico en la red
-	</floater.string>
-	<floater.string name="server_agent_cause_msg">
-		Posible causa: demasiada gente moviéndose en la región
-	</floater.string>
-	<floater.string name="server_images_cause_msg">
-		Posible causa: demasiados cálculos de imáganes
-	</floater.string>
-	<floater.string name="server_generic_cause_msg">
-		Posible causa: carga del simulador muy pesada
-	</floater.string>
-	<floater.string name="smaller_label">
-		&gt;&gt;
-	</floater.string>
-	<floater.string name="bigger_label">
-		&lt;&lt;
-	</floater.string>
-	<button label="" label_selected="" name="client_lagmeter" tool_tip="Estado del lag del cliente"/>
-	<text name="client">
-		Cliente
-	</text>
-	<text font="SansSerifSmall" name="client_text">
-		Normal
-	</text>
-	<text left="30" name="client_lag_cause" right="-10"/>
-	<button label="" label_selected="" name="network_lagmeter" tool_tip="Estado del lag de la red"/>
-	<text name="network">
-		Red
-	</text>
-	<text font="SansSerifSmall" name="network_text">
-		Normal
-	</text>
-	<text left="30" name="network_lag_cause" right="-10"/>
-	<button label="" label_selected="" name="server_lagmeter" tool_tip="Estado del lag del servidor"/>
-	<text name="server">
-		Servidor
-	</text>
-	<text font="SansSerifSmall" name="server_text">
-		Normal
-	</text>
-	<text left="30" name="server_lag_cause" right="-32"/>
-	<button label="&gt;&gt;" name="minimize" tool_tip="Cambia el tamaño de la ventana"/>
-</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_lagmeter.xml b/indra/newview/skins/default/xui/fr/floater_lagmeter.xml
deleted file mode 100644
index 39a861d8bd2b5b175d98426efacc4d2512c9f5f8..0000000000000000000000000000000000000000
--- a/indra/newview/skins/default/xui/fr/floater_lagmeter.xml
+++ /dev/null
@@ -1,151 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_lagmeter" title="MESURE DU LAG">
-	<floater.string name="max_title_msg">
-		Mesure du lag
-	</floater.string>
-	<floater.string name="max_width_px">
-		360
-	</floater.string>
-	<floater.string name="min_title_msg">
-		Lag
-	</floater.string>
-	<floater.string name="min_width_px">
-		90
-	</floater.string>
-	<floater.string name="client_text_msg">
-		Client
-	</floater.string>
-	<floater.string name="client_frame_rate_critical_fps">
-		10
-	</floater.string>
-	<floater.string name="client_frame_rate_warning_fps">
-		15
-	</floater.string>
-	<floater.string name="client_frame_time_window_bg_msg">
-		Normal, fenêtre en arrière-plan
-	</floater.string>
-	<floater.string name="client_frame_time_critical_msg">
-		Taux de défilement [CLIENT_FRAME_RATE_CRITICAL]
-	</floater.string>
-	<floater.string name="client_frame_time_warning_msg">
-		Taux de défilement entre [CLIENT_FRAME_RATE_CRITICAL] et [CLIENT_FRAME_RATE_WARNING]
-	</floater.string>
-	<floater.string name="client_frame_time_normal_msg">
-		Normal
-	</floater.string>
-	<floater.string name="client_draw_distance_cause_msg">
-		Cause possible : limite d&apos;affichage trop élevée
-	</floater.string>
-	<floater.string name="client_texture_loading_cause_msg">
-		Cause possible : images en cours de chargement
-	</floater.string>
-	<floater.string name="client_texture_memory_cause_msg">
-		Cause possible : trop d&apos;images en mémoire
-	</floater.string>
-	<floater.string name="client_complex_objects_cause_msg">
-		Cause possible : trop d&apos;objets complexes
-	</floater.string>
-	<floater.string name="network_text_msg">
-		Réseau
-	</floater.string>
-	<floater.string name="network_packet_loss_critical_pct">
-		10
-	</floater.string>
-	<floater.string name="network_packet_loss_warning_pct">
-		5
-	</floater.string>
-	<floater.string name="network_packet_loss_critical_msg">
-		La connexion perd plus de [NETWORK_PACKET_LOSS_CRITICAL] % de paquets
-	</floater.string>
-	<floater.string name="network_packet_loss_warning_msg">
-		La connexion perd entre [NETWORK_PACKET_LOSS_WARNING] % et [NETWORK_PACKET_LOSS_CRITICAL] % de paquets
-	</floater.string>
-	<floater.string name="network_performance_normal_msg">
-		Normal
-	</floater.string>
-	<floater.string name="network_ping_critical_ms">
-		600
-	</floater.string>
-	<floater.string name="network_ping_warning_ms">
-		300
-	</floater.string>
-	<floater.string name="network_ping_critical_msg">
-		Connexion ping > [NETWORK_PING_CRITICAL] ms
-	</floater.string>
-	<floater.string name="network_ping_warning_msg">
-		Connexion ping entre [NETWORK_PING_WARNING] et [NETWORK_PING_CRITICAL] ms
-	</floater.string>
-	<floater.string name="network_packet_loss_cause_msg">
-		Mauvaise connexion possible ou réglage de la bande passante trop élevé.
-	</floater.string>
-	<floater.string name="network_ping_cause_msg">
-		Mauvaise connexion possible ou app. de partage des fichiers
-	</floater.string>
-	<floater.string name="server_text_msg">
-		Serveur
-	</floater.string>
-	<floater.string name="server_frame_rate_critical_fps">
-		20
-	</floater.string>
-	<floater.string name="server_frame_rate_warning_fps">
-		30
-	</floater.string>
-	<floater.string name="server_single_process_max_time_ms">
-		20
-	</floater.string>
-	<floater.string name="server_frame_time_critical_msg">
-		Défilement du simulateur &lt; [SERVER_FRAME_RATE_CRITICAL]
-	</floater.string>
-	<floater.string name="server_frame_time_warning_msg">
-		Défilement simulateur entre [SERVER_FRAME_RATE_CRITICAL] et [SERVER_FRAME_RATE_WARNING]
-	</floater.string>
-	<floater.string name="server_frame_time_normal_msg">
-		Normal
-	</floater.string>
-	<floater.string name="server_physics_cause_msg">
-		Cause possible : trop d&apos;objets physiques
-	</floater.string>
-	<floater.string name="server_scripts_cause_msg">
-		Cause possible : trop d&apos;objets scriptés
-	</floater.string>
-	<floater.string name="server_net_cause_msg">
-		Cause possible : trop de trafic réseau
-	</floater.string>
-	<floater.string name="server_agent_cause_msg">
-		Cause possible : trop de personnes en mouvement
-	</floater.string>
-	<floater.string name="server_images_cause_msg">
-		Cause possible : trop de calculs d&apos;images
-	</floater.string>
-	<floater.string name="server_generic_cause_msg">
-		Cause possible : charge simulateur trop lourde
-	</floater.string>
-	<floater.string name="smaller_label">
-		&gt;&gt;
-	</floater.string>
-	<floater.string name="bigger_label">
-		&lt;&lt;
-	</floater.string>
-	<button name="client_lagmeter" tool_tip="Statut du lag client"/>
-	<text name="client">
-		Client
-	</text>
-	<text name="client_text">
-		Normal
-	</text>
-	<button name="network_lagmeter" tool_tip="Statut du lag réseau"/>
-	<text name="network">
-		Réseau
-	</text>
-	<text name="network_text">
-		Normal
-	</text>
-	<button name="server_lagmeter" tool_tip="Statut du lag serveur"/>
-	<text name="server">
-		Serveur
-	</text>
-	<text name="server_text">
-		Normal
-	</text>
-	<button label="&gt;&gt;" name="minimize" tool_tip="Activer/désactiver la taille du floater"/>
-</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_lagmeter.xml b/indra/newview/skins/default/xui/it/floater_lagmeter.xml
deleted file mode 100644
index f7b2b1ab4a402cb60d0fd64d3819129f52120a4b..0000000000000000000000000000000000000000
--- a/indra/newview/skins/default/xui/it/floater_lagmeter.xml
+++ /dev/null
@@ -1,154 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_lagmeter" title="MISURATORE LAG">
-	<floater.string name="max_title_msg">
-		Misuratore del lag
-	</floater.string>
-	<floater.string name="max_width_px">
-		360
-	</floater.string>
-	<floater.string name="min_title_msg">
-		Lag
-	</floater.string>
-	<floater.string name="min_width_px">
-		90
-	</floater.string>
-	<floater.string name="client_text_msg">
-		Programma in locale
-	</floater.string>
-	<floater.string name="client_frame_rate_critical_fps">
-		10
-	</floater.string>
-	<floater.string name="client_frame_rate_warning_fps">
-		15
-	</floater.string>
-	<floater.string name="client_frame_time_window_bg_msg">
-		Normale, finestra sullo sfondo
-	</floater.string>
-	<floater.string name="client_frame_time_critical_msg">
-		Velocità dei frame al di sotto di [CLIENT_FRAME_RATE_CRITICAL]
-	</floater.string>
-	<floater.string name="client_frame_time_warning_msg">
-		Velocità dei frame tra [CLIENT_FRAME_RATE_CRITICAL] e [CLIENT_FRAME_RATE_WARNING]
-	</floater.string>
-	<floater.string name="client_frame_time_normal_msg">
-		Normale
-	</floater.string>
-	<floater.string name="client_draw_distance_cause_msg">
-		Possibile causa: Campo visivo impostato troppo alto
-	</floater.string>
-	<floater.string name="client_texture_loading_cause_msg">
-		Possibile causa: Caricamento immagini
-	</floater.string>
-	<floater.string name="client_texture_memory_cause_msg">
-		Possibile causa: Troppe immagini in memoria
-	</floater.string>
-	<floater.string name="client_complex_objects_cause_msg">
-		Possibile causa: Troppi oggetti complessi intorno
-	</floater.string>
-	<floater.string name="network_text_msg">
-		Network
-	</floater.string>
-	<floater.string name="network_packet_loss_critical_pct">
-		10
-	</floater.string>
-	<floater.string name="network_packet_loss_warning_pct">
-		5
-	</floater.string>
-	<floater.string name="network_packet_loss_critical_msg">
-		La connessione sta calando al di sotto del [NETWORK_PACKET_LOSS_CRITICAL]% di pacchetti
-	</floater.string>
-	<floater.string name="network_packet_loss_warning_msg">
-		La connessione sta calando tra il [NETWORK_PACKET_LOSS_WARNING]% e il [NETWORK_PACKET_LOSS_CRITICAL]% di pacchetti
-	</floater.string>
-	<floater.string name="network_performance_normal_msg">
-		Normale
-	</floater.string>
-	<floater.string name="network_ping_critical_ms">
-		600
-	</floater.string>
-	<floater.string name="network_ping_warning_ms">
-		300
-	</floater.string>
-	<floater.string name="network_ping_critical_msg">
-		Il tempo di ping della connessione è al di sopra di [NETWORK_PING_CRITICAL] ms
-	</floater.string>
-	<floater.string name="network_ping_warning_msg">
-		Il tempo di ping della connessione è tra [NETWORK_PING_WARNING]-[NETWORK_PING_CRITICAL] ms
-	</floater.string>
-	<floater.string name="network_packet_loss_cause_msg">
-		Possibile cattiva connessione o la larghezza di banda impostata nelle preferenze troppo alta.
-	</floater.string>
-	<floater.string name="network_ping_cause_msg">
-		Possibile cattiva connessione o l&apos;apertura di un programma di scambio files.
-	</floater.string>
-	<floater.string name="server_text_msg">
-		Server
-	</floater.string>
-	<floater.string name="server_frame_rate_critical_fps">
-		20
-	</floater.string>
-	<floater.string name="server_frame_rate_warning_fps">
-		30
-	</floater.string>
-	<floater.string name="server_single_process_max_time_ms">
-		20
-	</floater.string>
-	<floater.string name="server_frame_time_critical_msg">
-		Velocità dei frame al di sotto di [SERVER_FRAME_RATE_CRITICAL]
-	</floater.string>
-	<floater.string name="server_frame_time_warning_msg">
-		Velocità dei frame tra [SERVER_FRAME_RATE_CRITICAL] e [SERVER_FRAME_RATE_WARNING]
-	</floater.string>
-	<floater.string name="server_frame_time_normal_msg">
-		Normale
-	</floater.string>
-	<floater.string name="server_physics_cause_msg">
-		Possibile causa: troppi oggetti fisici
-	</floater.string>
-	<floater.string name="server_scripts_cause_msg">
-		Possibile causa: troppi oggetti scriptati
-	</floater.string>
-	<floater.string name="server_net_cause_msg">
-		Possibile causa: eccessivo traffico sulla rete
-	</floater.string>
-	<floater.string name="server_agent_cause_msg">
-		Possibile causa: troppi residenti in movimento nella regione
-	</floater.string>
-	<floater.string name="server_images_cause_msg">
-		Possibile causa: troppe elaborazioni di immagini
-	</floater.string>
-	<floater.string name="server_generic_cause_msg">
-		Possibile causa: carico eccessivo del simulatore
-	</floater.string>
-	<floater.string name="smaller_label">
-		&gt;&gt;
-	</floater.string>
-	<floater.string name="bigger_label">
-		&lt;&lt;
-	</floater.string>
-	<button label="" label_selected="" name="client_lagmeter" tool_tip="Stato del lag del programma in locale"/>
-	<text name="client">
-		Client
-	</text>
-	<text font="SansSerifSmall" left="145" name="client_text">
-		Normale
-	</text>
-	<text left="30" name="client_lag_cause" right="-10"/>
-	<button label="" label_selected="" name="network_lagmeter" tool_tip="Stato del lag del network"/>
-	<text name="network">
-		Rete
-	</text>
-	<text font="SansSerifSmall" name="network_text">
-		Normale
-	</text>
-	<text left="30" name="network_lag_cause" right="-10"/>
-	<button label="" label_selected="" name="server_lagmeter" tool_tip="Stato del lag del server"/>
-	<text name="server">
-		Server
-	</text>
-	<text font="SansSerifSmall" name="server_text">
-		Normale
-	</text>
-	<text left="30" name="server_lag_cause" right="-32"/>
-	<button label="&gt;&gt;" name="minimize" tool_tip="Cambia dimensioni floater"/>
-</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_lagmeter.xml b/indra/newview/skins/default/xui/ja/floater_lagmeter.xml
deleted file mode 100644
index e3546cd83754744f7265847ac9780806d4158a5e..0000000000000000000000000000000000000000
--- a/indra/newview/skins/default/xui/ja/floater_lagmeter.xml
+++ /dev/null
@@ -1,151 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_lagmeter" title="ラグメーター">
-	<floater.string name="max_title_msg">
-		ラグ メーター
-	</floater.string>
-	<floater.string name="max_width_px">
-		350
-	</floater.string>
-	<floater.string name="min_title_msg">
-		ラグ
-	</floater.string>
-	<floater.string name="min_width_px">
-		90
-	</floater.string>
-	<floater.string name="client_text_msg">
-		クライアント
-	</floater.string>
-	<floater.string name="client_frame_rate_critical_fps">
-		10
-	</floater.string>
-	<floater.string name="client_frame_rate_warning_fps">
-		15
-	</floater.string>
-	<floater.string name="client_frame_time_window_bg_msg">
-		ノーマル、ウィンドウは背景に
-	</floater.string>
-	<floater.string name="client_frame_time_critical_msg">
-		クライアント フレームレート < [CLIENT_FRAME_RATE_CRITICAL]
-	</floater.string>
-	<floater.string name="client_frame_time_warning_msg">
-		クライアント フレームレート: [CLIENT_FRAME_RATE_CRITICAL] ~ [CLIENT_FRAME_RATE_WARNING]
-	</floater.string>
-	<floater.string name="client_frame_time_normal_msg">
-		ノーマル
-	</floater.string>
-	<floater.string name="client_draw_distance_cause_msg">
-		考えられる原因: 描画距離の設定が大きすぎる
-	</floater.string>
-	<floater.string name="client_texture_loading_cause_msg">
-		考えられる原因: 画像のロード中
-	</floater.string>
-	<floater.string name="client_texture_memory_cause_msg">
-		考えられる原因: メモリ内の画像数が多すぎる
-	</floater.string>
-	<floater.string name="client_complex_objects_cause_msg">
-		考えられる原因: 画面に含まれる複雑なオブジェクトが多すぎる
-	</floater.string>
-	<floater.string name="network_text_msg">
-		ネットワーク
-	</floater.string>
-	<floater.string name="network_packet_loss_critical_pct">
-		10
-	</floater.string>
-	<floater.string name="network_packet_loss_warning_pct">
-		5
-	</floater.string>
-	<floater.string name="network_packet_loss_critical_msg">
-		接続でドロップされるパケットの割合: > [NETWORK_PACKET_LOSS_CRITICAL]
-	</floater.string>
-	<floater.string name="network_packet_loss_warning_msg">
-		接続でドロップされるパケットの割合:[NETWORK_PACKET_LOSS_WARNING] ~ [NETWORK_PACKET_LOSS_CRITICAL]
-	</floater.string>
-	<floater.string name="network_performance_normal_msg">
-		ノーマル
-	</floater.string>
-	<floater.string name="network_ping_critical_ms">
-		600
-	</floater.string>
-	<floater.string name="network_ping_warning_ms">
-		300
-	</floater.string>
-	<floater.string name="network_ping_critical_msg">
-		接続の ping 時間: > [NETWORK_PING_CRITICAL] ミリ秒
-	</floater.string>
-	<floater.string name="network_ping_warning_msg">
-		接続の ping 時間: [NETWORK_PING_WARNING] ~ [NETWORK_PING_CRITICAL] ミリ秒
-	</floater.string>
-	<floater.string name="network_packet_loss_cause_msg">
-		接続不良になっているか、帯域幅設定が高すぎます。
-	</floater.string>
-	<floater.string name="network_ping_cause_msg">
-		接続不良になっているか、ファイル共有アプリケーションに問題があります。
-	</floater.string>
-	<floater.string name="server_text_msg">
-		サーバー
-	</floater.string>
-	<floater.string name="server_frame_rate_critical_fps">
-		20
-	</floater.string>
-	<floater.string name="server_frame_rate_warning_fps">
-		30
-	</floater.string>
-	<floater.string name="server_single_process_max_time_ms">
-		20
-	</floater.string>
-	<floater.string name="server_frame_time_critical_msg">
-		シミュレーターのフレームレート: < [SERVER_FRAME_RATE_CRITICAL]
-	</floater.string>
-	<floater.string name="server_frame_time_warning_msg">
-		シミュレーターのフレームレート: [SERVER_FRAME_RATE_CRITICAL] ~ [SERVER_FRAME_RATE_WARNING]
-	</floater.string>
-	<floater.string name="server_frame_time_normal_msg">
-		ノーマル
-	</floater.string>
-	<floater.string name="server_physics_cause_msg">
-		考えられる原因: 物理的オブジェクトが多すぎる
-	</floater.string>
-	<floater.string name="server_scripts_cause_msg">
-		考えられる原因: スクリプトを含むオブジェクトが多すぎる
-	</floater.string>
-	<floater.string name="server_net_cause_msg">
-		考えられる原因: ネットワーク トラフィック過大
-	</floater.string>
-	<floater.string name="server_agent_cause_msg">
-		考えられる原因: 地域内にて動いているアバターが多すぎる
-	</floater.string>
-	<floater.string name="server_images_cause_msg">
-		考えられる原因: 画像計算が多すぎる
-	</floater.string>
-	<floater.string name="server_generic_cause_msg">
-		考えられる原因: シミュレーターの過負荷
-	</floater.string>
-	<floater.string name="smaller_label">
-		&gt;&gt;
-	</floater.string>
-	<floater.string name="bigger_label">
-		&lt;&lt;
-	</floater.string>
-	<button name="client_lagmeter" tool_tip="クライアント ラグ ステータス"/>
-	<text name="client">
-		クライアント
-	</text>
-	<text name="client_text">
-		ノーマル
-	</text>
-	<button name="network_lagmeter" tool_tip="ネットワーク ラグ ステータス"/>
-	<text name="network">
-		ネットワーク
-	</text>
-	<text name="network_text">
-		ノーマル
-	</text>
-	<button name="server_lagmeter" tool_tip="サーバー ラグ ステータス"/>
-	<text name="server">
-		サーバー
-	</text>
-	<text name="server_text">
-		ノーマル
-	</text>
-	<button label="&gt;&gt; " name="minimize" tool_tip="フローターのサイズをトグル"/>
-</floater>
diff --git a/indra/newview/skins/default/xui/pl/floater_lagmeter.xml b/indra/newview/skins/default/xui/pl/floater_lagmeter.xml
deleted file mode 100644
index 8038550bcb30637ac063dfd4edf0ea17ae6dd2d0..0000000000000000000000000000000000000000
--- a/indra/newview/skins/default/xui/pl/floater_lagmeter.xml
+++ /dev/null
@@ -1,151 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_lagmeter" title="POMIAR LAGÓW">
-	<floater.string name="max_title_msg">
-		Pomiar lagów
-	</floater.string>
-	<floater.string name="max_width_px">
-		360
-	</floater.string>
-	<floater.string name="min_title_msg">
-		Lag
-	</floater.string>
-	<floater.string name="min_width_px">
-		90
-	</floater.string>
-	<floater.string name="client_text_msg">
-		Klient
-	</floater.string>
-	<floater.string name="client_frame_rate_critical_fps">
-		10
-	</floater.string>
-	<floater.string name="client_frame_rate_warning_fps">
-		15
-	</floater.string>
-	<floater.string name="client_frame_time_window_bg_msg">
-		W normie, okno w tle
-	</floater.string>
-	<floater.string name="client_frame_time_critical_msg">
-		Ilość klatek na sekundę klienta poniżej [CLIENT_FRAME_RATE_CRITICAL]
-	</floater.string>
-	<floater.string name="client_frame_time_warning_msg">
-		Ilość klatek na sekundę pomiędzy [CLIENT_FRAME_RATE_CRITICAL] i [CLIENT_FRAME_RATE_WARNING]
-	</floater.string>
-	<floater.string name="client_frame_time_normal_msg">
-		W normie
-	</floater.string>
-	<floater.string name="client_draw_distance_cause_msg">
-		Przyczyna: dystans rysowania jest za wysoki
-	</floater.string>
-	<floater.string name="client_texture_loading_cause_msg">
-		Przyczyna: Å‚adowanie obrazu
-	</floater.string>
-	<floater.string name="client_texture_memory_cause_msg">
-		Przyczyna: za dużo obrazów w pamięci
-	</floater.string>
-	<floater.string name="client_complex_objects_cause_msg">
-		Przyczyna: za dużo złożonych obiektów
-	</floater.string>
-	<floater.string name="network_text_msg">
-		Sieć
-	</floater.string>
-	<floater.string name="network_packet_loss_critical_pct">
-		10
-	</floater.string>
-	<floater.string name="network_packet_loss_warning_pct">
-		5
-	</floater.string>
-	<floater.string name="network_packet_loss_critical_msg">
-		Utrata pakietów przekracza [NETWORK_PACKET_LOSS_CRITICAL]%
-	</floater.string>
-	<floater.string name="network_packet_loss_warning_msg">
-		Utrata pakietów przekracza [NETWORK_PACKET_LOSS_WARNING]%-[NETWORK_PACKET_LOSS_CRITICAL]%
-	</floater.string>
-	<floater.string name="network_performance_normal_msg">
-		W normie
-	</floater.string>
-	<floater.string name="network_ping_critical_ms">
-		600
-	</floater.string>
-	<floater.string name="network_ping_warning_ms">
-		300
-	</floater.string>
-	<floater.string name="network_ping_critical_msg">
-		Fatalny ping - [NETWORK_PING_CRITICAL] ms
-	</floater.string>
-	<floater.string name="network_ping_warning_msg">
-		Wolny ping - [NETWORK_PING_WARNING]-[NETWORK_PING_CRITICAL] ms
-	</floater.string>
-	<floater.string name="network_packet_loss_cause_msg">
-		Złe połączenie lub przepustowość.
-	</floater.string>
-	<floater.string name="network_ping_cause_msg">
-		Złe połączenie lub aplikacja współdzieląca pliki.
-	</floater.string>
-	<floater.string name="server_text_msg">
-		Serwer
-	</floater.string>
-	<floater.string name="server_frame_rate_critical_fps">
-		20
-	</floater.string>
-	<floater.string name="server_frame_rate_warning_fps">
-		30
-	</floater.string>
-	<floater.string name="server_single_process_max_time_ms">
-		20
-	</floater.string>
-	<floater.string name="server_frame_time_critical_msg">
-		Ilość klatek na sekundę poniżej [SERVER_FRAME_RATE_CRITICAL]
-	</floater.string>
-	<floater.string name="server_frame_time_warning_msg">
-		Ilość klatek na sekundę pomiędzy [SERVER_FRAME_RATE_CRITICAL] i [SERVER_FRAME_RATE_WARNING]
-	</floater.string>
-	<floater.string name="server_frame_time_normal_msg">
-		W normie
-	</floater.string>
-	<floater.string name="server_physics_cause_msg">
-		Przyczyna: za dużo obiektów fizycznych
-	</floater.string>
-	<floater.string name="server_scripts_cause_msg">
-		Przyczyna: za dużo obieków skryptowanych
-	</floater.string>
-	<floater.string name="server_net_cause_msg">
-		Przyczyna: za duży ruch w sieci
-	</floater.string>
-	<floater.string name="server_agent_cause_msg">
-		Przyczyna: za dużo poruszających się awatarów w regionie
-	</floater.string>
-	<floater.string name="server_images_cause_msg">
-		Przyczyna: za dużo kalkulacji obrazu
-	</floater.string>
-	<floater.string name="server_generic_cause_msg">
-		Przyczyna: symulator Å‚aduje siÄ™ zbyt powoli
-	</floater.string>
-	<floater.string name="smaller_label">
-		&gt;&gt;
-	</floater.string>
-	<floater.string name="bigger_label">
-		&lt;&lt;
-	</floater.string>
-	<button label="" label_selected="" name="client_lagmeter" tool_tip="Status lagów klienta"/>
-	<text name="client">
-		Klient
-	</text>
-	<text name="client_text">
-		W normie
-	</text>
-	<button label="" label_selected="" name="network_lagmeter" tool_tip="Network lag status"/>
-	<text name="network">
-		Sieć
-	</text>
-	<text name="network_text">
-		W normie
-	</text>
-	<button label="" label_selected="" name="server_lagmeter" tool_tip="Server lag status"/>
-	<text name="server">
-		Serwer
-	</text>
-	<text name="server_text">
-		W normie
-	</text>
-	<button label="&gt;&gt;" name="minimize" tool_tip="ZÅ‚Ä…cz rozmiar pliku xml"/>
-</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_lagmeter.xml b/indra/newview/skins/default/xui/pt/floater_lagmeter.xml
deleted file mode 100644
index 9932318293fea64443288e00255d8f79d31296f4..0000000000000000000000000000000000000000
--- a/indra/newview/skins/default/xui/pt/floater_lagmeter.xml
+++ /dev/null
@@ -1,154 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_lagmeter" title="LAG - Índice">
-	<floater.string name="max_title_msg">
-		Medidor de Atraso
-	</floater.string>
-	<floater.string name="max_width_px">
-		360
-	</floater.string>
-	<floater.string name="min_title_msg">
-		Atraso
-	</floater.string>
-	<floater.string name="min_width_px">
-		90
-	</floater.string>
-	<floater.string name="client_text_msg">
-		Cliente
-	</floater.string>
-	<floater.string name="client_frame_rate_critical_fps">
-		10
-	</floater.string>
-	<floater.string name="client_frame_rate_warning_fps">
-		15
-	</floater.string>
-	<floater.string name="client_frame_time_window_bg_msg">
-		Normal, janela por baixo
-	</floater.string>
-	<floater.string name="client_frame_time_critical_msg">
-		Taxa de quadros do Cliente abaixo de [CLIENT_FRAME_RATE_CRITICAL]
-	</floater.string>
-	<floater.string name="client_frame_time_warning_msg">
-		Taxa de quadros do Cliente entre [CLIENT_FRAME_RATE_CRITICAL] e [CLIENT_FRAME_RATE_WARNING]
-	</floater.string>
-	<floater.string name="client_frame_time_normal_msg">
-		Normal
-	</floater.string>
-	<floater.string name="client_draw_distance_cause_msg">
-		Causa possível: Distância de desenho ajustada muito alta
-	</floater.string>
-	<floater.string name="client_texture_loading_cause_msg">
-		Causa possível: Carregamento de Imagens
-	</floater.string>
-	<floater.string name="client_texture_memory_cause_msg">
-		Causa possível: Muitas imagens na memória
-	</floater.string>
-	<floater.string name="client_complex_objects_cause_msg">
-		Causa possível: Muitos objetos complexos na cena
-	</floater.string>
-	<floater.string name="network_text_msg">
-		Rede
-	</floater.string>
-	<floater.string name="network_packet_loss_critical_pct">
-		10
-	</floater.string>
-	<floater.string name="network_packet_loss_warning_pct">
-		5
-	</floater.string>
-	<floater.string name="network_packet_loss_critical_msg">
-		Conexão está caindo para cerca de [NETWORK_PACKET_LOSS_CRITICAL]% de pacotes
-	</floater.string>
-	<floater.string name="network_packet_loss_warning_msg">
-		Conexão está caindo [NETWORK_PACKET_LOSS_WARNING]%-[NETWORK_PACKET_LOSS_CRITICAL]% de pacotes
-	</floater.string>
-	<floater.string name="network_performance_normal_msg">
-		Normal
-	</floater.string>
-	<floater.string name="network_ping_critical_ms">
-		600
-	</floater.string>
-	<floater.string name="network_ping_warning_ms">
-		300
-	</floater.string>
-	<floater.string name="network_ping_critical_msg">
-		Tempo de conexão de ping é cerca de  [NETWORK_PING_CRITICAL] ms
-	</floater.string>
-	<floater.string name="network_ping_warning_msg">
-		Tempo de conexão de ping é [NETWORK_PING_WARNING]-[NETWORK_PING_CRITICAL] ms
-	</floater.string>
-	<floater.string name="network_packet_loss_cause_msg">
-		Possível conexão ruim ou &apos;Largura de Banda&apos; escolhida muito alta.
-	</floater.string>
-	<floater.string name="network_ping_cause_msg">
-		Possível conexão ruim ou aplicativos compartilhando arquivos.
-	</floater.string>
-	<floater.string name="server_text_msg">
-		Servidor
-	</floater.string>
-	<floater.string name="server_frame_rate_critical_fps">
-		20
-	</floater.string>
-	<floater.string name="server_frame_rate_warning_fps">
-		30
-	</floater.string>
-	<floater.string name="server_single_process_max_time_ms">
-		20
-	</floater.string>
-	<floater.string name="server_frame_time_critical_msg">
-		Taxa de quadros abaixo de [SERVER_FRAME_RATE_CRITICAL]
-	</floater.string>
-	<floater.string name="server_frame_time_warning_msg">
-		Taxa de quadros entre [SERVER_FRAME_RATE_CRITICAL] e [SERVER_FRAME_RATE_WARNING]
-	</floater.string>
-	<floater.string name="server_frame_time_normal_msg">
-		Normal
-	</floater.string>
-	<floater.string name="server_physics_cause_msg">
-		Causa possível: Muitos objetos físicos
-	</floater.string>
-	<floater.string name="server_scripts_cause_msg">
-		Causa possível: Muitos objetos com scripts
-	</floater.string>
-	<floater.string name="server_net_cause_msg">
-		Causa possível: Muito tráfego na rede
-	</floater.string>
-	<floater.string name="server_agent_cause_msg">
-		Causa possível: Muitas pessoas se movendo na região
-	</floater.string>
-	<floater.string name="server_images_cause_msg">
-		Causa possível: Muitos cálculos de imagem
-	</floater.string>
-	<floater.string name="server_generic_cause_msg">
-		Causa possível: Carga no simulador muito pesada
-	</floater.string>
-	<floater.string name="smaller_label">
-		&gt;&gt;
-	</floater.string>
-	<floater.string name="bigger_label">
-		&lt;&lt;
-	</floater.string>
-	<button label="" label_selected="" name="client_lagmeter" tool_tip="Status de atraso no Cliente"/>
-	<text name="client">
-		Cliente
-	</text>
-	<text font="SansSerifSmall" name="client_text">
-		Normal
-	</text>
-	<text left="30" name="client_lag_cause" right="-10"/>
-	<button label="" label_selected="" name="network_lagmeter" tool_tip="Status de atraso na rede"/>
-	<text name="network">
-		Rede
-	</text>
-	<text font="SansSerifSmall" name="network_text">
-		Normal
-	</text>
-	<text left="30" name="network_lag_cause" right="-10"/>
-	<button label="" label_selected="" name="server_lagmeter" tool_tip="Status de atraso no servidor"/>
-	<text name="server">
-		Servidor
-	</text>
-	<text font="SansSerifSmall" name="server_text">
-		Normal
-	</text>
-	<text left="30" name="server_lag_cause" right="-32"/>
-	<button label="&gt;&gt;" name="minimize" tool_tip="Alternar o tamanho da janela"/>
-</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_lagmeter.xml b/indra/newview/skins/default/xui/ru/floater_lagmeter.xml
deleted file mode 100644
index c420006a03c394e955f543a1bdae6486bd0a2832..0000000000000000000000000000000000000000
--- a/indra/newview/skins/default/xui/ru/floater_lagmeter.xml
+++ /dev/null
@@ -1,151 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_lagmeter" title="УРОВЕНЬ ЛАГОВ">
-	<floater.string name="max_title_msg">
-		Уровень лагов
-	</floater.string>
-	<floater.string name="max_width_px">
-		360
-	</floater.string>
-	<floater.string name="min_title_msg">
-		Лаг
-	</floater.string>
-	<floater.string name="min_width_px">
-		90
-	</floater.string>
-	<floater.string name="client_text_msg">
-		Клиент
-	</floater.string>
-	<floater.string name="client_frame_rate_critical_fps">
-		10
-	</floater.string>
-	<floater.string name="client_frame_rate_warning_fps">
-		15
-	</floater.string>
-	<floater.string name="client_frame_time_window_bg_msg">
-		Нормально, окно в фоне
-	</floater.string>
-	<floater.string name="client_frame_time_critical_msg">
-		Частота кадров клиента ниже [CLIENT_FRAME_RATE_CRITICAL]
-	</floater.string>
-	<floater.string name="client_frame_time_warning_msg">
-		Частота кадров клиента от [CLIENT_FRAME_RATE_CRITICAL] до [CLIENT_FRAME_RATE_WARNING]
-	</floater.string>
-	<floater.string name="client_frame_time_normal_msg">
-		Нормально
-	</floater.string>
-	<floater.string name="client_draw_distance_cause_msg">
-		Возможная причина: дальность отрисовки слишком велика
-	</floater.string>
-	<floater.string name="client_texture_loading_cause_msg">
-		Возможная причина: загрузка изображений
-	</floater.string>
-	<floater.string name="client_texture_memory_cause_msg">
-		Возможная причина: слишком много изображений в памяти
-	</floater.string>
-	<floater.string name="client_complex_objects_cause_msg">
-		Возможная причина: слишком много сложных объектов в сцене
-	</floater.string>
-	<floater.string name="network_text_msg">
-		Сеть
-	</floater.string>
-	<floater.string name="network_packet_loss_critical_pct">
-		10
-	</floater.string>
-	<floater.string name="network_packet_loss_warning_pct">
-		5
-	</floater.string>
-	<floater.string name="network_packet_loss_critical_msg">
-		Сеть теряет более [NETWORK_PACKET_LOSS_CRITICAL]% пакетов
-	</floater.string>
-	<floater.string name="network_packet_loss_warning_msg">
-		Сеть теряет [NETWORK_PACKET_LOSS_WARNING]–[NETWORK_PACKET_LOSS_CRITICAL]% пакетов
-	</floater.string>
-	<floater.string name="network_performance_normal_msg">
-		Нормально
-	</floater.string>
-	<floater.string name="network_ping_critical_ms">
-		600
-	</floater.string>
-	<floater.string name="network_ping_warning_ms">
-		300
-	</floater.string>
-	<floater.string name="network_ping_critical_msg">
-		Пинг соединения более [NETWORK_PING_CRITICAL] мс
-	</floater.string>
-	<floater.string name="network_ping_warning_msg">
-		Пинг соединения [NETWORK_PING_WARNING]–[NETWORK_PING_CRITICAL] мс
-	</floater.string>
-	<floater.string name="network_packet_loss_cause_msg">
-		Возможно, плохое соединение, или параметр «Ширина канала» слишком велик.
-	</floater.string>
-	<floater.string name="network_ping_cause_msg">
-		Возможно, плохое соединение или есть работающие файлообменные программы.
-	</floater.string>
-	<floater.string name="server_text_msg">
-		Сервер
-	</floater.string>
-	<floater.string name="server_frame_rate_critical_fps">
-		20
-	</floater.string>
-	<floater.string name="server_frame_rate_warning_fps">
-		30
-	</floater.string>
-	<floater.string name="server_single_process_max_time_ms">
-		20
-	</floater.string>
-	<floater.string name="server_frame_time_critical_msg">
-		Частота кадров сервера ниже [SERVER_FRAME_RATE_CRITICAL]
-	</floater.string>
-	<floater.string name="server_frame_time_warning_msg">
-		Частота кадров сервера [SERVER_FRAME_RATE_CRITICAL]–[SERVER_FRAME_RATE_WARNING]
-	</floater.string>
-	<floater.string name="server_frame_time_normal_msg">
-		Нормально
-	</floater.string>
-	<floater.string name="server_physics_cause_msg">
-		Возможная причина: слишком много физических объектов
-	</floater.string>
-	<floater.string name="server_scripts_cause_msg">
-		Возможная причина: слишком много скриптовых объектов
-	</floater.string>
-	<floater.string name="server_net_cause_msg">
-		Возможная причина: слишком большой сетевой трафик
-	</floater.string>
-	<floater.string name="server_agent_cause_msg">
-		Возможная причина: слишком много людей в регионе
-	</floater.string>
-	<floater.string name="server_images_cause_msg">
-		Возможная причина: слишком много изображений
-	</floater.string>
-	<floater.string name="server_generic_cause_msg">
-		Возможная причина: сервер сильно загружен
-	</floater.string>
-	<floater.string name="smaller_label">
-		&gt;&gt;
-	</floater.string>
-	<floater.string name="bigger_label">
-		&lt;&lt;
-	</floater.string>
-	<button name="client_lagmeter" tool_tip="Уровень лагов клиента"/>
-	<text name="client">
-		Клиент
-	</text>
-	<text name="client_text">
-		Нормально
-	</text>
-	<button name="network_lagmeter" tool_tip="Уровень лагов сети"/>
-	<text name="network">
-		Сеть
-	</text>
-	<text name="network_text">
-		Нормально
-	</text>
-	<button name="server_lagmeter" tool_tip="Уровень лагов сервера"/>
-	<text name="server">
-		Сервер
-	</text>
-	<text name="server_text">
-		Нормально
-	</text>
-	<button label="&gt;&gt;" name="minimize" tool_tip="Переключение размера"/>
-</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_lagmeter.xml b/indra/newview/skins/default/xui/tr/floater_lagmeter.xml
deleted file mode 100644
index 736c50be90a4a68ef1f2d98e4751017496595b84..0000000000000000000000000000000000000000
--- a/indra/newview/skins/default/xui/tr/floater_lagmeter.xml
+++ /dev/null
@@ -1,151 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_lagmeter" title="GECİKME ÖLÇER">
-	<floater.string name="max_title_msg">
-		Gecikme Ölçer
-	</floater.string>
-	<floater.string name="max_width_px">
-		360
-	</floater.string>
-	<floater.string name="min_title_msg">
-		Gecikme
-	</floater.string>
-	<floater.string name="min_width_px">
-		90
-	</floater.string>
-	<floater.string name="client_text_msg">
-		Ä°stemci
-	</floater.string>
-	<floater.string name="client_frame_rate_critical_fps">
-		10
-	</floater.string>
-	<floater.string name="client_frame_rate_warning_fps">
-		15
-	</floater.string>
-	<floater.string name="client_frame_time_window_bg_msg">
-		Normal, pencere alt zeminde
-	</floater.string>
-	<floater.string name="client_frame_time_critical_msg">
-		İstemci kare hızı [CLIENT_FRAME_RATE_CRITICAL] altında
-	</floater.string>
-	<floater.string name="client_frame_time_warning_msg">
-		İstemci kare hızı [CLIENT_FRAME_RATE_CRITICAL] ile [CLIENT_FRAME_RATE_WARNING] arasınad
-	</floater.string>
-	<floater.string name="client_frame_time_normal_msg">
-		Normal
-	</floater.string>
-	<floater.string name="client_draw_distance_cause_msg">
-		Muhtemel neden: Çizme mesafesi çok yüksek
-	</floater.string>
-	<floater.string name="client_texture_loading_cause_msg">
-		Muhtemel neden: Görüntüler yükleniyor
-	</floater.string>
-	<floater.string name="client_texture_memory_cause_msg">
-		Muhtemel neden: Bellekte çok fazla görüntü
-	</floater.string>
-	<floater.string name="client_complex_objects_cause_msg">
-		Muhtemel neden: Sahnede çok fazla karmaşık nesne
-	</floater.string>
-	<floater.string name="network_text_msg">
-		AÄŸ
-	</floater.string>
-	<floater.string name="network_packet_loss_critical_pct">
-		10
-	</floater.string>
-	<floater.string name="network_packet_loss_warning_pct">
-		5
-	</floater.string>
-	<floater.string name="network_packet_loss_critical_msg">
-		Bağlantı paketlerin % [NETWORK_PACKET_LOSS_CRITICAL]&apos;sinden fazlasını bırakıyor
-	</floater.string>
-	<floater.string name="network_packet_loss_warning_msg">
-		Bağlantı paketlerin % [NETWORK_PACKET_LOSS_WARNING]%-[NETWORK_PACKET_LOSS_CRITICAL]&apos;sini bırakıyor
-	</floater.string>
-	<floater.string name="network_performance_normal_msg">
-		Normal
-	</floater.string>
-	<floater.string name="network_ping_critical_ms">
-		600
-	</floater.string>
-	<floater.string name="network_ping_warning_ms">
-		300
-	</floater.string>
-	<floater.string name="network_ping_critical_msg">
-		Bağlantı ping süresi [NETWORK_PING_CRITICAL] ms.den fazla
-	</floater.string>
-	<floater.string name="network_ping_warning_msg">
-		Bağlantı ping süresi [NETWORK_PING_WARNING]-[NETWORK_PING_CRITICAL] ms
-	</floater.string>
-	<floater.string name="network_packet_loss_cause_msg">
-		Muhtemel yetersiz bağlantı veya &apos;Bant Genişliği&apos; tercihi çok yüksek.
-	</floater.string>
-	<floater.string name="network_ping_cause_msg">
-		Muhtemel yetersiz bağlantı veya dosya paylaşım uygulaması.
-	</floater.string>
-	<floater.string name="server_text_msg">
-		Sunucu
-	</floater.string>
-	<floater.string name="server_frame_rate_critical_fps">
-		20
-	</floater.string>
-	<floater.string name="server_frame_rate_warning_fps">
-		30
-	</floater.string>
-	<floater.string name="server_single_process_max_time_ms">
-		20
-	</floater.string>
-	<floater.string name="server_frame_time_critical_msg">
-		Simülatör kare hızı [SERVER_FRAME_RATE_CRITICAL] altında
-	</floater.string>
-	<floater.string name="server_frame_time_warning_msg">
-		Simülatör kare hızı [SERVER_FRAME_RATE_CRITICAL] ve [SERVER_FRAME_RATE_WARNING] arasında
-	</floater.string>
-	<floater.string name="server_frame_time_normal_msg">
-		Normal
-	</floater.string>
-	<floater.string name="server_physics_cause_msg">
-		Muhtemel Neden: Çok fazla fiziki nesne
-	</floater.string>
-	<floater.string name="server_scripts_cause_msg">
-		Muhtemel Neden: Çok fazla komut dosyalı nesne
-	</floater.string>
-	<floater.string name="server_net_cause_msg">
-		Muhtemel Neden: Çok fazla ağ trafiği
-	</floater.string>
-	<floater.string name="server_agent_cause_msg">
-		Muhtemel Neden: Bölgede hareket eden çok fazla insan var
-	</floater.string>
-	<floater.string name="server_images_cause_msg">
-		Muhtemel Neden: Çok fazla görüntü hesabı
-	</floater.string>
-	<floater.string name="server_generic_cause_msg">
-		Muhtemel Neden: Simülatör yükü çok ağır
-	</floater.string>
-	<floater.string name="smaller_label">
-		&gt;&gt;
-	</floater.string>
-	<floater.string name="bigger_label">
-		&lt;&lt;
-	</floater.string>
-	<button name="client_lagmeter" tool_tip="Ä°stemci gecikme durumu"/>
-	<text name="client">
-		Ä°stemci
-	</text>
-	<text name="client_text">
-		Normal
-	</text>
-	<button name="network_lagmeter" tool_tip="AÄŸ gecikme durumu"/>
-	<text name="network">
-		AÄŸ
-	</text>
-	<text name="network_text">
-		Normal
-	</text>
-	<button name="server_lagmeter" tool_tip="Sunucu gecikme durumu"/>
-	<text name="server">
-		Sunucu
-	</text>
-	<text name="server_text">
-		Normal
-	</text>
-	<button label="&gt;&gt;" name="minimize" tool_tip="Gezdirici büyüklüğünü değiştir"/>
-</floater>
diff --git a/indra/test/llbuffer_tut.cpp b/indra/test/llbuffer_tut.cpp
index dc1a5cdd3d75022c8b28f9db80769930a6eb0f3f..a25fdebb7fb379f4f4f66b817e844577d59740ba 100644
--- a/indra/test/llbuffer_tut.cpp
+++ b/indra/test/llbuffer_tut.cpp
@@ -31,7 +31,6 @@
 #include "lltut.h"
 #include "llbuffer.h"
 #include "llerror.h"
-#include "llmemtype.h"
 
 
 namespace tut