diff --git a/VECTO/OutputData/JSONFileWriter.vb b/VECTO/OutputData/JSONFileWriter.vb
index e9c79ce7289530d70c071c24d5c7710a2e68c6e3..ae1f75f1f9615357ff9232985d376b68200d48ae 100644
--- a/VECTO/OutputData/JSONFileWriter.vb
+++ b/VECTO/OutputData/JSONFileWriter.vb
@@ -42,9 +42,9 @@ Public Class JSONFileWriter
 
 		body.Add("ModelName", eng.Model)
 
-		'body.Add("Displacement", eng.Displacement.ConvertTo().Cubic.Centi.Meter.Value().ToString())
-	    'body.Add("Displacement", eng.Displacement.ConvertTo(Unit.SI.Cubic.Centi.Meter).Value().ToString())
-	    body.Add("Displacement", eng.Displacement.ConvertToCubicCentiMeter().Value().ToString())
+        'body.Add("Displacement", eng.Displacement.ConvertTo().Cubic.Centi.Meter.Value().ToString())
+        'body.Add("Displacement", eng.Displacement.ConvertTo(Unit.SI.Cubic.Centi.Meter).Value().ToString())
+        body.Add("Displacement", eng.Displacement.ConvertToCubicCentiMeter().ToString())
         body.Add("IdlingSpeed", eng.IdleSpeed.AsRPM)
 		body.Add("Inertia", eng.Inertia.Value())
 
@@ -202,44 +202,44 @@ Public Class JSONFileWriter
 			torqueLimits.Add(entry.Gear().ToString(), entry.MaxTorque.Value().ToString())
 		Next
 
-				'{"MassMax", vehicle.GrossVehicleMassRating.ConvertTo().Ton.Value()},
-                '{"MassMax", vehicle.GrossVehicleMassRating.ConvertTo(Unit.SI.Ton).Value()},
-				'{"rdyn", vehicle.DynamicTyreRadius.ConvertTo().Milli.Meter.Value()},
-                '{"rdyn", vehicle.DynamicTyreRadius.ConvertTo(Unit.SI.Milli.Meter).Value()},
-		Dim body As Dictionary(Of String, Object) = New Dictionary(Of String, Object) From {
-				{"SavedInDeclMode", Cfg.DeclMode},
-				{"VehCat", vehicle.VehicleCategory.ToString()},
-				{"LegislativeClass", vehicle.LegislativeClass.ToString()},
-				{"CurbWeight", vehicle.CurbMassChassis.Value()},
-				{"CurbWeightExtra", vehicle.CurbMassExtra.Value()},
-				{"Loading", vehicle.Loading.Value()},
-		        {"MassMax", vehicle.GrossVehicleMassRating.ConvertToTon().Value()},
-	            {"rdyn", vehicle.DynamicTyreRadius.ConvertToMilliMeter().Value()},
-				{"CdCorrMode", airdrag.CrossWindCorrectionMode.GetName()},
-				{"CdCorrFile",
-				If((airdrag.CrossWindCorrectionMode = CrossWindCorrectionMode.SpeedDependentCorrectionFactor OrElse
-					airdrag.CrossWindCorrectionMode = CrossWindCorrectionMode.VAirBetaLookupTable) AndAlso
-					Not airdrag.CrosswindCorrectionMap Is Nothing, GetRelativePath(airdrag.CrosswindCorrectionMap.Source, basePath),
-					"")
-				},
-				{"Retarder", retarderOut},
-				{"Angledrive", angledriveOut},
-				{"PTO", ptoOut},
-				{"TorqueLimits", torqueLimits},
-				{"IdlingSpeed", vehicle.EngineIdleSpeed.AsRPM},
-				{"AxleConfig", New Dictionary(Of String, Object) From {
-				{"Type", vehicle.AxleConfiguration.GetName()},
-				{"Axles", From axle In vehicle.Axles Select New Dictionary(Of String, Object) From {
-				{"Inertia", axle.Inertia.Value()},
-				{"Wheels", axle.Wheels},
-				{"AxleWeightShare", axle.AxleWeightShare},
-				{"TwinTyres", axle.TwinTyres},
-				{"RRCISO", axle.RollResistanceCoefficient},
-				{"FzISO", axle.TyreTestLoad.Value()},
-				{"Type", axle.AxleType.ToString()}
-				}}}}}
-
-		If (Not IsNothing(airdrag.AirDragArea)) Then
+        '{"MassMax", vehicle.GrossVehicleMassRating.ConvertTo().Ton.Value()},
+        '{"MassMax", vehicle.GrossVehicleMassRating.ConvertTo(Unit.SI.Ton).Value()},
+        '{"rdyn", vehicle.DynamicTyreRadius.ConvertTo().Milli.Meter.Value()},
+        '{"rdyn", vehicle.DynamicTyreRadius.ConvertTo(Unit.SI.Milli.Meter).Value()},
+        Dim body As Dictionary(Of String, Object) = New Dictionary(Of String, Object) From {
+                {"SavedInDeclMode", Cfg.DeclMode},
+                {"VehCat", vehicle.VehicleCategory.ToString()},
+                {"LegislativeClass", vehicle.LegislativeClass.ToString()},
+                {"CurbWeight", vehicle.CurbMassChassis.Value()},
+                {"CurbWeightExtra", vehicle.CurbMassExtra.Value()},
+                {"Loading", vehicle.Loading.Value()},
+                {"MassMax", vehicle.GrossVehicleMassRating.ConvertToTon()},
+                {"rdyn", vehicle.DynamicTyreRadius.ConvertToMilliMeter()},
+                {"CdCorrMode", airdrag.CrossWindCorrectionMode.GetName()},
+                {"CdCorrFile",
+                If((airdrag.CrossWindCorrectionMode = CrossWindCorrectionMode.SpeedDependentCorrectionFactor OrElse
+                    airdrag.CrossWindCorrectionMode = CrossWindCorrectionMode.VAirBetaLookupTable) AndAlso
+                    Not airdrag.CrosswindCorrectionMap Is Nothing, GetRelativePath(airdrag.CrosswindCorrectionMap.Source, basePath),
+                    "")
+                },
+                {"Retarder", retarderOut},
+                {"Angledrive", angledriveOut},
+                {"PTO", ptoOut},
+                {"TorqueLimits", torqueLimits},
+                {"IdlingSpeed", vehicle.EngineIdleSpeed.AsRPM},
+                {"AxleConfig", New Dictionary(Of String, Object) From {
+                {"Type", vehicle.AxleConfiguration.GetName()},
+                {"Axles", From axle In vehicle.Axles Select New Dictionary(Of String, Object) From {
+                {"Inertia", axle.Inertia.Value()},
+                {"Wheels", axle.Wheels},
+                {"AxleWeightShare", axle.AxleWeightShare},
+                {"TwinTyres", axle.TwinTyres},
+                {"RRCISO", axle.RollResistanceCoefficient},
+                {"FzISO", axle.TyreTestLoad.Value()},
+                {"Type", axle.AxleType.ToString()}
+                }}}}}
+
+        If (Not IsNothing(airdrag.AirDragArea)) Then
 			body("CdA") = airdrag.AirDragArea.Value()
 		End If
 		If (Not IsNothing(vehicle.Height)) Then
diff --git a/VectoCommon/VectoCommon/Utils/DoubleExtensionMethods.cs b/VectoCommon/VectoCommon/Utils/DoubleExtensionMethods.cs
index 55bdacd99acd952eb0db13fd596e8f2467825eef..02a521b0e0a39d7cc827a675602e5d25c954852d 100644
--- a/VectoCommon/VectoCommon/Utils/DoubleExtensionMethods.cs
+++ b/VectoCommon/VectoCommon/Utils/DoubleExtensionMethods.cs
@@ -273,8 +273,19 @@ namespace TUGraz.VectoCommon.Utils
 			return self.ToString("F" + decimals.Value, CultureInfo.InvariantCulture);
 		}
 
-		//[DebuggerStepThrough]
-		[MethodImpl(MethodImplOptions.AggressiveInlining)]
+        public static string ToXMLFormat(this ConvertedSI self, uint? decimals = null)
+        {
+            decimals = decimals ?? 2;
+            return ((double)self).ToString("F" + decimals.Value, CultureInfo.InvariantCulture);
+        }
+
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
+        public static string ToMinSignificantDigits(this ConvertedSI self, uint? significant = null, uint? decimals = null)
+        {
+            return ToMinSignificantDigits((double)self, significant, decimals);
+        }
+
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
 		public static string ToMinSignificantDigits(this double self, uint? significant = null, uint? decimals = null)
 		{
 			significant = significant ?? 3;
diff --git a/VectoCommon/VectoCommon/Utils/SI.cs b/VectoCommon/VectoCommon/Utils/SI.cs
index d59280b57d04f09509bc8893f52b132c7a429982..4f2186ef0ce080d4106b511ccc40c5df896f4cd8 100644
--- a/VectoCommon/VectoCommon/Utils/SI.cs
+++ b/VectoCommon/VectoCommon/Utils/SI.cs
@@ -140,6 +140,7 @@ namespace TUGraz.VectoCommon.Utils
     public class PerSquareSecond : SIBase<PerSquareSecond>
     {
         private static readonly int[] Units = { 0, 0, -2, 0, 0, 0, 0 };
+
         [DebuggerHidden]
         private PerSquareSecond(double val) : base(val, Units) { }
 
@@ -219,6 +220,7 @@ namespace TUGraz.VectoCommon.Utils
     public class KilogramPerMeter : SIBase<KilogramPerMeter>
     {
         private static readonly int[] Units = { 1, -1, 0, 0, 0, 0, 0 };
+
         [DebuggerHidden]
         private KilogramPerMeter(double val) : base(val, Units) { }
     }
@@ -807,8 +809,7 @@ namespace TUGraz.VectoCommon.Utils
         [DebuggerStepThrough]
         public static T Create(double val)
         {
-            if (val == 0)
-            {
+            if (val == 0) {
                 return ZeroPrototype;
             }
 
@@ -1004,21 +1005,16 @@ namespace TUGraz.VectoCommon.Utils
             Val = val;
             _units = units;
 
-            if (double.IsNaN(Val))
-            {
+            if (double.IsNaN(Val)) {
                 throw new VectoException("NaN [{0}] is not allowed for SI-Values in Vecto.", GetUnitString());
             }
 
-            if (double.IsInfinity(Val))
-            {
+            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())
-        {
-
-        }
+        public SI(UnitInstance si, double val = 0) : this(val * si.Factor, si.GetSIUnits()) { }
 
         /// <summary>
         /// Initializes a new instance of the <see cref="SI"/> class which copies the units from an already existing SI.
@@ -1028,40 +1024,6 @@ namespace TUGraz.VectoCommon.Utils
         [DebuggerHidden]
         private SI(double val, SI unit) : this(val, unit._units) { }
 
-        [DebuggerHidden]
-        private SI(SI si, double factor, int[] unitsParam)
-        {
-            Val = si.Val / factor;
-            _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;
-
-
-
-		//	return new SI(this, unitsParam: si.GetSIUnits(), factor: factorValue);
-		//}
-
         /// <summary>
         /// Casts the SI Unit to the concrete unit type (if the units allow such an cast).
         /// </summary>
@@ -1071,8 +1033,7 @@ namespace TUGraz.VectoCommon.Utils
         {
             var si = ToBasicUnits();
             var t = SIBase<T>.Create(si.Val);
-            if (!si.HasEqualUnit(t))
-            {
+            if (!si.HasEqualUnit(t)) {
                 throw new VectoException("SI Unit Conversion failed: From {0} to {1}", si, t);
             }
             return t;
@@ -1127,8 +1088,7 @@ namespace TUGraz.VectoCommon.Utils
         [DebuggerHidden]
         public static SI 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);
             }
 
@@ -1139,8 +1099,7 @@ namespace TUGraz.VectoCommon.Utils
         [DebuggerHidden]
         public static SI 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 new SI(si1.Val - si2.Val, si1);
@@ -1173,18 +1132,14 @@ namespace TUGraz.VectoCommon.Utils
         public static SI operator /(SI si1, SI si2)
         {
             double result;
-            try
-            {
-                result = si1.Val / (si2.Val);
+            try {
+                result = si1.Val / si2.Val;
 
                 // bad cases: Infinity = x / 0.0  (for x != 0), NaN = 0.0 / 0.0
-                if (double.IsInfinity(result) || double.IsNaN(result))
-                {
+                if (double.IsInfinity(result) || double.IsNaN(result)) {
                     throw new DivideByZeroException();
                 }
-            }
-            catch (DivideByZeroException ex)
-            {
+            } catch (DivideByZeroException ex) {
                 throw new VectoException(
                     string.Format("Can not compute division by zero ([{0}] / 0[{1}])", si1.GetUnitString(), si2.GetUnitString()), ex);
             }
@@ -1197,8 +1152,7 @@ namespace TUGraz.VectoCommon.Utils
         [DebuggerHidden]
         public static SI operator /(SI si1, double d)
         {
-            if (d.IsEqual(0))
-            {
+            if (d.IsEqual(0)) {
                 throw new VectoException(string.Format("Can not compute division by zero ([{0}] / 0)", si1.GetUnitString()), new DivideByZeroException());
             }
 
@@ -1208,20 +1162,18 @@ namespace TUGraz.VectoCommon.Utils
         [DebuggerHidden]
         public static SI operator /(double d, SI si1)
         {
-            if (si1.IsEqual(0))
-            {
+            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), si1._units.Select(u => -u).ToArray());
+            return new SI(d / si1.Val, si1._units.Select(u => -u).ToArray());
         }
 
         [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 < si2.Val;
@@ -1236,8 +1188,7 @@ namespace TUGraz.VectoCommon.Utils
         [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 > si2.Val;
@@ -1264,8 +1215,7 @@ namespace TUGraz.VectoCommon.Utils
         [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);
             }
@@ -1281,8 +1231,7 @@ namespace TUGraz.VectoCommon.Utils
         [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);
             }
@@ -1338,8 +1287,7 @@ namespace TUGraz.VectoCommon.Utils
         /// </summary>
         public string GetUnitString(int[] units = null)
         {
-            if (units == null)
-            {
+            if (units == null) {
                 units = _units;
             }
             return Unit.GetUnitString(units);
@@ -1352,8 +1300,7 @@ namespace TUGraz.VectoCommon.Utils
 
         private string ToString(string format)
         {
-            if (string.IsNullOrEmpty(format))
-            {
+            if (string.IsNullOrEmpty(format)) {
                 format = "F4";
             }
 
@@ -1384,17 +1331,15 @@ 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;
 
-			return other != null && Val.Equals(other.Val ) && HasEqualUnit(other);
+            return other != null && Val.Equals(other.Val) && HasEqualUnit(other);
         }
 
         /// <summary>
@@ -1405,7 +1350,8 @@ namespace TUGraz.VectoCommon.Utils
         /// <returns></returns>
         public bool IsEqual(SI si, SI tolerance = null)
         {
-			return (tolerance == null || HasEqualUnit(tolerance)) && HasEqualUnit(si) && Val.IsEqual(si.Val, tolerance == null ? DoubleExtensionMethods.Tolerance : (tolerance.Value() ));
+            return (tolerance == null || HasEqualUnit(tolerance)) && HasEqualUnit(si) &&
+                   Val.IsEqual(si.Val, tolerance == null ? DoubleExtensionMethods.Tolerance : tolerance.Value());
         }
 
         /// <summary>
@@ -1417,7 +1363,7 @@ namespace TUGraz.VectoCommon.Utils
         [DebuggerHidden]
         public bool IsEqual(double val, double tolerance = DoubleExtensionMethods.Tolerance)
         {
-			return Val.IsEqual(val, tolerance);
+            return Val.IsEqual(val, tolerance);
         }
 
         /// <summary>
@@ -1428,16 +1374,14 @@ 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);
             }
 
-			return Val.IsSmaller(si.Val, tolerance == null ? DoubleExtensionMethods.Tolerance : (tolerance.Value() ));
+            return Val.IsSmaller(si.Val, tolerance == null ? DoubleExtensionMethods.Tolerance : tolerance.Value());
         }
 
         /// <summary>
@@ -1448,12 +1392,11 @@ 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);
             }
 
-			return Val.IsSmaller(si.Val, tolerance);
+            return Val.IsSmaller(si.Val, tolerance);
         }
 
         /// <summary>
@@ -1464,16 +1407,14 @@ 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);
             }
 
-			return Val.IsSmallerOrEqual(si.Val , tolerance == null ? DoubleExtensionMethods.Tolerance : (tolerance.Value()));
+            return Val.IsSmallerOrEqual(si.Val, tolerance == null ? DoubleExtensionMethods.Tolerance : tolerance.Value());
         }
 
         /// <summary>
@@ -1484,16 +1425,14 @@ 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);
             }
 
-			return Val.IsGreater(si.Val , tolerance == null ? DoubleExtensionMethods.Tolerance : (tolerance.Value() ));
+            return Val.IsGreater(si.Val, tolerance == null ? DoubleExtensionMethods.Tolerance : tolerance.Value());
         }
 
         /// <summary>
@@ -1505,12 +1444,11 @@ 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);
             }
 
-			return Val.IsGreater(si.Val , tolerance);
+            return Val.IsGreater(si.Val, tolerance);
         }
 
         /// <summary>
@@ -1522,16 +1460,14 @@ 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);
             }
 
-			return Val.IsGreaterOrEqual(si.Val , tolerance == null ? DoubleExtensionMethods.Tolerance : (tolerance.Value() ));
+            return Val.IsGreaterOrEqual(si.Val, tolerance == null ? DoubleExtensionMethods.Tolerance : tolerance.Value());
         }
 
         /// <summary>
@@ -1584,8 +1520,7 @@ namespace TUGraz.VectoCommon.Utils
 
         public override int GetHashCode()
         {
-            unchecked
-            {
+            unchecked {
                 // ReSharper disable once NonReadonlyMemberInGetHashCode
                 var hashCode = Val.GetHashCode();
                 hashCode = (hashCode * 397) ^ (_units != null ? _units.GetHashCode() : 0);
@@ -1596,26 +1531,29 @@ namespace TUGraz.VectoCommon.Utils
         public int CompareTo(object obj)
         {
             var si = obj as SI;
-            if (si == null)
-            {
+            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;
+            if (!HasEqualUnit(si)) {
+                var sum1 = 0;
+                var sum2 = 0;
+                for (var i = 0; i < _units.Length; i++) {
+                    sum1 = Math.Abs(si._units[i]);
+                    sum2 = Math.Abs(_units[i]);
                 }
-                return 1;
+                return sum1 >= sum2 ? 1 : -1;
             }
 
-            if (this > si)
-            {
+            if (this > si) {
                 return 1;
             }
-            return this < si ? -1 : 0;
+
+            if (this < si) {
+                return -1;
+            }
+
+            return 0;
         }
 
         public static bool operator ==(SI left, SI right)
@@ -1643,10 +1581,9 @@ 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() + "]";
+                       GetUnitString() + "]";
             }
 
             return (Val * outputFactor.Value).ToString("F" + decimals.Value, CultureInfo.InvariantCulture);
@@ -1674,7 +1611,7 @@ namespace TUGraz.VectoCommon.Utils
 
             public bool Equals(T x, T y)
             {
-                return x.IsEqual(y.Value(), _precision);
+                return y != null && x != null && x.IsEqual(y.Value(), _precision);
             }
 
             public int GetHashCode(T obj)
@@ -1683,4 +1620,4 @@ namespace TUGraz.VectoCommon.Utils
             }
         }
     }
-}
+}
\ No newline at end of file
diff --git a/VectoCommon/VectoCommon/Utils/SIConvertExtensionMethods.cs b/VectoCommon/VectoCommon/Utils/SIConvertExtensionMethods.cs
index 3c025710a1c52c03e2c7b18360346b20f94f6a0b..ae8f969434f74336e91772dd4ca49e0bde650905 100644
--- a/VectoCommon/VectoCommon/Utils/SIConvertExtensionMethods.cs
+++ b/VectoCommon/VectoCommon/Utils/SIConvertExtensionMethods.cs
@@ -1,124 +1,130 @@
 using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
