diff --git a/indra/llcharacter/llkeyframewalkmotion.cpp b/indra/llcharacter/llkeyframewalkmotion.cpp
index 8c9477f80dfa7fa8255babf7a44cb3f29dadbe3e..66e4b947c4b21090b506a4bf7cb41c37f46a17ea 100755
--- a/indra/llcharacter/llkeyframewalkmotion.cpp
+++ b/indra/llcharacter/llkeyframewalkmotion.cpp
@@ -383,7 +383,7 @@ BOOL LLFlyAdjustMotion::onUpdate(F32 time, U8* joint_mask)
 	F32 target_roll = llclamp(ang_vel.mV[VZ], -4.f, 4.f) * roll_factor;
 
 	// roll is critically damped interpolation between current roll and angular velocity-derived target roll
-	mRoll = LLSmoothInterpolation::lerp(mRoll, target_roll, LLUnits::Milliseconds::fromValue(100));
+	mRoll = LLSmoothInterpolation::lerp(mRoll, target_roll, LLUnits::U32Milliseconds(100));
 
 	LLQuaternion roll(mRoll, LLVector3(0.f, 0.f, 1.f));
 	mPelvisState->setRotation(roll);
diff --git a/indra/llcommon/llerror.h b/indra/llcommon/llerror.h
index 781067638879a8fe9e1eca27c93e00077ba38adf..a3619559ebf8e8606fa73376704b3c21d1a461ad 100755
--- a/indra/llcommon/llerror.h
+++ b/indra/llcommon/llerror.h
@@ -308,7 +308,7 @@ typedef LLError::NoClassInfo _LL_CLASS_TO_LOG;
 #define lllog(level, once, ...)																	          \
 	do {                                                                                                  \
 		const char* tags[] = {"", ##__VA_ARGS__};													      \
-		size_t tag_count = LL_ARRAY_SIZE(tags) - 1;														  \
+		::size_t tag_count = LL_ARRAY_SIZE(tags) - 1;														  \
 		static LLError::CallSite _site(                                                                   \
 		    level, __FILE__, __LINE__, typeid(_LL_CLASS_TO_LOG), __FUNCTION__, once, &tags[1], tag_count);\
 		if (LL_UNLIKELY(_site.shouldLog()))			                                                      \
diff --git a/indra/llcommon/llfasttimer.cpp b/indra/llcommon/llfasttimer.cpp
index 8f86a1dfbcd717ade71b68997e55fecb02de1134..a91e716f1912680cbad8e696090edf84de096bf4 100755
--- a/indra/llcommon/llfasttimer.cpp
+++ b/indra/llcommon/llfasttimer.cpp
@@ -339,7 +339,7 @@ void TimeBlock::logStats()
 		}
 		call_count++;
 
-		LLUnit<F64, LLUnits::Seconds> total_time(0);
+		LLUnits::F64Seconds total_time(0);
 		LLSD sd;
 
 		{
@@ -382,11 +382,11 @@ void TimeBlock::dumpCurTimes()
 		++it)
 	{
 		TimeBlock* timerp = (*it);
-		LLUnit<F64, LLUnits::Seconds> total_time = last_frame_recording.getSum(*timerp);
+		LLUnits::F64Seconds total_time = last_frame_recording.getSum(*timerp);
 		U32 num_calls = last_frame_recording.getSum(timerp->callCount());
 
 		// Don't bother with really brief times, keep output concise
-		if (total_time < LLUnits::Milliseconds::fromValue(0.1f)) continue;
+		if (total_time < LLUnits::F32Milliseconds(0.1f)) continue;
 
 		std::ostringstream out_str;
 		TimeBlock* parent_timerp = timerp;
@@ -466,11 +466,11 @@ void TimeBlockAccumulator::reset( const TimeBlockAccumulator* other )
 	}
 }
 
-LLUnit<F64, LLUnits::Seconds> BlockTimer::getElapsedTime()
+LLUnits::F64Seconds BlockTimer::getElapsedTime()
 {
 	U64 total_time = TimeBlock::getCPUClockCount64() - mStartTime;
 
-	return LLUnits::Seconds::fromValue((F64)total_time / (F64)TimeBlock::countsPerSecond());
+	return LLUnits::F64Seconds((F64)total_time / (F64)TimeBlock::countsPerSecond());
 }
 
 
diff --git a/indra/llcommon/llfasttimer.h b/indra/llcommon/llfasttimer.h
index 73c40749edb05f4cc6a39893f04055cf04b83eec..589b9bb941a9b361f41658196d7d32ee0fd0e558 100755
--- a/indra/llcommon/llfasttimer.h
+++ b/indra/llcommon/llfasttimer.h
@@ -48,7 +48,7 @@ class BlockTimer
 	BlockTimer(TimeBlock& timer);
 	~BlockTimer();
 
-	LLUnit<F64, LLUnits::Seconds> getElapsedTime();
+	LLUnits::F64Seconds getElapsedTime();
 
 private:
 
diff --git a/indra/llcommon/lltimer.cpp b/indra/llcommon/lltimer.cpp
index a2c5f3d69977731342e11e412b7511fe849267e7..7077ea4b4f47695800849b20aef35939306377e1 100755
--- a/indra/llcommon/lltimer.cpp
+++ b/indra/llcommon/lltimer.cpp
@@ -262,7 +262,7 @@ LLUnitImplicit<U64, LLUnits::Microseconds> totalTime()
 	}
 
 	// Return the total clock tick count in microseconds.
-	return LLUnits::Microseconds::fromValue(gTotalTimeClockCount*gClocksToMicroseconds);
+	return LLUnits::U64Microseconds(gTotalTimeClockCount*gClocksToMicroseconds);
 }
 
 
diff --git a/indra/llcommon/lltraceaccumulators.h b/indra/llcommon/lltraceaccumulators.h
index ef73bd30918721391545f471daf89c6c5c856d97..4d799645261ec941b40f4888673648659c59964d 100644
--- a/indra/llcommon/lltraceaccumulators.h
+++ b/indra/llcommon/lltraceaccumulators.h
@@ -418,7 +418,7 @@ namespace LLTrace
 	class TimeBlockAccumulator
 	{
 	public:
-		typedef LLUnit<F64, LLUnits::Seconds> value_t;
+		typedef LLUnits::F64Seconds value_t;
 		typedef TimeBlockAccumulator self_t;
 
 		// fake classes that allows us to view different facets of underlying statistic
@@ -429,7 +429,7 @@ namespace LLTrace
 
 		struct SelfTimeFacet
 		{
-			typedef LLUnit<F64, LLUnits::Seconds> value_t;
+			typedef LLUnits::F64Seconds value_t;
 		};
 
 		TimeBlockAccumulator();
diff --git a/indra/llcommon/lltracerecording.cpp b/indra/llcommon/lltracerecording.cpp
index 42d97ce31446fe8972c50398261ee060fcaf2dc8..963f0cd174f071a0d435445db11445e3eac2fc5b 100644
--- a/indra/llcommon/lltracerecording.cpp
+++ b/indra/llcommon/lltracerecording.cpp
@@ -95,7 +95,7 @@ void Recording::handleReset()
 {
 	mBuffers.write()->reset();
 
-	mElapsedSeconds = LLUnits::Seconds::fromValue(0.0);
+	mElapsedSeconds = LLUnits::F64Seconds(0.0);
 	mSamplingTimer.reset();
 }
 
@@ -128,17 +128,17 @@ void Recording::appendRecording( Recording& other )
 	mElapsedSeconds += other.mElapsedSeconds;
 }
 
