diff --git a/indra/llcommon/llpointer.h b/indra/llcommon/llpointer.h
index 0fee4f0990fb27af459680671bc1841f9f7c9a4c..6a3bbeb768e4745e50a4d79002cbc2cb177d6431 100644
--- a/indra/llcommon/llpointer.h
+++ b/indra/llcommon/llpointer.h
@@ -207,7 +207,9 @@ class LLCopyOnWritePointer : public LLPointer<Type>
 	using LLPointer<Type>::operator >;
 
 
+	operator Type*()							{ return mPointer; }
 	operator const Type*()   const				{ return mPointer; }
+	Type*	operator->()						{ return mPointer; }
 	const Type*	operator->() const				{ return mPointer; }
 
 };
diff --git a/indra/llcommon/lltrace.h b/indra/llcommon/lltrace.h
index 0c618a2f4bfe00e429470d7fc3fffd506122bc05..221c226ad13c38acef2d8a22e75969e5f476c312 100644
--- a/indra/llcommon/lltrace.h
+++ b/indra/llcommon/lltrace.h
@@ -91,6 +91,11 @@ namespace LLTrace
 			return mStorage[index]; 
 		}
 
+		LL_FORCE_INLINE const ACCUMULATOR& operator[](size_t index) const
+		{ 
+			return mStorage[index]; 
+		}
+
 		void addSamples(const AccumulatorBuffer<ACCUMULATOR>& other)
 		{
 			llassert(mNextStorageSlot == other.mNextStorageSlot);
@@ -178,7 +183,7 @@ namespace LLTrace
 		}
 
 		ACCUMULATOR& getAccumulator(AccumulatorBuffer<ACCUMULATOR>* buffer) { return (*buffer)[mAccumulatorIndex]; }
-		const ACCUMULATOR& getAccumulator(AccumulatorBuffer<ACCUMULATOR>* buffer) const { return (*buffer)[mAccumulatorIndex]; }
+		const ACCUMULATOR& getAccumulator(const AccumulatorBuffer<ACCUMULATOR>* buffer) const { return (*buffer)[mAccumulatorIndex]; }
 
 	protected:
 		std::string	mName;
@@ -213,9 +218,9 @@ namespace LLTrace
 			{
 				mMax = value;
 			}
-			F32 old_mean = mMean;
-			mMean += ((F32)value - old_mean) / (F32)mNumSamples;
-			mVarianceSum += ((F32)value - old_mean) * ((F32)value - mMean);
+			F64 old_mean = mMean;
+			mMean += ((F64)value - old_mean) / (F64)mNumSamples;
+			mVarianceSum += ((F64)value - old_mean) * ((F64)value - mMean);
 			mLastValue = value;
 		}
 
@@ -231,14 +236,14 @@ namespace LLTrace
 				mMax = other.mMax;
 			}
 			mNumSamples += other.mNumSamples;
-			F32 weight = (F32)mNumSamples / (F32)(mNumSamples + other.mNumSamples);
+			F64 weight = (F64)mNumSamples / (F64)(mNumSamples + other.mNumSamples);
 			mMean = mMean * weight + other.mMean * (1.f - weight);
 
-			F32 n_1 = (F32)mNumSamples,
-				n_2 = (F32)other.mNumSamples;
-			F32 m_1 = mMean,
+			F64 n_1 = (F64)mNumSamples,
+				n_2 = (F64)other.mNumSamples;
+			F64 m_1 = mMean,
 				m_2 = other.mMean;
-			F32 sd_1 = getStandardDeviation(),
+			F64 sd_1 = getStandardDeviation(),
 				sd_2 = other.getStandardDeviation();
 			// combine variance (and hence standard deviation) of 2 different sized sample groups using
 			// the following formula: http://www.mrc-bsu.cam.ac.uk/cochrane/handbook/chapter_7/7_7_3_8_combining_groups.htm
@@ -275,8 +280,8 @@ namespace LLTrace
 		T	getMin() const { return mMin; }
 		T	getMax() const { return mMax; }
 		T	getLastValue() const { return mLastValue; }
-		F32	getMean() const { return mMean; }
-		F32 getStandardDeviation() const { return sqrtf(mVarianceSum / mNumSamples); }
+		F64	getMean() const { return mMean; }
+		F64 getStandardDeviation() const { return sqrtf(mVarianceSum / mNumSamples); }
 
 	private:
 		T	mSum,
@@ -284,17 +289,17 @@ namespace LLTrace
 			mMax,
 			mLastValue;
 
-		F32 mMean,
+		F64 mMean,
 			mVarianceSum;
 
 		U32	mNumSamples;
 	};
 
 	template<typename T>
-	class LL_COMMON_API RateAccumulator
+	class LL_COMMON_API CountAccumulator
 	{
 	public:
-		RateAccumulator()
+		CountAccumulator()
 		:	mSum(0),
 			mNumSamples(0)
 		{}
@@ -305,7 +310,7 @@ namespace LLTrace
 			mSum += value;
 		}
 
-		void addSamples(const RateAccumulator<T>& other)
+		void addSamples(const CountAccumulator<T>& other)
 		{
 			mSum += other.mSum;
 			mNumSamples += other.mNumSamples;
@@ -325,7 +330,7 @@ namespace LLTrace
 		U32	mNumSamples;
 	};
 
-	template <typename T, typename IS_UNIT = void>
+	template <typename T = F64, typename IS_UNIT = void>
 	class LL_COMMON_API Measurement
 	:	public TraceType<MeasurementAccumulator<T> >, 
 		public LLInstanceTracker<Measurement<T, IS_UNIT>, std::string>
@@ -352,8 +357,8 @@ namespace LLTrace
 	public:
 		typedef typename T::storage_t storage_t;
 		typedef typename T::base_unit_t base_unit_t;
-
 		typedef Measurement<typename T::value_t> base_measurement_t;
+
 		Measurement(const char* name, const char* description = NULL) 
 		:	Measurement<typename T::value_t>(name)
 		{}
@@ -361,20 +366,20 @@ namespace LLTrace
 		template<typename UNIT_T>
 		void sample(UNIT_T value)
 		{
-			base_measurement_t::sample(value.value());
+			base_measurement_t::sample(((T)value).value());
 		}
 	};
 
-	template <typename T, typename IS_UNIT = void>
-	class LL_COMMON_API Rate 
-	:	public TraceType<RateAccumulator<T> >, 
-		public LLInstanceTracker<Rate<T>, std::string>
+	template <typename T = F64, typename IS_UNIT = void>
+	class LL_COMMON_API Count 
+	:	public TraceType<CountAccumulator<T> >, 
+		public LLInstanceTracker<Count<T>, std::string>
 	{
 	public:
 		typedef T storage_t;
 		typedef T base_unit_t;
 
-		Rate(const char* name, const char* description = NULL) 
+		Count(const char* name, const char* description = NULL) 
 		:	TraceType(name),
 			LLInstanceTracker(name)
 		{}
@@ -386,53 +391,23 @@ namespace LLTrace
 	};
 
 	template <typename T>
