diff --git a/indra/llcommon/llunit.h b/indra/llcommon/llunit.h
index 67810ffabc18fc2b7e313e2aa564b0cd8ac85e31..8fb53dd94d1b4beaa5c8a8999196a1367e229b04 100644
--- a/indra/llcommon/llunit.h
+++ b/indra/llcommon/llunit.h
@@ -46,12 +46,27 @@ struct LLIsSameType<T, T>
 
 // workaround for decltype() not existing and typeof() not working inline in gcc 4.2
 template<typename S, typename T>
-struct LLResultType
+struct LLResultTypeAdd
 {
-	typedef LL_TYPEOF(S() + T()) add_t;
-	typedef LL_TYPEOF(S() - T()) subtract_t;
-	typedef LL_TYPEOF(S() * T()) multiply_t;
-	typedef LL_TYPEOF(S() / T(1)) divide_t;
+	typedef LL_TYPEOF(S() + T()) type_t;
+};
+
+template<typename S, typename T>
+struct LLResultTypeSubtract
+{
+	typedef LL_TYPEOF(S() - T()) type_t;
+};
+
+template<typename S, typename T>
+struct LLResultTypeMultiply
+{
+	typedef LL_TYPEOF(S() * T()) type_t;
+};
+
+template<typename S, typename T>
+struct LLResultTypeDivide
+{
+	typedef LL_TYPEOF(S() / T(1)) type_t;
 };
 
 template<typename STORAGE_TYPE, typename UNIT_TYPE>
@@ -262,13 +277,25 @@ LL_FORCE_INLINE void ll_convert_units(LLUnit<S1, T1> in, LLUnit<S2, T2>& out, ..
 	}
 }
 
+template<typename T>
+struct LLStorageType
+{
+	typedef T type_t;
+};
+
+template<typename STORAGE_TYPE, typename UNIT_TYPE>
+struct LLStorageType<LLUnit<STORAGE_TYPE, UNIT_TYPE> >
+{
+	typedef STORAGE_TYPE type_t;
+};
+
 //
 // operator +
 //
 template<typename STORAGE_TYPE1, typename UNIT_TYPE1, typename STORAGE_TYPE2, typename UNIT_TYPE2>
-LLUnit<typename LLResultType<STORAGE_TYPE1, STORAGE_TYPE2>::add_t, UNIT_TYPE1> operator + (LLUnit<STORAGE_TYPE1, UNIT_TYPE1> first, LLUnit<STORAGE_TYPE2, UNIT_TYPE2> second)
+LLUnit<typename LLResultTypeAdd<STORAGE_TYPE1, STORAGE_TYPE2>::type_t, UNIT_TYPE1> operator + (LLUnit<STORAGE_TYPE1, UNIT_TYPE1> first, LLUnit<STORAGE_TYPE2, UNIT_TYPE2> second)
 {
-	LLUnit<typename LLResultType<STORAGE_TYPE1, STORAGE_TYPE2>::add_t, UNIT_TYPE1> result(first);
+	LLUnit<typename LLResultTypeAdd<STORAGE_TYPE1, STORAGE_TYPE2>::type_t, UNIT_TYPE1> result(first);
 	result += second;
 	return result;
 }
@@ -288,41 +315,42 @@ LLUnit<STORAGE_TYPE, UNIT_TYPE> operator + (UNITLESS first, LLUnit<STORAGE_TYPE,
 }
 
 template<typename STORAGE_TYPE1, typename UNIT_TYPE1, typename STORAGE_TYPE2, typename UNIT_TYPE2>
-LLUnitImplicit<typename LLResultType<STORAGE_TYPE1, STORAGE_TYPE2>::add_t, UNIT_TYPE1> operator + (LLUnitImplicit<STORAGE_TYPE1, UNIT_TYPE1> first, LLUnitImplicit<STORAGE_TYPE2, UNIT_TYPE2> second)
+LLUnitImplicit<typename LLResultTypeAdd<STORAGE_TYPE1, STORAGE_TYPE2>::type_t, UNIT_TYPE1> operator + (LLUnitImplicit<STORAGE_TYPE1, UNIT_TYPE1> first, LLUnitImplicit<STORAGE_TYPE2, UNIT_TYPE2> second)
 {
-	LLUnitImplicit<typename LLResultType<STORAGE_TYPE1, STORAGE_TYPE2>::add_t, UNIT_TYPE1> result(first);
+	LLUnitImplicit<typename LLResultTypeAdd<STORAGE_TYPE1, STORAGE_TYPE2>::type_t, UNIT_TYPE1> result(first);
 	result += second;
 	return result;
 }
 
 template<typename STORAGE_TYPE1, typename UNIT_TYPE1, typename STORAGE_TYPE2, typename UNIT_TYPE2>
-LLUnitImplicit<typename LLResultType<STORAGE_TYPE1, STORAGE_TYPE2>::add_t, UNIT_TYPE1> operator + (LLUnit<STORAGE_TYPE1, UNIT_TYPE1> first, LLUnitImplicit<STORAGE_TYPE2, UNIT_TYPE2> second)
+LLUnitImplicit<typename LLResultTypeAdd<STORAGE_TYPE1, STORAGE_TYPE2>::type_t, UNIT_TYPE1> operator + (LLUnit<STORAGE_TYPE1, UNIT_TYPE1> first, LLUnitImplicit<STORAGE_TYPE2, UNIT_TYPE2> second)
 {
-	LLUnitImplicit<typename LLResultType<STORAGE_TYPE1, STORAGE_TYPE2>::add_t, UNIT_TYPE1> result(first);
+	LLUnitImplicit<typename LLResultTypeAdd<STORAGE_TYPE1, STORAGE_TYPE2>::type_t, UNIT_TYPE1> result(first);
 	result += second;
 	return result;
 }
 
 template<typename STORAGE_TYPE1, typename UNIT_TYPE1, typename STORAGE_TYPE2, typename UNIT_TYPE2>
-LLUnitImplicit<typename LLResultType<STORAGE_TYPE1, STORAGE_TYPE2>::add_t, UNIT_TYPE1> operator + (LLUnitImplicit<STORAGE_TYPE1, UNIT_TYPE1> first, LLUnit<STORAGE_TYPE2, UNIT_TYPE2> second)
+LLUnitImplicit<typename LLResultTypeAdd<STORAGE_TYPE1, STORAGE_TYPE2>::type_t, UNIT_TYPE1> operator + (LLUnitImplicit<STORAGE_TYPE1, UNIT_TYPE1> first, LLUnit<STORAGE_TYPE2, UNIT_TYPE2> second)
 {
-	LLUnitImplicit<typename LLResultType<STORAGE_TYPE1, STORAGE_TYPE2>::add_t, UNIT_TYPE1> result(first);
+	LLUnitImplicit<typename LLResultTypeAdd<STORAGE_TYPE1, STORAGE_TYPE2>::type_t, UNIT_TYPE1> result(first);
 	result += LLUnitImplicit<STORAGE_TYPE1, UNIT_TYPE1>(second);
 	return result;
 }
 
 template<typename STORAGE_TYPE, typename UNIT_TYPE, typename UNITLESS_TYPE>
-LLUnitImplicit<typename LLResultType<STORAGE_TYPE, UNITLESS_TYPE>::add_t, UNIT_TYPE> operator + (LLUnitImplicit<STORAGE_TYPE, UNIT_TYPE> first, UNITLESS_TYPE second)
+LLUnitImplicit<typename LLResultTypeAdd<STORAGE_TYPE, typename LLStorageType<UNITLESS_TYPE>::type_t>::type_t, UNIT_TYPE> operator + (LLUnitImplicit<STORAGE_TYPE, UNIT_TYPE> first, UNITLESS_TYPE second)
 {
-	LLUnitImplicit<typename LLResultType<STORAGE_TYPE, UNITLESS_TYPE>::add_t, UNIT_TYPE> result(first);
+	LLUnitImplicit<typename LLResultTypeAdd<STORAGE_TYPE, typename LLStorageType<UNITLESS_TYPE>::type_t>::type_t, UNIT_TYPE> result(first);
 	result += second;
 	return result;
 }
 
 template<typename STORAGE_TYPE, typename UNIT_TYPE, typename UNITLESS_TYPE>
-LLUnitImplicit<typename LLResultType<UNITLESS_TYPE, STORAGE_TYPE>::add_t, UNIT_TYPE> operator + (UNITLESS_TYPE first, LLUnitImplicit<STORAGE_TYPE, UNIT_TYPE> second)
+LLUnitImplicit<typename LLResultTypeAdd<typename LLStorageType<UNITLESS_TYPE>::type_t, STORAGE_TYPE>::
+	type_t, UNIT_TYPE> operator + (UNITLESS_TYPE first, LLUnitImplicit<STORAGE_TYPE, UNIT_TYPE> second)
 {
-	LLUnitImplicit<typename LLResultType<UNITLESS_TYPE, STORAGE_TYPE>::add_t, UNIT_TYPE> result(first);
+	LLUnitImplicit<typename LLResultTypeAdd<typename LLStorageType<UNITLESS_TYPE>::type_t, STORAGE_TYPE>::type_t, UNIT_TYPE> result(first);
 	result += second;
 	return result;
 }