-LLUnit<F64, LLUnits::Seconds> Recording::getSum(const TraceType<TimeBlockAccumulator>& stat)
+LLUnits::F64Seconds Recording::getSum(const TraceType<TimeBlockAccumulator>& stat)
 {
 	const TimeBlockAccumulator& accumulator = mBuffers->mStackTimers[stat.getIndex()];
-	return LLUnits::Seconds::fromValue((F64)(accumulator.mTotalTimeCounter - accumulator.mStartTotalTimeCounter) 
+	return LLUnits::F64Seconds((F64)(accumulator.mTotalTimeCounter - accumulator.mStartTotalTimeCounter) 
 				/ (F64)LLTrace::TimeBlock::countsPerSecond());
 }
 
-LLUnit<F64, LLUnits::Seconds> Recording::getSum(const TraceType<TimeBlockAccumulator::SelfTimeFacet>& stat)
+LLUnits::F64Seconds Recording::getSum(const TraceType<TimeBlockAccumulator::SelfTimeFacet>& stat)
 {
 	const TimeBlockAccumulator& accumulator = mBuffers->mStackTimers[stat.getIndex()];
-	return LLUnits::Seconds::fromValue((F64)(accumulator.mSelfTimeCounter) / (F64)LLTrace::TimeBlock::countsPerSecond());
+	return LLUnits::F64Seconds((F64)(accumulator.mSelfTimeCounter) / (F64)LLTrace::TimeBlock::countsPerSecond());
 }
 
 
@@ -147,19 +147,19 @@ U32 Recording::getSum(const TraceType<TimeBlockAccumulator::CallCountFacet>& sta
 	return mBuffers->mStackTimers[stat.getIndex()].mCalls;
 }
 
-LLUnit<F64, LLUnits::Seconds> Recording::getPerSec(const TraceType<TimeBlockAccumulator>& stat)
+LLUnits::F64Seconds Recording::getPerSec(const TraceType<TimeBlockAccumulator>& stat)
 {
 	const TimeBlockAccumulator& accumulator = mBuffers->mStackTimers[stat.getIndex()];
 
-	return LLUnits::Seconds::fromValue((F64)(accumulator.mTotalTimeCounter - accumulator.mStartTotalTimeCounter) 
+	return LLUnits::F64Seconds((F64)(accumulator.mTotalTimeCounter - accumulator.mStartTotalTimeCounter) 
 				/ ((F64)LLTrace::TimeBlock::countsPerSecond() * mElapsedSeconds.value()));
 }
 
-LLUnit<F64, LLUnits::Seconds> Recording::getPerSec(const TraceType<TimeBlockAccumulator::SelfTimeFacet>& stat)
+LLUnits::F64Seconds Recording::getPerSec(const TraceType<TimeBlockAccumulator::SelfTimeFacet>& stat)
 {
 	const TimeBlockAccumulator& accumulator = mBuffers->mStackTimers[stat.getIndex()];
 
-	return LLUnits::Seconds::fromValue((F64)(accumulator.mSelfTimeCounter) 
+	return LLUnits::F64Seconds((F64)(accumulator.mSelfTimeCounter) 
 			/ ((F64)LLTrace::TimeBlock::countsPerSecond() * mElapsedSeconds.value()));
 }
 
@@ -168,54 +168,54 @@ F32 Recording::getPerSec(const TraceType<TimeBlockAccumulator::CallCountFacet>&
 	return (F32)mBuffers->mStackTimers[stat.getIndex()].mCalls / mElapsedSeconds.value();
 }
 
-LLUnit<F64, LLUnits::Bytes> Recording::getMin(const TraceType<MemStatAccumulator>& stat)
+LLUnits::F64Bytes Recording::getMin(const TraceType<MemStatAccumulator>& stat)
 {
-	return LLUnits::Bytes::fromValue(mBuffers->mMemStats[stat.getIndex()].mSize.getMin());
+	return LLUnits::F64Bytes(mBuffers->mMemStats[stat.getIndex()].mSize.getMin());
 }
 
-LLUnit<F64, LLUnits::Bytes> Recording::getMean(const TraceType<MemStatAccumulator>& stat)
+LLUnits::F64Bytes Recording::getMean(const TraceType<MemStatAccumulator>& stat)
 {
-	return LLUnits::Bytes::fromValue(mBuffers->mMemStats[stat.getIndex()].mSize.getMean());
+	return LLUnits::F64Bytes(mBuffers->mMemStats[stat.getIndex()].mSize.getMean());
 }
 
-LLUnit<F64, LLUnits::Bytes> Recording::getMax(const TraceType<MemStatAccumulator>& stat)
+LLUnits::F64Bytes Recording::getMax(const TraceType<MemStatAccumulator>& stat)
 {
-	return LLUnits::Bytes::fromValue(mBuffers->mMemStats[stat.getIndex()].mSize.getMax());
+	return LLUnits::F64Bytes(mBuffers->mMemStats[stat.getIndex()].mSize.getMax());
 }
 
-LLUnit<F64, LLUnits::Bytes> Recording::getStandardDeviation(const TraceType<MemStatAccumulator>& stat)
+LLUnits::F64Bytes Recording::getStandardDeviation(const TraceType<MemStatAccumulator>& stat)
 {
-	return LLUnits::Bytes::fromValue(mBuffers->mMemStats[stat.getIndex()].mSize.getStandardDeviation());
+	return LLUnits::F64Bytes(mBuffers->mMemStats[stat.getIndex()].mSize.getStandardDeviation());
 }
 
-LLUnit<F64, LLUnits::Bytes> Recording::getLastValue(const TraceType<MemStatAccumulator>& stat)
+LLUnits::F64Bytes Recording::getLastValue(const TraceType<MemStatAccumulator>& stat)
 {
-	return LLUnits::Bytes::fromValue(mBuffers->mMemStats[stat.getIndex()].mSize.getLastValue());
+	return LLUnits::F64Bytes(mBuffers->mMemStats[stat.getIndex()].mSize.getLastValue());
 }
 
-LLUnit<F64, LLUnits::Bytes> Recording::getMin(const TraceType<MemStatAccumulator::ChildMemFacet>& stat)
+LLUnits::F64Bytes Recording::getMin(const TraceType<MemStatAccumulator::ChildMemFacet>& stat)
 {
-	return LLUnits::Bytes::fromValue(mBuffers->mMemStats[stat.getIndex()].mChildSize.getMin());
+	return LLUnits::F64Bytes(mBuffers->mMemStats[stat.getIndex()].mChildSize.getMin());
 }
 
-LLUnit<F64, LLUnits::Bytes> Recording::getMean(const TraceType<MemStatAccumulator::ChildMemFacet>& stat)
+LLUnits::F64Bytes Recording::getMean(const TraceType<MemStatAccumulator::ChildMemFacet>& stat)
 {
-	return LLUnits::Bytes::fromValue(mBuffers->mMemStats[stat.getIndex()].mChildSize.getMean());
+	return LLUnits::F64Bytes(mBuffers->mMemStats[stat.getIndex()].mChildSize.getMean());
 }
 
-LLUnit<F64, LLUnits::Bytes> Recording::getMax(const TraceType<MemStatAccumulator::ChildMemFacet>& stat)
+LLUnits::F64Bytes Recording::getMax(const TraceType<MemStatAccumulator::ChildMemFacet>& stat)
 {
-	return LLUnits::Bytes::fromValue(mBuffers->mMemStats[stat.getIndex()].mChildSize.getMax());
+	return LLUnits::F64Bytes(mBuffers->mMemStats[stat.getIndex()].mChildSize.getMax());
 }
 
-LLUnit<F64, LLUnits::Bytes> Recording::getStandardDeviation(const TraceType<MemStatAccumulator::ChildMemFacet>& stat)
+LLUnits::F64Bytes Recording::getStandardDeviation(const TraceType<MemStatAccumulator::ChildMemFacet>& stat)
 {
-	return LLUnits::Bytes::fromValue(mBuffers->mMemStats[stat.getIndex()].mChildSize.getStandardDeviation());
+	return LLUnits::F64Bytes(mBuffers->mMemStats[stat.getIndex()].mChildSize.getStandardDeviation());
 }
 
-LLUnit<F64, LLUnits::Bytes> Recording::getLastValue(const TraceType<MemStatAccumulator::ChildMemFacet>& stat)
+LLUnits::F64Bytes Recording::getLastValue(const TraceType<MemStatAccumulator::ChildMemFacet>& stat)
 {
-	return LLUnits::Bytes::fromValue(mBuffers->mMemStats[stat.getIndex()].mChildSize.getLastValue());
+	return LLUnits::F64Bytes(mBuffers->mMemStats[stat.getIndex()].mChildSize.getLastValue());
 }
 
 U32 Recording::getSum(const TraceType<MemStatAccumulator::AllocationCountFacet>& stat)
@@ -427,9 +427,9 @@ void PeriodicRecording::appendPeriodicRecording( PeriodicRecording& other )
 	getCurRecording().setPlayState(getPlayState());
 }
 
-LLUnit<F64, LLUnits::Seconds> PeriodicRecording::getDuration() const
+LLUnits::F64Seconds PeriodicRecording::getDuration() const
 {
-	LLUnit<F64, LLUnits::Seconds> duration;
+	LLUnits::F64Seconds duration;
 	size_t num_periods = mRecordingPeriods.size();
 	for (size_t i = 1; i <= num_periods; i++)
 	{
diff --git a/indra/llcommon/lltracerecording.h b/indra/llcommon/lltracerecording.h
index 3722a61327c5e8cbacf123eea5987eb431c5a8c4..811786fbfae845de7e2e6f32de95176a43402bfa 100644
--- a/indra/llcommon/lltracerecording.h
+++ b/indra/llcommon/lltracerecording.h
@@ -166,12 +166,12 @@ namespace LLTrace
 		void makeUnique() { mBuffers.makeUnique(); }
 
 		// Timer accessors
-		LLUnit<F64, LLUnits::Seconds> getSum(const TraceType<TimeBlockAccumulator>& stat);
-		LLUnit<F64, LLUnits::Seconds> getSum(const TraceType<TimeBlockAccumulator::SelfTimeFacet>& stat);
+		LLUnits::F64Seconds getSum(const TraceType<TimeBlockAccumulator>& stat);
+		LLUnits::F64Seconds getSum(const TraceType<TimeBlockAccumulator::SelfTimeFacet>& stat);
 		U32 getSum(const TraceType<TimeBlockAccumulator::CallCountFacet>& stat);
 
-		LLUnit<F64, LLUnits::Seconds> getPerSec(const TraceType<TimeBlockAccumulator>& stat);
-		LLUnit<F64, LLUnits::Seconds> getPerSec(const TraceType<TimeBlockAccumulator::SelfTimeFacet>& stat);
+		LLUnits::F64Seconds getPerSec(const TraceType<TimeBlockAccumulator>& stat);
+		LLUnits::F64Seconds getPerSec(const TraceType<TimeBlockAccumulator::SelfTimeFacet>& stat);
 		F32 getPerSec(const TraceType<TimeBlockAccumulator::CallCountFacet>& stat);
 
 		// Memory accessors
@@ -295,7 +295,7 @@ namespace LLTrace
 
 		U32 getSampleCount(const TraceType<EventAccumulator>& stat);
 
-		LLUnit<F64, LLUnits::Seconds> getDuration() const { return mElapsedSeconds; }
+		LLUnits::F64Seconds getDuration() const { return mElapsedSeconds; }
 
 	protected:
 		friend class ThreadRecorder;
@@ -310,7 +310,7 @@ namespace LLTrace
 		class ThreadRecorder* getThreadRecorder(); 
 
 		LLTimer											mSamplingTimer;
-		LLUnit<F64, LLUnits::Seconds>					mElapsedSeconds;
+		LLUnits::F64Seconds					mElapsedSeconds;
 		LLCopyOnWritePointer<AccumulatorBufferGroup>	mBuffers;
 		bool											mInHandOff;
 
@@ -325,7 +325,7 @@ namespace LLTrace
 		void nextPeriod();
 		size_t getNumRecordedPeriods() { return mNumPeriods; }
 
-		LLUnit<F64, LLUnits::Seconds> getDuration() const;
+		LLUnits::F64Seconds getDuration() const;
 
 		void appendPeriodicRecording(PeriodicRecording& other);
 		void appendRecording(Recording& recording);
@@ -485,7 +485,7 @@ namespace LLTrace
 			size_t total_periods = mNumPeriods;
 			num_periods = llmin(num_periods, isStarted() ? total_periods - 1 : total_periods);
 
-			typename RelatedTypes<T::value_t>::fractional_t mean = 0;
+			typename RelatedTypes<T::value_t>::fractional_t mean(0);
 
 			for (S32 i = 1; i <= num_periods; i++)
 			{
@@ -495,9 +495,9 @@ namespace LLTrace
 					mean += recording.getSum(stat);
 				}
 			}
-			return RelatedTypes<T::value_t>::fractional_t(num_periods
-														? mean / num_periods
-														: NaN);
+			return (num_periods
+				? RelatedTypes<T::value_t>::fractional_t(mean / num_periods)
+				: RelatedTypes<T::value_t>::fractional_t(NaN));
 		}
 
 		template<typename T>
@@ -536,9 +536,9 @@ namespace LLTrace
 				}
 			}
 