-	class LL_COMMON_API Rate <T, typename T::is_unit_t>
-	:	public Rate<typename T::value_t>
+	class LL_COMMON_API Count <T, typename T::is_unit_t>
+	:	public Count<typename T::value_t>
 	{
 	public:
 		typedef typename T::storage_t storage_t;
 		typedef typename T::base_unit_t base_unit_t;
+		typedef Count<typename T::value_t> base_count_t;
 
-		Rate(const char* name, const char* description = NULL) 
-		:	Rate<typename T::value_t>(name)
+		Count(const char* name, const char* description = NULL) 
+		:	Count<typename T::value_t>(name)
 		{}
 
 		template<typename UNIT_T>
 		void add(UNIT_T value)
 		{
-			getPrimaryAccumulator().add(value.value());
-		}
-	};
-
-	template <typename T>
-	class LL_COMMON_API Count 
-	{
-	public:
-		typedef typename Rate<T>::base_unit_t base_unit_t;
-
-		Count(const char* name) 
-		:	mIncrease(name + "_increase"),
-			mDecrease(name + "_decrease"),
-			mTotal(name)
-		{}
-
-		void count(T value)
-		{
-			if (value < 0)
-			{
-				mDecrease.add(value * -1);
-			}
-			else
-			{
-				mIncrease.add(value);
-			}
-			mTotal.add(value);
+			base_count_t::add(((T)value).value());
 		}
-	private:
-		friend LLTrace::Recording;
-		Rate<T> mIncrease;
-		Rate<T> mDecrease;
-		Rate<T> mTotal;
 	};
 
 	class LL_COMMON_API TimerAccumulator
diff --git a/indra/llcommon/lltracerecording.cpp b/indra/llcommon/lltracerecording.cpp
index 5d7b231b7de4109097951f27fafad8e02fd8e9c8..9a769ff344b0ad2611187fde47cd70350a53d1c7 100644
--- a/indra/llcommon/lltracerecording.cpp
+++ b/indra/llcommon/lltracerecording.cpp
@@ -39,8 +39,8 @@ namespace LLTrace
 
 Recording::Recording() 
 :	mElapsedSeconds(0),
-	mRates(new AccumulatorBuffer<RateAccumulator<F32> >()),
-	mMeasurements(new AccumulatorBuffer<MeasurementAccumulator<F32> >()),
+	mCounts(new AccumulatorBuffer<CountAccumulator<F64> >()),
+	mMeasurements(new AccumulatorBuffer<MeasurementAccumulator<F64> >()),
 	mStackTimers(new AccumulatorBuffer<TimerAccumulator>())
 {}
 
@@ -59,7 +59,7 @@ void Recording::update()
 
 void Recording::handleReset()
 {
-	mRates.write()->reset();
+	mCounts.write()->reset();
 	mMeasurements.write()->reset();
 	mStackTimers.write()->reset();
 
@@ -88,21 +88,22 @@ void Recording::handleSplitTo(Recording& other)
 
 void Recording::makePrimary()
 {
-	mRates.write()->makePrimary();
+	mCounts.write()->makePrimary();
 	mMeasurements.write()->makePrimary();
 	mStackTimers.write()->makePrimary();
 }
 
 bool Recording::isPrimary() const
 {
-	return mRates->isPrimary();
+	return mCounts->isPrimary();
 }
 
 void Recording::mergeRecording( const Recording& other )
 {
-	mRates.write()->addSamples(*other.mRates);
+	mCounts.write()->addSamples(*other.mCounts);
 	mMeasurements.write()->addSamples(*other.mMeasurements);
 	mStackTimers.write()->addSamples(*other.mStackTimers);
+	mElapsedSeconds += other.mElapsedSeconds;
 }
 
 ///////////////////////////////////////////////////////////////////////
@@ -149,9 +150,9 @@ Recording& PeriodicRecording::getTotalRecording()
 	if (!mTotalValid)
 	{
 		mTotalRecording.reset();
-		for (S32 i = (mCurPeriod + 1) % mNumPeriods; i < mCurPeriod; i++)
+		for (S32 i = mCurPeriod + 1; i < mCurPeriod + mNumPeriods; i++)
 		{
-			mTotalRecording.mergeRecording(mRecordingPeriods[i]);
+			mTotalRecording.mergeRecording(mRecordingPeriods[i % mNumPeriods]);
 		}
 	}
 	mTotalValid = true;
@@ -212,7 +213,6 @@ void ExtendableRecording::handleSplitTo( ExtendableRecording& other )
 PeriodicRecording& get_frame_recording()
 {
 	static PeriodicRecording sRecording(64);
-	sRecording.start();
 	return sRecording;
 }
 
diff --git a/indra/llcommon/lltracerecording.h b/indra/llcommon/lltracerecording.h
index 924a7bffd5a79df204b1f541ea23a2fc743babe9..d9ac8c327ab2edfa5275eb47b77a8e5d0e92288a 100644
--- a/indra/llcommon/lltracerecording.h
+++ b/indra/llcommon/lltracerecording.h
@@ -111,17 +111,17 @@ namespace LLTrace
 
 		void update();
 
-		// Rate accessors
+		// Count accessors
 		template <typename T, typename IS_UNIT>
-		typename Rate<T, IS_UNIT>::base_unit_t getSum(const Rate<T, IS_UNIT>& stat) const
+		typename Count<T, IS_UNIT>::base_unit_t getSum(const Count<T, IS_UNIT>& stat) const
 		{
-			return (typename Rate<T, IS_UNIT>::base_unit_t)stat.getAccumulator(mRates).getSum();
+			return (typename Count<T, IS_UNIT>::base_unit_t)stat.getAccumulator(mCounts).getSum();
 		}
 
 		template <typename T, typename IS_UNIT>
-		typename Rate<T, IS_UNIT>::base_unit_t getPerSec(const Rate<T, IS_UNIT>& stat) const
+		typename Count<T, IS_UNIT>::base_unit_t getPerSec(const Count<T, IS_UNIT>& stat) const
 		{
-			return (typename Rate<T, IS_UNIT>::base_unit_t)stat.getAccumulator(mRates).getSum() / mElapsedSeconds;
+			return (typename Count<T, IS_UNIT>::base_unit_t)stat.getAccumulator(mCounts).getSum() / mElapsedSeconds;
 		}
 
 		// Measurement accessors
@@ -135,7 +135,7 @@ namespace LLTrace
 		template <typename T, typename IS_UNIT>
 		typename Measurement<T, IS_UNIT>::base_unit_t getPerSec(const Measurement<T, IS_UNIT>& stat) const
 		{
-			return (typename Rate<T, IS_UNIT>::base_unit_t)stat.getAccumulator(mMeasurements).getSum() / mElapsedSeconds;
+			return (typename Count<T, IS_UNIT>::base_unit_t)stat.getAccumulator(mMeasurements).getSum() / mElapsedSeconds;
 		}
 
 		template <typename T, typename IS_UNIT>
@@ -151,7 +151,7 @@ namespace LLTrace
 		}
 
 		template <typename T, typename IS_UNIT>