@@ -331,9 +359,9 @@ LLUnitImplicit<typename LLResultType<UNITLESS_TYPE, STORAGE_TYPE>::add_t, UNIT_T
 // operator -
 //
 template<typename STORAGE_TYPE1, typename UNIT_TYPE1, typename STORAGE_TYPE2, typename UNIT_TYPE2>
-LLUnit<typename LLResultType<STORAGE_TYPE1, STORAGE_TYPE2>::subtract_t, UNIT_TYPE1> operator - (LLUnit<STORAGE_TYPE1, UNIT_TYPE1> first, LLUnit<STORAGE_TYPE2, UNIT_TYPE2> second)
+LLUnit<typename LLResultTypeSubtract<STORAGE_TYPE1, STORAGE_TYPE2>::type_t, UNIT_TYPE1> operator - (LLUnit<STORAGE_TYPE1, UNIT_TYPE1> first, LLUnit<STORAGE_TYPE2, UNIT_TYPE2> second)
 {
-	LLUnit<typename LLResultType<STORAGE_TYPE1, STORAGE_TYPE2>::subtract_t, UNIT_TYPE1> result(first);
+	LLUnit<typename LLResultTypeSubtract<STORAGE_TYPE1, STORAGE_TYPE2>::type_t, UNIT_TYPE1> result(first);
 	result -= second;
 	return result;
 }
@@ -353,41 +381,41 @@ LLUnit<STORAGE_TYPE, UNIT_TYPE> operator - (UNITLESS first, LLUnit<STORAGE_TYPE,
 }
 
 template<typename STORAGE_TYPE1, typename UNIT_TYPE1, typename STORAGE_TYPE2, typename UNIT_TYPE2>
-LLUnitImplicit<typename LLResultType<STORAGE_TYPE1, STORAGE_TYPE2>::subtract_t, UNIT_TYPE1> operator - (LLUnitImplicit<STORAGE_TYPE1, UNIT_TYPE1> first, LLUnitImplicit<STORAGE_TYPE2, UNIT_TYPE2> second)
+LLUnitImplicit<typename LLResultTypeSubtract<STORAGE_TYPE1, STORAGE_TYPE2>::type_t, UNIT_TYPE1> operator - (LLUnitImplicit<STORAGE_TYPE1, UNIT_TYPE1> first, LLUnitImplicit<STORAGE_TYPE2, UNIT_TYPE2> second)
 {
-	LLUnitImplicit<typename LLResultType<STORAGE_TYPE1, STORAGE_TYPE2>::subtract_t, UNIT_TYPE1> result(first);
+	LLUnitImplicit<typename LLResultTypeSubtract<STORAGE_TYPE1, STORAGE_TYPE2>::type_t, UNIT_TYPE1> result(first);
 	result -= second;
 	return result;
 }
 
 template<typename STORAGE_TYPE1, typename UNIT_TYPE1, typename STORAGE_TYPE2, typename UNIT_TYPE2>
-LLUnitImplicit<typename LLResultType<STORAGE_TYPE1, STORAGE_TYPE2>::subtract_t, UNIT_TYPE1> operator - (LLUnit<STORAGE_TYPE1, UNIT_TYPE1> first, LLUnitImplicit<STORAGE_TYPE2, UNIT_TYPE2> second)
+LLUnitImplicit<typename LLResultTypeSubtract<STORAGE_TYPE1, STORAGE_TYPE2>::type_t, UNIT_TYPE1> operator - (LLUnit<STORAGE_TYPE1, UNIT_TYPE1> first, LLUnitImplicit<STORAGE_TYPE2, UNIT_TYPE2> second)
 {
-	LLUnitImplicit<typename LLResultType<STORAGE_TYPE1, STORAGE_TYPE2>::subtract_t, UNIT_TYPE1> result(first);
+	LLUnitImplicit<typename LLResultTypeSubtract<STORAGE_TYPE1, STORAGE_TYPE2>::type_t, UNIT_TYPE1> result(first);
 	result -= second;
 	return result;
 }
 
 template<typename STORAGE_TYPE1, typename UNIT_TYPE1, typename STORAGE_TYPE2, typename UNIT_TYPE2>
-LLUnitImplicit<typename LLResultType<STORAGE_TYPE1, STORAGE_TYPE2>::subtract_t, UNIT_TYPE1> operator - (LLUnitImplicit<STORAGE_TYPE1, UNIT_TYPE1> first, LLUnit<STORAGE_TYPE2, UNIT_TYPE2> second)
+LLUnitImplicit<typename LLResultTypeSubtract<STORAGE_TYPE1, STORAGE_TYPE2>::type_t, UNIT_TYPE1> operator - (LLUnitImplicit<STORAGE_TYPE1, UNIT_TYPE1> first, LLUnit<STORAGE_TYPE2, UNIT_TYPE2> second)
 {
-	LLUnitImplicit<typename LLResultType<STORAGE_TYPE1, STORAGE_TYPE2>::subtract_t, UNIT_TYPE1> result(first);
+	LLUnitImplicit<typename LLResultTypeSubtract<STORAGE_TYPE1, STORAGE_TYPE2>::type_t, UNIT_TYPE1> result(first);
 	result -= LLUnitImplicit<STORAGE_TYPE1, UNIT_TYPE1>(second);
 	return result;
 }
 
 template<typename STORAGE_TYPE, typename UNIT_TYPE, typename UNITLESS_TYPE>
-LLUnitImplicit<typename LLResultType<STORAGE_TYPE, UNITLESS_TYPE>::subtract_t, UNIT_TYPE> operator - (LLUnitImplicit<STORAGE_TYPE, UNIT_TYPE> first, UNITLESS_TYPE second)
+LLUnitImplicit<typename LLResultTypeSubtract<STORAGE_TYPE, typename LLStorageType<UNITLESS_TYPE>::type_t>::type_t, UNIT_TYPE> operator - (LLUnitImplicit<STORAGE_TYPE, UNIT_TYPE> first, UNITLESS_TYPE second)
 {
-	LLUnitImplicit<typename LLResultType<STORAGE_TYPE, UNITLESS_TYPE>::subtract_t, UNIT_TYPE> result(first);
+	LLUnitImplicit<typename LLResultTypeSubtract<STORAGE_TYPE, typename LLStorageType<UNITLESS_TYPE>::type_t>::type_t, UNIT_TYPE> result(first);
 	result -= second;
 	return result;
 }
 
 template<typename STORAGE_TYPE, typename UNIT_TYPE, typename UNITLESS_TYPE>
-LLUnitImplicit<typename LLResultType<UNITLESS_TYPE, STORAGE_TYPE>::subtract_t, UNIT_TYPE> operator - (UNITLESS_TYPE first, LLUnitImplicit<STORAGE_TYPE, UNIT_TYPE> second)
+LLUnitImplicit<typename LLResultTypeSubtract<typename LLStorageType<UNITLESS_TYPE>::type_t, STORAGE_TYPE>::type_t, UNIT_TYPE> operator - (UNITLESS_TYPE first, LLUnitImplicit<STORAGE_TYPE, UNIT_TYPE> second)
 {
-	LLUnitImplicit<typename LLResultType<UNITLESS_TYPE, STORAGE_TYPE>::subtract_t, UNIT_TYPE> result(first);
+	LLUnitImplicit<typename LLResultTypeSubtract<typename LLStorageType<UNITLESS_TYPE>::type_t, STORAGE_TYPE>::type_t, UNIT_TYPE> result(first);
 	result -= second;
 	return result;
 }
@@ -404,15 +432,15 @@ LLUnit<STORAGE_TYPE1, UNIT_TYPE1> operator * (LLUnit<STORAGE_TYPE1, UNIT_TYPE1>,
 }
 
 template<typename STORAGE_TYPE, typename UNIT_TYPE, typename UNITLESS_TYPE>
-LLUnit<typename LLResultType<STORAGE_TYPE, UNITLESS_TYPE>::multiply_t, UNIT_TYPE> operator * (LLUnit<STORAGE_TYPE, UNIT_TYPE> first, UNITLESS_TYPE second)
+LLUnit<typename LLResultTypeMultiply<STORAGE_TYPE, typename LLStorageType<UNITLESS_TYPE>::type_t>::type_t, UNIT_TYPE> operator * (LLUnit<STORAGE_TYPE, UNIT_TYPE> first, UNITLESS_TYPE second)
 {
-	return LLUnit<typename LLResultType<STORAGE_TYPE, UNITLESS_TYPE>::multiply_t, UNIT_TYPE>(first.value() * second);
+	return LLUnit<typename LLResultTypeMultiply<STORAGE_TYPE, typename LLStorageType<UNITLESS_TYPE>::type_t>::type_t, UNIT_TYPE>(first.value() * second);
 }
 
 template<typename STORAGE_TYPE, typename UNIT_TYPE, typename UNITLESS_TYPE>