-			return RelatedTypes<T::value_t>::fractional_t(num_periods
-														? mean / num_periods
-														: NaN);
+			return (num_periods
+				? RelatedTypes<T::value_t>::fractional_t(mean / num_periods)
+				: RelatedTypes<T::value_t>::fractional_t(NaN));
 		}
 
 		template<typename T>
diff --git a/indra/llcommon/llunit.h b/indra/llcommon/llunit.h
index b135be48fa37d92ffad3bd05e1fbd1f064646ef9..9a367d91824d18f4cd44069b4d9c2476adce1cea 100644
--- a/indra/llcommon/llunit.h
+++ b/indra/llcommon/llunit.h
@@ -39,7 +39,7 @@ struct LLUnit
 	typedef STORAGE_TYPE storage_t;
 
 	// value initialization
-	LLUnit(storage_t value = storage_t())
+	explicit LLUnit(storage_t value = storage_t())
 	:	mValue(value)
 	{}
 
@@ -644,6 +644,54 @@ LL_DECLARE_DERIVED_UNIT(Bytes, * 1024,			Kibibytes, "KiB");
 LL_DECLARE_DERIVED_UNIT(Kibibytes, * 1024,		Mibibytes, "MiB");
 LL_DECLARE_DERIVED_UNIT(Mibibytes, * 1024,		Gibibytes, "GiB");
 
+typedef LLUnit<F32, Bytes>     F32Bytes;
+typedef LLUnit<F32, Kilobytes> F32KiloBytes;
+typedef LLUnit<F32, Megabytes> F32MegaBytes;
+typedef LLUnit<F32, Gigabytes> F32GigaBytes;
+typedef LLUnit<F32, Kibibytes> F32KibiBytes;
+typedef LLUnit<F32, Mibibytes> F32MibiBytes;
+typedef LLUnit<F32, Gibibytes> F32GibiBytes;
+
+typedef LLUnit<F64, Bytes>     F64Bytes;
+typedef LLUnit<F64, Kilobytes> F64KiloBytes;
+typedef LLUnit<F64, Megabytes> F64MegaBytes;
+typedef LLUnit<F64, Gigabytes> F64GigaBytes;
+typedef LLUnit<F64, Kibibytes> F64KibiBytes;
+typedef LLUnit<F64, Mibibytes> F64MibiBytes;
+typedef LLUnit<F64, Gibibytes> F64GibiBytes;
+
+typedef LLUnit<S32, Bytes>     S32Bytes;
+typedef LLUnit<S32, Kilobytes> S32KiloBytes;
+typedef LLUnit<S32, Megabytes> S32MegaBytes;
+typedef LLUnit<S32, Gigabytes> S32GigaBytes;
+typedef LLUnit<S32, Kibibytes> S32KibiBytes;
+typedef LLUnit<S32, Mibibytes> S32MibiBytes;
+typedef LLUnit<S32, Gibibytes> S32GibiBytes;
+
+typedef LLUnit<U32, Bytes>     U32Bytes;
+typedef LLUnit<U32, Kilobytes> U32KiloBytes;
+typedef LLUnit<U32, Megabytes> U32MegaBytes;
+typedef LLUnit<U32, Gigabytes> U32GigaBytes;
+typedef LLUnit<U32, Kibibytes> U32KibiBytes;
+typedef LLUnit<U32, Mibibytes> U32MibiBytes;
+typedef LLUnit<U32, Gibibytes> U32GibiBytes;
+
+typedef LLUnit<S64, Bytes>     S64Bytes;
+typedef LLUnit<S64, Kilobytes> S64KiloBytes;
+typedef LLUnit<S64, Megabytes> S64MegaBytes;
+typedef LLUnit<S64, Gigabytes> S64GigaBytes;
+typedef LLUnit<S64, Kibibytes> S64KibiBytes;
+typedef LLUnit<S64, Mibibytes> S64MibiBytes;
+typedef LLUnit<S64, Gibibytes> S64GibiBytes;
+
+typedef LLUnit<U64, Bytes>     U64Bytes;
+typedef LLUnit<U64, Kilobytes> U64KiloBytes;
+typedef LLUnit<U64, Megabytes> U64MegaBytes;
+typedef LLUnit<U64, Gigabytes> U64GigaBytes;
+typedef LLUnit<U64, Kibibytes> U64KibiBytes;
+typedef LLUnit<U64, Mibibytes> U64MibiBytes;
+typedef LLUnit<U64, Gibibytes> U64GibiBytes;
+
 LL_DECLARE_DERIVED_UNIT(Bytes, / 8,				Bits, "b");
 LL_DECLARE_DERIVED_UNIT(Bits, * 1000,			Kilobits, "Kb");
 LL_DECLARE_DERIVED_UNIT(Kilobits, * 1000,		Megabits, "Mb");
@@ -652,6 +700,54 @@ LL_DECLARE_DERIVED_UNIT(Bits, * 1024,			Kibibits, "Kib");
 LL_DECLARE_DERIVED_UNIT(Kibibits, * 1024,		Mibibits, "Mib");  
 LL_DECLARE_DERIVED_UNIT(Mibibits, * 1024,		Gibibits, "Gib");
 
+typedef LLUnit<F32, Bits>     F32Bits;
+typedef LLUnit<F32, Kilobits> F32KiloBits;
+typedef LLUnit<F32, Megabits> F32MegaBits;
+typedef LLUnit<F32, Gigabits> F32GigaBits;
+typedef LLUnit<F32, Kibibits> F32KibiBits;
+typedef LLUnit<F32, Mibibits> F32MibiBits;
+typedef LLUnit<F32, Gibibits> F32GibiBits;
+
+typedef LLUnit<F64, Bits>     F64Bits;
+typedef LLUnit<F64, Kilobits> F64KiloBits;
+typedef LLUnit<F64, Megabits> F64MegaBits;
+typedef LLUnit<F64, Gigabits> F64GigaBits;
+typedef LLUnit<F64, Kibibits> F64KibiBits;
+typedef LLUnit<F64, Mibibits> F64MibiBits;
+typedef LLUnit<F64, Gibibits> F64GibiBits;
+
+typedef LLUnit<S32, Bits>     S32Bits;
+typedef LLUnit<S32, Kilobits> S32KiloBits;
+typedef LLUnit<S32, Megabits> S32MegaBits;
+typedef LLUnit<S32, Gigabits> S32GigaBits;
+typedef LLUnit<S32, Kibibits> S32KibiBits;
+typedef LLUnit<S32, Mibibits> S32MibiBits;
+typedef LLUnit<S32, Gibibits> S32GibiBits;
+
+typedef LLUnit<U32, Bits>     U32Bits;
+typedef LLUnit<U32, Kilobits> U32KiloBits;
+typedef LLUnit<U32, Megabits> U32MegaBits;
+typedef LLUnit<U32, Gigabits> U32GigaBits;
+typedef LLUnit<U32, Kibibits> U32KibiBits;
+typedef LLUnit<U32, Mibibits> U32MibiBits;
+typedef LLUnit<U32, Gibibits> U32GibiBits;
+
+typedef LLUnit<S64, Bits>     S64Bits;
+typedef LLUnit<S64, Kilobits> S64KiloBits;
+typedef LLUnit<S64, Megabits> S64MegaBits;
+typedef LLUnit<S64, Gigabits> S64GigaBits;
+typedef LLUnit<S64, Kibibits> S64KibiBits;
+typedef LLUnit<S64, Mibibits> S64MibiBits;
+typedef LLUnit<S64, Gibibits> S64GibiBits;
+
+typedef LLUnit<U64, Bits>     U64Bits;
+typedef LLUnit<U64, Kilobits> U64KiloBits;
+typedef LLUnit<U64, Megabits> U64MegaBits;
+typedef LLUnit<U64, Gigabits> U64GigaBits;
+typedef LLUnit<U64, Kibibits> U64KibiBits;
+typedef LLUnit<U64, Mibibits> U64MibiBits;
+typedef LLUnit<U64, Gibibits> U64GibiBits;
+
 LL_DECLARE_BASE_UNIT(Seconds, "s");
 LL_DECLARE_DERIVED_UNIT(Seconds, * 60,			Minutes, "min");
 LL_DECLARE_DERIVED_UNIT(Minutes, * 60,			Hours, "h");
@@ -660,11 +756,90 @@ LL_DECLARE_DERIVED_UNIT(Seconds, / 1000,		Milliseconds, "ms");
 LL_DECLARE_DERIVED_UNIT(Milliseconds, / 1000,	Microseconds, "\x09\x3cs");
 LL_DECLARE_DERIVED_UNIT(Microseconds, / 1000,	Nanoseconds, "ns");
 