-		typename Measurement<T, IS_UNIT>::base_unit_t getMean(const Measurement<T, IS_UNIT>& stat) const
+		typename Measurement<T, IS_UNIT>::base_unit_t getMean(Measurement<T, IS_UNIT>& stat) const
 		{
 			return (typename Measurement<T, IS_UNIT>::base_unit_t)stat.getAccumulator(mMeasurements).getMean();
 		}
@@ -168,56 +168,7 @@ namespace LLTrace
 			return (typename Measurement<T, IS_UNIT>::base_unit_t)stat.getAccumulator(mMeasurements).getLastValue();
 		}
 
-		// Count accessors
-		template <typename T>
-		typename Count<T>::base_unit_t getSum(const Count<T>& stat) const
-		{
-			return getSum(stat.mTotal);
-		}
-
-		template <typename T>
-		typename Count<T>::base_unit_t getPerSec(const Count<T>& stat) const
-		{
-			return getPerSec(stat.mTotal);
-		}
-
-		template <typename T>
-		typename Count<T>::base_unit_t getIncrease(const Count<T>& stat) const
-		{
-			return getPerSec(stat.mTotal);
-		}
-
-		template <typename T>
-		typename Count<T>::base_unit_t getIncreasePerSec(const Count<T>& stat) const
-		{
-			return getPerSec(stat.mIncrease);
-		}
-
-		template <typename T>
-		typename Count<T>::base_unit_t getDecrease(const Count<T>& stat) const
-		{
-			return getPerSec(stat.mDecrease);
-		}
-
-		template <typename T>
-		typename Count<T>::base_unit_t getDecreasePerSec(const Count<T>& stat) const
-		{
-			return getPerSec(stat.mDecrease);
-		}
-
-		template <typename T>
-		typename Count<T>::base_unit_t getChurn(const Count<T>& stat) const
-		{
-			return getIncrease(stat) + getDecrease(stat);
-		}
-
-		template <typename T>
-		typename Count<T>::base_unit_t getChurnPerSec(const Count<T>& stat) const
-		{
-			return getIncreasePerSec(stat) + getDecreasePerSec(stat);
-		}
-
-		F64 getSampleTime() const { return mElapsedSeconds; }
+		F64 getDuration() const { return mElapsedSeconds; }
 
 		// implementation for LLVCRControlsMixin
 		/*virtual*/ void handleStart();
@@ -230,8 +181,8 @@ namespace LLTrace
 		// returns data for current thread
 		class ThreadRecorder* getThreadRecorder(); 
 
-		LLCopyOnWritePointer<AccumulatorBuffer<RateAccumulator<F32> > >			mRates;
-		LLCopyOnWritePointer<AccumulatorBuffer<MeasurementAccumulator<F32> > >	mMeasurements;
+		LLCopyOnWritePointer<AccumulatorBuffer<CountAccumulator<F64> > >		mCounts;
+		LLCopyOnWritePointer<AccumulatorBuffer<MeasurementAccumulator<F64> > >	mMeasurements;
 		LLCopyOnWritePointer<AccumulatorBuffer<TimerAccumulator> >				mStackTimers;
 
 		LLTimer			mSamplingTimer;
diff --git a/indra/llcommon/lltracethreadrecorder.cpp b/indra/llcommon/lltracethreadrecorder.cpp
index 48aa1a42f2e116adc9abe99c0216040b89d6cad3..02dc55771ba10a0c622ec99c011dc036d845e1be 100644
--- a/indra/llcommon/lltracethreadrecorder.cpp
+++ b/indra/llcommon/lltracethreadrecorder.cpp
@@ -114,10 +114,10 @@ ThreadRecorder::ActiveRecording::ActiveRecording( Recording* target )
 void ThreadRecorder::ActiveRecording::moveBaselineToTarget()
 {
 	mTargetRecording->mMeasurements.write()->addSamples(*mBaseline.mMeasurements);
-	mTargetRecording->mRates.write()->addSamples(*mBaseline.mRates);
+	mTargetRecording->mCounts.write()->addSamples(*mBaseline.mCounts);
 	mTargetRecording->mStackTimers.write()->addSamples(*mBaseline.mStackTimers);
 	mBaseline.mMeasurements.write()->reset();
-	mBaseline.mRates.write()->reset();
+	mBaseline.mCounts.write()->reset();
 	mBaseline.mStackTimers.write()->reset();
 }
 
diff --git a/indra/llcommon/llunit.h b/indra/llcommon/llunit.h
index 2664bd77e9bfae9dc64f097ca1cea3b62d8f5eb5..090e42607e1f6d5b8c2ff08129835d83d7aced12 100644
--- a/indra/llcommon/llunit.h
+++ b/indra/llcommon/llunit.h
@@ -51,7 +51,7 @@ struct LLUnitType : public BASE_UNIT
 
 	value_t value() const
 	{
-		return convertToDerived(mValue);
+		return convertToDerived(mBaseValue);
 	}
 
 	template<typename CONVERTED_TYPE>
@@ -72,22 +72,22 @@ struct LLUnitType : public BASE_UNIT
 
 	unit_t operator + (const unit_t other) const
 	{
-		return unit_t(mValue + other.mValue);
+		return unit_t(mBaseValue + other.mBaseValue);
 	}
 
 	unit_t operator - (const unit_t other) const
 	{
-		return unit_t(mValue - other.mValue);
+		return unit_t(mBaseValue - other.mBaseValue);
 	}
 
 	unit_t operator * (value_t multiplicand) const
 	{
-		return unit_t(mValue * multiplicand);
+		return unit_t(mBaseValue * multiplicand);
 	}
 
 	unit_t operator / (value_t divisor) const
 	{
-		return unit_t(mValue / divisor);
+		return unit_t(mBaseValue / divisor);
 	}
 
 };
@@ -100,11 +100,11 @@ struct LLUnitType<STORAGE_TYPE, T, T>
 	typedef void is_unit_t;
 
 	LLUnitType()
-	:	mValue()
+	:	mBaseValue()
 	{}
 
 	explicit LLUnitType(value_t value)
-	:	mValue(value)
+	:	mBaseValue(value)
 	{}
 
 	unit_t& operator=(value_t value)
@@ -118,7 +118,7 @@ struct LLUnitType<STORAGE_TYPE, T, T>
 		return static_cast<unit_t&>(*this);
 	}
 