-LLUnit<typename LLResultType<UNITLESS_TYPE, STORAGE_TYPE>::multiply_t, UNIT_TYPE> operator * (UNITLESS_TYPE first, LLUnit<STORAGE_TYPE, UNIT_TYPE> second)
+LLUnit<typename LLResultTypeMultiply<typename LLStorageType<UNITLESS_TYPE>::type_t, STORAGE_TYPE>::type_t, UNIT_TYPE> operator * (UNITLESS_TYPE first, LLUnit<STORAGE_TYPE, UNIT_TYPE> second)
 {
-	return LLUnit<typename LLResultType<UNITLESS_TYPE, STORAGE_TYPE>::multiply_t, UNIT_TYPE>(first * second.value());
+	return LLUnit<typename LLResultTypeMultiply<typename LLStorageType<UNITLESS_TYPE>::type_t, STORAGE_TYPE>::type_t, UNIT_TYPE>(first * second.value());
 }
 
 template<typename STORAGE_TYPE1, typename UNIT_TYPE1, typename STORAGE_TYPE2, typename UNIT_TYPE2>
@@ -424,15 +452,15 @@ LLUnitImplicit<STORAGE_TYPE1, UNIT_TYPE1> operator * (LLUnitImplicit<STORAGE_TYP
 }
 
 template<typename STORAGE_TYPE, typename UNIT_TYPE, typename UNITLESS_TYPE>
-LLUnitImplicit<typename LLResultType<STORAGE_TYPE, UNITLESS_TYPE>::multiply_t, UNIT_TYPE> operator * (LLUnitImplicit<STORAGE_TYPE, UNIT_TYPE> first, UNITLESS_TYPE second)
+LLUnitImplicit<typename LLResultTypeMultiply<STORAGE_TYPE, typename LLStorageType<UNITLESS_TYPE>::type_t>::type_t, UNIT_TYPE> operator * (LLUnitImplicit<STORAGE_TYPE, UNIT_TYPE> first, UNITLESS_TYPE second)
 {
-	return LLUnitImplicit<typename LLResultType<STORAGE_TYPE, UNITLESS_TYPE>::multiply_t, UNIT_TYPE>(first.value() * second);
+	return LLUnitImplicit<typename LLResultTypeMultiply<STORAGE_TYPE, UNITLESS_TYPE>::type_t, UNIT_TYPE>(first.value() * second);
 }
 
 template<typename STORAGE_TYPE, typename UNIT_TYPE, typename UNITLESS_TYPE>
-LLUnitImplicit<typename LLResultType<UNITLESS_TYPE, STORAGE_TYPE>::multiply_t, UNIT_TYPE> operator * (UNITLESS_TYPE first, LLUnitImplicit<STORAGE_TYPE, UNIT_TYPE> second)
+LLUnitImplicit<typename LLResultTypeMultiply<typename LLStorageType<UNITLESS_TYPE>::type_t, STORAGE_TYPE>::type_t, UNIT_TYPE> operator * (UNITLESS_TYPE first, LLUnitImplicit<STORAGE_TYPE, UNIT_TYPE> second)
 {
-	return LLUnitImplicit<typename LLResultType<UNITLESS_TYPE, STORAGE_TYPE>::multiply_t, UNIT_TYPE>(first * second.value());
+	return LLUnitImplicit<typename LLResultTypeMultiply<typename LLStorageType<UNITLESS_TYPE>::type_t, STORAGE_TYPE>::type_t, UNIT_TYPE>(first * second.value());
 }
 
 
@@ -441,39 +469,39 @@ LLUnitImplicit<typename LLResultType<UNITLESS_TYPE, STORAGE_TYPE>::multiply_t, U
 //
 
 template<typename STORAGE_TYPE, typename UNIT_TYPE, typename UNITLESS_TYPE>
-LLUnit<typename LLResultType<STORAGE_TYPE, UNITLESS_TYPE>::divide_t, UNIT_TYPE> operator / (LLUnit<STORAGE_TYPE, UNIT_TYPE> first, UNITLESS_TYPE second)
+LLUnit<typename LLResultTypeDivide<STORAGE_TYPE, typename LLStorageType<UNITLESS_TYPE>::type_t>::type_t, UNIT_TYPE> operator / (LLUnit<STORAGE_TYPE, UNIT_TYPE> first, UNITLESS_TYPE second)
 {
-	return LLUnit<typename LLResultType<STORAGE_TYPE, UNITLESS_TYPE>::divide_t, UNIT_TYPE>(first.value() / second);
+	return LLUnit<typename LLResultTypeDivide<STORAGE_TYPE, typename LLStorageType<UNITLESS_TYPE>::type_t>::type_t, UNIT_TYPE>(first.value() / second);
 }
 
 template<typename STORAGE_TYPE1, typename UNIT_TYPE1, typename STORAGE_TYPE2, typename UNIT_TYPE2>
-typename LLResultType<STORAGE_TYPE1, STORAGE_TYPE2>::divide_t operator / (LLUnit<STORAGE_TYPE1, UNIT_TYPE1> first, LLUnit<STORAGE_TYPE2, UNIT_TYPE2> second)
+typename LLResultTypeDivide<STORAGE_TYPE1, STORAGE_TYPE2>::type_t operator / (LLUnit<STORAGE_TYPE1, UNIT_TYPE1> first, LLUnit<STORAGE_TYPE2, UNIT_TYPE2> second)
 {
 	return first.value() / first.convert(second).value();
 }
 
 template<typename STORAGE_TYPE, typename UNIT_TYPE, typename UNITLESS_TYPE>
-LLUnitImplicit<typename LLResultType<STORAGE_TYPE, UNITLESS_TYPE>::divide_t, UNIT_TYPE> operator / (LLUnitImplicit<STORAGE_TYPE, UNIT_TYPE> first, UNITLESS_TYPE second)
+LLUnitImplicit<typename LLResultTypeDivide<STORAGE_TYPE, typename LLStorageType<UNITLESS_TYPE>::type_t>::type_t, UNIT_TYPE> operator / (LLUnitImplicit<STORAGE_TYPE, UNIT_TYPE> first, UNITLESS_TYPE second)
 {
-	return LLUnitImplicit<typename LLResultType<STORAGE_TYPE, UNITLESS_TYPE>::divide_t, UNIT_TYPE>(first.value() / second);
+	return LLUnitImplicit<typename LLResultTypeDivide<STORAGE_TYPE, typename LLStorageType<UNITLESS_TYPE>::type_t>::type_t, UNIT_TYPE>(first.value() / second);
 }
 
 template<typename STORAGE_TYPE1, typename UNIT_TYPE1, typename STORAGE_TYPE2, typename UNIT_TYPE2>
-typename LLResultType<STORAGE_TYPE1, STORAGE_TYPE2>::divide_t operator / (LLUnitImplicit<STORAGE_TYPE1, UNIT_TYPE1> first, LLUnitImplicit<STORAGE_TYPE2, UNIT_TYPE2> second)
+typename LLResultTypeDivide<STORAGE_TYPE1, STORAGE_TYPE2>::type_t operator / (LLUnitImplicit<STORAGE_TYPE1, UNIT_TYPE1> first, LLUnitImplicit<STORAGE_TYPE2, UNIT_TYPE2> second)
 {
-	return (typename LLResultType<STORAGE_TYPE1, STORAGE_TYPE2>::divide_t)(first.value() / first.convert(second).value());
+	return (typename LLResultTypeDivide<STORAGE_TYPE1, STORAGE_TYPE2>::type_t)(first.value() / first.convert(second).value());
 }
 
 template<typename STORAGE_TYPE1, typename UNIT_TYPE1, typename STORAGE_TYPE2, typename UNIT_TYPE2>
-typename LLResultType<STORAGE_TYPE1, STORAGE_TYPE2>::divide_t operator / (LLUnit<STORAGE_TYPE1, UNIT_TYPE1> first, LLUnitImplicit<STORAGE_TYPE2, UNIT_TYPE2> second)
+typename LLResultTypeDivide<STORAGE_TYPE1, STORAGE_TYPE2>::type_t operator / (LLUnit<STORAGE_TYPE1, UNIT_TYPE1> first, LLUnitImplicit<STORAGE_TYPE2, UNIT_TYPE2> second)
 {
-	return (typename LLResultType<STORAGE_TYPE1, STORAGE_TYPE2>::divide_t)(first.value() / first.convert(second).value());
+	return (typename LLResultTypeDivide<STORAGE_TYPE1, STORAGE_TYPE2>::type_t)(first.value() / first.convert(second).value());
 }
 
 template<typename STORAGE_TYPE1, typename UNIT_TYPE1, typename STORAGE_TYPE2, typename UNIT_TYPE2>