+typedef LLUnit<F32, Seconds>      F32Seconds;
+typedef LLUnit<F32, Minutes>      F32Minutes;
+typedef LLUnit<F32, Hours>        F32Hours;
+typedef LLUnit<F32, Days>         F32Days;
+typedef LLUnit<F32, Milliseconds> F32Milliseconds;
+typedef LLUnit<F32, Microseconds> F32Microseconds;
+typedef LLUnit<F32, Nanoseconds>  F32Nanoseconds;
+
+typedef LLUnit<F64, Seconds>      F64Seconds;
+typedef LLUnit<F64, Minutes>      F64Minutes;
+typedef LLUnit<F64, Hours>        F64Hours;
+typedef LLUnit<F64, Days>         F64Days;
+typedef LLUnit<F64, Milliseconds> F64Milliseconds;
+typedef LLUnit<F64, Microseconds> F64Microseconds;
+typedef LLUnit<F64, Nanoseconds>  F64Nanoseconds;
+
+typedef LLUnit<S32, Seconds>      S32Seconds;
+typedef LLUnit<S32, Minutes>      S32Minutes;
+typedef LLUnit<S32, Hours>        S32Hours;
+typedef LLUnit<S32, Days>         S32Days;
+typedef LLUnit<S32, Milliseconds> S32Milliseconds;
+typedef LLUnit<S32, Microseconds> S32Microseconds;
+typedef LLUnit<S32, Nanoseconds>  S32Nanoseconds;
+
+typedef LLUnit<U32, Seconds>      U32Seconds;
+typedef LLUnit<U32, Minutes>      U32Minutes;
+typedef LLUnit<U32, Hours>        U32Hours;
+typedef LLUnit<U32, Days>         U32Days;
+typedef LLUnit<U32, Milliseconds> U32Milliseconds;
+typedef LLUnit<U32, Microseconds> U32Microseconds;
+typedef LLUnit<U32, Nanoseconds>  U32Nanoseconds;
+
+typedef LLUnit<S64, Seconds>      S64Seconds;
+typedef LLUnit<S64, Minutes>      S64Minutes;
+typedef LLUnit<S64, Hours>        S64Hours;
+typedef LLUnit<S64, Days>         S64Days;
+typedef LLUnit<S64, Milliseconds> S64Milliseconds;
+typedef LLUnit<S64, Microseconds> S64Microseconds;
+typedef LLUnit<S64, Nanoseconds>  S64Nanoseconds;
+
+typedef LLUnit<U64, Seconds>      U64Seconds;
+typedef LLUnit<U64, Minutes>      U64Minutes;
+typedef LLUnit<U64, Hours>        U64Hours;
+typedef LLUnit<U64, Days>         U64Days;
+typedef LLUnit<U64, Milliseconds> U64Milliseconds;
+typedef LLUnit<U64, Microseconds> U64Microseconds;
+typedef LLUnit<U64, Nanoseconds>  U64Nanoseconds;
+
 LL_DECLARE_BASE_UNIT(Meters, "m");
 LL_DECLARE_DERIVED_UNIT(Meters, * 1000,			Kilometers, "km");
 LL_DECLARE_DERIVED_UNIT(Meters, / 100,			Centimeters, "cm");
 LL_DECLARE_DERIVED_UNIT(Meters, / 1000,			Millimeters, "mm");
 
+typedef LLUnit<F32, Meters>      F32Meters;
+typedef LLUnit<F32, Kilometers>  F32Kilometers;
+typedef LLUnit<F32, Centimeters> F32Centimeters;
+typedef LLUnit<F32, Millimeters> F32Millimeters;
+
+typedef LLUnit<F64, Meters>      F64Meters;
+typedef LLUnit<F64, Kilometers>  F64Kilometers;
+typedef LLUnit<F64, Centimeters> F64Centimeters;
+typedef LLUnit<F64, Millimeters> F64Millimeters;
+
+typedef LLUnit<S32, Meters>      S32Meters;
+typedef LLUnit<S32, Kilometers>  S32Kilometers;
+typedef LLUnit<S32, Centimeters> S32Centimeters;
+typedef LLUnit<S32, Millimeters> S32Millimeters;
+
+typedef LLUnit<U32, Meters>      U32Meters;
+typedef LLUnit<U32, Kilometers>  U32Kilometers;
+typedef LLUnit<U32, Centimeters> U32Centimeters;
+typedef LLUnit<U32, Millimeters> U32Millimeters;
+
+typedef LLUnit<S64, Meters>      S64Meters;
+typedef LLUnit<S64, Kilometers>  S64Kilometers;
+typedef LLUnit<S64, Centimeters> S64Centimeters;
+typedef LLUnit<S64, Millimeters> S64Millimeters;
+
+typedef LLUnit<U64, Meters>      U64Meters;
+typedef LLUnit<U64, Kilometers>  U64Kilometers;
+typedef LLUnit<U64, Centimeters> U64Centimeters;
+typedef LLUnit<U64, Millimeters> U64Millimeters;
+
+// rare units
 LL_DECLARE_BASE_UNIT(Hertz, "Hz");
 LL_DECLARE_DERIVED_UNIT(Hertz, * 1000,			Kilohertz, "KHz");
 LL_DECLARE_DERIVED_UNIT(Kilohertz, * 1000,		Megahertz, "MHz");
diff --git a/indra/llcommon/tests/llunits_test.cpp b/indra/llcommon/tests/llunits_test.cpp
index b0309585aa26e71b5500f5379f336b822d18d648..8546bcbc54eb9ed483294bbe899b442d5e83d989 100644
--- a/indra/llcommon/tests/llunits_test.cpp
+++ b/indra/llcommon/tests/llunits_test.cpp
@@ -112,7 +112,7 @@ namespace tut
 	void units_object_t::test<4>()
 	{
 		// exercise math operations
-		LLUnit<F32, Quatloos> quatloos = 1.f;
+		LLUnit<F32, Quatloos> quatloos(1.f);
 		quatloos *= 4.f;
 		ensure(quatloos == 4);
 		quatloos = quatloos * 2;
diff --git a/indra/llinventory/llparcel.cpp b/indra/llinventory/llparcel.cpp
index 18154d4b0d793ca7fc7e6d401a926d317cb1a900..25c7f58c9142f2c5ba39bfa09661848eb37c4621 100755
--- a/indra/llinventory/llparcel.cpp
+++ b/indra/llinventory/llparcel.cpp
@@ -1082,7 +1082,7 @@ void LLParcel::startSale(const LLUUID& buyer_id, BOOL is_buyer_group)
 		mGroupID.setNull();
 	}
 	mSaleTimerExpires.start();
-	mSaleTimerExpires.setTimerExpirySec(LLUnits::Microseconds::fromValue(DEFAULT_USEC_SALE_TIMEOUT));
+	mSaleTimerExpires.setTimerExpirySec(LLUnits::U64Microseconds(DEFAULT_USEC_SALE_TIMEOUT));
 	mStatus = OS_LEASE_PENDING;
 	mClaimDate = time(NULL);
 	setAuctionID(0);
diff --git a/indra/llmath/llmath.h b/indra/llmath/llmath.h
index 2f838365013c59dc1c3528360a5a44cbd85b002d..fc30feaf8003ec182ea7f6e9038c61b9feeef158 100755
--- a/indra/llmath/llmath.h
+++ b/indra/llmath/llmath.h
@@ -30,6 +30,7 @@
 #include <cmath>
 #include <cstdlib>
 #include <vector>
+#include <limits>
 #include "lldefs.h"
 //#include "llstl.h" // *TODO: Remove when LLString is gone
 //#include "llstring.h" // *TODO: Remove when LLString is gone
diff --git a/indra/llrender/llimagegl.cpp b/indra/llrender/llimagegl.cpp
index 1d1beafff863c34a47acfa06258566304f503d05..6a45ebc5980b1040079061a351af1492163370a7 100644
--- a/indra/llrender/llimagegl.cpp
+++ b/indra/llrender/llimagegl.cpp
@@ -249,7 +249,7 @@ void LLImageGL::updateStats(F32 current_time)
 	LLFastTimer t(FTM_IMAGE_UPDATE_STATS);
 	sLastFrameTime = current_time;
 	sBoundTextureMemory = sCurBoundTextureMemory;
-	sCurBoundTextureMemory = LLUnits::Bytes::fromValue(0);
+	sCurBoundTextureMemory = LLUnits::S32Bytes(0);
 }
 
 //static
diff --git a/indra/llui/llstatbar.cpp b/indra/llui/llstatbar.cpp
index b564ad5ceecf2cc50803de3725b94e9b67caa6e9..5857e3282119abee6bf6d8d842582f021e42a5eb 100755
--- a/indra/llui/llstatbar.cpp
+++ b/indra/llui/llstatbar.cpp
@@ -44,12 +44,12 @@
 // rate at which to update display of value that is rapidly changing
 const F32 MEAN_VALUE_UPDATE_TIME = 1.f / 4.f; 
 // time between value changes that qualifies as a "rapid change"
-const LLUnit<F32, LLUnits::Seconds>	RAPID_CHANGE_THRESHOLD = 0.2f; 
+const LLUnits::F32Seconds	RAPID_CHANGE_THRESHOLD(0.2f); 
 // maximum number of rapid changes in RAPID_CHANGE_WINDOW before switching over to displaying the mean 
 // instead of latest value
 const S32 MAX_RAPID_CHANGES_PER_SEC = 10;
 // period of time over which to measure rapid changes
-const LLUnit<F32, LLUnits::Seconds> RAPID_CHANGE_WINDOW = 1.f;
+const LLUnits::F32Seconds RAPID_CHANGE_WINDOW(1.f);
 
 F32 calc_tick_value(F32 min, F32 max)
 {
@@ -250,12 +250,12 @@ BOOL LLStatBar::handleMouseDown(S32 x, S32 y, MASK mask)
 }
 
 template<typename T>