+using System.Globalization;
 
 namespace TUGraz.VectoCommon.Utils
 {
-
-    //class: SummaryDataContainer : LoggingObject, IDisposable
-    //method: public virtual void Write(IModalDataContainer modData, int jobNr, int runNr, VectoRunData runData)
-    //  //row[DISTANCE] = distance.ConvertTo(Unit.SI.Kilo.Meter);
-    //  row[DISTANCE] = distance.ConvertToKiloMeter();
-    //  row[CO2_TKM] = kilogramPerMeter.ConvertToGrammPerKiloMeter() / vehicleLoading.ConvertToTon();
-    //  row[SPEED] = speed.ConvertToKiloMeterPerHour();
-    //  row[CO2_KM] = kilogramPerMeter.ConvertToGrammPerKiloMeter();
-    //  row[CO2_TKM] = kilogramPerMeter.ConvertToGrammPerKiloMeter() / vehicleLoading.ConvertToTon();
-    //  row[CO2_M3KM] = kilogramPerMeter.ConvertToGrammPerKiloMeter() / cargoVolume;
-    // ConvertedSI ConvertToGrammPerHour(...)
-    // 
-    // row[ENGINE_DISPLACEMENT] = runData.EngineData.Displacement.ConvertToCubicCentiMeter();
-    // ConvertedSI ConvertToKiloWattHour(..)
-
-    //method: private static void WriteFuelconsumptionEntries(IModalDataContainer modData, DataRow row, Kilogram vehicleLoading,
-    //                row[FCFINAL_LITERPER100TKM] = fcPer100lkm /
-    //                     vehicleLoading.ConvertToTon();
-    // --------------------
-    // SI Data Type are used
-    public class ConvertedSI  : SI
+    public class ConvertedSI
     {
+        private readonly double _value;
+        private readonly string _units;
 
-        private string _units;
-        //private double _value;
-
-        public ConvertedSI(double value,UnitInstance ui,string units) :base(ui,value)
+        public ConvertedSI(double value, string units)
         {
+            _value = value;
             _units = units;
-           // _value = value;
-        }
-        //public override string ToString()
-        //{
-        //    return ToString(null);
-        //}
-
-        //private string ToString(string format)
-        //{
-        //    if (string.IsNullOrEmpty(format))
-        //    {
-        //        format = "F4";
-        //    }
-
-        //    return string.Format(System.Globalization.CultureInfo.InvariantCulture, "{0:" + format + "} [{2}]", _value, format, _units);
-        //}
-
-        //public static implicit operator SI(ConvertedSI convertedSI)
-        //{
-        //    return new SI(Unit.SI,convertedSI._value);
-        //}
+        }
+
+        public static implicit operator double(ConvertedSI self)
+        {
+            return self._value;
+        }
+
+        public static implicit operator ConvertedSI(SI self)
+        {
+            return new ConvertedSI(self.Value(), self.GetUnitString());
+        }
+
+        public override string ToString()
+        {
+            return _value.ToString(CultureInfo.InvariantCulture); // + " [" + _units + "]";
+        }
     }
 
     public static class SIConvertExtensionMethods
     {
+        private const int Kilo = 1000;
+        private const int SecondsPerHour = 60 * 60;
+        
         public static ConvertedSI ConvertToGramm(this SI value)
         {
-            return new ConvertedSI(value.Value()*1000, Unit.SI.Kilo.Gramm, "g");
+            return new ConvertedSI(value.Value() * Kilo, "g");
         }
         public static ConvertedSI ConvertToTon(this SI value)
         {
-            return new ConvertedSI(value.Value() * 1000, Unit.SI.Kilo.Gramm, "Ton");
+            return new ConvertedSI(value.Value() * Kilo, "Ton");
         }
         public static ConvertedSI ConvertToKiloMeterPerHour(this SI value)
         {
-            return new ConvertedSI(value.Value() / 1000 *60*60 , Unit.SI.Kilo.Meter.Per.Hour, "km/h");
+            return new ConvertedSI(value.Value() * SecondsPerHour / Kilo, "km/h");
         }
         public static ConvertedSI ConvertToGrammPerKiloMeter(this SI value)
         {
-            return new ConvertedSI(value.Value() * 1000 / 1000, Unit.SI.Gramm.Per.Kilo.Meter, "g/km");
+            return value == null ? null : new ConvertedSI(value.Value() * Kilo / Kilo, "g/km");
+        }
+
+        public static ConvertedSI ConvertToLiterPer100Kilometer(this SI value)
+        {
+            return new ConvertedSI(value.Value() * (10*10*10) / (100*1000), "l/100km");
+        }
+        
+        public static ConvertedSI ConvertToLiterPer100TonKiloMeter(this SI value)
+        {
+            const int CubicMeterToLiter = 10 * 10 * 10;
+            const int MeterTo100KiloMeter = 100 * 1000;
+            const int KilogrammToTon = 1000;
+            return new ConvertedSI(value.Value() * CubicMeterToLiter / (MeterTo100KiloMeter * KilogrammToTon), "l/100tkm");
+        }
+
+
+        
+        public static ConvertedSI ConvertToLiterPerCubicMeter100KiloMeter(this SI value)
+        {
+            const int CubicMeterToLiter = 10 * 10 * 10;
+            const int MeterTo100KiloMeter = 100 * 1000;
+            return new ConvertedSI(value.Value() * CubicMeterToLiter / MeterTo100KiloMeter, "l/100m^3km");
         }
+
         public static ConvertedSI ConvertToGrammPerHour(this SI value)
         {
-            return new ConvertedSI(value.Value() * 1000 / 60 / 60, Unit.SI.Gramm.Per.Hour, "g/h");
+            return new ConvertedSI(value.Value() * Kilo / SecondsPerHour, "g/h");
         }
 
         public static ConvertedSI ConvertToKiloMeter(this SI value)
         {
-            return new ConvertedSI(value.Value() / 1000, Unit.SI.Kilo.Meter, "km");
+            return new ConvertedSI(value.Value() / Kilo, "km");
         }
 
         public static ConvertedSI ConvertToCubicCentiMeter(this SI value)
         {
-            return new ConvertedSI(value.Value() * 100 * 100 * 100, Unit.SI.Cubic.Centi.Meter, "cm^3");
+            return new ConvertedSI(value.Value() * 100 * 100 * 100, "cm^3");
         }
 
-        public static ConvertedSI ConvertToKiloWattHour(this SI value)
+        public static ConvertedSI ConvertToGrammPerCubicMeterKiloMeter(this SI value)
         {
-            return new ConvertedSI(value.Value() / 1000/60/60, Unit.SI.Kilo.Watt.Hour, "kWh");
+            return new ConvertedSI(value.Value() * Kilo / Kilo * Kilo / Kilo / Kilo / Kilo, "g/m^3km");
         }
-        public static ConvertedSI ConvertToKiloWatt(this SI value)
+
+        public static ConvertedSI ConvertToGrammPerTonKilometer(this SI value)
         {
-            return new ConvertedSI(value.Value() / 1000, Unit.SI.Kilo.Watt, "kW");
+            return new ConvertedSI(value.Value() * Kilo / Kilo * Kilo, "g/tkm");
         }
 
-        public static ConvertedSI ConvertToRoundsPerMinute(this SI value)
+
+        public static ConvertedSI ConvertToLiterPer100KiloMeter(this SI value)
         {
-            return new ConvertedSI(value.Value() * 2 * Math.PI / 60, Unit.SI.Rounds.Per.Minute ,"rpm");
+            return new ConvertedSI(value.Value() * 10 * 10 * 10 * 100 * Kilo, "l/100km");
         }
-        public static ConvertedSI ConvertToKiloGrammPerSecond(this SI value)
+
+        public static ConvertedSI ConvertToKiloWattHour(this SI value)
         {
-            return new ConvertedSI(value.Value() , Unit.SI.Kilo.Gramm.Per.Second, "kg/s");
+            return new ConvertedSI(value.Value() / Kilo / SecondsPerHour, "kWh");
         }
-        public static ConvertedSI ConvertToCubicDeziMeter(this SI value)
+        public static ConvertedSI ConvertToKiloWatt(this SI value)
         {
-            return new ConvertedSI(value.Value()*10*10*10, Unit.SI.Cubic.Dezi.Meter, "dm^3");
+            return new ConvertedSI(value.Value() / Kilo, "kW");
         }
-        public static ConvertedSI ConvertToRadianPerSecond(this SI value)
+
+        public static ConvertedSI ConvertToRoundsPerMinute(this SI value)
+        {
+            return new ConvertedSI(value.Value() * 2 * Math.PI / 60, "rpm");
+        }
+        public static ConvertedSI ConvertToCubicDeziMeter(this SI value)
         {
-            return new ConvertedSI(value.Value(), Unit.SI.Radian.Per.Second, "rps");
+            return new ConvertedSI(value.Value() * 10 * 10 * 10, "dm^3");
         }
         public static ConvertedSI ConvertToMilliMeter(this SI value)
         {
-            return new ConvertedSI(value.Value() * 1000, Unit.SI.Milli.Meter, "mm");
+            return new ConvertedSI(value.Value() * Kilo, "mm");
         }
     }
 }
diff --git a/VectoCommon/VectoCommon/VectoCommon.csproj b/VectoCommon/VectoCommon/VectoCommon.csproj
index 86c6b32a5c717ddf7f24b5eedba7f2a9b464c5e2..a722dbc8eb38948911159856c9764f23cd01234d 100644
--- a/VectoCommon/VectoCommon/VectoCommon.csproj
+++ b/VectoCommon/VectoCommon/VectoCommon.csproj
@@ -90,6 +90,7 @@
     <Compile Include="Utils\EnumHelper.cs" />
     <Compile Include="Utils\IntExtensionMethods.cs" />
     <Compile Include="Utils\SI.cs" />
+    <Compile Include="Utils\SIConvertExtensionMethods.cs" />
     <Compile Include="Utils\SIUtils.cs" />
     <Compile Include="Utils\StringExtensionMethods.cs" />
     <Compile Include="Utils\Validation.cs" />
diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Data/Engine/FuelConsumptionMapReader.cs b/VectoCore/VectoCore/Models/SimulationComponent/Data/Engine/FuelConsumptionMapReader.cs
index b2ae45d7430964bd7fa43052334ff370c92bbb2e..298cfa6d6e5587029bcea8907e3a3d83ff0d352a 100644
--- a/VectoCore/VectoCore/Models/SimulationComponent/Data/Engine/FuelConsumptionMapReader.cs
+++ b/VectoCore/VectoCore/Models/SimulationComponent/Data/Engine/FuelConsumptionMapReader.cs
@@ -88,30 +88,16 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data.Engine
 			return new FuelConsumptionMap.Entry(
 				engineSpeed: row.ParseDouble(0).RPMtoRad(),
 				torque: row.ParseDouble(1).SI<NewtonMeter>(),
-				fuelConsumption:
-                    //row.ParseDouble(2).SI().Gramm.Per.Hour.ConvertTo().Kilo.Gramm.Per.Second.Cast<KilogramPerSecond>()
-				    //row.ParseDouble(2).SI(Unit.SI.Gramm.Per.Hour).ConvertTo(Unit.SI.Kilo.Gramm.Per.Second).Cast<KilogramPerSecond>()
-                    row.ParseDouble(2).SI(Unit.SI.Gramm.Per.Hour).ConvertToKiloGrammPerSecond().Cast<KilogramPerSecond>()
+				fuelConsumption: row.ParseDouble(2).SI(Unit.SI.Gramm.Per.Hour).Cast<KilogramPerSecond>()
                 );
 		}
 
 		private static FuelConsumptionMap.Entry CreateFromColumNames(DataRow row)
 		{
 			return new FuelConsumptionMap.Entry(
-                //engineSpeed: row.ParseDouble(Fields.EngineSpeed).SI().Rounds.Per.Minute.Cast<PerSecond>(),
-			    engineSpeed: row.ParseDouble(Fields.EngineSpeed).SI(Unit.SI.Rounds.Per.Minute).Cast<PerSecond>(),
-                torque: row.ParseDouble(Fields.Torque).SI<NewtonMeter>(),
-				fuelConsumption:
-                    row.ParseDouble(Fields.FuelConsumption)
-                    .SI(Unit.SI.Gramm.Per.Hour).ConvertToKiloGrammPerSecond()
-                    .Cast<KilogramPerSecond>()
-                //row.ParseDouble(Fields.FuelConsumption)
-                //    .SI(Unit.SI.Gramm.Per.Hour).ConvertTo(Unit.SI
-                //    .Kilo.Gramm.Per.Second).Cast<KilogramPerSecond>()
-                    //row.ParseDouble(Fields.FuelConsumption)
-                    //	.SI()
-                    //	.Gramm.Per.Hour.ConvertTo()
-                    //	.Kilo.Gramm.Per.Second.Cast<KilogramPerSecond>()
+			    engineSpeed: row.ParseDouble(Fields.EngineSpeed).RPMtoRad(),
+                torque: row.SI<NewtonMeter>(Fields.Torque),
+				fuelConsumption: row.ParseDouble(Fields.FuelConsumption).SI(Unit.SI.Gramm.Per.Hour).Cast<KilogramPerSecond>()
                 );
 		}
 
diff --git a/VectoCore/VectoCore/OutputData/IModalDataContainer.cs b/VectoCore/VectoCore/OutputData/IModalDataContainer.cs
index 3ac16a694decc608092db9ba7c286ee7bba810f1..be66f46e050f65237b376c97305d68405bb7c59a 100644
--- a/VectoCore/VectoCore/OutputData/IModalDataContainer.cs
+++ b/VectoCore/VectoCore/OutputData/IModalDataContainer.cs
@@ -365,7 +365,7 @@ namespace TUGraz.VectoCore.OutputData
 			return data.TimeIntegral<Kilogram>(ModalResultField.FCFinal) / distance;
 		}
 
-		public static SI FuelConsumptionFinalLiterPer100Kilometer(this IModalDataContainer data)
+        public static SquareMeter FuelConsumptionFinalVolumePerMeter(this IModalDataContainer data)
 		{
 			var fuelConsumptionFinal = data.FuelConsumptionFinal();
 			if (fuelConsumptionFinal == null || data.FuelData.FuelDensity == null) {
@@ -373,10 +373,7 @@ namespace TUGraz.VectoCore.OutputData
 			}
 
 			var fcVolumePerMeter = fuelConsumptionFinal / data.FuelData.FuelDensity;
-            // fcVolumePerMeter = [m^2]
-            //return fcVolumePerMeter.ConvertTo().Cubic.Dezi.Meter * 100.SI().Kilo.Meter;
-            //return fcVolumePerMeter.ConvertTo(Unit.SI.Cubic.Dezi.Meter) * 100.SI(Unit.SI.Kilo.Meter);
-            return fcVolumePerMeter.ConvertToCubicDeziMeter() * 100.SI(Unit.SI.Kilo.Meter);
+            return fcVolumePerMeter.Cast<SquareMeter>();
         }
 
 		public static KilogramPerMeter CO2PerMeter(this IModalDataContainer data)