-	value_t value() { return mValue; }
+	value_t value() const { return mBaseValue; }
 
 	static value_t convertToBase(value_t derived_value)
 	{
@@ -132,73 +132,73 @@ struct LLUnitType<STORAGE_TYPE, T, T>
 
 	unit_t operator + (const unit_t other) const
 	{
-		return unit_t(mValue + other.mValue);
+		return unit_t(mBaseValue + other.mBaseValue);
 	}
 
 	void operator += (const unit_t other)
 	{
-		mValue += other.mValue;
+		mBaseValue += other.mBaseValue;
 	}
 
 	unit_t operator - (const unit_t other) const
 	{
-		return unit_t(mValue - other.mValue);
+		return unit_t(mBaseValue - other.mBaseValue);
 	}
 
 	void operator -= (const unit_t other)
 	{
-		mValue -= other.mValue;
+		mBaseValue -= other.mBaseValue;
 	}
 
 	unit_t operator * (value_t multiplicand) const
 	{
-		return unit_t(mValue * multiplicand);
+		return unit_t(mBaseValue * multiplicand);
 	}
 
 	void operator *= (value_t multiplicand)
 	{
-		mValue *= multiplicand;
+		mBaseValue *= multiplicand;
 	}
 
 	unit_t operator / (value_t divisor) const
 	{
-		return unit_t(mValue / divisor);
+		return unit_t(mBaseValue / divisor);
 	}
 
 	void operator /= (value_t divisor)
 	{
-		mValue /= divisor;
+		mBaseValue /= divisor;
 	}
 
 protected:
 	void setBaseValue(value_t value)
 	{
-		mValue = value;
+		mBaseValue = value;
 	}
 
-	value_t mValue;
+	value_t mBaseValue;
 };
 
-#define LL_DECLARE_BASE_UNIT(unit_name)                 \
-	template<typename STORAGE_TYPE>                     \
-	struct unit_name : public LLUnitType<STORAGE_TYPE, unit_name<STORAGE_TYPE> >            \
-	{                                                   \
-		typedef unit_name<STORAGE_TYPE> base_unit_t;                                        \
-		typedef STORAGE_TYPE			storage_t;			                                \
+#define LL_DECLARE_BASE_UNIT(unit_name)                                                     \
+	struct unit_name : public LLUnitType<F64, unit_name>									\
+	{                                                                                       \
+		typedef unit_name base_unit_t;                                                      \
+		typedef LLUnitType<F64, unit_name> unit_t;						                    \
+		typedef F64			storage_t;			                                            \
 	                                                                                        \
-		unit_name(STORAGE_TYPE value)                   \
+		unit_name(F64 value)                                                                \
 		:	LLUnitType(value)                                                               \
-		{}                                              \
-		                                                \
-		unit_name()                                     \
-		{}                                              \
-		                                                \
+		{}                                                                                  \
+		                                                                                    \
+		unit_name()                                                                         \
+		{}                                                                                  \
+		                                                                                    \
 		template <typename SOURCE_STORAGE_TYPE, typename SOURCE_TYPE>                       \
 		unit_name(const LLUnitType<SOURCE_STORAGE_TYPE, unit_name, SOURCE_TYPE>& source)    \
-		{                                               \
-			setBaseValue(source.unit_t::value());												\
-		}                                               \
-		                                                \
+		{                                                                                   \
+			setBaseValue((F64)source.unit_name::unit_t::value());				            \
+		}                                                                                   \
+		                                                                                    \
 		using LLUnitType::operator +;	                                                    \
 		using LLUnitType::operator +=;														\
 		using LLUnitType::operator -;														\
@@ -209,36 +209,36 @@ struct LLUnitType<STORAGE_TYPE, T, T>
 		using LLUnitType::operator /=;														\
 	};
 
-#define LL_DECLARE_DERIVED_UNIT(base_unit, derived_unit, conversion_factor)                   \
-	template<typename STORAGE_TYPE>                                                           \
-	struct derived_unit : public LLUnitType<STORAGE_TYPE, base_unit<STORAGE_TYPE>, derived_unit<STORAGE_TYPE> >     \
-	{                                                                                         \
-		typedef base_unit<STORAGE_TYPE> base_unit_t;                                                                \
-		typedef STORAGE_TYPE			storage_t;							                                        \
-		                                                                                                            \
-		derived_unit(value_t value)                                                           \
-		:	LLUnitType(value)                                                                                       \
-		{}                                                                                    \
-		                                                                                      \
-		derived_unit()                                                                        \
-		{}                                                                                    \
-		                                                                                      \
-		template <typename SOURCE_STORAGE_TYPE, typename SOURCE_TYPE>                                               \
-		derived_unit(const LLUnitType<SOURCE_STORAGE_TYPE, base_unit<STORAGE_TYPE>, SOURCE_TYPE>& source)           \
-		{                                                                                     \
-			setBaseValue(source.base_unit_t::value());																\
-		}                                                                                     \
-		                                                                                      \
-		static F32 conversionToBaseFactor() { return (F32)(conversion_factor); }              \
-		                                                                                      \
-		using LLUnitType::operator +;	                                                                            \
-		using LLUnitType::operator +=;                                                                              \
-		using LLUnitType::operator -;                                                                               \
-		using LLUnitType::operator -=;                                                                              \
-		using LLUnitType::operator *;                                                                               \
-		using LLUnitType::operator *=;                                                                              \
-		using LLUnitType::operator /;                                                                               \
-		using LLUnitType::operator /=;                                                                              \
+#define LL_DECLARE_DERIVED_UNIT(base_unit, derived_unit, conversion_factor)                 \
+	struct derived_unit : public LLUnitType<F64, base_unit, derived_unit>                   \
+	{                                                                                       \
+		typedef base_unit base_unit_t;                                                      \
+		typedef LLUnitType<F64, base_unit, derived_unit> unit_t;				            \
+		typedef F64			storage_t;							                            \
+		                                                                                    \
+		derived_unit(value_t value)                                                         \
+		:	LLUnitType(value)                                                               \
+		{}                                                                                  \
+		                                                                                    \
+		derived_unit()                                                                      \
+		{}                                                                                  \
+		                                                                                    \
+		template <typename SOURCE_STORAGE_TYPE, typename SOURCE_TYPE>                       \
+		derived_unit(const LLUnitType<SOURCE_STORAGE_TYPE, base_unit, SOURCE_TYPE>& source) \
+		{                                                                                   \
+			setBaseValue((F64)source.base_unit::unit_t::value());						    \
+		}                                                                                   \
+		                                                                                    \
+		static F32 conversionToBaseFactor() { return (F32)(conversion_factor); }            \
+		                                                                                    \
+		using LLUnitType::operator +;	                                                    \
+		using LLUnitType::operator +=;                                                      \
+		using LLUnitType::operator -;                                                       \
+		using LLUnitType::operator -=;                                                      \
+		using LLUnitType::operator *;                                                       \
+		using LLUnitType::operator *=;                                                      \
+		using LLUnitType::operator /;                                                       \
+		using LLUnitType::operator /=;                                                      \
 	};
 
 namespace LLUnits
@@ -248,7 +248,7 @@ namespace LLUnits
 	LL_DECLARE_DERIVED_UNIT(Bytes, Megabytes, 1024 * 1024);
 	LL_DECLARE_DERIVED_UNIT(Bytes, Gigabytes, 1024 * 1024 * 1024);
 	LL_DECLARE_DERIVED_UNIT(Bytes, Bits,	  (1.f / 8.f));
-	LL_DECLARE_DERIVED_UNIT(Bytes, Kilobit,   (1024 / 8));
+	LL_DECLARE_DERIVED_UNIT(Bytes, Kilobits,  (1024 / 8));
 	LL_DECLARE_DERIVED_UNIT(Bytes, Megabits,  (1024 / 8));
 	LL_DECLARE_DERIVED_UNIT(Bytes, Gigabits,  (1024 * 1024 * 1024 / 8));
 
diff --git a/indra/llui/llstatbar.cpp b/indra/llui/llstatbar.cpp
index b73007e10776910e0d66616e0e4b839c760fed38..c60e5431ae38d7d114ed18c7cac07fc604319fb7 100644
--- a/indra/llui/llstatbar.cpp
+++ b/indra/llui/llstatbar.cpp
@@ -47,7 +47,7 @@ LLStatBar::LLStatBar(const Params& p)
 	  mMinBar(p.bar_min),
 	  mMaxBar(p.bar_max),
 	  mStatp(LLStat::getInstance(p.stat)),
-	  mFloatStatp(LLTrace::Rate<F32>::getInstance(p.stat)),
+	  mNewStatp(LLTrace::Count<>::getInstance(p.stat)),
 	  mTickSpacing(p.tick_spacing),
 	  mLabelSpacing(p.label_spacing),
 	  mPrecision(p.precision),
@@ -109,22 +109,25 @@ void LLStatBar::draw()
 			mean = mStatp->getMean();
 		}
 	}
