diff --git a/VectoCommon/VectoCommon/Utils/DoubleExtensionMethods.cs b/VectoCommon/VectoCommon/Utils/DoubleExtensionMethods.cs
index 59082875249f64ca42a59459df10839e16216493..55bdacd99acd952eb0db13fd596e8f2467825eef 100644
--- a/VectoCommon/VectoCommon/Utils/DoubleExtensionMethods.cs
+++ b/VectoCommon/VectoCommon/Utils/DoubleExtensionMethods.cs
@@ -76,8 +76,7 @@ namespace TUGraz.VectoCommon.Utils
 
 		[DebuggerStepThrough]
 		[MethodImpl(MethodImplOptions.AggressiveInlining)]
-		public static bool IsRelativeEqual(this double expected, double actual,
-			double toleranceFactor = DoubleExtensionMethods.ToleranceFactor)
+		public static bool IsRelativeEqual(this double expected, double actual, double toleranceFactor = ToleranceFactor)
 		{
 			if (double.IsNaN(expected)) {
 				return double.IsNaN(actual);
@@ -234,8 +233,9 @@ namespace TUGraz.VectoCommon.Utils
 		[MethodImpl(MethodImplOptions.AggressiveInlining)]
 		public static SI SI(this double value)
 		{
-			return new SI(value);
+			return SIBase<Scalar>.Create(value);
 		}
+
 	    public static SI SI(this double value, UnitInstance si)
 	    {
 	        return new SI(si, value);
diff --git a/VectoCommon/VectoCommon/Utils/IntExtensionMethods.cs b/VectoCommon/VectoCommon/Utils/IntExtensionMethods.cs
index 71b2bb0cc29c5f92aa8f8bfa7a0382774537df63..28538cb7b101489970c64f51b505c1619c5723ce 100644
--- a/VectoCommon/VectoCommon/Utils/IntExtensionMethods.cs
+++ b/VectoCommon/VectoCommon/Utils/IntExtensionMethods.cs
@@ -42,10 +42,9 @@ namespace TUGraz.VectoCommon.Utils
 		//[DebuggerHidden]
 		public static SI SI(this int value)
 		{
-			return new SI(value);
+			return SIBase<Scalar>.Create(value);
 		}
-
-
+		
         public static SI SI(this int value, UnitInstance si)
         {
             return new SI(si,value);
diff --git a/VectoCommon/VectoCommon/Utils/SI.cs b/VectoCommon/VectoCommon/Utils/SI.cs
index 0b847a98b1e4255fe8bfaaac8391ae8b44af8f06..6e6c283b6fd3a44fa2f660485f04dbad579dd50f 100644
--- a/VectoCommon/VectoCommon/Utils/SI.cs
+++ b/VectoCommon/VectoCommon/Utils/SI.cs
@@ -32,12 +32,10 @@
 using System;
 using System.Collections.Generic;
 using System.Diagnostics;
-using System.Diagnostics.CodeAnalysis;
 using System.Globalization;
 using System.Linq;
 using System.Linq.Expressions;
 using System.Reflection;
-using System.Runtime.CompilerServices;
 using TUGraz.VectoCommon.Exceptions;
 
 // ReSharper disable ClassNeverInstantiated.Global
@@ -49,62 +47,46 @@ namespace TUGraz.VectoCommon.Utils
 	/// </summary>
 	public class Scalar : SIBase<Scalar>
 	{
+		private static readonly int[] Units = { 0, 0, 0, 0, 0, 0, 0 };
+
 		[DebuggerHidden]
-		private Scalar(double val) : base(val) {}
+		private Scalar(double val) : base(val, Units) { }
 
 		public static implicit operator double(Scalar self)
 		{
 			return self.Val;
 		}
 
-		/// <summary>
-		/// Implements the operator +.
-		/// </summary>
 		[DebuggerHidden]
 		public static Scalar operator +(Scalar si1, Scalar si2)
 		{
 			return Create(si1.Val + si2.Val);
 		}
 
-		/// <summary>
-		/// Implements the operator +.
-		/// </summary>
 		[DebuggerHidden]
 		public static Scalar operator +(Scalar si1, double si2)
 		{
 			return Create(si1.Val + si2);
 		}
 
-		/// <summary>
-		/// Implements the operator +.
-		/// </summary>
 		[DebuggerHidden]
 		public static Scalar operator +(double si1, Scalar si2)
 		{
 			return Create(si1 + si2.Val);
 		}
 
-		/// <summary>
-		/// Implements the operator -.
-		/// </summary>
 		[DebuggerHidden]
 		public static Scalar operator -(Scalar si1, Scalar si2)
 		{
 			return Create(si1.Val - si2.Val);
 		}
 
-		/// <summary>
-		/// Implements the operator -.
-		/// </summary>
 		[DebuggerHidden]
 		public static Scalar operator -(Scalar si1, double si2)
 		{
 			return Create(si1.Val - si2);
 		}
 
-		/// <summary>
-		/// Implements the operator -.
-		/// </summary>
 		[DebuggerHidden]
 		public static Scalar operator -(double si1, Scalar si2)
 		{
@@ -117,19 +99,11 @@ namespace TUGraz.VectoCommon.Utils
 	/// </summary>
 	public class Newton : SIBase<Newton>
 	{
-	    private static readonly int[] SIDefault = new int[7] { 1, 1, -2, 0, 0, 0, 0 };
+		private static readonly int[] Units = { 1, 1, -2, 0, 0, 0, 0 };
 
-        [DebuggerHidden]
-        private Newton(double val) : base(val, SIDefault) { }
+		[DebuggerHidden]
+		private Newton(double val) : base(val, Units) { }
 
-		/// <summary>
-		/// Implements the operator *.
-		/// </summary>
-		/// <param name="newton">The newton.</param>
-		/// <param name="meter">The meter.</param>
-		/// <returns>
-		/// The result of the operator.
-		/// </returns>
 		[DebuggerHidden]
 		public static NewtonMeter operator *(Newton newton, Meter meter)
 		{
@@ -154,8 +128,10 @@ namespace TUGraz.VectoCommon.Utils
 	/// </summary>
 	public class Radian : SIBase<Radian>
 	{
+		private static readonly int[] Units = { 0, 0, 0, 0, 0, 0, 0 };
+
 		[DebuggerHidden]
-		private Radian(double val) : base(val) {}
+		private Radian(double val) : base(val, Units) { }
 	}
 
 	/// <summary>
@@ -163,9 +139,9 @@ namespace TUGraz.VectoCommon.Utils
 	/// </summary>
 	public class PerSquareSecond : SIBase<PerSquareSecond>
 	{
-	    private static readonly int[] SIDefault = new int[7] { 0, 0, -2, 0, 0, 0, 0 };
-        [DebuggerHidden]
-        private PerSquareSecond(double val) : base(val, SIDefault) { }
+		private static readonly int[] Units = { 0, 0, -2, 0, 0, 0, 0 };
+		[DebuggerHidden]
+		private PerSquareSecond(double val) : base(val, Units) { }
 
 		[DebuggerHidden]
 		public static PerSecond operator *(PerSquareSecond perSquareSecond, Second second)
@@ -179,10 +155,10 @@ namespace TUGraz.VectoCommon.Utils
 	/// </summary>
 	public class MeterPerSquareSecond : SIBase<MeterPerSquareSecond>
 	{
-	    private static readonly int[] SIDefault = new int[7] { 0, 1, -2, 0, 0, 0, 0 };
+		private static readonly int[] Units = { 0, 1, -2, 0, 0, 0, 0 };
 
-        [DebuggerHidden]
-        private MeterPerSquareSecond(double val) : base(val, SIDefault) { }
+		[DebuggerHidden]
+		private MeterPerSquareSecond(double val) : base(val, Units) { }
 
 		/// <summary>
 		/// Implements the operator *.
@@ -199,10 +175,10 @@ namespace TUGraz.VectoCommon.Utils
 	/// </summary>
 	public class Second : SIBase<Second>
 	{
-	    private static readonly int[] SIDefault = new int[7] { 0, 0, 1, 0, 0, 0, 0 };
+		private static readonly int[] Units = { 0, 0, 1, 0, 0, 0, 0 };
 
-        [DebuggerHidden]
-        private Second(double val) : base(val, SIDefault) { }
+		[DebuggerHidden]
+		private Second(double val) : base(val, Units) { }
 	}
 
 	/// <summary>
@@ -210,10 +186,10 @@ namespace TUGraz.VectoCommon.Utils
 	/// </summary>
 	public class Meter : SIBase<Meter>
 	{
-	    private static readonly int[] SIDefault = new int[7] { 0, 1, 0, 0, 0, 0, 0 };
+		private static readonly int[] Units = { 0, 1, 0, 0, 0, 0, 0 };
 
 		[DebuggerHidden]
-		private Meter(double val) : base(val, SIDefault) {}
+		private Meter(double val) : base(val, Units) { }
 
 		[DebuggerHidden]
 		public static MeterPerSecond operator /(Meter meter, Second second)
@@ -242,48 +218,19 @@ namespace TUGraz.VectoCommon.Utils
 	/// </summary>
 	public class KilogramPerMeter : SIBase<KilogramPerMeter>
 	{
-	    private static readonly int[] SIDefault = new int[7] { 1, -1, 0, 0, 0, 0, 0 };
-        [DebuggerHidden]
-		private KilogramPerMeter(double val) : base(val, SIDefault) {}
+		private static readonly int[] Units = { 1, -1, 0, 0, 0, 0, 0 };
+		[DebuggerHidden]
+		private KilogramPerMeter(double val) : base(val, Units) { }
 	}
 
-	///// <summary>
-	///// SI Class for Gram
-	///// </summary>
-	//public class Gram : SIBase<Gram>
-	//{
-	//	private static readonly Unit[] NumeratorDefault = { Unit.g };
-
-	//	[DebuggerHidden]
-	//	private Gram(double val) : base(val, NumeratorDefault) {}
-	//}
-
-	//public class GramPerSecond : SIBase<GramPerSecond>
-	//{
-	//	private static readonly Unit[] NumeratorDefault = { Unit.g };
-	//	private static readonly Unit[] DenominatorDefault = { Unit.s };
-
-	//	private GramPerSecond(double val) : base(val, NumeratorDefault, DenominatorDefault) { }
-
-	//	public static Gram operator *(GramPerSecond gps, Second s)
-	//	{
-	//		return SIBase<Gram>.Create(gps.Val * s.Value());
-	//	}
-	//}
-
-	//public class GramPerLiter : SIBase<GramPerLiter>
-	//{
-	//	private static readonly Unit[] NumeratorDefault = { Unit.g };
-	//	private static readonly Unit[] DenominatorDefault = { Unit.liter };
-
-	//	private GramPerLiter(double val) : base(val, NumeratorDefault, DenominatorDefault) {}
-	//}
-
+	/// <summary>
+	/// SI Class for Liter per Second [l/s].
+	/// </summary>
 	public class LiterPerSecond : SIBase<LiterPerSecond>
 	{
-	    private static readonly int[] SIDefault = new int[7] { 0, 3, -1, 0, 0, 0, 0 };
+		private static readonly int[] Units = { 0, 3, -1, 0, 0, 0, 0 };
 
-        private LiterPerSecond(double val) : base(val*0.001, SIDefault) {}
+		private LiterPerSecond(double val) : base(val * 0.001, Units) { }
 	}
 
 	/// <summary>
@@ -291,10 +238,10 @@ namespace TUGraz.VectoCommon.Utils
 	/// </summary>
 	public class Kilogram : SIBase<Kilogram>
 	{
-	    private static readonly int[] SIDefault = new int[7] { 1, 0, 0, 0, 0, 0, 0 };
+		private static readonly int[] Units = { 1, 0, 0, 0, 0, 0, 0 };
 
-        [DebuggerHidden]
-		private Kilogram(double val) : base(val, SIDefault) {}
+		[DebuggerHidden]
+		private Kilogram(double val) : base(val, Units) { }
 
 		[DebuggerHidden]
 		public static KilogramPerSecond operator /(Kilogram kg, Second second)
@@ -346,10 +293,10 @@ namespace TUGraz.VectoCommon.Utils
 
 	public class Liter : SIBase<Liter>
 	{
-	    private static readonly int[] SIDefault = new int[7] { 0, 3, 0, 0, 0, 0, 0 };
+		private static readonly int[] Units = { 0, 3, 0, 0, 0, 0, 0 };
 
-        [DebuggerHidden]
-		private Liter(double val) : base(val * 0.001, SIDefault) {}
+		[DebuggerHidden]
+		private Liter(double val) : base(val * 0.001, Units) { }
 
 		public static Kilogram operator *(Liter liter, KilogramPerCubicMeter kilogramPerCubicMeter)
 		{
@@ -362,10 +309,10 @@ namespace TUGraz.VectoCommon.Utils
 	/// </summary>
 	public class NormLiter : SIBase<NormLiter>
 	{
-	    private static readonly int[] SIDefault = new int[7] { 0, 3, 0, 0, 0, 0, 0 };
+		private static readonly int[] Units = { 0, 3, 0, 0, 0, 0, 0 };
 
-        [DebuggerHidden]
-		private NormLiter(double val) : base(val * 0.001, SIDefault) {}
+		[DebuggerHidden]
+		private NormLiter(double val) : base(val * 0.001, Units) { }
 
 		public static NormLiterPerSecond operator /(NormLiter nl, Second s)
 		{
@@ -378,10 +325,10 @@ namespace TUGraz.VectoCommon.Utils
 	/// </summary>
 	public class NormLiterPerSecond : SIBase<NormLiterPerSecond>
 	{
-	    private static readonly int[] SIDefault = new int[7] { 0, 3, -1, 0, 0, 0, 0 };
+		private static readonly int[] Units = { 0, 3, -1, 0, 0, 0, 0 };
 
-        [DebuggerHidden]
-		private NormLiterPerSecond(double val) : base(val * 0.001, SIDefault) {}
+		[DebuggerHidden]
+		private NormLiterPerSecond(double val) : base(val * 0.001, Units) { }
 
 		public static NormLiter operator *(NormLiterPerSecond nips, Second s)
 		{
@@ -399,10 +346,10 @@ namespace TUGraz.VectoCommon.Utils
 	/// </summary>
 	public class KilogramPerSecond : SIBase<KilogramPerSecond>
 	{
-	    private static readonly int[] SIDefault = new int[7] { 1, 0, -1, 0, 0, 0, 0 };
+		private static readonly int[] Units = { 1, 0, -1, 0, 0, 0, 0 };
 
-        [DebuggerHidden]
-		private KilogramPerSecond(double value) : base(value, SIDefault) {}
+		[DebuggerHidden]
+		private KilogramPerSecond(double value) : base(value, Units) { }
 
 		[DebuggerHidden]
 		public static Kilogram operator *(KilogramPerSecond kilogramPerSecond, Second second)
@@ -416,10 +363,10 @@ namespace TUGraz.VectoCommon.Utils
 	/// </summary>
 	public class SquareMeter : SIBase<SquareMeter>
 	{
-	    private static readonly int[] SIDefault = new int[7] { 0, 2, 0, 0, 0, 0, 0 };
+		private static readonly int[] Units = { 0, 2, 0, 0, 0, 0, 0 };
 
 		[DebuggerHidden]
-		private SquareMeter(double value) : base(value, SIDefault) { }
+		private SquareMeter(double value) : base(value, Units) { }
 	}
 
 	/// <summary>
@@ -427,11 +374,11 @@ namespace TUGraz.VectoCommon.Utils
 	/// </summary>
 	public class CubicMeter : SIBase<CubicMeter>
 	{
-	    private static readonly int[] SIDefault = new int[7] { 0, 3, 0, 0, 0, 0, 0 };
+		private static readonly int[] Units = { 0, 3, 0, 0, 0, 0, 0 };
 
-        [DebuggerHidden]
+		[DebuggerHidden]
 		private CubicMeter(double value)
-			: base(value, SIDefault) {}
+			: base(value, Units) { }
 	}
 
 	/// <summary>
@@ -439,10 +386,10 @@ namespace TUGraz.VectoCommon.Utils
 	/// </summary>
 	public class KilogramSquareMeter : SIBase<KilogramSquareMeter>
 	{
-	    private static readonly int[] SIDefault = new int[7] { 1, 2, 0, 0, 0, 0, 0 };
+		private static readonly int[] Units = { 1, 2, 0, 0, 0, 0, 0 };
 
-        [DebuggerHidden]
-		private KilogramSquareMeter(double value) : base(value, SIDefault) {}
+		[DebuggerHidden]
+		private KilogramSquareMeter(double value) : base(value, Units) { }
 
 		[DebuggerHidden]
 		public static NewtonMeter operator *(KilogramSquareMeter kilogramSquareMeter, PerSquareSecond perSquareSecond)
@@ -456,10 +403,10 @@ namespace TUGraz.VectoCommon.Utils
 	/// </summary>
 	public class KilogramPerCubicMeter : SIBase<KilogramPerCubicMeter>
 	{
-	    private static readonly int[] SIDefault = new int[7] { 1, -3, 0, 0, 0, 0, 0 };
+		private static readonly int[] Units = { 1, -3, 0, 0, 0, 0, 0 };
 
-        [DebuggerHidden]
-		private KilogramPerCubicMeter(double value) : base(value, SIDefault) {}
+		[DebuggerHidden]
+		private KilogramPerCubicMeter(double value) : base(value, Units) { }
 
 		[DebuggerHidden]
 		public static Kilogram operator *(KilogramPerCubicMeter kilogramPerCubicMeter, CubicMeter cubicMeter)
@@ -484,22 +431,22 @@ namespace TUGraz.VectoCommon.Utils
 	/// </summary>
 	public class KilogramPerWattSecond : SIBase<KilogramPerWattSecond>
 	{
-	    private static readonly int[] SIDefault = new int[7] { 0, -2, 2, 0, 0, 0, 0 };
+		private static readonly int[] Units = { 0, -2, 2, 0, 0, 0, 0 };
 
-        [DebuggerHidden]
-		private KilogramPerWattSecond(double val) : base(val, SIDefault) {}
+		[DebuggerHidden]
+		private KilogramPerWattSecond(double val) : base(val, Units) { }
 	}
 
-    /// <summary>
-    /// SI Class for watt second [Ws].
-    /// W = kgm^2/s^3
-    /// </summary>
-    public class WattSecond : SIBase<WattSecond>
+	/// <summary>
+	/// SI Class for watt second [Ws].
+	/// W = kgm^2/s^3
+	/// </summary>
+	public class WattSecond : SIBase<WattSecond>
 	{
-	    private static readonly int[] SIDefault = new int[7] { 1, 2, -2, 0, 0, 0, 0 };
+		private static readonly int[] Units = { 1, 2, -2, 0, 0, 0, 0 };
 
-        [DebuggerHidden]
-		private WattSecond(double val) : base(val, SIDefault) {}
+		[DebuggerHidden]
+		private WattSecond(double val) : base(val, Units) { }
 
 		[DebuggerHidden]
 		public static Watt operator /(WattSecond wattSecond, Second second)
@@ -513,10 +460,10 @@ namespace TUGraz.VectoCommon.Utils
 	/// </summary>
 	public class Watt : SIBase<Watt>
 	{
-	    private static readonly int[] SIDefault = new int[7] { 1, 2, -3, 0, 0, 0, 0 };
+		private static readonly int[] Units = { 1, 2, -3, 0, 0, 0, 0 };
 
-        [DebuggerHidden]
-		private Watt(double val) : base(val, SIDefault) {}
+		[DebuggerHidden]
+		private Watt(double val) : base(val, Units) { }
 
 		/// <summary>
 		/// Implements the operator /.
@@ -546,7 +493,7 @@ namespace TUGraz.VectoCommon.Utils
 		/// <returns>
 		/// The result of the operator.
 		/// </returns>
-		//[DebuggerHidden]
+		[DebuggerHidden]
 		public static NewtonMeter operator /(Watt watt, PerSecond perSecond)
 		{
 			return SIBase<NewtonMeter>.Create(watt.Val / perSecond.Value());
@@ -565,17 +512,16 @@ namespace TUGraz.VectoCommon.Utils
 		}
 	}
 
-    /// <summary>
-    /// SI Class for Watt [J].
-    /// J = Ws
-    /// W = kgm^2/s^3
-    /// </summary>
+	/// <summary>
+	/// SI Class for Joule [J].
+	/// J = Ws = kgm^2/s^2
+	/// </summary>
 	public class Joule : SIBase<Joule>
 	{
-	    private static readonly int[] SIDefault = new int[7] { 1, 2, -2, 0, 0, 0, 0 };
+		private static readonly int[] Units = { 1, 2, -2, 0, 0, 0, 0 };
 
-        [DebuggerHidden]
-		private Joule(double val) : base(val, SIDefault) {}
+		[DebuggerHidden]
+		private Joule(double val) : base(val, Units) { }
 
 		public static implicit operator Joule(WattSecond self)
 		{
@@ -598,16 +544,16 @@ namespace TUGraz.VectoCommon.Utils
 		}
 	}
 
-    /// <summary>
-    /// SI Class for Watt [J/kg].
-    /// J = Ws
-    /// W = kgm^2/s^3
-    /// </summary>
-    public class JoulePerKilogramm : SIBase<JoulePerKilogramm>
+	/// <summary>
+	/// SI Class for Watt [W].
+	/// J = Ws
+	/// W = kgm^2/s^3
+	/// </summary>
+	public class JoulePerKilogramm : SIBase<JoulePerKilogramm>
 	{
-	    private static readonly int[] SIDefault = new int[7] { 0, 2, -2, 0, 0, 0, 0 };
+		private static readonly int[] Units = { 0, 2, -2, 0, 0, 0, 0 };
 
-        private JoulePerKilogramm(double val) : base(val, SIDefault) {}
+		private JoulePerKilogramm(double val) : base(val, Units) { }
 
 		public static Joule operator *(Kilogram kg, JoulePerKilogramm jpg)
 		{
@@ -615,17 +561,17 @@ namespace TUGraz.VectoCommon.Utils
 		}
 	}
 
-    /// <summary>
-    ///  SI Class for KilogramPerMeter [J/m].
-    ///  J = Ws
-    ///  W = kgm^2/s^3
-    /// </summary>
-    public class JoulePerMeter : SIBase<JoulePerMeter>
+	/// <summary>
+	///  SI Class for Joule per Meter [J/m].
+	///  J = Ws
+	///  W = kgm^2/s^3
+	/// </summary>
+	public class JoulePerMeter : SIBase<JoulePerMeter>
 	{
-	    private static readonly int[] SIDefault = new int[7] { 1, 1, -2, 0, 0, 0, 0 };
+		private static readonly int[] Units = { 1, 1, -2, 0, 0, 0, 0 };
 
-        [DebuggerHidden]
-		private JoulePerMeter(double val) : base(val, SIDefault) {}
+		[DebuggerHidden]
+		private JoulePerMeter(double val) : base(val, Units) { }
 	}
 
 	/// <summary>
@@ -634,10 +580,10 @@ namespace TUGraz.VectoCommon.Utils
 	[DebuggerDisplay("rad/s: {Val} | rpm: {AsRPM}")]
 	public class PerSecond : SIBase<PerSecond>
 	{
-	    private static readonly int[] SIDefault = new int[7] { 0, 0, -1, 0, 0, 0, 0 };
+		private static readonly int[] Units = { 0, 0, -1, 0, 0, 0, 0 };
 
 		[DebuggerHidden]
-		private PerSecond(double val) : base(val, SIDefault) { }
+		private PerSecond(double val) : base(val, Units) { }
 
 		[DebuggerHidden]
 		public static PerSquareSecond operator /(PerSecond perSecond, Second second)
@@ -657,10 +603,10 @@ namespace TUGraz.VectoCommon.Utils
 	[DebuggerDisplay("{Val} | {AsKmph}")]
 	public class MeterPerSecond : SIBase<MeterPerSecond>
 	{
-	    private static readonly int[] SIDefault = new int[7] { 0, 1, -1, 0, 0, 0, 0 };
+		private static readonly int[] Units = { 0, 1, -1, 0, 0, 0, 0 };
 
-        [DebuggerHidden]
-		private MeterPerSecond(double val) : base(val, SIDefault) {}
+		[DebuggerHidden]
+		private MeterPerSecond(double val) : base(val, Units) { }
 
 		public double AsKmph
 		{
@@ -728,12 +674,12 @@ namespace TUGraz.VectoCommon.Utils
 	/// </summary>
 	public class NewtonMeter : SIBase<NewtonMeter>
 	{
-	    private static readonly int[] SIDefault = new int[7] { 1, 2, -2, 0, 0, 0, 0 };
+		private static readonly int[] Units = { 1, 2, -2, 0, 0, 0, 0 };
 
-        [DebuggerHidden]
-		private NewtonMeter(double val) : base(val, SIDefault) {}
+		[DebuggerHidden]
+		private NewtonMeter(double val) : base(val, Units) { }
 
-		//[DebuggerHidden]
+		[DebuggerHidden]
 		public static Watt operator *(NewtonMeter newtonMeter, PerSecond perSecond)
 		{
 			return SIBase<Watt>.Create(newtonMeter.Val * perSecond.Value());
@@ -776,23 +722,23 @@ namespace TUGraz.VectoCommon.Utils
 		}
 	}
 
-    /// <summary>
-    /// SI Class for NewtonMeterSecond [Nms].
-    /// N = kgm/s^2
-    /// </summary>
-    public class NewtonMeterSecond : SIBase<NewtonMeterSecond>
+	/// <summary>
+	/// SI Class for NewtonMeterSecond [Nms].
+	/// N = kgm/s^2
+	/// </summary>
+	public class NewtonMeterSecond : SIBase<NewtonMeterSecond>
 	{
-	    private static readonly int[] SIDefault = new int[7] { 1, 2, -1, 0, 0, 0, 0 };
-        private NewtonMeterSecond(double val) : base(val, SIDefault) {}
+		private static readonly int[] Units = { 1, 2, -1, 0, 0, 0, 0 };
+		private NewtonMeterSecond(double val) : base(val, Units) { }
 	}
 
-    /// <summary>
-    /// SI Class for Amperer [A].
-    /// </summary>
-    public class Ampere : SIBase<Ampere>
+	/// <summary>
+	/// SI Class for Amperer [A].
+	/// </summary>
+	public class Ampere : SIBase<Ampere>
 	{
-	    private static readonly int[] SIDefault = new int[7] { 0, 0, 0, 1, 0, 0, 0 };
-        private Ampere(double val) : base(val, SIDefault) {}
+		private static readonly int[] Units = { 0, 0, 0, 1, 0, 0, 0 };
+		private Ampere(double val) : base(val, Units) { }
 
 		public static Watt operator *(Ampere ampere, Volt volt)
 		{
@@ -811,18 +757,18 @@ namespace TUGraz.VectoCommon.Utils
 
 		public static Watt operator /(Volt volt, Ampere ampere)
 		{
-			return SIBase<Watt>.Create(volt.Value() * ampere.Value());
+			return SIBase<Watt>.Create(volt.Value() / ampere.Value());
 		}
 	}
 
-    /// <summary>
-    /// SI Class for Amperer [V].
-    /// V = kgm^2/As^2
-    /// </summary>
-    public class Volt : SIBase<Volt>
+	/// <summary>
+	/// SI Class for Amperer [V].
+	/// V = kgm^2/As^2
+	/// </summary>
+	public class Volt : SIBase<Volt>
 	{
-	    private static readonly int[] SIDefault = new int[7] { 1, 2, -2, -1, 0, 0, 0 };
-        private Volt(double val) : base(val, SIDefault) {}
+		private static readonly int[] Units = { 1, 2, -2, -1, 0, 0, 0 };
+		private Volt(double val) : base(val, Units) { }
 
 		public static Watt operator *(Volt volt, Ampere ampere)
 		{
@@ -866,7 +812,8 @@ namespace TUGraz.VectoCommon.Utils
 		[DebuggerStepThrough]
 		public static T Create(double val)
 		{
-			if (val == 0) {
+			if (val == 0)
+			{
 				return ZeroPrototype;
 			}
 
@@ -874,16 +821,9 @@ namespace TUGraz.VectoCommon.Utils
 		}
 
 		[DebuggerStepThrough]
-		protected SIBase(double value) : base(value) {}
-
-
-	    [DebuggerStepThrough]
-        protected SIBase(double value, int[] siunits) : base(value)
-	    {
-	        SIUnits = siunits;
-	    }
+		protected SIBase(double value, int[] units) : base(value, units, 0) { }
 
-        [DebuggerStepThrough]
+		[DebuggerStepThrough]
 		public new T Abs()
 		{
 			return Create(Math.Abs(Val));
@@ -1053,171 +993,119 @@ namespace TUGraz.VectoCommon.Utils
 		/// </summary>
 		protected readonly double Val;
 
+		/// <summary>
+		/// The array of the SI units.
+		/// </summary>
+		private readonly int[] _units;
+
+		// TODO mk-2017-09-14: can the mass be solved differently?
+		private UnitInstance.IsMass _isMass;
+
+		/// <summary>
+		/// Initializes a new instance of the <see cref="SI"/> class which allows to construct a new SI with all parameters.
+		/// </summary>
+		/// <param name="val">The value.</param>
+		/// <param name="units">The units.</param>
+		/// <param name="isMassParam"></param>
+		protected SI(double val, int[] units, UnitInstance.IsMass isMassParam)
+		{
+			Val = val;
+			_isMass = isMassParam;
+			_units = units;
+
+			if (double.IsNaN(Val))
+			{
+				throw new VectoException("NaN [{0}] is not allowed for SI-Values in Vecto.", GetUnitString());
+			}
 
-        /// <summary>
-        /// The array of the SI units.
-        /// </summary>
-        protected int[] SIUnits;
-
-        protected UnitInstance.IsMass isMass;
-
-
-
-        /// <summary>
-        /// Initializes a new instance of the <see cref="SI"/> class without any units (dimensionless, scalar) [-].
-        /// </summary>
-        /// <param name="val">The value.</param>
-        //[DebuggerHidden]
-        public SI(double val = 0.0)
-        {
-            Val = val;
-
-            SIUnits = new int[7] { 0, 0, 0, 0, 0, 0, 0 };
-            isMass = UnitInstance.IsMass.IsKiloGramm;
-
-            if (double.IsNaN(val))
-            {
-                throw new VectoException("NaN [{0}] is not allowed for SI-Values in Vecto.", GetUnitString());
-            }
-
-            if (double.IsInfinity(Val))
-            {
-                throw new VectoException("Infinity [{0}] is not allowed for SI-Values in Vecto.", GetUnitString());
-            }
-        }
-
-        /// <summary>
-        /// Initializes a new instance of the <see cref="SI"/> class which allows to construct a new SI with all parameters.
-        /// </summary>
-        /// <param name="val">The value.</param>
-        /// <param name="numerator">The numerator.</param>
-        /// <param name="denominator">The denominator.</param>
-        /// <param name="reciproc">if set to <c>true</c> then the object is in reciproc mode (1/...)</param>
-        /// <param name="reverse">if set to <c>true</c> then the object is in reverse convertion mode (e.g. rpm/min => rad/s).</param>
-        /// <param name="exponent">The exponent for further conversions (e.g. Square.Meter).</param>
-        //protected SI(double val, int[] siunits, bool reciproc = false,
-        //    bool reverse = false, int exponent = 1)
-        protected SI(double val, int[] siunits, UnitInstance.IsMass isMassParam)
-        {
-            Val = val;
-            isMass = isMassParam;
-
-            SIUnits = siunits;
-
-
-            if (double.IsNaN(Val))
-            {
-                throw new VectoException("NaN [{0}] is not allowed for SI-Values in Vecto.", GetUnitString());
-            }
-
-            if (double.IsInfinity(Val))
-            {
-                throw new VectoException("Infinity [{0}] is not allowed for SI-Values in Vecto.", GetUnitString());
-            }
-        }
-
-	    public SI(UnitInstance si, double val = 0) : this(val * si.Getfactor, si.GetSIUnits(),si.GetGrammMode()){
-       
-        }
-
-        /// <summary>
-        /// Initializes a new instance of the <see cref="SI"/> class which copies the units from an already existing SI.
-        /// </summary>
-        /// <param name="val">The value.</param>
-        /// <param name="unit">The unit.</param>
-        [DebuggerHidden]
-        private SI(double val, SI unit) : this(val, unit.SIUnits, unit.isMass) {}
-
-        //[DebuggerHidden]
-        //protected SI(SI si, double? factor = null, int[] siUnitsParam = null,
-        //    bool? reciproc = null, bool? reverse = null, int? exponent = null)
-	    protected SI(SI si, double factor , int[] siUnitsParam, UnitInstance.IsMass isMassParam)
-        {
-
-            Val = si.Val / factor;
-            isMass = isMassParam;
-            SIUnits = siUnitsParam;
-
-
-            if (double.IsNaN(Val))
-            {
-                throw new VectoException("NaN [{0}] is not allowed for SI-Values in Vecto.", GetUnitString());
-            }
-
-            if (double.IsInfinity(Val))
-            {
-                throw new VectoException("Infinity [{0}] is not allowed for SI-Values in Vecto.", GetUnitString());
-            }
-        }
-
-
-
-
-		///////// <summary>
-		///////// Converts the SI unit to another SI unit, defined by term(s) following after the ConvertTo().
-		///////// The Conversion Mode is active until an arithmetic operator is used (+,-,*,/), 
-		///////// or the .Value-Method, or the .Cast-Method were called.
-		///////// ATTENTION: Before returning an SI Unit, ensure to cancel Conversion Mode (with or Cast).
-		///////// </summary>
-		///////// <returns></returns>
-		//////[DebuggerHidden]
-		//////public SI ConvertTo()
-		//////{
-		//////    return new SI(Linear, reciproc: false, reverse: true);
-		//////}
-
-	    public SI ConvertTo(UnitInstance si)
-	    {
-
-	        if (!SIUtils.CompareUnits(SIUnits, si.GetSIUnits()))
-	        {
-	            throw new VectoException(
-	                "Unit missing. Conversion not possible. [{0}] does not contain a [{1}].",
-	                GetUnitString(SIUnits), si.GetSIUnits());
-	        }
-
-            double factorValue = si.Getfactor;
-
-
-	        if ((isMass & UnitInstance.IsMass.IsGramm) == UnitInstance.IsMass.IsGramm)
-	        {
-	            factorValue *= 1000;
-	        }
-
-	        if((si.GetGrammMode() & UnitInstance.IsMass.IsGramm) == UnitInstance.IsMass.IsGramm)
-            {
-                factorValue /= 1000;
-                isMass |= UnitInstance.IsMass.IsGramm;
-            }
-
-
-            return new SI(this, siUnitsParam: si.GetSIUnits(), factor: factorValue,
-                isMassParam: isMass);
-        }
-
-        /// <summary>
-        /// Casts the SI Unit to the concrete unit type (if the units allow such an cast).
-        /// </summary>
-        /// <typeparam name="T">the specialized SI unit. e.g. Watt, NewtonMeter, Second</typeparam>
-        //[DebuggerHidden]
-        public T Cast<T>() where T : SIBase<T>
-        {
-            //MyTrace.Scan(new StackTrace(true));
-            var si = ToBasicUnits();
-            var t = SIBase<T>.Create(si.Val);
-            if (!si.HasEqualUnit(t))
-            {
-                throw new VectoException("SI Unit Conversion failed: From {0} to {1}", si, t);
-            }
-            return t;
-        }
-
-        /// <summary>
-        /// Converts the derived SI units to the basic units and returns this as a new SI object.
-        /// </summary>
-        public SI ToBasicUnits()
-		{
-		    return new SI(Val, SIUnits,isMass);
+			if (double.IsInfinity(Val))
+			{
+				throw new VectoException("Infinity [{0}] is not allowed for SI-Values in Vecto.", GetUnitString());
+			}
+		}
+
+		public SI(UnitInstance si, double val = 0) : this(val * si.Factor, si.GetSIUnits(), si.GetGrammMode())
+		{
+
+		}
+
+		/// <summary>
+		/// Initializes a new instance of the <see cref="SI"/> class which copies the units from an already existing SI.
+		/// </summary>
+		/// <param name="val">The value.</param>
+		/// <param name="unit">The unit.</param>
+		[DebuggerHidden]
+		private SI(double val, SI unit) : this(val, unit._units, unit._isMass) { }
+
+		[DebuggerHidden]
+		private SI(SI si, double factor, int[] unitsParam, UnitInstance.IsMass isMassParam)
+		{
+			Val = si.Val / factor;
+			_isMass = isMassParam;
+			_units = unitsParam;
+
+			if (double.IsNaN(Val))
+			{
+				throw new VectoException("NaN [{0}] is not allowed for SI-Values in Vecto.", GetUnitString());
+			}
+
+			if (double.IsInfinity(Val))
+			{
+				throw new VectoException("Infinity [{0}] is not allowed for SI-Values in Vecto.", GetUnitString());
+			}
+		}
+
+		public SI ConvertTo(UnitInstance si)
+		{
+
+			if (!SIUtils.CompareUnits(_units, si.GetSIUnits()))
+			{
+				throw new VectoException(
+					"Unit missing. Conversion not possible. [{0}] does not contain a [{1}].",
+					GetUnitString(_units), si.GetSIUnits());
+			}
+
+			var factorValue = si.Factor;
+
+
+			if ((_isMass & UnitInstance.IsMass.IsGramm) == UnitInstance.IsMass.IsGramm)
+			{
+				factorValue *= 1000;
+			}
+
+			if ((si.GetGrammMode() & UnitInstance.IsMass.IsGramm) == UnitInstance.IsMass.IsGramm)
+			{
+				factorValue /= 1000;
+				_isMass |= UnitInstance.IsMass.IsGramm;
+			}
+
+
+			return new SI(this, unitsParam: si.GetSIUnits(), factor: factorValue,
+				isMassParam: _isMass);
+		}
+
+		/// <summary>
+		/// Casts the SI Unit to the concrete unit type (if the units allow such an cast).
+		/// </summary>
+		/// <typeparam name="T">the specialized SI unit. e.g. Watt, NewtonMeter, Second</typeparam>
+		[DebuggerHidden]
+		public T Cast<T>() where T : SIBase<T>
+		{
+			var si = ToBasicUnits();
+			var t = SIBase<T>.Create(si.Val);
+			if (!si.HasEqualUnit(t))
+			{
+				throw new VectoException("SI Unit Conversion failed: From {0} to {1}", si, t);
+			}
+			return t;
+		}
+
+		/// <summary>
+		/// Converts the derived SI units to the basic units and returns this as a new SI object.
+		/// </summary>
+		public SI ToBasicUnits()
+		{
+			return new SI(Val, _units, _isMass);
 		}
 
 
@@ -1235,13 +1123,13 @@ namespace TUGraz.VectoCommon.Utils
 		/// </summary>
 		public SI Clone()
 		{
-		    return new SI(Val, SIUnits,isMass);
-        }
+			return new SI(Val, _units, _isMass);
+		}
 
 		/// <summary>
 		/// Returns the absolute value.
 		/// </summary>
-		public virtual SI Abs()
+		public SI Abs()
 		{
 			return new SI(Math.Abs(Val), this);
 		}
@@ -1255,399 +1143,203 @@ namespace TUGraz.VectoCommon.Utils
 		{
 			return Math.Sign(Val);
 		}
-   
-        private static double GToKG(SI si)
-        {
-            double result = 1.0;
-
-            if ((si.isMass & UnitInstance.IsMass.IsGramm) == UnitInstance.IsMass.IsGramm)
-            {
-                result = 0.001;
-            }
-
-            return result;
-        }
-
-        #region Operators
-
-        /// <summary>
-        /// Implements the operator +.
-        /// </summary>
-        /// <param name="si1">The si1.</param>
-        /// <param name="si2">The si2.</param>
-        /// <returns>
-        /// The result of the operator.
-        /// </returns>
-        /// <exception cref="VectoException"></exception>
-        [DebuggerHidden]
-	    public static SI operator +(SI si1, SI si2)
-	    {
-	        if (!si1.HasEqualUnit(si2))
-	        {
-	            throw new VectoException("Operator '+' can only operate on SI Objects with the same unit. Got: {0} + {1}", si1, si2);
-	        }
-
-
-            return new SI(si1.Val * GToKG(si1) + ( si2.Val * GToKG(si2)) )
-	        {
-	            SIUnits = si1.SIUnits
-	        };
-	    }
-
-        /// <summary>
-        /// Implements the operator -.
-        /// </summary>
-        /// <param name="si1">The si1.</param>
-        /// <param name="si2">The si2.</param>
-        /// <returns>
-        /// The result of the operator.
-        /// </returns>
-        /// <exception cref="VectoException"></exception>
-        [DebuggerHidden]
-	    public static SI operator -(SI si1, SI si2)
-	    {
-	        if (!si1.HasEqualUnit(si2))
-	        {
-	            throw new VectoException("Operator '-' can only operate on SI Objects with the same unit. Got: {0} - {1}", si1, si2);
-	        }
-	        return new SI(si1.Val * GToKG(si1) - (si2.Val * GToKG(si2)))
-	        {
-	            SIUnits = si1.SIUnits
-	        };
-	    }
-
-        /// <summary>
-        /// Implements the operator -.
-        /// </summary>
-        /// <param name="si1">The si1.</param>
-        /// <returns>
-        /// The result of the operator.
-        /// </returns>
-        [DebuggerHidden]
-	    public static SI operator -(SI si1)
-	    {
-	        return new SI(-si1.Val * GToKG(si1))
-	        {
-	            SIUnits = si1.SIUnits
-	        };
-	    }
-
-        /// <summary>
-        /// Implements the operator *.
-        /// </summary>
-        /// <param name="si1">The si1.</param>
-        /// <param name="si2">The si2.</param>
-        /// <returns>
-        /// The result of the operator.
-        /// </returns>
-        public static SI operator *(SI si1, SI si2)
-        {
-            int[] unitArray = new int[7];
-            unitArray = SIUtils.CombineUnits(si1.SIUnits, si2.SIUnits);
-
-            //return new SI(si1.Val * si2.Val , unitArray, si1.isMass);
-            return new SI(si1.Val * GToKG(si1) * (si2.Val * GToKG(si2)), unitArray, UnitInstance.IsMass.IsKiloGramm);
-        }
-
-        /// <summary>
-        /// Implements the operator *.
-        /// </summary>
-        /// <param name="si1">The si1.</param>
-        /// <param name="d">The d.</param>
-        /// <returns>
-        /// The result of the operator.
-        /// </returns>
-        [DebuggerHidden]
-	    public static SI operator *(SI si1, double d)
-	    {
-	        return new SI(si1.Val * GToKG(si1) * d)
-	        {
-	            SIUnits = si1.SIUnits
-	        };
-	    }
-
-        /// <summary>
-        /// Implements the operator *.
-        /// </summary>
-        /// <param name="d">The d.</param>
-        /// <param name="si1">The si1.</param>
-        /// <returns>
-        /// The result of the operator.
-        /// </returns>
-        [DebuggerHidden]
-	    public static SI operator *(double d, SI si1)
-	    {
-	        return new SI(d * si1.Val * GToKG(si1))
-	        {
-	            SIUnits = si1.SIUnits
-	        };
-	    }
-
-        /// <summary>
-        /// Implements the operator /.
-        /// </summary>
-        /// <param name="si1">The si1.</param>
-        /// <param name="si2">The si2.</param>
-        /// <returns>
-        /// The result of the operator.
-        /// </returns>
-	    public static SI operator /(SI si1, SI si2)
-	    {
-	        double result;
-	        try
-	        {
-	            result = si1.Val * GToKG(si1) / (si2.Val * GToKG(si2));
-
-	            // bad cases: Infinity = x / 0.0  (for x != 0), NaN = 0.0 / 0.0
-	            if (double.IsInfinity(result) || double.IsNaN(result))
-	            {
-	                throw new DivideByZeroException();
-	            }
-	        }
-	        catch (DivideByZeroException ex)
-	        {
-	            throw new VectoException(
-	                string.Format("Can not compute division by zero ([{0}] / 0[{1}])", si1.GetUnitString(), si2.GetUnitString()), ex);
-	        }
-
-	        int[] unitArray = new int[7];
-	        unitArray = SIUtils.CombineUnits(
-	            si1.SIUnits, SIUtils.MultiplyUnits(si2.SIUnits, -1));
-
-	        return new SI(result, unitArray, UnitInstance.IsMass.IsKiloGramm);
-	    }
-
-        /// <summary>
-        /// Implements the operator /.
-        /// </summary>
-        /// <param name="si1">The si1.</param>
-        /// <param name="d">The d.</param>
-        /// <returns>
-        /// The result of the operator.
-        /// </returns>
-        [DebuggerHidden]
-	    public static SI operator /(SI si1, double d)
-	    {
-	        if (d.IsEqual(0))
-	        {
-	            throw new VectoException(string.Format("Can not compute division by zero ([{0}] / 0)", si1.GetUnitString()),
-	                new DivideByZeroException());
-	        }
-
-	        return new SI((si1.Val * GToKG(si1)) / d)
-	        {
-	            SIUnits = si1.SIUnits
-	        };
-	    }
-
-        /// <summary>
-        /// Implements the operator /.
-        /// </summary>
-        /// <param name="d">The d.</param>
-        /// <param name="si1">The si1.</param>
-        /// <returns>
-        /// The result of the operator.
-        /// </returns>
-        [DebuggerHidden]
-	    public static SI operator /(double d, SI si1)
-	    {
-	        if (si1.IsEqual(0))
-	        {
-	            throw new VectoException(string.Format("Can not compute division by zero (x / 0[{0}])", si1.GetUnitString()),
-	                new DivideByZeroException());
-	        }
-
-	        return new SI(d / (si1.Val * GToKG(si1)))
-	        {
-	            SIUnits = SIUtils.MultiplyUnits(si1.SIUnits, -1)
-	        };
-	    }
-
-        /// <summary>
-        /// Implements the operator &lt;.
-        /// </summary>
-        /// <param name="si1">The si1.</param>
-        /// <param name="si2">The si2.</param>
-        /// <returns>
-        /// The result of the operator.
-        /// </returns>
-        /// <exception cref="VectoException"></exception>
-        [DebuggerHidden]
-		[MethodImpl(MethodImplOptions.AggressiveInlining)]
+
+		// TODO mk 2017-09-14: can this method be removed?
+		private static double GtoKg(SI si)
+		{
+			var result = 1.0;
+
+			if ((si._isMass & UnitInstance.IsMass.IsGramm) == UnitInstance.IsMass.IsGramm)
+			{
+				result = 0.001;
+			}
+
+			return result;
+		}
+
+		#region Operators
+
+		[DebuggerHidden]
+		public static SI operator +(SI si1, SI si2)
+		{
+			if (!si1.HasEqualUnit(si2))
+			{
+				throw new VectoException("Operator '+' can only operate on SI Objects with the same unit. Got: {0} + {1}", si1, si2);
+			}
+
+
+			return new SI(si1.Val * GtoKg(si1) + si2.Val * GtoKg(si2), si1);
+		}
+
+		[DebuggerHidden]
+		public static SI operator -(SI si1, SI si2)
+		{
+			if (!si1.HasEqualUnit(si2))
+			{
+				throw new VectoException("Operator '-' can only operate on SI Objects with the same unit. Got: {0} - {1}", si1, si2);
+			}
+			return new SI(si1.Val * GtoKg(si1) - si2.Val * GtoKg(si2), si1);
+		}
+
+		[DebuggerHidden]
+		public static SI operator -(SI si1)
+		{
+			return new SI(-si1.Val * GtoKg(si1), si1);
+		}
+
+		public static SI operator *(SI si1, SI si2)
+		{
+			var unitArray = SIUtils.CombineUnits(si1._units, si2._units);
+			return new SI(si1.Val * GtoKg(si1) * (si2.Val * GtoKg(si2)), unitArray, UnitInstance.IsMass.IsKiloGramm);
+		}
+
+		[DebuggerHidden]
+		public static SI operator *(SI si1, double d)
+		{
+			return new SI(si1.Val * GtoKg(si1) * d, si1);
+		}
+
+		[DebuggerHidden]
+		public static SI operator *(double d, SI si1)
+		{
+			return new SI(d * si1.Val * GtoKg(si1), si1);
+		}
+
+		public static SI operator /(SI si1, SI si2)
+		{
+			double result;
+			try
+			{
+				result = si1.Val * GtoKg(si1) / (si2.Val * GtoKg(si2));
+
+				// bad cases: Infinity = x / 0.0  (for x != 0), NaN = 0.0 / 0.0
+				if (double.IsInfinity(result) || double.IsNaN(result))
+				{
+					throw new DivideByZeroException();
+				}
+			}
+			catch (DivideByZeroException ex)
+			{
+				throw new VectoException(
+					string.Format("Can not compute division by zero ([{0}] / 0[{1}])", si1.GetUnitString(), si2.GetUnitString()), ex);
+			}
+
+			var unitArray = SIUtils.CombineUnits(si1._units, SIUtils.MultiplyUnits(si2._units, -1));
+
+			return new SI(result, unitArray, UnitInstance.IsMass.IsKiloGramm);
+		}
+
+		[DebuggerHidden]
+		public static SI operator /(SI si1, double d)
+		{
+			if (d.IsEqual(0))
+			{
+				throw new VectoException(string.Format("Can not compute division by zero ([{0}] / 0)", si1.GetUnitString()), new DivideByZeroException());
+			}
+
+			return new SI(si1.Val * GtoKg(si1) / d, si1);
+		}
+
+		[DebuggerHidden]
+		public static SI operator /(double d, SI si1)
+		{
+			if (si1.IsEqual(0))
+			{
+				throw new VectoException(string.Format("Can not compute division by zero (x / 0[{0}])", si1.GetUnitString()),
+					new DivideByZeroException());
+			}
+
+			return new SI(d / (si1.Val * GtoKg(si1)), si1._units.Select(u => -u).ToArray(), si1._isMass);
+		}
+
+		[DebuggerHidden]
 		public static bool operator <(SI si1, SI si2)
 		{
-			if (!si1.HasEqualUnit(si2)) {
+			if (!si1.HasEqualUnit(si2))
+			{
 				throw new VectoException("Operator '<' can only operate on SI Objects with the same unit. Got: {0} < {1}", si1, si2);
 			}
-			return si1.Val * GToKG(si1) < si2.Val * GToKG(si2);
+			return si1.Val * GtoKg(si1) < si2.Val * GtoKg(si2);
 		}
 
-		/// <summary>
-		/// Implements the operator &lt;.
-		/// </summary>
-		/// <param name="si1">The si1.</param>
-		/// <param name="d">The d.</param>
-		/// <returns>
-		/// The result of the operator.
-		/// </returns>
 		[DebuggerHidden]
 		public static bool operator <(SI si1, double d)
 		{
-			return si1 != null && si1.Val * GToKG(si1) < d;
+			return si1 != null && si1.Val * GtoKg(si1) < d;
 		}
 
-		/// <summary>
-		/// Implements the operator &gt;.
-		/// </summary>
-		/// <param name="si1">The si1.</param>
-		/// <param name="si2">The si2.</param>
-		/// <returns>
-		/// The result of the operator.
-		/// </returns>
-		/// <exception cref="VectoException"></exception>
 		[DebuggerHidden]
-		[MethodImpl(MethodImplOptions.AggressiveInlining)]
 		public static bool operator >(SI si1, SI si2)
 		{
-			if (!si1.HasEqualUnit(si2)) {
+			if (!si1.HasEqualUnit(si2))
+			{
 				throw new VectoException("Operator '>' can only operate on SI Objects with the same unit. Got: {0} > {1}", si1, si2);
 			}
-			return si1.Val * GToKG(si1) > si2.Val * GToKG(si2);
+			return si1.Val * GtoKg(si1) > si2.Val * GtoKg(si2);
 		}
 
-		/// <summary>
-		/// Implements the operator &gt;.
-		/// </summary>
-		/// <param name="si1">The si1.</param>
-		/// <param name="d">The d.</param>
-		/// <returns>
-		/// The result of the operator.
-		/// </returns>
 		[DebuggerHidden]
 		public static bool operator >(SI si1, double d)
 		{
-			return si1 != null && si1.Val * GToKG(si1) > d;
+			return si1 != null && si1.Val * GtoKg(si1) > d;
 		}
 
-		/// <summary>
-		/// Implements the operator &gt;.
-		/// </summary>
-		/// <param name="d">The d.</param>
-		/// <param name="si1">The si1.</param>
-		/// <returns>
-		/// The result of the operator.
-		/// </returns>
 		[DebuggerHidden]
 		public static bool operator >(double d, SI si1)
 		{
-			return si1 != null && d > si1.Val * GToKG(si1);
+			return si1 != null && d > si1.Val * GtoKg(si1);
 		}
 
-		/// <summary>
-		/// Implements the operator &lt;.
-		/// </summary>
-		/// <param name="d">The d.</param>
-		/// <param name="si1">The si1.</param>
-		/// <returns>
-		/// The result of the operator.
-		/// </returns>
 		[DebuggerHidden]
 		public static bool operator <(double d, SI si1)
 		{
-			return si1 != null && d < si1.Val * GToKG(si1);
+			return si1 != null && d < si1.Val * GtoKg(si1);
 		}
 
-		/// <summary>
-		/// Implements the operator &lt;=.
-		/// </summary>
-		/// <param name="si1">The si1.</param>
-		/// <param name="si2">The si2.</param>
-		/// <returns>
-		/// The result of the operator.
-		/// </returns>
-		/// <exception cref="VectoException"></exception>
 		[DebuggerHidden]
 		public static bool operator <=(SI si1, SI si2)
 		{
-			if (!si1.HasEqualUnit(si2)) {
+			if (!si1.HasEqualUnit(si2))
+			{
 				throw new VectoException("Operator '<=' can only operate on SI Objects with the same unit. Got: {0} <= {1}", si1,
 					si2);
 			}
-			return si1.Val * GToKG(si1) <= si2.Val * GToKG(si2);
+			return si1.Val * GtoKg(si1) <= si2.Val * GtoKg(si2);
 		}
 
-		/// <summary>
-		/// Implements the operator &lt;=.
-		/// </summary>
-		/// <param name="si1">The si1.</param>
-		/// <param name="d">The d.</param>
-		/// <returns>
-		/// The result of the operator.
-		/// </returns>
 		[DebuggerHidden]
 		public static bool operator <=(SI si1, double d)
 		{
-			return si1 != null && si1.Val * GToKG(si1) <= d;
+			return si1 != null && si1.Val * GtoKg(si1) <= d;
 		}
 
-		/// <summary>
-		/// Implements the operator &gt;=.
-		/// </summary>
-		/// <param name="si1">The si1.</param>
-		/// <param name="si2">The si2.</param>
-		/// <returns>
-		/// The result of the operator.
-		/// </returns>
-		/// <exception cref="VectoException"></exception>
 		[DebuggerHidden]
 		public static bool operator >=(SI si1, SI si2)
 		{
-			if (!si1.HasEqualUnit(si2)) {
+			if (!si1.HasEqualUnit(si2))
+			{
 				throw new VectoException("Operator '>=' can only operate on SI Objects with the same unit. Got: {0} >= {1}", si1,
 					si2);
 			}
-			return si1.Val * GToKG(si1) >= si2.Val * GToKG(si2);
+			return si1.Val * GtoKg(si1) >= si2.Val * GtoKg(si2);
 		}
 
-		/// <summary>
-		/// Implements the operator &gt;=.
-		/// </summary>
-		/// <param name="si1">The si1.</param>
-		/// <param name="d">The d.</param>
-		/// <returns>
-		/// The result of the operator.
-		/// </returns>
 		[DebuggerHidden]
 		public static bool operator >=(SI si1, double d)
 		{
-			return si1 != null && si1.Val * GToKG(si1) >= d;
+			return si1 != null && si1.Val * GtoKg(si1) >= d;
 		}
 
-		/// <summary>
-		/// Implements the operator &gt;=.
-		/// </summary>
-		/// <param name="d">The d.</param>
-		/// <param name="si1">The lower.</param>
-		/// <returns>
-		/// The result of the operator.
-		/// </returns>
 		[DebuggerHidden]
 		public static bool operator >=(double d, SI si1)
 		{
-			return si1 != null && d >= si1.Val * GToKG(si1);
+			return si1 != null && d >= si1.Val * GtoKg(si1);
 		}
 
-		/// <summary>
-		/// Implements the operator &lt;=.
-		/// </summary>
-		/// <param name="d">The d.</param>
-		/// <param name="si1">The lower.</param>
-		/// <returns>
-		/// The result of the operator.
-		/// </returns>
+		[DebuggerHidden]
 		public static bool operator <=(double d, SI si1)
 		{
-			return si1 != null && d <= si1.Val * GToKG(si1);
+			return si1 != null && d <= si1.Val * GtoKg(si1);
 		}
 
 		/// <summary>
@@ -1658,18 +1350,18 @@ namespace TUGraz.VectoCommon.Utils
 		/// <returns></returns>
 		public bool IsBetween(SI lower, SI upper)
 		{
-			return lower <= Val * GToKG(this) && Val * GToKG(this) <= upper;
+			return lower <= Val * GtoKg(this) && Val * GtoKg(this) <= upper;
 		}
 
 		/// <summary>
-		/// Determines whether the SI is between lower and uppper bound.
+		/// Determines whether the SI is between lower and upper bound.
 		/// </summary>
 		/// <param name="lower">The lower bound.</param>
 		/// <param name="upper">The upper bound.</param>
 		/// <returns></returns>
 		public bool IsBetween(double lower, double upper)
 		{
-			return lower <= Val * GToKG(this) && Val * GToKG(this) <= upper;
+			return lower <= Val * GtoKg(this) && Val * GtoKg(this) <= upper;
 		}
 
 		#endregion
@@ -1679,36 +1371,24 @@ namespace TUGraz.VectoCommon.Utils
 		/// <summary>
 		///     Returns the Unit Part of the SI Unit Expression.
 		/// </summary>
-	    public string GetUnitString(int[] SIUnitParam = null)
-	    {
-            if (SIUnitParam == null)
-            {
-                SIUnitParam = SIUnits;
-            }
-	        return Unit.GetUnitString(SIUnitParam,
-                ((isMass & UnitInstance.IsMass.IsGramm) == UnitInstance.IsMass.IsGramm));
-        }
-
-
+		public string GetUnitString(int[] units = null)
+		{
+			if (units == null)
+			{
+				units = _units;
+			}
+			return Unit.GetUnitString(units, (_isMass & UnitInstance.IsMass.IsGramm) == UnitInstance.IsMass.IsGramm);
+		}
 
-        /// <summary>
-        ///     Returns the String representation.
-        /// </summary>
-        public override string ToString()
+		public override string ToString()
 		{
 			return ToString(null);
 		}
 
-		/// <summary>
-		/// Returns a <see cref="System.String" /> that represents this instance.
-		/// </summary>
-		/// <param name="format">The format.</param>
-		/// <returns>
-		/// A <see cref="System.String" /> that represents this instance.
-		/// </returns>
 		private string ToString(string format)
 		{
-			if (string.IsNullOrEmpty(format)) {
+			if (string.IsNullOrEmpty(format))
+			{
 				format = "F4";
 			}
 
@@ -1717,8 +1397,6 @@ namespace TUGraz.VectoCommon.Utils
 
 		#endregion
 
-
-
 		#region Equality members
 
 		/// <summary>
@@ -1727,11 +1405,10 @@ namespace TUGraz.VectoCommon.Utils
 		/// <param name="si">The si.</param>
 		/// <returns></returns>
 		[DebuggerHidden]
-		[MethodImpl(MethodImplOptions.AggressiveInlining)]
 		public bool HasEqualUnit(SI si)
 		{
-		    return SIUtils.CompareUnits(SIUnits, si.SIUnits);
-    	}
+			return SIUtils.CompareUnits(_units, si._units);
+		}
 
 		/// <summary>
 		/// Determines whether the specified <see cref="System.Object" />, is equal to this instance.
@@ -1742,18 +1419,19 @@ namespace TUGraz.VectoCommon.Utils
 		/// </returns>
 		public override bool Equals(object obj)
 		{
-			if (ReferenceEquals(null, obj)) {
+			if (ReferenceEquals(null, obj))
+			{
 				return false;
 			}
-			if (ReferenceEquals(this, obj)) {
+			if (ReferenceEquals(this, obj))
+			{
 				return true;
 			}
 			var other = obj as SI;
 
-            double ValFac = Val * GToKG(this);
-            return other != null && ValFac.Equals(other.Val * GToKG(other)) && HasEqualUnit(other);
-            //return other != null && Val.Equals(other.Val )  && HasEqualUnit(other);
-        }
+			var valFac = Val * GtoKg(this);
+			return other != null && valFac.Equals(other.Val * GtoKg(other)) && HasEqualUnit(other);
+		}
 
 		/// <summary>
 		/// Determines whether the specified si is equal.
@@ -1763,12 +1441,9 @@ namespace TUGraz.VectoCommon.Utils
 		/// <returns></returns>
 		public bool IsEqual(SI si, SI tolerance = null)
 		{
-            double ValFac = Val * GToKG(this);
-            return (tolerance == null || HasEqualUnit(tolerance)) && HasEqualUnit(si) &&
-                   ValFac.IsEqual(si.Val * GToKG(si), tolerance == null ? DoubleExtensionMethods.Tolerance : (tolerance.Value() * GToKG(tolerance)));
-            //return (tolerance == null || HasEqualUnit(tolerance)) && HasEqualUnit(si) &&
-            //       Val.IsEqual(si.Val, tolerance == null ? DoubleExtensionMethods.Tolerance :( tolerance.Value()));
-        }
+			var valFac = Val * GtoKg(this);
+			return (tolerance == null || HasEqualUnit(tolerance)) && HasEqualUnit(si) && valFac.IsEqual(si.Val * GtoKg(si), tolerance == null ? DoubleExtensionMethods.Tolerance : (tolerance.Value() * GtoKg(tolerance)));
+		}
 
 		/// <summary>
 		/// Determines whether the specified value is equal.
@@ -1779,10 +1454,9 @@ namespace TUGraz.VectoCommon.Utils
 		[DebuggerHidden]
 		public bool IsEqual(double val, double tolerance = DoubleExtensionMethods.Tolerance)
 		{
-            double ValFac = Val * GToKG(this);
-            return ValFac.IsEqual(val, tolerance);
-            //return Val.IsEqual(val, tolerance);
-        }
+			var valFac = Val * GtoKg(this);
+			return valFac.IsEqual(val, tolerance);
+		}
 
 		/// <summary>
 		/// Determines whether the specified si is smaller.
@@ -1792,17 +1466,18 @@ namespace TUGraz.VectoCommon.Utils
 		/// <returns></returns>
 		public bool IsSmaller(SI si, SI tolerance = null)
 		{
-			if (!HasEqualUnit(si)) {
+			if (!HasEqualUnit(si))
+			{
 				throw new VectoException("compared value has to be the same unit. Got: {0} <=> {1}", this, si);
 			}
-			if (tolerance != null && !HasEqualUnit(tolerance)) {
+			if (tolerance != null && !HasEqualUnit(tolerance))
+			{
 				throw new VectoException("tolerance has to be the same unit. Got: {0} <=> {1}", this, tolerance);
 			}
 
-            double ValFac = Val * GToKG(this);
-            return ValFac.IsSmaller(si.Val * GToKG(si), tolerance == null ? DoubleExtensionMethods.Tolerance :( tolerance.Value() * GToKG(tolerance)));
-            //return Val.IsSmaller(si.Val, tolerance == null ? DoubleExtensionMethods.Tolerance : tolerance.Value());
-        }
+			var valFac = Val * GtoKg(this);
+			return valFac.IsSmaller(si.Val * GtoKg(si), tolerance == null ? DoubleExtensionMethods.Tolerance : (tolerance.Value() * GtoKg(tolerance)));
+		}
 
 		/// <summary>
 		/// Determines whether the specified si is smaller.
@@ -1812,14 +1487,14 @@ namespace TUGraz.VectoCommon.Utils
 		/// <returns></returns>
 		public bool IsSmaller(SI si, double tolerance)
 		{
-			if (!HasEqualUnit(si)) {
+			if (!HasEqualUnit(si))
+			{
 				throw new VectoException("compared value has to be the same unit. Got: {0} <=> {1}", this, si);
 			}
 
-            double ValFac = Val * GToKG(this);
-            return ValFac.IsSmaller(si.Val * GToKG(si), tolerance);
-            //return Val.IsSmaller(si.Val, tolerance);
-        }
+			var valFac = Val * GtoKg(this);
+			return valFac.IsSmaller(si.Val * GtoKg(si), tolerance);
+		}
 
 		/// <summary>
 		/// Determines whether [is smaller or equal] [the specified si].
@@ -1829,18 +1504,19 @@ namespace TUGraz.VectoCommon.Utils
 		/// <returns></returns>
 		public bool IsSmallerOrEqual(SI si, SI tolerance = null)
 		{
-			if (!HasEqualUnit(si)) {
+			if (!HasEqualUnit(si))
+			{
 				throw new VectoException("compared value has to be the same unit. Got: {0} <=> {1}", this, si);
 			}
-			if (tolerance != null && !HasEqualUnit(tolerance)) {
+			if (tolerance != null && !HasEqualUnit(tolerance))
+			{
 				throw new VectoException("tolerance has to be the same unit. Got: {0} <=> {1}", this, tolerance);
 			}
 
-            double ValFac = Val * GToKG(this);
+			var valFac = Val * GtoKg(this);
 
-            return ValFac.IsSmallerOrEqual(si.Val * GToKG(si), tolerance == null ? DoubleExtensionMethods.Tolerance : (tolerance.Value() * GToKG(tolerance)));
-            //return Val.IsSmallerOrEqual(si.Val, tolerance == null ? DoubleExtensionMethods.Tolerance : tolerance.Value());
-        }
+			return valFac.IsSmallerOrEqual(si.Val * GtoKg(si), tolerance == null ? DoubleExtensionMethods.Tolerance : (tolerance.Value() * GtoKg(tolerance)));
+		}
 
 		/// <summary>
 		/// Determines whether the specified si is greater.
@@ -1850,17 +1526,18 @@ namespace TUGraz.VectoCommon.Utils
 		/// <returns></returns>
 		public bool IsGreater(SI si, SI tolerance = null)
 		{
-			if (!HasEqualUnit(si)) {
+			if (!HasEqualUnit(si))
+			{
 				throw new VectoException("compared value has to be the same unit. Got: {0} <=> {1}", this, si);
 			}
-			if (tolerance != null && !HasEqualUnit(tolerance)) {
+			if (tolerance != null && !HasEqualUnit(tolerance))
+			{
 				throw new VectoException("tolerance has to be the same unit. Got: {0} <=> {1}", this, tolerance);
 			}
 
-            double ValFac = Val * GToKG(this);
-            return ValFac.IsGreater(si.Val * GToKG(si), tolerance == null ? DoubleExtensionMethods.Tolerance :( tolerance.Value() * GToKG(tolerance)));
-            //return Val.IsGreater(si.Val, tolerance == null ? DoubleExtensionMethods.Tolerance : tolerance.Value());
-        }
+			var valFac = Val * GtoKg(this);
+			return valFac.IsGreater(si.Val * GtoKg(si), tolerance == null ? DoubleExtensionMethods.Tolerance : (tolerance.Value() * GtoKg(tolerance)));
+		}
 
 		/// <summary>
 		/// Determines whether the specified si is greater.
@@ -1871,15 +1548,15 @@ namespace TUGraz.VectoCommon.Utils
 		[DebuggerStepThrough]
 		public bool IsGreater(SI si, double tolerance)
 		{
-			if (!HasEqualUnit(si)) {
+			if (!HasEqualUnit(si))
+			{
 				throw new VectoException("compared value has to be the same unit. Got: {0} <=> {1}", this, si);
 			}
 
-            double ValFac = Val * GToKG(this);
+			var valFac = Val * GtoKg(this);
 
-            return ValFac.IsGreater(si.Val * GToKG(si), tolerance);
-            //return Val.IsGreater(si.Val, tolerance);
-        }
+			return valFac.IsGreater(si.Val * GtoKg(si), tolerance);
+		}
 
 		/// <summary>
 		/// Determines whether [is greater or equal] [the specified si].
@@ -1890,17 +1567,18 @@ namespace TUGraz.VectoCommon.Utils
 		[DebuggerStepThrough]
 		public bool IsGreaterOrEqual(SI si, SI tolerance = null)
 		{
-			if (!HasEqualUnit(si)) {
+			if (!HasEqualUnit(si))
+			{
 				throw new VectoException("compared value has to be the same unit. Got: {0} <=> {1}", this, si);
 			}
-			if (tolerance != null && !HasEqualUnit(tolerance)) {
+			if (tolerance != null && !HasEqualUnit(tolerance))
+			{
 				throw new VectoException("tolerance has to be the same unit. Got: {0} <=> {1}", this, tolerance);
 			}
 
-            double ValFac = Val * GToKG(this);
-            return ValFac.IsGreaterOrEqual(si.Val * GToKG(si), tolerance == null ? DoubleExtensionMethods.Tolerance : ( tolerance.Value() * GToKG(tolerance)));
-            //return Val.IsGreaterOrEqual(si.Val, tolerance == null ? DoubleExtensionMethods.Tolerance : tolerance.Value());
-        }
+			var valFac = Val * GtoKg(this);
+			return valFac.IsGreaterOrEqual(si.Val * GtoKg(si), tolerance == null ? DoubleExtensionMethods.Tolerance : (tolerance.Value() * GtoKg(tolerance)));
+		}
 
 		/// <summary>
 		/// Determines whether the specified value is smaller.
@@ -1911,8 +1589,8 @@ namespace TUGraz.VectoCommon.Utils
 		[DebuggerStepThrough]
 		public bool IsSmaller(double val, double tolerance = DoubleExtensionMethods.Tolerance)
 		{
-            return Val.IsSmaller(val, tolerance);
-        }
+			return Val.IsSmaller(val, tolerance);
+		}
 
 		/// <summary>
 		/// Determines whether [is smaller or equal] [the specified value].
@@ -1950,75 +1628,47 @@ namespace TUGraz.VectoCommon.Utils
 			return Val.IsGreaterOrEqual(val, tolerance);
 		}
 
-		/// <summary>
-		/// Returns a hash code for this instance.
-		/// </summary>
-		/// <returns>
-		/// A hash code for this instance, suitable for use in hashing algorithms and data structures like a hash table. 
-		/// </returns>
-	    public override int GetHashCode()
-	    {
-	        unchecked
-	        {
-	            // ReSharper disable once NonReadonlyMemberInGetHashCode
-	            var hashCode = Val.GetHashCode();
-	            hashCode = (hashCode * 397) ^ (SIUnits != null ? SIUnits.GetHashCode() : 0);
-	            return hashCode;
-	        }
-	    }
-        /// <summary>
-        /// Compares the current instance with another object of the same type and returns an integer that indicates whether the current instance precedes, follows, or occurs in the same position in the sort order as the other object.
-        /// </summary>
-        /// <param name="obj">An object to compare with this instance.</param>
-        /// <returns>
-        /// A value that indicates the relative order of the objects being compared. The return value has these meanings: Value Meaning Less than zero This instance precedes <paramref name="obj" /> in the sort order. Zero This instance occurs in the same position in the sort order as <paramref name="obj" />. Greater than zero This instance follows <paramref name="obj" /> in the sort order.
-        /// </returns>
-	    public int CompareTo(object obj)
-	    {
-	        var si = obj as SI;
-	        if (si == null)
-	        {
-	            return 1;
-	        }
-
-	        if (!HasEqualUnit(si))
-	        {
-                //if (SIUtils.GetnumberofSIUnits(si.SIUnits) >= SIUtils.GetnumberofSIUnits(SIUnits))
-	            if (si.SIUnits.Sum<int>(n => Math.Abs(n)) >= SIUnits.Sum<int>(n => Math.Abs(n)))
-                {
-	                return -1;
-	            }
-	            return 1;
-	        }
-
-	        if (this > si)
-	        {
-	            return 1;
-	        }
-	        return this < si ? -1 : 0;
-	    }
-
-        /// <summary>
-        /// Implements the operator ==.
-        /// </summary>
-        /// <param name="left">The left.</param>
-        /// <param name="right">The right.</param>
-        /// <returns>
-        /// The result of the operator.
-        /// </returns>
-        public static bool operator ==(SI left, SI right)
+		public override int GetHashCode()
+		{
+			unchecked
+			{
+				// ReSharper disable once NonReadonlyMemberInGetHashCode
+				var hashCode = Val.GetHashCode();
+				hashCode = (hashCode * 397) ^ (_units != null ? _units.GetHashCode() : 0);
+				return hashCode;
+			}
+		}
+
+		public int CompareTo(object obj)
+		{
+			var si = obj as SI;
+			if (si == null)
+			{
+				return 1;
+			}
+
+			if (!HasEqualUnit(si))
+			{
+				//if (SIUtils.GetnumberofSIUnits(si.Units) >= SIUtils.GetnumberofSIUnits(Units))
+				if (si._units.Sum<int>(n => Math.Abs(n)) >= _units.Sum<int>(n => Math.Abs(n)))
+				{
+					return -1;
+				}
+				return 1;
+			}
+
+			if (this > si)
+			{
+				return 1;
+			}
+			return this < si ? -1 : 0;
+		}
+
+		public static bool operator ==(SI left, SI right)
 		{
 			return Equals(left, right);
 		}
 
-		/// <summary>
-		/// Implements the operator !=.
-		/// </summary>
-		/// <param name="left">The left.</param>
-		/// <param name="right">The right.</param>
-		/// <returns>
-		/// The result of the operator.
-		/// </returns>
 		public static bool operator !=(SI left, SI right)
 		{
 			return !Equals(left, right);
@@ -2039,7 +1689,8 @@ namespace TUGraz.VectoCommon.Utils
 			outputFactor = outputFactor ?? 1.0;
 			showUnit = showUnit ?? false;
 
-			if (showUnit.Value) {
+			if (showUnit.Value)
+			{
 				return (Val * outputFactor.Value).ToString("F" + decimals.Value, CultureInfo.InvariantCulture) + " [" +
 						GetUnitString() + "]";
 			}
diff --git a/VectoCommon/VectoCommon/Utils/SIUtils.cs b/VectoCommon/VectoCommon/Utils/SIUtils.cs
index a6961e18954e898c11d98631f594c5eab099208d..aca1a1b905a0812f58f9e05eabcf3a12a3b7b591 100644
--- a/VectoCommon/VectoCommon/Utils/SIUtils.cs
+++ b/VectoCommon/VectoCommon/Utils/SIUtils.cs
@@ -2,597 +2,454 @@
 
 namespace TUGraz.VectoCommon.Utils
 {
-    public struct SIUtils
-    {
-        //new method
-        public static bool CompareUnits(int[] array1, int[] array2)
-        {
-            for (int count = 0; count < array1.Length; count++)
-            {
-                if (array1[count] != array2[count])
-                {
-                    return false;
-                }
-            }
-            return true;
-        }
-
-        //new method
-        public static int[] CombineUnits(int[] array1, int[] array2)
-        {
-            int[] resultarray = new int[array1.Length];
-            for (int count = 0; count < array1.Length; count++)
-            {
-                resultarray[count] = array1[count] + array2[count];
-            }
-            return resultarray;
-
-        }
-
-        //new method
-        public static int[] MultiplyUnits(int[] array1, int factor)
-        {
-            int[] resultarray = new int[array1.Length];
-            for (int count = 0; count < array1.Length; count++)
-            {
-                if (array1[count] != 0)
-                {
-                    resultarray[count] = array1[count] * factor;
-                }
-            }
-            return resultarray;
-        }
-
-        //new method
-        //public static int GetnumberofSIUnits(int[] array)
-        //{
-        //    int resultCount = 0;
-        //    for (int count = 0; count < array.Length; count++)
-        //    {
-        //        resultCount += array[count] < 0 ? array[count] * (-1) : array[count];
-
-        //    }
-        //    return resultCount;
-        //}
-    }
-
-
-    public struct Unit
-    {
-        public static UnitInstance SI
-        {
-            get
-            {
-                return new UnitInstance(new int[7] { 0, 0, 0, 0, 0, 0, 0 }, 1, 1, 1);
-            }
-        }
-
-        /// <summary>
-        /// Enum for defining the Units.
-        /// </summary>
-        //[SuppressMessage("ReSharper", "InconsistentNaming")]
-        private enum SIUnit
-        {
-            kg,
-            m,
-            s,
-            A,
-            K,
-            mol,
-            cd,
-        }
-
-        //public static string GetUnitString(int[] SIUnitParam)
-        public static string GetUnitString(int[] SIUnitParam,bool isGramm)
-        {
-
-            Array unitnames = Enum.GetNames(typeof(SIUnit));
-            string numerator = "";
-            string denominator = "";
-            int potent = 0;
-            string potentStr = "";
-
-
-            for (var i = 0; i < SIUnitParam.Length; i++)
-            {
-                int currentValue = SIUnitParam[i];
-
-
-                potent = Math.Abs(currentValue);
-                potentStr = "";
-                if (currentValue != 0)
-                {
-                    string currentUnit = (string)unitnames.GetValue(i);
-                    if(currentUnit == "kg" && isGramm == true)
-                    {
-                        currentUnit = "g";
-                    }
-
-
-                    if (potent > 1)
-                    {
-                        potentStr = "^" + potent;
-                    }
-
-                    if (currentValue > 0)
-                    {
-                        numerator += currentUnit + potentStr;
-
-                    }
-                    else if (currentValue < 0)
-                    {
-                        denominator += currentUnit + potentStr;
-                    }
-                }
-            }
-            string result = "";
-
-            if (numerator == "")
-            {
-                if (denominator == "")
-                {
-                    result = "-";
-                }
-                else
-                {
-                    result = "1/" + denominator;
-                }
-            }
-            else
-            {
-                if (denominator == "")
-                {
-                    result = numerator;
-                }
-                else
-                {
-                    result = numerator + "/" + denominator;
-                }
-            }
-
-            return result;
-        }
-
-
-    }
-
-    public struct UnitInstance
-    {
-        // kg, m, s, A, K, mol, cd
-
-        private int[] units;
-
-
-        private double factorValue;
-
-        /// <summary>
-        /// The current exponent for conversion operations (Square, Cubic, Linear, e.g. new SI(3).Square.Meter).
-        /// Can be reseted with Reset, Per, Cast.
-        /// </summary>
-        private int exponent;
-
-        /// <summary>
-        /// A flag indicating if the current SI is in reciprocal mode (used in the <see cref="Per"/> method for reciprocal units: e.g. new SI(2).Meter.Per.Second) ==> [m/s]
-        /// Can be reseted with Reset, Per, Cast.
-        /// </summary>
-        private int reciproc;
-
-
-        [Flags]
-        public enum IsMass
-        {
-            IsKilo = 0x01, //0001
-            IsGramm = 0x02, //0010
-            IsKiloGramm = 0x04 //0100
-        }
-        private IsMass isMassOption;
-
-
-
-        public UnitInstance(int[] param_units,
-            double param_factor, int param_exponent, int param_reciproc)
-        {
-            units = param_units;
-            factorValue = param_factor;
-            exponent = param_exponent;
-            reciproc = param_reciproc;
-            isMassOption = IsMass.IsKiloGramm;
-        }
-
-
-
-        public IsMass GetGrammMode()
-        {
-            return isMassOption;
-        }
-
-        public int[] GetSIUnits()
-        {
-            return units;
-        }
-        public double Getfactor
-        {
-            get
-            {
-                return factorValue;
-            }
-        }
-
-        ///// <summary>
-        ///// [g] (to basic unit: [kg])
-        ///// </summary>
-        //[DebuggerHidden]
-        public UnitInstance Gramm
-        {
-            //[DebuggerHidden]
-            get
-            {
-
-                units[0] += 1 * reciproc * exponent;
-
-                double factor = Math.Pow(1000, reciproc * exponent);
-
-                if ((isMassOption & IsMass.IsKilo) == IsMass.IsKilo)
-                {
-                    //is Kilo -> Kilogramm are selected
-                    isMassOption = (isMassOption | ~IsMass.IsGramm);
-                    isMassOption = (isMassOption | IsMass.IsKiloGramm);
-                    factorValue /= factor;
-
-                }
-                else
-                {
-                    //is not kilo -> Gramm are selected
-                    isMassOption = (isMassOption | IsMass.IsGramm);
-                    isMassOption = (isMassOption | ~IsMass.IsKiloGramm);
-                    //factorValue *= factor;
-                }
-                isMassOption = (isMassOption & ~IsMass.IsKilo);
-
-
-                //factorValue /= Math.Pow(1000, exponent * reciproc);
-                //return new UnitInstance(units, factorValue, exponent, reciproc, grammMode);
-
-                return this; // not work
-            }
-        }
-
-        ///// <summary>
-        ///// Takes all following terms as cubic terms (=to the power of 3).
-        ///// </summary>
-        //[DebuggerHidden]
-        public UnitInstance Cubic
-        {
-            //[DebuggerHidden]
-            get
-            {
-                isMassOption = (isMassOption & ~IsMass.IsKilo);
-
-                exponent = 3;
-                //return new UnitInstance(units, factorValue, exponent, reciproc, grammMode);
-                return this;
-            }
-        }
-
-        ///// <summary>
-        ///// [s] Converts to/from Second. Internally everything is stored in seconds.
-        ///// </summary>
-        //[DebuggerHidden]
-        public UnitInstance Hour
-        {
-            //[DebuggerHidden]
-            get
-            {
-                isMassOption = (isMassOption & ~IsMass.IsKilo);
-
-                int ReciprocAndExponent = reciproc * exponent;
-                units[2] += 1 * ReciprocAndExponent;
-
-                factorValue *= Math.Pow(3600, ReciprocAndExponent);
-                //return new UnitInstance(units, factorValue, exponent, reciproc, grammMode);
-                return this;
-            }
-        }
-
-        ///// <summary>
-        ///// Quantifier for Kilo (1000).
-        ///// </summary>
-        //[DebuggerHidden]
-        public UnitInstance Kilo
-        {
-            //[DebuggerHidden]
-            get
-            {
-                isMassOption = (isMassOption | IsMass.IsKilo);
-
-                factorValue *= Math.Pow(1000, exponent * reciproc);
-                //return new UnitInstance(units, factorValue, exponent, reciproc, grammMode);
-                return this;
-            }
-        }
-
-        ///// <summary>
-        ///// Takes all following terms as linear terms (=to the power of 1).
-        ///// </summary>
-        //[DebuggerHidden]
-        public UnitInstance Linear
-        {
-            //[DebuggerHidden]
-            get
-            {
-                isMassOption = (isMassOption & ~IsMass.IsKilo);
-
-                exponent = 1;
-                //return new UnitInstance(units, factorValue, exponent, reciproc, grammMode);
-                return this;
-            }
-        }
-
-        ///// <summary>
-        ///// [m]
-        ///// </summary>
-        //[DebuggerHidden]
-        public UnitInstance Meter
-        {
-            //[DebuggerHidden]
-            get
-            {
-                isMassOption = (isMassOption & ~IsMass.IsKilo);
-
-                units[1] += 1 * reciproc * exponent;
-                //return new UnitInstance(units, factorValue, exponent, reciproc, grammMode);
-                return this;
-            }
-        }
-
-        ///// <summary>
-        ///// Quantifier for milli (1/1000).
-        ///// </summary>
-        //[DebuggerHidden]
-        public UnitInstance Milli
-        {
-            //[DebuggerHidden]
-            get
-            {
-                isMassOption = (isMassOption & ~IsMass.IsKilo);
-
-                factorValue /= Math.Pow(1000, exponent * reciproc);
-                //return new UnitInstance(units, factorValue, exponent, reciproc, grammMode);
-                return this;
-            }
-        }
-
-        ///// <summary>
-        ///// Quantifier for Centi (1/100)
-        ///// </summary>
-        //[DebuggerHidden]
-        public UnitInstance Centi
-        {
-            //[DebuggerHidden]
-            get
-            {
-                isMassOption = (isMassOption & ~IsMass.IsKilo);
-
-                factorValue /= Math.Pow(100, exponent * reciproc);
-                //return new UnitInstance(units, factorValue, exponent, reciproc, grammMode);
-                return this;
-            }
-        }
-
-        ///// <summary>
-        ///// Quantifier for Dezi (1/10)
-        ///// </summary>
-        //[DebuggerHidden]
-        public UnitInstance Dezi
-        {
-            //[DebuggerHidden]
-            get
-            {                
-                isMassOption = (isMassOption & ~IsMass.IsKilo);
-
-                factorValue /= Math.Pow(10, exponent * reciproc);
-                //return new UnitInstance(units, factorValue, exponent, reciproc, grammMode);
-                return this;
-            }
-        }
-
-        ///// <summary>
-        ///// [s] Converts to/from Second. Internally everything is stored in seconds.
-        ///// </summary>
-        //[DebuggerHidden]
-        public UnitInstance Minute
-        {
-            //[DebuggerHidden]
-            get
-            {
-                isMassOption = (isMassOption & ~IsMass.IsKilo);
-
-                int ReciprocAndExponent = reciproc * exponent;
-                units[2] += 1 * ReciprocAndExponent;
-
-                factorValue *= Math.Pow(60, ReciprocAndExponent);
-                //return new UnitInstance(units, factorValue, exponent, reciproc, grammMode);
-                return this;
-            }
-        }
-
-        ///// <summary>
-        ///// [N]
-        ///// </summary>
-        //[DebuggerHidden]
-        public UnitInstance Newton
-        {
-            //[DebuggerHidden]
-            get
-            {
-                isMassOption = (isMassOption & ~IsMass.IsKilo);
-
-                int ReciprocAndExponent = reciproc * exponent;
-                units[0] += 1 * ReciprocAndExponent;
-                units[1] += 1 * ReciprocAndExponent;
-                units[2] -= 2 * ReciprocAndExponent;
-                //return new UnitInstance(units, factorValue, exponent, reciproc, grammMode);
-                return this;
-            }
-        }
-
-        ///// <summary>
-        ///// Defines the denominator by the terms following after the Per.
-        ///// </summary>
-        //[DebuggerHidden]
-        public UnitInstance Per
-        {
-            //[DebuggerHidden]
-            get
-            {
-                isMassOption = (isMassOption & ~IsMass.IsKilo);
-
-                exponent = 1;
-                reciproc = reciproc * (-1);
-
-                //return new UnitInstance(units, factorValue, exponent, reciproc, grammMode);
-                return this;
-            }
-        }
-
-        ///// <summary>
-        ///// [-]. Defines radian. Only virtual. Has no real SI unit.
-        ///// </summary>
-        //[DebuggerHidden]
-        public UnitInstance Radian
-        {
-            //[DebuggerHidden]
-            get
-            {
-                isMassOption = (isMassOption & ~IsMass.IsKilo);
-
-                //return new UnitInstance(units, factorValue, exponent, reciproc, grammMode);
-                return this;
-            }
-        }
-
-        ///// <summary>
-        ///// [-]. Converts to/from Radiant. Internally everything is stored in radian.
-        ///// </summary>
-        //[DebuggerHidden]
-        public UnitInstance Rounds
-        {
-            //[DebuggerHidden]
-            get
-            {
-                isMassOption = (isMassOption & ~IsMass.IsKilo);
-
-                factorValue *= Math.Pow(2 * Math.PI, exponent * reciproc);
-                //return new UnitInstance(units, factorValue, exponent, reciproc, grammMode);
-                return this;
-            }
-        }
-
-        ///// <summary>
-        ///// [s]
-        ///// </summary>
-        //[DebuggerHidden]
-        public UnitInstance Second
-        {
-            //[DebuggerHidden]
-            get
-            {
-                isMassOption = (isMassOption & ~IsMass.IsKilo);
-
-                units[2] += 1 * reciproc * exponent;
-                //return new UnitInstance(units, factorValue, exponent, reciproc, grammMode);
-                return this;
-            }
-        }
-
-        ///// <summary>
-        ///// Takes all following terms as quadratic terms (=to the power of 2).
-        ///// </summary>
-        //[DebuggerHidden]
-        public UnitInstance Square
-        {
-            //[DebuggerHidden]
-            get
-            {
-                isMassOption = (isMassOption & ~IsMass.IsKilo);
-
-                exponent = 2;
-                //return new UnitInstance(units, factorValue, exponent, reciproc, grammMode);
-                return this;
-            }
-        }
-
-        ///// <summary>
-        ///// [t] (to basic unit: [kg])
-        ///// </summary>
-        //[DebuggerHidden]
-        public UnitInstance Ton
-        {
-            //[DebuggerHidden]
-            get
-            {
-                // remove Gramm and Kilo and KiloGramm is selected.
-                isMassOption = (isMassOption & ~IsMass.IsKilo);
-                isMassOption = (isMassOption | ~IsMass.IsGramm);
-                isMassOption = (isMassOption | IsMass.IsKiloGramm);
-
-                int ReciprocAndExponent = reciproc * exponent;
-                units[0] += 1 * ReciprocAndExponent;
-                factorValue *= Math.Pow(1000, ReciprocAndExponent);
-                //return new UnitInstance(units, factorValue, exponent, reciproc, grammMode);
-                return this;
-            }
-        }
-
-        ///// <summary>
-        ///// [W]
-        ///// </summary>
-        //[DebuggerHidden]
-        public UnitInstance Watt
-        {
-            //[DebuggerHidden]
-            get
-            {
-                isMassOption = (isMassOption & ~IsMass.IsKilo);
-
-                int ReciprocAndExponent = reciproc * exponent;
-                units[0] += 1 * ReciprocAndExponent;
-                units[1] += 2 * ReciprocAndExponent;
-                units[2] -= 3 * ReciprocAndExponent;
-                //return new UnitInstance(units, factorValue, exponent, reciproc, grammMode);
-                return this;
-            }
-        }
-        public UnitInstance Joule
-        {
-            //[DebuggerHidden]
-            get
-            {
-                isMassOption = (isMassOption & ~IsMass.IsKilo);
-
-                int ReciprocAndExponent = reciproc * exponent;
-                units[0] += 1 * ReciprocAndExponent;
-                units[1] += 2 * ReciprocAndExponent;
-                units[2] -= 2 * ReciprocAndExponent;
-                //return new UnitInstance(units, factorValue, exponent, reciproc, grammMode);
-                return this;
-            }
-        }
-
-        public UnitInstance Liter
-        {
-            //[DebuggerHidden]
-            get
-            {
-                isMassOption = (isMassOption & ~IsMass.IsKilo);
-
-                int ReciprocAndExponent = reciproc * exponent;
-                units[1] += 3 * ReciprocAndExponent;
-                factorValue /= Math.Pow(1000, ReciprocAndExponent);
-                return this;
-            }
-        }
-
-    }
-
+	public struct SIUtils
+	{
+		public static bool CompareUnits(int[] units1, int[] units2)
+		{
+			for (var i = 0; i < units1.Length; i++)
+			{
+				if (units1[i] != units2[i])
+				{
+					return false;
+				}
+			}
+			return true;
+		}
+
+		public static int[] CombineUnits(int[] units1, int[] units2)
+		{
+			var units = new int[units1.Length];
+			for (var i = 0; i < units1.Length; i++)
+			{
+				units[i] = units1[i] + units2[i];
+			}
+			return units;
+
+		}
+
+		public static int[] MultiplyUnits(int[] units, int factor)
+		{
+			var result = new int[units.Length];
+			for (var i = 0; i < units.Length; i++)
+			{
+				if (units[i] != 0)
+				{
+					result[i] = units[i] * factor;
+				}
+			}
+			return result;
+		}
+	}
+
+
+	public struct Unit
+	{
+		// TODO mk-2017-09-14: must be exact the same definition as in the SI class - find a way to de-duplicate this
+		private static readonly string[] Unitnames = { "kg", "m", "s", "A", "K", "mol", "cd" };
+
+		public static UnitInstance SI
+		{
+			get
+			{
+				return new UnitInstance(new[] { 0, 0, 0, 0, 0, 0, 0 }, 1, 1, 1);
+			}
+		}
+		
+		public static string GetUnitString(int[] siUnitParam, bool isGramm)
+		{
+			var numerator = "";
+			var denominator = "";
+
+			for (var i = 0; i < siUnitParam.Length; i++)
+			{
+				var currentValue = siUnitParam[i];
+
+				var exponent = Math.Abs(currentValue);
+				var exponentStr = "";
+				if (currentValue != 0)
+				{
+					var currentUnit = Unitnames[i];
+					if (currentUnit == "kg" && isGramm)
+					{
+						currentUnit = "g";
+					}
+
+					if (exponent > 1)
+					{
+						exponentStr = "^" + exponent;
+					}
+
+					if (currentValue > 0)
+					{
+						numerator += currentUnit + exponentStr;
+
+					}
+					else if (currentValue < 0)
+					{
+						denominator += currentUnit + exponentStr;
+					}
+				}
+			}
+			string result;
+
+			if (numerator == "")
+			{
+				if (denominator == "")
+				{
+					result = "-";
+				}
+				else
+				{
+					result = "1/" + denominator;
+				}
+			}
+			else
+			{
+				if (denominator == "")
+				{
+					result = numerator;
+				}
+				else
+				{
+					result = numerator + "/" + denominator;
+				}
+			}
+
+			return result;
+		}
+	}
+
+	public struct UnitInstance
+	{
+		/// <summary>
+		/// kg, m, s, A, K, mol, cd
+		/// </summary>
+		private readonly int[] _units;
+
+		private int _exponent;
+		private int _reciproc;
+
+		[Flags]
+		public enum IsMass
+		{
+			IsKilo = 0x01,     //0001
+			IsGramm = 0x02,    //0010
+			IsKiloGramm = 0x04 //0100
+		}
+		private IsMass _isMassOption;
+
+		public double Factor { get; private set; }
+
+		public UnitInstance(int[] units, double factor, int exponent, int reciproc)
+		{
+			_units = units;
+			Factor = factor;
+			_exponent = exponent;
+			_reciproc = reciproc;
+			_isMassOption = IsMass.IsKiloGramm;
+		}
+
+		public IsMass GetGrammMode()
+		{
+			return _isMassOption;
+		}
+
+		public int[] GetSIUnits()
+		{
+			return _units;
+		}
+
+		/// <summary>
+		/// [g] (to basic unit: [kg])
+		/// </summary>
+		public UnitInstance Gramm
+		{
+			get
+			{
+				_units[0] += 1 * _reciproc * _exponent;
+
+				var factor = Math.Pow(1000, _reciproc * _exponent);
+
+				if ((_isMassOption & IsMass.IsKilo) == IsMass.IsKilo)
+				{
+					//is Kilo -> Kilogramm are selected
+					_isMassOption = _isMassOption | ~IsMass.IsGramm;
+					_isMassOption = _isMassOption | IsMass.IsKiloGramm;
+					Factor /= factor;
+				}
+				else
+				{
+					//is not kilo -> Gramm are selected
+					_isMassOption = _isMassOption | IsMass.IsGramm;
+					_isMassOption = _isMassOption | ~IsMass.IsKiloGramm;
+					//factorValue *= factor;
+				}
+				_isMassOption = _isMassOption & ~IsMass.IsKilo;
+
+
+				//factorValue /= Math.Pow(1000, exponent * reciproc);
+				return this; // not work
+			}
+		}
+
+		/// <summary>
+		/// Takes all following terms as cubic terms (=to the power of 3).
+		/// </summary>
+		public UnitInstance Cubic
+		{
+			get
+			{
+				_isMassOption = _isMassOption & ~IsMass.IsKilo;
+				_exponent = 3;
+				return this;
+			}
+		}
+
+		/// <summary>
+		/// [s] Converts to/from Second. Internally everything is stored in seconds.
+		/// </summary>
+		public UnitInstance Hour
+		{
+			get
+			{
+				_isMassOption = _isMassOption & ~IsMass.IsKilo;
+
+				var reciprocAndExponent = _reciproc * _exponent;
+				_units[2] += 1 * reciprocAndExponent;
+
+				Factor *= Math.Pow(3600, reciprocAndExponent);
+
+				return this;
+			}
+		}
+
+		/// <summary>
+		/// Quantifier for Kilo (1000).
+		/// </summary>
+		public UnitInstance Kilo
+		{
+			get
+			{
+				_isMassOption = _isMassOption | IsMass.IsKilo;
+				Factor *= Math.Pow(1000, _exponent * _reciproc);
+
+				return this;
+			}
+		}
+
+		/// <summary>
+		/// [m]
+		/// </summary>
+		public UnitInstance Meter
+		{
+			get
+			{
+				_isMassOption = _isMassOption & ~IsMass.IsKilo;
+				_units[1] += 1 * _reciproc * _exponent;
+				return this;
+			}
+		}
+
+		/// <summary>
+		/// Quantifier for milli (1/1000).
+		/// </summary>
+		public UnitInstance Milli
+		{
+			get
+			{
+				_isMassOption = _isMassOption & ~IsMass.IsKilo;
+				Factor /= Math.Pow(1000, _exponent * _reciproc);
+				return this;
+			}
+		}
+
+		/// <summary>
+		/// Quantifier for Centi (1/100)
+		/// </summary>
+		public UnitInstance Centi
+		{
+			get
+			{
+				_isMassOption = _isMassOption & ~IsMass.IsKilo;
+				Factor /= Math.Pow(100, _exponent * _reciproc);
+				return this;
+			}
+		}
+
+		/// <summary>
+		/// Quantifier for Dezi (1/10)
+		/// </summary>
+		public UnitInstance Dezi
+		{
+			get
+			{
+				_isMassOption = _isMassOption & ~IsMass.IsKilo;
+				Factor /= Math.Pow(10, _exponent * _reciproc);
+				return this;
+			}
+		}
+
+		/// <summary>
+		/// [s] Converts to/from Second. Internally everything is stored in seconds.
+		/// </summary>
+		public UnitInstance Minute
+		{
+			get
+			{
+				_isMassOption = _isMassOption & ~IsMass.IsKilo;
+				var reciprocAndExponent = _reciproc * _exponent;
+				_units[2] += 1 * reciprocAndExponent;
+				Factor *= Math.Pow(60, reciprocAndExponent);
+				return this;
+			}
+		}
+
+		/// <summary>
+		/// [N]
+		/// </summary>
+		public UnitInstance Newton
+		{
+			get
+			{
+				_isMassOption = _isMassOption & ~IsMass.IsKilo;
+				var reciprocAndExponent = _reciproc * _exponent;
+				_units[0] += 1 * reciprocAndExponent;
+				_units[1] += 1 * reciprocAndExponent;
+				_units[2] -= 2 * reciprocAndExponent;
+
+				return this;
+			}
+		}
+
+		/// <summary>
+		/// Defines the denominator by the terms following after the Per.
+		/// </summary>
+		public UnitInstance Per
+		{
+			get
+			{
+				_isMassOption = _isMassOption & ~IsMass.IsKilo;
+				_exponent = 1;
+				_reciproc = _reciproc * -1;
+				return this;
+			}
+		}
+
+		/// <summary>
+		/// [-]. Defines radian. Only virtual. Has no real SI unit.
+		/// </summary>
+		public UnitInstance Radian
+		{
+			get
+			{
+				_isMassOption = _isMassOption & ~IsMass.IsKilo;
+				return this;
+			}
+		}
+
+		/// <summary>
+		/// [-]. Converts to/from Radiant. Internally everything is stored in radian.
+		/// </summary>
+		public UnitInstance Rounds
+		{
+			get
+			{
+				_isMassOption = _isMassOption & ~IsMass.IsKilo;
+				Factor *= Math.Pow(2 * Math.PI, _exponent * _reciproc);
+				return this;
+			}
+		}
+
+		/// <summary>
+		/// [s]
+		/// </summary>
+		public UnitInstance Second
+		{
+			get
+			{
+				_isMassOption = _isMassOption & ~IsMass.IsKilo;
+				_units[2] += 1 * _reciproc * _exponent;
+				return this;
+			}
+		}
+
+		/// <summary>
+		/// Takes all following terms as quadratic terms (=to the power of 2).
+		/// </summary>
+		public UnitInstance Square
+		{
+			get
+			{
+				_isMassOption = _isMassOption & ~IsMass.IsKilo;
+				_exponent = 2;
+				return this;
+			}
+		}
+
+		/// <summary>
+		/// [t] (to basic unit: [kg])
+		/// </summary>
+		public UnitInstance Ton
+		{
+			get
+			{
+				// remove Gramm and Kilo and KiloGramm is selected.
+				_isMassOption = _isMassOption & ~IsMass.IsKilo;
+				_isMassOption = _isMassOption | ~IsMass.IsGramm;
+				_isMassOption = _isMassOption | IsMass.IsKiloGramm;
+
+				var reciprocAndExponent = _reciproc * _exponent;
+				_units[0] += 1 * reciprocAndExponent;
+				Factor *= Math.Pow(1000, reciprocAndExponent);
+
+				return this;
+			}
+		}
+
+		/// <summary>
+		/// [W]
+		/// </summary>
+		public UnitInstance Watt
+		{
+			get
+			{
+				_isMassOption = _isMassOption & ~IsMass.IsKilo;
+
+				var reciprocAndExponent = _reciproc * _exponent;
+				_units[0] += 1 * reciprocAndExponent;
+				_units[1] += 2 * reciprocAndExponent;
+				_units[2] -= 3 * reciprocAndExponent;
+
+				return this;
+			}
+		}
+		public UnitInstance Joule
+		{
+			get
+			{
+				_isMassOption = _isMassOption & ~IsMass.IsKilo;
+
+				var reciprocAndExponent = _reciproc * _exponent;
+				_units[0] += 1 * reciprocAndExponent;
+				_units[1] += 2 * reciprocAndExponent;
+				_units[2] -= 2 * reciprocAndExponent;
+
+				return this;
+			}
+		}
+
+		public UnitInstance Liter
+		{
+			get
+			{
+				_isMassOption = _isMassOption & ~IsMass.IsKilo;
+
+				var reciprocAndExponent = _reciproc * _exponent;
+				_units[1] += 3 * reciprocAndExponent;
+				Factor /= Math.Pow(1000, reciprocAndExponent);
+
+				return this;
+			}
+		}
+	}
 }
diff --git a/VectoCore/VectoCoreTest/Integration/SimulationRuns/MinimalPowertrain.cs b/VectoCore/VectoCoreTest/Integration/SimulationRuns/MinimalPowertrain.cs
index 69924926e5201427486d41817bc880e6df253bff..afe230fd871d99e872f6a0686405b083c4906a7e 100644
--- a/VectoCore/VectoCoreTest/Integration/SimulationRuns/MinimalPowertrain.cs
+++ b/VectoCore/VectoCoreTest/Integration/SimulationRuns/MinimalPowertrain.cs
@@ -117,7 +117,7 @@ namespace TUGraz.VectoCore.Tests.Integration.SimulationRuns
 		[TestCase, Category("LongRunning")]
 		public void TestWheelsAndEngine()
 		{
-			NLog.LogManager.DisableLogging();
+			LogManager.DisableLogging();
 			var engineData = MockSimulationDataFactory.CreateEngineDataFromFile(EngineFile, 1);
 			var cycleData = DrivingCycleDataReader.ReadFromFile(CycleFile, CycleType.DistanceBased, false);
 
@@ -184,7 +184,7 @@ namespace TUGraz.VectoCore.Tests.Integration.SimulationRuns
 
 			modData.Finish(VectoRun.Status.Success);
 
-			NLog.LogManager.EnableLogging();
+			LogManager.EnableLogging();
 		}
 
 		[TestCase]
diff --git a/VectoCore/VectoCoreTest/Utils/AssertHelper.cs b/VectoCore/VectoCoreTest/Utils/AssertHelper.cs
index 8517f460077ef62df1c03f2c53f4ac7ec9234699..0990f98f06d4fdef2b046c00e58bd53d05957723 100644
--- a/VectoCore/VectoCoreTest/Utils/AssertHelper.cs
+++ b/VectoCore/VectoCoreTest/Utils/AssertHelper.cs
@@ -68,7 +68,6 @@ namespace TUGraz.VectoCore.Tests.Utils
 		public static void AreRelativeEqual(Scalar expected, Scalar actual,
 			double toleranceFactor = DoubleExtensionMethods.ToleranceFactor)
 		{
-			Assert.IsTrue(expected.HasEqualUnit(new SI()) && actual.HasEqualUnit(new SI()), "Units of Scalars must be empty.");
 			AreRelativeEqual(expected.Value(), actual.Value(), toleranceFactor: toleranceFactor);
 		}
 
diff --git a/VectoCore/VectoCoreTest/Utils/SITest.cs b/VectoCore/VectoCoreTest/Utils/SITest.cs
index 0d55ea6242751e1fc6c9d287f963eace2b572929..73885cadc3eed36a37a8445592b5391d554f33e4 100644
--- a/VectoCore/VectoCoreTest/Utils/SITest.cs
+++ b/VectoCore/VectoCoreTest/Utils/SITest.cs
@@ -67,7 +67,7 @@ namespace TUGraz.VectoCore.Tests.Utils
 
             var siStandardDiv = power / power;
 			Assert.IsInstanceOf<SI>(siStandardMult);
-            Assert.IsTrue(siStandardDiv.HasEqualUnit(new SI()));
+            Assert.IsTrue(siStandardDiv.HasEqualUnit(SIBase<Scalar>.Create(0)));
             Assert.AreEqual(600.0 / 60 * 2 * Math.PI * 1500 * 1500, siStandardMult.Value());
 
             var force = torque / 100.SI<Meter>();
@@ -127,11 +127,11 @@ namespace TUGraz.VectoCore.Tests.Utils
 
 		[TestCase]
         public void SI_Test()  //SI_CreateConvert()
-        {
-            var si = new SI();
+		{
+			var si = 0.SI();
             Assert.AreEqual(0.0, si.Value());
             Assert.AreEqual("0.0000 [-]", si.ToString());
-            Assert.IsTrue(si.HasEqualUnit(new SI()));
+            Assert.IsTrue(si.HasEqualUnit(SIBase<Scalar>.Create(0)));
 
             //var si2 = 5.SI().Watt;
             var si2 = 5.SI(Unit.SI.Watt);
@@ -248,8 +248,8 @@ namespace TUGraz.VectoCore.Tests.Utils
             Assert.IsFalse(v1 >= d);
             Assert.IsTrue(v1 <= d);
 
-            Assert.AreEqual(1, new SI().CompareTo(null));
-            Assert.AreEqual(1, new SI().CompareTo("not an SI"));
+            Assert.AreEqual(1, 0.SI().CompareTo(null));
+            Assert.AreEqual(1, 0.SI().CompareTo("not an SI"));
             //Assert.AreEqual(-1, new SI().Meter.CompareTo(new SI().Kilo.Meter.Per.Hour));
             Assert.AreEqual(-1, new SI(Unit.SI.Meter).CompareTo(new SI(Unit.SI.Kilo.Meter.Per.Hour)));
             //Assert.AreEqual(1, new SI().Newton.Meter.CompareTo(new SI().Meter));
@@ -650,11 +650,11 @@ namespace TUGraz.VectoCore.Tests.Utils
 
             //UnitInstance ui2 = Unit.SI.Gramm.Per.Kilo.Watt.Hour;
             //Assert.AreEqual("s^2/m^2", 1.SI().GetUnitString(ui2.GetSIUnits()));
-            //Assert.AreEqual(2.7777777777777777E-10d,ui2.Getfactor());
+            //Assert.AreEqual(2.7777777777777777E-10d,ui2.Factor());
 
             UnitInstance ui3 = Unit.SI.Kilo.Gramm.Per.Watt.Second;
             Assert.AreEqual("s^2/m^2", 1.SI().GetUnitString(ui3.GetSIUnits()));
-            Assert.AreEqual(1, ui3.Getfactor);
+            Assert.AreEqual(1, ui3.Factor);
 
 
 
@@ -669,11 +669,11 @@ namespace TUGraz.VectoCore.Tests.Utils
 
             var uni = Unit.SI.Cubic.Dezi.Meter;
             Assert.AreEqual("m^3", 1.SI().GetUnitString(uni.GetSIUnits()));
-            AssertHelper.AreRelativeEqual(0.001, uni.Getfactor);
+            AssertHelper.AreRelativeEqual(0.001, uni.Factor);
 
             var uni2 = Unit.SI.Cubic.Centi.Meter;
             Assert.AreEqual("m^3", 1.SI().GetUnitString(uni2.GetSIUnits()));
-            AssertHelper.AreRelativeEqual(0.000001, uni2.Getfactor);
+            AssertHelper.AreRelativeEqual(0.000001, uni2.Factor);
 
 
             var val2 = 7.SI(Unit.SI.Cubic.Dezi.Meter).ConvertTo(Unit.SI.Cubic.Dezi.Meter);
@@ -689,7 +689,7 @@ namespace TUGraz.VectoCore.Tests.Utils
 
             var uni1 = Unit.SI.Kilo.Meter.Per.Hour;
             Assert.AreEqual("m/s", 1.SI().GetUnitString(uni1.GetSIUnits()));
-            AssertHelper.AreRelativeEqual(0.2777777777, uni1.Getfactor);
+            AssertHelper.AreRelativeEqual(0.2777777777, uni1.Factor);
 
 
             NewtonMeter newtonMeter = 5.SI<NewtonMeter>();