diff --git a/VectoCore/VectoCore/OutputData/SummaryDataContainer.cs b/VectoCore/VectoCore/OutputData/SummaryDataContainer.cs
index 1ad9ede4b3b2a08c44b9a8633a728c48e0f932ee..4be8313376835ccb2a758bd7f4c39f3042c43707 100644
--- a/VectoCore/VectoCore/OutputData/SummaryDataContainer.cs
+++ b/VectoCore/VectoCore/OutputData/SummaryDataContainer.cs
@@ -1,731 +1,642 @@
-/*
-* This file is part of VECTO.
-*
-* Copyright © 2012-2017 European Union
-*
-* Developed by Graz University of Technology,
-*              Institute of Internal Combustion Engines and Thermodynamics,
-*              Institute of Technical Informatics
-*
-* VECTO is licensed under the EUPL, Version 1.1 or - as soon they will be approved
-* by the European Commission - subsequent versions of the EUPL (the "Licence");
-* You may not use VECTO except in compliance with the Licence.
-* You may obtain a copy of the Licence at:
-*
-* https://joinup.ec.europa.eu/community/eupl/og_page/eupl
-*
-* Unless required by applicable law or agreed to in writing, VECTO
-* distributed under the Licence is distributed on an "AS IS" basis,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the Licence for the specific language governing permissions and
-* limitations under the Licence.
-*
-* Authors:
-*   Stefan Hausberger, hausberger@ivt.tugraz.at, IVT, Graz University of Technology
-*   Christian Kreiner, christian.kreiner@tugraz.at, ITI, Graz University of Technology
-*   Michael Krisper, michael.krisper@tugraz.at, ITI, Graz University of Technology
-*   Raphael Luz, luz@ivt.tugraz.at, IVT, Graz University of Technology
-*   Markus Quaritsch, markus.quaritsch@tugraz.at, IVT, Graz University of Technology
-*   Martin Rexeis, rexeis@ivt.tugraz.at, IVT, Graz University of Technology
-*/
-
-using System;
-using System.Data;
-using System.Linq;
-using System.Runtime.CompilerServices;
-using TUGraz.VectoCommon.Models;
-using TUGraz.VectoCommon.Utils;
-using TUGraz.VectoCore.Configuration;
-using TUGraz.VectoCore.Models.Declaration;
-using TUGraz.VectoCore.Models.Simulation.Data;
-using TUGraz.VectoCore.Models.SimulationComponent.Data;
-
-// ReSharper disable MemberCanBePrivate.Global  -- used by API!
-
-namespace TUGraz.VectoCore.OutputData
-{
-	public delegate void WriteSumData(IModalDataContainer data);
-
-	/// <summary>
-	/// Class for the sum file in vecto.
-	/// </summary>
-	public class SummaryDataContainer : LoggingObject, IDisposable
-	{
-		// ReSharper disable InconsistentNaming
-		public const string INTERNAL_PREFIX = "INTERNAL";
-		public const string SORT = INTERNAL_PREFIX + " Sorting";
-		public const string JOB = "Job [-]";
-		public const string INPUTFILE = "Input File [-]";
-		public const string CYCLE = "Cycle [-]";
-		public const string STATUS = "Status";
-		public const string CURB_MASS = "Corrected Actual Curb Mass [kg]";
-		public const string LOADING = "Loading [kg]";
-
-		public const string VEHICLE_MANUFACTURER = "Vehicle manufacturer [-]";
-		public const string VIN_NUMBER = "VIN number";
-		public const string VEHICLE_MODEL = "Vehicle model [-]";
-
-		public const string ENGINE_MANUFACTURER = "Engine manufacturer [-]";
-		public const string ENGINE_MODEL = "Engine model [-]";
-		public const string ENGINE_FUEL_TYPE = "Engine fuel type [-]";
-		public const string ENGINE_WHTC_URBAN = "Engine WHTCUrban";
-		public const string ENGINE_WHTC_RURAL = "Engine WHTCRural";
-		public const string ENGINE_WHTC_MOTORWAY = "Engine WHTCMotorway";
-		public const string ENGINE_BF_COLD_HOT = "Engine BFColdHot";
-		public const string ENGINE_CF_REG_PER = "Engine CFRegPer";
-		public const string ENGINE_ACTUAL_CORRECTION_FACTOR = "Engine actual CF";
-		public const string ENGINE_RATED_POWER = "Engine rated power [kW]";
-		public const string ENGINE_IDLING_SPEED = "Engine idling speed [rpm]";
-		public const string ENGINE_RATED_SPEED = "Engine rated speed [rpm]";
-		public const string ENGINE_DISPLACEMENT = "Engine displacement [ccm]";
-
-		public const string ROLLING_RESISTANCE_COEFFICIENT_W_TRAILER = "total RRC [-]";
-		public const string ROLLING_RESISTANCE_COEFFICIENT_WO_TRAILER = "weighted RRC w/o trailer [-]";
-
-		public const string GEARBOX_MANUFACTURER = "Gearbox manufacturer [-]";
-		public const string GEARBOX_MODEL = "Gearbox model [-]";
-		public const string GEARBOX_TYPE = "Gearbox type [-]";
-		public const string GEAR_RATIO_FIRST_GEAR = "Gear ratio first gear [-]";
-		public const string GEAR_RATIO_LAST_GEAR = "Gear ratio last gear [-]";
-
-		public const string TORQUECONVERTER_MANUFACTURER = "Torque converter manufacturer [-]";
-		public const string TORQUECONVERTER_MODEL = "Torque converter model [-]";
-
-		public const string RETARDER_MANUFACTURER = "Retarder manufacturer [-]";
-		public const string RETARDER_MODEL = "Retarder model [-]";
-		public const string RETARDER_TYPE = "Retarder type [-]";
-
-		public const string ANGLEDRIVE_MANUFACTURER = "Angledrive manufacturer [-]";
-		public const string ANGLEDRIVE_MODEL = "Angledrive model [-]";
-		public const string ANGLEDRIVE_RATIO = "Angledrive ratio [-]";
-
-		public const string AXLE_MANUFACTURER = "Axle manufacturer [-]";
-		public const string AXLE_MODEL = "Axle model [-]";
-		public const string AXLE_RATIO = "Axle gear ratio [-]";
-
-		public const string AUX_TECH_FORMAT = "Auxiliary technology {0} [-]";
-
-		public const string HDV_CO2_VEHICLE_CLASS = "HDV CO2 vehicle class [-]";
-		public const string TOTAL_VEHICLE_MASS = "Total vehicle mass [kg]";
-		public const string CD_x_A_DECLARED = "Declared CdxA [m²]";
-		public const string CD_x_A = "CdxA [m²]";
-		//public const string ROLLING_RESISTANCE_COEFFICIENT = "weighed RRC [-]";
-		public const string R_DYN = "r_dyn [m]";
-
-		public const string CARGO_VOLUME = "Cargo Volume [m³]";
-		public const string TIME = "time [s]";
-		public const string DISTANCE = "distance [km]";
-		public const string SPEED = "speed [km/h]";
-		public const string ALTITUDE_DELTA = "altitudeDelta [m]";
-
-		public const string FCMAP_H = "FC-Map [g/h]";
-		public const string FCMAP_KM = "FC-Map [g/km]";
-		public const string FCAUXC_H = "FC-AUXc [g/h]";
-		public const string FCAUXC_KM = "FC-AUXc [g/km]";
-		public const string FCWHTCC_H = "FC-WHTCc [g/h]";
-		public const string FCWHTCC_KM = "FC-WHTCc [g/km]";
-		public const string FCAAUX_H = "FC-AAUX [g/h]";
-		public const string FCAAUX_KM = "FC-AAUX [g/km]";
-
-		public const string FCFINAL_H = "FC-Final [g/h]";
-		public const string FCFINAL_KM = "FC-Final [g/km]";
-		public const string FCFINAL_LITERPER100KM = "FC-Final [l/100km]";
-		public const string FCFINAL_LITERPER100TKM = "FC-Final [l/100tkm]";
-		public const string FCFINAL_LiterPer100M3KM = "FC-Final [l/100m³km]";
-
-		public const string CO2_KM = "CO2 [g/km]";
-		public const string CO2_TKM = "CO2 [g/tkm]";
-		public const string CO2_M3KM = "CO2 [g/m³km]";
-
-		public const string P_WHEEL_POS = "P_wheel_in_pos [kW]";
-		public const string P_FCMAP_POS = "P_fcmap_pos [kW]";
-
-		public const string E_FORMAT = "E_{0} [kWh]";
-		public const string E_AUX_FORMAT = "E_aux_{0} [kWh]";
-		public const string E_AUX = "E_aux_sum [kWh]";
-
-		public const string E_AIR = "E_air [kWh]";
-		public const string E_ROLL = "E_roll [kWh]";
-		public const string E_GRAD = "E_grad [kWh]";
-		public const string E_VEHICLE_INERTIA = "E_vehi_inertia [kWh]";
-		public const string E_POWERTRAIN_INERTIA = "E_powertrain_inertia [kWh]";
-		public const string E_BRAKE = "E_brake [kWh]";
-		public const string E_GBX_LOSS = "E_gbx_loss [kWh]";
-		public const string E_SHIFT_LOSS = "E_shift_loss [kWh]";
-		public const string E_AXL_LOSS = "E_axl_loss [kWh]";
-		public const string E_RET_LOSS = "E_ret_loss [kWh]";
-		public const string E_TC_LOSS = "E_tc_loss [kWh]";
-		public const string E_ANGLE_LOSS = "E_angle_loss [kWh]";
-		public const string E_CLUTCH_LOSS = "E_clutch_loss [kWh]";
-		public const string E_FCMAP_POS = "E_fcmap_pos [kWh]";
-		public const string E_FCMAP_NEG = "E_fcmap_neg [kWh]";
-
-		public const string ACC = "a [m/s^2]";
-		public const string ACC_POS = "a_pos [m/s^2]";
-		public const string ACC_NEG = "a_neg [m/s^2]";
-
-		public const string ACC_TIMESHARE = "AccelerationTimeShare [%]";
-		public const string DEC_TIMESHARE = "DecelerationTimeShare [%]";
-		public const string CRUISE_TIMESHARE = "CruiseTimeShare [%]";
-		public const string STOP_TIMESHARE = "StopTimeShare [%]";
-
-		public const string MAX_SPEED = "max. speed [km/h]";
-		public const string MAX_ACCELERATION = "max. acc [m/s²]";
-		public const string MAX_DECELERATION = "max. dec [m/s²]";
-		public const string AVG_ENGINE_SPEED = "n_eng_avg [rpm]";
-		public const string MAX_ENGINE_SPEED = "n_eng_max [rpm]";
-		public const string NUM_GEARSHIFTS = "gear shifts [-]";
-		public const string ENGINE_FULL_LOAD_TIME_SHARE = "Engine max. Load time share [%]";
-		public const string COASTING_TIME_SHARE = "CoastingTimeShare [%]";
-		public const string BRAKING_TIME_SHARE = "BrakingTImeShare [%]";
-
-		public const string TIME_SHARE_PER_GEAR_FORMAT = "Gear {0} TimeShare [%]";
-
-		public const string NUM_AXLES_DRIVEN = "Number axles vehicle driven [-]";
-		public const string NUM_AXLES_NON_DRIVEN = "Number axles vehicle non-driven [-]";
-		public const string NUM_AXLES_TRAILER = "Number axles trailer [-]";
-
-		// ReSharper restore InconsistentNaming
-
-		internal readonly DataTable Table;
-		private readonly ISummaryWriter _sumWriter;
-
-
-		protected SummaryDataContainer() {}
-
-		/// <summary>
-		/// Initializes a new instance of the <see cref="SummaryDataContainer"/> class.
-		/// </summary>
-		/// <param name="writer"></param>
-		public SummaryDataContainer(ISummaryWriter writer)
-		{
-			_sumWriter = writer;
-
-			Table = new DataTable();
-
-			Table.Columns.AddRange(new[] {
-				Tuple.Create(SORT, typeof(int)),
-				Tuple.Create(JOB, typeof(string)),
-				Tuple.Create(INPUTFILE, typeof(string)),
-				Tuple.Create(CYCLE, typeof(string)),
-				Tuple.Create(STATUS, typeof(string)),
-				Tuple.Create(VEHICLE_MANUFACTURER, typeof(string)),
-				Tuple.Create(VIN_NUMBER, typeof(string)),
-				Tuple.Create(VEHICLE_MODEL, typeof(string)),
-				Tuple.Create(HDV_CO2_VEHICLE_CLASS, typeof(string)),
-				Tuple.Create(CURB_MASS, typeof(SI)),
-				Tuple.Create(LOADING, typeof(SI)),
-				Tuple.Create(TOTAL_VEHICLE_MASS, typeof(SI)),
-				Tuple.Create(ENGINE_MANUFACTURER, typeof(string)),
-				Tuple.Create(ENGINE_MODEL, typeof(string)),
-				Tuple.Create(ENGINE_FUEL_TYPE, typeof(string)),
-				Tuple.Create(ENGINE_RATED_POWER, typeof(SI)),
-				Tuple.Create(ENGINE_IDLING_SPEED, typeof(SI)),
-				Tuple.Create(ENGINE_RATED_SPEED, typeof(SI)),
-				Tuple.Create(ENGINE_DISPLACEMENT, typeof(SI)),
-				Tuple.Create(ENGINE_WHTC_URBAN, typeof(double)),
-				Tuple.Create(ENGINE_WHTC_RURAL, typeof(double)),
-				Tuple.Create(ENGINE_WHTC_MOTORWAY, typeof(double)),
-				Tuple.Create(ENGINE_BF_COLD_HOT, typeof(double)),
-				Tuple.Create(ENGINE_CF_REG_PER, typeof(double)),
-				Tuple.Create(ENGINE_ACTUAL_CORRECTION_FACTOR, typeof(double)),
-				Tuple.Create(CD_x_A_DECLARED, typeof(SI)),
-				Tuple.Create(CD_x_A, typeof(SI)),
-				Tuple.Create(ROLLING_RESISTANCE_COEFFICIENT_W_TRAILER, typeof(double)),
-				Tuple.Create(ROLLING_RESISTANCE_COEFFICIENT_WO_TRAILER, typeof(double)),
-				Tuple.Create(R_DYN, typeof(SI)),
-				Tuple.Create(NUM_AXLES_DRIVEN, typeof(int)),
-				Tuple.Create(NUM_AXLES_NON_DRIVEN, typeof(int)),
-				Tuple.Create(NUM_AXLES_TRAILER, typeof(int)),
-				Tuple.Create(GEARBOX_MANUFACTURER, typeof(string)),
-				Tuple.Create(GEARBOX_MODEL, typeof(string)),
-				Tuple.Create(GEARBOX_TYPE, typeof(string)),
-				Tuple.Create(GEAR_RATIO_FIRST_GEAR, typeof(SI)),
-				Tuple.Create(GEAR_RATIO_LAST_GEAR, typeof(SI)),
-				Tuple.Create(TORQUECONVERTER_MANUFACTURER, typeof(string)),
-				Tuple.Create(TORQUECONVERTER_MODEL, typeof(string)),
-				Tuple.Create(RETARDER_MANUFACTURER, typeof(string)),
-				Tuple.Create(RETARDER_MODEL, typeof(string)),
-				Tuple.Create(RETARDER_TYPE, typeof(string)),
-				Tuple.Create(ANGLEDRIVE_MANUFACTURER, typeof(string)),
-				Tuple.Create(ANGLEDRIVE_MODEL, typeof(string)),
-				Tuple.Create(ANGLEDRIVE_RATIO, typeof(string)),
-				Tuple.Create(AXLE_MANUFACTURER, typeof(string)),
-				Tuple.Create(AXLE_MODEL, typeof(string)),
-				Tuple.Create(AXLE_RATIO, typeof(SI)),
-				Tuple.Create(string.Format(AUX_TECH_FORMAT, Constants.Auxiliaries.IDs.SteeringPump), typeof(string)),
-				Tuple.Create(string.Format(AUX_TECH_FORMAT, Constants.Auxiliaries.IDs.Fan), typeof(string)),
-				Tuple.Create(string.Format(AUX_TECH_FORMAT, Constants.Auxiliaries.IDs.HeatingVentilationAirCondition),
-					typeof(string)),
-				Tuple.Create(string.Format(AUX_TECH_FORMAT, Constants.Auxiliaries.IDs.PneumaticSystem), typeof(string)),
-				Tuple.Create(string.Format(AUX_TECH_FORMAT, Constants.Auxiliaries.IDs.ElectricSystem), typeof(string)),
-			}.Select(x => new DataColumn(x.Item1, x.Item2)).ToArray());
-
-			Table.Columns.AddRange(new[] {
-				CARGO_VOLUME,
-				TIME, DISTANCE,
-				SPEED, ALTITUDE_DELTA,
-				FCMAP_H, FCMAP_KM,
-				FCAUXC_H, FCAUXC_KM,
-				FCWHTCC_H, FCWHTCC_KM,
-				FCAAUX_H, FCAAUX_KM,
-				FCFINAL_H, FCFINAL_KM,
-				FCFINAL_LITERPER100KM, FCFINAL_LITERPER100TKM, FCFINAL_LiterPer100M3KM,
-				CO2_KM, CO2_TKM, CO2_M3KM,
-				P_WHEEL_POS, P_FCMAP_POS,
-				E_FCMAP_POS, E_FCMAP_NEG, E_POWERTRAIN_INERTIA,
-				E_AUX, E_CLUTCH_LOSS, E_TC_LOSS, E_SHIFT_LOSS, E_GBX_LOSS,
-				E_RET_LOSS, E_ANGLE_LOSS, E_AXL_LOSS, E_BRAKE, E_VEHICLE_INERTIA, E_AIR, E_ROLL, E_GRAD,
-				ACC, ACC_POS, ACC_NEG, ACC_TIMESHARE, DEC_TIMESHARE, CRUISE_TIMESHARE,
-				MAX_SPEED, MAX_ACCELERATION, MAX_DECELERATION, AVG_ENGINE_SPEED, MAX_ENGINE_SPEED, NUM_GEARSHIFTS,
-				STOP_TIMESHARE, ENGINE_FULL_LOAD_TIME_SHARE, COASTING_TIME_SHARE, BRAKING_TIME_SHARE
-			}.Select(x => new DataColumn(x, typeof(SI))).ToArray());
-		}
-
-		/// <summary>
-		/// Finishes the summary data container (writes the data to the sumWriter).
-		/// </summary>
-		[MethodImpl(MethodImplOptions.Synchronized)]
-		public virtual void Finish()
-		{
-			if (_sumWriter != null) {
-				var view = new DataView(Table, "", SORT, DataViewRowState.CurrentRows).ToTable();
-				var toRemove =
-					view.Columns.Cast<DataColumn>().Where(column => column.ColumnName.StartsWith(INTERNAL_PREFIX)).ToList();
-				foreach (var dataColumn in toRemove) {
-					view.Columns.Remove(dataColumn);
-				}
-				_sumWriter.WriteSumData(view);
-			}
-		}
-
-		/// <summary>
-		/// Writes the result of one run into the summary data container.
-		/// </summary>
-		[MethodImpl(MethodImplOptions.Synchronized)]
-		public virtual void Write(IModalDataContainer modData, int jobNr, int runNr, VectoRunData runData)
-		{
-			var row = Table.NewRow();
-			Table.Rows.Add(row);
-
-			row[SORT] = jobNr * 1000 + runNr;
-			row[JOB] = string.Format("{0}-{1}", jobNr, runNr); //ReplaceNotAllowedCharacters(current);
-			row[INPUTFILE] = ReplaceNotAllowedCharacters(runData.JobName);
-			row[CYCLE] = ReplaceNotAllowedCharacters(runData.Cycle.Name + Constants.FileExtensions.CycleFile);
-
-			row[STATUS] = modData.RunStatus;
-
-			var vehicleLoading = 0.SI<Kilogram>();
-			var cargoVolume = 0.SI<CubicMeter>();
-			var gearCount = 0u;
-			if (runData.Cycle.CycleType != CycleType.EngineOnly) {
-				WriteFullPowertrain(runData, row);
-
-				cargoVolume = runData.VehicleData.CargoVolume;
-				vehicleLoading = runData.VehicleData.Loading;
-				gearCount = (uint)runData.GearboxData.Gears.Count;
-			}
-
-
-			var totalTime = modData.Duration();
-			row[TIME] = totalTime;
-
-			var distance = modData.Distance();
-			if (distance != null) {
-                //row[DISTANCE] = distance.ConvertTo().Kilo.Meter;
-                //row[DISTANCE] = distance.ConvertTo(Unit.SI.Kilo.Meter);
-                row[DISTANCE] = distance.ConvertToKiloMeter();
-
-            }
-
-			var speed = modData.Speed();
-			if (speed != null) {
-                //row[SPEED] = speed.ConvertTo().Kilo.Meter.Per.Hour;
-                //row[SPEED] = speed.ConvertTo(Unit.SI.Kilo.Meter.Per.Hour);
-                row[SPEED] = speed.ConvertToKiloMeterPerHour();
-            }
-
-			row[ALTITUDE_DELTA] = modData.AltitudeDelta();
-
-			WriteFuelconsumptionEntries(modData, row, vehicleLoading, cargoVolume);
-
-			var kilogramPerMeter = modData.CO2PerMeter();
-			if (kilogramPerMeter != null) {
-                //row[CO2_KM] = kilogramPerMeter.ConvertTo().Gramm.Per.Kilo.Meter;
-                //row[CO2_KM] = kilogramPerMeter.ConvertTo(Unit.SI.Gramm.Per.Kilo.Meter);
-                row[CO2_KM] = kilogramPerMeter.ConvertToGrammPerKiloMeter();
-                if (vehicleLoading != null && !vehicleLoading.IsEqual(0)) {
-                    //row[CO2_TKM] = kilogramPerMeter.ConvertTo().Gramm.Per.Kilo.Meter / vehicleLoading.ConvertTo().Ton;
-                    //row[CO2_TKM] = kilogramPerMeter.ConvertTo(Unit.SI.Gramm.Per.Kilo.Meter) / vehicleLoading.ConvertTo(Unit.SI.Ton);
-                    row[CO2_TKM] = kilogramPerMeter.ConvertToGrammPerKiloMeter() / vehicleLoading.ConvertToTon();
-
-                }
-				if (cargoVolume > 0) {
-                    //row[CO2_M3KM] = kilogramPerMeter.ConvertTo().Gramm.Per.Kilo.Meter / cargoVolume;
-				    //row[CO2_M3KM] = kilogramPerMeter.ConvertTo(Unit.SI.Gramm.Per.Kilo.Meter) / cargoVolume;
-                    row[CO2_M3KM] = kilogramPerMeter.ConvertToGrammPerKiloMeter() / cargoVolume;
-
-                }
-			}
-
-            //row[P_WHEEL_POS] = modData.PowerWheelPositive().ConvertTo().Kilo.Watt;
-		    //row[P_WHEEL_POS] = modData.PowerWheelPositive().ConvertTo(Unit.SI.Kilo.Watt);
-            row[P_WHEEL_POS] = modData.PowerWheelPositive().ConvertToKiloWatt();
-
-            //row[P_FCMAP_POS] = modData.TotalPowerEnginePositiveAverage().ConvertTo().Kilo.Watt;
-            //row[P_FCMAP_POS] = modData.TotalPowerEnginePositiveAverage().ConvertTo(Unit.SI.Kilo.Watt);
-            row[P_FCMAP_POS] = modData.TotalPowerEnginePositiveAverage().ConvertToKiloWatt();
-
-            WriteAuxiliaries(modData, row);
-
-			WriteWorkEntries(modData, row);
-
-			WritePerformanceEntries(modData, row);
-
-			row[ENGINE_FULL_LOAD_TIME_SHARE] = modData.EngineMaxLoadTimeShare();
-			row[COASTING_TIME_SHARE] = modData.CoastingTimeShare();
-			row[BRAKING_TIME_SHARE] = modData.BrakingTimeShare();
-
-			if (gearCount <= 0) {
-				return;
-			}
-
-			WriteGearshiftStats(modData, row, gearCount);
-		}
-
-		private static void WriteFuelconsumptionEntries(IModalDataContainer modData, DataRow row, Kilogram vehicleLoading,
-			CubicMeter cargoVolume)
-		{
-            //row[FCMAP_H] = modData.FCMapPerSecond().ConvertTo().Gramm.Per.Hour;
-            //row[FCMAP_H] = modData.FCMapPerSecond().ConvertTo(Unit.SI.Gramm.Per.Hour);
-            row[FCMAP_H] = modData.FCMapPerSecond().ConvertToGrammPerHour();
-            var fcMapPerMeter = modData.FCMapPerMeter();
-			if (fcMapPerMeter != null) {
-				//row[FCMAP_KM] = fcMapPerMeter.ConvertTo().Gramm.Per.Kilo.Meter;
-			}
-
-            //row[FCAUXC_H] = modData.FuelConsumptionAuxStartStopPerSecond().ConvertTo().Gramm.Per.Hour;
-            //row[FCAUXC_H] = modData.FuelConsumptionAuxStartStopPerSecond().ConvertTo(Unit.SI.Gramm.Per.Hour);
-            row[FCAUXC_H] = modData.FuelConsumptionAuxStartStopPerSecond().ConvertToGrammPerHour();
-
-            var fuelConsumptionAuxStartStopCorrected = modData.FuelConsumptionAuxStartStop();
-			row[FCAUXC_KM] = FuelConsumptionAsGrammPerKiloMeter(fuelConsumptionAuxStartStopCorrected);
-
-            //row[FCWHTCC_H] = modData.FuelConsumptionWHTCPerSecond().ConvertTo().Gramm.Per.Hour;
-		    //row[FCWHTCC_H] = modData.FuelConsumptionWHTCPerSecond().ConvertTo(Unit.SI.Gramm.Per.Hour);
-            row[FCWHTCC_H] = modData.FuelConsumptionWHTCPerSecond().ConvertToGrammPerHour();
-
-            var fuelConsumptionWHTCCorrected = modData.FuelConsumptionWHTC();
-			row[FCWHTCC_KM] = FuelConsumptionAsGrammPerKiloMeter(fuelConsumptionWHTCCorrected);
-
-            //row[FCAAUX_H] = modData.FuelConsumptionAAUXPerSecond().ConvertTo().Gramm.Per.Hour;
-            //row[FCAAUX_H] = modData.FuelConsumptionAAUXPerSecond().ConvertTo(Unit.SI.Gramm.Per.Hour);
-            row[FCAAUX_H] = modData.FuelConsumptionAAUXPerSecond().ConvertToGrammPerHour();
-            var fuelConsumptionAaux = modData.FuelConsumptionAAUX();
-			row[FCAAUX_KM] = FuelConsumptionAsGrammPerKiloMeter(fuelConsumptionAaux);
-
-            //row[FCFINAL_H] = modData.FuelConsumptionFinalPerSecond().ConvertTo().Gramm.Per.Hour;
-		    //row[FCFINAL_H] = modData.FuelConsumptionFinalPerSecond().ConvertTo(Unit.SI.Gramm.Per.Hour);
-            row[FCFINAL_H] = modData.FuelConsumptionFinalPerSecond().ConvertToGrammPerHour();
-            var fcfinal = modData.FuelConsumptionFinal();
-			row[FCFINAL_KM] = FuelConsumptionAsGrammPerKiloMeter(fcfinal);
-
-			var fcPer100lkm = modData.FuelConsumptionFinalLiterPer100Kilometer();
-			row[FCFINAL_LITERPER100KM] = fcPer100lkm;
-			if (vehicleLoading != null && !vehicleLoading.IsEqual(0) && fcPer100lkm != null) {
-                //row[FCFINAL_LITERPER100TKM] = fcPer100lkm /
-                //							vehicleLoading.ConvertTo().Ton;
-                //row[FCFINAL_LITERPER100TKM] = fcPer100lkm /
-                //                              vehicleLoading.ConvertTo(Unit.SI.Ton);
-                row[FCFINAL_LITERPER100TKM] = fcPer100lkm /
-                                              vehicleLoading.ConvertToTon();
-            }
-			if (cargoVolume > 0 && fcPer100lkm != null) {
-				row[FCFINAL_LiterPer100M3KM] = fcPer100lkm / cargoVolume;
-			}
-		}
-
-		private static SI FuelConsumptionAsGrammPerKiloMeter(SI fc)
-		{
-			if (fc == null) {
-				return null;
-			}
-            //return fc.ConvertTo().Gramm.Per.Kilo.Meter;
-            //return fc.ConvertTo(Unit.SI.Gramm.Per.Kilo.Meter);
-            return fc.ConvertToGrammPerKiloMeter();
-        }
-
-		private void WriteAuxiliaries(IModalDataContainer modData, DataRow row)
-		{
-			foreach (var aux in modData.Auxiliaries) {
-				string colName;
-				if (aux.Key == Constants.Auxiliaries.IDs.PTOConsumer || aux.Key == Constants.Auxiliaries.IDs.PTOTransmission) {
-					colName = string.Format(E_FORMAT, aux.Key);
-				} else {
-					colName = string.Format(E_AUX_FORMAT, aux.Key);
-				}
-
-				if (!Table.Columns.Contains(colName)) {
-					var col = Table.Columns.Add(colName, typeof(SI));
-					// move the new column to correct position
-					col.SetOrdinal(Table.Columns[E_AUX].Ordinal);
-				}
-
-                //row[colName] = modData.AuxiliaryWork(aux.Value).ConvertTo().Kilo.Watt.Hour;
-                //row[colName] = modData.AuxiliaryWork(aux.Value).ConvertTo(Unit.SI.Kilo.Watt.Hour);
-                row[colName] = modData.AuxiliaryWork(aux.Value).ConvertToKiloWattHour();
-            }
-		}
-
-		private void WriteGearshiftStats(IModalDataContainer modData, DataRow row, uint gearCount)
-		{
-			row[NUM_GEARSHIFTS] = modData.GearshiftCount();
-			var timeSharePerGear = modData.TimeSharePerGear(gearCount);
-
-			for (uint i = 0; i <= gearCount; i++) {
-				var colName = string.Format(TIME_SHARE_PER_GEAR_FORMAT, i);
-				if (!Table.Columns.Contains(colName)) {
-					Table.Columns.Add(colName, typeof(SI));
-				}
-				row[colName] = timeSharePerGear[i];
-			}
-		}
-
-		private void WritePerformanceEntries(IModalDataContainer modData, DataRow row)
-		{
-			row[ACC] = modData.AccelerationAverage();
-			row[ACC_POS] = modData.AccelerationsPositive();
-			row[ACC_NEG] = modData.AccelerationsNegative();
-			var accTimeShare = modData.AccelerationTimeShare();
-			row[ACC_TIMESHARE] = accTimeShare;
-			var decTimeShare = modData.DecelerationTimeShare();
-			row[DEC_TIMESHARE] = decTimeShare;
-			var cruiseTimeShare = modData.CruiseTimeShare();
-			row[CRUISE_TIMESHARE] = cruiseTimeShare;
-			var stopTimeShare = modData.StopTimeShare();
-			row[STOP_TIMESHARE] = stopTimeShare;
-
-			row[MAX_SPEED] = modData.MaxSpeed().AsKmph.SI<Scalar>();
-			row[MAX_ACCELERATION] = modData.MaxAcceleration();
-			row[MAX_DECELERATION] = modData.MaxDeceleration();
-			row[AVG_ENGINE_SPEED] = modData.AvgEngineSpeed().AsRPM.SI<Scalar>();
-			row[MAX_ENGINE_SPEED] = modData.MaxEngineSpeed().AsRPM.SI<Scalar>();
-			if (accTimeShare != null && decTimeShare != null && cruiseTimeShare != null) {
-				var shareSum = accTimeShare + decTimeShare + cruiseTimeShare + stopTimeShare;
-				if (!shareSum.IsEqual(100)) {
-					Log.Error(
-						"Sumfile Error: driving behavior timeshares must sum up to 100%: acc: {0}%, dec: {1}%, cruise: {2}%, stop: {3}%, sum: {4}%",
-						accTimeShare.ToOutputFormat(1, null, false), decTimeShare.ToOutputFormat(1, null, false),
-						cruiseTimeShare.ToOutputFormat(1, null, false), stopTimeShare.ToOutputFormat(1, null, false),
-						shareSum.ToOutputFormat(1, null, false));
-				}
-			}
-		}
-
-		private static void WriteWorkEntries(IModalDataContainer modData, DataRow row)
-		{
-            row[E_FCMAP_POS] = modData.TotalEngineWorkPositive().ConvertToKiloWattHour();
-            row[E_FCMAP_NEG] = -modData.TotalEngineWorkNegative().ConvertToKiloWattHour();
-            row[E_POWERTRAIN_INERTIA] = modData.PowerAccelerations().ConvertToKiloWattHour();
-            row[E_AUX] = modData.WorkAuxiliaries().ConvertToKiloWattHour();
-            row[E_CLUTCH_LOSS] = modData.WorkClutch().ConvertToKiloWattHour();
-            row[E_TC_LOSS] = modData.WorkTorqueConverter().ConvertToKiloWattHour();
-            row[E_SHIFT_LOSS] = modData.WorkGearshift().ConvertToKiloWattHour();
-            row[E_GBX_LOSS] = modData.WorkGearbox().ConvertToKiloWattHour();
-            row[E_RET_LOSS] = modData.WorkRetarder().ConvertToKiloWattHour();
-            row[E_AXL_LOSS] = modData.WorkAxlegear().ConvertToKiloWattHour();
-            row[E_ANGLE_LOSS] = modData.WorkAngledrive().ConvertToKiloWattHour();
-            row[E_BRAKE] = modData.WorkTotalMechanicalBrake().ConvertToKiloWattHour();
-            row[E_VEHICLE_INERTIA] = modData.WorkVehicleInertia().ConvertToKiloWattHour();
-            row[E_AIR] = modData.WorkAirResistance().ConvertToKiloWattHour();
-            row[E_ROLL] = modData.WorkRollingResistance().ConvertToKiloWattHour();
-            row[E_GRAD] = modData.WorkRoadGradientResistance().ConvertToKiloWattHour();
-            //row[E_FCMAP_POS] = modData.TotalEngineWorkPositive().ConvertTo(Unit.SI.Kilo.Watt.Hour);
-            //row[E_FCMAP_NEG] = -modData.TotalEngineWorkNegative().ConvertTo(Unit.SI.Kilo.Watt.Hour);
-            //      row[E_POWERTRAIN_INERTIA] = modData.PowerAccelerations().ConvertTo(Unit.SI.Kilo.Watt.Hour);
-            //      row[E_AUX] = modData.WorkAuxiliaries().ConvertTo(Unit.SI.Kilo.Watt.Hour);
-            //      row[E_CLUTCH_LOSS] = modData.WorkClutch().ConvertTo(Unit.SI.Kilo.Watt.Hour);
-            //      row[E_TC_LOSS] = modData.WorkTorqueConverter().ConvertTo(Unit.SI.Kilo.Watt.Hour);
-            //      row[E_SHIFT_LOSS] = modData.WorkGearshift().ConvertTo(Unit.SI.Kilo.Watt.Hour);
-            //      row[E_GBX_LOSS] = modData.WorkGearbox().ConvertTo(Unit.SI.Kilo.Watt.Hour);
-            //      row[E_RET_LOSS] = modData.WorkRetarder().ConvertTo(Unit.SI.Kilo.Watt.Hour);
-            //      row[E_AXL_LOSS] = modData.WorkAxlegear().ConvertTo(Unit.SI.Kilo.Watt.Hour);
-            //      row[E_ANGLE_LOSS] = modData.WorkAngledrive().ConvertTo(Unit.SI.Kilo.Watt.Hour);
-            //      row[E_BRAKE] = modData.WorkTotalMechanicalBrake().ConvertTo(Unit.SI.Kilo.Watt.Hour);
-            //      row[E_VEHICLE_INERTIA] = modData.WorkVehicleInertia().ConvertTo(Unit.SI.Kilo.Watt.Hour);
-            //      row[E_AIR] = modData.WorkAirResistance().ConvertTo(Unit.SI.Kilo.Watt.Hour);
-            //      row[E_ROLL] = modData.WorkRollingResistance().ConvertTo(Unit.SI.Kilo.Watt.Hour);
-            //      row[E_GRAD] = modData.WorkRoadGradientResistance().ConvertTo(Unit.SI.Kilo.Watt.Hour);
-            //row[E_FCMAP_POS] = modData.TotalEngineWorkPositive().ConvertTo().Kilo.Watt.Hour;
-            //row[E_FCMAP_NEG] = -modData.TotalEngineWorkNegative().ConvertTo().Kilo.Watt.Hour;
-            //row[E_POWERTRAIN_INERTIA] = modData.PowerAccelerations().ConvertTo().Kilo.Watt.Hour;
-            //row[E_AUX] = modData.WorkAuxiliaries().ConvertTo().Kilo.Watt.Hour;
-            //row[E_CLUTCH_LOSS] = modData.WorkClutch().ConvertTo().Kilo.Watt.Hour;
-            //row[E_TC_LOSS] = modData.WorkTorqueConverter().ConvertTo().Kilo.Watt.Hour;
-            //row[E_SHIFT_LOSS] = modData.WorkGearshift().ConvertTo().Kilo.Watt.Hour;
-            //row[E_GBX_LOSS] = modData.WorkGearbox().ConvertTo().Kilo.Watt.Hour;
-            //row[E_RET_LOSS] = modData.WorkRetarder().ConvertTo().Kilo.Watt.Hour;
-            //row[E_AXL_LOSS] = modData.WorkAxlegear().ConvertTo().Kilo.Watt.Hour;
-            //row[E_ANGLE_LOSS] = modData.WorkAngledrive().ConvertTo().Kilo.Watt.Hour;
-            //row[E_BRAKE] = modData.WorkTotalMechanicalBrake().ConvertTo().Kilo.Watt.Hour;
-            //row[E_VEHICLE_INERTIA] = modData.WorkVehicleInertia().ConvertTo().Kilo.Watt.Hour;
-            //row[E_AIR] = modData.WorkAirResistance().ConvertTo().Kilo.Watt.Hour;
-            //row[E_ROLL] = modData.WorkRollingResistance().ConvertTo().Kilo.Watt.Hour;
-            //row[E_GRAD] = modData.WorkRoadGradientResistance().ConvertTo().Kilo.Watt.Hour;
-        }
-
-		private void WriteFullPowertrain(VectoRunData runData, DataRow row)
-		{
-			row[VEHICLE_MANUFACTURER] = runData.VehicleData.Manufacturer;
-			row[VIN_NUMBER] = runData.VehicleData.VIN;
-			row[VEHICLE_MODEL] = runData.VehicleData.ModelName;
-
-			row[HDV_CO2_VEHICLE_CLASS] = runData.VehicleData.VehicleClass.GetClassNumber();
-			row[CURB_MASS] = runData.VehicleData.CurbWeight;
-			// - (runData.VehicleData.BodyAndTrailerWeight ?? 0.SI<Kilogram>());
-			row[LOADING] = runData.VehicleData.Loading;
-			row[CARGO_VOLUME] = runData.VehicleData.CargoVolume;
-
-			row[TOTAL_VEHICLE_MASS] = runData.VehicleData.TotalVehicleWeight;
-			row[ENGINE_MANUFACTURER] = runData.EngineData.Manufacturer;
-			row[ENGINE_MODEL] = runData.EngineData.ModelName;
-			row[ENGINE_FUEL_TYPE] = runData.EngineData.FuelType.GetLabel();
-			row[ENGINE_RATED_POWER] = runData.EngineData.RatedPowerDeclared != null && runData.EngineData.RatedPowerDeclared > 0
-                ? runData.EngineData.RatedPowerDeclared.ConvertToKiloWatt()
-                : runData.EngineData.FullLoadCurves[0].MaxPower.ConvertToKiloWatt();
-            //? runData.EngineData.RatedPowerDeclared.ConvertTo(Unit.SI.Kilo.Watt)
-            //         : runData.EngineData.FullLoadCurves[0].MaxPower.ConvertTo(Unit.SI.Kilo.Watt);
-                 //? runData.EngineData.RatedPowerDeclared.ConvertTo().Kilo.Watt
-                 //: runData.EngineData.FullLoadCurves[0].MaxPower.ConvertTo().Kilo.Watt;
-            row[ENGINE_IDLING_SPEED] = runData.EngineData.IdleSpeed.AsRPM.SI<Scalar>();
-			row[ENGINE_RATED_SPEED] = runData.EngineData.RatedSpeedDeclared != null && runData.EngineData.RatedSpeedDeclared > 0
-				? runData.EngineData.RatedSpeedDeclared.AsRPM.SI<Scalar>()
-				: runData.EngineData.FullLoadCurves[0].RatedSpeed.AsRPM.SI<Scalar>();
-            //row[ENGINE_DISPLACEMENT] = runData.EngineData.Displacement.ConvertTo().Cubic.Centi.Meter;
-            //row[ENGINE_DISPLACEMENT] = runData.EngineData.Displacement.ConvertTo(Unit.SI.Cubic.Centi.Meter);
-            row[ENGINE_DISPLACEMENT] = runData.EngineData.Displacement.ConvertToCubicCentiMeter();
-
-            row[ENGINE_WHTC_URBAN] = runData.EngineData.WHTCUrban;
-			row[ENGINE_WHTC_RURAL] = runData.EngineData.WHTCRural;
-			row[ENGINE_WHTC_MOTORWAY] = runData.EngineData.WHTCMotorway;
-			row[ENGINE_BF_COLD_HOT] = runData.EngineData.ColdHotCorrectionFactor;
-			row[ENGINE_CF_REG_PER] = runData.EngineData.CorrectionFactorRegPer;
-			row[ENGINE_ACTUAL_CORRECTION_FACTOR] = runData.EngineData.FuelConsumptionCorrectionFactor;
-
-			row[CD_x_A_DECLARED] = runData.AirdragData.DeclaredAirdragArea;
-			row[CD_x_A] = runData.AirdragData.CrossWindCorrectionCurve.AirDragArea;
-
-			row[ROLLING_RESISTANCE_COEFFICIENT_WO_TRAILER] =
-				runData.VehicleData.RollResistanceCoefficientWithoutTrailer;
-			row[ROLLING_RESISTANCE_COEFFICIENT_W_TRAILER] =
-				runData.VehicleData.TotalRollResistanceCoefficient;
-
-			row[R_DYN] = runData.VehicleData.DynamicTyreRadius;
-
-			row[NUM_AXLES_DRIVEN] = runData.VehicleData.AxleData.Count(x => x.AxleType == AxleType.VehicleDriven);
-			row[NUM_AXLES_NON_DRIVEN] = runData.VehicleData.AxleData.Count(x => x.AxleType == AxleType.VehicleNonDriven);
-			row[NUM_AXLES_TRAILER] = runData.VehicleData.AxleData.Count(x => x.AxleType == AxleType.Trailer);
-
-			row[GEARBOX_MANUFACTURER] = runData.GearboxData.Manufacturer;
-			row[GEARBOX_MODEL] = runData.GearboxData.ModelName;
-			row[GEARBOX_TYPE] = runData.GearboxData.Type;
-			WriteGearboxData(runData, row);
-
-			row[RETARDER_TYPE] = runData.Retarder.Type.GetLabel();
-			WriteRetarderData(runData, row);
-
-			WriteAngledriveData(runData, row);
-
-			row[AXLE_MANUFACTURER] = runData.AxleGearData.Manufacturer;
-			row[AXLE_MODEL] = runData.AxleGearData.ModelName;
-			row[AXLE_RATIO] = runData.AxleGearData.AxleGear.Ratio.SI<Scalar>();
-
-			WriteAuxTechnologies(runData, row);
-		}
-
-		private void WriteAuxTechnologies(VectoRunData runData, DataRow row)
-		{
-			foreach (var aux in runData.Aux) {
-				if (aux.ID == Constants.Auxiliaries.IDs.PTOConsumer || aux.ID == Constants.Auxiliaries.IDs.PTOTransmission) {
-					continue;
-				}
-				var colName = string.Format(AUX_TECH_FORMAT, aux.ID);
-
-				if (!Table.Columns.Contains(colName)) {
-					var col = Table.Columns.Add(colName, typeof(string));
-					// move the new column to correct position
-					col.SetOrdinal(Table.Columns[CARGO_VOLUME].Ordinal);
-				}
-
-				row[colName] = aux.Technology == null ? "" : string.Join("; ", aux.Technology);
-			}
-		}
-
-		private static void WriteAngledriveData(VectoRunData runData, DataRow row)
-		{
-			if (runData.AngledriveData != null) {
-				row[ANGLEDRIVE_MANUFACTURER] = runData.AngledriveData.Manufacturer;
-				row[ANGLEDRIVE_MODEL] = runData.AngledriveData.ModelName;
-				row[ANGLEDRIVE_RATIO] = runData.AngledriveData.Angledrive.Ratio;
-			} else {
-				row[ANGLEDRIVE_MANUFACTURER] = "n.a.";
-				row[ANGLEDRIVE_MODEL] = "n.a.";
-				row[ANGLEDRIVE_RATIO] = "n.a.";
-			}
-		}
-
-		private static void WriteRetarderData(VectoRunData runData, DataRow row)
-		{
-			if (runData.Retarder.Type.IsDedicatedComponent()) {
-				row[RETARDER_MANUFACTURER] = runData.Retarder.Manufacturer;
-				row[RETARDER_MODEL] = runData.Retarder.ModelName;
-			} else {
-				row[RETARDER_MANUFACTURER] = "n.a.";
-				row[RETARDER_MODEL] = "n.a.";
-			}
-		}
-
-		private static void WriteGearboxData(VectoRunData runData, DataRow row)
-		{
-			if (runData.GearboxData.Type.AutomaticTransmission()) {
-				row[GEAR_RATIO_FIRST_GEAR] = runData.GearboxData.Gears.Count > 0
-					? (double.IsNaN(runData.GearboxData.Gears.First().Value.Ratio)
-						? runData.GearboxData.Gears.First().Value.TorqueConverterRatio.SI<Scalar>()
-						: runData.GearboxData.Gears.First().Value.Ratio.SI<Scalar>())
-					: 0.SI<Scalar>();
-				row[GEAR_RATIO_LAST_GEAR] = runData.GearboxData.Gears.Count > 0
-					? runData.GearboxData.Gears.Last().Value.Ratio.SI<Scalar>()
-					: 0.SI<Scalar>();
-				row[TORQUECONVERTER_MANUFACTURER] = runData.GearboxData.TorqueConverterData.Manufacturer;
-				row[TORQUECONVERTER_MODEL] = runData.GearboxData.TorqueConverterData.ModelName;
-			} else {
-				row[GEAR_RATIO_FIRST_GEAR] = runData.GearboxData.Gears.Count > 0
-					? runData.GearboxData.Gears.First().Value.Ratio.SI<Scalar>()
-					: 0.SI<Scalar>();
-				row[GEAR_RATIO_LAST_GEAR] = runData.GearboxData.Gears.Count > 0
-					? runData.GearboxData.Gears.Last().Value.Ratio.SI<Scalar>()
-					: 0.SI<Scalar>();
-				row[TORQUECONVERTER_MANUFACTURER] = "n.a.";
-				row[TORQUECONVERTER_MODEL] = "n.a.";
-			}
-		}
-
-		private static string ReplaceNotAllowedCharacters(string text)
-		{
-			return text.Replace('#', '_').Replace(',', '_').Replace('\n', '_').Replace('\r', '_');
-		}
-
-		public void Dispose()
-		{
-			Dispose(true);
-			GC.SuppressFinalize(this);
-		}
-
-		protected void Dispose(bool disposing)
-		{
-			if (disposing) {
-				Table.Dispose();
-			}
-		}
-	}
+/*
+* This file is part of VECTO.
+*
+* Copyright © 2012-2017 European Union
+*
+* Developed by Graz University of Technology,
+*              Institute of Internal Combustion Engines and Thermodynamics,
+*              Institute of Technical Informatics
+*
+* VECTO is licensed under the EUPL, Version 1.1 or - as soon they will be approved
+* by the European Commission - subsequent versions of the EUPL (the "Licence");
+* You may not use VECTO except in compliance with the Licence.
+* You may obtain a copy of the Licence at:
+*
+* https://joinup.ec.europa.eu/community/eupl/og_page/eupl
+*
+* Unless required by applicable law or agreed to in writing, VECTO
+* distributed under the Licence is distributed on an "AS IS" basis,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the Licence for the specific language governing permissions and
+* limitations under the Licence.
+*
+* Authors:
+*   Stefan Hausberger, hausberger@ivt.tugraz.at, IVT, Graz University of Technology
+*   Christian Kreiner, christian.kreiner@tugraz.at, ITI, Graz University of Technology
+*   Michael Krisper, michael.krisper@tugraz.at, ITI, Graz University of Technology
+*   Raphael Luz, luz@ivt.tugraz.at, IVT, Graz University of Technology
+*   Markus Quaritsch, markus.quaritsch@tugraz.at, IVT, Graz University of Technology
+*   Martin Rexeis, rexeis@ivt.tugraz.at, IVT, Graz University of Technology
+*/
+
+using System;
+using System.Data;
+using System.Linq;
+using System.Runtime.CompilerServices;
+using TUGraz.VectoCommon.Models;
+using TUGraz.VectoCommon.Utils;
+using TUGraz.VectoCore.Configuration;
+using TUGraz.VectoCore.Models.Declaration;
+using TUGraz.VectoCore.Models.Simulation.Data;
+using TUGraz.VectoCore.Models.SimulationComponent.Data;
+
+// ReSharper disable MemberCanBePrivate.Global  -- used by API!
+
+namespace TUGraz.VectoCore.OutputData
+{
+    public delegate void WriteSumData(IModalDataContainer data);
+
+    /// <summary>
+    /// Class for the sum file in vecto.
+    /// </summary>
+    public class SummaryDataContainer : LoggingObject, IDisposable
+    {
+        // ReSharper disable InconsistentNaming
+        public const string INTERNAL_PREFIX = "INTERNAL";
+
+        public const string SORT = INTERNAL_PREFIX + " Sorting";
+        public const string JOB = "Job [-]";
+        public const string INPUTFILE = "Input File [-]";
+        public const string CYCLE = "Cycle [-]";
+        public const string STATUS = "Status";
+        public const string CURB_MASS = "Corrected Actual Curb Mass [kg]";
+        public const string LOADING = "Loading [kg]";
+
+        public const string VEHICLE_MANUFACTURER = "Vehicle manufacturer [-]";
+        public const string VIN_NUMBER = "VIN number";
+        public const string VEHICLE_MODEL = "Vehicle model [-]";
+
+        public const string ENGINE_MANUFACTURER = "Engine manufacturer [-]";
+        public const string ENGINE_MODEL = "Engine model [-]";
+        public const string ENGINE_FUEL_TYPE = "Engine fuel type [-]";
+        public const string ENGINE_WHTC_URBAN = "Engine WHTCUrban";
+        public const string ENGINE_WHTC_RURAL = "Engine WHTCRural";
+        public const string ENGINE_WHTC_MOTORWAY = "Engine WHTCMotorway";
+        public const string ENGINE_BF_COLD_HOT = "Engine BFColdHot";
+        public const string ENGINE_CF_REG_PER = "Engine CFRegPer";
+        public const string ENGINE_ACTUAL_CORRECTION_FACTOR = "Engine actual CF";
+        public const string ENGINE_RATED_POWER = "Engine rated power [kW]";
+        public const string ENGINE_IDLING_SPEED = "Engine idling speed [rpm]";
+        public const string ENGINE_RATED_SPEED = "Engine rated speed [rpm]";
+        public const string ENGINE_DISPLACEMENT = "Engine displacement [ccm]";
+
+        public const string ROLLING_RESISTANCE_COEFFICIENT_W_TRAILER = "total RRC [-]";
+        public const string ROLLING_RESISTANCE_COEFFICIENT_WO_TRAILER = "weighted RRC w/o trailer [-]";
+
+        public const string GEARBOX_MANUFACTURER = "Gearbox manufacturer [-]";
+        public const string GEARBOX_MODEL = "Gearbox model [-]";
+        public const string GEARBOX_TYPE = "Gearbox type [-]";
+        public const string GEAR_RATIO_FIRST_GEAR = "Gear ratio first gear [-]";
+        public const string GEAR_RATIO_LAST_GEAR = "Gear ratio last gear [-]";
+
+        public const string TORQUECONVERTER_MANUFACTURER = "Torque converter manufacturer [-]";
+        public const string TORQUECONVERTER_MODEL = "Torque converter model [-]";
+
+        public const string RETARDER_MANUFACTURER = "Retarder manufacturer [-]";
+        public const string RETARDER_MODEL = "Retarder model [-]";
+        public const string RETARDER_TYPE = "Retarder type [-]";
+
+        public const string ANGLEDRIVE_MANUFACTURER = "Angledrive manufacturer [-]";
+        public const string ANGLEDRIVE_MODEL = "Angledrive model [-]";
+        public const string ANGLEDRIVE_RATIO = "Angledrive ratio [-]";
+
+        public const string AXLE_MANUFACTURER = "Axle manufacturer [-]";
+        public const string AXLE_MODEL = "Axle model [-]";
+        public const string AXLE_RATIO = "Axle gear ratio [-]";
+
+        public const string AUX_TECH_FORMAT = "Auxiliary technology {0} [-]";
+
+        public const string HDV_CO2_VEHICLE_CLASS = "HDV CO2 vehicle class [-]";
+        public const string TOTAL_VEHICLE_MASS = "Total vehicle mass [kg]";
+        public const string CD_x_A_DECLARED = "Declared CdxA [m²]";
+
+        public const string CD_x_A = "CdxA [m²]";
+
+        //public const string ROLLING_RESISTANCE_COEFFICIENT = "weighed RRC [-]";
+        public const string R_DYN = "r_dyn [m]";
+
+        public const string CARGO_VOLUME = "Cargo Volume [m³]";
+        public const string TIME = "time [s]";
+        public const string DISTANCE = "distance [km]";
+        public const string SPEED = "speed [km/h]";
+        public const string ALTITUDE_DELTA = "altitudeDelta [m]";
+
+        public const string FCMAP_H = "FC-Map [g/h]";
+        public const string FCMAP_KM = "FC-Map [g/km]";
+        public const string FCAUXC_H = "FC-AUXc [g/h]";
+        public const string FCAUXC_KM = "FC-AUXc [g/km]";
+        public const string FCWHTCC_H = "FC-WHTCc [g/h]";
+        public const string FCWHTCC_KM = "FC-WHTCc [g/km]";
+        public const string FCAAUX_H = "FC-AAUX [g/h]";
+        public const string FCAAUX_KM = "FC-AAUX [g/km]";
+
+        public const string FCFINAL_H = "FC-Final [g/h]";
+        public const string FCFINAL_KM = "FC-Final [g/km]";
+        public const string FCFINAL_LITERPER100KM = "FC-Final [l/100km]";
+        public const string FCFINAL_LITERPER100TKM = "FC-Final [l/100tkm]";
+        public const string FCFINAL_LiterPer100M3KM = "FC-Final [l/100m³km]";
+
+        public const string CO2_KM = "CO2 [g/km]";
+        public const string CO2_TKM = "CO2 [g/tkm]";
+        public const string CO2_M3KM = "CO2 [g/m³km]";
+
+        public const string P_WHEEL_POS = "P_wheel_in_pos [kW]";
+        public const string P_FCMAP_POS = "P_fcmap_pos [kW]";
+
+        public const string E_FORMAT = "E_{0} [kWh]";
+        public const string E_AUX_FORMAT = "E_aux_{0} [kWh]";
+        public const string E_AUX = "E_aux_sum [kWh]";
+
+        public const string E_AIR = "E_air [kWh]";
+        public const string E_ROLL = "E_roll [kWh]";
+        public const string E_GRAD = "E_grad [kWh]";
+        public const string E_VEHICLE_INERTIA = "E_vehi_inertia [kWh]";
+        public const string E_POWERTRAIN_INERTIA = "E_powertrain_inertia [kWh]";
+        public const string E_BRAKE = "E_brake [kWh]";
+        public const string E_GBX_LOSS = "E_gbx_loss [kWh]";
+        public const string E_SHIFT_LOSS = "E_shift_loss [kWh]";
+        public const string E_AXL_LOSS = "E_axl_loss [kWh]";
+        public const string E_RET_LOSS = "E_ret_loss [kWh]";
+        public const string E_TC_LOSS = "E_tc_loss [kWh]";
+        public const string E_ANGLE_LOSS = "E_angle_loss [kWh]";
+        public const string E_CLUTCH_LOSS = "E_clutch_loss [kWh]";
+        public const string E_FCMAP_POS = "E_fcmap_pos [kWh]";
+        public const string E_FCMAP_NEG = "E_fcmap_neg [kWh]";
+
+        public const string ACC = "a [m/s^2]";
+        public const string ACC_POS = "a_pos [m/s^2]";
+        public const string ACC_NEG = "a_neg [m/s^2]";
+
+        public const string ACC_TIMESHARE = "AccelerationTimeShare [%]";
+        public const string DEC_TIMESHARE = "DecelerationTimeShare [%]";
+        public const string CRUISE_TIMESHARE = "CruiseTimeShare [%]";
+        public const string STOP_TIMESHARE = "StopTimeShare [%]";
+
+        public const string MAX_SPEED = "max. speed [km/h]";
+        public const string MAX_ACCELERATION = "max. acc [m/s²]";
+        public const string MAX_DECELERATION = "max. dec [m/s²]";
+        public const string AVG_ENGINE_SPEED = "n_eng_avg [rpm]";
+        public const string MAX_ENGINE_SPEED = "n_eng_max [rpm]";
+        public const string NUM_GEARSHIFTS = "gear shifts [-]";
+        public const string ENGINE_FULL_LOAD_TIME_SHARE = "Engine max. Load time share [%]";
+        public const string COASTING_TIME_SHARE = "CoastingTimeShare [%]";
+        public const string BRAKING_TIME_SHARE = "BrakingTImeShare [%]";
+
+        public const string TIME_SHARE_PER_GEAR_FORMAT = "Gear {0} TimeShare [%]";
+
+        public const string NUM_AXLES_DRIVEN = "Number axles vehicle driven [-]";
+        public const string NUM_AXLES_NON_DRIVEN = "Number axles vehicle non-driven [-]";
+        public const string NUM_AXLES_TRAILER = "Number axles trailer [-]";
+
+        // ReSharper restore InconsistentNaming
+
+        internal readonly DataTable Table;
+        private readonly ISummaryWriter _sumWriter;
+
+
+        protected SummaryDataContainer() { }
+
+        /// <summary>
+        /// Initializes a new instance of the <see cref="SummaryDataContainer"/> class.
+        /// </summary>
+        /// <param name="writer"></param>
+        public SummaryDataContainer(ISummaryWriter writer)
+        {
+            _sumWriter = writer;
+
+            Table = new DataTable();
+
+            Table.Columns.AddRange(new[] {
+                Tuple.Create(SORT, typeof(int)),
+                Tuple.Create(JOB, typeof(string)),
+                Tuple.Create(INPUTFILE, typeof(string)),
+                Tuple.Create(CYCLE, typeof(string)),
+                Tuple.Create(STATUS, typeof(string)),
+                Tuple.Create(VEHICLE_MANUFACTURER, typeof(string)),
+                Tuple.Create(VIN_NUMBER, typeof(string)),
+                Tuple.Create(VEHICLE_MODEL, typeof(string)),
+                Tuple.Create(HDV_CO2_VEHICLE_CLASS, typeof(string)),
+                Tuple.Create(CURB_MASS, typeof(SI)),
+                Tuple.Create(LOADING, typeof(SI)),
+                Tuple.Create(TOTAL_VEHICLE_MASS, typeof(SI)),
+                Tuple.Create(ENGINE_MANUFACTURER, typeof(string)),
+                Tuple.Create(ENGINE_MODEL, typeof(string)),
+                Tuple.Create(ENGINE_FUEL_TYPE, typeof(string)),
+                Tuple.Create(ENGINE_RATED_POWER, typeof(ConvertedSI)),
+                Tuple.Create(ENGINE_IDLING_SPEED, typeof(SI)),
+                Tuple.Create(ENGINE_RATED_SPEED, typeof(SI)),
+                Tuple.Create(ENGINE_DISPLACEMENT, typeof(ConvertedSI)),
+                Tuple.Create(ENGINE_WHTC_URBAN, typeof(double)),
+                Tuple.Create(ENGINE_WHTC_RURAL, typeof(double)),
+                Tuple.Create(ENGINE_WHTC_MOTORWAY, typeof(double)),
+                Tuple.Create(ENGINE_BF_COLD_HOT, typeof(double)),
+                Tuple.Create(ENGINE_CF_REG_PER, typeof(double)),
+                Tuple.Create(ENGINE_ACTUAL_CORRECTION_FACTOR, typeof(double)),
+                Tuple.Create(CD_x_A_DECLARED, typeof(SI)),
+                Tuple.Create(CD_x_A, typeof(SI)),
+                Tuple.Create(ROLLING_RESISTANCE_COEFFICIENT_W_TRAILER, typeof(double)),
+                Tuple.Create(ROLLING_RESISTANCE_COEFFICIENT_WO_TRAILER, typeof(double)),
+                Tuple.Create(R_DYN, typeof(SI)),
+                Tuple.Create(NUM_AXLES_DRIVEN, typeof(int)),
+                Tuple.Create(NUM_AXLES_NON_DRIVEN, typeof(int)),
+                Tuple.Create(NUM_AXLES_TRAILER, typeof(int)),
+                Tuple.Create(GEARBOX_MANUFACTURER, typeof(string)),
+                Tuple.Create(GEARBOX_MODEL, typeof(string)),
+                Tuple.Create(GEARBOX_TYPE, typeof(string)),
+                Tuple.Create(GEAR_RATIO_FIRST_GEAR, typeof(SI)),
+                Tuple.Create(GEAR_RATIO_LAST_GEAR, typeof(SI)),
+                Tuple.Create(TORQUECONVERTER_MANUFACTURER, typeof(string)),
+                Tuple.Create(TORQUECONVERTER_MODEL, typeof(string)),
+                Tuple.Create(RETARDER_MANUFACTURER, typeof(string)),
+                Tuple.Create(RETARDER_MODEL, typeof(string)),
+                Tuple.Create(RETARDER_TYPE, typeof(string)),
+                Tuple.Create(ANGLEDRIVE_MANUFACTURER, typeof(string)),
+                Tuple.Create(ANGLEDRIVE_MODEL, typeof(string)),
+                Tuple.Create(ANGLEDRIVE_RATIO, typeof(string)),
+                Tuple.Create(AXLE_MANUFACTURER, typeof(string)),
+                Tuple.Create(AXLE_MODEL, typeof(string)),
+                Tuple.Create(AXLE_RATIO, typeof(SI)),
+                Tuple.Create(string.Format(AUX_TECH_FORMAT, Constants.Auxiliaries.IDs.SteeringPump), typeof(string)),
+                Tuple.Create(string.Format(AUX_TECH_FORMAT, Constants.Auxiliaries.IDs.Fan), typeof(string)),
+                Tuple.Create(string.Format(AUX_TECH_FORMAT, Constants.Auxiliaries.IDs.HeatingVentilationAirCondition),
+                    typeof(string)),
+                Tuple.Create(string.Format(AUX_TECH_FORMAT, Constants.Auxiliaries.IDs.PneumaticSystem), typeof(string)),
+                Tuple.Create(string.Format(AUX_TECH_FORMAT, Constants.Auxiliaries.IDs.ElectricSystem), typeof(string)),
+            }.Select(x => new DataColumn(x.Item1, x.Item2)).ToArray());
+
+            Table.Columns.AddRange(new[] {
+                CARGO_VOLUME,
+                TIME, DISTANCE,
+                SPEED, ALTITUDE_DELTA,
+                FCMAP_H, FCMAP_KM,
+                FCAUXC_H, FCAUXC_KM,
+                FCWHTCC_H, FCWHTCC_KM,
+                FCAAUX_H, FCAAUX_KM,
+                FCFINAL_H, FCFINAL_KM,
+                FCFINAL_LITERPER100KM, FCFINAL_LITERPER100TKM, FCFINAL_LiterPer100M3KM,
+                CO2_KM, CO2_TKM, CO2_M3KM,
+                P_WHEEL_POS, P_FCMAP_POS,
+                E_FCMAP_POS, E_FCMAP_NEG, E_POWERTRAIN_INERTIA,
+                E_AUX, E_CLUTCH_LOSS, E_TC_LOSS, E_SHIFT_LOSS, E_GBX_LOSS,
+                E_RET_LOSS, E_ANGLE_LOSS, E_AXL_LOSS, E_BRAKE, E_VEHICLE_INERTIA, E_AIR, E_ROLL, E_GRAD,
+                ACC, ACC_POS, ACC_NEG, ACC_TIMESHARE, DEC_TIMESHARE, CRUISE_TIMESHARE,
+                MAX_SPEED, MAX_ACCELERATION, MAX_DECELERATION, AVG_ENGINE_SPEED, MAX_ENGINE_SPEED, NUM_GEARSHIFTS,
+                STOP_TIMESHARE, ENGINE_FULL_LOAD_TIME_SHARE, COASTING_TIME_SHARE, BRAKING_TIME_SHARE
+            }.Select(x => new DataColumn(x)).ToArray());
+        }
+
+        /// <summary>
+        /// Finishes the summary data container (writes the data to the sumWriter).
+        /// </summary>
+        [MethodImpl(MethodImplOptions.Synchronized)]
+        public virtual void Finish()
+        {
+            if (_sumWriter != null) {
+                var view = new DataView(Table, "", SORT, DataViewRowState.CurrentRows).ToTable();
+                var toRemove =
+                    view.Columns.Cast<DataColumn>().Where(column => column.ColumnName.StartsWith(INTERNAL_PREFIX)).ToList();
+                foreach (var dataColumn in toRemove) {
+                    view.Columns.Remove(dataColumn);
+                }
+                _sumWriter.WriteSumData(view);
+            }
+        }
+
+        /// <summary>
+        /// Writes the result of one run into the summary data container.
+        /// </summary>
+        [MethodImpl(MethodImplOptions.Synchronized)]
+        public virtual void Write(IModalDataContainer modData, int jobNr, int runNr, VectoRunData runData)
+        {
+            var row = Table.NewRow();
+            Table.Rows.Add(row);
+
+            row[SORT] = jobNr * 1000 + runNr;
+            row[JOB] = string.Format("{0}-{1}", jobNr, runNr); //ReplaceNotAllowedCharacters(current);
+            row[INPUTFILE] = ReplaceNotAllowedCharacters(runData.JobName);
+            row[CYCLE] = ReplaceNotAllowedCharacters(runData.Cycle.Name + Constants.FileExtensions.CycleFile);
+
+            row[STATUS] = modData.RunStatus;
+
+            var vehicleLoading = 0.SI<Kilogram>();
+            var cargoVolume = 0.SI<CubicMeter>();
+            var gearCount = 0u;
+            if (runData.Cycle.CycleType != CycleType.EngineOnly) {
+                WriteFullPowertrain(runData, row);
+
+                cargoVolume = runData.VehicleData.CargoVolume;
+                vehicleLoading = runData.VehicleData.Loading;
+                gearCount = (uint)runData.GearboxData.Gears.Count;
+            }
+
+            var totalTime = modData.Duration();
+            row[TIME] = totalTime;
+
+            var distance = modData.Distance();
+            if (distance != null) {
+                row[DISTANCE] = distance.ConvertToKiloMeter();
+            }
+
+            var speed = modData.Speed();
+            if (speed != null) {
+                row[SPEED] = speed.ConvertToKiloMeterPerHour();
+            }
+
+            row[ALTITUDE_DELTA] = modData.AltitudeDelta();
+
+            WriteFuelconsumptionEntries(modData, row, vehicleLoading, cargoVolume);
+
+            var kilogramPerMeter = modData.CO2PerMeter();
+            if (kilogramPerMeter != null) {
+                row[CO2_KM] = kilogramPerMeter.ConvertToGrammPerKiloMeter();
+                if (vehicleLoading != null && !vehicleLoading.IsEqual(0)) {
+                    row[CO2_TKM] = (kilogramPerMeter / vehicleLoading).ConvertToGrammPerTonKilometer();
+                }
+                if (cargoVolume > 0) {
+                    row[CO2_M3KM] = (kilogramPerMeter / cargoVolume).ConvertToGrammPerCubicMeterKiloMeter();
+                }
+            }
+
+            row[P_WHEEL_POS] = modData.PowerWheelPositive().ConvertToKiloWatt();
+            row[P_FCMAP_POS] = modData.TotalPowerEnginePositiveAverage().ConvertToKiloWatt();
+
+            WriteAuxiliaries(modData, row);
+            WriteWorkEntries(modData, row);
+            WritePerformanceEntries(modData, row);
+
+            row[ENGINE_FULL_LOAD_TIME_SHARE] = modData.EngineMaxLoadTimeShare();
+            row[COASTING_TIME_SHARE] = modData.CoastingTimeShare();
+            row[BRAKING_TIME_SHARE] = modData.BrakingTimeShare();
+
+            if (gearCount <= 0) {
+                return;
+            }
+
+            WriteGearshiftStats(modData, row, gearCount);
+        }
+
+        private static void WriteFuelconsumptionEntries(IModalDataContainer modData, DataRow row, Kilogram vehicleLoading,
+            CubicMeter cargoVolume)
+        {
+            row[FCMAP_H] = modData.FCMapPerSecond().ConvertToGrammPerHour();
+            var fcMapPerMeter = modData.FCMapPerMeter();
+            if (fcMapPerMeter != null) {
+                row[FCMAP_KM] = fcMapPerMeter.ConvertToGrammPerKiloMeter();
+            }
+
+            row[FCAUXC_H] = modData.FuelConsumptionAuxStartStopPerSecond().ConvertToGrammPerHour();
+
+            var fuelConsumptionAuxStartStopCorrected = modData.FuelConsumptionAuxStartStop();
+            row[FCAUXC_KM] = fuelConsumptionAuxStartStopCorrected.ConvertToGrammPerKiloMeter();
+            row[FCWHTCC_H] = modData.FuelConsumptionWHTCPerSecond().ConvertToGrammPerHour();
+
+            var fuelConsumptionWHTCCorrected = modData.FuelConsumptionWHTC();
+            row[FCWHTCC_KM] = fuelConsumptionWHTCCorrected.ConvertToGrammPerKiloMeter();
+            row[FCAAUX_H] = modData.FuelConsumptionAAUXPerSecond().ConvertToGrammPerHour();
+            var fuelConsumptionAaux = modData.FuelConsumptionAAUX();
+            row[FCAAUX_KM] = fuelConsumptionAaux.ConvertToGrammPerKiloMeter();
+
+            row[FCFINAL_H] = modData.FuelConsumptionFinalPerSecond().ConvertToGrammPerHour();
+            var fcfinal = modData.FuelConsumptionFinal();
+            row[FCFINAL_KM] = fcfinal.ConvertToGrammPerKiloMeter();
+
+            var fcFinal = modData.FuelConsumptionFinalVolumePerMeter();
+            row[FCFINAL_LITERPER100KM] = fcFinal.ConvertToLiterPer100Kilometer();
+            if (vehicleLoading != null && !vehicleLoading.IsEqual(0) && fcFinal != null) {
+                row[FCFINAL_LITERPER100TKM] = (fcFinal / vehicleLoading).ConvertToLiterPer100TonKiloMeter();
+            }
+            if (cargoVolume > 0 && fcFinal != null) {
+                row[FCFINAL_LiterPer100M3KM] = (fcFinal / cargoVolume).ConvertToLiterPerCubicMeter100KiloMeter();
+            }
+        }
+
+
+        private void WriteAuxiliaries(IModalDataContainer modData, DataRow row)
+        {
+            foreach (var aux in modData.Auxiliaries) {
+                string colName;
+                if (aux.Key == Constants.Auxiliaries.IDs.PTOConsumer || aux.Key == Constants.Auxiliaries.IDs.PTOTransmission) {
+                    colName = string.Format(E_FORMAT, aux.Key);
+                } else {
+                    colName = string.Format(E_AUX_FORMAT, aux.Key);
+                }
+
+                if (!Table.Columns.Contains(colName)) {
+                    var col = Table.Columns.Add(colName, typeof(ConvertedSI));
+                    // move the new column to correct position
+                    col.SetOrdinal(Table.Columns[E_AUX].Ordinal);
+                }
+
+                row[colName] = modData.AuxiliaryWork(aux.Value).ConvertToKiloWattHour();
+            }
+        }
+
+        private void WriteGearshiftStats(IModalDataContainer modData, DataRow row, uint gearCount)
+        {
+            row[NUM_GEARSHIFTS] = modData.GearshiftCount();
+            var timeSharePerGear = modData.TimeSharePerGear(gearCount);
+
+            for (uint i = 0; i <= gearCount; i++) {
+                var colName = string.Format(TIME_SHARE_PER_GEAR_FORMAT, i);
+                if (!Table.Columns.Contains(colName)) {
+                    Table.Columns.Add(colName, typeof(SI));
+                }
+                row[colName] = timeSharePerGear[i];
+            }
+        }
+
+        private void WritePerformanceEntries(IModalDataContainer modData, DataRow row)
+        {
+            row[ACC] = modData.AccelerationAverage();
+            row[ACC_POS] = modData.AccelerationsPositive();
+            row[ACC_NEG] = modData.AccelerationsNegative();
+            var accTimeShare = modData.AccelerationTimeShare();
+            row[ACC_TIMESHARE] = accTimeShare;
+            var decTimeShare = modData.DecelerationTimeShare();
+            row[DEC_TIMESHARE] = decTimeShare;
+            var cruiseTimeShare = modData.CruiseTimeShare();
+            row[CRUISE_TIMESHARE] = cruiseTimeShare;
+            var stopTimeShare = modData.StopTimeShare();
+            row[STOP_TIMESHARE] = stopTimeShare;
+
+            row[MAX_SPEED] = modData.MaxSpeed().AsKmph.SI<Scalar>();
+            row[MAX_ACCELERATION] = modData.MaxAcceleration();
+            row[MAX_DECELERATION] = modData.MaxDeceleration();
+            row[AVG_ENGINE_SPEED] = modData.AvgEngineSpeed().AsRPM.SI<Scalar>();
+            row[MAX_ENGINE_SPEED] = modData.MaxEngineSpeed().AsRPM.SI<Scalar>();
+            if (accTimeShare != null && decTimeShare != null && cruiseTimeShare != null) {
+                var shareSum = accTimeShare + decTimeShare + cruiseTimeShare + stopTimeShare;
+                if (!shareSum.IsEqual(100)) {
+                    Log.Error(
+                        "Sumfile Error: driving behavior timeshares must sum up to 100%: acc: {0}%, dec: {1}%, cruise: {2}%, stop: {3}%, sum: {4}%",
+                        accTimeShare.ToOutputFormat(1, null, false), decTimeShare.ToOutputFormat(1, null, false),
+                        cruiseTimeShare.ToOutputFormat(1, null, false), stopTimeShare.ToOutputFormat(1, null, false),
+                        shareSum.ToOutputFormat(1, null, false));
+                }
+            }
+        }
+
+        private static void WriteWorkEntries(IModalDataContainer modData, DataRow row)
+        {
+            row[E_FCMAP_POS] = modData.TotalEngineWorkPositive().ConvertToKiloWattHour();
+            row[E_FCMAP_NEG] = (-modData.TotalEngineWorkNegative()).ConvertToKiloWattHour();
+            row[E_POWERTRAIN_INERTIA] = modData.PowerAccelerations().ConvertToKiloWattHour();
+            row[E_AUX] = modData.WorkAuxiliaries().ConvertToKiloWattHour();
+            row[E_CLUTCH_LOSS] = modData.WorkClutch().ConvertToKiloWattHour();
+            row[E_TC_LOSS] = modData.WorkTorqueConverter().ConvertToKiloWattHour();
+            row[E_SHIFT_LOSS] = modData.WorkGearshift().ConvertToKiloWattHour();
+            row[E_GBX_LOSS] = modData.WorkGearbox().ConvertToKiloWattHour();
+            row[E_RET_LOSS] = modData.WorkRetarder().ConvertToKiloWattHour();
+            row[E_AXL_LOSS] = modData.WorkAxlegear().ConvertToKiloWattHour();
+            row[E_ANGLE_LOSS] = modData.WorkAngledrive().ConvertToKiloWattHour();
+            row[E_BRAKE] = modData.WorkTotalMechanicalBrake().ConvertToKiloWattHour();
+            row[E_VEHICLE_INERTIA] = modData.WorkVehicleInertia().ConvertToKiloWattHour();
+            row[E_AIR] = modData.WorkAirResistance().ConvertToKiloWattHour();
+            row[E_ROLL] = modData.WorkRollingResistance().ConvertToKiloWattHour();
+            row[E_GRAD] = modData.WorkRoadGradientResistance().ConvertToKiloWattHour();
+        }
+
+        private void WriteFullPowertrain(VectoRunData runData, DataRow row)
+        {
+            row[VEHICLE_MANUFACTURER] = runData.VehicleData.Manufacturer;
+            row[VIN_NUMBER] = runData.VehicleData.VIN;
+            row[VEHICLE_MODEL] = runData.VehicleData.ModelName;
+
+            row[HDV_CO2_VEHICLE_CLASS] = runData.VehicleData.VehicleClass.GetClassNumber();
+            row[CURB_MASS] = runData.VehicleData.CurbWeight;
+            row[LOADING] = runData.VehicleData.Loading;
+            row[CARGO_VOLUME] = runData.VehicleData.CargoVolume;
+
+            row[TOTAL_VEHICLE_MASS] = runData.VehicleData.TotalVehicleWeight;
+            row[ENGINE_MANUFACTURER] = runData.EngineData.Manufacturer;
+            row[ENGINE_MODEL] = runData.EngineData.ModelName;
+            row[ENGINE_FUEL_TYPE] = runData.EngineData.FuelType.GetLabel();
+            row[ENGINE_RATED_POWER] = runData.EngineData.RatedPowerDeclared != null && runData.EngineData.RatedPowerDeclared > 0
+                ? runData.EngineData.RatedPowerDeclared.ConvertToKiloWatt()
+                : runData.EngineData.FullLoadCurves[0].MaxPower.ConvertToKiloWatt();
+            row[ENGINE_IDLING_SPEED] = runData.EngineData.IdleSpeed.AsRPM.SI<Scalar>();
+            row[ENGINE_RATED_SPEED] = runData.EngineData.RatedSpeedDeclared != null && runData.EngineData.RatedSpeedDeclared > 0
+                ? runData.EngineData.RatedSpeedDeclared.AsRPM.SI<Scalar>()
+                : runData.EngineData.FullLoadCurves[0].RatedSpeed.AsRPM.SI<Scalar>();
+            row[ENGINE_DISPLACEMENT] = runData.EngineData.Displacement.ConvertToCubicCentiMeter();
+
+            row[ENGINE_WHTC_URBAN] = runData.EngineData.WHTCUrban;
+            row[ENGINE_WHTC_RURAL] = runData.EngineData.WHTCRural;
+            row[ENGINE_WHTC_MOTORWAY] = runData.EngineData.WHTCMotorway;
+            row[ENGINE_BF_COLD_HOT] = runData.EngineData.ColdHotCorrectionFactor;
+            row[ENGINE_CF_REG_PER] = runData.EngineData.CorrectionFactorRegPer;
+            row[ENGINE_ACTUAL_CORRECTION_FACTOR] = runData.EngineData.FuelConsumptionCorrectionFactor;
+
+            row[CD_x_A_DECLARED] = runData.AirdragData.DeclaredAirdragArea;
+            row[CD_x_A] = runData.AirdragData.CrossWindCorrectionCurve.AirDragArea;
+
+            row[ROLLING_RESISTANCE_COEFFICIENT_WO_TRAILER] =
+                runData.VehicleData.RollResistanceCoefficientWithoutTrailer;
+            row[ROLLING_RESISTANCE_COEFFICIENT_W_TRAILER] =
+                runData.VehicleData.TotalRollResistanceCoefficient;
+
+            row[R_DYN] = runData.VehicleData.DynamicTyreRadius;
+
+            row[NUM_AXLES_DRIVEN] = runData.VehicleData.AxleData.Count(x => x.AxleType == AxleType.VehicleDriven);
+            row[NUM_AXLES_NON_DRIVEN] = runData.VehicleData.AxleData.Count(x => x.AxleType == AxleType.VehicleNonDriven);
+            row[NUM_AXLES_TRAILER] = runData.VehicleData.AxleData.Count(x => x.AxleType == AxleType.Trailer);
+
+            row[GEARBOX_MANUFACTURER] = runData.GearboxData.Manufacturer;
+            row[GEARBOX_MODEL] = runData.GearboxData.ModelName;
+            row[GEARBOX_TYPE] = runData.GearboxData.Type;
+            WriteGearboxData(runData, row);
+
+            row[RETARDER_TYPE] = runData.Retarder.Type.GetLabel();
+            WriteRetarderData(runData, row);
+
+            WriteAngledriveData(runData, row);
+
+            row[AXLE_MANUFACTURER] = runData.AxleGearData.Manufacturer;
+            row[AXLE_MODEL] = runData.AxleGearData.ModelName;
+            row[AXLE_RATIO] = runData.AxleGearData.AxleGear.Ratio.SI<Scalar>();
+
+            WriteAuxTechnologies(runData, row);
+        }
+
+        private void WriteAuxTechnologies(VectoRunData runData, DataRow row)
+        {
+            foreach (var aux in runData.Aux) {
+                if (aux.ID == Constants.Auxiliaries.IDs.PTOConsumer || aux.ID == Constants.Auxiliaries.IDs.PTOTransmission) {
+                    continue;
+                }
+                var colName = string.Format(AUX_TECH_FORMAT, aux.ID);
+
+                if (!Table.Columns.Contains(colName)) {
+                    var col = Table.Columns.Add(colName, typeof(string));
+                    // move the new column to correct position
+                    col.SetOrdinal(Table.Columns[CARGO_VOLUME].Ordinal);
+                }
+
+                row[colName] = aux.Technology == null ? "" : string.Join("; ", aux.Technology);
+            }
+        }
+
+        private static void WriteAngledriveData(VectoRunData runData, DataRow row)
+        {
+            if (runData.AngledriveData != null) {
+                row[ANGLEDRIVE_MANUFACTURER] = runData.AngledriveData.Manufacturer;
+                row[ANGLEDRIVE_MODEL] = runData.AngledriveData.ModelName;
+                row[ANGLEDRIVE_RATIO] = runData.AngledriveData.Angledrive.Ratio;
+            } else {
+                row[ANGLEDRIVE_MANUFACTURER] = "n.a.";
+                row[ANGLEDRIVE_MODEL] = "n.a.";
+                row[ANGLEDRIVE_RATIO] = "n.a.";
+            }
+        }
+
+        private static void WriteRetarderData(VectoRunData runData, DataRow row)
+        {
+            if (runData.Retarder.Type.IsDedicatedComponent()) {
+                row[RETARDER_MANUFACTURER] = runData.Retarder.Manufacturer;
+                row[RETARDER_MODEL] = runData.Retarder.ModelName;
+            } else {
+                row[RETARDER_MANUFACTURER] = "n.a.";
+                row[RETARDER_MODEL] = "n.a.";
+            }
+        }
+
+        private static void WriteGearboxData(VectoRunData runData, DataRow row)
+        {
+            var hasGears = runData.GearboxData.Gears.Count > 0;
+            var first = runData.GearboxData.Gears.FirstOrDefault().Value;
+            var last = runData.GearboxData.Gears.LastOrDefault().Value;
+
+            if (runData.GearboxData.Type.AutomaticTransmission()) {
+                row[GEAR_RATIO_FIRST_GEAR] = hasGears
+                    ? (double.IsNaN(first.Ratio) ? first.TorqueConverterRatio.SI<Scalar>() : first.Ratio.SI<Scalar>())
+                    : 0.SI<Scalar>();
+                row[GEAR_RATIO_LAST_GEAR] = hasGears ? last.Ratio.SI<Scalar>() : 0.SI<Scalar>();
+                row[TORQUECONVERTER_MANUFACTURER] = runData.GearboxData.TorqueConverterData.Manufacturer;
+                row[TORQUECONVERTER_MODEL] = runData.GearboxData.TorqueConverterData.ModelName;
+            } else {
+                row[GEAR_RATIO_FIRST_GEAR] = hasGears ? first.Ratio.SI<Scalar>() : 0.SI<Scalar>();
+                row[GEAR_RATIO_LAST_GEAR] = hasGears ? last.Ratio.SI<Scalar>() : 0.SI<Scalar>();
+                row[TORQUECONVERTER_MANUFACTURER] = "n.a.";
+                row[TORQUECONVERTER_MODEL] = "n.a.";
+            }
+        }
+
+        private static string ReplaceNotAllowedCharacters(string text)
+        {
+            return text.Replace('#', '_').Replace(',', '_').Replace('\n', '_').Replace('\r', '_');
+        }
+
+        public void Dispose()
+        {
+            Dispose(true);
+            GC.SuppressFinalize(this);
+        }
+
+        protected void Dispose(bool disposing)
+        {
+            if (disposing) {
+                Table.Dispose();
+            }
+        }
+    }
 }
\ No newline at end of file
diff --git a/VectoCore/VectoCore/OutputData/XML/XMLDeclarationReport.cs b/VectoCore/VectoCore/OutputData/XML/XMLDeclarationReport.cs
index 197ab9a745ee8b6bc71faa8124c5773e34164dca..d42ec6f41c5e8f5cb06c01cf437cdbe94a2978b4 100644
--- a/VectoCore/VectoCore/OutputData/XML/XMLDeclarationReport.cs
+++ b/VectoCore/VectoCore/OutputData/XML/XMLDeclarationReport.cs
@@ -178,16 +178,12 @@ namespace TUGraz.VectoCore.OutputData.XML
                     new XAttribute(XMLNames.Report_Results_Unit_Attr, "g/km"),
                     //(result.FuelConsumptionTotal.ConvertTo().Gramm / result.Distance.ConvertTo().Kilo.Meter).Value()
                     //(result.FuelConsumptionTotal.ConvertTo(Unit.SI.Gramm) / result.Distance.ConvertTo(Unit.SI.Kilo.Meter)).Value()
-                    (result.FuelConsumptionTotal.ConvertToGramm() / result.Distance.ConvertToKiloMeter()).Value()
-                        .ToMinSignificantDigits(3, 1)),
+                    (result.FuelConsumptionTotal / result.Distance).ConvertToGrammPerKiloMeter().ToMinSignificantDigits(3, 1)),
                 new XElement(tns + XMLNames.Report_Results_FuelConsumption,
                     new XAttribute(XMLNames.Report_Results_Unit_Attr, "g/t-km"),
                     //(result.FuelConsumptionTotal.ConvertTo().Gramm / result.Distance.ConvertTo().Kilo.Meter /
                     //(result.FuelConsumptionTotal.ConvertTo(Unit.SI.Gramm) / result.Distance.ConvertTo(Unit.SI.Kilo.Meter) /
-                    (result.FuelConsumptionTotal.ConvertToGramm() / result.Distance.ConvertToKiloMeter() /
-                    //result.Payload.ConvertTo().Ton).Value().ToMinSignificantDigits(3, 1)),
-                    //result.Payload.ConvertTo(Unit.SI.Ton)).Value().ToMinSignificantDigits(3, 1)),
-                     result.Payload.ConvertToTon()).Value().ToMinSignificantDigits(3, 1)),
+                    (result.FuelConsumptionTotal / result.Distance / result.Payload).ConvertToGrammPerTonKilometer().ToMinSignificantDigits(3, 1)),
                 result.CargoVolume > 0
                     ? new XElement(tns + XMLNames.Report_Results_FuelConsumption,
                         new XAttribute(XMLNames.Report_Results_Unit_Attr, "g/m³-km"),
@@ -252,7 +248,7 @@ namespace TUGraz.VectoCore.OutputData.XML
             retVal.Add(new XElement(tns + XMLNames.Report_Results_CO2, new XAttribute(XMLNames.Report_Results_Unit_Attr, "g/km"),
                 //(result.CO2Total.ConvertTo().Gramm / result.Distance.ConvertTo().Kilo.Meter).Value().ToMinSignificantDigits(3, 1)));
                 //(result.CO2Total.ConvertTo(Unit.SI.Gramm) / result.Distance.ConvertTo(Unit.SI.Kilo.Meter)).Value().ToMinSignificantDigits(3, 1)));
-                (result.CO2Total.ConvertToGramm() / result.Distance.ConvertToKiloMeter()).Value().ToMinSignificantDigits(3, 1)));
+                (result.CO2Total.ConvertToGramm() / result.Distance.ConvertToKiloMeter()).ToMinSignificantDigits(3, 1)));
 
             retVal.Add(new XElement(tns + XMLNames.Report_Results_CO2,
                 new XAttribute(XMLNames.Report_Results_Unit_Attr, "g/t-km"),
@@ -262,7 +258,7 @@ namespace TUGraz.VectoCore.OutputData.XML
 
                 //result.Payload.ConvertTo().Ton).Value().ToMinSignificantDigits(3, 1)));
                  //((result.Payload.ConvertTo(Unit.SI.Ton)).Value().ToMinSignificantDigits(3, 1)));
-                 result.Payload.ConvertToTon()).Value().ToMinSignificantDigits(3, 1)));
+                 result.Payload.ConvertToTon()).ToMinSignificantDigits(3, 1)));
 
             if (result.CargoVolume > 0)
             {
diff --git a/VectoCore/VectoCoreTest/Models/SimulationComponentData/FuelConsumptionMapTest.cs b/VectoCore/VectoCoreTest/Models/SimulationComponentData/FuelConsumptionMapTest.cs
index 73c04eccdb578257cda57d88fab1cb39895b6be5..90bca5633e0bb23338c5594e13493acd4a6723d6 100644
--- a/VectoCore/VectoCoreTest/Models/SimulationComponentData/FuelConsumptionMapTest.cs
+++ b/VectoCore/VectoCoreTest/Models/SimulationComponentData/FuelConsumptionMapTest.cs
@@ -1,77 +1,76 @@
-/*
-* This file is part of VECTO.
-*
-* Copyright © 2012-2017 European Union
-*
-* Developed by Graz University of Technology,
-*              Institute of Internal Combustion Engines and Thermodynamics,
-*              Institute of Technical Informatics
-*
-* VECTO is licensed under the EUPL, Version 1.1 or - as soon they will be approved
-* by the European Commission - subsequent versions of the EUPL (the "Licence");
-* You may not use VECTO except in compliance with the Licence.
-* You may obtain a copy of the Licence at:
-*
-* https://joinup.ec.europa.eu/community/eupl/og_page/eupl
-*
-* Unless required by applicable law or agreed to in writing, VECTO
-* distributed under the Licence is distributed on an "AS IS" basis,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the Licence for the specific language governing permissions and
-* limitations under the Licence.
-*
-* Authors:
-*   Stefan Hausberger, hausberger@ivt.tugraz.at, IVT, Graz University of Technology
-*   Christian Kreiner, christian.kreiner@tugraz.at, ITI, Graz University of Technology
-*   Michael Krisper, michael.krisper@tugraz.at, ITI, Graz University of Technology
-*   Raphael Luz, luz@ivt.tugraz.at, IVT, Graz University of Technology
-*   Markus Quaritsch, markus.quaritsch@tugraz.at, IVT, Graz University of Technology
-*   Martin Rexeis, rexeis@ivt.tugraz.at, IVT, Graz University of Technology
-*/
-
-using System.Collections.Generic;
-using System.Globalization;
-using System.IO;
-using System.Linq;
-using TUGraz.VectoCommon.Utils;
-using TUGraz.VectoCore.Models.SimulationComponent.Data.Engine;
-using NUnit.Framework;
-
-namespace TUGraz.VectoCore.Tests.Models.SimulationComponentData
-{
-	[TestFixture]
-	public class FuelConsumptionMapTest
-	{
-		private const double Tolerance = 0.0001;
-
-		[TestCase]
-		public void TestFuelConsumption_FixedPoints()
-		{
-			var map = FuelConsumptionMapReader.ReadFromFile(@"TestData\Components\24t Coach.vmap");
-			var lines = File.ReadAllLines(@"TestData\Components\24t Coach.vmap").Skip(1).ToArray();
-			AssertMapValuesEqual(lines, map);
-		}
-
-		[TestCase]
-		public void TestFuelConsumption_InterpolatedPoints()
-		{
-			var map = FuelConsumptionMapReader.ReadFromFile(@"TestData\Components\24t Coach.vmap");
-			var lines = File.ReadAllLines(@"TestData\Components\24t CoachInterpolated.vmap").Skip(1).ToArray();
-			AssertMapValuesEqual(lines, map);
-		}
-
-		private static void AssertMapValuesEqual(IReadOnlyList<string> lines, FuelConsumptionMap map)
-		{
+/*
+* This file is part of VECTO.
+*
+* Copyright © 2012-2017 European Union
+*
+* Developed by Graz University of Technology,
+*              Institute of Internal Combustion Engines and Thermodynamics,
+*              Institute of Technical Informatics
+*
+* VECTO is licensed under the EUPL, Version 1.1 or - as soon they will be approved
+* by the European Commission - subsequent versions of the EUPL (the "Licence");
+* You may not use VECTO except in compliance with the Licence.
+* You may obtain a copy of the Licence at:
+*
+* https://joinup.ec.europa.eu/community/eupl/og_page/eupl
+*
+* Unless required by applicable law or agreed to in writing, VECTO
+* distributed under the Licence is distributed on an "AS IS" basis,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the Licence for the specific language governing permissions and
+* limitations under the Licence.
+*
+* Authors:
+*   Stefan Hausberger, hausberger@ivt.tugraz.at, IVT, Graz University of Technology
+*   Christian Kreiner, christian.kreiner@tugraz.at, ITI, Graz University of Technology
+*   Michael Krisper, michael.krisper@tugraz.at, ITI, Graz University of Technology
+*   Raphael Luz, luz@ivt.tugraz.at, IVT, Graz University of Technology
+*   Markus Quaritsch, markus.quaritsch@tugraz.at, IVT, Graz University of Technology
+*   Martin Rexeis, rexeis@ivt.tugraz.at, IVT, Graz University of Technology
+*/
+
+using System.Collections.Generic;
+using System.Globalization;
+using System.IO;
+using System.Linq;
+using TUGraz.VectoCommon.Utils;
+using TUGraz.VectoCore.Models.SimulationComponent.Data.Engine;
+using NUnit.Framework;
+
+namespace TUGraz.VectoCore.Tests.Models.SimulationComponentData
+{
+    [TestFixture]
+    public class FuelConsumptionMapTest
+    {
+        private const double Tolerance = 0.0001;
+
+        [TestCase]
+        public void TestFuelConsumption_FixedPoints()
+        {
+            var map = FuelConsumptionMapReader.ReadFromFile(@"TestData\Components\24t Coach.vmap");
+            var lines = File.ReadAllLines(@"TestData\Components\24t Coach.vmap").Skip(1).ToArray();
+            AssertMapValuesEqual(lines, map);
+        }
+
+        [TestCase]
+        public void TestFuelConsumption_InterpolatedPoints()
+        {
+            var map = FuelConsumptionMapReader.ReadFromFile(@"TestData\Components\24t Coach.vmap");
+            var lines = File.ReadAllLines(@"TestData\Components\24t CoachInterpolated.vmap").Skip(1).ToArray();
+            AssertMapValuesEqual(lines, map);
+        }
+
+        private static void AssertMapValuesEqual(IReadOnlyList<string> lines, FuelConsumptionMap map)
+        {
 			for (var i = 1; i < lines.Count; i++) {
-				var entry = lines[i].Split(',').Select(x => double.Parse(x, CultureInfo.InvariantCulture)).ToArray();
-
-                //Assert.AreEqual(entry[2].SI().Gramm.Per.Hour.ConvertTo().Kilo.Gramm.Per.Second.Value(),
-                //	map.GetFuelConsumption(entry[1].SI<NewtonMeter>(), entry[0].RPMtoRad(), true).Value.Value(), Tolerance);
-                //Assert.AreEqual(entry[2].SI(Unit.SI.Gramm.Per.Hour).ConvertTo(Unit.SI.Kilo.Gramm.Per.Second).Value(),
-                //    map.GetFuelConsumption(entry[1].SI<NewtonMeter>(), entry[0].RPMtoRad(), true).Value.Value(), Tolerance);
-                Assert.AreEqual(entry[2].SI(Unit.SI.Gramm.Per.Hour).ConvertToKiloGrammPerSecond().Value(),
-                    map.GetFuelConsumption(entry[1].SI<NewtonMeter>(), entry[0].RPMtoRad(), true).Value.Value(), Tolerance);
-            }
-		}
-	}
+                var entry = lines[i].Split(',').Select(x => double.Parse(x, CultureInfo.InvariantCulture)).ToArray();
+
+                //Assert.AreEqual(entry[2].SI().Gramm.Per.Hour.ConvertTo().Kilo.Gramm.Per.Second.Value(),
+                //	map.GetFuelConsumption(entry[1].SI<NewtonMeter>(), entry[0].RPMtoRad(), true).Value.Value(), Tolerance);
+                //Assert.AreEqual(entry[2].SI(Unit.SI.Gramm.Per.Hour).ConvertTo(Unit.SI.Kilo.Gramm.Per.Second).Value(),
+                //    map.GetFuelConsumption(entry[1].SI<NewtonMeter>(), entry[0].RPMtoRad(), true).Value.Value(), Tolerance);
+                Assert.AreEqual(entry[2].SI(Unit.SI.Gramm.Per.Hour).Value(), map.GetFuelConsumption(entry[1].SI<NewtonMeter>(), entry[0].RPMtoRad(), true).Value.Value(), Tolerance);
+            }
+        }
+    }
 }
\ No newline at end of file
diff --git a/VectoCore/VectoCoreTest/Reports/SumWriterTest.cs b/VectoCore/VectoCoreTest/Reports/SumWriterTest.cs
index 9915ecd2cbc2885d09689b49cb88ca56ecb56885..4ca4427bf713664ab947e5537bf3d27786452e04 100644
--- a/VectoCore/VectoCoreTest/Reports/SumWriterTest.cs
+++ b/VectoCore/VectoCoreTest/Reports/SumWriterTest.cs
@@ -191,16 +191,14 @@ namespace TUGraz.VectoCore.Tests.Reports
             //	((SI)sumRow[SummaryDataContainer.ENGINE_RATED_POWER]).Value());
             //Assert.AreEqual((dataProvider.EngineInputData.RatedPowerDeclared.ConvertTo(Unit.SI.Kilo.Watt).Value()),
             //    ((SI)sumRow[SummaryDataContainer.ENGINE_RATED_POWER]).Value());
-            Assert.AreEqual((dataProvider.EngineInputData.RatedPowerDeclared.ConvertToKiloWatt().Value()),
-                ((SI)sumRow[SummaryDataContainer.ENGINE_RATED_POWER]).Value());
+            Assert.AreEqual(dataProvider.EngineInputData.RatedPowerDeclared.ConvertToKiloWatt(),((SI)sumRow[SummaryDataContainer.ENGINE_RATED_POWER]).Value());
             Assert.AreEqual(dataProvider.EngineInputData.RatedSpeedDeclared.AsRPM,
 				((SI)sumRow[SummaryDataContainer.ENGINE_RATED_SPEED]).Value());
             //Assert.AreEqual(dataProvider.EngineInputData.Displacement.ConvertTo().Cubic.Centi.Meter.Value(),
             //	((SI)sumRow[SummaryDataContainer.ENGINE_DISPLACEMENT]).Value());
             //Assert.AreEqual(dataProvider.EngineInputData.Displacement.ConvertTo(Unit.SI.Cubic.Centi.Meter).Value(),
             //    ((SI)sumRow[SummaryDataContainer.ENGINE_DISPLACEMENT]).Value());
-            Assert.AreEqual(dataProvider.EngineInputData.Displacement.ConvertToCubicCentiMeter().Value(),
-                ((SI)sumRow[SummaryDataContainer.ENGINE_DISPLACEMENT]).Value());
+            Assert.AreEqual(dataProvider.EngineInputData.Displacement.ConvertToCubicCentiMeter(),((SI)sumRow[SummaryDataContainer.ENGINE_DISPLACEMENT]).Value());
             Assert.AreEqual(dataProvider.GearboxInputData.Manufacturer, sumRow[SummaryDataContainer.GEARBOX_MANUFACTURER]);
 			Assert.AreEqual(dataProvider.GearboxInputData.Model, sumRow[SummaryDataContainer.GEARBOX_MODEL]);
 			Assert.AreEqual(dataProvider.AxleGearInputData.Manufacturer, sumRow[SummaryDataContainer.AXLE_MANUFACTURER]);
diff --git a/VectoCore/VectoCoreTest/Utils/DoubleExtensionMethodTest.cs b/VectoCore/VectoCoreTest/Utils/DoubleExtensionMethodTest.cs
index e32f92d9889a7cfc00d1cc996af90fbcb21d37a1..b6244b31720b281701eb781b541ff5b801108713 100644
--- a/VectoCore/VectoCoreTest/Utils/DoubleExtensionMethodTest.cs
+++ b/VectoCore/VectoCoreTest/Utils/DoubleExtensionMethodTest.cs
@@ -1,134 +1,130 @@
-/*
-* This file is part of VECTO.
-*
-* Copyright © 2012-2017 European Union
-*
-* Developed by Graz University of Technology,
-*              Institute of Internal Combustion Engines and Thermodynamics,
-*              Institute of Technical Informatics
-*
-* VECTO is licensed under the EUPL, Version 1.1 or - as soon they will be approved
-* by the European Commission - subsequent versions of the EUPL (the "Licence");
-* You may not use VECTO except in compliance with the Licence.
-* You may obtain a copy of the Licence at:
-*
-* https://joinup.ec.europa.eu/community/eupl/og_page/eupl
-*
-* Unless required by applicable law or agreed to in writing, VECTO
-* distributed under the Licence is distributed on an "AS IS" basis,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the Licence for the specific language governing permissions and
-* limitations under the Licence.
-*
-* Authors:
-*   Stefan Hausberger, hausberger@ivt.tugraz.at, IVT, Graz University of Technology
-*   Christian Kreiner, christian.kreiner@tugraz.at, ITI, Graz University of Technology
-*   Michael Krisper, michael.krisper@tugraz.at, ITI, Graz University of Technology
-*   Raphael Luz, luz@ivt.tugraz.at, IVT, Graz University of Technology
-*   Markus Quaritsch, markus.quaritsch@tugraz.at, IVT, Graz University of Technology
-*   Martin Rexeis, rexeis@ivt.tugraz.at, IVT, Graz University of Technology
-*/
-
-using System;
-using TUGraz.VectoCommon.Utils;
+/*
+* This file is part of VECTO.
+*
+* Copyright © 2012-2017 European Union
+*
+* Developed by Graz University of Technology,
+*              Institute of Internal Combustion Engines and Thermodynamics,
+*              Institute of Technical Informatics
+*
+* VECTO is licensed under the EUPL, Version 1.1 or - as soon they will be approved
+* by the European Commission - subsequent versions of the EUPL (the "Licence");
+* You may not use VECTO except in compliance with the Licence.
+* You may obtain a copy of the Licence at:
+*
+* https://joinup.ec.europa.eu/community/eupl/og_page/eupl
+*
+* Unless required by applicable law or agreed to in writing, VECTO
+* distributed under the Licence is distributed on an "AS IS" basis,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the Licence for the specific language governing permissions and
+* limitations under the Licence.
+*
+* Authors:
+*   Stefan Hausberger, hausberger@ivt.tugraz.at, IVT, Graz University of Technology
+*   Christian Kreiner, christian.kreiner@tugraz.at, ITI, Graz University of Technology
+*   Michael Krisper, michael.krisper@tugraz.at, ITI, Graz University of Technology
+*   Raphael Luz, luz@ivt.tugraz.at, IVT, Graz University of Technology
+*   Markus Quaritsch, markus.quaritsch@tugraz.at, IVT, Graz University of Technology
+*   Martin Rexeis, rexeis@ivt.tugraz.at, IVT, Graz University of Technology
+*/
+
+using System;
+using TUGraz.VectoCommon.Utils;
 using NUnit.Framework;
 
-namespace TUGraz.VectoCore.Tests.Utils
-{
-	[TestFixture]
-	public class DoubleExtensionMethodTest
-	{
-		[TestCase]
-		public void DoubleExtensions_SI()
-		{
-			var val = 600.RPMtoRad();
-			Assert.AreEqual(600 / 60 * 2 * Math.PI, val.Value());
-
+namespace TUGraz.VectoCore.Tests.Utils
+{
+	[TestFixture]
+	public class DoubleExtensionMethodTest
+	{
+		[TestCase]
+		public void DoubleExtensions_SI()
+		{
+			var val = 600.RPMtoRad();
+			Assert.AreEqual(600 / 60 * 2 * Math.PI, val.Value());
+
 			Assert.IsTrue(0.SI<PerSecond>().HasEqualUnit(val));
 
-            //var val2 = 1200.SI().Rounds.Per.Minute.ConvertTo().Radian.Per.Second.Cast<PerSecond>();
-            //var val2 = 1200.SI(Unit.SI.Rounds.Per.Minute).ConvertTo(Unit.SI.Radian.Per.Second).Cast<PerSecond>();
-            var val2 = 1200.SI(Unit.SI.Rounds.Per.Minute).ConvertToRadianPerSecond().Cast<PerSecond>();
+            var val2 = 1200.SI(Unit.SI.Rounds.Per.Minute).Cast<PerSecond>();
 
-            val = val * 2;
-			Assert.AreEqual(val, val2);
-
-			val2 = val2 / 2;
-			val = val / 2;
+            val = val * 2;
+			Assert.AreEqual(val, val2);
+
+			val2 = val2 / 2;
+			val = val / 2;
 			Assert.AreEqual(val, val2);
-            //Assert.AreEqual(600.SI().Rounds.Per.Minute.Cast<PerSecond>(), val2);
 		    Assert.AreEqual(600.SI(Unit.SI.Rounds.Per.Minute).Cast<PerSecond>(), val2);
-            //Assert.AreEqual(600.SI().Rounds.Per.Minute.Cast<PerSecond>().Value(), val2.Value());
 		    Assert.AreEqual(600.SI(Unit.SI.Rounds.Per.Minute).Cast<PerSecond>().Value(), val2.Value());
-        }
-
-		[TestCase]
-		public void DoubleExtension_ComparisonOperators()
-		{
-			Assert.IsTrue(0.0.IsEqual(0.0));
-			Assert.IsTrue(1.0.IsGreater(0.0));
-			Assert.IsTrue(1.0.IsGreaterOrEqual(1.0));
-			Assert.IsTrue(1.0.IsPositive());
-			Assert.IsTrue(0.0.IsSmaller(1.0));
-			Assert.IsTrue(1.0.IsSmallerOrEqual(1.0));
-
-			const double inTolerance = 1e-7;
-			Assert.IsTrue(0.0.IsEqual(inTolerance));
-			Assert.IsTrue(inTolerance.IsEqual(0.0));
-			Assert.IsTrue(0.0.IsEqual(-inTolerance));
-			Assert.IsTrue((-inTolerance).IsEqual(0.0));
-
-			Assert.IsFalse(0.0.IsEqual(0.1));
-			Assert.IsFalse(0.1.IsEqual(0.0));
-			Assert.IsFalse(0.0.IsEqual(-0.1));
-			Assert.IsFalse((-0.1).IsEqual(0.0));
-
-			Assert.IsTrue(1.002.IsGreater(1.0));
-			Assert.IsTrue(1.001.IsGreater(1.0));
-			Assert.IsFalse(1.0.IsGreater(1.0));
-			Assert.IsFalse(0.999.IsGreater(1.0));
-
-			Assert.IsTrue(1.001.IsGreaterOrEqual(1.0));
-			Assert.IsFalse(0.999.IsGreaterOrEqual(1.0));
-			Assert.IsFalse(0.998.IsGreaterOrEqual(1.0));
-
-			Assert.IsTrue(0.001.IsPositive());
-			Assert.IsTrue(0.0.IsPositive());
-			Assert.IsTrue((-inTolerance).IsPositive());
-			Assert.IsFalse((-0.001).IsPositive());
-			Assert.IsFalse((-0.002).IsPositive());
-
-			Assert.IsTrue(0.998.IsSmaller(1.0));
-			Assert.IsTrue(0.999.IsSmaller(1.0));
-			Assert.IsFalse(1.0.IsSmaller(1.0));
-			Assert.IsFalse(1.0011.IsSmaller(1.0));
-
-			Assert.IsTrue((1 + inTolerance).IsSmallerOrEqual(1.0));
-			Assert.IsFalse(1.001.IsSmallerOrEqual(1.0));
-			Assert.IsTrue(0.999.IsSmallerOrEqual(1.0));
-			Assert.IsTrue(0.998.IsSmallerOrEqual(1.0));
-		}
-
-		[TestCase]
-		public void TestStringFormatting()
-		{
-			Assert.AreEqual("0.452", 0.452345.ToMinSignificantDigits(3, 1));
-			Assert.AreEqual("4.52", 4.52345.ToMinSignificantDigits(3, 1));
-			Assert.AreEqual("45.2", 45.2345.ToMinSignificantDigits(3, 1));
-
-			Assert.AreEqual("0.0452", 0.0452345.ToMinSignificantDigits(3, 1));
-			Assert.AreEqual("0.00452", 0.00452345.ToMinSignificantDigits(3, 1));
-
-
-			Assert.AreEqual("-0.452", (-0.452345).ToMinSignificantDigits(3, 1));
-			Assert.AreEqual("-4.52", (-4.52345).ToMinSignificantDigits(3, 1));
-			Assert.AreEqual("-45.2", (-45.2345).ToMinSignificantDigits(3, 1));
-
-			Assert.AreEqual("-0.0452", (-0.0452345).ToMinSignificantDigits(3, 1));
-			Assert.AreEqual("-0.00452", (-0.00452345).ToMinSignificantDigits(3, 1));
-
-			Assert.AreEqual("0.0", 0.0.ToMinSignificantDigits(3, 1));
-			//Assert.AreEqual("45.2", 45.2345.ToMinSignificantDigits(3, 1));
-		}
-	}
+        }
+
+		[TestCase]
+		public void DoubleExtension_ComparisonOperators()
+		{
+			Assert.IsTrue(0.0.IsEqual(0.0));
+			Assert.IsTrue(1.0.IsGreater(0.0));
+			Assert.IsTrue(1.0.IsGreaterOrEqual(1.0));
+			Assert.IsTrue(1.0.IsPositive());
+			Assert.IsTrue(0.0.IsSmaller(1.0));
+			Assert.IsTrue(1.0.IsSmallerOrEqual(1.0));
+
+			const double inTolerance = 1e-7;
+			Assert.IsTrue(0.0.IsEqual(inTolerance));
+			Assert.IsTrue(inTolerance.IsEqual(0.0));
+			Assert.IsTrue(0.0.IsEqual(-inTolerance));
+			Assert.IsTrue((-inTolerance).IsEqual(0.0));
+
+			Assert.IsFalse(0.0.IsEqual(0.1));
+			Assert.IsFalse(0.1.IsEqual(0.0));
+			Assert.IsFalse(0.0.IsEqual(-0.1));
+			Assert.IsFalse((-0.1).IsEqual(0.0));
+
+			Assert.IsTrue(1.002.IsGreater(1.0));
+			Assert.IsTrue(1.001.IsGreater(1.0));
+			Assert.IsFalse(1.0.IsGreater(1.0));
+			Assert.IsFalse(0.999.IsGreater(1.0));
+
+			Assert.IsTrue(1.001.IsGreaterOrEqual(1.0));
+			Assert.IsFalse(0.999.IsGreaterOrEqual(1.0));
+			Assert.IsFalse(0.998.IsGreaterOrEqual(1.0));
+
+			Assert.IsTrue(0.001.IsPositive());
+			Assert.IsTrue(0.0.IsPositive());
+			Assert.IsTrue((-inTolerance).IsPositive());
+			Assert.IsFalse((-0.001).IsPositive());
+			Assert.IsFalse((-0.002).IsPositive());
+
+			Assert.IsTrue(0.998.IsSmaller(1.0));
+			Assert.IsTrue(0.999.IsSmaller(1.0));
+			Assert.IsFalse(1.0.IsSmaller(1.0));
+			Assert.IsFalse(1.0011.IsSmaller(1.0));
+
+			Assert.IsTrue((1 + inTolerance).IsSmallerOrEqual(1.0));
+			Assert.IsFalse(1.001.IsSmallerOrEqual(1.0));
+			Assert.IsTrue(0.999.IsSmallerOrEqual(1.0));
+			Assert.IsTrue(0.998.IsSmallerOrEqual(1.0));
+		}
+
+		[TestCase]
+		public void TestStringFormatting()
+		{
+			Assert.AreEqual("0.452", 0.452345.ToMinSignificantDigits(3, 1));
+			Assert.AreEqual("4.52", 4.52345.ToMinSignificantDigits(3, 1));
+			Assert.AreEqual("45.2", 45.2345.ToMinSignificantDigits(3, 1));
+
+			Assert.AreEqual("0.0452", 0.0452345.ToMinSignificantDigits(3, 1));
+			Assert.AreEqual("0.00452", 0.00452345.ToMinSignificantDigits(3, 1));
+
+
+			Assert.AreEqual("-0.452", (-0.452345).ToMinSignificantDigits(3, 1));
+			Assert.AreEqual("-4.52", (-4.52345).ToMinSignificantDigits(3, 1));
+			Assert.AreEqual("-45.2", (-45.2345).ToMinSignificantDigits(3, 1));
+
+			Assert.AreEqual("-0.0452", (-0.0452345).ToMinSignificantDigits(3, 1));
+			Assert.AreEqual("-0.00452", (-0.00452345).ToMinSignificantDigits(3, 1));
+
+			Assert.AreEqual("0.0", 0.0.ToMinSignificantDigits(3, 1));
+			//Assert.AreEqual("45.2", 45.2345.ToMinSignificantDigits(3, 1));
+		}
+	}
 }
\ No newline at end of file
diff --git a/VectoCore/VectoCoreTest/Utils/SITest.cs b/VectoCore/VectoCoreTest/Utils/SITest.cs
index 730953293349796e15fc445f25e8a8eadfbd6d18..f5a1661f4e1359854b8da29082121bbce95796e2 100644
--- a/VectoCore/VectoCoreTest/Utils/SITest.cs
+++ b/VectoCore/VectoCoreTest/Utils/SITest.cs
@@ -690,17 +690,17 @@ namespace TUGraz.VectoCore.Tests.Utils
 
             //var val2 = 7.SI(Unit.SI.Cubic.Dezi.Meter).ConvertTo(Unit.SI.Cubic.Dezi.Meter);
             var val2 = 7.SI(Unit.SI.Cubic.Dezi.Meter).ConvertToCubicDeziMeter();
-            AssertHelper.AreRelativeEqual(0.007, val2.Value());
+            AssertHelper.AreRelativeEqual(0.007, val2);
 
 
 
             //var val3 = 5.SI(Unit.SI.Cubic.Dezi.Meter).ConvertTo(Unit.SI.Cubic.Centi.Meter);
             var val3 = 5.SI(Unit.SI.Cubic.Dezi.Meter).ConvertToCubicCentiMeter();
-            AssertHelper.AreRelativeEqual(0.005, val3.Value()); // 5000 cm^3
+            AssertHelper.AreRelativeEqual(0.005, val3); // 5000 cm^3
 
             //var val4 = 5.SI(Unit.SI.Cubic.Centi.Meter).ConvertTo(Unit.SI.Cubic.Dezi.Meter);
             var val4 = 5.SI(Unit.SI.Cubic.Centi.Meter).ConvertToCubicDeziMeter();
-            AssertHelper.AreRelativeEqual(0.000005, val4.Value()); // 0.005 dm^3
+            AssertHelper.AreRelativeEqual(0.000005, val4); // 0.005 dm^3
 
 
             var uni1 = Unit.SI.Kilo.Meter.Per.Hour;
diff --git a/VectoCore/VectoCoreTest/XML/XMLDeclarationInputTest.cs b/VectoCore/VectoCoreTest/XML/XMLDeclarationInputTest.cs
index 752b50292d63bd9a55811ca75e0b29a38b6907ed..138378260ee4c38db37e88bba69ad7a8329b7d0b 100644
--- a/VectoCore/VectoCoreTest/XML/XMLDeclarationInputTest.cs
+++ b/VectoCore/VectoCoreTest/XML/XMLDeclarationInputTest.cs
@@ -89,8 +89,7 @@ namespace TUGraz.VectoCore.Tests.XML
             //	fcMap.GetFuelConsumption(0.SI<NewtonMeter>(), 560.RPMtoRad()).Value.Value());
             //Assert.AreEqual(1256.SI(Unit.SI.Gramm.Per.Hour).ConvertTo(Unit.SI.Kilo.Gramm.Per.Second).Value(),
             //	fcMap.GetFuelConsumption(0.SI<NewtonMeter>(), 560.RPMtoRad()).Value.Value());
-            Assert.AreEqual(1256.SI(Unit.SI.Gramm.Per.Hour).ConvertToKiloGrammPerSecond().Value(),
-                fcMap.GetFuelConsumption(0.SI<NewtonMeter>(), 560.RPMtoRad()).Value.Value());
+            Assert.AreEqual(1256.SI(Unit.SI.Gramm.Per.Hour).Value(),fcMap.GetFuelConsumption(0.SI<NewtonMeter>(), 560.RPMtoRad()).Value.Value());
 
             var fldTable = engineDataProvider.FullLoadCurve;
 			Assert.AreEqual(10, fldTable.Rows.Count);
diff --git a/VectoCore/VectoCoreTest/XML/XMLEngineeringInputRefTest.cs b/VectoCore/VectoCoreTest/XML/XMLEngineeringInputRefTest.cs
index 61019ce23f4edea893efc8d907469e78c76a6249..d6b337590d3704ec33c46aba8abc877b14342e3c 100644
--- a/VectoCore/VectoCoreTest/XML/XMLEngineeringInputRefTest.cs
+++ b/VectoCore/VectoCoreTest/XML/XMLEngineeringInputRefTest.cs
@@ -1,327 +1,326 @@
-/*
-* This file is part of VECTO.
-*
-* Copyright © 2012-2017 European Union
-*
-* Developed by Graz University of Technology,
-*              Institute of Internal Combustion Engines and Thermodynamics,
-*              Institute of Technical Informatics
-*
-* VECTO is licensed under the EUPL, Version 1.1 or - as soon they will be approved
-* by the European Commission - subsequent versions of the EUPL (the "Licence");
-* You may not use VECTO except in compliance with the Licence.
-* You may obtain a copy of the Licence at:
-*
-* https://joinup.ec.europa.eu/community/eupl/og_page/eupl
-*
-* Unless required by applicable law or agreed to in writing, VECTO
-* distributed under the Licence is distributed on an "AS IS" basis,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the Licence for the specific language governing permissions and
-* limitations under the Licence.
-*
-* Authors:
-*   Stefan Hausberger, hausberger@ivt.tugraz.at, IVT, Graz University of Technology
-*   Christian Kreiner, christian.kreiner@tugraz.at, ITI, Graz University of Technology
-*   Michael Krisper, michael.krisper@tugraz.at, ITI, Graz University of Technology
-*   Raphael Luz, luz@ivt.tugraz.at, IVT, Graz University of Technology
-*   Markus Quaritsch, markus.quaritsch@tugraz.at, IVT, Graz University of Technology
-*   Martin Rexeis, rexeis@ivt.tugraz.at, IVT, Graz University of Technology
-*/
-
-using System.IO;
-using System.Linq;
-using TUGraz.VectoCommon.Exceptions;
-using TUGraz.VectoCommon.Models;
-using TUGraz.VectoCommon.Utils;
-using TUGraz.VectoCore.InputData.FileIO.XML.Engineering;
-using TUGraz.VectoCore.InputData.Reader;
-using TUGraz.VectoCore.InputData.Reader.ComponentData;
-using TUGraz.VectoCore.Models.Simulation.Impl;
-using TUGraz.VectoCore.Models.SimulationComponent.Data.Engine;
-using TUGraz.VectoCore.OutputData;
-using TUGraz.VectoCore.OutputData.FileIO;
-using TUGraz.VectoCore.Tests.Utils;
-using TUGraz.VectoCore.Utils;
+/*
+* This file is part of VECTO.
+*
+* Copyright © 2012-2017 European Union
+*
+* Developed by Graz University of Technology,
+*              Institute of Internal Combustion Engines and Thermodynamics,
+*              Institute of Technical Informatics
+*
+* VECTO is licensed under the EUPL, Version 1.1 or - as soon they will be approved
+* by the European Commission - subsequent versions of the EUPL (the "Licence");
+* You may not use VECTO except in compliance with the Licence.
+* You may obtain a copy of the Licence at:
+*
+* https://joinup.ec.europa.eu/community/eupl/og_page/eupl
+*
+* Unless required by applicable law or agreed to in writing, VECTO
+* distributed under the Licence is distributed on an "AS IS" basis,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the Licence for the specific language governing permissions and
+* limitations under the Licence.
+*
+* Authors:
+*   Stefan Hausberger, hausberger@ivt.tugraz.at, IVT, Graz University of Technology
+*   Christian Kreiner, christian.kreiner@tugraz.at, ITI, Graz University of Technology
+*   Michael Krisper, michael.krisper@tugraz.at, ITI, Graz University of Technology
+*   Raphael Luz, luz@ivt.tugraz.at, IVT, Graz University of Technology
+*   Markus Quaritsch, markus.quaritsch@tugraz.at, IVT, Graz University of Technology
+*   Martin Rexeis, rexeis@ivt.tugraz.at, IVT, Graz University of Technology
+*/
+
+using System.IO;
+using System.Linq;
+using TUGraz.VectoCommon.Exceptions;
+using TUGraz.VectoCommon.Models;
+using TUGraz.VectoCommon.Utils;
+using TUGraz.VectoCore.InputData.FileIO.XML.Engineering;
+using TUGraz.VectoCore.InputData.Reader;
+using TUGraz.VectoCore.InputData.Reader.ComponentData;
+using TUGraz.VectoCore.Models.Simulation.Impl;
+using TUGraz.VectoCore.Models.SimulationComponent.Data.Engine;
+using TUGraz.VectoCore.OutputData;
+using TUGraz.VectoCore.OutputData.FileIO;
+using TUGraz.VectoCore.Tests.Utils;
+using TUGraz.VectoCore.Utils;
 using NUnit.Framework;
 
-namespace TUGraz.VectoCore.Tests.XML
-{
-	[TestFixture]
-	public class XMLEngineeringInputRefTest
-	{
-		public const string EngineeringSampleFile = "TestData/XML/XMLReaderEngineering/engineering_job-sample_ref.xml";
-
-		[TestCase]
-		public void TestXMLInputEngineeringReferencedFileAsStream()
-		{
-			AssertHelper.Exception<VectoException>(() => {
-				var reader = File.OpenRead(EngineeringSampleFile);
-				var foo = new XMLEngineeringInputDataProvider(reader, true);
-			});
-		}
-
-		[TestCase]
-		public void TestXMLInputEngReferencedFile()
-		{
-			var inputDataProvider = new XMLEngineeringInputDataProvider(EngineeringSampleFile, true);
-
-			var engineDataProvider = inputDataProvider.EngineInputData;
-
-			Assert.IsFalse(engineDataProvider.SavedInDeclarationMode);
-
-			Assert.AreEqual("Generic 40t Long Haul Truck Engine", engineDataProvider.Model);
-			Assert.AreEqual(0.012730, engineDataProvider.Displacement.Value());
-			Assert.AreEqual(0.77, engineDataProvider.Inertia.Value());
-
-			AssertHelper.Exception<VectoException>(() => { var tmp = engineDataProvider.WHTCMotorway; });
-			AssertHelper.Exception<VectoException>(() => { var tmp = engineDataProvider.WHTCRural; });
-			AssertHelper.Exception<VectoException>(() => { var tmp = engineDataProvider.WHTCUrban; });
-
-			var fcMapTable = engineDataProvider.FuelConsumptionMap;
-			Assert.AreEqual(112, fcMapTable.Rows.Count);
-			Assert.AreEqual("engine speed", fcMapTable.Columns[0].Caption);
-			Assert.AreEqual("torque", fcMapTable.Columns[1].Caption);
-			Assert.AreEqual("fuel consumption", fcMapTable.Columns[2].Caption);
-
-			Assert.AreEqual("560", fcMapTable.Rows[0][0]);
-			var fcMap = FuelConsumptionMapReader.Create(fcMapTable);
+namespace TUGraz.VectoCore.Tests.XML
+{
+    [TestFixture]
+    public class XMLEngineeringInputRefTest
+    {
+        public const string EngineeringSampleFile = "TestData/XML/XMLReaderEngineering/engineering_job-sample_ref.xml";
+
+        [TestCase]
+        public void TestXMLInputEngineeringReferencedFileAsStream()
+        {
+			AssertHelper.Exception<VectoException>(() => {
+                var reader = File.OpenRead(EngineeringSampleFile);
+                var foo = new XMLEngineeringInputDataProvider(reader, true);
+            });
+        }
+
+        [TestCase]
+        public void TestXMLInputEngReferencedFile()
+        {
+            var inputDataProvider = new XMLEngineeringInputDataProvider(EngineeringSampleFile, true);
+
+            var engineDataProvider = inputDataProvider.EngineInputData;
+
+            Assert.IsFalse(engineDataProvider.SavedInDeclarationMode);
+
+            Assert.AreEqual("Generic 40t Long Haul Truck Engine", engineDataProvider.Model);
+            Assert.AreEqual(0.012730, engineDataProvider.Displacement.Value());
+            Assert.AreEqual(0.77, engineDataProvider.Inertia.Value());
+
+            AssertHelper.Exception<VectoException>(() => { var tmp = engineDataProvider.WHTCMotorway; });
+            AssertHelper.Exception<VectoException>(() => { var tmp = engineDataProvider.WHTCRural; });
+            AssertHelper.Exception<VectoException>(() => { var tmp = engineDataProvider.WHTCUrban; });
+
+            var fcMapTable = engineDataProvider.FuelConsumptionMap;
+            Assert.AreEqual(112, fcMapTable.Rows.Count);
+            Assert.AreEqual("engine speed", fcMapTable.Columns[0].Caption);
+            Assert.AreEqual("torque", fcMapTable.Columns[1].Caption);
+            Assert.AreEqual("fuel consumption", fcMapTable.Columns[2].Caption);
+
+            Assert.AreEqual("560", fcMapTable.Rows[0][0]);
+            var fcMap = FuelConsumptionMapReader.Create(fcMapTable);
             //Assert.AreEqual(1256.SI().Gramm.Per.Hour.ConvertTo().Kilo.Gramm.Per.Second.Value(),
             //	fcMap.GetFuelConsumption(0.SI<NewtonMeter>(), 560.RPMtoRad()).Value.Value());
             //Assert.AreEqual(1256.SI(Unit.SI.Gramm.Per.Hour).ConvertTo(Unit.SI.Kilo.Gramm.Per.Second).Value(),
-            //	fcMap.GetFuelConsumption(0.SI<NewtonMeter>(), 560.RPMtoRad()).Value.Value());
-            Assert.AreEqual(1256.SI(Unit.SI.Gramm.Per.Hour).ConvertToKiloGrammPerSecond().Value(),
-                fcMap.GetFuelConsumption(0.SI<NewtonMeter>(), 560.RPMtoRad()).Value.Value());
-
-            var fldTable = engineDataProvider.FullLoadCurve;
-			Assert.AreEqual(10, fldTable.Rows.Count);
-			Assert.AreEqual("engine speed", fldTable.Columns[0].Caption);
-			Assert.AreEqual("full load torque", fldTable.Columns[1].Caption);
-			Assert.AreEqual("motoring torque", fldTable.Columns[2].Caption);
-			var fldMap = FullLoadCurveReader.Create(fldTable, true);
-		}
-
-		[TestCase]
-		public void TestXMLInputGbxReferencedFile()
-		{
-			var inputDataProvider = new XMLEngineeringInputDataProvider(EngineeringSampleFile, true);
-			var gearboxDataProvider = inputDataProvider.GearboxInputData;
-
-			Assert.AreEqual("Generic 40t Long Haul Truck Gearbox", gearboxDataProvider.Model);
-			Assert.AreEqual(GearboxType.AMT, gearboxDataProvider.Type);
-			var gears = gearboxDataProvider.Gears;
-			Assert.AreEqual(12, gears.Count);
-
-			Assert.AreEqual(1, gears.First().Gear);
-			Assert.AreEqual(14.93, gears.First().Ratio);
-			Assert.AreEqual("0", gears.First().LossMap.Rows[0][0]);
-			Assert.AreEqual("-350", gears.First().LossMap.Rows[0][1]);
-			Assert.AreEqual("12.06", gears.First().LossMap.Rows[0][2]);
-
-			var lossMap = TransmissionLossMapReader.Create(gears.First().LossMap, gears.First().Ratio,
-				gears.First().Gear.ToString());
-
-			Assert.AreEqual("-100", gears.First().ShiftPolygon.Rows[0][0]);
-			Assert.AreEqual("700", gears.First().ShiftPolygon.Rows[0][1]);
-			Assert.AreEqual("1800", gears.First().ShiftPolygon.Rows[0][2]);
-
-			//Assert.AreEqual("560", gears.First().FullLoadCurve.Rows[0][0]);
-			//Assert.AreEqual("2500", gears.First().FullLoadCurve.Rows[0][1]);
-
-			//var fldMap = FullLoadCurveReader.Create(gears.First().FullLoadCurve, true);
-		}
-
-		[TestCase]
-		public void TestXMLInputGbxTCReferencedFile()
-		{
-			var inputDataProvider = new XMLEngineeringInputDataProvider(EngineeringSampleFile, true);
-			var tcInputDataProvider = inputDataProvider.GearboxInputData.TorqueConverter;
-
-
-			Assert.AreEqual("GBX_ShiftPolygons.vgbs", Path.GetFileName(tcInputDataProvider.ShiftPolygon.Source));
-			Assert.AreEqual("-100", tcInputDataProvider.ShiftPolygon.Rows[0][0]);
-			Assert.AreEqual("700", tcInputDataProvider.ShiftPolygon.Rows[0][1]);
-			Assert.AreEqual("1800", tcInputDataProvider.ShiftPolygon.Rows[0][2]);
-
-			Assert.AreEqual("tc_data.vtcc", Path.GetFileName(tcInputDataProvider.TCData.Source));
-			Assert.AreEqual(3, tcInputDataProvider.TCData.Rows.Count);
-			Assert.AreEqual("300", tcInputDataProvider.TCData.Rows[0][1]);
-			Assert.AreEqual("0.9", tcInputDataProvider.TCData.Rows[2][2]);
-		}
-
-		[TestCase]
-		public void TestXMLInputAngledriveReferencedFile()
-		{
-			var inputDataProvider = new XMLEngineeringInputDataProvider(EngineeringSampleFile, true);
-			var angledriveInputData = inputDataProvider.AngledriveInputData;
-
-			Assert.AreEqual("Generic Angledrive", angledriveInputData.Model);
-
-			var lossMapData = angledriveInputData.LossMap;
-			Assert.AreEqual(1.2, angledriveInputData.Ratio);
-			Assert.AreEqual("0", lossMapData.Rows[0][0]);
-			Assert.AreEqual("-10000", lossMapData.Rows[0][1]);
-			Assert.AreEqual("100", lossMapData.Rows[0][2]);
-
-			var lossMap = TransmissionLossMapReader.Create(lossMapData, angledriveInputData.Ratio, "Angledrive");
-		}
-
-		[TestCase]
-		public void TestXMLInputAxlGReferencedFile()
-		{
-			var inputDataProvider = new XMLEngineeringInputDataProvider(EngineeringSampleFile, true);
-			var axlegearDataProvider = inputDataProvider.AxleGearInputData;
-
-			Assert.AreEqual("Generic 40t Long Haul Truck AxleGear", axlegearDataProvider.Model);
-
-			var lossMapData = axlegearDataProvider.LossMap;
-			Assert.AreEqual(2.59, axlegearDataProvider.Ratio);
-			Assert.AreEqual("0", lossMapData.Rows[0][0]);
-			Assert.AreEqual("-5000", lossMapData.Rows[0][1]);
-			Assert.AreEqual("115", lossMapData.Rows[0][2]);
-
-			var lossMap = TransmissionLossMapReader.Create(lossMapData, axlegearDataProvider.Ratio, "AxleGear");
-		}
-
-		[TestCase]
-		public void TestXMLInputRetarderReferencedFile()
-		{
-			var inputDataProvider = new XMLEngineeringInputDataProvider(EngineeringSampleFile, true);
-			var retarderDataProvider = inputDataProvider.RetarderInputData;
-
-			Assert.AreEqual("Generic Retarder", retarderDataProvider.Model);
-
-			var lossMapData = retarderDataProvider.LossMap;
-
-			Assert.AreEqual(RetarderType.TransmissionOutputRetarder, retarderDataProvider.Type);
-
-			Assert.AreEqual("0", lossMapData.Rows[0][0]);
-			Assert.AreEqual("10", lossMapData.Rows[0][1]);
-
-			var lossMap = RetarderLossMapReader.Create(lossMapData);
-		}
-
-		[TestCase]
-		public void TestXMLInputAxleWheelsReferencedFile()
-		{
-			var inputDataProvider = new XMLEngineeringInputDataProvider(EngineeringSampleFile, true);
-			var vehicleDataProvider = inputDataProvider.VehicleInputData;
-
-			var axles = vehicleDataProvider.Axles;
-
-			Assert.AreEqual("315/70 R22.5", axles[0].Wheels);
-			Assert.AreEqual(0.0055, axles[0].RollResistanceCoefficient);
-			Assert.AreEqual(31300, axles[0].TyreTestLoad.Value());
-
-			Assert.AreEqual("315/70 R22.5", axles[1].Wheels);
-			Assert.AreEqual(0.0063, axles[1].RollResistanceCoefficient);
-			Assert.AreEqual(31300, axles[1].TyreTestLoad.Value());
-
-			//AssertHelper.Exception<VectoException>(() => { var tmp = vehicleDataProvider.Rim; });
-			Assert.AreEqual(0.488822, vehicleDataProvider.DynamicTyreRadius.Value());
-		}
-
-		[TestCase]
-		public void TestXMLInputAuxiliariesReferencedFile()
-		{
-			var inputDataProvider = new XMLEngineeringInputDataProvider(EngineeringSampleFile, true);
-			var auxDataProvider = inputDataProvider.AuxiliaryInputData();
-
-			var aux = auxDataProvider.Auxiliaries;
-			var aux1 = aux[0];
-
-			Assert.AreEqual("ES", aux1.ID);
-
-			Assert.AreEqual(70, aux1.DemandMap.Rows[0].ParseDouble(AuxiliaryDataReader.Fields.MechPower));
-			Assert.AreEqual(640, aux1.DemandMap.Rows[2].ParseDouble(AuxiliaryDataReader.Fields.SupplyPower));
-
-			var aux2 = aux[1];
-
-			Assert.AreEqual("FAN", aux2.ID);
-			Assert.AreEqual(70, aux2.DemandMap.Rows[0].ParseDouble(AuxiliaryDataReader.Fields.MechPower));
-			Assert.AreEqual(3190, aux2.DemandMap.Rows[113].ParseDouble(AuxiliaryDataReader.Fields.SupplyPower));
-		}
-
-		[TestCase]
-		public void TestXMLInputADASReferencedFile()
-		{
-			//var reader = XmlReader.Create(EngineeringSampleFile);
-
-			var inputDataProvider = new XMLEngineeringInputDataProvider(EngineeringSampleFile, true);
-
-			var adas = inputDataProvider.DriverInputData;
-
-			Assert.AreEqual(DriverMode.Overspeed, adas.OverSpeedEcoRoll.Mode);
-		}
-
-		[TestCase]
-		public void TestVehicleInputReferencedFile()
-		{
-			var inputDataProvider = new XMLEngineeringInputDataProvider(EngineeringSampleFile, true);
-
-			var vehicleDataProvider = inputDataProvider.VehicleInputData;
-
-			Assert.AreEqual(VehicleCategory.Tractor, vehicleDataProvider.VehicleCategory);
-			Assert.AreEqual(AxleConfiguration.AxleConfig_4x2, vehicleDataProvider.AxleConfiguration);
-
-			Assert.AreEqual(7100.0, vehicleDataProvider.CurbMassChassis.Value());
-			Assert.AreEqual(18000.0, vehicleDataProvider.GrossVehicleMassRating.Value());
-			Assert.AreEqual(6.29, inputDataProvider.AirdragInputData.AirDragArea.Value());
-
-			Assert.AreEqual(1500, vehicleDataProvider.Loading.Value());
-			Assert.AreEqual(500, vehicleDataProvider.CurbMassExtra.Value());
-
-			Assert.AreEqual(1.0, inputDataProvider.RetarderInputData.Ratio);
-		}
-
-		[TestCase]
-		public void TestXMLPowertrainGenerationReferencedFile()
-		{
-			var fileWriter = new FileOutputWriter("foo");
-			var sumWriter = new FileOutputWriter("vecto_vehicle-sample_xml");
-			var sumData = new SummaryDataContainer(sumWriter);
-			var jobContainer = new JobContainer(sumData);
-			var dataProvider = new XMLEngineeringInputDataProvider(EngineeringSampleFile, true);
-
-			var runsFactory = new SimulatorFactory(ExecutionMode.Engineering, dataProvider, fileWriter);
-			runsFactory.WriteModalResults = true;
-
-			jobContainer.AddRuns(runsFactory);
-
-			//Assert.AreEqual(6, jobContainer.Runs.Count);
-		}
-
-
-		[TestCase]
-		public void TestXMEngineering_DriverModelLACExt()
-		{
-			var inputDataProvider = new XMLEngineeringInputDataProvider(EngineeringSampleFile, true);
-
-			var driverDataProvider = inputDataProvider.DriverInputData;
-
-			var lac = driverDataProvider.Lookahead;
-			Assert.IsTrue(lac.Enabled);
-
-			Assert.AreEqual("lac_speedDependent.csv", Path.GetFileName(lac.CoastingDecisionFactorTargetSpeedLookup.Source));
-			Assert.AreEqual("lac_velocityDrop.csv", Path.GetFileName(lac.CoastingDecisionFactorVelocityDropLookup.Source));
-		}
-
-		[TestCase]
-		public void TestXMEngineering_PTO()
-		{
-			var inputDataProvider = new XMLEngineeringInputDataProvider(EngineeringSampleFile, true);
-
-			var ptoData = inputDataProvider.PTOTransmissionInputData;
-
-			//Assert.AreEqual("only the drive shaft of the PTO - multi-disc clutch", ptoData.PTOTransmissionType);
-			Assert.AreEqual(2, ptoData.PTOLossMap.Rows.Count);
-			Assert.AreEqual("2800", ptoData.PTOLossMap.Rows[1][0]);
-			Assert.AreEqual("100", ptoData.PTOLossMap.Rows[1][1]);
-
-			Assert.AreEqual(4, ptoData.PTOCycle.Rows.Count);
-			Assert.AreEqual("3", ptoData.PTOCycle.Rows[3][0]);
-			Assert.AreEqual("1200", ptoData.PTOCycle.Rows[3][1]);
-			Assert.AreEqual("100", ptoData.PTOCycle.Rows[3][2]);
-		}
-	}
+            //	fcMap.GetFuelConsumption(0.SI<NewtonMeter>(), 560.RPMtoRad()).Value.Value());
+            Assert.AreEqual(1256.SI(Unit.SI.Gramm.Per.Hour).Value(), fcMap.GetFuelConsumption(0.SI<NewtonMeter>(), 560.RPMtoRad()).Value.Value());
+
+            var fldTable = engineDataProvider.FullLoadCurve;
+            Assert.AreEqual(10, fldTable.Rows.Count);
+            Assert.AreEqual("engine speed", fldTable.Columns[0].Caption);
+            Assert.AreEqual("full load torque", fldTable.Columns[1].Caption);
+            Assert.AreEqual("motoring torque", fldTable.Columns[2].Caption);
+            var fldMap = FullLoadCurveReader.Create(fldTable, true);
+        }
+
+        [TestCase]
+        public void TestXMLInputGbxReferencedFile()
+        {
+            var inputDataProvider = new XMLEngineeringInputDataProvider(EngineeringSampleFile, true);
+            var gearboxDataProvider = inputDataProvider.GearboxInputData;
+
+            Assert.AreEqual("Generic 40t Long Haul Truck Gearbox", gearboxDataProvider.Model);
+            Assert.AreEqual(GearboxType.AMT, gearboxDataProvider.Type);
+            var gears = gearboxDataProvider.Gears;
+            Assert.AreEqual(12, gears.Count);
+
+            Assert.AreEqual(1, gears.First().Gear);
+            Assert.AreEqual(14.93, gears.First().Ratio);
+            Assert.AreEqual("0", gears.First().LossMap.Rows[0][0]);
+            Assert.AreEqual("-350", gears.First().LossMap.Rows[0][1]);
+            Assert.AreEqual("12.06", gears.First().LossMap.Rows[0][2]);
+
+            var lossMap = TransmissionLossMapReader.Create(gears.First().LossMap, gears.First().Ratio,
+                gears.First().Gear.ToString());
+
+            Assert.AreEqual("-100", gears.First().ShiftPolygon.Rows[0][0]);
+            Assert.AreEqual("700", gears.First().ShiftPolygon.Rows[0][1]);
+            Assert.AreEqual("1800", gears.First().ShiftPolygon.Rows[0][2]);
+
+            //Assert.AreEqual("560", gears.First().FullLoadCurve.Rows[0][0]);
+            //Assert.AreEqual("2500", gears.First().FullLoadCurve.Rows[0][1]);
+
+            //var fldMap = FullLoadCurveReader.Create(gears.First().FullLoadCurve, true);
+        }
+
+        [TestCase]
+        public void TestXMLInputGbxTCReferencedFile()
+        {
+            var inputDataProvider = new XMLEngineeringInputDataProvider(EngineeringSampleFile, true);
+            var tcInputDataProvider = inputDataProvider.GearboxInputData.TorqueConverter;
+
+
+            Assert.AreEqual("GBX_ShiftPolygons.vgbs", Path.GetFileName(tcInputDataProvider.ShiftPolygon.Source));
+            Assert.AreEqual("-100", tcInputDataProvider.ShiftPolygon.Rows[0][0]);
+            Assert.AreEqual("700", tcInputDataProvider.ShiftPolygon.Rows[0][1]);
+            Assert.AreEqual("1800", tcInputDataProvider.ShiftPolygon.Rows[0][2]);
+
+            Assert.AreEqual("tc_data.vtcc", Path.GetFileName(tcInputDataProvider.TCData.Source));
+            Assert.AreEqual(3, tcInputDataProvider.TCData.Rows.Count);
+            Assert.AreEqual("300", tcInputDataProvider.TCData.Rows[0][1]);
+            Assert.AreEqual("0.9", tcInputDataProvider.TCData.Rows[2][2]);
+        }
+
+        [TestCase]
+        public void TestXMLInputAngledriveReferencedFile()
+        {
+            var inputDataProvider = new XMLEngineeringInputDataProvider(EngineeringSampleFile, true);
+            var angledriveInputData = inputDataProvider.AngledriveInputData;
+
+            Assert.AreEqual("Generic Angledrive", angledriveInputData.Model);
+
+            var lossMapData = angledriveInputData.LossMap;
+            Assert.AreEqual(1.2, angledriveInputData.Ratio);
+            Assert.AreEqual("0", lossMapData.Rows[0][0]);
+            Assert.AreEqual("-10000", lossMapData.Rows[0][1]);
+            Assert.AreEqual("100", lossMapData.Rows[0][2]);
+
+            var lossMap = TransmissionLossMapReader.Create(lossMapData, angledriveInputData.Ratio, "Angledrive");
+        }
+
+        [TestCase]
+        public void TestXMLInputAxlGReferencedFile()
+        {
+            var inputDataProvider = new XMLEngineeringInputDataProvider(EngineeringSampleFile, true);
+            var axlegearDataProvider = inputDataProvider.AxleGearInputData;
+
+            Assert.AreEqual("Generic 40t Long Haul Truck AxleGear", axlegearDataProvider.Model);
+
+            var lossMapData = axlegearDataProvider.LossMap;
+            Assert.AreEqual(2.59, axlegearDataProvider.Ratio);
+            Assert.AreEqual("0", lossMapData.Rows[0][0]);
+            Assert.AreEqual("-5000", lossMapData.Rows[0][1]);
+            Assert.AreEqual("115", lossMapData.Rows[0][2]);
+
+            var lossMap = TransmissionLossMapReader.Create(lossMapData, axlegearDataProvider.Ratio, "AxleGear");
+        }
+
+        [TestCase]
+        public void TestXMLInputRetarderReferencedFile()
+        {
+            var inputDataProvider = new XMLEngineeringInputDataProvider(EngineeringSampleFile, true);
+            var retarderDataProvider = inputDataProvider.RetarderInputData;
+
+            Assert.AreEqual("Generic Retarder", retarderDataProvider.Model);
+
+            var lossMapData = retarderDataProvider.LossMap;
+
+            Assert.AreEqual(RetarderType.TransmissionOutputRetarder, retarderDataProvider.Type);
+
+            Assert.AreEqual("0", lossMapData.Rows[0][0]);
+            Assert.AreEqual("10", lossMapData.Rows[0][1]);
+
+            var lossMap = RetarderLossMapReader.Create(lossMapData);
+        }
+
+        [TestCase]
+        public void TestXMLInputAxleWheelsReferencedFile()
+        {
+            var inputDataProvider = new XMLEngineeringInputDataProvider(EngineeringSampleFile, true);
+            var vehicleDataProvider = inputDataProvider.VehicleInputData;
+
+            var axles = vehicleDataProvider.Axles;
+
+            Assert.AreEqual("315/70 R22.5", axles[0].Wheels);
+            Assert.AreEqual(0.0055, axles[0].RollResistanceCoefficient);
+            Assert.AreEqual(31300, axles[0].TyreTestLoad.Value());
+
+            Assert.AreEqual("315/70 R22.5", axles[1].Wheels);
+            Assert.AreEqual(0.0063, axles[1].RollResistanceCoefficient);
+            Assert.AreEqual(31300, axles[1].TyreTestLoad.Value());
+
+            //AssertHelper.Exception<VectoException>(() => { var tmp = vehicleDataProvider.Rim; });
+            Assert.AreEqual(0.488822, vehicleDataProvider.DynamicTyreRadius.Value());
+        }
+
+        [TestCase]
+        public void TestXMLInputAuxiliariesReferencedFile()
+        {
+            var inputDataProvider = new XMLEngineeringInputDataProvider(EngineeringSampleFile, true);
+            var auxDataProvider = inputDataProvider.AuxiliaryInputData();
+
+            var aux = auxDataProvider.Auxiliaries;
+            var aux1 = aux[0];
+
+            Assert.AreEqual("ES", aux1.ID);
+
+            Assert.AreEqual(70, aux1.DemandMap.Rows[0].ParseDouble(AuxiliaryDataReader.Fields.MechPower));
+            Assert.AreEqual(640, aux1.DemandMap.Rows[2].ParseDouble(AuxiliaryDataReader.Fields.SupplyPower));
+
+            var aux2 = aux[1];
+
+            Assert.AreEqual("FAN", aux2.ID);
+            Assert.AreEqual(70, aux2.DemandMap.Rows[0].ParseDouble(AuxiliaryDataReader.Fields.MechPower));
+            Assert.AreEqual(3190, aux2.DemandMap.Rows[113].ParseDouble(AuxiliaryDataReader.Fields.SupplyPower));
+        }
+
+        [TestCase]
+        public void TestXMLInputADASReferencedFile()
+        {
+            //var reader = XmlReader.Create(EngineeringSampleFile);
+
+            var inputDataProvider = new XMLEngineeringInputDataProvider(EngineeringSampleFile, true);
+
+            var adas = inputDataProvider.DriverInputData;
+
+            Assert.AreEqual(DriverMode.Overspeed, adas.OverSpeedEcoRoll.Mode);
+        }
+
+        [TestCase]
+        public void TestVehicleInputReferencedFile()
+        {
+            var inputDataProvider = new XMLEngineeringInputDataProvider(EngineeringSampleFile, true);
+
+            var vehicleDataProvider = inputDataProvider.VehicleInputData;
+
+            Assert.AreEqual(VehicleCategory.Tractor, vehicleDataProvider.VehicleCategory);
+            Assert.AreEqual(AxleConfiguration.AxleConfig_4x2, vehicleDataProvider.AxleConfiguration);
+
+            Assert.AreEqual(7100.0, vehicleDataProvider.CurbMassChassis.Value());
+            Assert.AreEqual(18000.0, vehicleDataProvider.GrossVehicleMassRating.Value());
+            Assert.AreEqual(6.29, inputDataProvider.AirdragInputData.AirDragArea.Value());
+
+            Assert.AreEqual(1500, vehicleDataProvider.Loading.Value());
+            Assert.AreEqual(500, vehicleDataProvider.CurbMassExtra.Value());
+
+            Assert.AreEqual(1.0, inputDataProvider.RetarderInputData.Ratio);
+        }
+
+        [TestCase]
+        public void TestXMLPowertrainGenerationReferencedFile()
+        {
+            var fileWriter = new FileOutputWriter("foo");
+            var sumWriter = new FileOutputWriter("vecto_vehicle-sample_xml");
+            var sumData = new SummaryDataContainer(sumWriter);
+            var jobContainer = new JobContainer(sumData);
+            var dataProvider = new XMLEngineeringInputDataProvider(EngineeringSampleFile, true);
+
+            var runsFactory = new SimulatorFactory(ExecutionMode.Engineering, dataProvider, fileWriter);
+            runsFactory.WriteModalResults = true;
+
+            jobContainer.AddRuns(runsFactory);
+
+            //Assert.AreEqual(6, jobContainer.Runs.Count);
+        }
+
+
+        [TestCase]
+        public void TestXMEngineering_DriverModelLACExt()
+        {
+            var inputDataProvider = new XMLEngineeringInputDataProvider(EngineeringSampleFile, true);
+
+            var driverDataProvider = inputDataProvider.DriverInputData;
+
+            var lac = driverDataProvider.Lookahead;
+            Assert.IsTrue(lac.Enabled);
+
+            Assert.AreEqual("lac_speedDependent.csv", Path.GetFileName(lac.CoastingDecisionFactorTargetSpeedLookup.Source));
+            Assert.AreEqual("lac_velocityDrop.csv", Path.GetFileName(lac.CoastingDecisionFactorVelocityDropLookup.Source));
+        }
+
+        [TestCase]
+        public void TestXMEngineering_PTO()
+        {
+            var inputDataProvider = new XMLEngineeringInputDataProvider(EngineeringSampleFile, true);
+
+            var ptoData = inputDataProvider.PTOTransmissionInputData;
+
+            //Assert.AreEqual("only the drive shaft of the PTO - multi-disc clutch", ptoData.PTOTransmissionType);
+            Assert.AreEqual(2, ptoData.PTOLossMap.Rows.Count);
+            Assert.AreEqual("2800", ptoData.PTOLossMap.Rows[1][0]);
+            Assert.AreEqual("100", ptoData.PTOLossMap.Rows[1][1]);
+
+            Assert.AreEqual(4, ptoData.PTOCycle.Rows.Count);
+            Assert.AreEqual("3", ptoData.PTOCycle.Rows[3][0]);
+            Assert.AreEqual("1200", ptoData.PTOCycle.Rows[3][1]);
+            Assert.AreEqual("100", ptoData.PTOCycle.Rows[3][2]);
+        }
+    }
 }
\ No newline at end of file
diff --git a/VectoCore/VectoCoreTest/XML/XMLEngineeringInputSingleTest.cs b/VectoCore/VectoCoreTest/XML/XMLEngineeringInputSingleTest.cs
index 43d3b2743b9725f09f649687bdecbf874feeabe6..f16b439d7e100fd4b4484558ae1c33c9c64add40 100644
--- a/VectoCore/VectoCoreTest/XML/XMLEngineeringInputSingleTest.cs
+++ b/VectoCore/VectoCoreTest/XML/XMLEngineeringInputSingleTest.cs
@@ -92,8 +92,7 @@ namespace TUGraz.VectoCore.Tests.XML
             //	fcMap.GetFuelConsumption(0.SI<NewtonMeter>(), 560.RPMtoRad()).Value.Value());
 		    //Assert.AreEqual(1256.SI(Unit.SI.Gramm.Per.Hour).ConvertTo(Unit.SI.Kilo.Gramm.Per.Second).Value(),
 		    //	fcMap.GetFuelConsumption(0.SI<NewtonMeter>(), 560.RPMtoRad()).Value.Value());
-            Assert.AreEqual(1256.SI(Unit.SI.Gramm.Per.Hour).ConvertToKiloGrammPerSecond().Value(),
-                fcMap.GetFuelConsumption(0.SI<NewtonMeter>(), 560.RPMtoRad()).Value.Value());
+            Assert.AreEqual(1256.SI(Unit.SI.Gramm.Per.Hour).Value(), fcMap.GetFuelConsumption(0.SI<NewtonMeter>(), 560.RPMtoRad()).Value.Value());
 
             var fldTable = engineDataProvider.FullLoadCurve;
 			Assert.AreEqual(10, fldTable.Rows.Count);