-	else if (mFloatStatp)
+	else if (mNewStatp)
 	{
-		LLTrace::Recording& recording = LLTrace::get_frame_recording().getLastRecordingPeriod();
+		LLTrace::PeriodicRecording& frame_recording = LLTrace::get_frame_recording();
+		LLTrace::Recording& last_frame_recording = frame_recording.getLastRecordingPeriod(); 
+		LLTrace::Recording& windowed_frame_recording = frame_recording.getTotalRecording(); 
+
 		if (mPerSec)
 		{
-			current = recording.getPerSec(*mFloatStatp);
-			//min = recording->getMin(*mFloatStatp) / recording->getSampleTime();
-			//max = recording->getMax(*mFloatStatp) / recording->getSampleTime();
-			//mean = recording->getMean(*mFloatStatp) / recording->getSampleTime();
+			current = last_frame_recording.getPerSec(*mNewStatp);
+			//min = frame_window_recording.getMin(*mNewStatp) / frame_window_recording.getDuration();
+			//max = frame_window_recording.getMax(*mNewStatp) / frame_window_recording.getDuration();
+			mean = windowed_frame_recording.getPerSec(*mNewStatp);//frame_window_recording.getMean(*mNewStatp) / frame_window_recording.getDuration();
 		}
 		else
 		{
-			current = recording.getSum(*mFloatStatp);
-			//min = recording->getMin(*mFloatStatp);
-			//max = recording->getMax(*mFloatStatp);
-			//mean = recording->getMean(*mFloatStatp);
+			current = last_frame_recording.getSum(*mNewStatp);
+			//min = last_frame_recording.getMin(*mNewStatp);
+			//max = last_frame_recording.getMax(*mNewStatp);
+			mean = windowed_frame_recording.getSum(*mNewStatp);
 		}
 	}
 	
diff --git a/indra/llui/llstatbar.h b/indra/llui/llstatbar.h
index bfc49b920476e872b28884ab8f6bf18043d346ec..e4b0c61c428e231d00d9961265a7800559c1bba5 100644
--- a/indra/llui/llstatbar.h
+++ b/indra/llui/llstatbar.h
@@ -99,7 +99,7 @@ class LLStatBar : public LLView
 	LLTrace::PeriodicRecording* mFrameRecording;
 
 	LLStat* mStatp;
-	LLTrace::Rate<F32>* mFloatStatp;
+	LLTrace::Count<>* mNewStatp;
 
 	LLFrameTimer mUpdateTimer;
 	LLUIString mLabel;
diff --git a/indra/llui/llstatgraph.cpp b/indra/llui/llstatgraph.cpp
index 21b55c7c5afced3bd07ec059cd89cf3cc578d5bb..be3baeea76362f504618b9186b47498d106fc410 100644
--- a/indra/llui/llstatgraph.cpp
+++ b/indra/llui/llstatgraph.cpp
@@ -49,7 +49,7 @@ LLStatGraph::LLStatGraph(const Params& p)
 	mPrecision(p.precision),
 	mValue(p.value),
 	mStatp(p.stat.legacy_stat),
-	mF32Statp(p.stat.rate_stat)
+	mNewStatp(p.stat.rate_stat)
 {
 	setToolTip(p.name());
 
@@ -84,17 +84,17 @@ void LLStatGraph::draw()
 			mValue = mStatp->getMean();
 		}
 	}
-	else if (mF32Statp)
+	else if (mNewStatp)
 	{
 		LLTrace::Recording& recording = LLTrace::get_frame_recording().getLastRecordingPeriod();
 
 		if (mPerSec)
 		{
-			mValue = recording.getPerSec(*mF32Statp);
+			mValue = recording.getPerSec(*mNewStatp);
 		}
 		else
 		{
-			mValue = recording.getSum(*mF32Statp);
+			mValue = recording.getSum(*mNewStatp);
 		}
 
 	}
diff --git a/indra/llui/llstatgraph.h b/indra/llui/llstatgraph.h
index 69fc36ea52ed5a6e36725f13b0d6afa9be31fc86..54a959f49e366b53ad1fcdc7f9a43b9a07db5e1e 100644
--- a/indra/llui/llstatgraph.h
+++ b/indra/llui/llstatgraph.h
@@ -60,7 +60,7 @@ class LLStatGraph : public LLView
 	struct StatParams : public LLInitParam::ChoiceBlock<StatParams>
 	{
 		Alternative<LLStat*>				legacy_stat;
-		Alternative<LLTrace::Rate<F32>* >	rate_stat;
+		Alternative<LLTrace::Count<>* >		rate_stat;
 	};
 
 	struct Params : public LLInitParam::Block<Params, LLView::Params>
@@ -106,8 +106,7 @@ class LLStatGraph : public LLView
 	
 private:
 	LLStat*				mStatp;
-	LLTrace::Rate<F32>*	mF32Statp;
-	LLTrace::Rate<S32>*	mS32Statp;
+	LLTrace::Count<>*	mNewStatp;
 
 	BOOL mPerSec;
 
diff --git a/indra/newview/lltexturefetch.cpp b/indra/newview/lltexturefetch.cpp
index 2ce5f95b546de5f0194ec62d6b61b1e4b8c36bd9..f2caa01644e3d381a3f9659f54dbe1694856c44d 100644
--- a/indra/newview/lltexturefetch.cpp
+++ b/indra/newview/lltexturefetch.cpp
@@ -2316,7 +2316,7 @@ S32 LLTextureFetch::update(F32 max_time_ms)
 
 	if(mCurlGetRequest)
 	{
-		LLStatViewer::TEXTURE_KBIT.add<LLUnits::Bits<F32> >(mCurlGetRequest->getTotalReceivedBits());
+		LLStatViewer::TEXTURE_KBIT.add<LLUnits::Bits>(mCurlGetRequest->getTotalReceivedBits());
 		//gTextureList.sTextureBits += mCurlGetRequest->getTotalReceivedBits();
 	}
 
diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp
index 79ed093382d9dd7cec0ce28380345db0de6d37bd..ec7d91ec4f94b880f27426ccc21c0325ea43602f 100755
--- a/indra/newview/llviewermessage.cpp
+++ b/indra/newview/llviewermessage.cpp
@@ -4772,7 +4772,6 @@ void process_sim_stats(LLMessageSystem *msg, void **user_data)
 			//LLViewerStats::getInstance()->mSimAgentUPS.addValue(stat_value);
 			break;
 		case LL_SIM_STAT_FRAMEMS:
-			//LLStatViewer::SIM_.sample(stat_value);
 			LLViewerStats::getInstance()->mSimFrameMsec.addValue(stat_value);
 			break;
 		case LL_SIM_STAT_NETMS:
diff --git a/indra/newview/llviewerstats.cpp b/indra/newview/llviewerstats.cpp
index bed2dffb14f4e3c6142e474899953cc620847e25..a3d04d655a11f65867f78a8f8cff794258667f27 100755
--- a/indra/newview/llviewerstats.cpp
+++ b/indra/newview/llviewerstats.cpp
@@ -64,7 +64,7 @@
 namespace LLStatViewer
 {
 
-LLTrace::Rate<F32>	FPS("fpsstat"),
+LLTrace::Count<>	FPS("fpsstat"),
 					PACKETS_IN("packetsinstat"),
 					PACKETS_LOST("packetsloststat"),
 					PACKETS_OUT("packetsoutstat"),
@@ -90,7 +90,7 @@ LLTrace::Rate<F32>	FPS("fpsstat"),
 					FRAMETIME_DOUBLED("frametimedoubled", "Ratio of frames 2x longer than previous"),
 					TEX_BAKES("texbakes"),
 					TEX_REBAKES("texrebakes");
-LLTrace::Rate<LLUnits::Bytes<F32> >	KBIT("kbitstat"),
+LLTrace::Count<LLUnits::Kilobits>	KBIT("kbitstat"),
 									LAYERS_KBIT("layerskbitstat"),
 									OBJECT_KBIT("objectkbitstat"),
 									ASSET_KBIT("assetkbitstat"),
@@ -98,17 +98,17 @@ LLTrace::Rate<LLUnits::Bytes<F32> >	KBIT("kbitstat"),
 									ACTUAL_IN_KBIT("actualinkbit"),
 									ACTUAL_OUT_KBIT("actualoutkbit");
 
-LLTrace::Rate<LLUnits::Seconds<F32> > AVATAR_EDIT_TIME("avataredittime", "Seconds in Edit Appearence"),
-									 TOOLBOX_TIME("toolboxtime", "Seconds using Toolbox"),
-									 MOUSELOOK_TIME("mouselooktime", "Seconds in Mouselook"),
-									 FPS_10_TIME("fps10time", "Seconds below 10 FPS"),
-									 FPS_8_TIME("fps8time", "Seconds below 8 FPS"),
-									 FPS_2_TIME("fps2time", "Seconds below 2 FPS"),
-									 SIM_20_FPS_TIME("sim20fpstime", "Seconds with sim FPS below 20"),
-									 SIM_PHYSICS_20_FPS_TIME("simphysics20fpstime", "Seconds with physics FPS below 20"),
-									 LOSS_5_PERCENT_TIME("loss5percenttime", "Seconds with packet loss > 5%");
-
-LLTrace::Measurement<F32>	SIM_TIME_DILATION("simtimedilation"),
+LLTrace::Count<LLUnits::Seconds> AVATAR_EDIT_TIME("avataredittime", "Seconds in Edit Appearence"),
+								TOOLBOX_TIME("toolboxtime", "Seconds using Toolbox"),
+								MOUSELOOK_TIME("mouselooktime", "Seconds in Mouselook"),
+								FPS_10_TIME("fps10time", "Seconds below 10 FPS"),
+								FPS_8_TIME("fps8time", "Seconds below 8 FPS"),
+								FPS_2_TIME("fps2time", "Seconds below 2 FPS"),
+								SIM_20_FPS_TIME("sim20fpstime", "Seconds with sim FPS below 20"),
+								SIM_PHYSICS_20_FPS_TIME("simphysics20fpstime", "Seconds with physics FPS below 20"),
+								LOSS_5_PERCENT_TIME("loss5percenttime", "Seconds with packet loss > 5%");
+
+LLTrace::Measurement<>		SIM_TIME_DILATION("simtimedilation"),
 							SIM_FPS("simfps"),
 							SIM_PHYSICS_FPS("simphysicsfps"),
 							SIM_AGENT_UPS("simagentups"),
@@ -147,36 +147,36 @@ LLTrace::Measurement<F32>	SIM_TIME_DILATION("simtimedilation"),
 							WINDOW_WIDTH("windowwidth", "Window width"),
 							WINDOW_HEIGHT("windowheight", "Window height");
 
-LLTrace::Measurement<LLUnits::Bytes<F32> >	SIM_UNACKED_BYTES("simtotalunackedbytes"),
-											SIM_PHYSICS_MEM("physicsmemoryallocated"),
-											GL_TEX_MEM("gltexmemstat"),
-											GL_BOUND_MEM("glboundmemstat"),
-											RAW_MEM("rawmemstat"),
-											FORMATTED_MEM("formattedmemstat");
-
-
-LLTrace::Measurement<LLUnits::Seconds<F32> > SIM_PHYSICS_TIME("simsimphysicsmsec"),
-											SIM_PHYSICS_STEP_TIME("simsimphysicsstepmsec"),
-											SIM_PHYSICS_SHAPE_UPDATE_TIME("simsimphysicsshapeupdatemsec"),
-											SIM_PHYSICS_OTHER_TIME("simsimphysicsothermsec"),
-											SIM_AI_TIME("simsimaistepmsec"),
-											SIM_AGENTS_TIME("simagentmsec"),
-											SIM_IMAGES_TIME("simimagesmsec"),
-											SIM_SCRIPTS_TIME("simscriptmsec"),
-											SIM_SPARE_TIME("simsparemsec"),
-											SIM_SLEEP_TIME("simsleepmsec"),
-											SIM_PUMP_IO_TIME("simpumpiomsec"),
-											SIM_PING("simpingstat"),
-											FRAMETIME_JITTER("frametimejitter", "Average delta between successive frame times"),
-											FRAMETIME_SLEW("frametimeslew", "Average delta between frame time and mean"),
-											LOGIN_SECONDS("loginseconds", "Time between LoginRequest and LoginReply"),
-											REGION_CROSSING_TIME("regioncrossingtime", "CROSSING_AVG"),
-											FRAME_STACKTIME("framestacktime", "FRAME_SECS"),
-											UPDATE_STACKTIME("updatestacktime", "UPDATE_SECS"),
-											NETWORK_STACKTIME("networkstacktime", "NETWORK_SECS"),
-											IMAGE_STACKTIME("imagestacktime", "IMAGE_SECS"),
-											REBUILD_STACKTIME("rebuildstacktime", "REBUILD_SECS"),
-											RENDER_STACKTIME("renderstacktime", "RENDER_SECS");
+LLTrace::Measurement<LLUnits::Bytes>	SIM_UNACKED_BYTES("simtotalunackedbytes"),
+										SIM_PHYSICS_MEM("physicsmemoryallocated"),
+										GL_TEX_MEM("gltexmemstat"),
+										GL_BOUND_MEM("glboundmemstat"),
+										RAW_MEM("rawmemstat"),
+										FORMATTED_MEM("formattedmemstat");
+
+
+LLTrace::Measurement<LLUnits::Seconds> SIM_PHYSICS_TIME("simsimphysicsmsec"),
+										SIM_PHYSICS_STEP_TIME("simsimphysicsstepmsec"),
+										SIM_PHYSICS_SHAPE_UPDATE_TIME("simsimphysicsshapeupdatemsec"),
+										SIM_PHYSICS_OTHER_TIME("simsimphysicsothermsec"),
+										SIM_AI_TIME("simsimaistepmsec"),
+										SIM_AGENTS_TIME("simagentmsec"),
+										SIM_IMAGES_TIME("simimagesmsec"),
+										SIM_SCRIPTS_TIME("simscriptmsec"),
+										SIM_SPARE_TIME("simsparemsec"),
+										SIM_SLEEP_TIME("simsleepmsec"),
+										SIM_PUMP_IO_TIME("simpumpiomsec"),
+										SIM_PING("simpingstat"),
+										FRAMETIME_JITTER("frametimejitter", "Average delta between successive frame times"),
+										FRAMETIME_SLEW("frametimeslew", "Average delta between frame time and mean"),
+										LOGIN_SECONDS("loginseconds", "Time between LoginRequest and LoginReply"),
+										REGION_CROSSING_TIME("regioncrossingtime", "CROSSING_AVG"),
+										FRAME_STACKTIME("framestacktime", "FRAME_SECS"),
+										UPDATE_STACKTIME("updatestacktime", "UPDATE_SECS"),
+										NETWORK_STACKTIME("networkstacktime", "NETWORK_SECS"),
+										IMAGE_STACKTIME("imagestacktime", "IMAGE_SECS"),
+										REBUILD_STACKTIME("rebuildstacktime", "REBUILD_SECS"),
+										RENDER_STACKTIME("renderstacktime", "RENDER_SECS");
 }
 
 class StatAttributes