-S32 calc_num_rapid_changes(LLTrace::PeriodicRecording& periodic_recording, const T& stat, const LLUnit<F32, LLUnits::Seconds> time_period)
+S32 calc_num_rapid_changes(LLTrace::PeriodicRecording& periodic_recording, const T& stat, const LLUnits::F32Seconds time_period)
 {
-	LLUnit<F32, LLUnits::Seconds>	elapsed_time,
+	LLUnits::F32Seconds	elapsed_time,
 									time_since_value_changed;
 	S32 num_rapid_changes = 0;
-	const LLUnit<F32, LLUnits::Seconds>	RAPID_CHANGE_THRESHOLD = LLUnits::Seconds::fromValue(0.3f);
+	const LLUnits::F32Seconds	RAPID_CHANGE_THRESHOLD = LLUnits::F32Seconds(0.3f);
 
 	F64 last_value = periodic_recording.getPrevRecording(1).getLastValue(stat);
 	for (S32 i = 2; i < periodic_recording.getNumRecordedPeriods(); i++)
@@ -277,9 +277,9 @@ S32 calc_num_rapid_changes(LLTrace::PeriodicRecording& periodic_recording, const
 	return num_rapid_changes;
 }
 
-S32 calc_num_rapid_changes(LLTrace::PeriodicRecording& periodic_recording, const LLTrace::TraceType<LLTrace::CountAccumulator>& stat, const LLUnit<F32, LLUnits::Seconds> time_period)
+S32 calc_num_rapid_changes(LLTrace::PeriodicRecording& periodic_recording, const LLTrace::TraceType<LLTrace::CountAccumulator>& stat, const LLUnits::F32Seconds time_period)
 {
-	LLUnit<F32, LLUnits::Seconds>	elapsed_time,
+	LLUnits::F32Seconds	elapsed_time,
 		time_since_value_changed;
 	S32 num_rapid_changes = 0;
 
diff --git a/indra/newview/llconversationlog.cpp b/indra/newview/llconversationlog.cpp
index 8dd148e304a687a4764185853243d301d81b7f9f..a17a4e5e21b1ae94dacce3aa5ff10c39e79c197a 100755
--- a/indra/newview/llconversationlog.cpp
+++ b/indra/newview/llconversationlog.cpp
@@ -132,7 +132,7 @@ const std::string LLConversation::createTimestamp(const LLUnit<U64, LLUnits::Sec
 
 bool LLConversation::isOlderThan(U32 days) const
 {
-	LLUnit<U64, LLUnits::Seconds> now = time_corrected();
+	LLUnit<U64, LLUnits::Seconds> now(time_corrected());
 	LLUnit<U32, LLUnits::Days> age = now - mTime;
 
 	return age > days;
@@ -535,7 +535,7 @@ bool LLConversationLog::loadFromFile(const std::string& filename)
 				history_file_name);
 
 		ConversationParams params;
-		params.time(time)
+		params.time(LLUnits::Seconds::fromValue(time))
 			.conversation_type((SessionType)stype)
 			.has_offline_ims(has_offline_ims)
 			.conversation_name(conv_name_buffer)
diff --git a/indra/newview/llfasttimerview.cpp b/indra/newview/llfasttimerview.cpp
index bb9e474098db8a1164f9408c15b0485026f20fd6..11a9a70b18d4d6f54da4b1acc3dcc0b6b1010d51 100755
--- a/indra/newview/llfasttimerview.cpp
+++ b/indra/newview/llfasttimerview.cpp
@@ -260,7 +260,7 @@ BOOL LLFastTimerView::handleHover(S32 x, S32 y, MASK mask)
 		TimerBarRow& row = mHoverBarIndex == 0 ? mAverageTimerRow : mTimerBarRows[mScrollIndex + mHoverBarIndex - 1];
 
 		TimerBar* hover_bar = NULL;
-		LLUnit<F32, LLUnits::Seconds> mouse_time_offset = ((F32)(x - mBarRect.mLeft) / (F32)mBarRect.getWidth()) * mTotalTimeDisplay;
+		LLUnits::F32Seconds mouse_time_offset = ((F32)(x - mBarRect.mLeft) / (F32)mBarRect.getWidth()) * mTotalTimeDisplay;
 		for (int bar_index = 0, end_index = LLInstanceTracker<LLTrace::TimeBlock>::instanceCount(); 
 			bar_index < end_index; 
 			++bar_index)
@@ -996,7 +996,7 @@ void LLFastTimerView::printLineStats()
 			}
 			first = false;
 
-			LLUnit<F32, LLUnits::Seconds> ticks;
+			LLUnits::F32Seconds ticks;
 			if (mStatsIndex == 0)
 			{
 				ticks = mRecording.getPeriodMean(*idp, RUNNING_AVERAGE_WIDTH);
@@ -1029,7 +1029,7 @@ void LLFastTimerView::drawLineGraph()
 	LLLocalClipRect clip(mGraphRect);
 
 	//normalize based on last frame's maximum
-	static LLUnit<F32, LLUnits::Seconds> max_time = 0.000001;
+	static LLUnits::F32Seconds max_time(0.000001);
 	static U32 max_calls = 0;
 	static F32 alpha_interp = 0.f;
 
@@ -1060,7 +1060,7 @@ void LLFastTimerView::drawLineGraph()
 		}
 	}
 
-	LLUnit<F32, LLUnits::Seconds> cur_max = 0;
+	LLUnits::F32Seconds cur_max(0);
 	U32 cur_max_calls = 0;
 	for(timer_tree_iterator_t it = begin_timer_tree(FTM_FRAME);
 		it != end_timer_tree();
@@ -1101,7 +1101,7 @@ void LLFastTimerView::drawLineGraph()
 			j--)
 		{
 			LLTrace::Recording& recording = mRecording.getPrevRecording(j);
-			LLUnit<F32, LLUnits::Seconds> time = llmax(recording.getSum(*idp), LLUnits::Seconds::fromValue(0.000001));
+			LLUnits::F32Seconds time = llmax(recording.getSum(*idp), LLUnits::F64Seconds(0.000001));
 			U32 calls = recording.getSum(idp->callCount());
 
 			if (is_hover_timer)
@@ -1146,7 +1146,7 @@ void LLFastTimerView::drawLineGraph()
 	max_time = lerp(max_time.value(), cur_max.value(), LLSmoothInterpolation::getInterpolant(0.1f));
 	if (llabs((max_time - cur_max).value()) <= 1)
 	{
-		max_time = llmax(LLUnits::Microseconds::fromValue(1.f), LLUnits::Microseconds::fromValue(cur_max));
+		max_time = llmax(LLUnits::F32Microseconds(1.f), LLUnits::F32Microseconds(cur_max));
 	}
 
 	max_calls = llround(lerp((F32)max_calls, (F32) cur_max_calls, LLSmoothInterpolation::getInterpolant(0.1f)));
@@ -1230,7 +1230,7 @@ void LLFastTimerView::drawLegend()
 			llassert(idp->getIndex() < sTimerColors.size());
 			gl_rect_2d(bar_rect, sTimerColors[idp->getIndex()]);
 
-			LLUnit<F32, LLUnits::Milliseconds> ms = 0;
+			LLUnit<F32, LLUnits::Milliseconds> ms(0);
 			S32 calls = 0;
 			if (mHoverBarIndex > 0 && mHoverID)
 			{
@@ -1240,7 +1240,7 @@ void LLFastTimerView::drawLegend()
 			}
 			else
 			{
-				ms = LLUnit<F64, LLUnits::Seconds>(mRecording.getPeriodMean(*idp, RUNNING_AVERAGE_WIDTH));
+				ms = LLUnits::F64Seconds(mRecording.getPeriodMean(*idp, RUNNING_AVERAGE_WIDTH));
 				calls = (S32)mRecording.getPeriodMean(idp->callCount(), RUNNING_AVERAGE_WIDTH);
 			}
 
@@ -1423,7 +1423,7 @@ void LLFastTimerView::updateTotalTime()
 		mTotalTimeDisplay = mRecording.getPeriodMax(FTM_FRAME, 20);
 		break;
 	default:
-		mTotalTimeDisplay = LLUnits::Milliseconds::fromValue(100);
+		mTotalTimeDisplay = LLUnits::F64Milliseconds(100);
 		break;
 	}
 
@@ -1511,14 +1511,14 @@ void LLFastTimerView::drawBars()
 
 static LLFastTimer::DeclareTimer FTM_UPDATE_TIMER_BAR_WIDTHS("Update timer bar widths");
 
-LLUnit<F32, LLUnits::Seconds> LLFastTimerView::updateTimerBarWidths(LLTrace::TimeBlock* time_block, TimerBarRow& row, S32 history_index, U32& bar_index)
+LLUnits::F32Seconds LLFastTimerView::updateTimerBarWidths(LLTrace::TimeBlock* time_block, TimerBarRow& row, S32 history_index, U32& bar_index)
 {
 	LLFastTimer _(FTM_UPDATE_TIMER_BAR_WIDTHS);
-	const LLUnit<F32, LLUnits::Seconds> self_time = history_index == -1
+	const LLUnits::F32Seconds self_time = history_index == -1
 										? mRecording.getPeriodMean(time_block->selfTime(), RUNNING_AVERAGE_WIDTH) 
 										: mRecording.getPrevRecording(history_index).getSum(time_block->selfTime());
 
-	LLUnit<F32, LLUnits::Seconds> full_time = self_time;
+	LLUnits::F32Seconds full_time = self_time;
 
 	// reserve a spot for this bar to be rendered before its children
 	// even though we don't know its size yet
@@ -1544,7 +1544,7 @@ S32 LLFastTimerView::updateTimerBarOffsets(LLTrace::TimeBlock* time_block, Timer
 	LLFastTimer _(FTM_UPDATE_TIMER_BAR_FRACTIONS);
 
 	TimerBar& timer_bar = row.mBars[timer_bar_index];
-	const LLUnit<F32, LLUnits::Seconds> bar_time = timer_bar.mTotalTime - timer_bar.mSelfTime;
+	const LLUnits::F32Seconds bar_time = timer_bar.mTotalTime - timer_bar.mSelfTime;
 	timer_bar.mChildrenStart = timer_bar.mSelfStart + timer_bar.mSelfTime / 2;
 	timer_bar.mChildrenEnd = timer_bar.mChildrenStart + timer_bar.mTotalTime - timer_bar.mSelfTime;
 
diff --git a/indra/newview/llfasttimerview.h b/indra/newview/llfasttimerview.h
index 9d88bb2d3fed529404b2c8370f9b8f431225ba92..8f61a2fc87800ca9544c99493a4481fccd96630f 100755
--- a/indra/newview/llfasttimerview.h
+++ b/indra/newview/llfasttimerview.h
@@ -87,7 +87,7 @@ class LLFastTimerView : public LLFloater
 			mFirstChild(false),
 			mLastChild(false)
 		{}
-		LLUnit<F32, LLUnits::Seconds>	mTotalTime,
+		LLUnits::F32Seconds	mTotalTime,
 										mSelfTime,
 										mChildrenStart,
 										mChildrenEnd,
@@ -113,7 +113,7 @@ class LLFastTimerView : public LLFloater
 		TimerBar*	mBars;
 	};
 
-	LLUnit<F32, LLUnits::Seconds> updateTimerBarWidths(LLTrace::TimeBlock* time_block, TimerBarRow& row, S32 history_index, U32& bar_index);
+	LLUnits::F32Seconds updateTimerBarWidths(LLTrace::TimeBlock* time_block, TimerBarRow& row, S32 history_index, U32& bar_index);
 	S32 updateTimerBarOffsets(LLTrace::TimeBlock* time_block, TimerBarRow& row, S32 timer_bar_index = 0);
 	S32 drawBar(LLRect bar_rect, TimerBarRow& row, S32 image_width, S32 image_height, bool hovered = false, bool visible = true, S32 bar_index = 0);
 	void setPauseState(bool pause_state);
@@ -128,7 +128,7 @@ class LLFastTimerView : public LLFloater
 		DISPLAY_HZ
 	}								mDisplayType;
 	bool							mPauseHistory;
-	LLUnit<F64, LLUnits::Seconds>	mAllTimeMax,
+	LLUnits::F64Seconds	mAllTimeMax,
 									mTotalTimeDisplay;
 	S32								mScrollIndex,
 									mHoverBarIndex,
diff --git a/indra/newview/llscenemonitor.cpp b/indra/newview/llscenemonitor.cpp
index f0c7a220a4bfe9e976317a22ae79f9e0594788ed..d16c2d39845175851aeee5e578c7b76a3c8caf7c 100644
--- a/indra/newview/llscenemonitor.cpp
+++ b/indra/newview/llscenemonitor.cpp
@@ -525,7 +525,7 @@ void LLSceneMonitor::dumpToFile(std::string file_name)
 	PeriodicRecording& scene_load_recording = mSceneLoadRecording.getResults();
 	const U32 frame_count = scene_load_recording.getNumRecordedPeriods();
 
-	LLUnit<F64, LLUnits::Seconds> frame_time;
+	LLUnits::F64Seconds frame_time;
 
 	os << "Stat";
 	for (S32 frame = 1; frame <= frame_count; frame++)
diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp
index 3335ff66319458adca9bdda8d8e8a905c0e883e7..3a3731d51980121f428ac796c71a76829488dbc0 100755
--- a/indra/newview/llstartup.cpp
+++ b/indra/newview/llstartup.cpp
@@ -1429,7 +1429,7 @@ bool idle_startup()
 
 		LL_DEBUGS("AppInit") << "Initializing camera..." << LL_ENDL;
 		gFrameTime    = totalTime();
-		LLUnit<F32, LLUnits::Seconds> last_time = gFrameTimeSeconds;
+		LLUnits::F32Seconds last_time = gFrameTimeSeconds;
 		gFrameTimeSeconds = (gFrameTime - gStartTime);
 
 		gFrameIntervalSeconds = gFrameTimeSeconds - last_time;
diff --git a/indra/newview/lltexturefetch.cpp b/indra/newview/lltexturefetch.cpp
index 17703fcc217283d5e11c018dc100d755257b9a87..0e6ef7684585165e8f64355947198280df295fea 100755
--- a/indra/newview/lltexturefetch.cpp
+++ b/indra/newview/lltexturefetch.cpp
@@ -1888,12 +1888,11 @@ void LLTextureFetchWorker::onCompleted(LLCore::HttpHandle handle, LLCore::HttpRe
 	
 	if (log_to_viewer_log || log_to_sim)
 	{
-		U64 timeNow = LLTimer::getTotalTime();
 		mFetcher->mTextureInfo.setRequestStartTime(mID, mMetricsStartTime.value());
 		mFetcher->mTextureInfo.setRequestType(mID, LLTextureInfoDetails::REQUEST_TYPE_HTTP);
 		mFetcher->mTextureInfo.setRequestSize(mID, mRequestedSize);
 		mFetcher->mTextureInfo.setRequestOffset(mID, mRequestedOffset);
-		mFetcher->mTextureInfo.setRequestCompleteTimeAndLog(mID, timeNow);
+		mFetcher->mTextureInfo.setRequestCompleteTimeAndLog(mID, LLTimer::getTotalTime());
 	}
 
 	bool success = true;
@@ -2394,7 +2393,7 @@ LLTextureFetch::LLTextureFetch(LLTextureCache* cache, LLImageDecodeThread* image
 	  mFetcherLocked(FALSE)
 {
 	mMaxBandwidth = gSavedSettings.getF32("ThrottleBandwidthKBPS");
-	mTextureInfo.setUpLogging(gSavedSettings.getBOOL("LogTextureDownloadsToViewerLog"), gSavedSettings.getBOOL("LogTextureDownloadsToSimulator"), LLUnits::Bytes::fromValue(gSavedSettings.getU32("TextureLoggingThreshold")));
+	mTextureInfo.setUpLogging(gSavedSettings.getBOOL("LogTextureDownloadsToViewerLog"), gSavedSettings.getBOOL("LogTextureDownloadsToSimulator"), LLUnits::U32Bytes(gSavedSettings.getU32("TextureLoggingThreshold")));
 
 	LLTextureFetchDebugger::sDebuggerEnabled = gSavedSettings.getBOOL("TextureFetchDebuggerEnabled");
 	if(LLTextureFetchDebugger::isEnabled())
@@ -2762,7 +2761,7 @@ bool LLTextureFetch::getRequestFinished(const LLUUID& id, S32& discard_level,
 			discard_level = worker->mDecodedDiscard;
 			raw = worker->mRawImage;
 			aux = worker->mAuxImage;
-			LLUnit<F32, LLUnits::Seconds> cache_read_time = worker->mCacheReadTime;
+			LLUnits::F32Seconds cache_read_time(worker->mCacheReadTime);
 			if (cache_read_time != 0.f)
 			{
 				record(sCacheReadLatency, cache_read_time);
diff --git a/indra/newview/lltextureinfo.cpp b/indra/newview/lltextureinfo.cpp
index cd6e7ff464c0079a97615e84d7fc025c5f36bb4a..9dee92bf12d8f7e68b6aacf525ab1f12b2147cdd 100755
--- a/indra/newview/lltextureinfo.cpp
+++ b/indra/newview/lltextureinfo.cpp
@@ -219,11 +219,11 @@ void LLTextureInfo::resetTextureStatistics()
 	mCurrentStatsBundleStartTime = LLTimer::getTotalTime();
 }
 
-LLUnit<U32, LLUnits::Microseconds> LLTextureInfo::getRequestStartTime(const LLUUID& id)
+LLUnits::U32Microseconds LLTextureInfo::getRequestStartTime(const LLUUID& id)
 {
 	if (!has(id))
 	{
-		return 0;
+		return LLUnits::U32Microseconds(0);
 	}
 	else
 	{
@@ -236,7 +236,7 @@ LLUnit<U32, LLUnits::Bytes> LLTextureInfo::getRequestSize(const LLUUID& id)
 {
 	if (!has(id))
 	{
-		return 0;
+		return LLUnits::U32Bytes(0);
 	}
 	else
 	{
@@ -275,7 +275,7 @@ LLUnit<U32, LLUnits::Microseconds> LLTextureInfo::getRequestCompleteTime(const L
 {
 	if (!has(id))
 	{
-		return 0;
+		return LLUnits::U32Microseconds(0);
 	}
 	else
 	{
diff --git a/indra/newview/lltextureview.cpp b/indra/newview/lltextureview.cpp
index 501914a52f7954f47603e4fd4211323e8d4d3dd2..c94064df5f6ad8198b9f28c1993c3da40800cba4 100755
--- a/indra/newview/lltextureview.cpp
+++ b/indra/newview/lltextureview.cpp
@@ -587,7 +587,7 @@ void LLGLTexMemBar::draw()
 
 	left = 550;
 	LLUnit<F32, LLUnits::Kibibits> bandwidth = LLAppViewer::getTextureFetch()->getTextureBandwidth();
-	LLUnit<F32, LLUnits::Kibibits> max_bandwidth = gSavedSettings.getF32("ThrottleBandwidthKBPS");
+	LLUnit<F32, LLUnits::Kibibits> max_bandwidth(gSavedSettings.getF32("ThrottleBandwidthKBPS"));
 	color = bandwidth > max_bandwidth ? LLColor4::red : bandwidth > max_bandwidth*.75f ? LLColor4::yellow : text_color;
 	color[VALPHA] = text_color[VALPHA];
 	text = llformat("BW:%.0f/%.0f",bandwidth.value(), max_bandwidth.value());
diff --git a/indra/newview/llviewerassetstats.cpp b/indra/newview/llviewerassetstats.cpp
index 579567bb14d851c1d2d80d9aa9b19a19b6712b45..b176c69691e632a3c3ce259266a8749105ed3c86 100755
--- a/indra/newview/llviewerassetstats.cpp
+++ b/indra/newview/llviewerassetstats.cpp
@@ -233,7 +233,7 @@ namespace LLViewerAssetStatsFF
 		&sDequeuedAssetRequestsOther            
 	};
 
-	static LLTrace::EventStatHandle<LLUnit<F64, LLUnits::Seconds> >	sResponseAssetRequestsTempTextureHTTP   ("assetresponsetimestemptexturehttp",
+	static LLTrace::EventStatHandle<LLUnits::F64Seconds >	sResponseAssetRequestsTempTextureHTTP   ("assetresponsetimestemptexturehttp",
 																							"Time spent responding to temporary texture asset http requests"),
 													sResponseAssetRequestsTempTextureUDP    ("assetresponsetimestemptextureudp", 
 																							"Time spent responding to temporary texture asset udp requests"),
@@ -250,7 +250,7 @@ namespace LLViewerAssetStatsFF
 													sResponsedAssetRequestsOther            ("assetresponsetimesother", 
 																							"Time spent responding to other asset requests");
 
-	static LLTrace::EventStatHandle<LLUnit<F64, LLUnits::Seconds> >* sResponse[EVACCount] = {
+	static LLTrace::EventStatHandle<LLUnits::F64Seconds >* sResponse[EVACCount] = {
 		&sResponseAssetRequestsTempTextureHTTP,   
 		&sResponseAssetRequestsTempTextureUDP,  
 		&sResponseAssetRequestsNonTempTextureHTTP,
diff --git a/indra/newview/llviewerobjectlist.cpp b/indra/newview/llviewerobjectlist.cpp
index e8f68527e9e7bf1ce26798d0fe2ecc8636151bb4..a8183e76b41c923e76dd624c7fd3306fc7e9e12f 100755
--- a/indra/newview/llviewerobjectlist.cpp
+++ b/indra/newview/llviewerobjectlist.cpp
@@ -999,9 +999,9 @@ void LLViewerObjectList::update(LLAgent &agent, LLWorld &world)
 	// Time _can_ go backwards, for example if the user changes the system clock.
 	// It doesn't cause any fatal problems (just some oddness with stats), so we shouldn't assert here.
 //	llassert(time > gFrameTime);
-	LLUnit<F64, LLUnits::Seconds> time_diff = time - gFrameTime;
+	LLUnits::F64Seconds time_diff = time - gFrameTime;
 	gFrameTime	= time;
-	LLUnit<F64, LLUnits::Seconds> time_since_start = gFrameTime - gStartTime;
+	LLUnits::F64Seconds time_since_start = gFrameTime - gStartTime;
 	gFrameTimeSeconds = time_since_start;
 
 	gFrameIntervalSeconds = gFrameTimeSeconds - last_time;
diff --git a/indra/newview/llviewerstats.cpp b/indra/newview/llviewerstats.cpp
index 8cb519b0980915497cb1c272c70023eb83fe5d9e..568d4b42ca8d96d29434f4160b1ea0b97f64b5f9 100755
--- a/indra/newview/llviewerstats.cpp
+++ b/indra/newview/llviewerstats.cpp
@@ -104,7 +104,7 @@ LLTrace::CountStatHandle<LLUnit<F64, LLUnits::Kibibytes> >
 							MESSAGE_SYSTEM_DATA_IN("messagedatain", "Incoming message system network data"),
 							MESSAGE_SYSTEM_DATA_OUT("messagedataout", "Outgoing message system network data");
 
-LLTrace::CountStatHandle<LLUnit<F64, LLUnits::Seconds> >	
+LLTrace::CountStatHandle<LLUnits::F64Seconds >	
 							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%");
@@ -194,7 +194,7 @@ LLTrace::EventStatHandle<LLUnit<F64, LLUnits::Milliseconds> >	REGION_CROSSING_TI
 																REBUILD_STACKTIME("rebuildstacktime", "REBUILD_SECS"),
 																RENDER_STACKTIME("renderstacktime", "RENDER_SECS");
 	
-LLTrace::EventStatHandle<LLUnit<F64, LLUnits::Seconds> >	AVATAR_EDIT_TIME("avataredittime", "Seconds in Edit Appearance"),
+LLTrace::EventStatHandle<LLUnits::F64Seconds >	AVATAR_EDIT_TIME("avataredittime", "Seconds in Edit Appearance"),
 															TOOLBOX_TIME("toolboxtime", "Seconds using Toolbox"),
 															MOUSELOOK_TIME("mouselooktime", "Seconds in Mouselook"),
 															FPS_10_TIME("fps10time", "Seconds below 10 FPS"),
@@ -219,7 +219,7 @@ void LLViewerStats::resetStats()
 	LLViewerStats::instance().mRecording.reset();
 }
 
-void LLViewerStats::updateFrameStats(const LLUnit<F64, LLUnits::Seconds> time_diff)
+void LLViewerStats::updateFrameStats(const LLUnits::F64Seconds time_diff)
 {
 	if (getRecording().getLastValue(LLStatViewer::PACKETS_LOST_PERCENT) > 5.0)
 	{
@@ -299,13 +299,13 @@ F32		gAveLandCompression = 0.f,
 		gWorstLandCompression = 0.f, 
 		gWorstWaterCompression = 0.f;
 
-LLUnit<U32, LLUnits::Bytes>		gTotalWorldData = 0, 
-								gTotalObjectData = 0, 
-								gTotalTextureData = 0;
+LLUnits::U32Bytes				gTotalWorldData, 
+								gTotalObjectData, 
+								gTotalTextureData;
 U32								gSimPingCount = 0;
-LLUnit<U32, LLUnits::Bits>		gObjectData = 0;
+LLUnits::U32Bits				gObjectData;
 F32		gAvgSimPing = 0.f;
-LLUnit<U32, LLUnits::Bytes>		gTotalTextureBytesPerBoostLevel[LLViewerTexture::MAX_GL_IMAGE_CATEGORY] = {0};
+LLUnits::U32Bytes		gTotalTextureBytesPerBoostLevel[LLViewerTexture::MAX_GL_IMAGE_CATEGORY] = {LLUnits::U32Bytes(0)};
 
 extern U32  gVisCompared;
 extern U32  gVisTested;
@@ -345,8 +345,8 @@ void update_statistics()
 
 	typedef LLInstanceTracker<LLTrace::TraceType<LLTrace::TimeBlockAccumulator>, std::string> trace_type_t;
 
-	LLUnit<F64, LLUnits::Seconds> idle_secs = last_frame_recording.getSum(*trace_type_t::getInstance("Idle"));
-	LLUnit<F64, LLUnits::Seconds> network_secs = last_frame_recording.getSum(*trace_type_t::getInstance("Network"));
+	LLUnits::F64Seconds idle_secs = last_frame_recording.getSum(*trace_type_t::getInstance("Idle"));
+	LLUnits::F64Seconds network_secs = last_frame_recording.getSum(*trace_type_t::getInstance("Network"));
 
 	record(LLStatViewer::FRAME_STACKTIME, last_frame_recording.getSum(*trace_type_t::getInstance("Frame")));
 	record(LLStatViewer::UPDATE_STACKTIME, idle_secs - network_secs);
@@ -364,7 +364,7 @@ void update_statistics()
 	}
 	else
 	{
-		sample(LLStatViewer::SIM_PING, LLUnits::Seconds::fromValue(10));
+		sample(LLStatViewer::SIM_PING, LLUnits::U32Seconds(10));
 	}
 
 	if (LLViewerStats::instance().getRecording().getSum(LLStatViewer::FPS))
diff --git a/indra/newview/llviewerstats.h b/indra/newview/llviewerstats.h
index b58060632665502a5fb13d29f140a35c628566a2..2cea5752529a69dc50dd67df4c1513c54633f07b 100755
--- a/indra/newview/llviewerstats.h
+++ b/indra/newview/llviewerstats.h
@@ -150,7 +150,7 @@ extern LLTrace::CountStatHandle<LLUnit<F64, LLUnits::Kibibytes> >	ACTIVE_MESSAGE
 																	MESSAGE_SYSTEM_DATA_IN,
 																	MESSAGE_SYSTEM_DATA_OUT;
 
-extern LLTrace::CountStatHandle<LLUnit<F64, LLUnits::Seconds> >		SIM_20_FPS_TIME,
+extern LLTrace::CountStatHandle<LLUnits::F64Seconds >		SIM_20_FPS_TIME,
 																	SIM_PHYSICS_20_FPS_TIME,
 																	LOSS_5_PERCENT_TIME;
 
@@ -233,7 +233,7 @@ extern LLTrace::EventStatHandle<LLUnit<F64, LLUnits::Milliseconds> >	REGION_CROS
 														REBUILD_STACKTIME,
 														RENDER_STACKTIME;
 
-extern LLTrace::EventStatHandle<LLUnit<F64, LLUnits::Seconds> >	AVATAR_EDIT_TIME,
+extern LLTrace::EventStatHandle<LLUnits::F64Seconds >	AVATAR_EDIT_TIME,
 																TOOLBOX_TIME,
 																MOUSELOOK_TIME,
 																FPS_10_TIME,
@@ -254,7 +254,7 @@ class LLViewerStats : public LLSingleton<LLViewerStats>
 	LLViewerStats();
 	~LLViewerStats();
 
-	void updateFrameStats(const LLUnit<F64, LLUnits::Seconds> time_diff);
+	void updateFrameStats(const LLUnits::F64Seconds time_diff);
 	
 	void addToMessage(LLSD &body);
 
@@ -370,7 +370,7 @@ class LLViewerStats : public LLSingleton<LLViewerStats>
 private:
 	LLTrace::Recording				mRecording;
 
-	LLUnit<F64, LLUnits::Seconds> mLastTimeDiff;  // used for time stat updates
+	LLUnits::F64Seconds mLastTimeDiff;  // used for time stat updates
 };
 
 static const F32 SEND_STATS_PERIOD = 300.0f;
diff --git a/indra/newview/llviewertexture.cpp b/indra/newview/llviewertexture.cpp
index eb8faacac2c4a9f054e1aa788463a5a95bb943df..c780814e5034e165f60507ebc694c77d36639ac1 100755
--- a/indra/newview/llviewertexture.cpp
+++ b/indra/newview/llviewertexture.cpp
@@ -63,8 +63,8 @@
 ///////////////////////////////////////////////////////////////////////////////
 
 // extern
-const LLUnit<S32, LLUnits::Mibibytes> gMinVideoRam = 32;
-const LLUnit<S32, LLUnits::Mibibytes> gMaxVideoRam = 512;
+const LLUnit<S32, LLUnits::Mibibytes> gMinVideoRam(32);
+const LLUnit<S32, LLUnits::Mibibytes> gMaxVideoRam(512);
 
 
 // statics
@@ -86,11 +86,11 @@ S32 LLViewerTexture::sAuxCount = 0;
 LLFrameTimer LLViewerTexture::sEvaluationTimer;
 F32 LLViewerTexture::sDesiredDiscardBias = 0.f;
 F32 LLViewerTexture::sDesiredDiscardScale = 1.1f;
-LLUnit<S32, LLUnits::Bytes> LLViewerTexture::sBoundTextureMemory = 0;
-LLUnit<S32, LLUnits::Bytes> LLViewerTexture::sTotalTextureMemory = 0;
-LLUnit<S32, LLUnits::Mibibytes> LLViewerTexture::sMaxBoundTextureMem = 0;
-LLUnit<S32, LLUnits::Mibibytes> LLViewerTexture::sMaxTotalTextureMem = 0;
-LLUnit<S32, LLUnits::Bytes> LLViewerTexture::sMaxDesiredTextureMem = 0 ;
+LLUnit<S32, LLUnits::Bytes> LLViewerTexture::sBoundTextureMemory;
+LLUnit<S32, LLUnits::Bytes> LLViewerTexture::sTotalTextureMemory;
+LLUnit<S32, LLUnits::Mibibytes> LLViewerTexture::sMaxBoundTextureMem;
+LLUnit<S32, LLUnits::Mibibytes> LLViewerTexture::sMaxTotalTextureMem;
+LLUnit<S32, LLUnits::Bytes> LLViewerTexture::sMaxDesiredTextureMem;
 S8  LLViewerTexture::sCameraMovingDiscardBias = 0 ;
 F32 LLViewerTexture::sCameraMovingBias = 0.0f ;
 S32 LLViewerTexture::sMaxSculptRez = 128 ; //max sculpt image size
@@ -530,10 +530,10 @@ void LLViewerTexture::updateClass(const F32 velocity, const F32 angular_velocity
 		LLViewerMediaTexture::updateClass() ;
 	}
 
-	sBoundTextureMemory = LLImageGL::sBoundTextureMemory;//in bytes
-	sTotalTextureMemory = LLImageGL::sGlobalTextureMemory;//in bytes
-	sMaxBoundTextureMem = gTextureList.getMaxResidentTexMem();//in MB	
-	sMaxTotalTextureMem = gTextureList.getMaxTotalTextureMem() ;//in MB
+	sBoundTextureMemory = LLImageGL::sBoundTextureMemory;
+	sTotalTextureMemory = LLImageGL::sGlobalTextureMemory;
+	sMaxBoundTextureMem = gTextureList.getMaxResidentTexMem();
+	sMaxTotalTextureMem = gTextureList.getMaxTotalTextureMem();
 	sMaxDesiredTextureMem = sMaxTotalTextureMem ; //in Bytes, by default and when total used texture memory is small.
 
 	if (sBoundTextureMemory >= sMaxBoundTextureMem ||
diff --git a/indra/newview/llviewertexturelist.cpp b/indra/newview/llviewertexturelist.cpp
index 63debe046430dcd713da00105eb140ec1f02c4d8..2030b490e4f7ce92245f0791040028044332a2a3 100755
--- a/indra/newview/llviewertexturelist.cpp
+++ b/indra/newview/llviewertexturelist.cpp
@@ -1327,7 +1327,7 @@ void LLViewerTextureList::updateMaxResidentTexMem(S32 mem)
 	mMaxTotalTextureMemInMegaBytes = mMaxResidentTexMemInMegaBytes * 2;
 	if (mMaxResidentTexMemInMegaBytes > 640)
 	{
-		mMaxTotalTextureMemInMegaBytes -= (mMaxResidentTexMemInMegaBytes >> 2);
+		mMaxTotalTextureMemInMegaBytes -= (mMaxResidentTexMemInMegaBytes / 4);
 	}
 
 	//system mem
diff --git a/indra/newview/llviewertexturelist.h b/indra/newview/llviewertexturelist.h
index 5b6e927e32bd10a4deba5f41ca48c13985a32ce0..673b55be69d2da3880161497c71cdee9cd57e510 100755
--- a/indra/newview/llviewertexturelist.h
+++ b/indra/newview/llviewertexturelist.h
@@ -101,8 +101,8 @@ class LLViewerTextureList
 
 	void setUpdateStats(BOOL b)			{ mUpdateStats = b; }
 
-	S32	getMaxResidentTexMem() const	{ return mMaxResidentTexMemInMegaBytes; }
-	S32 getMaxTotalTextureMem() const   { return mMaxTotalTextureMemInMegaBytes;}
+	LLUnit<S32, LLUnits::Mibibytes>	getMaxResidentTexMem() const	{ return mMaxResidentTexMemInMegaBytes; }
+	LLUnit<S32, LLUnits::Mibibytes> getMaxTotalTextureMem() const   { return mMaxTotalTextureMemInMegaBytes;}
 	S32 getNumImages()					{ return mImageList.size(); }
 
 	void updateMaxResidentTexMem(S32 mem);
@@ -200,8 +200,8 @@ class LLViewerTextureList
 
 	BOOL mInitialized ;
 	BOOL mUpdateStats;
-	S32	mMaxResidentTexMemInMegaBytes;
-	S32 mMaxTotalTextureMemInMegaBytes;
+	LLUnit<S32, LLUnits::Mibibytes>	mMaxResidentTexMemInMegaBytes;
+	LLUnit<S32, LLUnits::Mibibytes> mMaxTotalTextureMemInMegaBytes;
 	LLFrameTimer mForceDecodeTimer;
 	
 private:
diff --git a/indra/newview/llviewerthrottle.cpp b/indra/newview/llviewerthrottle.cpp
index 916dec86aaf465b3ad98cdf7b4e45da290b1bbdc..22de7e150b9d7d34276c1eaada8dc9bd440b26e6 100755
--- a/indra/newview/llviewerthrottle.cpp
+++ b/indra/newview/llviewerthrottle.cpp
@@ -48,8 +48,8 @@ const F32 MIN_FRACTIONAL = 0.2f;
 const F32 MIN_BANDWIDTH = 50.f;
 const F32 MAX_BANDWIDTH = 3000.f;
 const F32 STEP_FRACTIONAL = 0.1f;
-const LLUnit<F32, LLUnits::Percent> TIGHTEN_THROTTLE_THRESHOLD = 3.0f; // packet loss % per s
-const LLUnit<F32, LLUnits::Percent> EASE_THROTTLE_THRESHOLD = 0.5f; // packet loss % per s
+const LLUnit<F32, LLUnits::Percent> TIGHTEN_THROTTLE_THRESHOLD(3.0f); // packet loss % per s
+const LLUnit<F32, LLUnits::Percent> EASE_THROTTLE_THRESHOLD(0.5f); // packet loss % per s
 const F32 DYNAMIC_UPDATE_DURATION = 5.0f; // seconds
 
 LLViewerThrottle gViewerThrottle;
diff --git a/indra/newview/llvoavatarself.cpp b/indra/newview/llvoavatarself.cpp
index 12b9744b24b482317d60647a5e3c6db050e96bbc..66206fe53e28cbf9703ffb932c2db705270e0d90 100755
--- a/indra/newview/llvoavatarself.cpp
+++ b/indra/newview/llvoavatarself.cpp
@@ -899,7 +899,7 @@ void LLVOAvatarSelf::updateRegion(LLViewerRegion *regionp)
 		if (mLastRegionHandle != 0)
 		{
 			++mRegionCrossingCount;
-			LLUnit<F64, LLUnits::Seconds> delta = mRegionCrossingTimer.getElapsedTimeF32();
+			LLUnits::F64Seconds delta(mRegionCrossingTimer.getElapsedTimeF32());
 			record(LLStatViewer::REGION_CROSSING_TIME, delta);
 
 			// Diagnostics
diff --git a/indra/newview/llvoicevivox.cpp b/indra/newview/llvoicevivox.cpp
index 5e8a771929f044f4aa5ede6612ad946e0e2d9f54..31b7e5a01c26d9552479d101edbbe1cb145f0760 100755
--- a/indra/newview/llvoicevivox.cpp
+++ b/indra/newview/llvoicevivox.cpp
@@ -6547,7 +6547,7 @@ void LLVivoxVoiceClient::expireVoiceFonts()
 	// Give a warning notification if any voice fonts are due to expire.
 	if (will_expire)
 	{
-		LLUnit<S32, LLUnits::Seconds> seconds = gSavedSettings.getS32("VoiceEffectExpiryWarningTime");
+		LLUnit<S32, LLUnits::Seconds> seconds(gSavedSettings.getS32("VoiceEffectExpiryWarningTime"));
 		args["INTERVAL"] = llformat("%d", LLUnit<S32, LLUnits::Days>(seconds).value());
 
 		LLNotificationsUtil::add("VoiceEffectsWillExpire", args);
diff --git a/indra/newview/llworld.cpp b/indra/newview/llworld.cpp
index 7e4e80240d67b9e7e08036aa0e3dc345ba0d5eea..38818e242b5d898fee3ca1bcb0a2b39265a205a1 100755
--- a/indra/newview/llworld.cpp
+++ b/indra/newview/llworld.cpp
@@ -717,7 +717,7 @@ void LLWorld::renderPropertyLines()
 
 void LLWorld::updateNetStats()
 {
-	LLUnit<F64, LLUnits::Bits> bits = 0.f;
+	LLUnits::F64Bits bits;
 	U32 packets = 0;
 
 	for (region_list_t::iterator iter = mActiveRegionList.begin();
@@ -735,8 +735,8 @@ void LLWorld::updateNetStats()
 	S32 packets_out = gMessageSystem->mPacketsOut - mLastPacketsOut;
 	S32 packets_lost = gMessageSystem->mDroppedPackets - mLastPacketsLost;
 
-	LLUnit<F64, LLUnits::Bits> actual_in_bits = gMessageSystem->mPacketRing.getAndResetActualInBits();
-	LLUnit<F64, LLUnits::Bits> actual_out_bits = gMessageSystem->mPacketRing.getAndResetActualOutBits();
+	LLUnit<F64, LLUnits::Bits> actual_in_bits(gMessageSystem->mPacketRing.getAndResetActualInBits());
+	LLUnit<F64, LLUnits::Bits> actual_out_bits(gMessageSystem->mPacketRing.getAndResetActualOutBits());
 
 	add(LLStatViewer::MESSAGE_SYSTEM_DATA_IN, actual_in_bits);
 	add(LLStatViewer::MESSAGE_SYSTEM_DATA_OUT, actual_out_bits);