-typename LLResultType<STORAGE_TYPE1, STORAGE_TYPE2>::divide_t operator / (LLUnitImplicit<STORAGE_TYPE1, UNIT_TYPE1> first, LLUnit<STORAGE_TYPE2, UNIT_TYPE2> second)
+typename LLResultTypeDivide<STORAGE_TYPE1, STORAGE_TYPE2>::type_t operator / (LLUnitImplicit<STORAGE_TYPE1, UNIT_TYPE1> first, LLUnit<STORAGE_TYPE2, UNIT_TYPE2> second)
 {
-	return (typename LLResultType<STORAGE_TYPE1, STORAGE_TYPE2>::divide_t)(first.value() / first.convert(second).value());
+	return (typename LLResultTypeDivide<STORAGE_TYPE1, STORAGE_TYPE2>::type_t)(first.value() / first.convert(second).value());
 }
 
 //
@@ -566,25 +594,25 @@ struct LLUnitLinearOps
 	template<typename T>
 	output_t operator * (T other)
 	{
-		return typename LLResultType<INPUT_TYPE, OUTPUT_TYPE>::multiply_t(mInput) * other;
+		return typename LLResultTypeMultiply<INPUT_TYPE, OUTPUT_TYPE>::type_t(mInput) * other;
 	}
 
 	template<typename T>
 	output_t operator / (T other)
 	{
-		return typename LLResultType<INPUT_TYPE, OUTPUT_TYPE>::divide_t(mInput) / other;
+		return typename LLResultTypeDivide<INPUT_TYPE, OUTPUT_TYPE>::type_t(mInput) / other;
 	}
 
 	template<typename T>
 	output_t operator + (T other)
 	{
-		return typename LLResultType<INPUT_TYPE, OUTPUT_TYPE>::add_t(mInput) + other;
+		return typename LLResultTypeAdd<INPUT_TYPE, OUTPUT_TYPE>::type_t(mInput) + other;
 	}
 
 	template<typename T>
 	output_t operator - (T other)
 	{
-		return typename LLResultType<INPUT_TYPE, OUTPUT_TYPE>::subtract_t(mInput) - other;
+		return typename LLResultTypeSubtract<INPUT_TYPE, OUTPUT_TYPE>::type_t(mInput) - other;
 	}
 };
 
@@ -603,25 +631,25 @@ struct LLUnitInverseLinearOps
 	template<typename T>
 	output_t operator * (T other)
 	{
-		return typename LLResultType<INPUT_TYPE, OUTPUT_TYPE>::divide_t(mInput) / other;
+		return typename LLResultTypeDivide<INPUT_TYPE, OUTPUT_TYPE>::type_t(mInput) / other;
 	}
 
 	template<typename T>
 	output_t operator / (T other)
 	{
-		return typename LLResultType<INPUT_TYPE, OUTPUT_TYPE>::multiply_t(mInput) * other;
+		return typename LLResultTypeMultiply<INPUT_TYPE, OUTPUT_TYPE>::type_t(mInput) * other;
 	}
 
 	template<typename T>
 	output_t operator + (T other)
 	{
-		return typename LLResultType<INPUT_TYPE, OUTPUT_TYPE>::subtract_t(mInput) - other;
+		return typename LLResultTypeAdd<INPUT_TYPE, OUTPUT_TYPE>::type_t(mInput) - other;
 	}
 
 	template<typename T>
 	output_t operator - (T other)
 	{
-		return typename LLResultType<INPUT_TYPE, OUTPUT_TYPE>::add_t(mInput) + other;
+		return typename LLResultTypeSubtract<INPUT_TYPE, OUTPUT_TYPE>::type_t(mInput) + other;
 	}
 };
 
@@ -662,6 +690,20 @@ void ll_convert_units(LLUnit<S1, base_unit_name> in, LLUnit<S2, unit_name>& out)
 	out = LLUnit<S2, unit_name>((S2)(LLUnitInverseLinearOps<S1, S2>(in.value()) conversion_operation)); \
 }                                                                                               
 
+#define LL_DECLARE_UNIT_TYPEDEFS(ns, unit_name)                         \
+	typedef LLUnit<F32, ns::unit_name> F32##unit_name;                  \
+	typedef LLUnitImplicit<F32, ns::unit_name> F32##unit_name##Implicit;\
+	typedef LLUnit<F64, ns::unit_name> F64##unit_name;                  \
+	typedef LLUnitImplicit<F64, ns::unit_name> F64##unit_name##Implicit;\
+	typedef LLUnit<S32, ns::unit_name> S32##unit_name;                  \
+	typedef LLUnitImplicit<S32, ns::unit_name> S32##unit_name##Implicit;\
+	typedef LLUnit<S64, ns::unit_name> S64##unit_name;                  \
+	typedef LLUnitImplicit<S64, ns::unit_name> S64##unit_name##Implicit;\
+	typedef LLUnit<U32, ns::unit_name> U32##unit_name;                  \
+	typedef LLUnitImplicit<U32, ns::unit_name> U32##unit_name##Implicit;\
+	typedef LLUnit<U64, ns::unit_name> U64##unit_name;                  \
+	typedef LLUnitImplicit<U64, ns::unit_name> U64##unit_name##Implicit
+
 //
 // Unit declarations
 //
@@ -675,65 +717,10 @@ LL_DECLARE_DERIVED_UNIT(Kilobytes, * 1024,		Megabytes, "MB");
 LL_DECLARE_DERIVED_UNIT(Megabytes, * 1024,		Gigabytes, "GB");
 }
 
-typedef LLUnit<F32, LLUnits::Bytes>     F32Bytes;
-typedef LLUnit<F32, LLUnits::Kilobytes> F32Kilobytes;
-typedef LLUnit<F32, LLUnits::Megabytes> F32Megabytes;
-typedef LLUnit<F32, LLUnits::Gigabytes> F32Gigabytes;
-
-typedef LLUnitImplicit<F32, LLUnits::Bytes>     F32BytesImplicit;
-typedef LLUnitImplicit<F32, LLUnits::Kilobytes> F32KilobytesImplicit;
-typedef LLUnitImplicit<F32, LLUnits::Megabytes> F32MegabytesImplicit;
-typedef LLUnitImplicit<F32, LLUnits::Gigabytes> F32GigabytesImplicit;
-
-typedef LLUnit<F64, LLUnits::Bytes>     F64Bytes;
-typedef LLUnit<F64, LLUnits::Kilobytes> F64Kilobytes;
-typedef LLUnit<F64, LLUnits::Megabytes> F64Megabytes;
-typedef LLUnit<F64, LLUnits::Gigabytes> F64Gigabytes;
-
-typedef LLUnitImplicit<F64, LLUnits::Bytes>     F64BytesImplicit;
-typedef LLUnitImplicit<F64, LLUnits::Kilobytes> F64KilobytesImplicit;
-typedef LLUnitImplicit<F64, LLUnits::Megabytes> F64MegabytesImplicit;
-typedef LLUnitImplicit<F64, LLUnits::Gigabytes> F64GigabytesImplicit;
-
-typedef LLUnit<S32, LLUnits::Bytes>     S32Bytes;
-typedef LLUnit<S32, LLUnits::Kilobytes> S32Kilobytes;
-typedef LLUnit<S32, LLUnits::Megabytes> S32Megabytes;
-typedef LLUnit<S32, LLUnits::Gigabytes> S32Gigabytes;
-
-typedef LLUnitImplicit<S32, LLUnits::Bytes>     S32BytesImplicit;
-typedef LLUnitImplicit<S32, LLUnits::Kilobytes> S32KilobytesImplicit;
-typedef LLUnitImplicit<S32, LLUnits::Megabytes> S32MegabytesImplicit;
-typedef LLUnitImplicit<S32, LLUnits::Gigabytes> S32GigabytesImplicit;
-
-typedef LLUnit<S64, LLUnits::Bytes>     S64Bytes;
-typedef LLUnit<S64, LLUnits::Kilobytes> S64Kilobytes;
-typedef LLUnit<S64, LLUnits::Megabytes> S64Megabytes;
-typedef LLUnit<S64, LLUnits::Gigabytes> S64Gigabytes;
-
-typedef LLUnitImplicit<S64, LLUnits::Bytes>     S64BytesImplicit;
-typedef LLUnitImplicit<S64, LLUnits::Kilobytes> S64KilobytesImplicit;
-typedef LLUnitImplicit<S64, LLUnits::Megabytes> S64MegabytesImplicit;
-typedef LLUnitImplicit<S64, LLUnits::Gigabytes> S64GigabytesImplicit;
-
-typedef LLUnit<U32, LLUnits::Bytes>     U32Bytes;
-typedef LLUnit<U32, LLUnits::Kilobytes> U32Kilobytes;
-typedef LLUnit<U32, LLUnits::Megabytes> U32Megabytes;
-typedef LLUnit<U32, LLUnits::Gigabytes> U32Gigabytes;
-
-typedef LLUnitImplicit<U32, LLUnits::Bytes>     U32BytesImplicit;
-typedef LLUnitImplicit<U32, LLUnits::Kilobytes> U32KilobytesImplicit;
-typedef LLUnitImplicit<U32, LLUnits::Megabytes> U32MegabytesImplicit;
-typedef LLUnitImplicit<U32, LLUnits::Gigabytes> U32GigabytesImplicit;
-
-typedef LLUnit<U64, LLUnits::Bytes>     U64Bytes;
-typedef LLUnit<U64, LLUnits::Kilobytes> U64Kilobytes;
-typedef LLUnit<U64, LLUnits::Megabytes> U64Megabytes;
-typedef LLUnit<U64, LLUnits::Gigabytes> U64Gigabytes;
-
-typedef LLUnitImplicit<U64, LLUnits::Bytes>     U64BytesImplicit;
-typedef LLUnitImplicit<U64, LLUnits::Kilobytes> U64KilobytesImplicit;
-typedef LLUnitImplicit<U64, LLUnits::Megabytes> U64MegabytesImplicit;
-typedef LLUnitImplicit<U64, LLUnits::Gigabytes> U64GigabytesImplicit;
+LL_DECLARE_UNIT_TYPEDEFS(LLUnits, Bytes);
+LL_DECLARE_UNIT_TYPEDEFS(LLUnits, Kilobytes);
+LL_DECLARE_UNIT_TYPEDEFS(LLUnits, Megabytes);
+LL_DECLARE_UNIT_TYPEDEFS(LLUnits, Gigabytes);
 
 namespace LLUnits
 {
@@ -744,65 +731,10 @@ LL_DECLARE_DERIVED_UNIT(Kilobits, * 1024,		Megabits, "Mb");
 LL_DECLARE_DERIVED_UNIT(Megabits, * 1024,		Gigabits, "Gb");
 }
 