@@ -266,6 +266,7 @@ LLViewerStats::LLViewerStats() :
 	
 	mAgentPositionSnaps.reset();
 	mRecording.start();
+	LLTrace::get_frame_recording().start();
 }
 
 LLViewerStats::~LLViewerStats()
@@ -437,25 +438,28 @@ void update_statistics()
 	LLCircuitData *cdp = gMessageSystem->mCircuitInfo.findCircuit(gAgent.getRegion()->getHost());
 	if (cdp)
 	{
+		LLStatViewer::SIM_PING.sample<LLUnits::Seconds>(cdp->getPingDelay());
 		stats.mSimPingStat.addValue(cdp->getPingDelay());
 		gAvgSimPing = ((gAvgSimPing * (F32)gSimPingCount) + (F32)(cdp->getPingDelay())) / ((F32)gSimPingCount + 1);
 		gSimPingCount++;
 	}
 	else
 	{
+		LLUnits::Seconds i(10000);
+		LLStatViewer::SIM_PING.sample(i);//<LLUnits::Seconds<U32> >(10000);
 		stats.mSimPingStat.addValue(10000);
 	}
 
 	//stats.mFPSStat.addValue(1);
 	LLStatViewer::FPS.add(1);
 	F32 layer_bits = (F32)(gVLManager.getLandBits() + gVLManager.getWindBits() + gVLManager.getCloudBits());
-	LLStatViewer::LAYERS_KBIT.add<LLUnits::Bits<F32> >(layer_bits);
+	LLStatViewer::LAYERS_KBIT.add<LLUnits::Bits>(layer_bits);
 	//stats.mLayersKBitStat.addValue(layer_bits/1024.f);
-	LLStatViewer::OBJECT_KBIT.add<LLUnits::Bits<F32> >(gObjectBits);
+	LLStatViewer::OBJECT_KBIT.add<LLUnits::Bits>(gObjectBits);
 	//stats.mObjectKBitStat.addValue(gObjectBits/1024.f);
 	//stats.mVFSPendingOperations.addValue(LLVFile::getVFSThread()->getPending());
 	LLStatViewer::SIM_PENDING_VFS_OPERATIONS.sample(LLVFile::getVFSThread()->getPending());
-	LLStatViewer::ASSET_KBIT.add<LLUnits::Bits<F32> >(gTransferManager.getTransferBitsIn(LLTCT_ASSET));
+	LLStatViewer::ASSET_KBIT.add<LLUnits::Bits>(gTransferManager.getTransferBitsIn(LLTCT_ASSET));
 	//stats.mAssetKBitStat.addValue(gTransferManager.getTransferBitsIn(LLTCT_ASSET)/1024.f);
 	gTransferManager.resetTransferBitsIn(LLTCT_ASSET);
 
@@ -493,7 +497,7 @@ void update_statistics()
 		static LLFrameTimer texture_stats_timer;
 		if (texture_stats_timer.getElapsedTimeF32() >= texture_stats_freq)
 		{
-			gTotalTextureBytes = LLUnits::Bytes<F32>(LLViewerStats::instance().getRecording().getSum(LLStatViewer::TEXTURE_KBIT)).value();
+			gTotalTextureBytes = LLUnits::Bytes(LLViewerStats::instance().getRecording().getSum(LLStatViewer::TEXTURE_KBIT)).value();
 			texture_stats_timer.reset();
 		}
 	}
