diff --git a/VECTO/GUI/VectoJobForm.vb b/VECTO/GUI/VectoJobForm.vb
index 18bd338ee58e8a67da2967b6ff8302c114d6b7bf..0863126db6e867e1dd55e8b86071fec98d863f33 100644
--- a/VECTO/GUI/VectoJobForm.vb
+++ b/VECTO/GUI/VectoJobForm.vb
@@ -1312,7 +1312,7 @@ lbDlog:
 												True)
 		Catch
 		End Try
-		If s0 Is Nothing Then
+		If Not s0.Found Then
 			HDVclass = "-"
 		Else
 			HDVclass = s0.VehicleClass.GetClassNumber()
@@ -1327,7 +1327,7 @@ lbDlog:
 
 		End If
 
-		PicVehicle.Image = ConvPicPath(If(s0 Is Nothing, -1, HDVclass.ToInt()), False) _
+		PicVehicle.Image = ConvPicPath(If(Not s0.Found, -1, HDVclass.ToInt()), False) _
 		'Image.FromFile(cDeclaration.ConvPicPath(HDVclass, False))
 
 		TbHVCclass.Text = String.Format("HDV Class {0}", HDVclass)
diff --git a/VECTO/GUI/VehicleForm.vb b/VECTO/GUI/VehicleForm.vb
index daa4612ba1e77845c5392c1cf3cc57be9495a621..25eea0c99f89e21704d0edf89ee250b679a84b78 100644
--- a/VECTO/GUI/VehicleForm.vb
+++ b/VECTO/GUI/VehicleForm.vb
@@ -132,13 +132,13 @@ Public Class VehicleForm
 		Catch
 			' no segment found - ignore
 		End Try
-		If Not s0 Is Nothing Then
+		If s0.Found Then
 			_hdVclass = s0.VehicleClass.GetClassNumber()
 		End If
 
 
 		TbHDVclass.Text = _hdVclass
-		PicVehicle.Image = ConvPicPath(If(s0 Is Nothing, -1, _hdVclass.ToInt()), False)
+		PicVehicle.Image = ConvPicPath(If(Not s0.Found, -1, _hdVclass.ToInt()), False)
 	End Sub
 
 
@@ -160,7 +160,7 @@ Public Class VehicleForm
 		Catch
 			' no segment found - ignore
 		End Try
-		If Not s0 Is Nothing Then
+		If s0.found Then
 			_hdVclass = s0.VehicleClass.GetClassNumber()
 			Dim axleCount As Integer = s0.Missions(0).AxleWeightDistribution.Count()
 			Dim i0 As Integer = LvRRC.Items.Count
diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapter.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapter.cs
index 84fadaad75271337382f6828faf8632ef6307c18..5ef3caa5f2b15e4c4f454754327171707f918bff 100644
--- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapter.cs
+++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapter.cs
@@ -271,7 +271,8 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter
 		}
 
 		private static void CreateATGearData(IGearboxDeclarationInputData gearbox, uint i, GearData gearData,
-			ShiftPolygon tcShiftPolygon, double gearDifferenceRatio, Dictionary<uint, GearData> gears, VehicleCategory vehicleCategory)
+			ShiftPolygon tcShiftPolygon, double gearDifferenceRatio, Dictionary<uint, GearData> gears,
+			VehicleCategory vehicleCategory)
 		{
 			if (gearbox.Type == GearboxType.ATPowerSplit && i == 0) {
 				// powersplit transmission: torque converter already contains ratio and losses
@@ -282,7 +283,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter
 					// torqueconverter is active in first gear - duplicate ratio and lossmap for torque converter mode
 					CreateTCFirstGearATSerial(gearData, tcShiftPolygon);
 				}
-					if (i == 1 && gearDifferenceRatio >= DeclarationData.Gearbox.TorqueConverterSecondGearThreshold(vehicleCategory)) {
+				if (i == 1 && gearDifferenceRatio >= DeclarationData.Gearbox.TorqueConverterSecondGearThreshold(vehicleCategory)) {
 					// ratio between first and second gear is above threshold, torqueconverter is active in second gear as well
 					// -> duplicate ratio and lossmap for torque converter mode, remove locked transmission for previous gear
 					CreateTCSecondGearATSerial(gearData, tcShiftPolygon);
@@ -335,7 +336,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter
 				mission = mission.GetNonEMSMissionType();
 				switch (auxType) {
 					case AuxiliaryType.Fan:
-						aux.PowerDemand = DeclarationData.Fan.Lookup(mission, auxData.Technology.FirstOrDefault());
+						aux.PowerDemand = DeclarationData.Fan.Lookup(mission, auxData.Technology.FirstOrDefault()).PowerDemand;
 						aux.ID = Constants.Auxiliaries.IDs.Fan;
 						break;
 					case AuxiliaryType.SteeringPump:
@@ -344,15 +345,15 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter
 						break;
 					case AuxiliaryType.HVAC:
 						aux.PowerDemand = DeclarationData.HeatingVentilationAirConditioning.Lookup(mission,
-							auxData.Technology.FirstOrDefault(), hvdClass);
+							auxData.Technology.FirstOrDefault(), hvdClass).PowerDemand;
 						aux.ID = Constants.Auxiliaries.IDs.HeatingVentilationAirCondition;
 						break;
 					case AuxiliaryType.PneumaticSystem:
-						aux.PowerDemand = DeclarationData.PneumaticSystem.Lookup(mission, auxData.Technology.FirstOrDefault());
+						aux.PowerDemand = DeclarationData.PneumaticSystem.Lookup(mission, auxData.Technology.FirstOrDefault()).PowerDemand;
 						aux.ID = Constants.Auxiliaries.IDs.PneumaticSystem;
 						break;
 					case AuxiliaryType.ElectricSystem:
-						aux.PowerDemand = DeclarationData.ElectricSystem.Lookup(mission, auxData.Technology.FirstOrDefault());
+						aux.PowerDemand = DeclarationData.ElectricSystem.Lookup(mission, auxData.Technology.FirstOrDefault()).PowerDemand;
 						aux.ID = Constants.Auxiliaries.IDs.ElectricSystem;
 						break;
 					default:
diff --git a/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationModeVectoRunDataFactory.cs b/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationModeVectoRunDataFactory.cs
index 8a61d30f9378869da8e4711a1e544f2c475383d3..201451de671cc15783395728810412506986e909 100644
--- a/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationModeVectoRunDataFactory.cs
+++ b/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationModeVectoRunDataFactory.cs
@@ -32,6 +32,7 @@
 using System;
 using System.Collections.Generic;
 using System.Linq;
+using TUGraz.VectoCommon.Exceptions;
 using TUGraz.VectoCommon.InputData;
 using TUGraz.VectoCommon.Models;
 using TUGraz.VectoCommon.Utils;
@@ -90,9 +91,14 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl
 			_segment = GetVehicleClassification(InputDataProvider.VehicleInputData.VehicleCategory,
 				InputDataProvider.VehicleInputData.AxleConfiguration,
 				InputDataProvider.VehicleInputData.GrossVehicleMassRating, InputDataProvider.VehicleInputData.CurbMassChassis);
+			if (!_segment.Found) {
+				throw new VectoException(
+					"no segment found for vehicle configruation: vehicle category: {0}, axle configuration: {1}, GVMR: {2}",
+					InputDataProvider.VehicleInputData.VehicleCategory, InputDataProvider.VehicleInputData.AxleConfiguration,
+					InputDataProvider.VehicleInputData.GrossVehicleMassRating);
+			}
 			_driverdata = _dao.CreateDriverData(InputDataProvider.DriverInputData);
 			_driverdata.AccelerationCurve = AccelerationCurveReader.ReadFromStream(_segment.AccelerationFile);
-
 			var tempVehicle = _dao.CreateVehicleData(InputDataProvider.VehicleInputData, _segment.Missions.First(),
 				_segment.Missions.First().Loadings.First().Value, _segment.MunicipalBodyWeight);
 			_airdragData = _dao.CreateAirdragData(InputDataProvider.AirdragInputData, _segment.Missions.First(), _segment);
diff --git a/VectoCore/VectoCore/Models/Declaration/AuxDemandEntry.cs b/VectoCore/VectoCore/Models/Declaration/AuxDemandEntry.cs
new file mode 100644
index 0000000000000000000000000000000000000000..a04ddfb72d6a5c7079b1e5fb4e90dbd5aa3d44d7
--- /dev/null
+++ b/VectoCore/VectoCore/Models/Declaration/AuxDemandEntry.cs
@@ -0,0 +1,9 @@
+using TUGraz.VectoCommon.Utils;
+
+namespace TUGraz.VectoCore.Models.Declaration
+{
+	public struct AuxDemandEntry
+	{
+		public Watt PowerDemand;
+	}
+}
\ No newline at end of file
diff --git a/VectoCore/VectoCore/Models/Declaration/ElectricSystem.cs b/VectoCore/VectoCore/Models/Declaration/ElectricSystem.cs
index 4c9d90ef465111e095004010cc87e8e066806260..8bddb989396845919e56d3bc5c45633ab6fd3205 100644
--- a/VectoCore/VectoCore/Models/Declaration/ElectricSystem.cs
+++ b/VectoCore/VectoCore/Models/Declaration/ElectricSystem.cs
@@ -37,7 +37,7 @@ using TUGraz.VectoCore.Utils;
 
 namespace TUGraz.VectoCore.Models.Declaration
 {
-	public sealed class ElectricSystem : LookupData<MissionType, string, Watt>, IDeclarationAuxiliaryTable
+	public sealed class ElectricSystem : LookupData<MissionType, string, AuxDemandEntry>, IDeclarationAuxiliaryTable
 	{
 		private readonly Alternator _alternator = new Alternator();
 
@@ -58,19 +58,19 @@ namespace TUGraz.VectoCore.Models.Declaration
 				foreach (DataColumn col in table.Columns) {
 					if (col.Caption != "technology") {
 						Data[Tuple.Create(col.Caption.ParseEnum<MissionType>(), name)] =
-							row.ParseDouble(col).SI<Watt>();
+							new AuxDemandEntry() { PowerDemand = row.ParseDouble(col).SI<Watt>() };
 					}
 				}
 			}
 		}
 
-		public override Watt Lookup(MissionType missionType, string technology = null)
+		public override AuxDemandEntry Lookup(MissionType missionType, string technology = null)
 		{
 			if (string.IsNullOrWhiteSpace(technology)) {
 				technology = "Standard technology";
 			}
 			var value = base.Lookup(missionType, technology);
-			return value / _alternator.Lookup(missionType);
+			return new AuxDemandEntry() { PowerDemand = value.PowerDemand / _alternator.Lookup(missionType) };
 		}
 
 		internal sealed class Alternator : LookupData<MissionType, string, double>
diff --git a/VectoCore/VectoCore/Models/Declaration/Fan.cs b/VectoCore/VectoCore/Models/Declaration/Fan.cs
index 6a35c66ede7c0641af79320544ca830db54a029a..3a576c5d04d0a6b6bda5543afe71755c7627e00c 100644
--- a/VectoCore/VectoCore/Models/Declaration/Fan.cs
+++ b/VectoCore/VectoCore/Models/Declaration/Fan.cs
@@ -37,7 +37,7 @@ using TUGraz.VectoCore.Utils;
 
 namespace TUGraz.VectoCore.Models.Declaration
 {
-	public sealed class Fan : LookupData<MissionType, string, Watt>, IDeclarationAuxiliaryTable
+	public sealed class Fan : LookupData<MissionType, string, AuxDemandEntry>, IDeclarationAuxiliaryTable
 	{
 		protected override string ResourceId
 		{
@@ -56,13 +56,13 @@ namespace TUGraz.VectoCore.Models.Declaration
 
 				foreach (DataColumn col in table.Columns) {
 					if (col.Caption != "technology") {
-						Data[Tuple.Create(col.Caption.ParseEnum<MissionType>(), name)] = row.ParseDouble(col).SI<Watt>();
+						Data[Tuple.Create(col.Caption.ParseEnum<MissionType>(), name)] = new AuxDemandEntry(){PowerDemand = row.ParseDouble(col).SI<Watt>()};
 					}
 				}
 			}
 		}
 
-		public override Watt Lookup(MissionType mission, string technology = null)
+		public override AuxDemandEntry Lookup(MissionType mission, string technology = null)
 		{
 			if (string.IsNullOrWhiteSpace(technology)) {
 				technology = "Crankshaft mounted - Electronically controlled visco clutch";
diff --git a/VectoCore/VectoCore/Models/Declaration/FuelData.cs b/VectoCore/VectoCore/Models/Declaration/FuelData.cs
index e925bfcd173d38f5229d5d487dcd52f83e5e24c7..6f176a7b0d70c1c976fa78f5ac36a34bb557eef8 100644
--- a/VectoCore/VectoCore/Models/Declaration/FuelData.cs
+++ b/VectoCore/VectoCore/Models/Declaration/FuelData.cs
@@ -29,73 +29,73 @@
 *   Martin Rexeis, rexeis@ivt.tugraz.at, IVT, Graz University of Technology
 */
 
-using System;
-using System.Data;
-using System.Linq;
-using TUGraz.VectoCommon.Models;
-using TUGraz.VectoCommon.Utils;
-using TUGraz.VectoCore.Utils;
-
-namespace TUGraz.VectoCore.Models.Declaration
-{
-	public sealed class FuelData : LookupData<FuelType, FuelData.Entry>
-	{
-		private static FuelData _instance;
-
-		public static FuelData Instance()
-		{
-			return _instance ?? (_instance = new FuelData());
-		}
-
-		private FuelData() {}
-
-		protected override string ResourceId
-		{
-			get { return DeclarationData.DeclarationDataResourcePrefix + ".FuelTypes.csv"; }
-		}
-
-		protected override string ErrorMessage
-		{
-			get { throw new InvalidOperationException("ErrorMessage not applicable."); }
-		}
-
-		public static Entry Diesel
-		{
-			get { return Instance().Lookup(FuelType.DieselCI); }
-		}
-
-		protected override void ParseData(DataTable table)
-		{
-			Data = table.Rows.Cast<DataRow>()
-				.Select(r => {
-					var density = r.Field<string>("fueldensity");
-					return new Entry(
-						r.Field<string>(0).ParseEnum<FuelType>(),
-						string.IsNullOrWhiteSpace(density) ? null : density.ToDouble(0).SI<KilogramPerCubicMeter>(),
-						r.ParseDouble("co2perfuelweight"),
-						r.ParseDouble("lowerheatingvalue").SI().Kilo.Joule.Per.Kilo.Gramm.Cast<JoulePerKilogramm>()
-						);
-				})
-				.ToDictionary(e => e.FuelType);
-		}
-
-		public class Entry
-		{
-			public Entry(FuelType type, KilogramPerCubicMeter density, double weight, JoulePerKilogramm heatingValue)
-			{
-				FuelType = type;
-				FuelDensity = density;
-				CO2PerFuelWeight = weight;
-				LowerHeatingValue = heatingValue;
-			}
-
-			public FuelType FuelType { get; private set; }
-
-			public KilogramPerCubicMeter FuelDensity { get; private set; }
-
-			public double CO2PerFuelWeight { get; private set; }
-
-			public JoulePerKilogramm LowerHeatingValue { get; private set; }
-		}
-	}
+using System;
+using System.Data;
+using System.Linq;
+using TUGraz.VectoCommon.Models;
+using TUGraz.VectoCommon.Utils;
+using TUGraz.VectoCore.Utils;
+
+namespace TUGraz.VectoCore.Models.Declaration
+{
+	public sealed class FuelData : LookupData<FuelType, FuelData.Entry>
+	{
+		private static FuelData _instance;
+
+		public static FuelData Instance()
+		{
+			return _instance ?? (_instance = new FuelData());
+		}
+
+		private FuelData() {}
+
+		protected override string ResourceId
+		{
+			get { return DeclarationData.DeclarationDataResourcePrefix + ".FuelTypes.csv"; }
+		}
+
+		protected override string ErrorMessage
+		{
+			get { throw new InvalidOperationException("ErrorMessage not applicable."); }
+		}
+
+		public static Entry Diesel
+		{
+			get { return Instance().Lookup(FuelType.DieselCI); }
+		}
+
+		protected override void ParseData(DataTable table)
+		{
+			Data = table.Rows.Cast<DataRow>()
+				.Select(r => {
+					var density = r.Field<string>("fueldensity");
+					return new Entry(
+						r.Field<string>(0).ParseEnum<FuelType>(),
+						string.IsNullOrWhiteSpace(density) ? null : density.ToDouble(0).SI<KilogramPerCubicMeter>(),
+						r.ParseDouble("co2perfuelweight"),
+						r.ParseDouble("lowerheatingvalue").SI().Kilo.Joule.Per.Kilo.Gramm.Cast<JoulePerKilogramm>()
+						);
+				})
+				.ToDictionary(e => e.FuelType);
+		}
+
+		public struct Entry
+		{
+			public Entry(FuelType type, KilogramPerCubicMeter density, double weight, JoulePerKilogramm heatingValue) : this()
+			{
+				FuelType = type;
+				FuelDensity = density;
+				CO2PerFuelWeight = weight;
+				LowerHeatingValue = heatingValue;
+			}
+
+			public FuelType FuelType { get; private set; }
+
+			public KilogramPerCubicMeter FuelDensity { get; private set; }
+
+			public double CO2PerFuelWeight { get; private set; }
+
+			public JoulePerKilogramm LowerHeatingValue { get; private set; }
+		}
+	}
 }
\ No newline at end of file
diff --git a/VectoCore/VectoCore/Models/Declaration/HVAC.cs b/VectoCore/VectoCore/Models/Declaration/HVAC.cs
index 5a59d415340dc4a61d732e0aa73cf5120e6655e1..650b6c576ca488b4616201e3a868c3e430517f8b 100644
--- a/VectoCore/VectoCore/Models/Declaration/HVAC.cs
+++ b/VectoCore/VectoCore/Models/Declaration/HVAC.cs
@@ -29,50 +29,52 @@
 *   Martin Rexeis, rexeis@ivt.tugraz.at, IVT, Graz University of Technology
 */
 
-using System;
-using System.Collections.Generic;
-using System.Data;
-using System.Linq;
-using TUGraz.VectoCommon.Utils;
-using TUGraz.VectoCore.Utils;
-
-namespace TUGraz.VectoCore.Models.Declaration
-{
-	public sealed class HeatingVentilationAirConditioning : LookupData<MissionType, string, VehicleClass, Watt>,
-		IDeclarationAuxiliaryTable
-	{
-		private List<string> Technologies;
-
-		protected override string ResourceId
-		{
-			get { return DeclarationData.DeclarationDataResourcePrefix + ".VAUX.HVAC-Table.csv"; }
-		}
-
-		protected override string ErrorMessage
-		{
-			get {
-				return "Auxiliary Lookup Error: No value found for HVAC. Mission: '{0}', Technology: '{1}' , HDVClass: '{2}'";
-			}
-		}
-
-		protected override void ParseData(DataTable table)
-		{
-			foreach (DataRow row in table.Rows) {
-				var hdvClass = VehicleClassHelper.Parse(row.Field<string>("hdvclass"));
-				var technology = row.Field<string>("technology");
-				foreach (DataColumn col in table.Columns) {
-					var value = row.ParseDoubleOrGetDefault(col.Caption, double.NaN);
-					if (col.Caption != "hdvclass" && col.Caption != "technology" && !double.IsNaN(value)) {
-						Data[Tuple.Create(col.Caption.ParseEnum<MissionType>(), technology, hdvClass)] = value.SI<Watt>();
-					}
-				}
-			}
-			Technologies = Data.Select(x => x.Key.Item2).Distinct().ToList();
-		}
-
-		public string[] GetTechnologies()
-		{
-			return Technologies.ToArray();
-		}
-	}
+using System;
+using System.Collections.Generic;
+using System.Data;
+using System.Linq;
+using TUGraz.VectoCommon.Utils;
+using TUGraz.VectoCore.Utils;
+
+namespace TUGraz.VectoCore.Models.Declaration
+{
+	public sealed class HeatingVentilationAirConditioning : LookupData<MissionType, string, VehicleClass, AuxDemandEntry>,
+		IDeclarationAuxiliaryTable
+	{
+		private List<string> Technologies;
+
+		protected override string ResourceId
+		{
+			get { return DeclarationData.DeclarationDataResourcePrefix + ".VAUX.HVAC-Table.csv"; }
+		}
+
+		protected override string ErrorMessage
+		{
+			get {
+				return "Auxiliary Lookup Error: No value found for HVAC. Mission: '{0}', Technology: '{1}' , HDVClass: '{2}'";
+			}
+		}
+
+		protected override void ParseData(DataTable table)
+		{
+			foreach (DataRow row in table.Rows) {
+				var hdvClass = VehicleClassHelper.Parse(row.Field<string>("hdvclass"));
+				var technology = row.Field<string>("technology");
+				foreach (DataColumn col in table.Columns) {
+					var value = row.ParseDoubleOrGetDefault(col.Caption, double.NaN);
+					if (col.Caption != "hdvclass" && col.Caption != "technology" && !double.IsNaN(value)) {
+						Data[Tuple.Create(col.Caption.ParseEnum<MissionType>(), technology, hdvClass)] = new AuxDemandEntry() {
+							PowerDemand = value.SI<Watt>()
+						};
+					}
+				}
+			}
+			Technologies = Data.Select(x => x.Key.Item2).Distinct().ToList();
+		}
+
+		public string[] GetTechnologies()
+		{
+			return Technologies.ToArray();
+		}
+	}
 }
\ No newline at end of file
diff --git a/VectoCore/VectoCore/Models/Declaration/LookupData.cs b/VectoCore/VectoCore/Models/Declaration/LookupData.cs
index 933841f9c4fb0c38702425b2f45a511fb1e7fc9f..18a24da2aaa0ae03aebded43a37ba0a35e3c5847 100644
--- a/VectoCore/VectoCore/Models/Declaration/LookupData.cs
+++ b/VectoCore/VectoCore/Models/Declaration/LookupData.cs
@@ -29,91 +29,91 @@
 *   Martin Rexeis, rexeis@ivt.tugraz.at, IVT, Graz University of Technology
 */
 
-using System;
-using System.Collections.Generic;
-using System.Data;
-using TUGraz.VectoCommon.Exceptions;
-using TUGraz.VectoCommon.Models;
-using TUGraz.VectoCommon.Utils;
-using TUGraz.VectoCore.Utils;
-
-namespace TUGraz.VectoCore.Models.Declaration
-{
-	public abstract class LookupData : LoggingObject
-	{
-		protected abstract string ResourceId { get; }
-		protected abstract string ErrorMessage { get; }
-		protected abstract void ParseData(DataTable table);
-
-		protected LookupData()
-		{
-			if (!string.IsNullOrWhiteSpace(ResourceId)) {
-				var table = ReadCsvResource(ResourceId);
-				NormalizeTable(table);
-				ParseData(table);
-			}
-		}
-
-		protected static DataTable ReadCsvResource(string resourceId)
-		{
-			return VectoCSVFile.ReadStream(RessourceHelper.ReadStream(resourceId), source: resourceId);
-		}
-
-		protected static void NormalizeTable(DataTable table)
-		{
-			foreach (DataColumn col in table.Columns) {
-				table.Columns[col.ColumnName].ColumnName = col.ColumnName.ToLower().RemoveWhitespace();
-			}
-		}
-	}
-
-	public abstract class LookupData<TKey, TValue> : LookupData
-	{
-		protected Dictionary<TKey, TValue> Data = new Dictionary<TKey, TValue>();
-
-		public virtual TValue Lookup(TKey key)
-		{
-			try {
-				return Data[key];
-			} catch (KeyNotFoundException) {
-				throw new VectoException(string.Format(ErrorMessage, key));
-			}
-		}
-	}
-
-	public abstract class LookupData<TKey1, TKey2, TValue> : LookupData
-	{
-		protected readonly Dictionary<Tuple<TKey1, TKey2>, TValue> Data = new Dictionary<Tuple<TKey1, TKey2>, TValue>();
-
-		public virtual TValue Lookup(TKey1 key1, TKey2 key2)
-		{
-			try {
-				return Data[Tuple.Create(key1, key2)];
-			} catch (KeyNotFoundException) {
-				throw new VectoException(string.Format(ErrorMessage, key1, key2));
-			}
-		}
-	}
-
-	public abstract class LookupData<TKey1, TKey2, TKey3, TValue> : LookupData
-	{
-		protected readonly Dictionary<Tuple<TKey1, TKey2, TKey3>, TValue> Data =
-			new Dictionary<Tuple<TKey1, TKey2, TKey3>, TValue>();
-
-		public virtual TValue Lookup(TKey1 key1, TKey2 key2, TKey3 key3)
-		{
-			try {
-				return Data[Tuple.Create(key1, key2, key3)];
-			} catch (KeyNotFoundException) {
-				throw new VectoException(string.Format(ErrorMessage, key1, key2, key3));
-			}
-		}
-
-		//public abstract TValue Lookup(TKey1 key1, TKey2 key2, TKey3 key3);
-	}
-
-	public abstract class LookupData<TKey1, TKey2, TKey3, TKey4, TValue> : LookupData
-	{
-		public abstract TValue Lookup(TKey1 key1, TKey2 key2, TKey3 key3, TKey4 key4);
-	}
+using System;
+using System.Collections.Generic;
+using System.Data;
+using TUGraz.VectoCommon.Exceptions;
+using TUGraz.VectoCommon.Models;
+using TUGraz.VectoCommon.Utils;
+using TUGraz.VectoCore.Utils;
+
+namespace TUGraz.VectoCore.Models.Declaration
+{
+	public abstract class LookupData : LoggingObject
+	{
+		protected abstract string ResourceId { get; }
+		protected abstract string ErrorMessage { get; }
+		protected abstract void ParseData(DataTable table);
+
+		protected LookupData()
+		{
+			if (!string.IsNullOrWhiteSpace(ResourceId)) {
+				var table = ReadCsvResource(ResourceId);
+				NormalizeTable(table);
+				ParseData(table);
+			}
+		}
+
+		protected static DataTable ReadCsvResource(string resourceId)
+		{
+			return VectoCSVFile.ReadStream(RessourceHelper.ReadStream(resourceId), source: resourceId);
+		}
+
+		protected static void NormalizeTable(DataTable table)
+		{
+			foreach (DataColumn col in table.Columns) {
+				table.Columns[col.ColumnName].ColumnName = col.ColumnName.ToLower().RemoveWhitespace();
+			}
+		}
+	}
+
+	public abstract class LookupData<TKey, TValue> : LookupData where TValue : struct
+	{
+		protected Dictionary<TKey, TValue> Data = new Dictionary<TKey, TValue>();
+
+		public virtual TValue Lookup(TKey key)
+		{
+			try {
+				return Data[key];
+			} catch (KeyNotFoundException) {
+				throw new VectoException(string.Format(ErrorMessage, key));
+			}
+		}
+	}
+
+	public abstract class LookupData<TKey1, TKey2, TValue> : LookupData where TValue : struct
+	{
+		protected readonly Dictionary<Tuple<TKey1, TKey2>, TValue> Data = new Dictionary<Tuple<TKey1, TKey2>, TValue>();
+
+		public virtual TValue Lookup(TKey1 key1, TKey2 key2)
+		{
+			try {
+				return Data[Tuple.Create(key1, key2)];
+			} catch (KeyNotFoundException) {
+				throw new VectoException(string.Format(ErrorMessage, key1, key2));
+			}
+		}
+	}
+
+	public abstract class LookupData<TKey1, TKey2, TKey3, TValue> : LookupData where TValue : struct
+	{
+		protected readonly Dictionary<Tuple<TKey1, TKey2, TKey3>, TValue> Data =
+			new Dictionary<Tuple<TKey1, TKey2, TKey3>, TValue>();
+
+		public virtual TValue Lookup(TKey1 key1, TKey2 key2, TKey3 key3)
+		{
+			try {
+				return Data[Tuple.Create(key1, key2, key3)];
+			} catch (KeyNotFoundException) {
+				throw new VectoException(string.Format(ErrorMessage, key1, key2, key3));
+			}
+		}
+
+		//public abstract TValue Lookup(TKey1 key1, TKey2 key2, TKey3 key3);
+	}
+
+	public abstract class LookupData<TKey1, TKey2, TKey3, TKey4, TValue> : LookupData where TValue : struct
+	{
+		public abstract TValue Lookup(TKey1 key1, TKey2 key2, TKey3 key3, TKey4 key4);
+	}
 }
\ No newline at end of file
diff --git a/VectoCore/VectoCore/Models/Declaration/PT1.cs b/VectoCore/VectoCore/Models/Declaration/PT1.cs
index 085011993d36a09c8c38a32853a15d12ceca7209..f4737177eccfedc65f67dc12f3d09f6fd6b2c402 100644
--- a/VectoCore/VectoCore/Models/Declaration/PT1.cs
+++ b/VectoCore/VectoCore/Models/Declaration/PT1.cs
@@ -29,101 +29,101 @@
 *   Martin Rexeis, rexeis@ivt.tugraz.at, IVT, Graz University of Technology
 */
 
-using System;
-using System.Collections.Generic;
-using System.Data;
-using System.Linq;
-using TUGraz.VectoCommon.Exceptions;
-using TUGraz.VectoCommon.Utils;
-using TUGraz.VectoCore.Utils;
-
-namespace TUGraz.VectoCore.Models.Declaration
-{
-	public sealed class PT1 : LookupData<PerSecond, PT1.PT1Result>
-	{
-		protected override string ResourceId
-		{
-			get { return DeclarationData.DeclarationDataResourcePrefix + ".PT1.csv"; }
-		}
-
-		protected override string ErrorMessage
-		{
-			get { throw new InvalidOperationException("ErrorMessage not applicable."); }
-		}
-
-		private List<KeyValuePair<PerSecond, Second>> _entries;
-
-		public PT1()
-		{
-			ParseData(ReadCsvResource(ResourceId));
-		}
-
-		public PT1(DataTable data)
-		{
-			ParseDataFromFld(data);
-		}
-
-		protected override void ParseData(DataTable table)
-		{
-			_entries = table.Rows.Cast<DataRow>()
-				.Select(r => new KeyValuePair<PerSecond, Second>(r.ParseDouble("rpm").RPMtoRad(), r.ParseDouble("PT1").SI<Second>()))
-				.OrderBy(x => x.Key)
-				.ToList();
-		}
-
-		private void ParseDataFromFld(DataTable data)
-		{
-			if (data.Columns.Count < 3) {
-				throw new VectoException("FullLoadCurve/PT1 Data File must consist of at least 4 columns.");
-			}
-
-			if (data.Rows.Count < 2) {
-				throw new VectoException(
-					"FullLoadCurve/PT1 must consist of at least two lines with numeric values (below file header)");
-			}
-
-			if (data.Columns.Contains(Fields.EngineSpeed) && data.Columns.Contains(Fields.PT1)) {
-				_entries = data.Rows.Cast<DataRow>()
-					.Select(
-						r => new KeyValuePair<PerSecond, Second>(r.ParseDouble(Fields.EngineSpeed).RPMtoRad(),
-							r.ParseDouble(Fields.PT1).SI<Second>()))
-					.OrderBy(x => x.Key).ToList();
-			} else {
-				_entries = data.Rows.Cast<DataRow>()
-					.Select(r => new KeyValuePair<PerSecond, Second>(r.ParseDouble(0).RPMtoRad(), r.ParseDouble(3).SI<Second>()))
-					.OrderBy(x => x.Key).ToList();
-			}
-		}
-
-		public override PT1Result Lookup(PerSecond key)
-		{
-			var extrapolated = key.IsSmaller(_entries[0].Key) || key.IsGreater(_entries.Last().Key);
-
-			var index = _entries.FindIndex(x => x.Key.IsGreater(key));
-			if (index <= 0) {
-				index = key.IsGreater(_entries[0].Key) ? _entries.Count - 1 : 1;
-			}
-
-			var pt1 = VectoMath.Interpolate(_entries[index - 1].Key, _entries[index].Key, _entries[index - 1].Value,
-				_entries[index].Value, key);
-			if (pt1 < 0) {
-				pt1 = 0.SI<Second>();
-				extrapolated = true;
-				//throw new VectoException("The calculated pt1 value must not be smaller than 0. Value: " + pt1);
-			}
-			return new PT1Result() { Value = pt1, Extrapolated = extrapolated };
-		}
-
-		private static class Fields
-		{
-			public const string PT1 = "PT1";
-			public const string EngineSpeed = "engine speed";
-		}
-
-		public class PT1Result
-		{
-			public Second Value;
-			public bool Extrapolated;
-		}
-	}
+using System;
+using System.Collections.Generic;
+using System.Data;
+using System.Linq;
+using TUGraz.VectoCommon.Exceptions;
+using TUGraz.VectoCommon.Utils;
+using TUGraz.VectoCore.Utils;
+
+namespace TUGraz.VectoCore.Models.Declaration
+{
+	public sealed class PT1 : LookupData<PerSecond, PT1.PT1Result>
+	{
+		protected override string ResourceId
+		{
+			get { return DeclarationData.DeclarationDataResourcePrefix + ".PT1.csv"; }
+		}
+
+		protected override string ErrorMessage
+		{
+			get { throw new InvalidOperationException("ErrorMessage not applicable."); }
+		}
+
+		private List<KeyValuePair<PerSecond, Second>> _entries;
+
+		public PT1()
+		{
+			ParseData(ReadCsvResource(ResourceId));
+		}
+
+		public PT1(DataTable data)
+		{
+			ParseDataFromFld(data);
+		}
+
+		protected override void ParseData(DataTable table)
+		{
+			_entries = table.Rows.Cast<DataRow>()
+				.Select(r => new KeyValuePair<PerSecond, Second>(r.ParseDouble("rpm").RPMtoRad(), r.ParseDouble("PT1").SI<Second>()))
+				.OrderBy(x => x.Key)
+				.ToList();
+		}
+
+		private void ParseDataFromFld(DataTable data)
+		{
+			if (data.Columns.Count < 3) {
+				throw new VectoException("FullLoadCurve/PT1 Data File must consist of at least 4 columns.");
+			}
+
+			if (data.Rows.Count < 2) {
+				throw new VectoException(
+					"FullLoadCurve/PT1 must consist of at least two lines with numeric values (below file header)");
+			}
+
+			if (data.Columns.Contains(Fields.EngineSpeed) && data.Columns.Contains(Fields.PT1)) {
+				_entries = data.Rows.Cast<DataRow>()
+					.Select(
+						r => new KeyValuePair<PerSecond, Second>(r.ParseDouble(Fields.EngineSpeed).RPMtoRad(),
+							r.ParseDouble(Fields.PT1).SI<Second>()))
+					.OrderBy(x => x.Key).ToList();
+			} else {
+				_entries = data.Rows.Cast<DataRow>()
+					.Select(r => new KeyValuePair<PerSecond, Second>(r.ParseDouble(0).RPMtoRad(), r.ParseDouble(3).SI<Second>()))
+					.OrderBy(x => x.Key).ToList();
+			}
+		}
+
+		public override PT1Result Lookup(PerSecond key)
+		{
+			var extrapolated = key.IsSmaller(_entries[0].Key) || key.IsGreater(_entries.Last().Key);
+
+			var index = _entries.FindIndex(x => x.Key.IsGreater(key));
+			if (index <= 0) {
+				index = key.IsGreater(_entries[0].Key) ? _entries.Count - 1 : 1;
+			}
+
+			var pt1 = VectoMath.Interpolate(_entries[index - 1].Key, _entries[index].Key, _entries[index - 1].Value,
+				_entries[index].Value, key);
+			if (pt1 < 0) {
+				pt1 = 0.SI<Second>();
+				extrapolated = true;
+				//throw new VectoException("The calculated pt1 value must not be smaller than 0. Value: " + pt1);
+			}
+			return new PT1Result() { Value = pt1, Extrapolated = extrapolated };
+		}
+
+		private static class Fields
+		{
+			public const string PT1 = "PT1";
+			public const string EngineSpeed = "engine speed";
+		}
+
+		public struct PT1Result
+		{
+			public Second Value;
+			public bool Extrapolated;
+		}
+	}
 }
\ No newline at end of file
diff --git a/VectoCore/VectoCore/Models/Declaration/PTOTransmission.cs b/VectoCore/VectoCore/Models/Declaration/PTOTransmission.cs
index ffbfd1fe09992698d6005baebbdd03d6b0a355d4..1231691fafa4537d39eeae34daa7b8928bceb9d3 100644
--- a/VectoCore/VectoCore/Models/Declaration/PTOTransmission.cs
+++ b/VectoCore/VectoCore/Models/Declaration/PTOTransmission.cs
@@ -36,7 +36,7 @@ using TUGraz.VectoCore.Utils;
 
 namespace TUGraz.VectoCore.Models.Declaration
 {
-	public sealed class PTOTransmission : LookupData<string, Watt>, IDeclarationAuxiliaryTable
+	public sealed class PTOTransmission : LookupData<string, AuxDemandEntry>, IDeclarationAuxiliaryTable
 	{
 		public const string NoPTO = "None";
 
@@ -54,7 +54,7 @@ namespace TUGraz.VectoCore.Models.Declaration
 		{
 			Data = table.Rows.Cast<DataRow>().ToDictionary(
 				r => r.Field<string>("technology"),
-				r => r.ParseDouble("powerloss").SI<Watt>());
+				r => new AuxDemandEntry { PowerDemand = r.ParseDouble("powerloss").SI<Watt>() });
 		}
 
 		public string[] GetTechnologies()
diff --git a/VectoCore/VectoCore/Models/Declaration/Payloads.cs b/VectoCore/VectoCore/Models/Declaration/Payloads.cs
index 1203a2743e97da58e26745287bd0808b86a2d8b6..be9d124b14d6a4971662cba681b86d05173723ce 100644
--- a/VectoCore/VectoCore/Models/Declaration/Payloads.cs
+++ b/VectoCore/VectoCore/Models/Declaration/Payloads.cs
@@ -29,72 +29,72 @@
 *   Martin Rexeis, rexeis@ivt.tugraz.at, IVT, Graz University of Technology
 */
 
-using System;
-using System.Data;
-using System.Linq;
-using TUGraz.VectoCommon.Utils;
-using TUGraz.VectoCore.Utils;
-
-namespace TUGraz.VectoCore.Models.Declaration
-{
-	public sealed class Payloads : LookupData<Kilogram, Payloads.PayloadEntry>
-	{
-		protected override string ResourceId
-		{
-			get { return DeclarationData.DeclarationDataResourcePrefix + ".Payloads.csv"; }
-		}
-
-		protected override string ErrorMessage
-		{
-			get { throw new InvalidOperationException("ErrorMessage not applicable."); }
-		}
-
-		public Kilogram Lookup10Percent(Kilogram grossVehicleWeight)
-		{
-			var section = Data.GetSection(d => d.Key > grossVehicleWeight);
-			return VectoMath.Interpolate(section.Item1.Key, section.Item2.Key,
-				section.Item1.Value.Payload10Percent, section.Item2.Value.Payload10Percent,
-				grossVehicleWeight);
-		}
-
-		public Kilogram Lookup50Percent(Kilogram grossVehicleWeight)
-		{
-			var section = Data.GetSection(d => d.Key > grossVehicleWeight);
-			return VectoMath.Interpolate(section.Item1.Key, section.Item2.Key,
-				section.Item1.Value.Payload50Percent, section.Item2.Value.Payload50Percent,
-				grossVehicleWeight);
-		}
-
-		public Kilogram Lookup75Percent(Kilogram grossVehicleWeight)
-		{
-			var section = Data.GetSection(d => d.Key > grossVehicleWeight);
-			return VectoMath.Interpolate(section.Item1.Key, section.Item2.Key,
-				section.Item1.Value.Payload75Percent, section.Item2.Value.Payload75Percent,
-				grossVehicleWeight);
-		}
-
-		public Kilogram LookupTrailer(Kilogram grossVehicleWeight, Kilogram curbWeight)
-		{
-			return 0.75 * (grossVehicleWeight - curbWeight);
-		}
-
-		protected override void ParseData(DataTable table)
-		{
-			Data = table.Rows.Cast<DataRow>()
-				.ToDictionary(
-					kv => kv.ParseDouble("grossvehicleweight").SI<Kilogram>(),
-					kv => new PayloadEntry {
-						Payload10Percent = kv.ParseDouble("payload10%").SI<Kilogram>(),
-						Payload50Percent = kv.ParseDouble("payload50%").SI<Kilogram>(),
-						Payload75Percent = kv.ParseDouble("payload75%").SI<Kilogram>()
-					});
-		}
-
-		public sealed class PayloadEntry
-		{
-			public Kilogram Payload10Percent;
-			public Kilogram Payload50Percent;
-			public Kilogram Payload75Percent;
-		}
-	}
+using System;
+using System.Data;
+using System.Linq;
+using TUGraz.VectoCommon.Utils;
+using TUGraz.VectoCore.Utils;
+
+namespace TUGraz.VectoCore.Models.Declaration
+{
+	public sealed class Payloads : LookupData<Kilogram, Payloads.PayloadEntry>
+	{
+		protected override string ResourceId
+		{
+			get { return DeclarationData.DeclarationDataResourcePrefix + ".Payloads.csv"; }
+		}
+
+		protected override string ErrorMessage
+		{
+			get { throw new InvalidOperationException("ErrorMessage not applicable."); }
+		}
+
+		public Kilogram Lookup10Percent(Kilogram grossVehicleWeight)
+		{
+			var section = Data.GetSection(d => d.Key > grossVehicleWeight);
+			return VectoMath.Interpolate(section.Item1.Key, section.Item2.Key,
+				section.Item1.Value.Payload10Percent, section.Item2.Value.Payload10Percent,
+				grossVehicleWeight);
+		}
+
+		public Kilogram Lookup50Percent(Kilogram grossVehicleWeight)
+		{
+			var section = Data.GetSection(d => d.Key > grossVehicleWeight);
+			return VectoMath.Interpolate(section.Item1.Key, section.Item2.Key,
+				section.Item1.Value.Payload50Percent, section.Item2.Value.Payload50Percent,
+				grossVehicleWeight);
+		}
+
+		public Kilogram Lookup75Percent(Kilogram grossVehicleWeight)
+		{
+			var section = Data.GetSection(d => d.Key > grossVehicleWeight);
+			return VectoMath.Interpolate(section.Item1.Key, section.Item2.Key,
+				section.Item1.Value.Payload75Percent, section.Item2.Value.Payload75Percent,
+				grossVehicleWeight);
+		}
+
+		public Kilogram LookupTrailer(Kilogram grossVehicleWeight, Kilogram curbWeight)
+		{
+			return 0.75 * (grossVehicleWeight - curbWeight);
+		}
+
+		protected override void ParseData(DataTable table)
+		{
+			Data = table.Rows.Cast<DataRow>()
+				.ToDictionary(
+					kv => kv.ParseDouble("grossvehicleweight").SI<Kilogram>(),
+					kv => new PayloadEntry {
+						Payload10Percent = kv.ParseDouble("payload10%").SI<Kilogram>(),
+						Payload50Percent = kv.ParseDouble("payload50%").SI<Kilogram>(),
+						Payload75Percent = kv.ParseDouble("payload75%").SI<Kilogram>()
+					});
+		}
+
+		public struct PayloadEntry
+		{
+			public Kilogram Payload10Percent;
+			public Kilogram Payload50Percent;
+			public Kilogram Payload75Percent;
+		}
+	}
 }
\ No newline at end of file
diff --git a/VectoCore/VectoCore/Models/Declaration/PneumaticSystem.cs b/VectoCore/VectoCore/Models/Declaration/PneumaticSystem.cs
index 4f4194b90a29696a8db9f54f66968853a85d6403..ef291b23cd70ad0a2d0e478a3f61b2041245cc1a 100644
--- a/VectoCore/VectoCore/Models/Declaration/PneumaticSystem.cs
+++ b/VectoCore/VectoCore/Models/Declaration/PneumaticSystem.cs
@@ -37,7 +37,7 @@ using TUGraz.VectoCore.Utils;
 
 namespace TUGraz.VectoCore.Models.Declaration
 {
-	public sealed class PneumaticSystem : LookupData<MissionType, string, Watt>, IDeclarationAuxiliaryTable
+	public sealed class PneumaticSystem : LookupData<MissionType, string, AuxDemandEntry>, IDeclarationAuxiliaryTable
 	{
 		protected override string ResourceId
 		{
@@ -55,7 +55,9 @@ namespace TUGraz.VectoCore.Models.Declaration
 				var technology = row.Field<string>("technology");
 				foreach (DataColumn col in table.Columns) {
 					if (col.Caption != "technology") {
-						Data[Tuple.Create(col.Caption.ParseEnum<MissionType>(), technology)] = row.ParseDouble(col.Caption).SI<Watt>();
+						Data[Tuple.Create(col.Caption.ParseEnum<MissionType>(), technology)] = new AuxDemandEntry() {
+							PowerDemand = row.ParseDouble(col.Caption).SI<Watt>()
+						};
 					}
 				}
 			}
diff --git a/VectoCore/VectoCore/Models/Declaration/Segment.cs b/VectoCore/VectoCore/Models/Declaration/Segment.cs
index aa0627c1736abbd73aa7e080d42a234e0c493a4c..2dee8dfb6e52a66d25d37cc9d200cce51224c156 100644
--- a/VectoCore/VectoCore/Models/Declaration/Segment.cs
+++ b/VectoCore/VectoCore/Models/Declaration/Segment.cs
@@ -35,8 +35,10 @@ using TUGraz.VectoCommon.Utils;
 
 namespace TUGraz.VectoCore.Models.Declaration
 {
-	public class Segment
+	public struct Segment
 	{
+		public bool Found;
+		
 		public VehicleClass VehicleClass { get; internal set; }
 
 		public VehicleCategory VehicleCategory { get; set; }
diff --git a/VectoCore/VectoCore/Models/Declaration/Segments.cs b/VectoCore/VectoCore/Models/Declaration/Segments.cs
index f070c9e29b1c41c2d2131dc48e2165dbcc551461..7f4e8ab244a66b4d0cf4ac2d545f173b8078d200 100644
--- a/VectoCore/VectoCore/Models/Declaration/Segments.cs
+++ b/VectoCore/VectoCore/Models/Declaration/Segments.cs
@@ -78,8 +78,12 @@ namespace TUGraz.VectoCore.Models.Declaration
 			}
 
 			var row = GetSegmentDataRow(vehicleCategory, axleConfiguration, grossVehicleMassRating, considerInvalid);
+			if (row == null) {
+				return new Segment() { Found = false };
+			}
 
 			var segment = new Segment {
+				Found = true,
 				GrossVehicleWeightMin = row.ParseDouble("gvw_min").SI().Ton.Cast<Kilogram>(),
 				GrossVehicleWeightMax = row.ParseDouble("gvw_max").SI().Ton.Cast<Kilogram>(),
 				VehicleCategory = vehicleCategory,
diff --git a/VectoCore/VectoCore/Models/Declaration/StandardBodies.cs b/VectoCore/VectoCore/Models/Declaration/StandardBodies.cs
index 9b34acee42590d6b9733112cfda713842f067a21..f19aa9fb02fee03c6bef1810adbe47b8aeb565ef 100644
--- a/VectoCore/VectoCore/Models/Declaration/StandardBodies.cs
+++ b/VectoCore/VectoCore/Models/Declaration/StandardBodies.cs
@@ -29,105 +29,105 @@
 *   Martin Rexeis, rexeis@ivt.tugraz.at, IVT, Graz University of Technology
 */
 
-using System;
-using System.Collections.Generic;
-using System.Data;
-using System.Linq;
-using TUGraz.VectoCommon.Utils;
-using TUGraz.VectoCore.Utils;
-
-namespace TUGraz.VectoCore.Models.Declaration
-{
-	public sealed class StandardBody
-	{
-		public readonly Kilogram CurbWeight;
-		public readonly Kilogram GrossVehicleWeight;
-		public readonly SquareMeter[] DeltaCrossWindArea;
-		public readonly string Name;
-		public readonly List<Wheels.Entry> Wheels;
-		public readonly CubicMeter CargoVolume;
-
-		public Kilogram MaxPayLoad
-		{
-			get { return GrossVehicleWeight - CurbWeight; }
-		}
-
-		public StandardBody(string name, Kilogram curbWeight, Kilogram grossVehicleWeight, SquareMeter[] deltaCrossWindArea,
-			Wheels.Entry wheels, int axleCount, CubicMeter volume) :
-				this(name, curbWeight, grossVehicleWeight, deltaCrossWindArea,
-					wheels == null ? new List<Wheels.Entry>() : Enumerable.Repeat(wheels, axleCount).ToList(), volume) {}
-
-		private StandardBody(string name, Kilogram curbWeight, Kilogram grossVehicleWeight, SquareMeter[] deltaCrossWindArea,
-			List<Wheels.Entry> wheels, CubicMeter volume)
-		{
-			Name = name;
-			CurbWeight = curbWeight;
-			GrossVehicleWeight = grossVehicleWeight;
-			DeltaCrossWindArea = deltaCrossWindArea;
-			Wheels = wheels;
-			CargoVolume = volume;
-		}
-
-		//public static StandardBody operator +(StandardBody first, StandardBody second)
-		//{
-		//	var wheels = new List<Wheels.Entry>(first.Wheels);
-		//	wheels.AddRange(second.Wheels);
-		//	return new StandardBody(first.Name + second.Name, first.CurbWeight + second.CurbWeight,
-		//		first.GrossVehicleWeight + second.GrossVehicleWeight,
-		//		first.DeltaCrossWindArea + second.DeltaCrossWindArea,
-		//		wheels, first.CargoVolume + second.TotalCargoVolume);
-		//}
-	}
-
-	/// <summary>
-	/// Lookup Class for Standard Weights of Bodies, Trailers and Semitrailers.
-	/// Standard Weights include 
-	///		CurbWeight (=Empty Weight), 
-	///		Gross Vehicle Weight (=Maximum Allowed Weight),
-	///		MaxPayload,
-	///     DeltaCrossWindArea,
-	///     Wheels
-	/// </summary>
-	public sealed class StandardBodies : LookupData<string, StandardBody>
-	{
-		public static readonly StandardBody Empty = new StandardBody("", 0.SI<Kilogram>(), 0.SI<Kilogram>(),
-			new[] { 0.SI<SquareMeter>(), 0.SI<SquareMeter>() }, null, 0, 0.SI<CubicMeter>());
-
-		protected override string ResourceId
-		{
-			get { return DeclarationData.DeclarationDataResourcePrefix + ".Body_Trailers_Weights.csv"; }
-		}
-
-		protected override string ErrorMessage
-		{
-			get { return "StandardWeigths Lookup Error: No value found for ID '{0}'"; }
-		}
-
-		public override StandardBody Lookup(string id)
-		{
-			return string.IsNullOrWhiteSpace(id) ? Empty : base.Lookup(id);
-		}
-
-		protected override void ParseData(DataTable table)
-		{
-			Data = table.Rows.Cast<DataRow>().Select(k => {
-				var deltaCdxAStr = k.Field<string>("deltacdxafortraileroperationinlonghaul");
-				var deltaCdxA = new[] { 0.SI<SquareMeter>(), 0.SI<SquareMeter>() };
-				if (!deltaCdxAStr.Equals("-")) {
-					deltaCdxA = deltaCdxAStr.Split('/').Select(x => x.ToDouble().SI<SquareMeter>()).ToArray();
-				}
-				return new StandardBody(
-					k.Field<string>("name"),
-					k.ParseDoubleOrGetDefault("curbmass").SI<Kilogram>(),
-					k.ParseDoubleOrGetDefault("maxgrossmass").SI<Kilogram>(),
-					deltaCdxA,
-					!string.IsNullOrWhiteSpace(k.Field<string>("wheels"))
-						? DeclarationData.Wheels.Lookup(k.Field<string>("wheels"))
-						: null,
-					Int32.Parse(k.Field<string>("axlecount")),
-					k.ParseDouble("cargovolume").SI<CubicMeter>());
-			})
-				.ToDictionary(kv => kv.Name);
-		}
-	}
+using System;
+using System.Collections.Generic;
+using System.Data;
+using System.Linq;
+using TUGraz.VectoCommon.Utils;
+using TUGraz.VectoCore.Utils;
+
+namespace TUGraz.VectoCore.Models.Declaration
+{
+	public struct StandardBody
+	{
+		public readonly Kilogram CurbWeight;
+		public readonly Kilogram GrossVehicleWeight;
+		public readonly SquareMeter[] DeltaCrossWindArea;
+		public readonly string Name;
+		public readonly List<Wheels.Entry> Wheels;
+		public readonly CubicMeter CargoVolume;
+
+		public Kilogram MaxPayLoad
+		{
+			get { return GrossVehicleWeight - CurbWeight; }
+		}
+
+		public StandardBody(string name, Kilogram curbWeight, Kilogram grossVehicleWeight, SquareMeter[] deltaCrossWindArea,
+			Wheels.Entry? wheels, int axleCount, CubicMeter volume) :
+				this(name, curbWeight, grossVehicleWeight, deltaCrossWindArea,
+					!wheels.HasValue ? new List<Wheels.Entry>() : Enumerable.Repeat(wheels.Value, axleCount).ToList(), volume) {}
+
+		private StandardBody(string name, Kilogram curbWeight, Kilogram grossVehicleWeight, SquareMeter[] deltaCrossWindArea,
+			List<Wheels.Entry> wheels, CubicMeter volume)
+		{
+			Name = name;
+			CurbWeight = curbWeight;
+			GrossVehicleWeight = grossVehicleWeight;
+			DeltaCrossWindArea = deltaCrossWindArea;
+			Wheels = wheels;
+			CargoVolume = volume;
+		}
+
+		//public static StandardBody operator +(StandardBody first, StandardBody second)
+		//{
+		//	var wheels = new List<Wheels.Entry>(first.Wheels);
+		//	wheels.AddRange(second.Wheels);
+		//	return new StandardBody(first.Name + second.Name, first.CurbWeight + second.CurbWeight,
+		//		first.GrossVehicleWeight + second.GrossVehicleWeight,
+		//		first.DeltaCrossWindArea + second.DeltaCrossWindArea,
+		//		wheels, first.CargoVolume + second.TotalCargoVolume);
+		//}
+	}
+
+	/// <summary>
+	/// Lookup Class for Standard Weights of Bodies, Trailers and Semitrailers.
+	/// Standard Weights include 
+	///		CurbWeight (=Empty Weight), 
+	///		Gross Vehicle Weight (=Maximum Allowed Weight),
+	///		MaxPayload,
+	///     DeltaCrossWindArea,
+	///     Wheels
+	/// </summary>
+	public sealed class StandardBodies : LookupData<string, StandardBody>
+	{
+		public static readonly StandardBody Empty = new StandardBody("", 0.SI<Kilogram>(), 0.SI<Kilogram>(),
+			new[] { 0.SI<SquareMeter>(), 0.SI<SquareMeter>() }, null, 0, 0.SI<CubicMeter>());
+
+		protected override string ResourceId
+		{
+			get { return DeclarationData.DeclarationDataResourcePrefix + ".Body_Trailers_Weights.csv"; }
+		}
+
+		protected override string ErrorMessage
+		{
+			get { return "StandardWeigths Lookup Error: No value found for ID '{0}'"; }
+		}
+
+		public override StandardBody Lookup(string id)
+		{
+			return string.IsNullOrWhiteSpace(id) ? Empty : base.Lookup(id);
+		}
+
+		protected override void ParseData(DataTable table)
+		{
+			Data = table.Rows.Cast<DataRow>().Select(k => {
+				var deltaCdxAStr = k.Field<string>("deltacdxafortraileroperationinlonghaul");
+				var deltaCdxA = new[] { 0.SI<SquareMeter>(), 0.SI<SquareMeter>() };
+				if (!deltaCdxAStr.Equals("-")) {
+					deltaCdxA = deltaCdxAStr.Split('/').Select(x => x.ToDouble().SI<SquareMeter>()).ToArray();
+				}
+				return new StandardBody(
+					k.Field<string>("name"),
+					k.ParseDoubleOrGetDefault("curbmass").SI<Kilogram>(),
+					k.ParseDoubleOrGetDefault("maxgrossmass").SI<Kilogram>(),
+					deltaCdxA,
+					!string.IsNullOrWhiteSpace(k.Field<string>("wheels"))
+						? DeclarationData.Wheels.Lookup(k.Field<string>("wheels"))
+						: (Wheels.Entry?)null,
+					int.Parse(k.Field<string>("axlecount")),
+					k.ParseDouble("cargovolume").SI<CubicMeter>());
+			})
+				.ToDictionary(kv => kv.Name);
+		}
+	}
 }
\ No newline at end of file
diff --git a/VectoCore/VectoCore/Models/Declaration/SteeringPump.cs b/VectoCore/VectoCore/Models/Declaration/SteeringPump.cs
index 8b0ec360f361a9866664f2ac8cf29f26b5c5161a..2089c310f32077c1d6e54338a784dd03a9e089c8 100644
--- a/VectoCore/VectoCore/Models/Declaration/SteeringPump.cs
+++ b/VectoCore/VectoCore/Models/Declaration/SteeringPump.cs
@@ -178,7 +178,7 @@ namespace TUGraz.VectoCore.Models.Declaration
 			}
 		}
 
-		private class SteeringPumpValues<T>
+		private struct SteeringPumpValues<T>
 		{
 			public T UnloadedFriction;
 			public T Banking;
diff --git a/VectoCore/VectoCore/Models/Declaration/WHTCCorrection.cs b/VectoCore/VectoCore/Models/Declaration/WHTCCorrection.cs
index 48f214845805dfe649099f9247f5a8773dcfbbf8..94e7ea1ed6641251467d3161d48b9a7c2605ab65 100644
--- a/VectoCore/VectoCore/Models/Declaration/WHTCCorrection.cs
+++ b/VectoCore/VectoCore/Models/Declaration/WHTCCorrection.cs
@@ -71,7 +71,7 @@ namespace TUGraz.VectoCore.Models.Declaration
 			}
 		}
 
-		private class Entry
+		private struct Entry
 		{
 			public double Rural;
 			public double Urban;
diff --git a/VectoCore/VectoCore/Models/Declaration/Wheels.cs b/VectoCore/VectoCore/Models/Declaration/Wheels.cs
index c19a08e0a288a8899ae8a80dc1d0ec2b80069ab3..9bf7e401338c9498168ed13b54796e9384125aee 100644
--- a/VectoCore/VectoCore/Models/Declaration/Wheels.cs
+++ b/VectoCore/VectoCore/Models/Declaration/Wheels.cs
@@ -29,61 +29,61 @@
 *   Martin Rexeis, rexeis@ivt.tugraz.at, IVT, Graz University of Technology
 */
 
-using System;
-using System.Data;
-using System.Linq;
-using TUGraz.VectoCommon.Utils;
-using TUGraz.VectoCore.Utils;
-
-namespace TUGraz.VectoCore.Models.Declaration
-{
-	public sealed class Wheels : LookupData<string, Wheels.Entry>
-	{
-		private string[] _dimensions;
-
-		protected override string ResourceId
-		{
-			get { return DeclarationData.DeclarationDataResourcePrefix + ".Wheels.csv"; }
-		}
-
-		protected override string ErrorMessage
-		{
-			get { return "Wheels Lookup Error: No value found for Wheels. Key: '{0}'"; }
-		}
-
-		public override Entry Lookup(string key)
-		{
-			return base.Lookup(key.RemoveWhitespace());
-		}
-
-		protected override void ParseData(DataTable table)
-		{
-			Data = table.Rows.Cast<DataRow>()
-				.Select(row => new Entry {
-					WheelType = row.Field<string>(0).RemoveWhitespace(),
-					Inertia = row.ParseDouble("inertia").SI<KilogramSquareMeter>(),
-					WheelsDiameter = row.ParseDouble("d").SI().Milli.Meter.Cast<Meter>(),
-					CircumferenceFactor = row.ParseDouble("f")
-				}).ToDictionary(e => e.WheelType);
-			_dimensions = table.Rows.Cast<DataRow>().Select(row => row.Field<string>(0)).ToArray();
-		}
-
-		public class Entry
-		{
-			public string WheelType;
-			public KilogramSquareMeter Inertia;
-			public Meter WheelsDiameter;
-			public double CircumferenceFactor;
-
-			public Meter DynamicTyreRadius
-			{
-				get { return WheelsDiameter * CircumferenceFactor / (2 * Math.PI); }
-			}
-		}
-
-		public string[] GetWheelsDimensions()
-		{
-			return _dimensions;
-		}
-	}
+using System;
+using System.Data;
+using System.Linq;
+using TUGraz.VectoCommon.Utils;
+using TUGraz.VectoCore.Utils;
+
+namespace TUGraz.VectoCore.Models.Declaration
+{
+	public sealed class Wheels : LookupData<string, Wheels.Entry>
+	{
+		private string[] _dimensions;
+
+		protected override string ResourceId
+		{
+			get { return DeclarationData.DeclarationDataResourcePrefix + ".Wheels.csv"; }
+		}
+
+		protected override string ErrorMessage
+		{
+			get { return "Wheels Lookup Error: No value found for Wheels. Key: '{0}'"; }
+		}
+
+		public override Entry Lookup(string key)
+		{
+			return base.Lookup(key.RemoveWhitespace());
+		}
+
+		protected override void ParseData(DataTable table)
+		{
+			Data = table.Rows.Cast<DataRow>()
+				.Select(row => new Entry {
+					WheelType = row.Field<string>(0).RemoveWhitespace(),
+					Inertia = row.ParseDouble("inertia").SI<KilogramSquareMeter>(),
+					WheelsDiameter = row.ParseDouble("d").SI().Milli.Meter.Cast<Meter>(),
+					CircumferenceFactor = row.ParseDouble("f")
+				}).ToDictionary(e => e.WheelType);
+			_dimensions = table.Rows.Cast<DataRow>().Select(row => row.Field<string>(0)).ToArray();
+		}
+
+		public struct Entry
+		{
+			public string WheelType;
+			public KilogramSquareMeter Inertia;
+			public Meter WheelsDiameter;
+			public double CircumferenceFactor;
+
+			public Meter DynamicTyreRadius
+			{
+				get { return WheelsDiameter * CircumferenceFactor / (2 * Math.PI); }
+			}
+		}
+
+		public string[] GetWheelsDimensions()
+		{
+			return _dimensions;
+		}
+	}
 }
\ No newline at end of file
diff --git a/VectoCore/VectoCore/Models/Simulation/Impl/PowertrainBuilder.cs b/VectoCore/VectoCore/Models/Simulation/Impl/PowertrainBuilder.cs
index 9ffcefc470bfcdb0282dc8ca5c34e0426daf38fc..f677315e4e085472ae482fcf597976cf8ad75c4a 100644
--- a/VectoCore/VectoCore/Models/Simulation/Impl/PowertrainBuilder.cs
+++ b/VectoCore/VectoCore/Models/Simulation/Impl/PowertrainBuilder.cs
@@ -263,7 +263,7 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl
 
 			if (data.PTO != null) {
 				aux.AddConstant(Constants.Auxiliaries.IDs.PTOTransmission,
-					DeclarationData.PTOTransmission.Lookup(data.PTO.TransmissionType));
+					DeclarationData.PTOTransmission.Lookup(data.PTO.TransmissionType).PowerDemand);
 				container.ModalData.AddAuxiliary(Constants.Auxiliaries.IDs.PTOTransmission,
 					Constants.Auxiliaries.PowerPrefix + Constants.Auxiliaries.IDs.PTOTransmission);
 
diff --git a/VectoCore/VectoCore/OutputData/DeclarationReport.cs b/VectoCore/VectoCore/OutputData/DeclarationReport.cs
index 3ebf64a5186d0987ad6eb90ba3f3d25d3c429998..1167eee4a5069514f9a6e12fc19c8e3ef17ac702 100644
--- a/VectoCore/VectoCore/OutputData/DeclarationReport.cs
+++ b/VectoCore/VectoCore/OutputData/DeclarationReport.cs
@@ -29,134 +29,134 @@
 *   Martin Rexeis, rexeis@ivt.tugraz.at, IVT, Graz University of Technology
 */
 
-using System.Collections.Generic;
-using System.Runtime.CompilerServices;
-using TUGraz.VectoCommon.Exceptions;
-using TUGraz.VectoCore.Models.Declaration;
-using TUGraz.VectoCore.Models.Simulation.Data;
-using TUGraz.VectoCore.Models.Simulation.Impl;
-using TUGraz.VectoCore.Models.SimulationComponent.Data.Engine;
-
-namespace TUGraz.VectoCore.OutputData
-{
-	public interface IDeclarationReport
-	{
-		void PrepareResult(LoadingType loading, Mission mission, VectoRunData runData);
-		void AddResult(LoadingType loadingType, Mission mission, VectoRunData runData, IModalDataContainer modData);
-		void InitializeReport(VectoRunData modelData, Segment segment);
-	}
-
-	/// <summary>
-	/// Class for creating a declaration report.
-	/// </summary>
-	public abstract class DeclarationReport<T> : IDeclarationReport where T : new()
-	{
-		public class ResultContainer<TEntry>
-		{
-			public MissionType Mission;
-
-			public Dictionary<LoadingType, TEntry> ModData;
-		}
-
-		//public class MissionProfile
-		//{
-		//	public readonly IList<double> DistanceKm;
-		//	public readonly IList<double> TargetSpeed;
-		//	public readonly IList<double> Altitude;
-
-		//	public MissionProfile(IModalDataContainer m)
-		//	{
-		//		DistanceKm = m.GetValues<Meter>(ModalResultField.dist).Select(v => v.ConvertTo().Kilo.Meter).ToDouble();
-		//		TargetSpeed =
-		//			m.GetValues<MeterPerSecond>(ModalResultField.v_targ).Select(v => v.ConvertTo().Kilo.Meter.Per.Hour).ToDouble();
-		//		Altitude = m.GetValues<Meter>(ModalResultField.altitude).ToDouble();
-		//	}
-		//}
-
-		/// <summary>
-		/// Dictionary of MissionTypes and their corresponding results.
-		/// </summary>
-		protected readonly Dictionary<MissionType, ResultContainer<T>> Missions =
-			new Dictionary<MissionType, ResultContainer<T>>();
-
-		/// <summary>
-		/// The full load curve.
-		/// </summary>
-		internal Dictionary<uint, EngineFullLoadCurve> Flc { get; set; }
-
-		/// <summary>
-		/// The declaration segment from the segment table
-		/// </summary>
-		internal Segment Segment { get; set; }
-
-
-		/// <summary>
-		/// The result count determines how many results must be given before the report gets written.
-		/// </summary>
-		private int _resultCount;
-
-		[MethodImpl(MethodImplOptions.Synchronized)]
-		public void PrepareResult(LoadingType loading, Mission mission, VectoRunData runData)
-		{
-			if (!Missions.ContainsKey(mission.MissionType)) {
-				Missions[mission.MissionType] = new ResultContainer<T>() {
-					Mission = mission.MissionType,
-					ModData = new Dictionary<LoadingType, T>(),
-				};
-			}
-			Missions[mission.MissionType].ModData[loading] = new T();
-			_resultCount++;
-		}
-
-
-		[MethodImpl(MethodImplOptions.Synchronized)]
-		public void AddResult(LoadingType loadingType, Mission mission, VectoRunData runData,
-			IModalDataContainer modData)
-		{
-			if (modData.RunStatus != VectoRun.Status.Success) {
-				//Missions.Clear();
-				return;
-			}
-			if (!Missions.ContainsKey(mission.MissionType)) {
-				throw new VectoException("Unknown mission type {0} for generating declaration report", mission.MissionType);
-			}
-			if (!Missions[mission.MissionType].ModData.ContainsKey(loadingType)) {
-				throw new VectoException("Unknown loading type {0} for mission {1}", loadingType, mission.MissionType);
-			}
-			//if (Missions[mission.MissionType].MissionProfile == null) {
-			//	Missions[mission.MissionType].MissionProfile = new MissionProfile(modData);
-			//}
-			_resultCount--;
-
-			DoAddResult(Missions[mission.MissionType].ModData[loadingType], runData, modData);
-
-			if (_resultCount == 0) {
-				DoWriteReport();
-				Flc = null;
-				Segment = null;
-			}
-		}
-
-		/// <summary>
-		/// Adds the result of one run for the specific mission and loading. If all runs finished (given by the resultCount) the report will be written.
-		/// </summary>
-		/// <param name="entry"></param>
-		/// <param name="runData"></param>
-		/// <param name="modData">The mod data.</param>
-		[MethodImpl(MethodImplOptions.Synchronized)]
-		protected abstract void DoAddResult(T entry, VectoRunData runData, IModalDataContainer modData);
-
-
-		protected internal abstract void DoWriteReport();
-
-
-		public void InitializeReport(VectoRunData modelData, Segment segment)
-		{
-			Segment = segment;
-
-			DoInitializeReport(modelData, segment);
-		}
-
-		protected abstract void DoInitializeReport(VectoRunData modelData, Segment segment);
-	}
+using System.Collections.Generic;
+using System.Runtime.CompilerServices;
+using TUGraz.VectoCommon.Exceptions;
+using TUGraz.VectoCore.Models.Declaration;
+using TUGraz.VectoCore.Models.Simulation.Data;
+using TUGraz.VectoCore.Models.Simulation.Impl;
+using TUGraz.VectoCore.Models.SimulationComponent.Data.Engine;
+
+namespace TUGraz.VectoCore.OutputData
+{
+	public interface IDeclarationReport
+	{
+		void PrepareResult(LoadingType loading, Mission mission, VectoRunData runData);
+		void AddResult(LoadingType loadingType, Mission mission, VectoRunData runData, IModalDataContainer modData);
+		void InitializeReport(VectoRunData modelData, Segment segment);
+	}
+
+	/// <summary>
+	/// Class for creating a declaration report.
+	/// </summary>
+	public abstract class DeclarationReport<T> : IDeclarationReport where T : new()
+	{
+		public class ResultContainer<TEntry>
+		{
+			public MissionType Mission;
+
+			public Dictionary<LoadingType, TEntry> ModData;
+		}
+
+		//public class MissionProfile
+		//{
+		//	public readonly IList<double> DistanceKm;
+		//	public readonly IList<double> TargetSpeed;
+		//	public readonly IList<double> Altitude;
+
+		//	public MissionProfile(IModalDataContainer m)
+		//	{
+		//		DistanceKm = m.GetValues<Meter>(ModalResultField.dist).Select(v => v.ConvertTo().Kilo.Meter).ToDouble();
+		//		TargetSpeed =
+		//			m.GetValues<MeterPerSecond>(ModalResultField.v_targ).Select(v => v.ConvertTo().Kilo.Meter.Per.Hour).ToDouble();
+		//		Altitude = m.GetValues<Meter>(ModalResultField.altitude).ToDouble();
+		//	}
+		//}
+
+		/// <summary>
+		/// Dictionary of MissionTypes and their corresponding results.
+		/// </summary>
+		protected readonly Dictionary<MissionType, ResultContainer<T>> Missions =
+			new Dictionary<MissionType, ResultContainer<T>>();
+
+		/// <summary>
+		/// The full load curve.
+		/// </summary>
+		internal Dictionary<uint, EngineFullLoadCurve> Flc { get; set; }
+
+		/// <summary>
+		/// The declaration segment from the segment table
+		/// </summary>
+		internal Segment? Segment { get; set; }
+
+
+		/// <summary>
+		/// The result count determines how many results must be given before the report gets written.
+		/// </summary>
+		private int _resultCount;
+
+		[MethodImpl(MethodImplOptions.Synchronized)]
+		public void PrepareResult(LoadingType loading, Mission mission, VectoRunData runData)
+		{
+			if (!Missions.ContainsKey(mission.MissionType)) {
+				Missions[mission.MissionType] = new ResultContainer<T>() {
+					Mission = mission.MissionType,
+					ModData = new Dictionary<LoadingType, T>(),
+				};
+			}
+			Missions[mission.MissionType].ModData[loading] = new T();
+			_resultCount++;
+		}
+
+
+		[MethodImpl(MethodImplOptions.Synchronized)]
+		public void AddResult(LoadingType loadingType, Mission mission, VectoRunData runData,
+			IModalDataContainer modData)
+		{
+			if (modData.RunStatus != VectoRun.Status.Success) {
+				//Missions.Clear();
+				return;
+			}
+			if (!Missions.ContainsKey(mission.MissionType)) {
+				throw new VectoException("Unknown mission type {0} for generating declaration report", mission.MissionType);
+			}
+			if (!Missions[mission.MissionType].ModData.ContainsKey(loadingType)) {
+				throw new VectoException("Unknown loading type {0} for mission {1}", loadingType, mission.MissionType);
+			}
+			//if (Missions[mission.MissionType].MissionProfile == null) {
+			//	Missions[mission.MissionType].MissionProfile = new MissionProfile(modData);
+			//}
+			_resultCount--;
+
+			DoAddResult(Missions[mission.MissionType].ModData[loadingType], runData, modData);
+
+			if (_resultCount == 0) {
+				DoWriteReport();
+				Flc = null;
+				Segment = null;
+			}
+		}
+
+		/// <summary>
+		/// Adds the result of one run for the specific mission and loading. If all runs finished (given by the resultCount) the report will be written.
+		/// </summary>
+		/// <param name="entry"></param>
+		/// <param name="runData"></param>
+		/// <param name="modData">The mod data.</param>
+		[MethodImpl(MethodImplOptions.Synchronized)]
+		protected abstract void DoAddResult(T entry, VectoRunData runData, IModalDataContainer modData);
+
+
+		protected internal abstract void DoWriteReport();
+
+
+		public void InitializeReport(VectoRunData modelData, Segment segment)
+		{
+			Segment = segment;
+
+			DoInitializeReport(modelData, segment);
+		}
+
+		protected abstract void DoInitializeReport(VectoRunData modelData, Segment segment);
+	}
 }
\ No newline at end of file
diff --git a/VectoCore/VectoCore/VectoCore.csproj b/VectoCore/VectoCore/VectoCore.csproj
index aae00d06abb7382634365a52ac96303aa8ee38ce..72a0ccda5bb9b2d4c02324f48c836f848d279cab 100644
--- a/VectoCore/VectoCore/VectoCore.csproj
+++ b/VectoCore/VectoCore/VectoCore.csproj
@@ -155,6 +155,7 @@
     <Compile Include="InputData\Reader\Impl\EngineeringModeVectoRunDataFactory.cs" />
     <Compile Include="InputData\Reader\Impl\EngineOnlyVectoRunDataFactory.cs" />
     <Compile Include="InputData\Reader\ShiftPolygonReader.cs" />
+    <Compile Include="Models\Declaration\AuxDemandEntry.cs" />
     <Compile Include="Models\Declaration\AuxiliaryTypeHelper.cs" />
     <Compile Include="Models\Connector\Ports\IDriverDemandPort.cs" />
     <Compile Include="Models\Connector\Ports\IDrivingCyclePort.cs" />
diff --git a/VectoCore/VectoCoreTest/Models/Declaration/DeclarationDataTest.cs b/VectoCore/VectoCoreTest/Models/Declaration/DeclarationDataTest.cs
index fa83d8f4bd6fc4c0f618c5bb814570846f6135eb..1f7494ea4780561fc94b36f05754538ec43e7c39 100644
--- a/VectoCore/VectoCoreTest/Models/Declaration/DeclarationDataTest.cs
+++ b/VectoCore/VectoCoreTest/Models/Declaration/DeclarationDataTest.cs
@@ -269,8 +269,9 @@ namespace TUGraz.VectoCore.Tests.Models.Declaration
 		public void CrossWindAreaCdxANotSet_Other()
 		{
 			foreach (var correctionMode in EnumHelper.GetValues<CrossWindCorrectionMode>()) {
-				if (correctionMode == CrossWindCorrectionMode.DeclarationModeCorrection)
+				if (correctionMode == CrossWindCorrectionMode.DeclarationModeCorrection) {
 					continue;
+				}
 
 				var airDrag = new AirdragData {
 					CrossWindCorrectionMode = correctionMode,
@@ -295,7 +296,7 @@ namespace TUGraz.VectoCore.Tests.Models.Declaration
 		TestCase(MissionType.Construction, "Standard technology - LED headlights, all", 950, 0.7),]
 		public void AuxElectricSystemTest(MissionType mission, string technology, double value, double efficiency)
 		{
-			AssertHelper.AreRelativeEqual(value / efficiency, DeclarationData.ElectricSystem.Lookup(mission, technology));
+			AssertHelper.AreRelativeEqual(value / efficiency, DeclarationData.ElectricSystem.Lookup(mission, technology).PowerDemand.Value());
 		}
 
 		[TestCase(MissionType.Interurban, "Standard technology"),
@@ -317,7 +318,7 @@ namespace TUGraz.VectoCore.Tests.Models.Declaration
 		TestCase("only one engaged gearwheel above oil level", 0)]
 		public void AuxPTOTransmissionTest(string technology, double value)
 		{
-			AssertHelper.AreRelativeEqual(value, DeclarationData.PTOTransmission.Lookup(technology));
+			AssertHelper.AreRelativeEqual(value, DeclarationData.PTOTransmission.Lookup(technology).PowerDemand.Value());
 		}
 
 		[TestCase("Superfluid")]
@@ -343,8 +344,8 @@ namespace TUGraz.VectoCore.Tests.Models.Declaration
 		public void AuxFanTechTest(string technology, int[] expected)
 		{
 			for (var i = 0; i < _missions.Length; i++) {
-				var value = DeclarationData.Fan.Lookup(_missions[i], technology);
-				Assert.AreEqual(expected[i], value.Value(), Tolerance);
+				var lookup = DeclarationData.Fan.Lookup(_missions[i], technology);
+				Assert.AreEqual(expected[i], lookup.PowerDemand.Value(), Tolerance);
 			}
 		}
 
@@ -372,7 +373,7 @@ namespace TUGraz.VectoCore.Tests.Models.Declaration
 			for (var i = 0; i < expected.Length; i++) {
 				if (expected[i] > 0) {
 					AssertHelper.AreRelativeEqual(expected[i],
-						DeclarationData.HeatingVentilationAirConditioning.Lookup(_missions[i], "Default", vehicleClass));
+						DeclarationData.HeatingVentilationAirConditioning.Lookup(_missions[i], "Default", vehicleClass).PowerDemand.Value());
 				} else {
 					var i1 = i;
 					AssertHelper.Exception<VectoException>(
@@ -395,7 +396,7 @@ namespace TUGraz.VectoCore.Tests.Models.Declaration
 		{
 			for (var i = 0; i < expected.Length; i++) {
 				AssertHelper.AreRelativeEqual(expected[i],
-					DeclarationData.HeatingVentilationAirConditioning.Lookup(_missions[i], "None", vehicleClass));
+					DeclarationData.HeatingVentilationAirConditioning.Lookup(_missions[i], "None", vehicleClass).PowerDemand.Value());
 			}
 		}
 
@@ -442,8 +443,8 @@ namespace TUGraz.VectoCore.Tests.Models.Declaration
 		public void AuxPneumaticSystemTest(string technology, int[] expected)
 		{
 			for (var i = 0; i < _missions.Length; i++) {
-				var value = DeclarationData.PneumaticSystem.Lookup(_missions[i], technology);
-				AssertHelper.AreRelativeEqual(expected[i], value);
+				var lookup = DeclarationData.PneumaticSystem.Lookup(_missions[i], technology);
+				AssertHelper.AreRelativeEqual(expected[i], lookup.PowerDemand.Value());
 			}
 		}
 
@@ -547,11 +548,11 @@ namespace TUGraz.VectoCore.Tests.Models.Declaration
 		public void SegmentWeightOutOfRange4X2(double weight)
 		{
 			AssertHelper.Exception<VectoException>(() =>
-					DeclarationData.Segments.Lookup(
-						VehicleCategory.RigidTruck,
-						AxleConfiguration.AxleConfig_4x2,
-						weight.SI<Kilogram>(),
-						0.SI<Kilogram>()),
+				DeclarationData.Segments.Lookup(
+					VehicleCategory.RigidTruck,
+					AxleConfiguration.AxleConfig_4x2,
+					weight.SI<Kilogram>(),
+					0.SI<Kilogram>()),
 				"Gross vehicle mass must be greater than 7.5 tons");
 		}
 
@@ -564,11 +565,11 @@ namespace TUGraz.VectoCore.Tests.Models.Declaration
 		public void SegmentWeightOutOfRange4X4(double weight)
 		{
 			AssertHelper.Exception<VectoException>(() =>
-					DeclarationData.Segments.Lookup(
-						VehicleCategory.RigidTruck,
-						AxleConfiguration.AxleConfig_4x4,
-						weight.SI<Kilogram>(),
-						0.SI<Kilogram>()),
+				DeclarationData.Segments.Lookup(
+					VehicleCategory.RigidTruck,
+					AxleConfiguration.AxleConfig_4x4,
+					weight.SI<Kilogram>(),
+					0.SI<Kilogram>()),
 				"Gross vehicle mass must be greater than 7.5 tons");
 		}
 
diff --git a/VectoCore/VectoCoreTest/Models/Simulation/AuxTests.cs b/VectoCore/VectoCoreTest/Models/Simulation/AuxTests.cs
index 8d73537a0b633d77c197010cf02d8adf3575159e..d84faffa190492ef352f0d218d513a98b92ca77a 100644
--- a/VectoCore/VectoCoreTest/Models/Simulation/AuxTests.cs
+++ b/VectoCore/VectoCoreTest/Models/Simulation/AuxTests.cs
@@ -83,14 +83,14 @@ namespace TUGraz.VectoCore.Tests.Models.Simulation
 			var mission = MissionType.LongHaul;
 
 			aux.AddConstant("FAN",
-				DeclarationData.Fan.Lookup(MissionType.LongHaul, "Hydraulic driven - Constant displacement pump"));
-			aux.AddConstant("PS", DeclarationData.PneumaticSystem.Lookup(mission, "Medium Supply 1-stage"));
+				DeclarationData.Fan.Lookup(MissionType.LongHaul, "Hydraulic driven - Constant displacement pump").PowerDemand);
+			aux.AddConstant("PS", DeclarationData.PneumaticSystem.Lookup(mission, "Medium Supply 1-stage").PowerDemand);
 			aux.AddConstant("STP",
 				DeclarationData.SteeringPump.Lookup(MissionType.LongHaul, hdvClass,
 					new[] { "Variable displacement mech. controlled" }));
-			aux.AddConstant("ES", DeclarationData.ElectricSystem.Lookup(mission));
+			aux.AddConstant("ES", DeclarationData.ElectricSystem.Lookup(mission).PowerDemand);
 			aux.AddConstant("AC",
-				DeclarationData.HeatingVentilationAirConditioning.Lookup(mission, "Default", hdvClass));
+				DeclarationData.HeatingVentilationAirConditioning.Lookup(mission, "Default", hdvClass).PowerDemand);
 
 			var speed = 1400.RPMtoRad();
 			var torque = 500.SI<NewtonMeter>();
diff --git a/VectoCore/VectoCoreTest/XML/XMLDeclarationInputTest.cs b/VectoCore/VectoCoreTest/XML/XMLDeclarationInputTest.cs
index 25f0dc1d1985a3d49bc1c3f4a22d3cabc1b9eca9..ddd426858d7126ca1e641666b4e51043b656dc06 100644
--- a/VectoCore/VectoCoreTest/XML/XMLDeclarationInputTest.cs
+++ b/VectoCore/VectoCoreTest/XML/XMLDeclarationInputTest.cs
@@ -29,778 +29,778 @@
 *   Martin Rexeis, rexeis@ivt.tugraz.at, IVT, Graz University of Technology
 */
 
-using System.Collections.Generic;
-using System.IO;
-using System.Linq;
-using System.Windows.Forms;
-using System.Xml;
-using System.Xml.Linq;
-using Microsoft.VisualStudio.TestTools.UnitTesting;
-using TUGraz.VectoCommon.Exceptions;
-using TUGraz.VectoCommon.Models;
-using TUGraz.VectoCommon.Resources;
-using TUGraz.VectoCommon.Utils;
-using TUGraz.VectoCore.Configuration;
-using TUGraz.VectoCore.InputData.FileIO.XML.Declaration;
-using TUGraz.VectoCore.InputData.Reader;
-using TUGraz.VectoCore.InputData.Reader.ComponentData;
-using TUGraz.VectoCore.Models.Declaration;
-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;
-
-namespace TUGraz.VectoCore.Tests.XML
-{
-	[TestClass]
-	public class XMLDeclarationInputTest
-	{
-		const string SampleVehicleDecl = "TestData/XML/XMLReaderDeclaration/vecto_vehicle-sample.xml";
-		const string SampleVehicleFullDecl = "TestData/XML/XMLReaderDeclaration/vecto_vehicle-sample_FULL.xml";
-
-		[TestMethod]
-		public void TestXMLInputEng()
-		{
-			var reader = XmlReader.Create(SampleVehicleDecl);
-
-			var inputDataProvider = new XMLDeclarationInputDataProvider(reader, true);
-
-			var engineDataProvider = inputDataProvider.EngineInputData;
-
-			Assert.IsTrue(engineDataProvider.SavedInDeclarationMode);
-
-			Assert.AreEqual("Generic 40t Long Haul Truck Engine", engineDataProvider.Model);
-			Assert.AreEqual(0.012730, engineDataProvider.Displacement.Value());
-			Assert.AreEqual(1.0097, engineDataProvider.WHTCUrban);
-			//AssertHelper.Exception<VectoException>(() => { var tmp = engineDataProvider.Inertia; });
-
-			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.00", 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());
-
-			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);
-		}
-
-		[TestMethod]
-		public void TestXMLInputGbx()
-		{
-			var reader = XmlReader.Create(SampleVehicleDecl);
-
-			var inputDataProvider = new XMLDeclarationInputDataProvider(reader, 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.00", gears.First().LossMap.Rows[0][0]);
-			Assert.AreEqual("-350.00", 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(5000, gears.First().MaxTorque.Value());
-		}
-
-		[TestMethod]
-		public void TestXMLInputAxlG()
-		{
-			var reader = XmlReader.Create(SampleVehicleDecl);
-
-			var inputDataProvider = new XMLDeclarationInputDataProvider(reader, 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.00", lossMapData.Rows[0][0]);
-			Assert.AreEqual("-5000.00", lossMapData.Rows[0][1]);
-			Assert.AreEqual("115.00", lossMapData.Rows[0][2]);
-
-			var lossMap = TransmissionLossMapReader.Create(lossMapData, axlegearDataProvider.Ratio, "AxleGear");
-			Assert.IsNotNull(lossMap);
-
-			AssertHelper.Exception<VectoException>(() => { var tmp = axlegearDataProvider.Efficiency; });
-		}
-
-		[TestMethod]
-		public void TestXMLInputRetarder()
-		{
-			var reader = XmlReader.Create(SampleVehicleDecl);
-
-			var inputDataProvider = new XMLDeclarationInputDataProvider(reader, true);
-			var retarderDataProvider = inputDataProvider.RetarderInputData;
-
-			Assert.AreEqual("Generic Retarder", retarderDataProvider.Model);
-
-			var lossMapData = retarderDataProvider.LossMap;
-
-			Assert.AreEqual(RetarderType.TransmissionOutputRetarder, retarderDataProvider.Type);
-
-			Assert.AreEqual("0.00", lossMapData.Rows[0][0]);
-			Assert.AreEqual("10.00", lossMapData.Rows[0][1]);
-
-			var lossMap = RetarderLossMapReader.Create(lossMapData);
-			Assert.IsNotNull(lossMap);
-		}
-
-		[TestMethod]
-		public void TestXMLInputAxleWheels()
-		{
-			var reader = XmlReader.Create(SampleVehicleDecl);
-
-			var inputDataProvider = new XMLDeclarationInputDataProvider(reader, 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());
-		}
-
-		[TestMethod]
-		public void TestXMLInputAxleWheelsDuplicates()
-		{
-			var reader = XmlReader.Create(SampleVehicleDecl);
-
-			var doc = new XmlDocument();
-			doc.Load(reader);
-			var nav = doc.CreateNavigator();
-			var manager = new XmlNamespaceManager(nav.NameTable);
-			var helper = new XPathHelper(ExecutionMode.Declaration);
-			helper.AddNamespaces(manager);
-
-			var firstAxle = nav.SelectSingleNode(helper.QueryAbs(
-				helper.NSPrefix(XMLNames.VectoInputDeclaration, Constants.XML.RootNSPrefix),
-				XMLNames.Component_Vehicle,
-				XMLNames.Vehicle_Components,
-				XMLNames.Component_AxleWheels,
-				XMLNames.ComponentDataWrapper,
-				XMLNames.AxleWheels_Axles,
-				helper.QueryConstraint(XMLNames.AxleWheels_Axles_Axle, "1", null, string.Empty)
-				), manager);
-			firstAxle.MoveToAttribute(XMLNames.AxleWheels_Axles_Axle_AxleNumber_Attr, string.Empty);
-			firstAxle.SetTypedValue(2);
-
-
-			var modified = XmlReader.Create(new StringReader(nav.OuterXml));
-
-			var inputDataProvider = new XMLDeclarationInputDataProvider(modified, true);
-			var vehicleDataProvider = inputDataProvider.VehicleInputData;
-
-			AssertHelper.Exception<VectoException>(() => { var axles = vehicleDataProvider.Axles; });
-		}
-
-		[TestMethod]
-		public void TestXMLInputAxleWheelsAxleNumTooLow()
-		{
-			var reader = XmlReader.Create(SampleVehicleDecl);
-
-			var doc = new XmlDocument();
-			doc.Load(reader);
-			var nav = doc.CreateNavigator();
-			var manager = new XmlNamespaceManager(nav.NameTable);
-			var helper = new XPathHelper(ExecutionMode.Declaration);
-			helper.AddNamespaces(manager);
-
-			var firstAxle = nav.SelectSingleNode(helper.QueryAbs(
-				helper.NSPrefix(XMLNames.VectoInputDeclaration, Constants.XML.RootNSPrefix),
-				XMLNames.Component_Vehicle,
-				XMLNames.Vehicle_Components,
-				XMLNames.Component_AxleWheels,
-				XMLNames.ComponentDataWrapper,
-				XMLNames.AxleWheels_Axles,
-				helper.QueryConstraint(XMLNames.AxleWheels_Axles_Axle, "1", null, string.Empty)
-				), manager);
-			firstAxle.MoveToAttribute(XMLNames.AxleWheels_Axles_Axle_AxleNumber_Attr, string.Empty);
-			firstAxle.SetTypedValue(0);
-
-
-			var modified = XmlReader.Create(new StringReader(nav.OuterXml));
-
-			AssertHelper.Exception<VectoException>(
-				() => { var inputDataProvider = new XMLDeclarationInputDataProvider(modified, true); });
-		}
-
-		[TestMethod]
-		public void TestXMLInputAxleWheelsAxleNumTooHigh()
-		{
-			var reader = XmlReader.Create(SampleVehicleDecl);
-
-			var doc = new XmlDocument();
-			doc.Load(reader);
-			var nav = doc.CreateNavigator();
-			var manager = new XmlNamespaceManager(nav.NameTable);
-			var helper = new XPathHelper(ExecutionMode.Declaration);
-			helper.AddNamespaces(manager);
-
-			var firstAxle = nav.SelectSingleNode(helper.QueryAbs(
-				helper.NSPrefix(XMLNames.VectoInputDeclaration, Constants.XML.RootNSPrefix),
-				XMLNames.Component_Vehicle,
-				XMLNames.Vehicle_Components,
-				XMLNames.Component_AxleWheels,
-				XMLNames.ComponentDataWrapper,
-				XMLNames.AxleWheels_Axles,
-				helper.QueryConstraint(XMLNames.AxleWheels_Axles_Axle, "1", null, string.Empty)
-				), manager);
-			firstAxle.MoveToAttribute(XMLNames.AxleWheels_Axles_Axle_AxleNumber_Attr, string.Empty);
-			firstAxle.SetTypedValue(3);
-
-
-			var modified = XmlReader.Create(new StringReader(nav.OuterXml));
-
-			var inputDataProvider = new XMLDeclarationInputDataProvider(modified, true);
-			var vehicleDataProvider = inputDataProvider.VehicleInputData;
-
-			AssertHelper.Exception<VectoException>(() => { var axles = vehicleDataProvider.Axles; });
-		}
-
-		[TestMethod]
-		public void TestXMLInputAuxiliaries()
-		{
-			var reader = XmlReader.Create(SampleVehicleDecl);
-
-			var inputDataProvider = new XMLDeclarationInputDataProvider(reader, true);
-			var auxDataProvider = inputDataProvider.AuxiliaryInputData();
-
-			var aux = auxDataProvider.Auxiliaries;
-			var aux1 = aux[0];
-
-			Assert.AreEqual(AuxiliaryType.Fan, aux1.Type);
-			Assert.AreEqual("Hydraulic driven - Constant displacement pump", aux1.Technology.First());
-
-			var aux3 = aux[2];
-			Assert.AreEqual(AuxiliaryType.ElectricSystem, aux3.Type);
-			Assert.AreEqual("Standard technology - LED headlights, all", aux3.Technology.First());
-		}
-
-		[TestMethod]
-		public void TestXMLInputADAS()
-		{
-			var reader = XmlReader.Create(SampleVehicleDecl);
-
-			var inputDataProvider = new XMLDeclarationInputDataProvider(reader, true);
-
-			var adas = inputDataProvider.DriverInputData;
-
-			Assert.AreEqual(DriverMode.Overspeed, adas.OverSpeedEcoRoll.Mode);
-		}
-
-		[TestMethod]
-		public void TestVehicleInput()
-		{
-			var reader = XmlReader.Create(SampleVehicleDecl);
-
-			var inputDataProvider = new XMLDeclarationInputDataProvider(reader, 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(40000.0, vehicleDataProvider.GrossVehicleMassRating.Value());
-			Assert.AreEqual(6.34, inputDataProvider.AirdragInputData.AirDragArea.Value());
-
-			Assert.AreEqual(1.0, inputDataProvider.RetarderInputData.Ratio);
-		}
-
-		[TestMethod]
-		public void TestXMLPowertrainGeneration()
-		{
-			var reader = XmlReader.Create(SampleVehicleDecl);
-
-			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 XMLDeclarationInputDataProvider(reader, true);
-
-			var runsFactory = new SimulatorFactory(ExecutionMode.Declaration, dataProvider, fileWriter);
-			runsFactory.WriteModalResults = true;
-
-			jobContainer.AddRuns(runsFactory);
-
-			Assert.AreEqual(8, jobContainer.Runs.Count);
-		}
-
-		[TestMethod]
-		public void TestFullFeaturedXMEngineering_TorqueConverter()
-		{
-			var reader = XmlReader.Create(SampleVehicleFullDecl);
-
-			var inputDataProvider = new XMLDeclarationInputDataProvider(reader, true);
-
-			var tcDataProvider = inputDataProvider.TorqueConverterInputData;
-
-
-			Assert.AreEqual(3, tcDataProvider.TCData.Rows.Count);
-			Assert.AreEqual("300.00", tcDataProvider.TCData.Rows[0][2]);
-			Assert.AreEqual("0.90", tcDataProvider.TCData.Rows[2][1]);
-		}
-
-		[TestMethod]
-		public void TestFullFeaturedXMLDeclaration_AngleDrive()
-		{
-			var reader = XmlReader.Create(SampleVehicleFullDecl);
-
-			var inputDataProvider = new XMLDeclarationInputDataProvider(reader, true);
-
-
-			var angledriveDataProvider = inputDataProvider.AngledriveInputData;
-
-			Assert.AreEqual(2.345, angledriveDataProvider.Ratio);
-			Assert.AreEqual(6, angledriveDataProvider.LossMap.Rows.Count);
-			Assert.AreEqual("-10000.00", angledriveDataProvider.LossMap.Rows[0][1]);
-
-			AssertHelper.Exception<VectoException>(() => { var tmp = angledriveDataProvider.Efficiency; });
-		}
-
-		[TestMethod]
-		public void TestVehicleInputData()
-		{
-			var reader = XmlReader.Create(SampleVehicleFullDecl);
-
-			var inputDataProvider = new XMLDeclarationInputDataProvider(reader, true);
-			var vehicleDataProvider = inputDataProvider.JobInputData().Vehicle;
-
-			Assert.AreEqual(VehicleCategory.Tractor, vehicleDataProvider.VehicleCategory);
-			Assert.AreEqual(AxleConfiguration.AxleConfig_4x2, vehicleDataProvider.AxleConfiguration);
-
-			Assert.AreEqual(7100.0, vehicleDataProvider.CurbMassChassis.Value());
-			Assert.AreEqual(40000.0, vehicleDataProvider.GrossVehicleMassRating.Value());
-			Assert.AreEqual(6.34, inputDataProvider.AirdragInputData.AirDragArea.Value());
-
-			Assert.AreEqual(1.0, inputDataProvider.RetarderInputData.Ratio);
-		}
-
-		[TestMethod]
-		public void TestFullFeaturedXMLDeclaration_TorqueLimits()
-		{
-			var reader = XmlReader.Create(SampleVehicleFullDecl);
-
-			var inputDataProvider = new XMLDeclarationInputDataProvider(reader, true);
-			var vehicleDataProvider = inputDataProvider.JobInputData().Vehicle;
-
-			var torqueLimits = vehicleDataProvider.TorqueLimits.OrderBy(x => x.Gear).ToList();
-			Assert.AreEqual(3, torqueLimits.Count);
-			Assert.AreEqual(1, torqueLimits[0].Gear);
-			Assert.AreEqual(2500, torqueLimits[0].MaxTorque.Value());
-			Assert.AreEqual(12, torqueLimits[2].Gear);
-		}
-
-		[TestMethod]
-		public void TestFullFeaturedXMLDeclaration_GbxTorqueLimits()
-		{
-			var reader = XmlReader.Create(SampleVehicleFullDecl);
-
-			var inputDataProvider = new XMLDeclarationInputDataProvider(reader, true);
-			var gearboxDataProvider = inputDataProvider.GearboxInputData;
-			var gears = gearboxDataProvider.Gears;
-
-			Assert.AreEqual(12, gears.Count);
-			Assert.AreEqual(1900, gears[0].MaxTorque.Value());
-			Assert.AreEqual(1900, gears[1].MaxTorque.Value());
-			Assert.IsNull(gears[11].MaxTorque);
-		}
-
-		[TestMethod]
-		public void TestFullFeaturedXMLDeclaration_GbxSpeedLimits()
-		{
-			var reader = XmlReader.Create(SampleVehicleFullDecl);
-
-			var inputDataProvider = new XMLDeclarationInputDataProvider(reader, true);
-			var gearboxDataProvider = inputDataProvider.GearboxInputData;
-			var gears = gearboxDataProvider.Gears;
-
-			Assert.AreEqual(12, gears.Count);
-			Assert.AreEqual(2000, gears[0].MaxInputSpeed.AsRPM, 1e-6);
-			Assert.AreEqual(2000, gears[1].MaxInputSpeed.AsRPM, 1e-6);
-			Assert.IsNull(gears[11].MaxInputSpeed);
-		}
-
-		[TestMethod]
-		public void TestElementNotAvailable()
-		{
-			var reader = XmlReader.Create(SampleVehicleDecl);
-
-			var doc = new XmlDocument();
-			doc.Load(reader);
-			var nav = doc.CreateNavigator();
-			var manager = new XmlNamespaceManager(nav.NameTable);
-			var helper = new XPathHelper(ExecutionMode.Declaration);
-			helper.AddNamespaces(manager);
-
-			var retarderRatio = nav.SelectSingleNode(helper.QueryAbs(
-				helper.NSPrefix(XMLNames.VectoInputDeclaration, Constants.XML.RootNSPrefix),
-				XMLNames.Component_Vehicle,
-				XMLNames.Vehicle_RetarderRatio), manager);
-			retarderRatio.DeleteSelf();
-
-			var modified = XmlReader.Create(new StringReader(nav.OuterXml));
-
-			var inputDataProvider = new XMLDeclarationInputDataProvider(modified, true);
-
-			AssertHelper.Exception<VectoException>(() => { var tmp = inputDataProvider.RetarderInputData.Ratio; });
-		}
-
-		[TestMethod]
-		public void TestRetarderTypeNone()
-		{
-			var reader = XmlReader.Create(SampleVehicleDecl);
-
-			var doc = new XmlDocument();
-			doc.Load(reader);
-			var nav = doc.CreateNavigator();
-			var manager = new XmlNamespaceManager(nav.NameTable);
-			var helper = new XPathHelper(ExecutionMode.Declaration);
-			helper.AddNamespaces(manager);
-
-			var retarderType = nav.SelectSingleNode(helper.QueryAbs(
-				helper.NSPrefix(XMLNames.VectoInputDeclaration, Constants.XML.RootNSPrefix),
-				XMLNames.Component_Vehicle,
-				XMLNames.Vehicle_RetarderType), manager);
-			retarderType.SetValue("None");
-
-			var retarder = nav.SelectSingleNode(helper.QueryAbs(
-				helper.NSPrefix(XMLNames.VectoInputDeclaration, Constants.XML.RootNSPrefix),
-				XMLNames.Component_Vehicle,
-				XMLNames.Vehicle_Components,
-				XMLNames.Component_Retarder), manager);
-			retarder.DeleteSelf();
-
-			var modified = XmlReader.Create(new StringReader(nav.OuterXml));
-
-			var inputDataProvider = new XMLDeclarationInputDataProvider(modified, true);
-
-			var factory = new SimulatorFactory(ExecutionMode.Declaration, inputDataProvider, new FileOutputWriter("dummy"));
-			var jobContainer = new JobContainer(null);
-			jobContainer.AddRuns(factory);
-			jobContainer.Execute();
-		}
-
-		[TestMethod]
-		public void TestRetarderTypes()
-		{
-			var retarderTypes = new Dictionary<string, RetarderType>() {
-				{ "None", RetarderType.None },
-				{ "Losses included in Gearbox", RetarderType.LossesIncludedInTransmission },
-				{ "Engine Retarder", RetarderType.EngineRetarder },
-				{ "Transmission Input Retarder", RetarderType.TransmissionInputRetarder },
-				{ "Transmission Output Retarder", RetarderType.TransmissionOutputRetarder }
-			}
-				;
-			foreach (var retarderType in retarderTypes) {
-				var reader = XmlReader.Create(SampleVehicleDecl);
-
-				var doc = new XmlDocument();
-				doc.Load(reader);
-				var nav = doc.CreateNavigator();
-				var manager = new XmlNamespaceManager(nav.NameTable);
-				var helper = new XPathHelper(ExecutionMode.Declaration);
-				helper.AddNamespaces(manager);
-
-				var xmlRetarderType = nav.SelectSingleNode(helper.QueryAbs(
-					helper.NSPrefix(XMLNames.VectoInputDeclaration, Constants.XML.RootNSPrefix),
-					XMLNames.Component_Vehicle,
-					XMLNames.Vehicle_RetarderType), manager);
-				xmlRetarderType.SetValue(retarderType.Key);
-
-				var modified = XmlReader.Create(new StringReader(nav.OuterXml));
-
-				var inputDataProvider = new XMLDeclarationInputDataProvider(modified, true);
-
-				Assert.AreEqual(retarderType.Value, inputDataProvider.RetarderInputData.Type);
-			}
-		}
-
-		[TestMethod]
-		public void TestAxleConfigurationTypes()
-		{
-			var axleConfigurations = new Dictionary<string, AxleConfiguration>() {
-				{ "4x2", AxleConfiguration.AxleConfig_4x2 },
-				//{ "4x4", AxleConfiguration.AxleConfig_4x4 },
-				{ "6x2", AxleConfiguration.AxleConfig_6x2 },
-				{ "6x4", AxleConfiguration.AxleConfig_6x4 },
-				//{ "6x6", AxleConfiguration.AxleConfig_6x6 },
-				//{ "8x2", AxleConfiguration.AxleConfig_8x2 },
-				{ "8x4", AxleConfiguration.AxleConfig_8x4 },
-				//{ "8x6", AxleConfiguration.AxleConfig_8x6 },
-				//{ "8x8", AxleConfiguration.AxleConfig_8x8 }
-			};
-			foreach (var axleConfiguration in axleConfigurations) {
-				var reader = XmlReader.Create(SampleVehicleDecl);
-
-				var doc = new XmlDocument();
-				doc.Load(reader);
-				var nav = doc.CreateNavigator();
-				var manager = new XmlNamespaceManager(nav.NameTable);
-				var helper = new XPathHelper(ExecutionMode.Declaration);
-				helper.AddNamespaces(manager);
-
-				var xmlRetarderType = nav.SelectSingleNode(helper.QueryAbs(
-					helper.NSPrefix(XMLNames.VectoInputDeclaration, Constants.XML.RootNSPrefix),
-					XMLNames.Component_Vehicle,
-					XMLNames.Vehicle_AxleConfiguration), manager);
-				xmlRetarderType.SetValue(axleConfiguration.Key);
-
-				var modified = XmlReader.Create(new StringReader(nav.OuterXml));
-
-				var inputDataProvider = new XMLDeclarationInputDataProvider(modified, true);
-
-				Assert.AreEqual(axleConfiguration.Value, inputDataProvider.VehicleInputData.AxleConfiguration);
-			}
-		}
-
-		[TestMethod]
-		public void TestVehicleCategoryTypes()
-		{
-			var vehicleCategories = new Dictionary<string, VehicleCategory>() {
-				{ "Rigid Truck", VehicleCategory.RigidTruck },
-				{ "Tractor", VehicleCategory.Tractor },
-				//{ "City Bus", VehicleCategory.CityBus },
-				//{ "Interurban Bus", VehicleCategory.InterurbanBus },
-				//{ "Coach", VehicleCategory.Coach }
-			};
-			foreach (var vehicleCategory in vehicleCategories) {
-				var reader = XmlReader.Create(SampleVehicleDecl);
-
-				var doc = new XmlDocument();
-				doc.Load(reader);
-				var nav = doc.CreateNavigator();
-				var manager = new XmlNamespaceManager(nav.NameTable);
-				var helper = new XPathHelper(ExecutionMode.Declaration);
-				helper.AddNamespaces(manager);
-
-				var xmlRetarderType = nav.SelectSingleNode(helper.QueryAbs(
-					helper.NSPrefix(XMLNames.VectoInputDeclaration, Constants.XML.RootNSPrefix),
-					XMLNames.Component_Vehicle,
-					XMLNames.Vehicle_VehicleCategory), manager);
-				xmlRetarderType.SetValue(vehicleCategory.Key);
-
-				var modified = XmlReader.Create(new StringReader(nav.OuterXml));
-
-				var inputDataProvider = new XMLDeclarationInputDataProvider(modified, true);
-
-				Assert.AreEqual(vehicleCategory.Value, inputDataProvider.VehicleInputData.VehicleCategory);
-			}
-		}
-
-
-		[TestMethod]
-		public void TestWheelsTypes()
-		{
-			var retarderTypes = new Dictionary<string, RetarderType>() { };
-			foreach (var retarderType in retarderTypes) {
-				var reader = XmlReader.Create(SampleVehicleDecl);
-
-				var doc = new XmlDocument();
-				doc.Load(reader);
-				var nav = doc.CreateNavigator();
-				var manager = new XmlNamespaceManager(nav.NameTable);
-				var helper = new XPathHelper(ExecutionMode.Declaration);
-				helper.AddNamespaces(manager);
-
-				var xmlRetarderType = nav.SelectSingleNode(helper.QueryAbs(
-					helper.NSPrefix(XMLNames.VectoInputDeclaration,
-						Constants.XML.RootNSPrefix),
-					XMLNames.Component_Vehicle,
-					XMLNames.Vehicle_RetarderType),
-					manager);
-				xmlRetarderType.SetValue(retarderType.Key);
-
-				var modified = XmlReader.Create(new StringReader(nav.OuterXml));
-
-				var inputDataProvider = new XMLDeclarationInputDataProvider(modified,
-					true);
-
-				Assert.AreEqual(retarderType.Value,
-					inputDataProvider.RetarderInputData.Type);
-			}
-		}
-
-		[TestMethod]
-		public void TestPTOTypeTypes()
-		{
-			var ptoTypes = new string[][] {
-				new[] { "none", "none" },
-				new[] { "only one engaged gearwheel above oil level", "none" },
-				new[] { "only the drive shaft of the PTO", "shift claw, synchronizer, sliding gearwheel" },
-				new[] { "only the drive shaft of the PTO", "multi-disc clutch" },
-				new[] { "only the drive shaft of the PTO", "multi-disc clutch, oil pump" },
-				new[] { "drive shaft and/or up to 2 gear wheels", "shift claw, synchronizer, sliding gearwheel" },
-				new[] { "drive shaft and/or up to 2 gear wheels", "multi-disc clutch" },
-				new[] { "drive shaft and/or up to 2 gear wheels", "multi-disc clutch, oil pump" },
-				new[] { "drive shaft and/or more than 2 gear wheels", "shift claw, synchronizer, sliding gearwheel" },
-				new[] { "drive shaft and/or more than 2 gear wheels", "multi-disc clutch" },
-				new[] { "drive shaft and/or more than 2 gear wheels", "multi-disc clutch, oil pump" },
-			};
-			foreach (var ptoType in ptoTypes) {
-				var reader = XmlReader.Create(SampleVehicleDecl);
-
-				var doc = new XmlDocument();
-				doc.Load(reader);
-				var nav = doc.CreateNavigator();
-				var manager = new XmlNamespaceManager(nav.NameTable);
-				var helper = new XPathHelper(ExecutionMode.Declaration);
-				helper.AddNamespaces(manager);
-
-				var ptoGearWheels = nav.SelectSingleNode(helper.QueryAbs(
-					helper.NSPrefix(XMLNames.VectoInputDeclaration,
-						Constants.XML.RootNSPrefix),
-					XMLNames.Component_Vehicle,
-					XMLNames.Vehicle_PTO,
-					XMLNames.Vehicle_PTO_ShaftsGearWheels),
-					manager);
-				ptoGearWheels.SetValue(ptoType[0]);
-				var ptoOther = nav.SelectSingleNode(helper.QueryAbs(
-					helper.NSPrefix(XMLNames.VectoInputDeclaration,
-						Constants.XML.RootNSPrefix),
-					XMLNames.Component_Vehicle,
-					XMLNames.Vehicle_PTO,
-					XMLNames.Vehicle_PTO_OtherElements),
-					manager);
-				ptoOther.SetValue(ptoType[1]);
-
-				var modified = XmlReader.Create(new StringReader(nav.OuterXml));
-
-				var inputDataProvider = new XMLDeclarationInputDataProvider(modified,
-					true);
-
-				if (ptoType[0] == "none") {
-					Assert.AreEqual("None",
-						inputDataProvider.PTOTransmissionInputData.PTOTransmissionType);
-				} else if (ptoType[0] == "only one engaged gearwheel above oil level") {
-					Assert.AreEqual(ptoType[0],
-						inputDataProvider.PTOTransmissionInputData.PTOTransmissionType);
-				} else {
-					Assert.AreEqual(string.Format("{0} - {1}", ptoType[0], ptoType[1]),
-						inputDataProvider.PTOTransmissionInputData.PTOTransmissionType);
-				}
-				DeclarationData.PTOTransmission.Lookup(inputDataProvider.PTOTransmissionInputData.PTOTransmissionType);
-			}
-		}
-
-		[TestMethod]
-		public void TestAngledriveTypes()
-		{
-			var angledriveTypes = new Dictionary<string, AngledriveType>() {
-				{ "None", AngledriveType.None },
-				{ "Losses included in Gearbox", AngledriveType.LossesIncludedInGearbox },
-				{ "Separate Angledrive", AngledriveType.SeparateAngledrive }
-			};
-			foreach (var angleDrive in angledriveTypes) {
-				var reader = XmlReader.Create(SampleVehicleDecl);
-
-				var doc = new XmlDocument();
-				doc.Load(reader);
-				var nav = doc.CreateNavigator();
-				var manager = new XmlNamespaceManager(nav.NameTable);
-				var helper = new XPathHelper(ExecutionMode.Declaration);
-				helper.AddNamespaces(manager);
-
-				var xmlRetarderType = nav.SelectSingleNode(helper.QueryAbs(
-					helper.NSPrefix(XMLNames.VectoInputDeclaration,
-						Constants.XML.RootNSPrefix),
-					XMLNames.Component_Vehicle,
-					XMLNames.Vehicle_AngledriveType),
-					manager);
-				xmlRetarderType.SetValue(angleDrive.Key);
-
-				var modified = XmlReader.Create(new StringReader(nav.OuterXml));
-
-				var inputDataProvider = new XMLDeclarationInputDataProvider(modified,
-					true);
-
-				Assert.AreEqual(angleDrive.Value, inputDataProvider.AngledriveInputData.Type);
-			}
-		}
-
-		[TestMethod]
-		public void TestGearboxTypes()
-		{
-			var gearboxTypes = new Dictionary<string, GearboxType>() {
-				{ "SMT", GearboxType.MT },
-				{ "AMT", GearboxType.AMT },
-				{ "APT-S", GearboxType.ATSerial },
-				{ "APT-P", GearboxType.ATPowerSplit }
-			};
-			foreach (var gearboxType in gearboxTypes) {
-				var reader = XmlReader.Create(SampleVehicleDecl);
-
-				var doc = new XmlDocument();
-				doc.Load(reader);
-				var nav = doc.CreateNavigator();
-				var manager = new XmlNamespaceManager(nav.NameTable);
-				var helper = new XPathHelper(ExecutionMode.Declaration);
-				helper.AddNamespaces(manager);
-
-				var xmlRetarderType = nav.SelectSingleNode(helper.QueryAbs(
-					helper.NSPrefix(XMLNames.VectoInputDeclaration,
-						Constants.XML.RootNSPrefix),
-					XMLNames.Component_Vehicle,
-					XMLNames.Vehicle_Components,
-					XMLNames.Component_Gearbox,
-					XMLNames.ComponentDataWrapper,
-					XMLNames.Gearbox_TransmissionType),
-					manager);
-				xmlRetarderType.SetValue(gearboxType.Key);
-
-				var modified = XmlReader.Create(new StringReader(nav.OuterXml));
-
-				var inputDataProvider = new XMLDeclarationInputDataProvider(modified,
-					true);
-
-				Assert.AreEqual(gearboxType.Value, inputDataProvider.GearboxInputData.Type);
-			}
-		}
-
-		[TestMethod]
-		public void TestPTOInputNone()
-		{
-			var reader = XmlReader.Create(SampleVehicleDecl);
-
-			var inputDataProvider = new XMLDeclarationInputDataProvider(reader, true);
-			var ptoDataProvider = inputDataProvider.PTOTransmissionInputData;
-
-			Assert.AreEqual("None", ptoDataProvider.PTOTransmissionType);
-		}
-
-		[TestMethod]
-		public void TestPTOInput()
-		{
-			var reader = XmlReader.Create(SampleVehicleFullDecl);
-
-			var inputDataProvider = new XMLDeclarationInputDataProvider(reader, true);
-			var ptoDataProvider = inputDataProvider.PTOTransmissionInputData;
-			var ptoLosses = DeclarationData.PTOTransmission.Lookup(ptoDataProvider.PTOTransmissionType);
-
-			Assert.AreEqual("only the drive shaft of the PTO - multi-disc clutch", ptoDataProvider.PTOTransmissionType);
-			Assert.AreEqual(1000, ptoLosses.Value());
-		}
-	}
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Windows.Forms;
+using System.Xml;
+using System.Xml.Linq;
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+using TUGraz.VectoCommon.Exceptions;
+using TUGraz.VectoCommon.Models;
+using TUGraz.VectoCommon.Resources;
+using TUGraz.VectoCommon.Utils;
+using TUGraz.VectoCore.Configuration;
+using TUGraz.VectoCore.InputData.FileIO.XML.Declaration;
+using TUGraz.VectoCore.InputData.Reader;
+using TUGraz.VectoCore.InputData.Reader.ComponentData;
+using TUGraz.VectoCore.Models.Declaration;
+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;
+
+namespace TUGraz.VectoCore.Tests.XML
+{
+	[TestClass]
+	public class XMLDeclarationInputTest
+	{
+		const string SampleVehicleDecl = "TestData/XML/XMLReaderDeclaration/vecto_vehicle-sample.xml";
+		const string SampleVehicleFullDecl = "TestData/XML/XMLReaderDeclaration/vecto_vehicle-sample_FULL.xml";
+
+		[TestMethod]
+		public void TestXMLInputEng()
+		{
+			var reader = XmlReader.Create(SampleVehicleDecl);
+
+			var inputDataProvider = new XMLDeclarationInputDataProvider(reader, true);
+
+			var engineDataProvider = inputDataProvider.EngineInputData;
+
+			Assert.IsTrue(engineDataProvider.SavedInDeclarationMode);
+
+			Assert.AreEqual("Generic 40t Long Haul Truck Engine", engineDataProvider.Model);
+			Assert.AreEqual(0.012730, engineDataProvider.Displacement.Value());
+			Assert.AreEqual(1.0097, engineDataProvider.WHTCUrban);
+			//AssertHelper.Exception<VectoException>(() => { var tmp = engineDataProvider.Inertia; });
+
+			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.00", 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());
+
+			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);
+		}
+
+		[TestMethod]
+		public void TestXMLInputGbx()
+		{
+			var reader = XmlReader.Create(SampleVehicleDecl);
+
+			var inputDataProvider = new XMLDeclarationInputDataProvider(reader, 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.00", gears.First().LossMap.Rows[0][0]);
+			Assert.AreEqual("-350.00", 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(5000, gears.First().MaxTorque.Value());
+		}
+
+		[TestMethod]
+		public void TestXMLInputAxlG()
+		{
+			var reader = XmlReader.Create(SampleVehicleDecl);
+
+			var inputDataProvider = new XMLDeclarationInputDataProvider(reader, 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.00", lossMapData.Rows[0][0]);
+			Assert.AreEqual("-5000.00", lossMapData.Rows[0][1]);
+			Assert.AreEqual("115.00", lossMapData.Rows[0][2]);
+
+			var lossMap = TransmissionLossMapReader.Create(lossMapData, axlegearDataProvider.Ratio, "AxleGear");
+			Assert.IsNotNull(lossMap);
+
+			AssertHelper.Exception<VectoException>(() => { var tmp = axlegearDataProvider.Efficiency; });
+		}
+
+		[TestMethod]
+		public void TestXMLInputRetarder()
+		{
+			var reader = XmlReader.Create(SampleVehicleDecl);
+
+			var inputDataProvider = new XMLDeclarationInputDataProvider(reader, true);
+			var retarderDataProvider = inputDataProvider.RetarderInputData;
+
+			Assert.AreEqual("Generic Retarder", retarderDataProvider.Model);
+
+			var lossMapData = retarderDataProvider.LossMap;
+
+			Assert.AreEqual(RetarderType.TransmissionOutputRetarder, retarderDataProvider.Type);
+
+			Assert.AreEqual("0.00", lossMapData.Rows[0][0]);
+			Assert.AreEqual("10.00", lossMapData.Rows[0][1]);
+
+			var lossMap = RetarderLossMapReader.Create(lossMapData);
+			Assert.IsNotNull(lossMap);
+		}
+
+		[TestMethod]
+		public void TestXMLInputAxleWheels()
+		{
+			var reader = XmlReader.Create(SampleVehicleDecl);
+
+			var inputDataProvider = new XMLDeclarationInputDataProvider(reader, 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());
+		}
+
+		[TestMethod]
+		public void TestXMLInputAxleWheelsDuplicates()
+		{
+			var reader = XmlReader.Create(SampleVehicleDecl);
+
+			var doc = new XmlDocument();
+			doc.Load(reader);
+			var nav = doc.CreateNavigator();
+			var manager = new XmlNamespaceManager(nav.NameTable);
+			var helper = new XPathHelper(ExecutionMode.Declaration);
+			helper.AddNamespaces(manager);
+
+			var firstAxle = nav.SelectSingleNode(helper.QueryAbs(
+				helper.NSPrefix(XMLNames.VectoInputDeclaration, Constants.XML.RootNSPrefix),
+				XMLNames.Component_Vehicle,
+				XMLNames.Vehicle_Components,
+				XMLNames.Component_AxleWheels,
+				XMLNames.ComponentDataWrapper,
+				XMLNames.AxleWheels_Axles,
+				helper.QueryConstraint(XMLNames.AxleWheels_Axles_Axle, "1", null, string.Empty)
+				), manager);
+			firstAxle.MoveToAttribute(XMLNames.AxleWheels_Axles_Axle_AxleNumber_Attr, string.Empty);
+			firstAxle.SetTypedValue(2);
+
+
+			var modified = XmlReader.Create(new StringReader(nav.OuterXml));
+
+			var inputDataProvider = new XMLDeclarationInputDataProvider(modified, true);
+			var vehicleDataProvider = inputDataProvider.VehicleInputData;
+
+			AssertHelper.Exception<VectoException>(() => { var axles = vehicleDataProvider.Axles; });
+		}
+
+		[TestMethod]
+		public void TestXMLInputAxleWheelsAxleNumTooLow()
+		{
+			var reader = XmlReader.Create(SampleVehicleDecl);
+
+			var doc = new XmlDocument();
+			doc.Load(reader);
+			var nav = doc.CreateNavigator();
+			var manager = new XmlNamespaceManager(nav.NameTable);
+			var helper = new XPathHelper(ExecutionMode.Declaration);
+			helper.AddNamespaces(manager);
+
+			var firstAxle = nav.SelectSingleNode(helper.QueryAbs(
+				helper.NSPrefix(XMLNames.VectoInputDeclaration, Constants.XML.RootNSPrefix),
+				XMLNames.Component_Vehicle,
+				XMLNames.Vehicle_Components,
+				XMLNames.Component_AxleWheels,
+				XMLNames.ComponentDataWrapper,
+				XMLNames.AxleWheels_Axles,
+				helper.QueryConstraint(XMLNames.AxleWheels_Axles_Axle, "1", null, string.Empty)
+				), manager);
+			firstAxle.MoveToAttribute(XMLNames.AxleWheels_Axles_Axle_AxleNumber_Attr, string.Empty);
+			firstAxle.SetTypedValue(0);
+
+
+			var modified = XmlReader.Create(new StringReader(nav.OuterXml));
+
+			AssertHelper.Exception<VectoException>(
+				() => { var inputDataProvider = new XMLDeclarationInputDataProvider(modified, true); });
+		}
+
+		[TestMethod]
+		public void TestXMLInputAxleWheelsAxleNumTooHigh()
+		{
+			var reader = XmlReader.Create(SampleVehicleDecl);
+
+			var doc = new XmlDocument();
+			doc.Load(reader);
+			var nav = doc.CreateNavigator();
+			var manager = new XmlNamespaceManager(nav.NameTable);
+			var helper = new XPathHelper(ExecutionMode.Declaration);
+			helper.AddNamespaces(manager);
+
+			var firstAxle = nav.SelectSingleNode(helper.QueryAbs(
+				helper.NSPrefix(XMLNames.VectoInputDeclaration, Constants.XML.RootNSPrefix),
+				XMLNames.Component_Vehicle,
+				XMLNames.Vehicle_Components,
+				XMLNames.Component_AxleWheels,
+				XMLNames.ComponentDataWrapper,
+				XMLNames.AxleWheels_Axles,
+				helper.QueryConstraint(XMLNames.AxleWheels_Axles_Axle, "1", null, string.Empty)
+				), manager);
+			firstAxle.MoveToAttribute(XMLNames.AxleWheels_Axles_Axle_AxleNumber_Attr, string.Empty);
+			firstAxle.SetTypedValue(3);
+
+
+			var modified = XmlReader.Create(new StringReader(nav.OuterXml));
+
+			var inputDataProvider = new XMLDeclarationInputDataProvider(modified, true);
+			var vehicleDataProvider = inputDataProvider.VehicleInputData;
+
+			AssertHelper.Exception<VectoException>(() => { var axles = vehicleDataProvider.Axles; });
+		}
+
+		[TestMethod]
+		public void TestXMLInputAuxiliaries()
+		{
+			var reader = XmlReader.Create(SampleVehicleDecl);
+
+			var inputDataProvider = new XMLDeclarationInputDataProvider(reader, true);
+			var auxDataProvider = inputDataProvider.AuxiliaryInputData();
+
+			var aux = auxDataProvider.Auxiliaries;
+			var aux1 = aux[0];
+
+			Assert.AreEqual(AuxiliaryType.Fan, aux1.Type);
+			Assert.AreEqual("Hydraulic driven - Constant displacement pump", aux1.Technology.First());
+
+			var aux3 = aux[2];
+			Assert.AreEqual(AuxiliaryType.ElectricSystem, aux3.Type);
+			Assert.AreEqual("Standard technology - LED headlights, all", aux3.Technology.First());
+		}
+
+		[TestMethod]
+		public void TestXMLInputADAS()
+		{
+			var reader = XmlReader.Create(SampleVehicleDecl);
+
+			var inputDataProvider = new XMLDeclarationInputDataProvider(reader, true);
+
+			var adas = inputDataProvider.DriverInputData;
+
+			Assert.AreEqual(DriverMode.Overspeed, adas.OverSpeedEcoRoll.Mode);
+		}
+
+		[TestMethod]
+		public void TestVehicleInput()
+		{
+			var reader = XmlReader.Create(SampleVehicleDecl);
+
+			var inputDataProvider = new XMLDeclarationInputDataProvider(reader, 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(40000.0, vehicleDataProvider.GrossVehicleMassRating.Value());
+			Assert.AreEqual(6.34, inputDataProvider.AirdragInputData.AirDragArea.Value());
+
+			Assert.AreEqual(1.0, inputDataProvider.RetarderInputData.Ratio);
+		}
+
+		[TestMethod]
+		public void TestXMLPowertrainGeneration()
+		{
+			var reader = XmlReader.Create(SampleVehicleDecl);
+
+			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 XMLDeclarationInputDataProvider(reader, true);
+
+			var runsFactory = new SimulatorFactory(ExecutionMode.Declaration, dataProvider, fileWriter);
+			runsFactory.WriteModalResults = true;
+
+			jobContainer.AddRuns(runsFactory);
+
+			Assert.AreEqual(8, jobContainer.Runs.Count);
+		}
+
+		[TestMethod]
+		public void TestFullFeaturedXMEngineering_TorqueConverter()
+		{
+			var reader = XmlReader.Create(SampleVehicleFullDecl);
+
+			var inputDataProvider = new XMLDeclarationInputDataProvider(reader, true);
+
+			var tcDataProvider = inputDataProvider.TorqueConverterInputData;
+
+
+			Assert.AreEqual(3, tcDataProvider.TCData.Rows.Count);
+			Assert.AreEqual("300.00", tcDataProvider.TCData.Rows[0][2]);
+			Assert.AreEqual("0.90", tcDataProvider.TCData.Rows[2][1]);
+		}
+
+		[TestMethod]
+		public void TestFullFeaturedXMLDeclaration_AngleDrive()
+		{
+			var reader = XmlReader.Create(SampleVehicleFullDecl);
+
+			var inputDataProvider = new XMLDeclarationInputDataProvider(reader, true);
+
+
+			var angledriveDataProvider = inputDataProvider.AngledriveInputData;
+
+			Assert.AreEqual(2.345, angledriveDataProvider.Ratio);
+			Assert.AreEqual(6, angledriveDataProvider.LossMap.Rows.Count);
+			Assert.AreEqual("-10000.00", angledriveDataProvider.LossMap.Rows[0][1]);
+
+			AssertHelper.Exception<VectoException>(() => { var tmp = angledriveDataProvider.Efficiency; });
+		}
+
+		[TestMethod]
+		public void TestVehicleInputData()
+		{
+			var reader = XmlReader.Create(SampleVehicleFullDecl);
+
+			var inputDataProvider = new XMLDeclarationInputDataProvider(reader, true);
+			var vehicleDataProvider = inputDataProvider.JobInputData().Vehicle;
+
+			Assert.AreEqual(VehicleCategory.Tractor, vehicleDataProvider.VehicleCategory);
+			Assert.AreEqual(AxleConfiguration.AxleConfig_4x2, vehicleDataProvider.AxleConfiguration);
+
+			Assert.AreEqual(7100.0, vehicleDataProvider.CurbMassChassis.Value());
+			Assert.AreEqual(40000.0, vehicleDataProvider.GrossVehicleMassRating.Value());
+			Assert.AreEqual(6.34, inputDataProvider.AirdragInputData.AirDragArea.Value());
+
+			Assert.AreEqual(1.0, inputDataProvider.RetarderInputData.Ratio);
+		}
+
+		[TestMethod]
+		public void TestFullFeaturedXMLDeclaration_TorqueLimits()
+		{
+			var reader = XmlReader.Create(SampleVehicleFullDecl);
+
+			var inputDataProvider = new XMLDeclarationInputDataProvider(reader, true);
+			var vehicleDataProvider = inputDataProvider.JobInputData().Vehicle;
+
+			var torqueLimits = vehicleDataProvider.TorqueLimits.OrderBy(x => x.Gear).ToList();
+			Assert.AreEqual(3, torqueLimits.Count);
+			Assert.AreEqual(1, torqueLimits[0].Gear);
+			Assert.AreEqual(2500, torqueLimits[0].MaxTorque.Value());
+			Assert.AreEqual(12, torqueLimits[2].Gear);
+		}
+
+		[TestMethod]
+		public void TestFullFeaturedXMLDeclaration_GbxTorqueLimits()
+		{
+			var reader = XmlReader.Create(SampleVehicleFullDecl);
+
+			var inputDataProvider = new XMLDeclarationInputDataProvider(reader, true);
+			var gearboxDataProvider = inputDataProvider.GearboxInputData;
+			var gears = gearboxDataProvider.Gears;
+
+			Assert.AreEqual(12, gears.Count);
+			Assert.AreEqual(1900, gears[0].MaxTorque.Value());
+			Assert.AreEqual(1900, gears[1].MaxTorque.Value());
+			Assert.IsNull(gears[11].MaxTorque);
+		}
+
+		[TestMethod]
+		public void TestFullFeaturedXMLDeclaration_GbxSpeedLimits()
+		{
+			var reader = XmlReader.Create(SampleVehicleFullDecl);
+
+			var inputDataProvider = new XMLDeclarationInputDataProvider(reader, true);
+			var gearboxDataProvider = inputDataProvider.GearboxInputData;
+			var gears = gearboxDataProvider.Gears;
+
+			Assert.AreEqual(12, gears.Count);
+			Assert.AreEqual(2000, gears[0].MaxInputSpeed.AsRPM, 1e-6);
+			Assert.AreEqual(2000, gears[1].MaxInputSpeed.AsRPM, 1e-6);
+			Assert.IsNull(gears[11].MaxInputSpeed);
+		}
+
+		[TestMethod]
+		public void TestElementNotAvailable()
+		{
+			var reader = XmlReader.Create(SampleVehicleDecl);
+
+			var doc = new XmlDocument();
+			doc.Load(reader);
+			var nav = doc.CreateNavigator();
+			var manager = new XmlNamespaceManager(nav.NameTable);
+			var helper = new XPathHelper(ExecutionMode.Declaration);
+			helper.AddNamespaces(manager);
+
+			var retarderRatio = nav.SelectSingleNode(helper.QueryAbs(
+				helper.NSPrefix(XMLNames.VectoInputDeclaration, Constants.XML.RootNSPrefix),
+				XMLNames.Component_Vehicle,
+				XMLNames.Vehicle_RetarderRatio), manager);
+			retarderRatio.DeleteSelf();
+
+			var modified = XmlReader.Create(new StringReader(nav.OuterXml));
+
+			var inputDataProvider = new XMLDeclarationInputDataProvider(modified, true);
+
+			AssertHelper.Exception<VectoException>(() => { var tmp = inputDataProvider.RetarderInputData.Ratio; });
+		}
+
+		[TestMethod]
+		public void TestRetarderTypeNone()
+		{
+			var reader = XmlReader.Create(SampleVehicleDecl);
+
+			var doc = new XmlDocument();
+			doc.Load(reader);
+			var nav = doc.CreateNavigator();
+			var manager = new XmlNamespaceManager(nav.NameTable);
+			var helper = new XPathHelper(ExecutionMode.Declaration);
+			helper.AddNamespaces(manager);
+
+			var retarderType = nav.SelectSingleNode(helper.QueryAbs(
+				helper.NSPrefix(XMLNames.VectoInputDeclaration, Constants.XML.RootNSPrefix),
+				XMLNames.Component_Vehicle,
+				XMLNames.Vehicle_RetarderType), manager);
+			retarderType.SetValue("None");
+
+			var retarder = nav.SelectSingleNode(helper.QueryAbs(
+				helper.NSPrefix(XMLNames.VectoInputDeclaration, Constants.XML.RootNSPrefix),
+				XMLNames.Component_Vehicle,
+				XMLNames.Vehicle_Components,
+				XMLNames.Component_Retarder), manager);
+			retarder.DeleteSelf();
+
+			var modified = XmlReader.Create(new StringReader(nav.OuterXml));
+
+			var inputDataProvider = new XMLDeclarationInputDataProvider(modified, true);
+
+			var factory = new SimulatorFactory(ExecutionMode.Declaration, inputDataProvider, new FileOutputWriter("dummy"));
+			var jobContainer = new JobContainer(null);
+			jobContainer.AddRuns(factory);
+			jobContainer.Execute();
+		}
+
+		[TestMethod]
+		public void TestRetarderTypes()
+		{
+			var retarderTypes = new Dictionary<string, RetarderType>() {
+				{ "None", RetarderType.None },
+				{ "Losses included in Gearbox", RetarderType.LossesIncludedInTransmission },
+				{ "Engine Retarder", RetarderType.EngineRetarder },
+				{ "Transmission Input Retarder", RetarderType.TransmissionInputRetarder },
+				{ "Transmission Output Retarder", RetarderType.TransmissionOutputRetarder }
+			}
+				;
+			foreach (var retarderType in retarderTypes) {
+				var reader = XmlReader.Create(SampleVehicleDecl);
+
+				var doc = new XmlDocument();
+				doc.Load(reader);
+				var nav = doc.CreateNavigator();
+				var manager = new XmlNamespaceManager(nav.NameTable);
+				var helper = new XPathHelper(ExecutionMode.Declaration);
+				helper.AddNamespaces(manager);
+
+				var xmlRetarderType = nav.SelectSingleNode(helper.QueryAbs(
+					helper.NSPrefix(XMLNames.VectoInputDeclaration, Constants.XML.RootNSPrefix),
+					XMLNames.Component_Vehicle,
+					XMLNames.Vehicle_RetarderType), manager);
+				xmlRetarderType.SetValue(retarderType.Key);
+
+				var modified = XmlReader.Create(new StringReader(nav.OuterXml));
+
+				var inputDataProvider = new XMLDeclarationInputDataProvider(modified, true);
+
+				Assert.AreEqual(retarderType.Value, inputDataProvider.RetarderInputData.Type);
+			}
+		}
+
+		[TestMethod]
+		public void TestAxleConfigurationTypes()
+		{
+			var axleConfigurations = new Dictionary<string, AxleConfiguration>() {
+				{ "4x2", AxleConfiguration.AxleConfig_4x2 },
+				//{ "4x4", AxleConfiguration.AxleConfig_4x4 },
+				{ "6x2", AxleConfiguration.AxleConfig_6x2 },
+				{ "6x4", AxleConfiguration.AxleConfig_6x4 },
+				//{ "6x6", AxleConfiguration.AxleConfig_6x6 },
+				//{ "8x2", AxleConfiguration.AxleConfig_8x2 },
+				{ "8x4", AxleConfiguration.AxleConfig_8x4 },
+				//{ "8x6", AxleConfiguration.AxleConfig_8x6 },
+				//{ "8x8", AxleConfiguration.AxleConfig_8x8 }
+			};
+			foreach (var axleConfiguration in axleConfigurations) {
+				var reader = XmlReader.Create(SampleVehicleDecl);
+
+				var doc = new XmlDocument();
+				doc.Load(reader);
+				var nav = doc.CreateNavigator();
+				var manager = new XmlNamespaceManager(nav.NameTable);
+				var helper = new XPathHelper(ExecutionMode.Declaration);
+				helper.AddNamespaces(manager);
+
+				var xmlRetarderType = nav.SelectSingleNode(helper.QueryAbs(
+					helper.NSPrefix(XMLNames.VectoInputDeclaration, Constants.XML.RootNSPrefix),
+					XMLNames.Component_Vehicle,
+					XMLNames.Vehicle_AxleConfiguration), manager);
+				xmlRetarderType.SetValue(axleConfiguration.Key);
+
+				var modified = XmlReader.Create(new StringReader(nav.OuterXml));
+
+				var inputDataProvider = new XMLDeclarationInputDataProvider(modified, true);
+
+				Assert.AreEqual(axleConfiguration.Value, inputDataProvider.VehicleInputData.AxleConfiguration);
+			}
+		}
+
+		[TestMethod]
+		public void TestVehicleCategoryTypes()
+		{
+			var vehicleCategories = new Dictionary<string, VehicleCategory>() {
+				{ "Rigid Truck", VehicleCategory.RigidTruck },
+				{ "Tractor", VehicleCategory.Tractor },
+				//{ "City Bus", VehicleCategory.CityBus },
+				//{ "Interurban Bus", VehicleCategory.InterurbanBus },
+				//{ "Coach", VehicleCategory.Coach }
+			};
+			foreach (var vehicleCategory in vehicleCategories) {
+				var reader = XmlReader.Create(SampleVehicleDecl);
+
+				var doc = new XmlDocument();
+				doc.Load(reader);
+				var nav = doc.CreateNavigator();
+				var manager = new XmlNamespaceManager(nav.NameTable);
+				var helper = new XPathHelper(ExecutionMode.Declaration);
+				helper.AddNamespaces(manager);
+
+				var xmlRetarderType = nav.SelectSingleNode(helper.QueryAbs(
+					helper.NSPrefix(XMLNames.VectoInputDeclaration, Constants.XML.RootNSPrefix),
+					XMLNames.Component_Vehicle,
+					XMLNames.Vehicle_VehicleCategory), manager);
+				xmlRetarderType.SetValue(vehicleCategory.Key);
+
+				var modified = XmlReader.Create(new StringReader(nav.OuterXml));
+
+				var inputDataProvider = new XMLDeclarationInputDataProvider(modified, true);
+
+				Assert.AreEqual(vehicleCategory.Value, inputDataProvider.VehicleInputData.VehicleCategory);
+			}
+		}
+
+
+		[TestMethod]
+		public void TestWheelsTypes()
+		{
+			var retarderTypes = new Dictionary<string, RetarderType>() { };
+			foreach (var retarderType in retarderTypes) {
+				var reader = XmlReader.Create(SampleVehicleDecl);
+
+				var doc = new XmlDocument();
+				doc.Load(reader);
+				var nav = doc.CreateNavigator();
+				var manager = new XmlNamespaceManager(nav.NameTable);
+				var helper = new XPathHelper(ExecutionMode.Declaration);
+				helper.AddNamespaces(manager);
+
+				var xmlRetarderType = nav.SelectSingleNode(helper.QueryAbs(
+					helper.NSPrefix(XMLNames.VectoInputDeclaration,
+						Constants.XML.RootNSPrefix),
+					XMLNames.Component_Vehicle,
+					XMLNames.Vehicle_RetarderType),
+					manager);
+				xmlRetarderType.SetValue(retarderType.Key);
+
+				var modified = XmlReader.Create(new StringReader(nav.OuterXml));
+
+				var inputDataProvider = new XMLDeclarationInputDataProvider(modified,
+					true);
+
+				Assert.AreEqual(retarderType.Value,
+					inputDataProvider.RetarderInputData.Type);
+			}
+		}
+
+		[TestMethod]
+		public void TestPTOTypeTypes()
+		{
+			var ptoTypes = new string[][] {
+				new[] { "none", "none" },
+				new[] { "only one engaged gearwheel above oil level", "none" },
+				new[] { "only the drive shaft of the PTO", "shift claw, synchronizer, sliding gearwheel" },
+				new[] { "only the drive shaft of the PTO", "multi-disc clutch" },
+				new[] { "only the drive shaft of the PTO", "multi-disc clutch, oil pump" },
+				new[] { "drive shaft and/or up to 2 gear wheels", "shift claw, synchronizer, sliding gearwheel" },
+				new[] { "drive shaft and/or up to 2 gear wheels", "multi-disc clutch" },
+				new[] { "drive shaft and/or up to 2 gear wheels", "multi-disc clutch, oil pump" },
+				new[] { "drive shaft and/or more than 2 gear wheels", "shift claw, synchronizer, sliding gearwheel" },
+				new[] { "drive shaft and/or more than 2 gear wheels", "multi-disc clutch" },
+				new[] { "drive shaft and/or more than 2 gear wheels", "multi-disc clutch, oil pump" },
+			};
+			foreach (var ptoType in ptoTypes) {
+				var reader = XmlReader.Create(SampleVehicleDecl);
+
+				var doc = new XmlDocument();
+				doc.Load(reader);
+				var nav = doc.CreateNavigator();
+				var manager = new XmlNamespaceManager(nav.NameTable);
+				var helper = new XPathHelper(ExecutionMode.Declaration);
+				helper.AddNamespaces(manager);
+
+				var ptoGearWheels = nav.SelectSingleNode(helper.QueryAbs(
+					helper.NSPrefix(XMLNames.VectoInputDeclaration,
+						Constants.XML.RootNSPrefix),
+					XMLNames.Component_Vehicle,
+					XMLNames.Vehicle_PTO,
+					XMLNames.Vehicle_PTO_ShaftsGearWheels),
+					manager);
+				ptoGearWheels.SetValue(ptoType[0]);
+				var ptoOther = nav.SelectSingleNode(helper.QueryAbs(
+					helper.NSPrefix(XMLNames.VectoInputDeclaration,
+						Constants.XML.RootNSPrefix),
+					XMLNames.Component_Vehicle,
+					XMLNames.Vehicle_PTO,
+					XMLNames.Vehicle_PTO_OtherElements),
+					manager);
+				ptoOther.SetValue(ptoType[1]);
+
+				var modified = XmlReader.Create(new StringReader(nav.OuterXml));
+
+				var inputDataProvider = new XMLDeclarationInputDataProvider(modified,
+					true);
+
+				if (ptoType[0] == "none") {
+					Assert.AreEqual("None",
+						inputDataProvider.PTOTransmissionInputData.PTOTransmissionType);
+				} else if (ptoType[0] == "only one engaged gearwheel above oil level") {
+					Assert.AreEqual(ptoType[0],
+						inputDataProvider.PTOTransmissionInputData.PTOTransmissionType);
+				} else {
+					Assert.AreEqual(string.Format("{0} - {1}", ptoType[0], ptoType[1]),
+						inputDataProvider.PTOTransmissionInputData.PTOTransmissionType);
+				}
+				DeclarationData.PTOTransmission.Lookup(inputDataProvider.PTOTransmissionInputData.PTOTransmissionType);
+			}
+		}
+
+		[TestMethod]
+		public void TestAngledriveTypes()
+		{
+			var angledriveTypes = new Dictionary<string, AngledriveType>() {
+				{ "None", AngledriveType.None },
+				{ "Losses included in Gearbox", AngledriveType.LossesIncludedInGearbox },
+				{ "Separate Angledrive", AngledriveType.SeparateAngledrive }
+			};
+			foreach (var angleDrive in angledriveTypes) {
+				var reader = XmlReader.Create(SampleVehicleDecl);
+
+				var doc = new XmlDocument();
+				doc.Load(reader);
+				var nav = doc.CreateNavigator();
+				var manager = new XmlNamespaceManager(nav.NameTable);
+				var helper = new XPathHelper(ExecutionMode.Declaration);
+				helper.AddNamespaces(manager);
+
+				var xmlRetarderType = nav.SelectSingleNode(helper.QueryAbs(
+					helper.NSPrefix(XMLNames.VectoInputDeclaration,
+						Constants.XML.RootNSPrefix),
+					XMLNames.Component_Vehicle,
+					XMLNames.Vehicle_AngledriveType),
+					manager);
+				xmlRetarderType.SetValue(angleDrive.Key);
+
+				var modified = XmlReader.Create(new StringReader(nav.OuterXml));
+
+				var inputDataProvider = new XMLDeclarationInputDataProvider(modified,
+					true);
+
+				Assert.AreEqual(angleDrive.Value, inputDataProvider.AngledriveInputData.Type);
+			}
+		}
+
+		[TestMethod]
+		public void TestGearboxTypes()
+		{
+			var gearboxTypes = new Dictionary<string, GearboxType>() {
+				{ "SMT", GearboxType.MT },
+				{ "AMT", GearboxType.AMT },
+				{ "APT-S", GearboxType.ATSerial },
+				{ "APT-P", GearboxType.ATPowerSplit }
+			};
+			foreach (var gearboxType in gearboxTypes) {
+				var reader = XmlReader.Create(SampleVehicleDecl);
+
+				var doc = new XmlDocument();
+				doc.Load(reader);
+				var nav = doc.CreateNavigator();
+				var manager = new XmlNamespaceManager(nav.NameTable);
+				var helper = new XPathHelper(ExecutionMode.Declaration);
+				helper.AddNamespaces(manager);
+
+				var xmlRetarderType = nav.SelectSingleNode(helper.QueryAbs(
+					helper.NSPrefix(XMLNames.VectoInputDeclaration,
+						Constants.XML.RootNSPrefix),
+					XMLNames.Component_Vehicle,
+					XMLNames.Vehicle_Components,
+					XMLNames.Component_Gearbox,
+					XMLNames.ComponentDataWrapper,
+					XMLNames.Gearbox_TransmissionType),
+					manager);
+				xmlRetarderType.SetValue(gearboxType.Key);
+
+				var modified = XmlReader.Create(new StringReader(nav.OuterXml));
+
+				var inputDataProvider = new XMLDeclarationInputDataProvider(modified,
+					true);
+
+				Assert.AreEqual(gearboxType.Value, inputDataProvider.GearboxInputData.Type);
+			}
+		}
+
+		[TestMethod]
+		public void TestPTOInputNone()
+		{
+			var reader = XmlReader.Create(SampleVehicleDecl);
+
+			var inputDataProvider = new XMLDeclarationInputDataProvider(reader, true);
+			var ptoDataProvider = inputDataProvider.PTOTransmissionInputData;
+
+			Assert.AreEqual("None", ptoDataProvider.PTOTransmissionType);
+		}
+
+		[TestMethod]
+		public void TestPTOInput()
+		{
+			var reader = XmlReader.Create(SampleVehicleFullDecl);
+
+			var inputDataProvider = new XMLDeclarationInputDataProvider(reader, true);
+			var ptoDataProvider = inputDataProvider.PTOTransmissionInputData;
+			var lookup = DeclarationData.PTOTransmission.Lookup(ptoDataProvider.PTOTransmissionType);
+
+			Assert.AreEqual("only the drive shaft of the PTO - multi-disc clutch", ptoDataProvider.PTOTransmissionType);
+			Assert.AreEqual(1000, lookup.PowerDemand.Value());
+		}
+	}
 }
\ No newline at end of file