-typedef LLUnit<F32, LLUnits::Bits>     F32Bits;
-typedef LLUnit<F32, LLUnits::Kilobits> F32Kilobits;
-typedef LLUnit<F32, LLUnits::Megabits> F32Megabits;
-typedef LLUnit<F32, LLUnits::Gigabits> F32Gigabits;
-
-typedef LLUnitImplicit<F32, LLUnits::Bits>     F32BitsImplicit;
-typedef LLUnitImplicit<F32, LLUnits::Kilobits> F32KilobitsImplicit;
-typedef LLUnitImplicit<F32, LLUnits::Megabits> F32MegabitsImplicit;
-typedef LLUnitImplicit<F32, LLUnits::Gigabits> F32GigabitsImplicit;
-
-typedef LLUnit<F64, LLUnits::Bits>     F64Bits;
-typedef LLUnit<F64, LLUnits::Kilobits> F64Kilobits;
-typedef LLUnit<F64, LLUnits::Megabits> F64Megabits;
-typedef LLUnit<F64, LLUnits::Gigabits> F64Gigabits;
-
-typedef LLUnitImplicit<F64, LLUnits::Bits>     F64BitsImplicit;
-typedef LLUnitImplicit<F64, LLUnits::Kilobits> F64KilobitsImplicit;
-typedef LLUnitImplicit<F64, LLUnits::Megabits> F64MegabitsImplicit;
-typedef LLUnitImplicit<F64, LLUnits::Gigabits> F64GigabitsImplicit;
-
-typedef LLUnit<S32, LLUnits::Bits>     S32Bits;
-typedef LLUnit<S32, LLUnits::Kilobits> S32Kilobits;
-typedef LLUnit<S32, LLUnits::Megabits> S32Megabits;
-typedef LLUnit<S32, LLUnits::Gigabits> S32Gigabits;
-
-typedef LLUnitImplicit<S32, LLUnits::Bits>     S32BitsImplicit;
-typedef LLUnitImplicit<S32, LLUnits::Kilobits> S32KilobitsImplicit;
-typedef LLUnitImplicit<S32, LLUnits::Megabits> S32MegabitsImplicit;
-typedef LLUnitImplicit<S32, LLUnits::Gigabits> S32GigabitsImplicit;
-
-typedef LLUnit<S64, LLUnits::Bits>     S64Bits;
-typedef LLUnit<S64, LLUnits::Kilobits> S64Kilobits;
-typedef LLUnit<S64, LLUnits::Megabits> S64Megabits;
-typedef LLUnit<S64, LLUnits::Gigabits> S64Gigabits;
-
-typedef LLUnitImplicit<S64, LLUnits::Bits>     S64BitsImplicit;
-typedef LLUnitImplicit<S64, LLUnits::Kilobits> S64KilobitsImplicit;
-typedef LLUnitImplicit<S64, LLUnits::Megabits> S64MegabitsImplicit;
-typedef LLUnitImplicit<S64, LLUnits::Gigabits> S64GigabitsImplicit;
-
-typedef LLUnit<U32, LLUnits::Bits>     U32Bits;
-typedef LLUnit<U32, LLUnits::Kilobits> U32Kilobits;
-typedef LLUnit<U32, LLUnits::Megabits> U32Megabits;
-typedef LLUnit<U32, LLUnits::Gigabits> U32Gigabits;
-
-typedef LLUnitImplicit<U32, LLUnits::Bits>     U32BitsImplicit;
-typedef LLUnitImplicit<U32, LLUnits::Kilobits> U32KilobitsImplicit;
-typedef LLUnitImplicit<U32, LLUnits::Megabits> U32MegabitsImplicit;
-typedef LLUnitImplicit<U32, LLUnits::Gigabits> U32GigabitsImplicit;
-
-typedef LLUnit<U64, LLUnits::Bits>     U64Bits;
-typedef LLUnit<U64, LLUnits::Kilobits> U64Kilobits;
-typedef LLUnit<U64, LLUnits::Megabits> U64Megabits;
-typedef LLUnit<U64, LLUnits::Gigabits> U64Gigabits;
-
-typedef LLUnitImplicit<U64, LLUnits::Bits>     U64BitsImplicit;
-typedef LLUnitImplicit<U64, LLUnits::Kilobits> U64KilobitsImplicit;
-typedef LLUnitImplicit<U64, LLUnits::Megabits> U64MegabitsImplicit;
-typedef LLUnitImplicit<U64, LLUnits::Gigabits> U64GigabitsImplicit;
+LL_DECLARE_UNIT_TYPEDEFS(LLUnits, Bits);
+LL_DECLARE_UNIT_TYPEDEFS(LLUnits, Kilobits);
+LL_DECLARE_UNIT_TYPEDEFS(LLUnits, Megabits);
+LL_DECLARE_UNIT_TYPEDEFS(LLUnits, Gigabits);
 
 namespace LLUnits
 {
@@ -815,101 +747,13 @@ LL_DECLARE_DERIVED_UNIT(Milliseconds, / 1000,	Microseconds, "\x09\x3cs");
 LL_DECLARE_DERIVED_UNIT(Microseconds, / 1000,	Nanoseconds, "ns");
 }
 