diff --git a/indra/newview/llviewerstats.h b/indra/newview/llviewerstats.h
index a164a28a59e4345fdee3b729949b69f58e456495..5412294cf2cd26ac39faf6d480f94c0ca04c5b8f 100755
--- a/indra/newview/llviewerstats.h
+++ b/indra/newview/llviewerstats.h
@@ -34,7 +34,7 @@
 
 namespace LLStatViewer
 {
-extern LLTrace::Rate<F32>					FPS,
+extern LLTrace::Count<>						FPS,
 											PACKETS_IN,
 											PACKETS_LOST,
 											PACKETS_OUT,
@@ -62,7 +62,7 @@ extern LLTrace::Rate<F32>					FPS,
 											TEX_REBAKES;
 
 
-extern LLTrace::Rate<LLUnits::Bytes<F32> >	KBIT,
+extern LLTrace::Count<LLUnits::Kilobits>	KBIT,
 											LAYERS_KBIT,
 											OBJECT_KBIT,
 											ASSET_KBIT,
@@ -70,17 +70,17 @@ extern LLTrace::Rate<LLUnits::Bytes<F32> >	KBIT,
 											ACTUAL_IN_KBIT,
 											ACTUAL_OUT_KBIT;
 
-extern LLTrace::Rate<LLUnits::Seconds<F32> > AVATAR_EDIT_TIME,
-											 TOOLBOX_TIME,
-											 MOUSELOOK_TIME,
-											 FPS_10_TIME,
-											 FPS_8_TIME,
-											 FPS_2_TIME,
-											 SIM_20_FPS_TIME,
-											 SIM_PHYSICS_20_FPS_TIME,
-											 LOSS_5_PERCENT_TIME;
-
-extern LLTrace::Measurement<F32>			SIM_TIME_DILATION,
+extern LLTrace::Count<LLUnits::Seconds>		AVATAR_EDIT_TIME,
+											TOOLBOX_TIME,
+											MOUSELOOK_TIME,
+											FPS_10_TIME,
+											FPS_8_TIME,
+											FPS_2_TIME,
+											SIM_20_FPS_TIME,
+											SIM_PHYSICS_20_FPS_TIME,
+											LOSS_5_PERCENT_TIME;
+
+extern LLTrace::Measurement<>				SIM_TIME_DILATION,
 											SIM_FPS,
 											SIM_PHYSICS_FPS,
 											SIM_AGENT_UPS,
@@ -119,36 +119,36 @@ extern LLTrace::Measurement<F32>			SIM_TIME_DILATION,
 											WINDOW_WIDTH,
 											WINDOW_HEIGHT;
 
-extern LLTrace::Measurement<LLUnits::Bytes<F32> >	SIM_UNACKED_BYTES,
-													SIM_PHYSICS_MEM,
-													GL_TEX_MEM,
-													GL_BOUND_MEM,
-													RAW_MEM,
-													FORMATTED_MEM;
-
-
-extern LLTrace::Measurement<LLUnits::Seconds<F32> > SIM_PHYSICS_TIME,
-													SIM_PHYSICS_STEP_TIME,
-													SIM_PHYSICS_SHAPE_UPDATE_TIME,
-													SIM_PHYSICS_OTHER_TIME,
-													SIM_AI_TIME,
-													SIM_AGENTS_TIME,
-													SIM_IMAGES_TIME,
-													SIM_SCRIPTS_TIME,
-													SIM_SPARE_TIME,
-													SIM_SLEEP_TIME,
-													SIM_PUMP_IO_TIME,
-													SIM_PING,
-													FRAMETIME_JITTER,
-													FRAMETIME_SLEW,
-													LOGIN_SECONDS,
-													REGION_CROSSING_TIME,
-													FRAME_STACKTIME,
-													UPDATE_STACKTIME,
-													NETWORK_STACKTIME,
-													IMAGE_STACKTIME,
-													REBUILD_STACKTIME,
-													RENDER_STACKTIME;
+extern LLTrace::Measurement<LLUnits::Bytes>	SIM_UNACKED_BYTES,
+											SIM_PHYSICS_MEM,
+											GL_TEX_MEM,
+											GL_BOUND_MEM,
+											RAW_MEM,
+											FORMATTED_MEM;
+
+
+extern LLTrace::Measurement<LLUnits::Seconds>	SIM_PHYSICS_TIME,
+												SIM_PHYSICS_STEP_TIME,
+												SIM_PHYSICS_SHAPE_UPDATE_TIME,
+												SIM_PHYSICS_OTHER_TIME,
+												SIM_AI_TIME,
+												SIM_AGENTS_TIME,
+												SIM_IMAGES_TIME,
+												SIM_SCRIPTS_TIME,
+												SIM_SPARE_TIME,
+												SIM_SLEEP_TIME,
+												SIM_PUMP_IO_TIME,
+												SIM_PING,
+												FRAMETIME_JITTER,
+												FRAMETIME_SLEW,
+												LOGIN_SECONDS,
+												REGION_CROSSING_TIME,
+												FRAME_STACKTIME,
+												UPDATE_STACKTIME,
+												NETWORK_STACKTIME,
+												IMAGE_STACKTIME,
+												REBUILD_STACKTIME,
+												RENDER_STACKTIME;
 }
 
 class LLViewerStats : public LLSingleton<LLViewerStats>
diff --git a/indra/newview/llviewertexturelist.cpp b/indra/newview/llviewertexturelist.cpp
index af28ea36eb82df089853a971e45a55909f7a9f83..ccfedd8881dee15ee3972cd52d9fe36a404046e4 100644
--- a/indra/newview/llviewertexturelist.cpp
+++ b/indra/newview/llviewertexturelist.cpp
@@ -1325,7 +1325,7 @@ void LLViewerTextureList::receiveImageHeader(LLMessageSystem *msg, void **user_d
 	{
 		received_size = msg->getReceiveSize() ;		
 	}
-	LLStatViewer::TEXTURE_KBIT.add<LLUnits::Bytes<F32> >(received_size);
+	LLStatViewer::TEXTURE_KBIT.add<LLUnits::Bytes>(received_size);
 	LLStatViewer::TEXTURE_PACKETS.add(1);
 	
 	U8 codec;
@@ -1399,7 +1399,7 @@ void LLViewerTextureList::receiveImagePacket(LLMessageSystem *msg, void **user_d
 		received_size = msg->getReceiveSize() ;		
 	}
 
-	LLStatViewer::TEXTURE_KBIT.add<LLUnits::Bytes<F32> >(received_size);
+	LLStatViewer::TEXTURE_KBIT.add<LLUnits::Bytes>(received_size);
 	LLStatViewer::TEXTURE_PACKETS.add(1);
 	
 	//llprintline("Start decode, image header...");
diff --git a/indra/newview/llworld.cpp b/indra/newview/llworld.cpp
index 056132c165ec4127ce4f8d1baf06467e734f4bce..9e495c46b11c0665911d6639881b7a61c0d896ee 100644
--- a/indra/newview/llworld.cpp
+++ b/indra/newview/llworld.cpp
@@ -703,11 +703,11 @@ void LLWorld::updateNetStats()
 	S32 actual_in_bits = gMessageSystem->mPacketRing.getAndResetActualInBits();
 	S32 actual_out_bits = gMessageSystem->mPacketRing.getAndResetActualOutBits();
 
-	LLStatViewer::ACTUAL_IN_KBIT.add<LLUnits::Bits<F32> >(actual_in_bits);
-	LLStatViewer::ACTUAL_OUT_KBIT.add<LLUnits::Bits<F32> >(actual_out_bits);
+	LLStatViewer::ACTUAL_IN_KBIT.add<LLUnits::Bits>(actual_in_bits);
+	LLStatViewer::ACTUAL_OUT_KBIT.add<LLUnits::Bits>(actual_out_bits);
 	//LLViewerStats::getInstance()->mActualInKBitStat.addValue(actual_in_bits/1024.f);
 	//LLViewerStats::getInstance()->mActualOutKBitStat.addValue(actual_out_bits/1024.f);
-	LLStatViewer::KBIT.add<LLUnits::Bits<F32> >(bits);
+	LLStatViewer::KBIT.add<LLUnits::Bits>(bits);
 	//LLViewerStats::getInstance()->mKBitStat.addValue(bits/1024.f);
 	LLStatViewer::PACKETS_IN.add(packets_in);
 	LLStatViewer::PACKETS_OUT.add(packets_out);