-typedef LLUnit<F32, LLUnits::Seconds>      F32Seconds;
-typedef LLUnit<F32, LLUnits::Minutes>      F32Minutes;
-typedef LLUnit<F32, LLUnits::Hours>        F32Hours;
-typedef LLUnit<F32, LLUnits::Days>         F32Days;
-typedef LLUnit<F32, LLUnits::Milliseconds> F32Milliseconds;
-typedef LLUnit<F32, LLUnits::Microseconds> F32Microseconds;
-typedef LLUnit<F32, LLUnits::Nanoseconds>  F32Nanoseconds;
-
-typedef LLUnitImplicit<F32, LLUnits::Seconds>      F32SecondsImplicit;
-typedef LLUnitImplicit<F32, LLUnits::Minutes>      F32MinutesImplicit;
-typedef LLUnitImplicit<F32, LLUnits::Hours>        F32HoursImplicit;
-typedef LLUnitImplicit<F32, LLUnits::Days>         F32DaysImplicit;
-typedef LLUnitImplicit<F32, LLUnits::Milliseconds> F32MillisecondsImplicit;
-typedef LLUnitImplicit<F32, LLUnits::Microseconds> F32MicrosecondsImplicit;
-typedef LLUnitImplicit<F32, LLUnits::Nanoseconds>  F32NanosecondsImplicit;
-
-typedef LLUnit<F64, LLUnits::Seconds>      F64Seconds;
-typedef LLUnit<F64, LLUnits::Minutes>      F64Minutes;
-typedef LLUnit<F64, LLUnits::Hours>        F64Hours;
-typedef LLUnit<F64, LLUnits::Days>         F64Days;
-typedef LLUnit<F64, LLUnits::Milliseconds> F64Milliseconds;
-typedef LLUnit<F64, LLUnits::Microseconds> F64Microseconds;
-typedef LLUnit<F64, LLUnits::Nanoseconds>  F64Nanoseconds;
-
-typedef LLUnitImplicit<F64, LLUnits::Seconds>      F64SecondsImplicit;
-typedef LLUnitImplicit<F64, LLUnits::Minutes>      F64MinutesImplicit;
-typedef LLUnitImplicit<F64, LLUnits::Hours>        F64HoursImplicit;
-typedef LLUnitImplicit<F64, LLUnits::Days>         F64DaysImplicit;
-typedef LLUnitImplicit<F64, LLUnits::Milliseconds> F64MillisecondsImplicit;
-typedef LLUnitImplicit<F64, LLUnits::Microseconds> F64MicrosecondsImplicit;
-typedef LLUnitImplicit<F64, LLUnits::Nanoseconds>  F64NanosecondsImplicit;
-
-typedef LLUnit<S32, LLUnits::Seconds>      S32Seconds;
-typedef LLUnit<S32, LLUnits::Minutes>      S32Minutes;
-typedef LLUnit<S32, LLUnits::Hours>        S32Hours;
-typedef LLUnit<S32, LLUnits::Days>         S32Days;
-typedef LLUnit<S32, LLUnits::Milliseconds> S32Milliseconds;
-typedef LLUnit<S32, LLUnits::Microseconds> S32Microseconds;
-typedef LLUnit<S32, LLUnits::Nanoseconds>  S32Nanoseconds;
-
-typedef LLUnitImplicit<S32, LLUnits::Seconds>      S32SecondsImplicit;
-typedef LLUnitImplicit<S32, LLUnits::Minutes>      S32MinutesImplicit;
-typedef LLUnitImplicit<S32, LLUnits::Hours>        S32HoursImplicit;
-typedef LLUnitImplicit<S32, LLUnits::Days>         S32DaysImplicit;
-typedef LLUnitImplicit<S32, LLUnits::Milliseconds> S32MillisecondsImplicit;
-typedef LLUnitImplicit<S32, LLUnits::Microseconds> S32MicrosecondsImplicit;
-typedef LLUnitImplicit<S32, LLUnits::Nanoseconds>  S32NanosecondsImplicit;
-
-typedef LLUnit<S64, LLUnits::Seconds>      S64Seconds;
-typedef LLUnit<S64, LLUnits::Minutes>      S64Minutes;
-typedef LLUnit<S64, LLUnits::Hours>        S64Hours;
-typedef LLUnit<S64, LLUnits::Days>         S64Days;
-typedef LLUnit<S64, LLUnits::Milliseconds> S64Milliseconds;
-typedef LLUnit<S64, LLUnits::Microseconds> S64Microseconds;
-typedef LLUnit<S64, LLUnits::Nanoseconds>  S64Nanoseconds;
-
-typedef LLUnitImplicit<S64, LLUnits::Seconds>      S64SecondsImplicit;
-typedef LLUnitImplicit<S64, LLUnits::Minutes>      S64MinutesImplicit;
-typedef LLUnitImplicit<S64, LLUnits::Hours>        S64HoursImplicit;
-typedef LLUnitImplicit<S64, LLUnits::Days>         S64DaysImplicit;
-typedef LLUnitImplicit<S64, LLUnits::Milliseconds> S64MillisecondsImplicit;
-typedef LLUnitImplicit<S64, LLUnits::Microseconds> S64MicrosecondsImplicit;
-typedef LLUnitImplicit<S64, LLUnits::Nanoseconds>  S64NanosecondsImplicit;
-
-typedef LLUnit<U32, LLUnits::Seconds>      U32Seconds;
-typedef LLUnit<U32, LLUnits::Minutes>      U32Minutes;
-typedef LLUnit<U32, LLUnits::Hours>        U32Hours;
-typedef LLUnit<U32, LLUnits::Days>         U32Days;
-typedef LLUnit<U32, LLUnits::Milliseconds> U32Milliseconds;
-typedef LLUnit<U32, LLUnits::Microseconds> U32Microseconds;
-typedef LLUnit<U32, LLUnits::Nanoseconds>  U32Nanoseconds;
-
-typedef LLUnitImplicit<U32, LLUnits::Seconds>      U32SecondsImplicit;
-typedef LLUnitImplicit<U32, LLUnits::Minutes>      U32MinutesImplicit;
-typedef LLUnitImplicit<U32, LLUnits::Hours>        U32HoursImplicit;
-typedef LLUnitImplicit<U32, LLUnits::Days>         U32DaysImplicit;
-typedef LLUnitImplicit<U32, LLUnits::Milliseconds> U32MillisecondsImplicit;
-typedef LLUnitImplicit<U32, LLUnits::Microseconds> U32MicrosecondsImplicit;
-typedef LLUnitImplicit<U32, LLUnits::Nanoseconds>  U32NanosecondsImplicit;
-
-typedef LLUnit<U64, LLUnits::Seconds>      U64Seconds;
-typedef LLUnit<U64, LLUnits::Minutes>      U64Minutes;
-typedef LLUnit<U64, LLUnits::Hours>        U64Hours;
-typedef LLUnit<U64, LLUnits::Days>         U64Days;
-typedef LLUnit<U64, LLUnits::Milliseconds> U64Milliseconds;
-typedef LLUnit<U64, LLUnits::Microseconds> U64Microseconds;
-typedef LLUnit<U64, LLUnits::Nanoseconds>  U64Nanoseconds;
-
-typedef LLUnitImplicit<U64, LLUnits::Seconds>      U64SecondsImplicit;
-typedef LLUnitImplicit<U64, LLUnits::Minutes>      U64MinutesImplicit;
-typedef LLUnitImplicit<U64, LLUnits::Hours>        U64HoursImplicit;
-typedef LLUnitImplicit<U64, LLUnits::Days>         U64DaysImplicit;
-typedef LLUnitImplicit<U64, LLUnits::Milliseconds> U64MillisecondsImplicit;
-typedef LLUnitImplicit<U64, LLUnits::Microseconds> U64MicrosecondsImplicit;
-typedef LLUnitImplicit<U64, LLUnits::Nanoseconds>  U64NanosecondsImplicit;
+LL_DECLARE_UNIT_TYPEDEFS(LLUnits, Seconds);
+LL_DECLARE_UNIT_TYPEDEFS(LLUnits, Minutes);
+LL_DECLARE_UNIT_TYPEDEFS(LLUnits, Hours);
+LL_DECLARE_UNIT_TYPEDEFS(LLUnits, Days);
+LL_DECLARE_UNIT_TYPEDEFS(LLUnits, Milliseconds);
+LL_DECLARE_UNIT_TYPEDEFS(LLUnits, Microseconds);
+LL_DECLARE_UNIT_TYPEDEFS(LLUnits, Nanoseconds);
 
 namespace LLUnits
 {
@@ -919,65 +763,10 @@ LL_DECLARE_DERIVED_UNIT(Meters, / 100,			Centimeters, "cm");
 LL_DECLARE_DERIVED_UNIT(Meters, / 1000,			Millimeters, "mm");
 }
 
-typedef LLUnit<F32, LLUnits::Meters>      F32Meters;
-typedef LLUnit<F32, LLUnits::Kilometers>  F32Kilometers;
-typedef LLUnit<F32, LLUnits::Centimeters> F32Centimeters;
-typedef LLUnit<F32, LLUnits::Millimeters> F32Millimeters;
-
-typedef LLUnitImplicit<F32, LLUnits::Meters>      F32MetersImplicit;
-typedef LLUnitImplicit<F32, LLUnits::Kilometers>  F32KilometersImplicit;
-typedef LLUnitImplicit<F32, LLUnits::Centimeters> F32CentimetersImplicit;
-typedef LLUnitImplicit<F32, LLUnits::Millimeters> F32MillimetersImplicit;
-
-typedef LLUnit<F64, LLUnits::Meters>      F64Meters;
-typedef LLUnit<F64, LLUnits::Kilometers>  F64Kilometers;
-typedef LLUnit<F64, LLUnits::Centimeters> F64Centimeters;
-typedef LLUnit<F64, LLUnits::Millimeters> F64Millimeters;
-
-typedef LLUnitImplicit<F64, LLUnits::Meters>      F64MetersImplicit;
-typedef LLUnitImplicit<F64, LLUnits::Kilometers>  F64KilometersImplicit;
-typedef LLUnitImplicit<F64, LLUnits::Centimeters> F64CentimetersImplicit;
-typedef LLUnitImplicit<F64, LLUnits::Millimeters> F64MillimetersImplicit;
-
-typedef LLUnit<S32, LLUnits::Meters>      S32Meters;
-typedef LLUnit<S32, LLUnits::Kilometers>  S32Kilometers;
-typedef LLUnit<S32, LLUnits::Centimeters> S32Centimeters;
-typedef LLUnit<S32, LLUnits::Millimeters> S32Millimeters;
-
-typedef LLUnitImplicit<S32, LLUnits::Meters>      S32MetersImplicit;
-typedef LLUnitImplicit<S32, LLUnits::Kilometers>  S32KilometersImplicit;
-typedef LLUnitImplicit<S32, LLUnits::Centimeters> S32CentimetersImplicit;
-typedef LLUnitImplicit<S32, LLUnits::Millimeters> S32MillimetersImplicit;
-
-typedef LLUnit<S64, LLUnits::Meters>      S64Meters;
-typedef LLUnit<S64, LLUnits::Kilometers>  S64Kilometers;
-typedef LLUnit<S64, LLUnits::Centimeters> S64Centimeters;
-typedef LLUnit<S64, LLUnits::Millimeters> S64Millimeters;
-
-typedef LLUnitImplicit<S64, LLUnits::Meters>      S64MetersImplicit;
-typedef LLUnitImplicit<S64, LLUnits::Kilometers>  S64KilometersImplicit;
-typedef LLUnitImplicit<S64, LLUnits::Centimeters> S64CentimetersImplicit;
-typedef LLUnitImplicit<S64, LLUnits::Millimeters> S64MillimetersImplicit;
-
-typedef LLUnit<U32, LLUnits::Meters>      U32Meters;
-typedef LLUnit<U32, LLUnits::Kilometers>  U32Kilometers;
-typedef LLUnit<U32, LLUnits::Centimeters> U32Centimeters;
-typedef LLUnit<U32, LLUnits::Millimeters> U32Millimeters;
-
-typedef LLUnitImplicit<U32, LLUnits::Meters>      U32MetersImplicit;
-typedef LLUnitImplicit<U32, LLUnits::Kilometers>  U32KilometersImplicit;
-typedef LLUnitImplicit<U32, LLUnits::Centimeters> U32CentimetersImplicit;
-typedef LLUnitImplicit<U32, LLUnits::Millimeters> U32MillimetersImplicit;
-
-typedef LLUnit<U64, LLUnits::Meters>      U64Meters;
-typedef LLUnit<U64, LLUnits::Kilometers>  U64Kilometers;
-typedef LLUnit<U64, LLUnits::Centimeters> U64Centimeters;
-typedef LLUnit<U64, LLUnits::Millimeters> U64Millimeters;
-
-typedef LLUnitImplicit<U64, LLUnits::Meters>      U64MetersImplicit;
-typedef LLUnitImplicit<U64, LLUnits::Kilometers>  U64KilometersImplicit;
-typedef LLUnitImplicit<U64, LLUnits::Centimeters> U64CentimetersImplicit;
-typedef LLUnitImplicit<U64, LLUnits::Millimeters> U64MillimetersImplicit;
+LL_DECLARE_UNIT_TYPEDEFS(LLUnits, Meters);
+LL_DECLARE_UNIT_TYPEDEFS(LLUnits, Kilometers);
+LL_DECLARE_UNIT_TYPEDEFS(LLUnits, Centimeters);
+LL_DECLARE_UNIT_TYPEDEFS(LLUnits, Millimeters);
 
 namespace LLUnits
 {
@@ -999,136 +788,16 @@ LL_DECLARE_DERIVED_UNIT(Triangles, * 1000,		Kilotriangles, "ktris");
 } // namespace LLUnits
 
 // rare units
-typedef LLUnit<F32, LLUnits::Hertz>			F32Hertz;
-typedef LLUnit<F32, LLUnits::Kilohertz>		F32Kilohertz;
-typedef LLUnit<F32, LLUnits::Megahertz>		F32Megahertz;
-typedef LLUnit<F32, LLUnits::Gigahertz>		F32Gigahertz;
-typedef LLUnit<F32, LLUnits::Radians>		F32Radians;
-typedef LLUnit<F32, LLUnits::Degrees>		F32Degrees;
-typedef LLUnit<F32, LLUnits::Percent>		F32Percent;
-typedef LLUnit<F32, LLUnits::Ratio>			F32Ratio;
-typedef LLUnit<F32, LLUnits::Triangles>		F32Triangles;
-typedef LLUnit<F32, LLUnits::Kilotriangles>	F32KiloTriangles;
-
-typedef LLUnitImplicit<F32, LLUnits::Hertz>			F32HertzImplicit;
-typedef LLUnitImplicit<F32, LLUnits::Kilohertz>		F32KilohertzImplicit;
-typedef LLUnitImplicit<F32, LLUnits::Megahertz>		F32MegahertzImplicit;
-typedef LLUnitImplicit<F32, LLUnits::Gigahertz>		F32GigahertzImplicit;
-typedef LLUnitImplicit<F32, LLUnits::Radians>		F32RadiansImplicit;
-typedef LLUnitImplicit<F32, LLUnits::Degrees>		F32DegreesImplicit;
-typedef LLUnitImplicit<F32, LLUnits::Percent>		F32PercentImplicit;
-typedef LLUnitImplicit<F32, LLUnits::Ratio>			F32RatioImplicit;
-typedef LLUnitImplicit<F32, LLUnits::Triangles>		F32TrianglesImplicit;
-typedef LLUnitImplicit<F32, LLUnits::Kilotriangles>	F32KiloTrianglesImplicit;
-
-typedef LLUnit<F64, LLUnits::Hertz>			F64Hertz;
-typedef LLUnit<F64, LLUnits::Kilohertz>		F64Kilohertz;
-typedef LLUnit<F64, LLUnits::Megahertz>		F64Megahertz;
-typedef LLUnit<F64, LLUnits::Gigahertz>		F64Gigahertz;
-typedef LLUnit<F64, LLUnits::Radians>		F64Radians;
-typedef LLUnit<F64, LLUnits::Degrees>		F64Degrees;
-typedef LLUnit<F64, LLUnits::Percent>		F64Percent;
-typedef LLUnit<F64, LLUnits::Ratio>			F64Ratio;
-typedef LLUnit<F64, LLUnits::Triangles>		F64Triangles;
-typedef LLUnit<F64, LLUnits::Kilotriangles>	F64KiloTriangles;
-
-typedef LLUnitImplicit<F64, LLUnits::Hertz>			F64HertzImplicit;
-typedef LLUnitImplicit<F64, LLUnits::Kilohertz>		F64KilohertzImplicit;
-typedef LLUnitImplicit<F64, LLUnits::Megahertz>		F64MegahertzImplicit;
-typedef LLUnitImplicit<F64, LLUnits::Gigahertz>		F64GigahertzImplicit;
-typedef LLUnitImplicit<F64, LLUnits::Radians>		F64RadiansImplicit;
-typedef LLUnitImplicit<F64, LLUnits::Degrees>		F64DegreesImplicit;
-typedef LLUnitImplicit<F64, LLUnits::Percent>		F64PercentImplicit;
-typedef LLUnitImplicit<F64, LLUnits::Ratio>			F64RatioImplicit;
-typedef LLUnitImplicit<F64, LLUnits::Triangles>		F64TrianglesImplicit;
-typedef LLUnitImplicit<F64, LLUnits::Kilotriangles>	F64KiloTrianglesImplicit;
-
-typedef LLUnit<S32, LLUnits::Hertz>			S32Hertz;
-typedef LLUnit<S32, LLUnits::Kilohertz>		S32Kilohertz;
-typedef LLUnit<S32, LLUnits::Megahertz>		S32Megahertz;
-typedef LLUnit<S32, LLUnits::Gigahertz>		S32Gigahertz;
-typedef LLUnit<S32, LLUnits::Radians>		S32Radians;
-typedef LLUnit<S32, LLUnits::Degrees>		S32Degrees;
-typedef LLUnit<S32, LLUnits::Percent>		S32Percent;
-typedef LLUnit<S32, LLUnits::Ratio>			S32Ratio;
-typedef LLUnit<S32, LLUnits::Triangles>		S32Triangles;
-typedef LLUnit<S32, LLUnits::Kilotriangles>	S32KiloTriangles;
-
-typedef LLUnitImplicit<S32, LLUnits::Hertz>			S32HertzImplicit;
-typedef LLUnitImplicit<S32, LLUnits::Kilohertz>		S32KilohertzImplicit;
-typedef LLUnitImplicit<S32, LLUnits::Megahertz>		S32MegahertzImplicit;
-typedef LLUnitImplicit<S32, LLUnits::Gigahertz>		S32GigahertzImplicit;
-typedef LLUnitImplicit<S32, LLUnits::Radians>		S32RadiansImplicit;
-typedef LLUnitImplicit<S32, LLUnits::Degrees>		S32DegreesImplicit;
-typedef LLUnitImplicit<S32, LLUnits::Percent>		S32PercentImplicit;
-typedef LLUnitImplicit<S32, LLUnits::Ratio>			S32RatioImplicit;
-typedef LLUnitImplicit<S32, LLUnits::Triangles>		S32TrianglesImplicit;
-typedef LLUnitImplicit<S32, LLUnits::Kilotriangles>	S32KiloTrianglesImplicit;
-
-typedef LLUnit<S64, LLUnits::Hertz>			S64Hertz;
-typedef LLUnit<S64, LLUnits::Kilohertz>		S64Kilohertz;
-typedef LLUnit<S64, LLUnits::Megahertz>		S64Megahertz;
-typedef LLUnit<S64, LLUnits::Gigahertz>		S64Gigahertz;
-typedef LLUnit<S64, LLUnits::Radians>		S64Radians;
-typedef LLUnit<S64, LLUnits::Degrees>		S64Degrees;
-typedef LLUnit<S64, LLUnits::Percent>		S64Percent;
-typedef LLUnit<S64, LLUnits::Ratio>			S64Ratio;
-typedef LLUnit<S64, LLUnits::Triangles>		S64Triangles;
-typedef LLUnit<S64, LLUnits::Kilotriangles>	S64KiloTriangles;
-
-typedef LLUnitImplicit<S64, LLUnits::Hertz>			S64HertzImplicit;
-typedef LLUnitImplicit<S64, LLUnits::Kilohertz>		S64KilohertzImplicit;
-typedef LLUnitImplicit<S64, LLUnits::Megahertz>		S64MegahertzImplicit;
-typedef LLUnitImplicit<S64, LLUnits::Gigahertz>		S64GigahertzImplicit;
-typedef LLUnitImplicit<S64, LLUnits::Radians>		S64RadiansImplicit;
-typedef LLUnitImplicit<S64, LLUnits::Degrees>		S64DegreesImplicit;
-typedef LLUnitImplicit<S64, LLUnits::Percent>		S64PercentImplicit;
-typedef LLUnitImplicit<S64, LLUnits::Ratio>			S64RatioImplicit;
-typedef LLUnitImplicit<S64, LLUnits::Triangles>		S64TrianglesImplicit;
-typedef LLUnitImplicit<S64, LLUnits::Kilotriangles>	S64KiloTrianglesImplicit;
-
-typedef LLUnit<U32, LLUnits::Hertz>			U32Hertz;
-typedef LLUnit<U32, LLUnits::Kilohertz>		U32Kilohertz;
-typedef LLUnit<U32, LLUnits::Megahertz>		U32Megahertz;
-typedef LLUnit<U32, LLUnits::Gigahertz>		U32Gigahertz;
-typedef LLUnit<U32, LLUnits::Radians>		U32Radians;
-typedef LLUnit<U32, LLUnits::Degrees>		U32Degrees;
-typedef LLUnit<U32, LLUnits::Percent>		U32Percent;
-typedef LLUnit<U32, LLUnits::Ratio>			U32Ratio;
-typedef LLUnit<U32, LLUnits::Triangles>		U32Triangles;
-typedef LLUnit<U32, LLUnits::Kilotriangles>	U32KiloTriangles;
-
-typedef LLUnitImplicit<U32, LLUnits::Hertz>			U32HertzImplicit;
-typedef LLUnitImplicit<U32, LLUnits::Kilohertz>		U32KilohertzImplicit;
-typedef LLUnitImplicit<U32, LLUnits::Megahertz>		U32MegahertzImplicit;
-typedef LLUnitImplicit<U32, LLUnits::Gigahertz>		U32GigahertzImplicit;
-typedef LLUnitImplicit<U32, LLUnits::Radians>		U32RadiansImplicit;
-typedef LLUnitImplicit<U32, LLUnits::Degrees>		U32DegreesImplicit;
-typedef LLUnitImplicit<U32, LLUnits::Percent>		U32PercentImplicit;
-typedef LLUnitImplicit<U32, LLUnits::Ratio>			U32RatioImplicit;
-typedef LLUnitImplicit<U32, LLUnits::Triangles>		U32TrianglesImplicit;
-typedef LLUnitImplicit<U32, LLUnits::Kilotriangles>	U32KiloTrianglesImplicit;
-
-typedef LLUnit<U64, LLUnits::Hertz>			U64Hertz;
-typedef LLUnit<U64, LLUnits::Kilohertz>		U64Kilohertz;
-typedef LLUnit<U64, LLUnits::Megahertz>		U64Megahertz;
-typedef LLUnit<U64, LLUnits::Gigahertz>		U64Gigahertz;
-typedef LLUnit<U64, LLUnits::Radians>		U64Radians;
-typedef LLUnit<U64, LLUnits::Degrees>		U64Degrees;
-typedef LLUnit<U64, LLUnits::Percent>		U64Percent;
-typedef LLUnit<U64, LLUnits::Ratio>			U64Ratio;
-typedef LLUnit<U64, LLUnits::Triangles>		U64Triangles;
-typedef LLUnit<U64, LLUnits::Kilotriangles>	U64KiloTriangles;
-
-typedef LLUnitImplicit<U64, LLUnits::Hertz>			U64HertzImplicit;
-typedef LLUnitImplicit<U64, LLUnits::Kilohertz>		U64KilohertzImplicit;
-typedef LLUnitImplicit<U64, LLUnits::Megahertz>		U64MegahertzImplicit;
-typedef LLUnitImplicit<U64, LLUnits::Gigahertz>		U64GigahertzImplicit;
-typedef LLUnitImplicit<U64, LLUnits::Radians>		U64RadiansImplicit;
-typedef LLUnitImplicit<U64, LLUnits::Degrees>		U64DegreesImplicit;
-typedef LLUnitImplicit<U64, LLUnits::Percent>		U64PercentImplicit;
-typedef LLUnitImplicit<U64, LLUnits::Ratio>			U64RatioImplicit;
-typedef LLUnitImplicit<U64, LLUnits::Triangles>		U64TrianglesImplicit;
-typedef LLUnitImplicit<U64, LLUnits::Kilotriangles>	U64KiloTrianglesImplicit;
+LL_DECLARE_UNIT_TYPEDEFS(LLUnits, Hertz);
+LL_DECLARE_UNIT_TYPEDEFS(LLUnits, Kilohertz);
+LL_DECLARE_UNIT_TYPEDEFS(LLUnits, Megahertz);
+LL_DECLARE_UNIT_TYPEDEFS(LLUnits, Gigahertz);
+LL_DECLARE_UNIT_TYPEDEFS(LLUnits, Radians);
+LL_DECLARE_UNIT_TYPEDEFS(LLUnits, Degrees);
+LL_DECLARE_UNIT_TYPEDEFS(LLUnits, Percent);
+LL_DECLARE_UNIT_TYPEDEFS(LLUnits, Ratio);
+LL_DECLARE_UNIT_TYPEDEFS(LLUnits, Triangles);
+LL_DECLARE_UNIT_TYPEDEFS(LLUnits, Kilotriangles);
+
 
 #endif // LL_LLUNIT_H
diff --git a/indra/newview/llfasttimerview.cpp b/indra/newview/llfasttimerview.cpp
index 36cbd67333667a3d2347f33c373f3e104d7a64d7..e8db263faebc42c2e228862cfcf1f4ac10f06997 100755
--- a/indra/newview/llfasttimerview.cpp
+++ b/indra/newview/llfasttimerview.cpp
@@ -282,14 +282,14 @@ BOOL LLFastTimerView::handleHover(S32 x, S32 y, MASK mask)
 		}
 
 		if (hover_bar)
-			{
+		{
 			mHoverID = hover_bar->mTimeBlock;
 			if (mHoverTimer != mHoverID)
-				{
-					// could be that existing tooltip is for a parent and is thus
-					// covering region for this new timer, go ahead and unblock 
-					// so we can create a new tooltip
-					LLToolTipMgr::instance().unblockToolTips();
+			{
+				// could be that existing tooltip is for a parent and is thus
+				// covering region for this new timer, go ahead and unblock 
+				// so we can create a new tooltip
+				LLToolTipMgr::instance().unblockToolTips();
 				mHoverTimer = mHoverID;
 				mToolTipRect.set(mBarRect.mLeft + (hover_bar->mSelfStart / mTotalTimeDisplay) * mBarRect.getWidth(),
 								row.mTop,
diff --git a/indra/newview/llfasttimerview.h b/indra/newview/llfasttimerview.h
index d184aae03dc4f184534852cd5a90eef224463a7b..8c2c939c5e38926e92d63cc9b39301ceb6520b22 100755
--- a/indra/newview/llfasttimerview.h
+++ b/indra/newview/llfasttimerview.h
@@ -128,7 +128,7 @@ class LLFastTimerView : public LLFloater
 		DISPLAY_HZ
 	}								mDisplayType;
 	bool							mPauseHistory;
-	F64Seconds	mAllTimeMax,
+	F64Seconds						mAllTimeMax,
 									mTotalTimeDisplay;
 	S32								mScrollIndex,
 									mHoverBarIndex,