From 5d3326f03b94d8cf1d0d39d2fd2829e1985ba8f2 Mon Sep 17 00:00:00 2001
From: "VKMTHD\\haraldmartini" <harald.martini@student.tugraz.at>
Date: Tue, 6 Sep 2022 16:53:04 +0200
Subject: [PATCH] cleaned up files, implemented DataAdapter for Conventional
 Heavy Lorry

---
 .../AbstractSimulationDataAdapter.cs          | 343 ++------
 ...clarationDataAdapterGenericCompletedBus.cs |   7 +-
 ...clarationDataAdapterCompletedBusGeneric.cs |   9 +-
 .../DeclarationDataAdapterNinjectModule.cs    |   7 +-
 .../DeclarationDataAdapterSingleBus.cs        | 183 ++---
 .../EngineeringDataAdapter.cs                 | 265 ++++++-
 .../HeavyLorry/Conventional.cs                | 748 ------------------
 .../DeclarationDataAdapterHeavyLorry.cs       | 291 +++++--
 .../DeclarationDataAdapterHeavyLorry_old.cs   | 104 +++
 .../DataObjectAdapter/HeavyLorry/HEV_P1.cs    |  10 -
 .../DataObjectAdapter/HeavyLorry/HEV_P2.cs    |  11 -
 .../DataObjectAdapter/HeavyLorry/HEV_P2_5.cs  |  12 -
 .../DataObjectAdapter/HeavyLorry/HEV_P3.cs    |  12 -
 .../DataObjectAdapter/HeavyLorry/HEV_P4.cs    |  12 -
 .../DataObjectAdapter/HeavyLorry/HEV_S3.cs    |  10 -
 .../DataObjectAdapter/HeavyLorry/HEV_S4.cs    |  10 -
 .../HeavyLorryDeclarationDataAdapter.cd       |   2 +
 .../DataObjectAdapter/HeavyLorry/LorryBase.cs |  94 ---
 .../DataObjectAdapter/HeavyLorry/PEV_E2.cs    |  11 -
 .../DataObjectAdapter/HeavyLorry/PEV_E3.cs    |  11 -
 .../DataObjectAdapter/HeavyLorry/PEV_E4.cs    |  11 -
 .../HeavyLorry/PEV_E_IEPC.cs                  |  11 -
 .../HeavyLorry/SerialHybrid.cs                |  26 -
 .../IDeclarationDataAdapter.cs                |  11 +-
 .../DeclarationDataAdapterPrimaryBus.cs       | 135 ++--
 .../SimulationComponents/ADASDataAdapter.cs   |  24 +
 .../AirdragDataAdapter.cs                     | 156 ++++
 .../AngledriveDataAdapter.cs                  |  78 ++
 .../AuxiliaryDataAdapter.cs                   | 565 +++++++++++++
 .../AxleGearDataAdapter.cs                    |  79 ++
 .../SimulationComponents/DataAdapterBase.cs   |  24 +
 .../SimulationComponents/EngineDataAdapter.cs | 226 ++++++
 .../GearBoxDataAdapter.cs                     | 383 +++++++++
 .../SimulationComponents/PTODataAdapter.cs    |  40 +
 .../RetarderDataAdapter.cs                    |  88 +++
 .../TorqueConverterDataAdapter.cs             |  53 ++
 .../VehicleDataAdapter.cs                     | 247 ++++++
 .../Reader/VectoRunDataFactoryFactory.cs      |   5 +-
 .../VectoRunDataFactoryNinjectModule.cs       |  20 +-
 .../Electrics/ElectricsUserInputsConfig.cs    |   6 +-
 VectoCore/VectoCore/VectoCore.csproj          |   1 -
 .../RunDataFactoryFactoryTest.cs              |  12 +-
 42 files changed, 2845 insertions(+), 1508 deletions(-)
 delete mode 100644 VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/Conventional.cs
 create mode 100644 VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/DeclarationDataAdapterHeavyLorry_old.cs
 delete mode 100644 VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/HEV_P1.cs
 delete mode 100644 VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/HEV_P2.cs
 delete mode 100644 VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/HEV_P2_5.cs
 delete mode 100644 VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/HEV_P3.cs
 delete mode 100644 VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/HEV_P4.cs
 delete mode 100644 VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/HEV_S3.cs
 delete mode 100644 VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/HEV_S4.cs
 create mode 100644 VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/HeavyLorryDeclarationDataAdapter.cd
 delete mode 100644 VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/LorryBase.cs
 delete mode 100644 VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/PEV_E2.cs
 delete mode 100644 VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/PEV_E3.cs
 delete mode 100644 VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/PEV_E4.cs
 delete mode 100644 VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/PEV_E_IEPC.cs
 delete mode 100644 VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/SerialHybrid.cs
 create mode 100644 VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/ADASDataAdapter.cs
 create mode 100644 VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/AirdragDataAdapter.cs
 create mode 100644 VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/AngledriveDataAdapter.cs
 create mode 100644 VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/AuxiliaryDataAdapter.cs
 create mode 100644 VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/AxleGearDataAdapter.cs
 create mode 100644 VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/DataAdapterBase.cs
 create mode 100644 VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/EngineDataAdapter.cs
 create mode 100644 VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/GearBoxDataAdapter.cs
 create mode 100644 VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/PTODataAdapter.cs
 create mode 100644 VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/RetarderDataAdapter.cs
 create mode 100644 VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/TorqueConverterDataAdapter.cs
 create mode 100644 VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/VehicleDataAdapter.cs

diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/AbstractSimulationDataAdapter.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/AbstractSimulationDataAdapter.cs
index 126c19ea45..a73feb8bf9 100644
--- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/AbstractSimulationDataAdapter.cs
+++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/AbstractSimulationDataAdapter.cs
@@ -48,39 +48,20 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter
 	public abstract class AbstractSimulationDataAdapter : LoggingObject
 	{
 		// =========================
-
-		internal VehicleData SetCommonVehicleData(IVehicleDeclarationInputData data)
-		{
-			var retVal = new VehicleData {
-				InputData = data,
-				SavedInDeclarationMode = data.SavedInDeclarationMode,
-				Manufacturer = data.Manufacturer,
-				ModelName = data.Model,
-				Date = data.Date,
-				//CertificationNumber = data.CertificationNumber,
-				DigestValueInput = data.DigestValue != null ? data.DigestValue.DigestValue : "",
-				VehicleCategory = data.VehicleCategory,
-				CurbMass = data.CurbMassChassis,
-				GrossVehicleMass = data.GrossVehicleMassRating,
-				AirDensity = Physics.AirDensity,
-			};
-
-			return retVal;
-		}
-
 		protected VehicleData.ADASData CreateADAS(IAdvancedDriverAssistantSystemDeclarationInputData adas)
 		{
-			return new VehicleData.ADASData {
+			return new VehicleData.ADASData
+			{
 				EngineStopStart = adas.EngineStopStart,
 				EcoRoll = adas.EcoRoll,
 				PredictiveCruiseControl = adas.PredictiveCruiseControl,
 				InputData = adas
 			};
 		}
-
 		internal AirdragData SetCommonAirdragData(IAirdragDeclarationInputData data)
 		{
-			var retVal = new AirdragData() {
+			var retVal = new AirdragData()
+			{
 				SavedInDeclarationMode = data.SavedInDeclarationMode,
 				Manufacturer = data.Manufacturer,
 				ModelName = data.Model,
@@ -91,61 +72,10 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter
 			};
 			return retVal;
 		}
-
-		internal RetarderData SetCommonRetarderData(IRetarderInputData retarderInputData, 
-			PowertrainPosition position = PowertrainPosition.HybridPositionNotSet)
-		{
-			try {
-				var retarder = new RetarderData { Type = retarderInputData.Type };
-
-				switch (retarder.Type) {
-					case RetarderType.TransmissionInputRetarder:
-					case RetarderType.TransmissionOutputRetarder:
-						if (!(position.IsParallelHybrid() || position.IsOneOf(PowertrainPosition.HybridPositionNotSet, PowertrainPosition.BatteryElectricE2))) {
-							throw new ArgumentException("Transmission retarder is only allowed in powertrains that " +
-														"contain a gearbox: Conventional, HEV-P, and PEV-E2.", nameof(retarder));
-						}
-
-						retarder.LossMap = RetarderLossMapReader.Create(retarderInputData.LossMap);
-						retarder.Ratio = retarderInputData.Ratio;
-						break;
-					
-					case RetarderType.AxlegearInputRetarder:
-						if (position != PowertrainPosition.BatteryElectricE3)
-							throw new ArgumentException("AxlegearInputRetarder is only allowed for PEV-E3, HEV-S3, S-IEPC, E-IEPC. ", nameof(retarder));
-						retarder.LossMap = RetarderLossMapReader.Create(retarderInputData.LossMap);
-						retarder.Ratio = retarderInputData.Ratio;
-						break;
-					
-					case RetarderType.None:
-					case RetarderType.LossesIncludedInTransmission:
-					case RetarderType.EngineRetarder:
-						retarder.Ratio = 1;
-						break;
-					
-					default:
-						throw new ArgumentOutOfRangeException(nameof(retarder), retarder.Type, "RetarderType unknown");
-				}
-
-				if (retarder.Type.IsDedicatedComponent()) {
-					retarder.SavedInDeclarationMode = retarderInputData.SavedInDeclarationMode;
-					retarder.Manufacturer = retarderInputData.Manufacturer;
-					retarder.ModelName = retarderInputData.Model;
-					retarder.Date = retarderInputData.Date;
-					retarder.CertificationMethod = retarderInputData.CertificationMethod;
-					retarder.CertificationNumber = retarderInputData.CertificationNumber;
-					retarder.DigestValueInput = retarderInputData.DigestValue != null ? retarderInputData.DigestValue.DigestValue : "";
-				}
-
-				return retarder;
-			} catch (Exception e) {
-				throw new VectoException("Error while Reading Retarder Data: {0}", e.Message);
-			}
-		}
-
 		internal CombustionEngineData SetCommonCombustionEngineData(IEngineDeclarationInputData data, TankSystem? tankSystem)
 		{
-			var retVal = new CombustionEngineData {
+			var retVal = new CombustionEngineData
+			{
 				InputData = data,
 				SavedInDeclarationMode = data.SavedInDeclarationMode,
 				Manufacturer = data.Manufacturer,
@@ -166,71 +96,36 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter
 			};
 			return retVal;
 		}
-
-		internal static GearboxData SetCommonGearboxData(IGearboxDeclarationInputData data)
-		{
-			return new GearboxData {
-				InputData = data,
-				SavedInDeclarationMode = data.SavedInDeclarationMode,
-				Manufacturer = data.Manufacturer,
-				ModelName = data.Model,
-				Date = data.Date,
-				CertificationMethod = data.CertificationMethod,
-				CertificationNumber = data.CertificationMethod != CertificationMethod.StandardValues ? 
-					data.CertificationNumber : "",
-				DigestValueInput = data.DigestValue != null ? data.DigestValue.DigestValue : "",
-				Type = data.Type
-			};
-		}
-
-		protected virtual TransmissionLossMap CreateGearLossMap(ITransmissionInputData gear, uint i, 
+		protected virtual TransmissionLossMap CreateGearLossMap(ITransmissionInputData gear, uint i,
 			bool useEfficiencyFallback, VehicleCategory vehicleCategory, GearboxType gearboxType)
 		{
-			if (gear.LossMap != null) {
+			if (gear.LossMap != null)
+			{
 				return TransmissionLossMapReader.Create(gear.LossMap, gear.Ratio, $"Gear {i + 1}", true);
 			}
-			if (useEfficiencyFallback) {
+			if (useEfficiencyFallback)
+			{
 				return TransmissionLossMapReader.Create(gear.Efficiency, gear.Ratio, $"Gear {i + 1}");
 			}
 			throw new InvalidFileFormatException("Gear {0} LossMap missing.", i + 1);
 		}
-
-		protected static void CreateTCSecondGearATSerial(GearData gearData,
-			ShiftPolygon shiftPolygon)
-		{
-			gearData.TorqueConverterRatio = gearData.Ratio;
-			gearData.TorqueConverterGearLossMap = gearData.LossMap;
-			gearData.TorqueConverterShiftPolygon = shiftPolygon;
-		}
-
-		protected static void CreateTCFirstGearATSerial(GearData gearData,
-			ShiftPolygon shiftPolygon)
-		{
-			gearData.TorqueConverterRatio = gearData.Ratio;
-			gearData.TorqueConverterGearLossMap = gearData.LossMap;
-			gearData.TorqueConverterShiftPolygon = shiftPolygon;
-		}
-
-		protected virtual void CretateTCFirstGearATPowerSplit(GearData gearData, uint i, ShiftPolygon shiftPolygon)
-		{
-			gearData.TorqueConverterRatio = 1;
-			gearData.TorqueConverterGearLossMap = TransmissionLossMapReader.Create(1, 1, $"TCGear {i + 1}");
-			gearData.TorqueConverterShiftPolygon = shiftPolygon;
-		}
-
-		
 		internal TransmissionLossMap ReadAxleLossMap(IAxleGearInputData data, bool useEfficiencyFallback)
 		{
 			TransmissionLossMap axleLossMap;
-			if (data.LossMap == null && useEfficiencyFallback) {
+			if (data.LossMap == null && useEfficiencyFallback)
+			{
 				axleLossMap = TransmissionLossMapReader.Create(data.Efficiency, data.Ratio, "Axlegear");
-			} else {
-				if (data.LossMap == null) {
+			}
+			else
+			{
+				if (data.LossMap == null)
+				{
 					throw new InvalidFileFormatException("LossMap for Axlegear is missing.");
 				}
 				axleLossMap = TransmissionLossMapReader.Create(data.LossMap, data.Ratio, "Axlegear", true);
 			}
-			if (axleLossMap == null) {
+			if (axleLossMap == null)
+			{
 				throw new InvalidFileFormatException("LossMap for Axlegear is missing.");
 			}
 			return axleLossMap;
@@ -238,7 +133,8 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter
 
 		internal AxleGearData SetCommonAxleGearData(IAxleGearInputData data)
 		{
-			return new AxleGearData {
+			return new AxleGearData
+			{
 				InputData = data,
 				SavedInDeclarationMode = data.SavedInDeclarationMode,
 				Manufacturer = data.Manufacturer,
@@ -252,56 +148,6 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter
 			};
 		}
 
-		/// <summary>
-		/// Creates an AngledriveData or returns null if there is no anglegear.
-		/// </summary>
-		/// <param name="data"></param>
-		/// <param name="useEfficiencyFallback">if true, the Efficiency value is used if no LossMap is found.</param>
-		/// <returns></returns>
-		internal AngledriveData DoCreateAngledriveData(IAngledriveInputData data, bool useEfficiencyFallback)
-		{
-			try {
-				var type = data?.Type ?? AngledriveType.None;
-
-				switch (type) {
-					case AngledriveType.LossesIncludedInGearbox:
-					case AngledriveType.None:
-						return null;
-					case AngledriveType.SeparateAngledrive:
-						var angledriveData = new AngledriveData {
-							InputData = data,
-							SavedInDeclarationMode = data.SavedInDeclarationMode,
-							Manufacturer = data.Manufacturer,
-							ModelName = data.Model,
-							Date = data.Date,
-							CertificationMethod = data.CertificationMethod,
-							CertificationNumber = data.CertificationNumber,
-							DigestValueInput = data.DigestValue != null ? data.DigestValue.DigestValue : "",
-							Type = type,
-							Angledrive = new TransmissionData { Ratio = data.Ratio }
-						};
-						try {
-							angledriveData.Angledrive.LossMap = TransmissionLossMapReader.Create(data.LossMap,
-								data.Ratio, "Angledrive", true);
-						} catch (VectoException ex) {
-							Log.Info("Angledrive Loss Map not found.");
-							if (useEfficiencyFallback) {
-								Log.Info("Angledrive Trying with Efficiency instead of Loss Map.");
-								angledriveData.Angledrive.LossMap = TransmissionLossMapReader.Create(data.Efficiency,
-									data.Ratio, "Angledrive");
-							} else {
-								throw new VectoException("Angledrive: LossMap not found.", ex);
-							}
-						}
-						return angledriveData;
-					default:
-						throw new ArgumentOutOfRangeException(nameof(data), "Unknown Angledrive Type.");
-				}
-			} catch (Exception e) {
-				throw new VectoException("Error while reading Angledrive data: {0}", e.Message, e);
-			}
-		}
-
 		internal static ElectricMotorFullLoadCurve IntersectEMFullLoadCurves(ElectricMotorFullLoadCurve fullLoadCurve,
 			ElectricMotorFullLoadCurve maxTorqueCurve)
 		{
@@ -310,31 +156,38 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter
 				return fullLoadCurve;
 			}
 
-			if (maxTorqueCurve.MaxSpeed.IsSmaller(fullLoadCurve.MaxSpeed)) {
+			if (maxTorqueCurve.MaxSpeed.IsSmaller(fullLoadCurve.MaxSpeed))
+			{
 				throw new VectoException("EM Torque limitation has to cover the whole speed range");
 			}
 
 			var motorSpeeds = fullLoadCurve.FullLoadEntries.Select(x => x.MotorSpeed)
 				.Concat(maxTorqueCurve.FullLoadEntries.Select(x => x.MotorSpeed)).ToList();
 			// iterate over all segments in the full-load curve
-			foreach (var fldTuple in fullLoadCurve.FullLoadEntries.Pairwise()) {
+			foreach (var fldTuple in fullLoadCurve.FullLoadEntries.Pairwise())
+			{
 				// find all grid points of max torque curve within the current segment of fld
 				var maxPtsWithinSegment = maxTorqueCurve.FullLoadEntries.Where(x =>
 					x.MotorSpeed.IsGreaterOrEqual(fldTuple.Item1.MotorSpeed) &&
 					x.MotorSpeed.IsSmallerOrEqual(fldTuple.Item2.MotorSpeed)).OrderBy(x => x.MotorSpeed).ToList();
-				if (maxPtsWithinSegment.Count == 0) {
+				if (maxPtsWithinSegment.Count == 0)
+				{
 					// if grid pint is within, take the 'surrounding' segment
 					var segment =
 						maxTorqueCurve.FullLoadEntries.GetSection(x => x.MotorSpeed < fldTuple.Item1.MotorSpeed);
 					maxPtsWithinSegment = new[] { segment.Item1, segment.Item2 }.ToList();
-				} else {
+				}
+				else
+				{
 					// add the point just before and just after the current list of points 
-					if (maxPtsWithinSegment.Min(x => x.MotorSpeed).IsGreater(fldTuple.Item1.MotorSpeed)) {
+					if (maxPtsWithinSegment.Min(x => x.MotorSpeed).IsGreater(fldTuple.Item1.MotorSpeed))
+					{
 						maxPtsWithinSegment.Add(maxTorqueCurve.FullLoadEntries.Last(x =>
 							x.MotorSpeed.IsSmaller(fldTuple.Item1.MotorSpeed)));
 					}
 
-					if (maxPtsWithinSegment.Max(x => x.MotorSpeed).IsSmaller(fldTuple.Item2.MotorSpeed)) {
+					if (maxPtsWithinSegment.Max(x => x.MotorSpeed).IsSmaller(fldTuple.Item2.MotorSpeed))
+					{
 						maxPtsWithinSegment.Add(maxTorqueCurve.FullLoadEntries.First(x => x.MotorSpeed.IsGreater(fldTuple.Item2.MotorSpeed)));
 					}
 
@@ -347,16 +200,19 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter
 				var fldEdgeGenerate =
 					Edge.Create(new Point(fldTuple.Item1.MotorSpeed.Value(), fldTuple.Item1.FullGenerationTorque.Value()),
 						new Point(fldTuple.Item2.MotorSpeed.Value(), fldTuple.Item2.FullGenerationTorque.Value()));
-				foreach (var maxTuple in maxPtsWithinSegment.Pairwise()) {
+				foreach (var maxTuple in maxPtsWithinSegment.Pairwise())
+				{
 					var maxEdgeDrive =
 						Edge.Create(new Point(maxTuple.Item1.MotorSpeed.Value(), maxTuple.Item1.FullDriveTorque.Value()),
 							new Point(maxTuple.Item2.MotorSpeed.Value(), maxTuple.Item2.FullDriveTorque.Value()));
-					if (!(maxEdgeDrive.SlopeXY - fldEdgeDrive.SlopeXY).IsEqual(0, 1e-12)) {
+					if (!(maxEdgeDrive.SlopeXY - fldEdgeDrive.SlopeXY).IsEqual(0, 1e-12))
+					{
 						// lines are not parallel
 						var nIntersectDrive =
 							((fldEdgeDrive.OffsetXY - maxEdgeDrive.OffsetXY) /
 							(maxEdgeDrive.SlopeXY - fldEdgeDrive.SlopeXY)).SI<PerSecond>();
-						if (nIntersectDrive.IsBetween(fldTuple.Item1.MotorSpeed, fldTuple.Item2.MotorSpeed)) {
+						if (nIntersectDrive.IsBetween(fldTuple.Item1.MotorSpeed, fldTuple.Item2.MotorSpeed))
+						{
 							motorSpeeds.Add(nIntersectDrive);
 						}
 					}
@@ -364,14 +220,16 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter
 					var maxEdgeGenerate =
 						Edge.Create(new Point(maxTuple.Item1.MotorSpeed.Value(), maxTuple.Item1.FullGenerationTorque.Value()),
 							new Point(maxTuple.Item2.MotorSpeed.Value(), maxTuple.Item2.FullGenerationTorque.Value()));
-					if (!((maxEdgeGenerate.SlopeXY - fldEdgeGenerate.SlopeXY).IsEqual(0, 1e-12))) {
+					if (!((maxEdgeGenerate.SlopeXY - fldEdgeGenerate.SlopeXY).IsEqual(0, 1e-12)))
+					{
 						// lines are not parallel
 						var nIntersectGenerate =
 							((fldEdgeGenerate.OffsetXY - maxEdgeGenerate.OffsetXY) /
 							(maxEdgeGenerate.SlopeXY - fldEdgeGenerate.SlopeXY)).SI<PerSecond>();
 
 
-						if (nIntersectGenerate.IsBetween(fldTuple.Item1.MotorSpeed, fldTuple.Item2.MotorSpeed)) {
+						if (nIntersectGenerate.IsBetween(fldTuple.Item1.MotorSpeed, fldTuple.Item2.MotorSpeed))
+						{
 							motorSpeeds.Add(nIntersectGenerate);
 						}
 					}
@@ -380,7 +238,8 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter
 
 			// create new full-load curve with values closest to zero.
 			return new ElectricMotorFullLoadCurve(motorSpeeds.OrderBy(x => x.Value()).Distinct().Select(x =>
-				new ElectricMotorFullLoadCurve.FullLoadEntry() {
+				new ElectricMotorFullLoadCurve.FullLoadEntry()
+				{
 					MotorSpeed = x,
 					FullDriveTorque = VectoMath.Max(fullLoadCurve.FullLoadDriveTorque(x),
 						maxTorqueCurve.FullLoadDriveTorque(x)),
@@ -388,11 +247,6 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter
 						maxTorqueCurve.FullGenerationTorque(x)),
 				}).ToList());
 		}
-
-		
-
-
-
 		/// <summary>
 		/// Intersects ICE full load curves.
 		/// </summary>
@@ -401,33 +255,45 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter
 		/// <returns>A combined EngineFullLoadCurve with the minimum full load torque over all inputs curves.</returns>
 		internal static EngineFullLoadCurve IntersectFullLoadCurves(EngineFullLoadCurve engineCurve, NewtonMeter maxTorque)
 		{
-			if (maxTorque == null) {
+			if (maxTorque == null)
+			{
 				return engineCurve;
 			}
 
 			var entries = new List<EngineFullLoadCurve.FullLoadCurveEntry>();
 			var firstEntry = engineCurve.FullLoadEntries.First();
-			if (firstEntry.TorqueFullLoad < maxTorque) {
+			if (firstEntry.TorqueFullLoad < maxTorque)
+			{
 				entries.Add(engineCurve.FullLoadEntries.First());
-			} else {
-				entries.Add(new EngineFullLoadCurve.FullLoadCurveEntry {
+			}
+			else
+			{
+				entries.Add(new EngineFullLoadCurve.FullLoadCurveEntry
+				{
 					EngineSpeed = firstEntry.EngineSpeed,
 					TorqueFullLoad = maxTorque,
 					TorqueDrag = firstEntry.TorqueDrag
 				});
 			}
-			foreach (var entry in engineCurve.FullLoadEntries.Pairwise(Tuple.Create)) {
-				if (entry.Item1.TorqueFullLoad <= maxTorque && entry.Item2.TorqueFullLoad <= maxTorque) {
+			foreach (var entry in engineCurve.FullLoadEntries.Pairwise(Tuple.Create))
+			{
+				if (entry.Item1.TorqueFullLoad <= maxTorque && entry.Item2.TorqueFullLoad <= maxTorque)
+				{
 					// segment is below maxTorque line -> use directly
 					entries.Add(entry.Item2);
-				} else if (entry.Item1.TorqueFullLoad > maxTorque && entry.Item2.TorqueFullLoad > maxTorque) {
+				}
+				else if (entry.Item1.TorqueFullLoad > maxTorque && entry.Item2.TorqueFullLoad > maxTorque)
+				{
 					// segment is above maxTorque line -> add limited entry
-					entries.Add(new EngineFullLoadCurve.FullLoadCurveEntry {
+					entries.Add(new EngineFullLoadCurve.FullLoadCurveEntry
+					{
 						EngineSpeed = entry.Item2.EngineSpeed,
 						TorqueFullLoad = maxTorque,
 						TorqueDrag = entry.Item2.TorqueDrag
 					});
-				} else {
+				}
+				else
+				{
 					// segment intersects maxTorque line -> add new entry at intersection
 					var edgeFull = Edge.Create(
 						new Point(entry.Item1.EngineSpeed.Value(), entry.Item1.TorqueFullLoad.Value()),
@@ -436,15 +302,18 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter
 						new Point(entry.Item1.EngineSpeed.Value(), entry.Item1.TorqueDrag.Value()),
 						new Point(entry.Item2.EngineSpeed.Value(), entry.Item2.TorqueDrag.Value()));
 					var intersectionX = (maxTorque.Value() - edgeFull.OffsetXY) / edgeFull.SlopeXY;
-                    if (!entries.Any(x => x.EngineSpeed.IsEqual(intersectionX)) && !intersectionX.IsEqual(entry.Item2.EngineSpeed.Value())) {
-                        entries.Add(new EngineFullLoadCurve.FullLoadCurveEntry {
+					if (!entries.Any(x => x.EngineSpeed.IsEqual(intersectionX)) && !intersectionX.IsEqual(entry.Item2.EngineSpeed.Value()))
+					{
+						entries.Add(new EngineFullLoadCurve.FullLoadCurveEntry
+						{
 							EngineSpeed = intersectionX.SI<PerSecond>(),
 							TorqueFullLoad = maxTorque,
 							TorqueDrag = VectoMath.Interpolate(edgeDrag.P1, edgeDrag.P2, intersectionX).SI<NewtonMeter>()
 						});
-                    }
+					}
 
-                    entries.Add(new EngineFullLoadCurve.FullLoadCurveEntry {
+					entries.Add(new EngineFullLoadCurve.FullLoadCurveEntry
+					{
 						EngineSpeed = entry.Item2.EngineSpeed,
 						TorqueFullLoad = entry.Item2.TorqueFullLoad > maxTorque ? maxTorque : entry.Item2.TorqueFullLoad,
 						TorqueDrag = entry.Item2.TorqueDrag
@@ -452,70 +321,12 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter
 				}
 			}
 
-			var flc = new EngineFullLoadCurve(entries.ToList(), engineCurve.PT1Data) {
+			var flc = new EngineFullLoadCurve(entries.ToList(), engineCurve.PT1Data)
+			{
 				EngineData = engineCurve.EngineData,
 			};
 			return flc;
 		}
-
-
-		/// <summary>
-		/// Intersects max torque curve.
-		/// </summary>
-		/// <param name="maxTorqueEntries"></param>
-		/// <param name="maxTorque"></param>
-		/// <returns>A combined EngineFullLoadCurve with the minimum full load torque over all inputs curves.</returns>
-		internal static IList<VehicleMaxPropulsionTorque.FullLoadEntry> IntersectMaxPropulsionTorqueCurve(IList<VehicleMaxPropulsionTorque.FullLoadEntry> maxTorqueEntries, NewtonMeter maxTorque)
-		{
-			if (maxTorque == null) {
-				return maxTorqueEntries;
-			}
-
-			var entries = new List<VehicleMaxPropulsionTorque.FullLoadEntry>();
-			var firstEntry = maxTorqueEntries.First();
-			if (firstEntry.FullDriveTorque < maxTorque) {
-				entries.Add(maxTorqueEntries.First());
-			} else {
-				entries.Add(new VehicleMaxPropulsionTorque.FullLoadEntry {
-					MotorSpeed = firstEntry.MotorSpeed,
-					FullDriveTorque = maxTorque,
-				});
-			}
-			foreach (var entry in maxTorqueEntries.Pairwise(Tuple.Create)) {
-				if (entry.Item1.FullDriveTorque <= maxTorque && entry.Item2.FullDriveTorque <= maxTorque) {
-					// segment is below maxTorque line -> use directly
-					entries.Add(entry.Item2);
-				} else if (entry.Item1.FullDriveTorque > maxTorque && entry.Item2.FullDriveTorque > maxTorque) {
-					// segment is above maxTorque line -> add limited entry
-					entries.Add(new VehicleMaxPropulsionTorque.FullLoadEntry {
-						MotorSpeed = entry.Item2.MotorSpeed,
-						FullDriveTorque = maxTorque,
-					});
-				} else {
-					// segment intersects maxTorque line -> add new entry at intersection
-					var edgeFull = Edge.Create(
-						new Point(entry.Item1.MotorSpeed.Value(), entry.Item1.FullDriveTorque.Value()),
-						new Point(entry.Item2.MotorSpeed.Value(), entry.Item2.FullDriveTorque.Value()));
-					
-					var intersectionX = (maxTorque.Value() - edgeFull.OffsetXY) / edgeFull.SlopeXY;
-					if (!entries.Any(x => x.MotorSpeed.IsEqual(intersectionX)) && !intersectionX.IsEqual(entry.Item2.MotorSpeed.Value())) {
-						entries.Add(new VehicleMaxPropulsionTorque.FullLoadEntry {
-							MotorSpeed = intersectionX.SI<PerSecond>(),
-							FullDriveTorque = maxTorque,
-						});
-					}
-
-					entries.Add(new VehicleMaxPropulsionTorque.FullLoadEntry {
-						MotorSpeed = entry.Item2.MotorSpeed,
-						FullDriveTorque = entry.Item2.FullDriveTorque > maxTorque ? maxTorque : entry.Item2.FullDriveTorque,
-						
-					});
-				}
-			}
-
-			
-			return entries;
-		}
 	}
 }
 
diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/CompletedBus/Generic/DeclarationDataAdapterGenericCompletedBus.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/CompletedBus/Generic/DeclarationDataAdapterGenericCompletedBus.cs
index 5a0d690937..fd8b7eb012 100644
--- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/CompletedBus/Generic/DeclarationDataAdapterGenericCompletedBus.cs
+++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/CompletedBus/Generic/DeclarationDataAdapterGenericCompletedBus.cs
@@ -15,6 +15,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.CompletedBus.Gener
 	{
 		public abstract class CompletedBusBase : IGenericCompletedBusDataAdapter
 		{
+			private readonly IRetarderDataAdapter _retarderDataAdapter = new GenericRetarderDataAdapter();
             #region Implementation of IDeclarationDataAdapter
 
 			private readonly IDriverDataAdapter _driverDataAdapter = new CompletedBusGenericDriverDataAdapter();
@@ -62,9 +63,9 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.CompletedBus.Gener
             }
 
             public RetarderData CreateRetarderData(IRetarderInputData retarderData)
-            {
-                throw new NotImplementedException();
-            }
+			{
+				return _retarderDataAdapter.CreateRetarderData(retarderData);
+			}
 
             public PTOData CreatePTOTransmissionData(IPTOTransmissionInputData ptoData)
             {
diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapterCompletedBusGeneric.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapterCompletedBusGeneric.cs
index 9610bd77c5..6968df3069 100644
--- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapterCompletedBusGeneric.cs
+++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapterCompletedBusGeneric.cs
@@ -58,18 +58,18 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter
 
 		#region Overrides of DeclarationDataAdapterHeavyLorry
 
-		public override AxleGearData CreateAxleGearData(IAxleGearInputData axlegearData)
+		public AxleGearData CreateAxleGearData(IAxleGearInputData axlegearData)
 		{
 			return _genericPowertrainData.CreateGenericBusAxlegearData(axlegearData);
 		}
 
-		public override AngledriveData CreateAngledriveData(IAngledriveInputData data)
+		public AngledriveData CreateAngledriveData(IAngledriveInputData data)
 		{
 			return _genericPowertrainData.CreateGenericBusAngledriveData(data);
 		}
 
 
-		public override RetarderData CreateRetarderData(IRetarderInputData retarder)
+		public RetarderData CreateRetarderData(IRetarderInputData retarder)
 		{
 			return _genericRetarderData.CreateGenericBusRetarderData(retarder);
 		}
@@ -87,7 +87,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter
 				gear.Ratio.IsEqual(1) ? GearEfficiencyDirectGear : GearEfficiencyIndirectGear, gear.Ratio, $"Gear {i + 1}");
 		}
 
-		protected override void CretateTCFirstGearATPowerSplit(GearData gearData, uint i, ShiftPolygon shiftPolygon)
+		protected void CretateTCFirstGearATPowerSplit(GearData gearData, uint i, ShiftPolygon shiftPolygon)
 		{
 			gearData.TorqueConverterRatio = 1;
 			//gearData.TorqueConverterGearLossMap = TransmissionLossMapReader.Create(GearEfficiencyIndirectGear, 1, string.Format("TCGear {0}", i + 1));
@@ -102,6 +102,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter
 		protected override TorqueConverterData CreateTorqueConverterData(GearboxType gearboxType,
 			ITorqueConverterDeclarationInputData torqueConverter, double ratio, CombustionEngineData engineData)
 		{
+			
 			if (torqueConverter != null && torqueConverter.TCData != null) {
 				return TorqueConverterDataReader.Create(
 					torqueConverter.TCData,
diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapterNinjectModule.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapterNinjectModule.cs
index a82f81a1fb..b385e7f827 100644
--- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapterNinjectModule.cs
+++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapterNinjectModule.cs
@@ -1,7 +1,6 @@
 using TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.CompletedBus.Generic;
 using TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.CompletedBus.Specific;
 using TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.PrimaryBus;
-using TUGraz.VectoCore.InputData.Reader.Impl;
 using TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.CompletedBusRunDataFactory;
 using TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.HeavyLorryRunDataFactory;
 using TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.PrimaryBusRunDataFactory;
@@ -56,6 +55,9 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter
 
 			Bind<IDeclarationDataAdapter>().To<HeavyLorry.DeclarationDataAdapterHeavyLorry.PEV_E_IEPC>()
 				.WhenInjectedExactlyInto<DeclarationModeHeavyLorryRunDataFactory.PEV_E_IEPC>();
+
+			Bind<IDeclarationDataAdapter>().To<HeavyLorry.DeclarationDataAdapterHeavyLorry.Exempted>()
+				.WhenInjectedExactlyInto<DeclarationModeHeavyLorryRunDataFactory.Exempted>();
 			#endregion HeavyLorry
 
 			#region PrimaryBus
@@ -102,6 +104,9 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter
 			Bind<IDeclarationDataAdapter>().To<DeclarationDataAdapterPrimaryBus.PEV_E_IEPC>()
 				.WhenInjectedExactlyInto<DeclarationModePrimaryBusRunDataFactory.PEV_E_IEPC>();
 
+			Bind<IDeclarationDataAdapter>().To<DeclarationDataAdapterPrimaryBus.Exempted>()
+				.WhenInjectedExactlyInto<DeclarationModePrimaryBusRunDataFactory.Exempted>();
+
 			#endregion
 
 			#region CompletedBus Generic
diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapterSingleBus.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapterSingleBus.cs
index 5fd0766f12..cfa10bb5d2 100644
--- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapterSingleBus.cs
+++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapterSingleBus.cs
@@ -25,97 +25,98 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter
 	{
 		#region Implementation of IDeclarationDataAdapter
 
-		public override VehicleData CreateVehicleData(IVehicleDeclarationInputData vehicle, Segment segment, Mission mission, KeyValuePair<LoadingType, Tuple<Kilogram, double?>> loading, bool allowVocational)
-		{
-			var busFloorArea = DeclarationData.BusAuxiliaries.CalculateBusFloorSurfaceArea(
-				CompletedVehicle.Length,
-				CompletedVehicle.Width);
-			var passengerCountRef = busFloorArea * (loading.Key == LoadingType.LowLoading
-				? mission.BusParameter.PassengerDensityLow
-				: mission.BusParameter.PassengerDensityRef);
-			var passengerCountDecl = CompletedVehicle.NumberPassengerSeatsUpperDeck +
-									CompletedVehicle.NumberPassengerSeatsLowerDeck
-									+ (mission.MissionType == MissionType.Coach
-										? 0
-										: CompletedVehicle.NumberPassengersStandingLowerDeck +
-										CompletedVehicle.NumberPassengersStandingUpperDeck);
-
-			//var refLoad = passengerCount * mission.MissionType.GetAveragePassengerMass();
-			if (loading.Key != LoadingType.ReferenceLoad && loading.Key != LoadingType.LowLoading) {
-				throw new VectoException("Unhandled loading type: {0}", loading.Key);
-			}
-
-			var passengerCountCalc = loading.Key == LoadingType.ReferenceLoad
-				? VectoMath.Min(passengerCountRef, (int)passengerCountDecl)
-				: passengerCountRef * mission.MissionType.GetLowLoadFactorBus();
-			var payload = passengerCountCalc * mission.MissionType.GetAveragePassengerMass();
-
-			var retVal = CreateNonExemptedVehicleData(vehicle, segment, mission, payload, passengerCountCalc, allowVocational);
-			retVal.CurbMass = CompletedVehicle.CurbMassChassis;
-			return retVal;
-		}
+		//public override VehicleData CreateVehicleData(IVehicleDeclarationInputData vehicle, Segment segment, Mission mission, KeyValuePair<LoadingType, Tuple<Kilogram, double?>> loading, bool allowVocational)
+		//{
+		//	var busFloorArea = DeclarationData.BusAuxiliaries.CalculateBusFloorSurfaceArea(
+		//		CompletedVehicle.Length,
+		//		CompletedVehicle.Width);
+		//	var passengerCountRef = busFloorArea * (loading.Key == LoadingType.LowLoading
+		//		? mission.BusParameter.PassengerDensityLow
+		//		: mission.BusParameter.PassengerDensityRef);
+		//	var passengerCountDecl = CompletedVehicle.NumberPassengerSeatsUpperDeck +
+		//							CompletedVehicle.NumberPassengerSeatsLowerDeck
+		//							+ (mission.MissionType == MissionType.Coach
+		//								? 0
+		//								: CompletedVehicle.NumberPassengersStandingLowerDeck +
+		//								CompletedVehicle.NumberPassengersStandingUpperDeck);
+
+		//	//var refLoad = passengerCount * mission.MissionType.GetAveragePassengerMass();
+		//	if (loading.Key != LoadingType.ReferenceLoad && loading.Key != LoadingType.LowLoading) {
+		//		throw new VectoException("Unhandled loading type: {0}", loading.Key);
+		//	}
+
+		//	var passengerCountCalc = loading.Key == LoadingType.ReferenceLoad
+		//		? VectoMath.Min(passengerCountRef, (int)passengerCountDecl)
+		//		: passengerCountRef * mission.MissionType.GetLowLoadFactorBus();
+		//	var payload = passengerCountCalc * mission.MissionType.GetAveragePassengerMass();
+
+		//	var retVal = CreateNonExemptedVehicleData(vehicle, segment, mission, payload, passengerCountCalc, allowVocational);
+		//	retVal.CurbMass = CompletedVehicle.CurbMassChassis;
+		//	return retVal;
+		//}
 
 		#endregion
 
 
-		public override CombustionEngineData CreateEngineData(
-			IVehicleDeclarationInputData vehicle, IEngineModeDeclarationInputData mode, Mission mission)
-		{
-			var engine = vehicle.Components.EngineInputData;
-			var gearbox = vehicle.Components.GearboxInputData;
-
-			if (!engine.SavedInDeclarationMode) {
-				WarnDeclarationMode("EngineData");
-			}
-
-			var retVal = SetCommonCombustionEngineData(engine, SingleBusInputData.CompletedVehicle.TankSystem);
-			retVal.IdleSpeed = VectoMath.Max(mode.IdleSpeed, vehicle.EngineIdleSpeed);
-
-			retVal.Fuels = new List<CombustionEngineFuelData>();
-			foreach (var fuel in mode.Fuels) {
-				retVal.Fuels.Add(
-					new CombustionEngineFuelData() {
-						WHTCUrban = fuel.WHTCUrban,
-						WHTCRural = fuel.WHTCRural,
-						WHTCMotorway = fuel.WHTCMotorway,
-						ColdHotCorrectionFactor = fuel.ColdHotBalancingFactor,
-						CorrectionFactorRegPer = fuel.CorrectionFactorRegPer,
-						FuelData = DeclarationData.FuelData.Lookup(fuel.FuelType, SingleBusInputData.CompletedVehicle.TankSystem),
-						ConsumptionMap = FuelConsumptionMapReader.Create(fuel.FuelConsumptionMap),
-						FuelConsumptionCorrectionFactor = DeclarationData.WHTCCorrection.Lookup(
-															mission.MissionType.GetNonEMSMissionType(), fuel.WHTCRural, fuel.WHTCUrban,
-															fuel.WHTCMotorway) * fuel.ColdHotBalancingFactor * fuel.CorrectionFactorRegPer,
-					});
-			}
-
-			retVal.Inertia = DeclarationData.Engine.EngineInertia(retVal.Displacement, gearbox.Type);
-			retVal.EngineStartTime = DeclarationData.Engine.DefaultEngineStartTime;
-			var limits = vehicle.TorqueLimits.ToDictionary(e => e.Gear);
-			var numGears = gearbox.Gears.Count;
-			var fullLoadCurves = new Dictionary<uint, EngineFullLoadCurve>(numGears + 1);
-			fullLoadCurves[0] = FullLoadCurveReader.Create(mode.FullLoadCurve, true);
-			fullLoadCurves[0].EngineData = retVal;
-			foreach (var gear in gearbox.Gears) {
-				var maxTorque = VectoMath.Min(
-					GbxMaxTorque(gear, numGears, fullLoadCurves[0].MaxTorque),
-					VehMaxTorque(gear, numGears, limits, fullLoadCurves[0].MaxTorque));
-				fullLoadCurves[(uint)gear.Gear] = IntersectFullLoadCurves(fullLoadCurves[0], maxTorque);
-			}
-
-			retVal.FullLoadCurves = fullLoadCurves;
-
-			retVal.WHRType = engine.WHRType;
-			if ((retVal.WHRType & WHRType.ElectricalOutput) != 0) {
-				retVal.ElectricalWHR = CreateWHRData(
-					mode.WasteHeatRecoveryDataElectrical, mission.MissionType, WHRType.ElectricalOutput);
-			}
-			if ((retVal.WHRType & WHRType.MechanicalOutputDrivetrain) != 0) {
-				retVal.MechanicalWHR = CreateWHRData(
-					mode.WasteHeatRecoveryDataMechanical, mission.MissionType, WHRType.MechanicalOutputDrivetrain);
-			}
-
-			return retVal;
-		}
+		//public override CombustionEngineData CreateEngineData(
+		//	IVehicleDeclarationInputData vehicle, IEngineModeDeclarationInputData mode, Mission mission)
+		//{
+		//	throw new NotImplementedException();
+		//	var engine = vehicle.Components.EngineInputData;
+		//	var gearbox = vehicle.Components.GearboxInputData;
+
+		//	if (!engine.SavedInDeclarationMode) {
+		//		WarnDeclarationMode("EngineData");
+		//	}
+
+		//	var retVal = SetCommonCombustionEngineData(engine, SingleBusInputData.CompletedVehicle.TankSystem);
+		//	retVal.IdleSpeed = VectoMath.Max(mode.IdleSpeed, vehicle.EngineIdleSpeed);
+
+		//	retVal.Fuels = new List<CombustionEngineFuelData>();
+		//	foreach (var fuel in mode.Fuels) {
+		//		retVal.Fuels.Add(
+		//			new CombustionEngineFuelData() {
+		//				WHTCUrban = fuel.WHTCUrban,
+		//				WHTCRural = fuel.WHTCRural,
+		//				WHTCMotorway = fuel.WHTCMotorway,
+		//				ColdHotCorrectionFactor = fuel.ColdHotBalancingFactor,
+		//				CorrectionFactorRegPer = fuel.CorrectionFactorRegPer,
+		//				FuelData = DeclarationData.FuelData.Lookup(fuel.FuelType, SingleBusInputData.CompletedVehicle.TankSystem),
+		//				ConsumptionMap = FuelConsumptionMapReader.Create(fuel.FuelConsumptionMap),
+		//				FuelConsumptionCorrectionFactor = DeclarationData.WHTCCorrection.Lookup(
+		//													mission.MissionType.GetNonEMSMissionType(), fuel.WHTCRural, fuel.WHTCUrban,
+		//													fuel.WHTCMotorway) * fuel.ColdHotBalancingFactor * fuel.CorrectionFactorRegPer,
+		//			});
+		//	}
+
+		//	retVal.Inertia = DeclarationData.Engine.EngineInertia(retVal.Displacement, gearbox.Type);
+		//	retVal.EngineStartTime = DeclarationData.Engine.DefaultEngineStartTime;
+		//	var limits = vehicle.TorqueLimits.ToDictionary(e => e.Gear);
+		//	var numGears = gearbox.Gears.Count;
+		//	var fullLoadCurves = new Dictionary<uint, EngineFullLoadCurve>(numGears + 1);
+		//	fullLoadCurves[0] = FullLoadCurveReader.Create(mode.FullLoadCurve, true);
+		//	fullLoadCurves[0].EngineData = retVal;
+		//	foreach (var gear in gearbox.Gears) {
+		//		var maxTorque = VectoMath.Min(
+		//			GbxMaxTorque(gear, numGears, fullLoadCurves[0].MaxTorque),
+		//			VehMaxTorque(gear, numGears, limits, fullLoadCurves[0].MaxTorque));
+		//		fullLoadCurves[(uint)gear.Gear] = IntersectFullLoadCurves(fullLoadCurves[0], maxTorque);
+		//	}
+
+		//	retVal.FullLoadCurves = fullLoadCurves;
+
+		//	retVal.WHRType = engine.WHRType;
+		//	if ((retVal.WHRType & WHRType.ElectricalOutput) != 0) {
+		//		retVal.ElectricalWHR = CreateWHRData(
+		//			mode.WasteHeatRecoveryDataElectrical, mission.MissionType, WHRType.ElectricalOutput);
+		//	}
+		//	if ((retVal.WHRType & WHRType.MechanicalOutputDrivetrain) != 0) {
+		//		retVal.MechanicalWHR = CreateWHRData(
+		//			mode.WasteHeatRecoveryDataMechanical, mission.MissionType, WHRType.MechanicalOutputDrivetrain);
+		//	}
+
+		//	return retVal;
+		//}
 
 		protected override TransmissionLossMap CreateGearLossMap(ITransmissionInputData gear, uint i, bool useEfficiencyFallback, VehicleCategory vehicleCategory, GearboxType gearboxType)
 		{
@@ -144,10 +145,10 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter
 
 		#region Overrides of DeclarationDataAdapterCompletedBusGeneric
 
-		public override RetarderData CreateRetarderData(IRetarderInputData retarder)
-		{
-			return SetCommonRetarderData(retarder);
-		}
+		//public override RetarderData CreateRetarderData(IRetarderInputData retarder)
+		//{
+		//	return SetCommonRetarderData(retarder);
+		//}
 
 		#endregion
 
diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/EngineeringDataAdapter.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/EngineeringDataAdapter.cs
index 6f6e5df2d2..9248c30bfc 100644
--- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/EngineeringDataAdapter.cs
+++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/EngineeringDataAdapter.cs
@@ -42,6 +42,7 @@ using TUGraz.VectoCore.InputData.FileIO.JSON;
 using TUGraz.VectoCore.InputData.Impl;
 using TUGraz.VectoCore.InputData.Reader.ComponentData;
 using TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.PrimaryBus;
+using TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponents;
 using TUGraz.VectoCore.InputData.Reader.ShiftStrategy;
 using TUGraz.VectoCore.Models.BusAuxiliaries;
 using TUGraz.VectoCore.Models.BusAuxiliaries.DownstreamModules.Impl.Electrics;
@@ -62,6 +63,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter
 {
 	public class EngineeringDataAdapter : AbstractSimulationDataAdapter
 	{
+		private AirdragDataAdapter _airdragDataAdapter = new AirdragDataAdapter();
 		internal VehicleData CreateVehicleData(IVehicleEngineeringInputData data)
 		{
 			if (data.SavedInDeclarationMode) {
@@ -146,7 +148,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter
 									: 4.SI<Meter>());
 					retVal.CrossWindCorrectionCurve = new CrosswindCorrectionCdxALookup(
 						airDragArea,
-						HeavyLorry.DeclarationDataAdapterHeavyLorry.Conventional.GetDeclarationAirResistanceCurve(
+						_airdragDataAdapter.GetDeclarationAirResistanceCurve(
 							GetAirdragParameterSet(
 								data.VehicleCategory, data.AxleConfiguration, data.Components.AxleWheels.AxlesEngineering.Count, data.GrossVehicleMassRating), airDragArea,
 							height),
@@ -709,24 +711,24 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter
 
 		
 
-		private Dictionary<string, ElectricConsumerEntry> GetElectricConsumers(IBusAuxElectricSystemEngineeringData busAuxElectricSystem)
+		private Dictionary<string, AuxiliaryDataAdapter.ElectricConsumerEntry> GetElectricConsumers(IBusAuxElectricSystemEngineeringData busAuxElectricSystem)
 		{
-			var retVal = new Dictionary<string, ElectricConsumerEntry>();
+			var retVal = new Dictionary<string, AuxiliaryDataAdapter.ElectricConsumerEntry>();
 
 			var iBase = busAuxElectricSystem.CurrentDemandEngineOffStandstill;
 			var iSP = busAuxElectricSystem.CurrentDemandEngineOffDriving -
 					busAuxElectricSystem.CurrentDemandEngineOffStandstill;
 			var iFan = busAuxElectricSystem.CurrentDemand - busAuxElectricSystem.CurrentDemandEngineOffDriving;
 
-			retVal["BaseLoad"] = new ElectricConsumerEntry() {
+			retVal["BaseLoad"] = new AuxiliaryDataAdapter.ElectricConsumerEntry() {
 				Current = iBase,
 				BaseVehicle = true
 			};
-			retVal[Constants.Auxiliaries.IDs.SteeringPump] = new ElectricConsumerEntry() {
+			retVal[Constants.Auxiliaries.IDs.SteeringPump] = new AuxiliaryDataAdapter.ElectricConsumerEntry() {
 				Current = iSP,
 				ActiveDuringEngineStopStandstill = false,
 			};
-			retVal[Constants.Auxiliaries.IDs.Fan] = new ElectricConsumerEntry() {
+			retVal[Constants.Auxiliaries.IDs.Fan] = new AuxiliaryDataAdapter.ElectricConsumerEntry() {
 				Current = iFan,
 				ActiveDuringEngineStopStandstill = false,
 				ActiveDuringEngineStopDriving = false,
@@ -1306,6 +1308,257 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter
 
 			return null;
 		}
+
+		internal VehicleData SetCommonVehicleData(IVehicleDeclarationInputData data)
+		{
+			var retVal = new VehicleData
+			{
+				InputData = data,
+				SavedInDeclarationMode = data.SavedInDeclarationMode,
+				Manufacturer = data.Manufacturer,
+				ModelName = data.Model,
+				Date = data.Date,
+				//CertificationNumber = data.CertificationNumber,
+				DigestValueInput = data.DigestValue != null ? data.DigestValue.DigestValue : "",
+				VehicleCategory = data.VehicleCategory,
+				CurbMass = data.CurbMassChassis,
+				GrossVehicleMass = data.GrossVehicleMassRating,
+				AirDensity = Physics.AirDensity,
+			};
+
+			return retVal;
+		}
+
+		internal RetarderData SetCommonRetarderData(IRetarderInputData retarderInputData,
+			PowertrainPosition position = PowertrainPosition.HybridPositionNotSet)
+		{
+			try
+			{
+				var retarder = new RetarderData { Type = retarderInputData.Type };
+
+				switch (retarder.Type)
+				{
+					case RetarderType.TransmissionInputRetarder:
+					case RetarderType.TransmissionOutputRetarder:
+						if (!(position.IsParallelHybrid() || position.IsOneOf(PowertrainPosition.HybridPositionNotSet, PowertrainPosition.BatteryElectricE2)))
+						{
+							throw new ArgumentException("Transmission retarder is only allowed in powertrains that " +
+														"contain a gearbox: Conventional, HEV-P, and PEV-E2.", nameof(retarder));
+						}
+
+						retarder.LossMap = RetarderLossMapReader.Create(retarderInputData.LossMap);
+						retarder.Ratio = retarderInputData.Ratio;
+						break;
+
+					case RetarderType.AxlegearInputRetarder:
+						if (position != PowertrainPosition.BatteryElectricE3)
+							throw new ArgumentException("AxlegearInputRetarder is only allowed for PEV-E3, HEV-S3, S-IEPC, E-IEPC. ", nameof(retarder));
+						retarder.LossMap = RetarderLossMapReader.Create(retarderInputData.LossMap);
+						retarder.Ratio = retarderInputData.Ratio;
+						break;
+
+					case RetarderType.None:
+					case RetarderType.LossesIncludedInTransmission:
+					case RetarderType.EngineRetarder:
+						retarder.Ratio = 1;
+						break;
+
+					default:
+						throw new ArgumentOutOfRangeException(nameof(retarder), retarder.Type, "RetarderType unknown");
+				}
+
+				if (retarder.Type.IsDedicatedComponent())
+				{
+					retarder.SavedInDeclarationMode = retarderInputData.SavedInDeclarationMode;
+					retarder.Manufacturer = retarderInputData.Manufacturer;
+					retarder.ModelName = retarderInputData.Model;
+					retarder.Date = retarderInputData.Date;
+					retarder.CertificationMethod = retarderInputData.CertificationMethod;
+					retarder.CertificationNumber = retarderInputData.CertificationNumber;
+					retarder.DigestValueInput = retarderInputData.DigestValue != null ? retarderInputData.DigestValue.DigestValue : "";
+				}
+
+				return retarder;
+			}
+			catch (Exception e)
+			{
+				throw new VectoException("Error while Reading Retarder Data: {0}", e.Message);
+			}
+		}
+
+		internal static GearboxData SetCommonGearboxData(IGearboxDeclarationInputData data)
+		{
+			return new GearboxData
+			{
+				InputData = data,
+				SavedInDeclarationMode = data.SavedInDeclarationMode,
+				Manufacturer = data.Manufacturer,
+				ModelName = data.Model,
+				Date = data.Date,
+				CertificationMethod = data.CertificationMethod,
+				CertificationNumber = data.CertificationMethod != CertificationMethod.StandardValues ?
+					data.CertificationNumber : "",
+				DigestValueInput = data.DigestValue != null ? data.DigestValue.DigestValue : "",
+				Type = data.Type
+			};
+		}
+
+		protected static void CreateTCSecondGearATSerial(GearData gearData,
+			ShiftPolygon shiftPolygon)
+		{
+			gearData.TorqueConverterRatio = gearData.Ratio;
+			gearData.TorqueConverterGearLossMap = gearData.LossMap;
+			gearData.TorqueConverterShiftPolygon = shiftPolygon;
+		}
+
+		protected static void CreateTCFirstGearATSerial(GearData gearData,
+			ShiftPolygon shiftPolygon)
+		{
+			gearData.TorqueConverterRatio = gearData.Ratio;
+			gearData.TorqueConverterGearLossMap = gearData.LossMap;
+			gearData.TorqueConverterShiftPolygon = shiftPolygon;
+		}
+
+		protected virtual void CretateTCFirstGearATPowerSplit(GearData gearData, uint i, ShiftPolygon shiftPolygon)
+		{
+			gearData.TorqueConverterRatio = 1;
+			gearData.TorqueConverterGearLossMap = TransmissionLossMapReader.Create(1, 1, $"TCGear {i + 1}");
+			gearData.TorqueConverterShiftPolygon = shiftPolygon;
+		}
+
+		/// <summary>
+		/// Creates an AngledriveData or returns null if there is no anglegear.
+		/// </summary>
+		/// <param name="data"></param>
+		/// <param name="useEfficiencyFallback">if true, the Efficiency value is used if no LossMap is found.</param>
+		/// <returns></returns>
+		internal AngledriveData DoCreateAngledriveData(IAngledriveInputData data, bool useEfficiencyFallback)
+		{
+			try
+			{
+				var type = data?.Type ?? AngledriveType.None;
+
+				switch (type)
+				{
+					case AngledriveType.LossesIncludedInGearbox:
+					case AngledriveType.None:
+						return null;
+					case AngledriveType.SeparateAngledrive:
+						var angledriveData = new AngledriveData
+						{
+							InputData = data,
+							SavedInDeclarationMode = data.SavedInDeclarationMode,
+							Manufacturer = data.Manufacturer,
+							ModelName = data.Model,
+							Date = data.Date,
+							CertificationMethod = data.CertificationMethod,
+							CertificationNumber = data.CertificationNumber,
+							DigestValueInput = data.DigestValue != null ? data.DigestValue.DigestValue : "",
+							Type = type,
+							Angledrive = new TransmissionData { Ratio = data.Ratio }
+						};
+						try
+						{
+							angledriveData.Angledrive.LossMap = TransmissionLossMapReader.Create(data.LossMap,
+								data.Ratio, "Angledrive", true);
+						}
+						catch (VectoException ex)
+						{
+							Log.Info("Angledrive Loss Map not found.");
+							if (useEfficiencyFallback)
+							{
+								Log.Info("Angledrive Trying with Efficiency instead of Loss Map.");
+								angledriveData.Angledrive.LossMap = TransmissionLossMapReader.Create(data.Efficiency,
+									data.Ratio, "Angledrive");
+							}
+							else
+							{
+								throw new VectoException("Angledrive: LossMap not found.", ex);
+							}
+						}
+						return angledriveData;
+					default:
+						throw new ArgumentOutOfRangeException(nameof(data), "Unknown Angledrive Type.");
+				}
+			}
+			catch (Exception e)
+			{
+				throw new VectoException("Error while reading Angledrive data: {0}", e.Message, e);
+			}
+		}
+
+		/// <summary>
+		/// Intersects max torque curve.
+		/// </summary>
+		/// <param name="maxTorqueEntries"></param>
+		/// <param name="maxTorque"></param>
+		/// <returns>A combined EngineFullLoadCurve with the minimum full load torque over all inputs curves.</returns>
+		internal static IList<VehicleMaxPropulsionTorque.FullLoadEntry> IntersectMaxPropulsionTorqueCurve(IList<VehicleMaxPropulsionTorque.FullLoadEntry> maxTorqueEntries, NewtonMeter maxTorque)
+		{
+			if (maxTorque == null)
+			{
+				return maxTorqueEntries;
+			}
+
+			var entries = new List<VehicleMaxPropulsionTorque.FullLoadEntry>();
+			var firstEntry = maxTorqueEntries.First();
+			if (firstEntry.FullDriveTorque < maxTorque)
+			{
+				entries.Add(maxTorqueEntries.First());
+			}
+			else
+			{
+				entries.Add(new VehicleMaxPropulsionTorque.FullLoadEntry
+				{
+					MotorSpeed = firstEntry.MotorSpeed,
+					FullDriveTorque = maxTorque,
+				});
+			}
+			foreach (var entry in maxTorqueEntries.Pairwise(Tuple.Create))
+			{
+				if (entry.Item1.FullDriveTorque <= maxTorque && entry.Item2.FullDriveTorque <= maxTorque)
+				{
+					// segment is below maxTorque line -> use directly
+					entries.Add(entry.Item2);
+				}
+				else if (entry.Item1.FullDriveTorque > maxTorque && entry.Item2.FullDriveTorque > maxTorque)
+				{
+					// segment is above maxTorque line -> add limited entry
+					entries.Add(new VehicleMaxPropulsionTorque.FullLoadEntry
+					{
+						MotorSpeed = entry.Item2.MotorSpeed,
+						FullDriveTorque = maxTorque,
+					});
+				}
+				else
+				{
+					// segment intersects maxTorque line -> add new entry at intersection
+					var edgeFull = Edge.Create(
+						new Point(entry.Item1.MotorSpeed.Value(), entry.Item1.FullDriveTorque.Value()),
+						new Point(entry.Item2.MotorSpeed.Value(), entry.Item2.FullDriveTorque.Value()));
+
+					var intersectionX = (maxTorque.Value() - edgeFull.OffsetXY) / edgeFull.SlopeXY;
+					if (!entries.Any(x => x.MotorSpeed.IsEqual(intersectionX)) && !intersectionX.IsEqual(entry.Item2.MotorSpeed.Value()))
+					{
+						entries.Add(new VehicleMaxPropulsionTorque.FullLoadEntry
+						{
+							MotorSpeed = intersectionX.SI<PerSecond>(),
+							FullDriveTorque = maxTorque,
+						});
+					}
+
+					entries.Add(new VehicleMaxPropulsionTorque.FullLoadEntry
+					{
+						MotorSpeed = entry.Item2.MotorSpeed,
+						FullDriveTorque = entry.Item2.FullDriveTorque > maxTorque ? maxTorque : entry.Item2.FullDriveTorque,
+
+					});
+				}
+			}
+
+
+			return entries;
+		}
 	}
 
 	public class IEPCGearboxInputData : IGearboxDeclarationInputData
diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/Conventional.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/Conventional.cs
deleted file mode 100644
index 146ca0f720..0000000000
--- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/Conventional.cs
+++ /dev/null
@@ -1,748 +0,0 @@
-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;
-using TUGraz.VectoCore.Configuration;
-using TUGraz.VectoCore.InputData.Reader.ComponentData;
-using TUGraz.VectoCore.InputData.Reader.ShiftStrategy;
-using TUGraz.VectoCore.Models.Declaration;
-using TUGraz.VectoCore.Models.Simulation.Data;
-using TUGraz.VectoCore.Models.SimulationComponent;
-using TUGraz.VectoCore.Models.SimulationComponent.Data;
-using TUGraz.VectoCore.Models.SimulationComponent.Data.Engine;
-using TUGraz.VectoCore.Models.SimulationComponent.Data.Gearbox;
-using TUGraz.VectoCore.Utils;
-
-namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.HeavyLorry
-{
-	public partial class DeclarationDataAdapterHeavyLorry
-	{
-		public class Conventional : LorryBase
-		{
-			public static readonly GearboxType[] SupportedGearboxTypes =
-				{ GearboxType.MT, GearboxType.AMT, GearboxType.ATPowerSplit, GearboxType.ATSerial };
-
-
-			public override VehicleData CreateVehicleData(IVehicleDeclarationInputData data, Segment segment,
-				Mission mission, KeyValuePair<LoadingType, Tuple<Kilogram, double?>> loading, bool allowVocational)
-			{
-				if (!data.SavedInDeclarationMode) {
-					WarnDeclarationMode("VehicleData");
-				}
-
-				//return data.ExemptedVehicle
-				//	? CreateExemptedVehicleData(data)
-				//	: CreateNonExemptedVehicleData(data, segment, mission, loading.Value.Item1, loading.Value.Item2,
-				//		allowVocational);
-				return CreateNonExemptedVehicleData(data, segment, mission, loading.Value.Item1, loading.Value.Item2, allowVocational);
-			}
-
-			protected virtual VehicleData CreateNonExemptedVehicleData(IVehicleDeclarationInputData data,
-				Segment segment, Mission mission, Kilogram loading, double? passengerCount, bool allowVocational)
-			{
-				var retVal = SetCommonVehicleData(data);
-				retVal.LegislativeClass = data.LegislativeClass;
-				retVal.AxleConfiguration = data.AxleConfiguration;
-				retVal.AirDensity = DeclarationData.AirDensity;
-				retVal.VIN = data.VIN;
-				retVal.ManufacturerAddress = data.ManufacturerAddress;
-				//			retVal.LegislativeClass = data.LegislativeClass;
-				retVal.ZeroEmissionVehicle = data.ZeroEmissionVehicle;
-				retVal.VehicleClass = segment.VehicleClass;
-				retVal.SleeperCab = retVal.VehicleClass.IsMediumLorry() ? false : data.SleeperCab;
-				retVal.TrailerGrossVehicleMass = mission.Trailer.Sum(t => t.TrailerGrossVehicleWeight).DefaultIfNull(0);
-
-				retVal.BodyAndTrailerMass =
-					mission.BodyCurbWeight + mission.Trailer.Sum(t => t.TrailerCurbWeight).DefaultIfNull(0);
-
-				retVal.Loading = loading;
-				retVal.PassengerCount = passengerCount;
-				retVal.DynamicTyreRadius =
-					data.Components.AxleWheels.AxlesDeclaration.Where(axle => axle.AxleType == AxleType.VehicleDriven)
-						.Select(da => DeclarationData.Wheels.Lookup(da.Tyre.Dimension).DynamicTyreRadius)
-						.Average();
-				if (segment.VehicleClass.IsMediumLorry() && segment.VehicleClass.IsVan()) {
-					retVal.CargoVolume = data.CargoVolume;
-				} else {
-					retVal.CargoVolume = mission.MissionType != MissionType.Construction
-						? mission.TotalCargoVolume
-						: 0.SI<CubicMeter>();
-				}
-
-				retVal.VocationalVehicle = allowVocational && data.VocationalVehicle;
-				retVal.ADAS = CreateADAS(data.ADAS);
-
-				var axles = data.Components.AxleWheels.AxlesDeclaration;
-				if (axles.Count < mission.AxleWeightDistribution.Length) {
-					throw new VectoException(
-						"Vehicle does not contain sufficient axles. {0} axles defined, {1} axles required",
-						axles.Count, mission.AxleWeightDistribution.Length);
-				}
-
-				var axleData = new List<Axle>();
-				for (var i = 0; i < mission.AxleWeightDistribution.Length; i++) {
-					var axleInput = axles[i];
-					var axle = new Axle {
-						WheelsDimension = axleInput.Tyre.Dimension,
-						AxleType = axleInput.AxleType,
-						AxleWeightShare = mission.AxleWeightDistribution[i],
-						TwinTyres = axleInput.TwinTyres,
-						RollResistanceCoefficient = axleInput.Tyre.RollResistanceCoefficient,
-						TyreTestLoad = axleInput.Tyre.TyreTestLoad,
-						FuelEfficiencyClass = axleInput.Tyre.FuelEfficiencyClass,
-						Inertia = DeclarationData.Wheels.Lookup(axleInput.Tyre.Dimension.RemoveWhitespace()).Inertia,
-						CertificationNumber = axleInput.Tyre.CertificationNumber,
-						DigestValueInput = axleInput.Tyre.DigestValue == null
-							? ""
-							: axleInput.Tyre.DigestValue.DigestValue,
-					};
-					axleData.Add(axle);
-				}
-
-				foreach (var trailer in mission.Trailer) {
-					axleData.AddRange(
-						trailer.TrailerWheels.Select(
-							trailerWheel => new Axle {
-								AxleType = AxleType.Trailer,
-								AxleWeightShare = trailer.TrailerAxleWeightShare / trailer.TrailerWheels.Count,
-								TwinTyres = DeclarationData.Trailer.TwinTyres,
-								RollResistanceCoefficient = DeclarationData.Trailer.RollResistanceCoefficient,
-								TyreTestLoad = DeclarationData.Trailer.TyreTestLoad.SI<Newton>(),
-								FuelEfficiencyClass = DeclarationData.Trailer.FuelEfficiencyClass,
-								Inertia = trailerWheel.Inertia,
-								WheelsDimension = trailerWheel.WheelType
-							}));
-				}
-
-				retVal.AxleData = axleData;
-				return retVal;
-			}
-
-
-			protected virtual VehicleData CreateExemptedVehicleData(IVehicleDeclarationInputData data)
-			{
-				var exempted = SetCommonVehicleData(data);
-				exempted.VIN = data.VIN;
-				exempted.ManufacturerAddress = data.ManufacturerAddress;
-				exempted.LegislativeClass = data.LegislativeClass;
-				exempted.ZeroEmissionVehicle = data.ZeroEmissionVehicle;
-				exempted.HybridElectricHDV = data.HybridElectricHDV;
-				exempted.DualFuelVehicle = data.DualFuelVehicle;
-				exempted.MaxNetPower1 = data.MaxNetPower1;
-				exempted.MaxNetPower2 = data.MaxNetPower2;
-				return exempted;
-			}
-
-
-			public override CombustionEngineData CreateEngineData(
-				IVehicleDeclarationInputData vehicle, IEngineModeDeclarationInputData mode, Mission mission)
-			{
-				var engine = vehicle.Components.EngineInputData;
-				var gearbox = vehicle.Components.GearboxInputData;
-
-				if (!engine.SavedInDeclarationMode) {
-					WarnDeclarationMode("EngineData");
-				}
-
-				var retVal = SetCommonCombustionEngineData(engine, vehicle.TankSystem);
-				retVal.IdleSpeed = VectoMath.Max(mode.IdleSpeed, vehicle.EngineIdleSpeed);
-
-				retVal.Fuels = new List<CombustionEngineFuelData>();
-				foreach (var fuel in mode.Fuels) {
-					retVal.Fuels.Add(
-						new CombustionEngineFuelData() {
-							WHTCUrban = fuel.WHTCUrban,
-							WHTCRural = fuel.WHTCRural,
-							WHTCMotorway = fuel.WHTCMotorway,
-							ColdHotCorrectionFactor = fuel.ColdHotBalancingFactor,
-							CorrectionFactorRegPer = fuel.CorrectionFactorRegPer,
-							FuelData = DeclarationData.FuelData.Lookup(fuel.FuelType, vehicle.TankSystem),
-							ConsumptionMap = FuelConsumptionMapReader.Create(fuel.FuelConsumptionMap),
-							FuelConsumptionCorrectionFactor = DeclarationData.WHTCCorrection.Lookup(
-								mission.MissionType.GetNonEMSMissionType(), fuel.WHTCRural, fuel.WHTCUrban,
-								fuel.WHTCMotorway) * fuel.ColdHotBalancingFactor * fuel.CorrectionFactorRegPer,
-						});
-				}
-
-				retVal.Inertia = DeclarationData.Engine.EngineInertia(retVal.Displacement, gearbox.Type);
-				retVal.EngineStartTime = DeclarationData.Engine.DefaultEngineStartTime;
-				var limits = vehicle.TorqueLimits?.ToDictionary(e => e.Gear) ??
-							new Dictionary<int, ITorqueLimitInputData>();
-				var numGears = gearbox.Gears.Count;
-				var fullLoadCurves = new Dictionary<uint, EngineFullLoadCurve>(numGears + 1);
-				fullLoadCurves[0] = FullLoadCurveReader.Create(mode.FullLoadCurve, true);
-				fullLoadCurves[0].EngineData = retVal;
-				foreach (var gear in gearbox.Gears) {
-					var maxTorque = VectoMath.Min(
-						GbxMaxTorque(gear, numGears, fullLoadCurves[0].MaxTorque),
-						VehMaxTorque(gear, numGears, limits, fullLoadCurves[0].MaxTorque));
-					fullLoadCurves[(uint)gear.Gear] = IntersectFullLoadCurves(fullLoadCurves[0], maxTorque);
-				}
-
-				retVal.FullLoadCurves = fullLoadCurves;
-
-				retVal.WHRType = engine.WHRType;
-				if ((retVal.WHRType & WHRType.ElectricalOutput) != 0) {
-					retVal.ElectricalWHR = CreateWHRData(
-						mode.WasteHeatRecoveryDataElectrical, mission.MissionType, WHRType.ElectricalOutput);
-				}
-
-				if ((retVal.WHRType & WHRType.MechanicalOutputDrivetrain) != 0) {
-					retVal.MechanicalWHR = CreateWHRData(
-						mode.WasteHeatRecoveryDataMechanical, mission.MissionType, WHRType.MechanicalOutputDrivetrain);
-				}
-
-				return retVal;
-			}
-
-			protected static WHRData CreateWHRData(IWHRData whrInputData, MissionType missionType, WHRType type)
-			{
-				if (whrInputData == null || whrInputData.GeneratedPower == null) {
-					throw new VectoException("Missing WHR Data");
-				}
-
-				var whr = new WHRData() {
-					CFUrban = whrInputData.UrbanCorrectionFactor,
-					CFRural = whrInputData.RuralCorrectionFactor,
-					CFMotorway = whrInputData.MotorwayCorrectionFactor,
-					CFColdHot = whrInputData.BFColdHot,
-					CFRegPer = whrInputData.CFRegPer,
-					WHRMap = WHRPowerReader.Create(whrInputData.GeneratedPower, type)
-				};
-				whr.WHRCorrectionFactor = DeclarationData.WHTCCorrection.Lookup(
-					missionType.GetNonEMSMissionType(), whr.CFRural, whr.CFUrban,
-					whr.CFMotorway) * whr.CFColdHot * whr.CFRegPer;
-				return whr;
-			}
-
-			protected internal static NewtonMeter VehMaxTorque(
-				ITransmissionInputData gear, int numGears,
-				Dictionary<int, ITorqueLimitInputData> limits,
-				NewtonMeter maxEngineTorque)
-			{
-				if (gear.Gear - 1 >= numGears / 2) {
-					// only upper half of gears can limit if max-torque <= 0.95 of engine max torque
-					if (limits.TryGetValue(gear.Gear, out var limit) && limit.MaxTorque <=
-						DeclarationData.Engine.TorqueLimitVehicleFactor * maxEngineTorque) {
-						return limit.MaxTorque;
-					}
-				}
-
-				return null;
-			}
-
-			protected internal static NewtonMeter GbxMaxTorque(
-				ITransmissionInputData gear, int numGears, NewtonMeter maxEngineTorque
-			)
-			{
-				if (gear.Gear - 1 < numGears / 2) {
-					// gears count from 1 to n, -> n entries, lower half can always limit
-					if (gear.MaxTorque != null) {
-						return gear.MaxTorque;
-					}
-				} else {
-					// upper half can only limit if max-torque <= 90% of engine max torque
-					if (gear.MaxTorque != null &&
-						gear.MaxTorque <= DeclarationData.Engine.TorqueLimitGearboxFactor * maxEngineTorque) {
-						return gear.MaxTorque;
-					}
-				}
-
-				return null;
-			}
-
-			public override GearboxData CreateGearboxData(IVehicleDeclarationInputData inputData, VectoRunData runData,
-				IShiftPolygonCalculator shiftPolygonCalc)
-			{
-				if (!inputData.Components.GearboxInputData.SavedInDeclarationMode) {
-					WarnDeclarationMode("GearboxData");
-				}
-
-				return DoCreateGearboxData(inputData, runData, shiftPolygonCalc);
-			}
-
-			public virtual GearboxData DoCreateGearboxData(IVehicleDeclarationInputData inputData, VectoRunData runData,
-				IShiftPolygonCalculator shiftPolygonCalc)
-			{
-				var gearbox = inputData.Components.GearboxInputData;
-
-				var adas = inputData.ADAS;
-				var torqueConverter = inputData.Components.TorqueConverterInputData;
-
-				var engine = runData.EngineData;
-				var axlegearRatio = runData.AxleGearData.AxleGear.Ratio;
-				var dynamicTyreRadius = runData.VehicleData.DynamicTyreRadius;
-
-				var retVal = SetCommonGearboxData(gearbox);
-
-				//if (adas != null && retVal.Type.AutomaticTransmission() && adas.EcoRoll != EcoRollType.None &&
-				//	!adas.ATEcoRollReleaseLockupClutch.HasValue) {
-				//	throw new VectoException("Input parameter ATEcoRollReleaseLockupClutch required for AT transmission");
-				//}
-
-				retVal.ATEcoRollReleaseLockupClutch =
-					adas != null && adas.EcoRoll != EcoRollType.None && retVal.Type.AutomaticTransmission()
-						? (adas.ATEcoRollReleaseLockupClutch.HasValue ? adas.ATEcoRollReleaseLockupClutch.Value : false)
-						: false;
-
-				if (!SupportedGearboxTypes.Contains(gearbox.Type)) {
-					throw new VectoSimulationException("Unsupported gearbox type: {0}!", retVal.Type);
-				}
-
-				var gearsInput = gearbox.Gears;
-				if (gearsInput.Count < 1) {
-					throw new VectoSimulationException(
-						"At least one Gear-Entry must be defined in Gearbox!");
-				}
-
-				SetDeclarationData(retVal);
-
-				var gearDifferenceRatio = gearbox.Type.AutomaticTransmission() && gearbox.Gears.Count > 2
-					? gearbox.Gears[0].Ratio / gearbox.Gears[1].Ratio
-					: 1.0;
-
-				var gears = new Dictionary<uint, GearData>();
-				var tcShiftPolygon = DeclarationData.TorqueConverter.ComputeShiftPolygon(engine.FullLoadCurves[0]);
-				var vehicleCategory = runData.VehicleData.VehicleCategory == VehicleCategory.GenericBusVehicle
-					? VehicleCategory.GenericBusVehicle
-					: inputData.VehicleCategory;
-				for (uint i = 0; i < gearsInput.Count; i++) {
-					var gear = gearsInput[(int)i];
-					var lossMap = CreateGearLossMap(gear, i, false, vehicleCategory, gearbox.Type);
-
-					var shiftPolygon = shiftPolygonCalc != null
-						? shiftPolygonCalc.ComputeDeclarationShiftPolygon(
-							gearbox.Type, (int)i, engine.FullLoadCurves[i + 1], gearbox.Gears, engine, axlegearRatio,
-							dynamicTyreRadius)
-						: DeclarationData.Gearbox.ComputeShiftPolygon(
-							gearbox.Type, (int)i, engine.FullLoadCurves[i + 1],
-							gearsInput, engine,
-							axlegearRatio, dynamicTyreRadius, null);
-
-					var gearData = new GearData {
-						ShiftPolygon = shiftPolygon,
-						MaxSpeed = gear.MaxInputSpeed,
-						MaxTorque = gear.MaxTorque,
-						Ratio = gear.Ratio,
-						LossMap = lossMap,
-					};
-
-					CreateATGearData(gearbox, i, gearData, tcShiftPolygon, gearDifferenceRatio, gears,
-						runData.VehicleData.VehicleCategory);
-					gears.Add(i + 1, gearData);
-				}
-
-				// remove disabled gears (only the last or last two gears may be removed)
-				if (inputData.TorqueLimits != null) {
-					var toRemove = (from tqLimit in inputData.TorqueLimits
-						where tqLimit.Gear >= gears.Keys.Max() - 1 && tqLimit.MaxTorque.IsEqual(0)
-						select (uint)tqLimit.Gear).ToList();
-					if (toRemove.Count > 0 && toRemove.Min() <= gears.Count - toRemove.Count) {
-						throw new VectoException(
-							"Only the last 1 or 2 gears can be disabled. Disabling gear {0} for a {1}-speed gearbox is not allowed.",
-							toRemove.Min(), gears.Count);
-					}
-
-					foreach (var entry in toRemove) {
-						gears.Remove(entry);
-					}
-				}
-
-				retVal.Gears = gears;
-				if (retVal.Type.AutomaticTransmission()) {
-					var ratio = double.IsNaN(retVal.Gears[1].Ratio)
-						? 1
-						: retVal.Gears[1].TorqueConverterRatio / retVal.Gears[1].Ratio;
-					retVal.PowershiftShiftTime = DeclarationData.Gearbox.PowershiftShiftTime;
-
-					retVal.TorqueConverterData =
-						CreateTorqueConverterData(gearbox.Type, torqueConverter, ratio, engine);
-
-					if (torqueConverter != null) {
-						retVal.TorqueConverterData.Manufacturer = torqueConverter.Manufacturer;
-						retVal.TorqueConverterData.ModelName = torqueConverter.Model;
-						retVal.TorqueConverterData.DigestValueInput = torqueConverter.DigestValue?.DigestValue;
-						retVal.TorqueConverterData.CertificationMethod = torqueConverter.CertificationMethod;
-						retVal.TorqueConverterData.CertificationNumber = torqueConverter.CertificationNumber;
-						retVal.TorqueConverterData.Date = torqueConverter.Date;
-						retVal.TorqueConverterData.AppVersion = torqueConverter.AppVersion;
-					}
-				}
-
-				// update disengageWhenHaltingSpeed
-				if (retVal.Type.AutomaticTransmission()) {
-					var firstGear = retVal.GearList.First(x => x.IsLockedGear());
-					if (retVal.Gears[firstGear.Gear].ShiftPolygon.Downshift.Any()) {
-						var downshiftSpeedInc = retVal.Gears[firstGear.Gear].ShiftPolygon
-							.InterpolateDownshiftSpeed(0.SI<NewtonMeter>()) * 1.05;
-						var vehicleSpeedDisengage =
-							downshiftSpeedInc / axlegearRatio / retVal.Gears[firstGear.Gear].Ratio *
-							dynamicTyreRadius;
-						retVal.DisengageWhenHaltingSpeed = vehicleSpeedDisengage;
-					}
-				}
-
-				return retVal;
-			}
-
-			protected virtual TorqueConverterData CreateTorqueConverterData(GearboxType gearboxType,
-				ITorqueConverterDeclarationInputData torqueConverter, double ratio,
-				CombustionEngineData componentsEngineInputData)
-			{
-				return TorqueConverterDataReader.Create(
-					torqueConverter.TCData,
-					DeclarationData.TorqueConverter.ReferenceRPM, DeclarationData.TorqueConverter.MaxInputSpeed,
-					ExecutionMode.Declaration, ratio,
-					DeclarationData.TorqueConverter.CLUpshiftMinAcceleration,
-					DeclarationData.TorqueConverter.CCUpshiftMinAcceleration);
-			}
-
-			protected virtual void CreateATGearData(
-				IGearboxDeclarationInputData gearbox, uint i, GearData gearData,
-				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
-					CretateTCFirstGearATPowerSplit(gearData, i, tcShiftPolygon);
-				}
-
-				if (gearbox.Type == GearboxType.ATSerial) {
-					if (i == 0) {
-						// 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)) {
-						// 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);
-
-						// NOTE: the lower gear in 'gears' dictionary has index i !!
-						gears[i].Ratio = double.NaN;
-						gears[i].LossMap = null;
-					}
-				}
-			}
-
-			private static void SetDeclarationData(GearboxData retVal)
-			{
-				retVal.Inertia = DeclarationData.Gearbox.Inertia;
-				retVal.TractionInterruption = retVal.Type.TractionInterruption();
-			}
-
-			public override AxleGearData CreateAxleGearData(IAxleGearInputData data)
-			{
-				var retVal = SetCommonAxleGearData(data);
-				retVal.AxleGear.LossMap = ReadAxleLossMap(data, false);
-				return retVal;
-			}
-
-			public override AngledriveData CreateAngledriveData(IAngledriveInputData data)
-			{
-				return DoCreateAngledriveData(data, false);
-			}
-
-
-			public override IList<VectoRunData.AuxData> CreateAuxiliaryData(
-				IAuxiliariesDeclarationInputData auxInputData,
-				IBusAuxiliariesDeclarationData busAuxData, MissionType mission, VehicleClass hvdClass,
-				Meter vehicleLength, int? numSteeredAxles)
-			{
-				if (!auxInputData.SavedInDeclarationMode) {
-					WarnDeclarationMode("AuxiliariesData");
-				}
-
-				var retVal = new List<VectoRunData.AuxData>();
-
-				if (auxInputData.Auxiliaries.Count != 5) {
-					Log.Error(
-						"In Declaration Mode exactly 5 Auxiliaries must be defined: Fan, Steering pump, HVAC, Electric System, Pneumatic System.");
-					throw new VectoException(
-						"In Declaration Mode exactly 5 Auxiliaries must be defined: Fan, Steering pump, HVAC, Electric System, Pneumatic System.");
-				}
-
-				foreach (var auxType in EnumHelper.GetValues<AuxiliaryType>()) {
-					var auxData = auxInputData.Auxiliaries.FirstOrDefault(a => a.Type == auxType);
-					if (auxData == null) {
-						throw new VectoException("Auxiliary {0} not found.", auxType);
-					}
-
-					var aux = new VectoRunData.AuxData {
-						DemandType = AuxiliaryDemandType.Constant,
-						Technology = auxData.Technology
-					};
-
-					mission = mission.GetNonEMSMissionType();
-					switch (auxType) {
-						case AuxiliaryType.Fan:
-							aux.PowerDemand = DeclarationData.Fan.LookupPowerDemand(hvdClass, mission,
-								auxData.Technology.FirstOrDefault());
-							aux.ID = Constants.Auxiliaries.IDs.Fan;
-							break;
-						case AuxiliaryType.SteeringPump:
-							if (numSteeredAxles.HasValue && auxData.Technology.Count != numSteeredAxles.Value) {
-								throw new VectoException(
-									$"Number of steering pump technologies does not match number of steered axles ({numSteeredAxles.Value}, {auxData.Technology.Count})");
-							}
-
-							aux.PowerDemand =
-								DeclarationData.SteeringPump.Lookup(mission, hvdClass, auxData.Technology);
-							aux.ID = Constants.Auxiliaries.IDs.SteeringPump;
-							break;
-						case AuxiliaryType.HVAC:
-							aux.PowerDemand = DeclarationData.HeatingVentilationAirConditioning.Lookup(
-								mission,
-								auxData.Technology.FirstOrDefault(), hvdClass).PowerDemand;
-							aux.ID = Constants.Auxiliaries.IDs.HeatingVentilationAirCondition;
-							break;
-						case AuxiliaryType.PneumaticSystem:
-							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()).PowerDemand;
-							aux.ID = Constants.Auxiliaries.IDs.ElectricSystem;
-							break;
-						default: continue;
-					}
-
-					retVal.Add(aux);
-				}
-
-				return retVal;
-			}
-
-			public override AxleGearData CreateDummyAxleGearData(IGearboxDeclarationInputData gbxData)
-			{
-				if (double.IsNaN(gbxData.AxlegearRatio)) {
-					throw new VectoException(
-						"Axlegear ratio required in gearbox data for gearboxes with included axlegear");
-				}
-
-				return new AxleGearData() {
-					AxleGear = new TransmissionData() {
-						Ratio = gbxData.AxlegearRatio,
-						LossMap = TransmissionLossMapReader.Create(1.0, gbxData.AxlegearRatio, "Axlegear")
-					}
-				};
-			}
-
-			protected void WarnDeclarationMode(string inputData)
-			{
-				Log.Warn("{0} not in Declaration Mode!", inputData);
-			}
-
-			public override RetarderData CreateRetarderData(IRetarderInputData retarder)
-			{
-				return SetCommonRetarderData(retarder);
-			}
-
-			public static List<CrossWindCorrectionCurveReader.CrossWindCorrectionEntry>
-				GetDeclarationAirResistanceCurve(
-					string crosswindCorrectionParameters, SquareMeter aerodynamicDragAera, Meter vehicleHeight)
-			{
-				var startSpeed = Constants.SimulationSettings.CrosswindCorrection.MinVehicleSpeed;
-				var maxSpeed = Constants.SimulationSettings.CrosswindCorrection.MaxVehicleSpeed;
-				var speedStep = Constants.SimulationSettings.CrosswindCorrection.VehicleSpeedStep;
-
-				var maxAlpha = Constants.SimulationSettings.CrosswindCorrection.MaxAlpha;
-				var alphaStep = Constants.SimulationSettings.CrosswindCorrection.AlphaStep;
-
-				var startHeightPercent = Constants.SimulationSettings.CrosswindCorrection.MinHeight;
-				var maxHeightPercent = Constants.SimulationSettings.CrosswindCorrection.MaxHeight;
-				var heightPercentStep = Constants.SimulationSettings.CrosswindCorrection.HeightStep;
-				var heightShare = (double)heightPercentStep / maxHeightPercent;
-
-				var values = DeclarationData.AirDrag.Lookup(crosswindCorrectionParameters);
-
-				// first entry (0m/s) will get CdxA of second entry.
-				var points = new List<CrossWindCorrectionCurveReader.CrossWindCorrectionEntry> {
-					new CrossWindCorrectionCurveReader.CrossWindCorrectionEntry {
-						Velocity = 0.SI<MeterPerSecond>(),
-						EffectiveCrossSectionArea = 0.SI<SquareMeter>()
-					}
-				};
-
-				for (var speed = startSpeed; speed <= maxSpeed; speed += speedStep) {
-					var vVeh = speed.KMPHtoMeterPerSecond();
-
-					var cdASum = 0.SI<SquareMeter>();
-
-					for (var heightPercent = startHeightPercent;
-						heightPercent < maxHeightPercent;
-						heightPercent += heightPercentStep) {
-						var height = heightPercent / 100.0 * vehicleHeight;
-						var vWind = Physics.BaseWindSpeed *
-									Math.Pow(height / Physics.BaseWindHeight, Physics.HellmannExponent);
-
-						for (var alpha = 0; alpha <= maxAlpha; alpha += alphaStep) {
-							var vAirX = vVeh + vWind * Math.Cos(alpha.ToRadian());
-							var vAirY = vWind * Math.Sin(alpha.ToRadian());
-
-							var beta = Math.Atan(vAirY / vAirX).ToDegree();
-
-							// ΔCdxA = A1β + A2β² + A3β³
-							var deltaCdA = values.A1 * beta + values.A2 * beta * beta + values.A3 * beta * beta * beta;
-
-							// CdxA(β) = CdxA(0) + ΔCdxA(β)
-							var cdA = aerodynamicDragAera + deltaCdA;
-
-							var share = (alpha == 0 || alpha == maxAlpha ? alphaStep / 2.0 : alphaStep) / maxAlpha;
-
-							// v_air = sqrt(v_airX²+vAirY²)
-							// cdASum = CdxA(β) * v_air²/v_veh²
-							cdASum += heightShare * share * cdA * (vAirX * vAirX + vAirY * vAirY) / (vVeh * vVeh);
-						}
-					}
-
-					points.Add(
-						new CrossWindCorrectionCurveReader.CrossWindCorrectionEntry {
-							Velocity = vVeh,
-							EffectiveCrossSectionArea = cdASum
-						});
-				}
-
-				points[0].EffectiveCrossSectionArea = points[1].EffectiveCrossSectionArea;
-				return points;
-			}
-
-			public override PTOData CreatePTOTransmissionData(IPTOTransmissionInputData pto)
-			{
-				if (pto != null && pto.PTOTransmissionType != "None") {
-					return new PTOData {
-						TransmissionType = pto.PTOTransmissionType,
-						LossMap = PTOIdleLossMapReader.GetZeroLossMap(),
-					};
-				}
-
-				return null;
-			}
-
-			public override AirdragData CreateAirdragData(
-				IAirdragDeclarationInputData airdragInputData, Mission mission,
-				Segment segment)
-			{
-				if (airdragInputData == null || airdragInputData.AirDragArea == null) {
-					return DefaultAirdragData(mission);
-				}
-
-				var retVal = SetCommonAirdragData(airdragInputData);
-				retVal.CrossWindCorrectionMode = CrossWindCorrectionMode.DeclarationModeCorrection;
-				retVal.DeclaredAirdragArea = mission.MissionType == MissionType.Construction
-					? mission.DefaultCDxA
-					: airdragInputData.AirDragArea;
-
-				var aerodynamicDragArea =
-					retVal.DeclaredAirdragArea + mission.Trailer.Sum(t => t.DeltaCdA).DefaultIfNull(0);
-
-				retVal.CrossWindCorrectionCurve =
-					new CrosswindCorrectionCdxALookup(
-						aerodynamicDragArea,
-						GetDeclarationAirResistanceCurve(
-							mission.CrossWindCorrectionParameters, aerodynamicDragArea, mission.VehicleHeight),
-						CrossWindCorrectionMode.DeclarationModeCorrection);
-				return retVal;
-			}
-
-			protected virtual AirdragData DefaultAirdragData(Mission mission)
-			{
-				var aerodynamicDragArea = mission.DefaultCDxA + mission.Trailer.Sum(t => t.DeltaCdA).DefaultIfNull(0);
-
-				return new AirdragData() {
-					CertificationMethod = CertificationMethod.StandardValues,
-					CrossWindCorrectionMode = CrossWindCorrectionMode.DeclarationModeCorrection,
-					DeclaredAirdragArea = mission.DefaultCDxA,
-					CrossWindCorrectionCurve = new CrosswindCorrectionCdxALookup(
-						aerodynamicDragArea,
-						GetDeclarationAirResistanceCurve(
-							mission.CrossWindCorrectionParameters, aerodynamicDragArea, mission.VehicleHeight),
-						CrossWindCorrectionMode.DeclarationModeCorrection)
-				};
-			}
-
-			public override ShiftStrategyParameters CreateGearshiftData(GearboxData gbx, double axleRatio,
-				PerSecond engineIdlingSpeed)
-			{
-				var retVal = new ShiftStrategyParameters {
-					TorqueReserve = DeclarationData.GearboxTCU.TorqueReserve,
-					StartTorqueReserve = DeclarationData.GearboxTCU.TorqueReserveStart,
-					TimeBetweenGearshifts = DeclarationData.Gearbox.MinTimeBetweenGearshifts,
-					StartSpeed = DeclarationData.GearboxTCU.StartSpeed,
-					StartAcceleration = DeclarationData.GearboxTCU.StartAcceleration,
-					DownshiftAfterUpshiftDelay = DeclarationData.Gearbox.DownshiftAfterUpshiftDelay,
-					UpshiftAfterDownshiftDelay = DeclarationData.Gearbox.UpshiftAfterDownshiftDelay,
-					UpshiftMinAcceleration = DeclarationData.Gearbox.UpshiftMinAcceleration,
-
-					StartVelocity = DeclarationData.GearboxTCU.StartSpeed,
-					GearResidenceTime = DeclarationData.GearboxTCU.GearResidenceTime,
-					DnT99L_highMin1 = DeclarationData.GearboxTCU.DnT99L_highMin1,
-					DnT99L_highMin2 = DeclarationData.GearboxTCU.DnT99L_highMin2,
-					AllowedGearRangeUp = DeclarationData.GearboxTCU.AllowedGearRangeUp,
-					AllowedGearRangeDown = DeclarationData.GearboxTCU.AllowedGearRangeDown,
-					LookBackInterval = DeclarationData.GearboxTCU.LookBackInterval,
-					DriverAccelerationLookBackInterval = DeclarationData.GearboxTCU.DriverAccelerationLookBackInterval,
-					DriverAccelerationThresholdLow = DeclarationData.GearboxTCU.DriverAccelerationThresholdLow,
-					AverageCardanPowerThresholdPropulsion =
-						DeclarationData.GearboxTCU.AverageCardanPowerThresholdPropulsion,
-					CurrentCardanPowerThresholdPropulsion =
-						DeclarationData.GearboxTCU.CurrentCardanPowerThresholdPropulsion,
-					TargetSpeedDeviationFactor = DeclarationData.GearboxTCU.TargetSpeedDeviationFactor,
-					EngineSpeedHighDriveOffFactor = DeclarationData.GearboxTCU.EngineSpeedHighDriveOffFactor,
-					RatingFactorCurrentGear = gbx.Type.AutomaticTransmission()
-						? DeclarationData.GearboxTCU.RatingFactorCurrentGearAT
-						: DeclarationData.GearboxTCU.RatingFactorCurrentGear,
-					AccelerationReserveLookup = AccelerationReserveLookupReader.ReadFromStream(
-						RessourceHelper.ReadStream(
-							DeclarationData.DeclarationDataResourcePrefix +
-							".GearshiftParameters.AccelerationReserveLookup.csv")),
-					ShareTorque99L = ShareTorque99lLookupReader.ReadFromStream(
-						RessourceHelper.ReadStream(
-							DeclarationData.DeclarationDataResourcePrefix + ".GearshiftParameters.ShareTq99L.csv")
-					),
-					PredictionDurationLookup = PredictionDurationLookupReader.ReadFromStream(
-						RessourceHelper.ReadStream(
-							DeclarationData.DeclarationDataResourcePrefix +
-							".GearshiftParameters.PredictionTimeLookup.csv")
-					),
-					ShareIdleLow = ShareIdleLowReader.ReadFromStream(
-						RessourceHelper.ReadStream(
-							DeclarationData.DeclarationDataResourcePrefix + ".GearshiftParameters.ShareIdleLow.csv")
-					),
-					ShareEngineHigh = EngineSpeedHighLookupReader.ReadFromStream(
-						RessourceHelper.ReadStream(
-							DeclarationData.DeclarationDataResourcePrefix +
-							".GearshiftParameters.ShareEngineSpeedHigh.csv")
-					),
-
-					//--------------------
-					RatioEarlyUpshiftFC = DeclarationData.GearboxTCU.RatioEarlyUpshiftFC / axleRatio,
-					RatioEarlyDownshiftFC = DeclarationData.GearboxTCU.RatioEarlyDownshiftFC / axleRatio,
-					AllowedGearRangeFC = gbx.Type.AutomaticTransmission()
-						? (gbx.Gears.Count > DeclarationData.GearboxTCU.ATSkipGearsThreshold
-							? DeclarationData.GearboxTCU.AllowedGearRangeFCATSkipGear
-							: DeclarationData.GearboxTCU.AllowedGearRangeFCAT)
-						: DeclarationData.GearboxTCU.AllowedGearRangeFCAMT,
-					VelocityDropFactor = DeclarationData.GearboxTCU.VelocityDropFactor,
-					AccelerationFactor = DeclarationData.GearboxTCU.AccelerationFactor,
-					MinEngineSpeedPostUpshift = 0.RPMtoRad(),
-					ATLookAheadTime = DeclarationData.GearboxTCU.ATLookAheadTime,
-
-					LoadStageThresoldsUp = DeclarationData.GearboxTCU.LoadStageThresholdsUp,
-					LoadStageThresoldsDown = DeclarationData.GearboxTCU.LoadStageThresoldsDown,
-					ShiftSpeedsTCToLocked = DeclarationData.GearboxTCU.ShiftSpeedsTCToLocked
-						.Select(x => x.Select(y => y + engineIdlingSpeed.AsRPM).ToArray()).ToArray(),
-				};
-
-				return retVal;
-			}
-		}
-	}
-}
\ No newline at end of file
diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/DeclarationDataAdapterHeavyLorry.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/DeclarationDataAdapterHeavyLorry.cs
index 377f87edd1..a7ce233f9a 100644
--- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/DeclarationDataAdapterHeavyLorry.cs
+++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/DeclarationDataAdapterHeavyLorry.cs
@@ -31,99 +31,278 @@
 
 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;
+using TUGraz.VectoCore.Configuration;
 using TUGraz.VectoCore.InputData.Reader.ComponentData;
+using TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponents;
+using TUGraz.VectoCore.InputData.Reader.ShiftStrategy;
 using TUGraz.VectoCore.Models.Declaration;
 using TUGraz.VectoCore.Models.Simulation.Data;
 using TUGraz.VectoCore.Models.SimulationComponent;
 using TUGraz.VectoCore.Models.SimulationComponent.Data;
+using TUGraz.VectoCore.Models.SimulationComponent.Data.Engine;
+using TUGraz.VectoCore.Models.SimulationComponent.Data.Gearbox;
+using TUGraz.VectoCore.Utils;
 
 namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.HeavyLorry
 {
-	
 	public partial class DeclarationDataAdapterHeavyLorry : AbstractSimulationDataAdapter, IDeclarationDataAdapter
 	{
-		[Obsolete("Use DeclarationDataAdapterHeavyLorry.Conventional instead, created automatically with NInject")]
-		public DeclarationDataAdapterHeavyLorry()
+		public abstract class LorryBase : AbstractSimulationDataAdapter, IDeclarationDataAdapter
 		{
-			
-		}
-		private IDeclarationDataAdapter _declarationDataAdapterImplementation = new Conventional();
-		public static readonly GearboxType[] SupportedGearboxTypes = Conventional.SupportedGearboxTypes;
-		public static List<CrossWindCorrectionCurveReader.CrossWindCorrectionEntry> GetDeclarationAirResistanceCurve(string parameterSet, SquareMeter si, Meter meter)
-		{
-			return Conventional.GetDeclarationAirResistanceCurve(parameterSet, si, meter);
-		}
-		#region Implementation of IDeclarationDataAdapter
+			#region Implementation of IDeclarationDataAdapter
 
-		public DriverData CreateDriverData()
-		{
-			return _declarationDataAdapterImplementation.CreateDriverData();
-		}
+			private readonly IDriverDataAdapter _driverDataAdapter = new LorryDriverDataAdapter();
+			protected readonly IVehicleDataAdapter _vehicleDataAdapter = new LorryVehicleDataAdapter();
+			private readonly IAxleGearDataAdapter _axleGearDataAdapter = new AxleGearDataAdapterBase();
+			private readonly IRetarderDataAdapter _retarderDataAdapter = new RetarderDataAdapter();
+			private readonly IAirdragDataAdapter _airdragDataAdapter = new AirdragDataAdapter();
+			private readonly IPTODataAdapter _ptoDataAdapter = new PTODataAdapterLorry();
+			public DriverData CreateDriverData()
+			{
+				return _driverDataAdapter.CreateDriverData();
+			}
 
-		public VehicleData CreateVehicleData(IVehicleDeclarationInputData vehicle, Segment segment, Mission mission,
-			KeyValuePair<LoadingType, Tuple<Kilogram, double?>> loading, bool allowVocational)
-		{
-			return _declarationDataAdapterImplementation.CreateVehicleData(vehicle, segment, mission, loading, allowVocational);
-		}
+			public virtual VehicleData CreateVehicleData(IVehicleDeclarationInputData vehicle, Segment segment,
+				Mission mission,
+				KeyValuePair<LoadingType, Tuple<Kilogram, double?>> loading, bool allowVocational)
+			{
+				return _vehicleDataAdapter.CreateVehicleData(vehicle, segment, mission, loading.Value.Item1,
+					loading.Value.Item2, allowVocational);
+			}
 
-		public AirdragData CreateAirdragData(IAirdragDeclarationInputData airdragData, Mission mission, Segment segment)
-		{
-			return _declarationDataAdapterImplementation.CreateAirdragData(airdragData, mission, segment);
-		}
+			public virtual AirdragData CreateAirdragData(IAirdragDeclarationInputData airdragData, Mission mission,
+				Segment segment)
+			{
+				return _airdragDataAdapter.CreateAirdragData(airdragData, mission, segment);
+			}
 
-		public AxleGearData CreateAxleGearData(IAxleGearInputData axlegearData)
-		{
-			return _declarationDataAdapterImplementation.CreateAxleGearData(axlegearData);
-		}
+			public AxleGearData CreateAxleGearData(IAxleGearInputData axlegearData)
+			{
+				return _axleGearDataAdapter.CreateAxleGearData(axlegearData);
+			}
 
-		public AngledriveData CreateAngledriveData(IAngledriveInputData angledriveData)
-		{
-			return _declarationDataAdapterImplementation.CreateAngledriveData(angledriveData);
-		}
+			public virtual AngledriveData CreateAngledriveData(IAngledriveInputData angledriveData)
+			{
+				throw new NotImplementedException();
+			}
 
-		public CombustionEngineData CreateEngineData(IVehicleDeclarationInputData vehicle, IEngineModeDeclarationInputData engineMode,
-			Mission mission)
-		{
-			return _declarationDataAdapterImplementation.CreateEngineData(vehicle, engineMode, mission);
-		}
+			public virtual CombustionEngineData CreateEngineData(IVehicleDeclarationInputData vehicle,
+				IEngineModeDeclarationInputData engineMode,
+				Mission mission)
+			{
+				throw new NotImplementedException();
+			}
 
-		public GearboxData CreateGearboxData(IVehicleDeclarationInputData inputData, VectoRunData runData,
-			IShiftPolygonCalculator shiftPolygonCalc)
-		{
-			return _declarationDataAdapterImplementation.CreateGearboxData(inputData, runData, shiftPolygonCalc);
+			public virtual GearboxData CreateGearboxData(IVehicleDeclarationInputData inputData, VectoRunData runData,
+				IShiftPolygonCalculator shiftPolygonCalc)
+			{
+				throw new NotImplementedException();
+			}
+
+			public abstract ShiftStrategyParameters CreateGearshiftData(GearboxData gbx, double axleRatio,
+				PerSecond engineIdlingSpeed);
+
+			public RetarderData CreateRetarderData(IRetarderInputData retarderData)
+			{
+				return _retarderDataAdapter.CreateRetarderData(retarderData);
+			}
+
+			public PTOData CreatePTOTransmissionData(IPTOTransmissionInputData ptoData)
+			{
+				return _ptoDataAdapter.CreatePTOTransmissionData(ptoData);
+			}
+
+			public abstract IList<VectoRunData.AuxData> CreateAuxiliaryData(IAuxiliariesDeclarationInputData auxData,
+				IBusAuxiliariesDeclarationData busAuxData,
+				MissionType missionType, VehicleClass vehicleClass, Meter vehicleLength, int? numSteeredAxles);
+
+			public AxleGearData CreateDummyAxleGearData(IGearboxDeclarationInputData gbxData)
+			{
+				return _axleGearDataAdapter.CreateDummyAxleGearData(gbxData);
+			}
+
+			#endregion
 		}
 
-		public ShiftStrategyParameters CreateGearshiftData(GearboxData gbx, double axleRatio, PerSecond engineIdlingSpeed)
+		public class Conventional : LorryBase
 		{
-			return _declarationDataAdapterImplementation.CreateGearshiftData(gbx, axleRatio, engineIdlingSpeed);
+			public static readonly GearboxType[] SupportedGearboxTypes =
+				{ GearboxType.MT, GearboxType.AMT, GearboxType.ATPowerSplit, GearboxType.ATSerial };
+
+			private IEngineDataAdapter _engineDataAdapter = new CombustionEngineComponentDataAdapter();
+			private IGearboxDataAdapter _gearboxDataAdapter = new GearboxDataAdapter(new TorqueConverterDataAdapter());
+			private IAngledriveDataAdapter _angleDriveDataAdapter = new AngledriveDataAdapter();
+			private IAuxiliaryDataAdapter _auxAdapter = new HeavyLorryAuxiliaryDataAdapter();
+			public override CombustionEngineData CreateEngineData(
+				IVehicleDeclarationInputData vehicle, IEngineModeDeclarationInputData mode, Mission mission)
+			{
+				return _engineDataAdapter.CreateEngineData(vehicle, mode, mission);
+			}
+
+
+
+			public GearboxData CreateGearboxData(IVehicleDeclarationInputData inputData, VectoRunData runData,
+				IShiftPolygonCalculator shiftPolygonCalc)
+			{
+				return _gearboxDataAdapter.CreateGearboxData(inputData, runData, shiftPolygonCalc, SupportedGearboxTypes);
+			}
+
+			protected virtual TorqueConverterData CreateTorqueConverterData(GearboxType gearboxType,
+				ITorqueConverterDeclarationInputData torqueConverter, double ratio,
+				CombustionEngineData componentsEngineInputData)
+			{
+				return TorqueConverterDataReader.Create(
+					torqueConverter.TCData,
+					DeclarationData.TorqueConverter.ReferenceRPM, DeclarationData.TorqueConverter.MaxInputSpeed,
+					ExecutionMode.Declaration, ratio,
+					DeclarationData.TorqueConverter.CLUpshiftMinAcceleration,
+					DeclarationData.TorqueConverter.CCUpshiftMinAcceleration);
+			}
+
+			#region Overrides of LorryBase
+
+			public override ShiftStrategyParameters CreateGearshiftData(GearboxData gbx, double axleRatio, PerSecond engineIdlingSpeed)
+			{
+				return _gearboxDataAdapter.CreateGearshiftData(gbx, axleRatio, engineIdlingSpeed);
+			}
+
+			#endregion
+
+
+			public override AngledriveData CreateAngledriveData(IAngledriveInputData data)
+			{
+				return _angleDriveDataAdapter.CreateAngledriveData(data, false);
+			}
+
+
+			public override IList<VectoRunData.AuxData> CreateAuxiliaryData(
+				IAuxiliariesDeclarationInputData auxInputData,
+				IBusAuxiliariesDeclarationData busAuxData, MissionType mission, VehicleClass hvdClass,
+				Meter vehicleLength, int? numSteeredAxles)
+			{
+				return _auxAdapter.CreateAuxiliaryData(auxInputData, busAuxData, mission, hvdClass, vehicleLength,
+					numSteeredAxles);
+			}
 		}
 
-		public RetarderData CreateRetarderData(IRetarderInputData retarderData)
+		public abstract class SerialHybrid : LorryBase
 		{
-			return _declarationDataAdapterImplementation.CreateRetarderData(retarderData);
+			#region Overrides of LorryBase
+
+			public override ShiftStrategyParameters CreateGearshiftData(GearboxData gbx, double axleRatio, PerSecond engineIdlingSpeed)
+			{
+				throw new NotImplementedException();
+			}
+
+			public override IList<VectoRunData.AuxData> CreateAuxiliaryData(IAuxiliariesDeclarationInputData auxData, IBusAuxiliariesDeclarationData busAuxData,
+				MissionType missionType, VehicleClass vehicleClass, Meter vehicleLength, int? numSteeredAxles)
+			{
+				throw new NotImplementedException();
+			}
+
+			#endregion
 		}
 
-		public PTOData CreatePTOTransmissionData(IPTOTransmissionInputData ptoData)
+		public abstract class ParallelHybrid : LorryBase
 		{
-			return _declarationDataAdapterImplementation.CreatePTOTransmissionData(ptoData);
+			#region Overrides of LorryBase
+
+			public override ShiftStrategyParameters CreateGearshiftData(GearboxData gbx, double axleRatio, PerSecond engineIdlingSpeed)
+			{
+				throw new NotImplementedException();
+			}
+
+			public override IList<VectoRunData.AuxData> CreateAuxiliaryData(IAuxiliariesDeclarationInputData auxData, IBusAuxiliariesDeclarationData busAuxData,
+				MissionType missionType, VehicleClass vehicleClass, Meter vehicleLength, int? numSteeredAxles)
+			{
+				throw new NotImplementedException();
+			}
+
+			#endregion
 		}
 
-		public IList<VectoRunData.AuxData> CreateAuxiliaryData(IAuxiliariesDeclarationInputData auxData, IBusAuxiliariesDeclarationData busAuxData,
-			MissionType missionType, VehicleClass vehicleClass, Meter vehicleLength, int? numSteeredAxles)
+		public abstract class BatteryElectric : LorryBase
 		{
-			return _declarationDataAdapterImplementation.CreateAuxiliaryData(auxData, busAuxData, missionType, vehicleClass, vehicleLength, numSteeredAxles);
-		}
+			#region Overrides of LorryBase
+
+			public override ShiftStrategyParameters CreateGearshiftData(GearboxData gbx, double axleRatio, PerSecond engineIdlingSpeed)
+			{
+				throw new NotImplementedException();
+			}
 
-		public AxleGearData CreateDummyAxleGearData(IGearboxDeclarationInputData gbxData)
+			public override IList<VectoRunData.AuxData> CreateAuxiliaryData(IAuxiliariesDeclarationInputData auxData, IBusAuxiliariesDeclarationData busAuxData,
+				MissionType missionType, VehicleClass vehicleClass, Meter vehicleLength, int? numSteeredAxles)
+			{
+				throw new NotImplementedException();
+			}
+
+			#endregion
+		}
+		public class HEV_S2 : SerialHybrid { }
+		public class HEV_S3 : SerialHybrid { }
+		public class HEV_S4 : SerialHybrid { }
+		public class HEV_S_IEPC : SerialHybrid { }
+		public class HEV_P1 : ParallelHybrid { }
+		public class HEV_P2 : ParallelHybrid { }
+		public class HEV_P2_5 : ParallelHybrid { }
+		public class HEV_P3 : ParallelHybrid { }
+		public class HEV_P4 : ParallelHybrid { }
+		public class PEV_E2 : BatteryElectric { }
+		public class PEV_E3 : BatteryElectric { }
+		public class PEV_E4 : BatteryElectric { }
+		public class PEV_E_IEPC : BatteryElectric { }
+		public class Exempted : LorryBase
 		{
-			return _declarationDataAdapterImplementation.CreateDummyAxleGearData(gbxData);
+			#region Overrides of LorryBase
+
+			public override VehicleData CreateVehicleData(IVehicleDeclarationInputData vehicle, Segment segment, Mission mission,
+				KeyValuePair<LoadingType, Tuple<Kilogram, double?>> loading, bool allowVocational)
+			{
+				return _vehicleDataAdapter.CreateExemptedVehicleData(vehicle);
+			}
+
+			public override ShiftStrategyParameters CreateGearshiftData(GearboxData gbx, double axleRatio, PerSecond engineIdlingSpeed)
+			{
+				throw new NotImplementedException();
+			}
+
+			public override IList<VectoRunData.AuxData> CreateAuxiliaryData(IAuxiliariesDeclarationInputData auxData, IBusAuxiliariesDeclarationData busAuxData,
+				MissionType missionType, VehicleClass vehicleClass, Meter vehicleLength, int? numSteeredAxles)
+			{
+				throw new NotImplementedException();
+			}
+
+			#endregion
 		}
 
-		#endregion
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
 
 
 	}
-}
+}
\ No newline at end of file
diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/DeclarationDataAdapterHeavyLorry_old.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/DeclarationDataAdapterHeavyLorry_old.cs
new file mode 100644
index 0000000000..b1e4a78062
--- /dev/null
+++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/DeclarationDataAdapterHeavyLorry_old.cs
@@ -0,0 +1,104 @@
+using System;
+using System.Collections.Generic;
+using TUGraz.VectoCommon.InputData;
+using TUGraz.VectoCommon.Models;
+using TUGraz.VectoCommon.Utils;
+using TUGraz.VectoCore.InputData.Reader.ComponentData;
+using TUGraz.VectoCore.Models.Declaration;
+using TUGraz.VectoCore.Models.Simulation.Data;
+using TUGraz.VectoCore.Models.SimulationComponent;
+using TUGraz.VectoCore.Models.SimulationComponent.Data;
+
+namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.HeavyLorry
+{
+
+
+
+	public partial class DeclarationDataAdapterHeavyLorry
+	{
+		[Obsolete("Use DeclarationDataAdapterHeavyLorry.Conventional instead, created automatically with NInject")]
+		public DeclarationDataAdapterHeavyLorry() { }
+
+		private IDeclarationDataAdapter _declarationDataAdapterImplementation = new Conventional();
+		public static readonly GearboxType[] SupportedGearboxTypes = Conventional.SupportedGearboxTypes;
+
+		//public static List<CrossWindCorrectionCurveReader.CrossWindCorrectionEntry> GetDeclarationAirResistanceCurve(
+		//	string parameterSet, SquareMeter si, Meter meter)
+		//{
+		//	//return Conventional.GetDeclarationAirResistanceCurve(parameterSet, si, meter);
+		//}
+
+		#region Implementation of IDeclarationDataAdapter
+
+		public DriverData CreateDriverData()
+		{
+			return _declarationDataAdapterImplementation.CreateDriverData();
+		}
+
+		public VehicleData CreateVehicleData(IVehicleDeclarationInputData vehicle, Segment segment, Mission mission,
+			KeyValuePair<LoadingType, Tuple<Kilogram, double?>> loading, bool allowVocational)
+		{
+			return _declarationDataAdapterImplementation.CreateVehicleData(vehicle, segment, mission, loading,
+				allowVocational);
+		}
+
+		public AirdragData CreateAirdragData(IAirdragDeclarationInputData airdragData, Mission mission, Segment segment)
+		{
+			return _declarationDataAdapterImplementation.CreateAirdragData(airdragData, mission, segment);
+		}
+
+		public AxleGearData CreateAxleGearData(IAxleGearInputData axlegearData)
+		{
+			return _declarationDataAdapterImplementation.CreateAxleGearData(axlegearData);
+		}
+
+		public AngledriveData CreateAngledriveData(IAngledriveInputData angledriveData)
+		{
+			return _declarationDataAdapterImplementation.CreateAngledriveData(angledriveData);
+		}
+
+		public CombustionEngineData CreateEngineData(IVehicleDeclarationInputData vehicle,
+			IEngineModeDeclarationInputData engineMode,
+			Mission mission)
+		{
+			return _declarationDataAdapterImplementation.CreateEngineData(vehicle, engineMode, mission);
+		}
+
+		public GearboxData CreateGearboxData(IVehicleDeclarationInputData inputData, VectoRunData runData,
+			IShiftPolygonCalculator shiftPolygonCalc)
+		{
+			return _declarationDataAdapterImplementation.CreateGearboxData(inputData, runData, shiftPolygonCalc);
+		}
+
+		public ShiftStrategyParameters CreateGearshiftData(GearboxData gbx, double axleRatio,
+			PerSecond engineIdlingSpeed)
+		{
+			return _declarationDataAdapterImplementation.CreateGearshiftData(gbx, axleRatio, engineIdlingSpeed);
+		}
+
+		public RetarderData CreateRetarderData(IRetarderInputData retarderData)
+		{
+			return _declarationDataAdapterImplementation.CreateRetarderData(retarderData);
+		}
+
+		public PTOData CreatePTOTransmissionData(IPTOTransmissionInputData ptoData)
+		{
+			return _declarationDataAdapterImplementation.CreatePTOTransmissionData(ptoData);
+		}
+
+		public IList<VectoRunData.AuxData> CreateAuxiliaryData(IAuxiliariesDeclarationInputData auxData,
+			IBusAuxiliariesDeclarationData busAuxData,
+			MissionType missionType, VehicleClass vehicleClass, Meter vehicleLength, int? numSteeredAxles)
+		{
+			return _declarationDataAdapterImplementation.CreateAuxiliaryData(auxData, busAuxData, missionType,
+				vehicleClass, vehicleLength, numSteeredAxles);
+		}
+
+		public AxleGearData CreateDummyAxleGearData(IGearboxDeclarationInputData gbxData)
+		{
+			return _declarationDataAdapterImplementation.CreateDummyAxleGearData(gbxData);
+		}
+
+		#endregion
+	}
+}
\ No newline at end of file
diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/HEV_P1.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/HEV_P1.cs
deleted file mode 100644
index bef6a10f64..0000000000
--- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/HEV_P1.cs
+++ /dev/null
@@ -1,10 +0,0 @@
-namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.HeavyLorry
-{
-	public partial class DeclarationDataAdapterHeavyLorry
-	{
-		public class HEV_P1 : LorryBase
-		{
-
-		}
-	}
-}
\ No newline at end of file
diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/HEV_P2.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/HEV_P2.cs
deleted file mode 100644
index 648cea5b2c..0000000000
--- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/HEV_P2.cs
+++ /dev/null
@@ -1,11 +0,0 @@
-
-namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.HeavyLorry
-{
-	public partial class DeclarationDataAdapterHeavyLorry
-	{
-		public class HEV_P2 : LorryBase
-		{
-
-		}
-	}
-}
\ No newline at end of file
diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/HEV_P2_5.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/HEV_P2_5.cs
deleted file mode 100644
index da14951413..0000000000
--- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/HEV_P2_5.cs
+++ /dev/null
@@ -1,12 +0,0 @@
-
-namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.HeavyLorry
-{
-	public partial class DeclarationDataAdapterHeavyLorry
-	{
-		public class HEV_P2_5 : LorryBase
-		{
-
-		}
-
-	}
-}
\ No newline at end of file
diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/HEV_P3.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/HEV_P3.cs
deleted file mode 100644
index 331c5372f5..0000000000
--- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/HEV_P3.cs
+++ /dev/null
@@ -1,12 +0,0 @@
-
-namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.HeavyLorry
-{
-	public partial class DeclarationDataAdapterHeavyLorry
-	{
-		public class HEV_P3 : LorryBase
-		{
-
-		}
-
-	}
-}
\ No newline at end of file
diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/HEV_P4.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/HEV_P4.cs
deleted file mode 100644
index 99a743928b..0000000000
--- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/HEV_P4.cs
+++ /dev/null
@@ -1,12 +0,0 @@
-
-namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.HeavyLorry
-{
-	public partial class DeclarationDataAdapterHeavyLorry
-	{
-		public class HEV_P4 : LorryBase
-		{
-
-		}
-
-	}
-}
\ No newline at end of file
diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/HEV_S3.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/HEV_S3.cs
deleted file mode 100644
index 383233462f..0000000000
--- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/HEV_S3.cs
+++ /dev/null
@@ -1,10 +0,0 @@
-namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.HeavyLorry
-{
-    public partial class DeclarationDataAdapterHeavyLorry
-    {
-		public class HEV_S3 : LorryBase
-		{
-
-		}
-    }
-}
diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/HEV_S4.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/HEV_S4.cs
deleted file mode 100644
index 48deec22b0..0000000000
--- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/HEV_S4.cs
+++ /dev/null
@@ -1,10 +0,0 @@
-namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.HeavyLorry
-{
-    public partial class DeclarationDataAdapterHeavyLorry
-    {
-		public class HEV_S4 : LorryBase
-		{
-
-		}
-    }
-}
diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/HeavyLorryDeclarationDataAdapter.cd b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/HeavyLorryDeclarationDataAdapter.cd
new file mode 100644
index 0000000000..7b894197b9
--- /dev/null
+++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/HeavyLorryDeclarationDataAdapter.cd
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8"?>
+<ClassDiagram /> 
\ No newline at end of file
diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/LorryBase.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/LorryBase.cs
deleted file mode 100644
index e573fd19bd..0000000000
--- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/LorryBase.cs
+++ /dev/null
@@ -1,94 +0,0 @@
-using System;
-using System.Collections.Generic;
-using TUGraz.VectoCommon.InputData;
-using TUGraz.VectoCommon.Models;
-using TUGraz.VectoCommon.Utils;
-using TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponents;
-using TUGraz.VectoCore.Models.Declaration;
-using TUGraz.VectoCore.Models.Simulation.Data;
-using TUGraz.VectoCore.Models.SimulationComponent;
-using TUGraz.VectoCore.Models.SimulationComponent.Data;
-
-namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.HeavyLorry
-{
-	public partial class DeclarationDataAdapterHeavyLorry
-	{
-		public abstract class LorryBase : AbstractSimulationDataAdapter, IDeclarationDataAdapter
-		{
-			#region Implementation of IDeclarationDataAdapter
-
-			private readonly IDriverDataAdapter _driverDataAdapter = new LorryDriverDataAdapter();
-
-			public DriverData CreateDriverData()
-			{
-				return _driverDataAdapter.CreateDriverData();
-			}
-
-			public virtual VehicleData CreateVehicleData(IVehicleDeclarationInputData vehicle, Segment segment,
-				Mission mission,
-				KeyValuePair<LoadingType, Tuple<Kilogram, double?>> loading, bool allowVocational)
-			{
-				throw new NotImplementedException();
-			}
-
-			public virtual AirdragData CreateAirdragData(IAirdragDeclarationInputData airdragData, Mission mission,
-				Segment segment)
-			{
-				throw new NotImplementedException();
-			}
-
-			public virtual AxleGearData CreateAxleGearData(IAxleGearInputData axlegearData)
-			{
-				throw new NotImplementedException();
-			}
-
-			public virtual AngledriveData CreateAngledriveData(IAngledriveInputData angledriveData)
-			{
-				throw new NotImplementedException();
-			}
-
-			public virtual CombustionEngineData CreateEngineData(IVehicleDeclarationInputData vehicle,
-				IEngineModeDeclarationInputData engineMode,
-				Mission mission)
-			{
-				throw new NotImplementedException();
-			}
-
-			public virtual GearboxData CreateGearboxData(IVehicleDeclarationInputData inputData, VectoRunData runData,
-				IShiftPolygonCalculator shiftPolygonCalc)
-			{
-				throw new NotImplementedException();
-			}
-
-			public virtual ShiftStrategyParameters CreateGearshiftData(GearboxData gbx, double axleRatio,
-				PerSecond engineIdlingSpeed)
-			{
-				throw new NotImplementedException();
-			}
-
-			public virtual RetarderData CreateRetarderData(IRetarderInputData retarderData)
-			{
-				throw new NotImplementedException();
-			}
-
-			public virtual PTOData CreatePTOTransmissionData(IPTOTransmissionInputData ptoData)
-			{
-				throw new NotImplementedException();
-			}
-
-			public virtual IList<VectoRunData.AuxData> CreateAuxiliaryData(IAuxiliariesDeclarationInputData auxData,
-				IBusAuxiliariesDeclarationData busAuxData,
-				MissionType missionType, VehicleClass vehicleClass, Meter vehicleLength, int? numSteeredAxles)
-			{
-				throw new NotImplementedException();
-			}
-
-			public virtual AxleGearData CreateDummyAxleGearData(IGearboxDeclarationInputData gbxData)
-			{
-				throw new NotImplementedException();
-			}
-
-			#endregion
-		}
-	}
-}
\ No newline at end of file
diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/PEV_E2.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/PEV_E2.cs
deleted file mode 100644
index eeb02207a9..0000000000
--- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/PEV_E2.cs
+++ /dev/null
@@ -1,11 +0,0 @@
-
-namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.HeavyLorry
-{
-	public partial class DeclarationDataAdapterHeavyLorry
-	{
-		public class PEV_E2 : LorryBase
-		{
-
-		}
-	}
-}
\ No newline at end of file
diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/PEV_E3.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/PEV_E3.cs
deleted file mode 100644
index ebcf0d47e6..0000000000
--- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/PEV_E3.cs
+++ /dev/null
@@ -1,11 +0,0 @@
-
-namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.HeavyLorry
-{
-	public partial class DeclarationDataAdapterHeavyLorry
-	{
-		public class PEV_E3 : LorryBase
-		{
-
-		}
-	}
-}
\ No newline at end of file
diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/PEV_E4.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/PEV_E4.cs
deleted file mode 100644
index 54254768d6..0000000000
--- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/PEV_E4.cs
+++ /dev/null
@@ -1,11 +0,0 @@
-
-namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.HeavyLorry
-{
-	public partial class DeclarationDataAdapterHeavyLorry
-	{
-		public class PEV_E4 : LorryBase
-		{
-
-		}
-	}
-}
\ No newline at end of file
diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/PEV_E_IEPC.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/PEV_E_IEPC.cs
deleted file mode 100644
index ba61ea4702..0000000000
--- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/PEV_E_IEPC.cs
+++ /dev/null
@@ -1,11 +0,0 @@
-
-namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.HeavyLorry
-{
-	public partial class DeclarationDataAdapterHeavyLorry
-	{
-		public class PEV_E_IEPC : LorryBase
-		{
-
-		}
-	}
-}
\ No newline at end of file
diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/SerialHybrid.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/SerialHybrid.cs
deleted file mode 100644
index 4881c93911..0000000000
--- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/SerialHybrid.cs
+++ /dev/null
@@ -1,26 +0,0 @@
-using System;
-using System.Collections.Generic;
-using TUGraz.VectoCommon.InputData;
-using TUGraz.VectoCommon.Models;
-using TUGraz.VectoCommon.Utils;
-using TUGraz.VectoCore.Models.Declaration;
-using TUGraz.VectoCore.Models.Simulation.Data;
-using TUGraz.VectoCore.Models.SimulationComponent;
-using TUGraz.VectoCore.Models.SimulationComponent.Data;
-
-namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.HeavyLorry
-{
-	public partial class DeclarationDataAdapterHeavyLorry
-	{
-		public abstract class SerialHybrid : LorryBase { }
-
-		public class HEV_S2 : SerialHybrid
-		{
-		}
-
-
-		public class HEV_S_IEPC : SerialHybrid
-		{
-		}
-    }
-}
\ No newline at end of file
diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/IDeclarationDataAdapter.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/IDeclarationDataAdapter.cs
index 646604ee60..ebd1f99eae 100644
--- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/IDeclarationDataAdapter.cs
+++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/IDeclarationDataAdapter.cs
@@ -1,5 +1,6 @@
 using System;
 using System.Collections.Generic;
+using TUGraz.VectoCommon.BusAuxiliaries;
 using TUGraz.VectoCommon.InputData;
 using TUGraz.VectoCommon.Models;
 using TUGraz.VectoCommon.Utils;
@@ -27,12 +28,18 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter {
 		AxleGearData CreateDummyAxleGearData(IGearboxDeclarationInputData gbxData);
 	}
 
-	public interface IGenericCompletedBusDataAdapter : IDeclarationDataAdapter
+	public interface IPrimaryBusDeclarationDataAdapter : IDeclarationDataAdapter
+	{
+		IAuxiliaryConfig CreateBusAuxiliariesData(
+			Mission mission, IVehicleDeclarationInputData vehicleData, VectoRunData runData);
+	}
+
+	public interface IGenericCompletedBusDataAdapter : IPrimaryBusDeclarationDataAdapter
 	{
 
 	}
 
-	public interface ISpecificCompletedBusDataAdapter : IDeclarationDataAdapter
+	public interface ISpecificCompletedBusDataAdapter : IPrimaryBusDeclarationDataAdapter
 	{
 
 	}
diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/PrimaryBus/DeclarationDataAdapterPrimaryBus.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/PrimaryBus/DeclarationDataAdapterPrimaryBus.cs
index d709fc41b2..ce4e0f499c 100644
--- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/PrimaryBus/DeclarationDataAdapterPrimaryBus.cs
+++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/PrimaryBus/DeclarationDataAdapterPrimaryBus.cs
@@ -34,6 +34,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.PrimaryBus
 
 		public override VehicleData CreateVehicleData(IVehicleDeclarationInputData data, Segment segment, Mission mission, KeyValuePair<LoadingType, Tuple<Kilogram, double?>> loading, bool allowVocational)
 		{
+			
 			var retVal = base.CreateVehicleData(data, segment, mission, loading, allowVocational);
 			if (data.ExemptedVehicle) {
 				return retVal;
@@ -43,38 +44,6 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.PrimaryBus
 			return retVal;
 		}
 
-		protected override VehicleData CreateExemptedVehicleData(IVehicleDeclarationInputData data)
-		{
-			var exempted = new VehicleData {
-				InputData = data,
-				SavedInDeclarationMode = data.SavedInDeclarationMode,
-				Manufacturer = data.Manufacturer,
-				ModelName = data.Model,
-				Date = data.Date,
-				//CertificationNumber = data.CertificationNumber,
-				DigestValueInput = data.DigestValue != null ? data.DigestValue.DigestValue : "",
-				VehicleCategory = data.VehicleCategory,
-				//CurbMass = data.CurbMassChassis,
-				GrossVehicleMass = data.GrossVehicleMassRating,
-				AirDensity = Physics.AirDensity,
-			};
-			exempted.VIN = data.VIN;
-			exempted.ManufacturerAddress = data.ManufacturerAddress;
-			exempted.LegislativeClass = data.LegislativeClass;
-			exempted.ZeroEmissionVehicle = data.ZeroEmissionVehicle;
-			exempted.HybridElectricHDV = data.HybridElectricHDV;
-			exempted.DualFuelVehicle = data.DualFuelVehicle;
-			exempted.MaxNetPower1 = data.MaxNetPower1;
-			exempted.MaxNetPower2 = data.MaxNetPower2;
-			exempted.AxleConfiguration = data.AxleConfiguration;
-			return exempted;
-		}
-
-		public override PTOData CreatePTOTransmissionData(IPTOTransmissionInputData pto)
-		{
-			return null;
-		}
-
 		public override IList<VectoRunData.AuxData> CreateAuxiliaryData(
 			IAuxiliariesDeclarationInputData auxInputData, IBusAuxiliariesDeclarationData busAuxData, MissionType mission,
 			VehicleClass hdvClass, Meter vehicleLength, int? numSteeredAxles)
@@ -170,7 +139,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.PrimaryBus
 			return  DeclarationData.BusAuxiliaries.AlternatorTechnologies.Lookup("default");
 		}
 
-		protected virtual Dictionary<string, ElectricConsumerEntry> GetElectricConsumers(Mission mission, IVehicleDeclarationInputData vehicleData, IActuations actuations, VehicleClass vehicleClass)
+		protected virtual Dictionary<string, AuxiliaryDataAdapter.ElectricConsumerEntry> GetElectricConsumers(Mission mission, IVehicleDeclarationInputData vehicleData, IActuations actuations, VehicleClass vehicleClass)
 		{
 			var retVal = GetDefaultElectricConsumers(mission, vehicleData, actuations);
 
@@ -181,10 +150,10 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.PrimaryBus
 			return retVal;
 		}
 
-		protected virtual Dictionary<string, ElectricConsumerEntry> GetDefaultElectricConsumers(
+		protected virtual Dictionary<string, AuxiliaryDataAdapter.ElectricConsumerEntry> GetDefaultElectricConsumers(
 			Mission mission, IVehicleDeclarationInputData vehicleData, IActuations actuations)
 		{
-			var retVal = new Dictionary<string, ElectricConsumerEntry>();
+			var retVal = new Dictionary<string, AuxiliaryDataAdapter.ElectricConsumerEntry>();
 			var doorDutyCycleFraction =
 				(actuations.ParkBrakeAndDoors * Constants.BusAuxiliaries.ElectricalConsumers.DoorActuationTimeSecond) /
 				actuations.CycleTime;
@@ -211,7 +180,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.PrimaryBus
 					current = 0.SI<Ampere>();
 				}
 
-				retVal[consumer.ConsumerName] = new ElectricConsumerEntry {
+				retVal[consumer.ConsumerName] = new AuxiliaryDataAdapter.ElectricConsumerEntry {
 					BaseVehicle = consumer.BaseVehicle,
 					Current = current
 				};
@@ -244,13 +213,13 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.PrimaryBus
 			return mission.BusParameter.ElectricalConsumers.GetVECTOValueOrDefault(consumer.ConsumerName, 0);
 		}
 
-		protected virtual Dictionary<string, ElectricConsumerEntry> GetElectricAuxConsumers(Mission mission, IVehicleDeclarationInputData vehicleData, VehicleClass vehicleClass, IBusAuxiliariesDeclarationData busAux)
+		protected virtual Dictionary<string, AuxiliaryDataAdapter.ElectricConsumerEntry> GetElectricAuxConsumers(Mission mission, IVehicleDeclarationInputData vehicleData, VehicleClass vehicleClass, IBusAuxiliariesDeclarationData busAux)
 		{
-			var retVal = new Dictionary<string, ElectricConsumerEntry>();
+			var retVal = new Dictionary<string, AuxiliaryDataAdapter.ElectricConsumerEntry>();
 			var spPower = DeclarationData.SteeringPumpBus.LookupElectricalPowerDemand(
 				mission.MissionType, busAux.SteeringPumpTechnology,
 				vehicleData.Length ?? mission.BusParameter.VehicleLength);
-			retVal[Constants.Auxiliaries.IDs.SteeringPump] = new ElectricConsumerEntry {
+			retVal[Constants.Auxiliaries.IDs.SteeringPump] = new AuxiliaryDataAdapter.ElectricConsumerEntry {
 				ActiveDuringEngineStopStandstill = false,
 				BaseVehicle = false,
 				Current = spPower / Constants.BusAuxiliaries.ElectricSystem.PowernetVoltage
@@ -258,7 +227,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.PrimaryBus
 
 			var fanPower = DeclarationData.Fan.LookupElectricalPowerDemand(
 				vehicleClass, mission.MissionType, busAux.FanTechnology);
-			retVal[Constants.Auxiliaries.IDs.Fan] = new ElectricConsumerEntry {
+			retVal[Constants.Auxiliaries.IDs.Fan] = new AuxiliaryDataAdapter.ElectricConsumerEntry {
 				ActiveDuringEngineStopStandstill = false,
 				ActiveDuringEngineStopDriving = false,
 				BaseVehicle = false,
@@ -480,20 +449,27 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.PrimaryBus
 		}
 
 
-		public abstract class PrimaryBusBase : IDeclarationDataAdapter
+		public abstract class PrimaryBusBase : IPrimaryBusDeclarationDataAdapter
 		{
 			#region Implementation of IDeclarationDataAdapter
 
 			private readonly IDriverDataAdapter _driverDataAdapter = new PrimaryBusDriverDataAdapter();
+			protected readonly IVehicleDataAdapter _vehicleDataAdapter = new PrimaryBusVehicleDataAdapter();
+			protected readonly IAxleGearDataAdapter _axleGearDataAdapter = new AxleGearDataAdapterBase();
+			protected readonly IPTODataAdapter _ptoDataAdapter = new PTODataAdapterBus();
+			protected readonly IAuxiliaryDataAdapter _auxDataAdapter = new PrimaryBusAuxiliaryDataAdapter();
+			protected readonly IRetarderDataAdapter _retarderDataAdapter = new RetarderDataAdapter();
+
 			public DriverData CreateDriverData()
 			{
 				return _driverDataAdapter.CreateDriverData();
 			}
 
-			public VehicleData CreateVehicleData(IVehicleDeclarationInputData vehicle, Segment segment, Mission mission,
+			public virtual VehicleData CreateVehicleData(IVehicleDeclarationInputData vehicle, Segment segment, Mission mission,
 				KeyValuePair<LoadingType, Tuple<Kilogram, double?>> loading, bool allowVocational)
 			{
-				throw new NotImplementedException();
+				return _vehicleDataAdapter.CreateVehicleData(vehicle, segment, mission, loading.Value.Item1,
+					loading.Value.Item2, allowVocational);
 			}
 
 			public AirdragData CreateAirdragData(IAirdragDeclarationInputData airdragData, Mission mission, Segment segment)
@@ -503,7 +479,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.PrimaryBus
 
 			public AxleGearData CreateAxleGearData(IAxleGearInputData axlegearData)
 			{
-				throw new NotImplementedException();
+				return _axleGearDataAdapter.CreateAxleGearData(axlegearData);
 			}
 
 			public AngledriveData CreateAngledriveData(IAngledriveInputData angledriveData)
@@ -511,37 +487,38 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.PrimaryBus
 				throw new NotImplementedException();
 			}
 
-			public CombustionEngineData CreateEngineData(IVehicleDeclarationInputData vehicle, IEngineModeDeclarationInputData engineMode,
+			public virtual CombustionEngineData CreateEngineData(IVehicleDeclarationInputData vehicle, IEngineModeDeclarationInputData engineMode,
 				Mission mission)
 			{
 				throw new NotImplementedException();
 			}
 
-			public GearboxData CreateGearboxData(IVehicleDeclarationInputData inputData, VectoRunData runData,
+			public virtual GearboxData CreateGearboxData(IVehicleDeclarationInputData inputData, VectoRunData runData,
 				IShiftPolygonCalculator shiftPolygonCalc)
 			{
 				throw new NotImplementedException();
 			}
 
-			public ShiftStrategyParameters CreateGearshiftData(GearboxData gbx, double axleRatio, PerSecond engineIdlingSpeed)
+			public virtual ShiftStrategyParameters CreateGearshiftData(GearboxData gbx, double axleRatio, PerSecond engineIdlingSpeed)
 			{
 				throw new NotImplementedException();
 			}
 
 			public RetarderData CreateRetarderData(IRetarderInputData retarderData)
 			{
-				throw new NotImplementedException();
+				return _retarderDataAdapter.CreateRetarderData(retarderData);
 			}
 
 			public PTOData CreatePTOTransmissionData(IPTOTransmissionInputData ptoData)
 			{
-				throw new NotImplementedException();
+				return _ptoDataAdapter.CreatePTOTransmissionData(ptoData);
 			}
 
 			public IList<VectoRunData.AuxData> CreateAuxiliaryData(IAuxiliariesDeclarationInputData auxData, IBusAuxiliariesDeclarationData busAuxData,
 				MissionType missionType, VehicleClass vehicleClass, Meter vehicleLength, int? numSteeredAxles)
 			{
-				throw new NotImplementedException();
+				return _auxDataAdapter.CreateAuxiliaryData(auxData, busAuxData, missionType, vehicleClass, vehicleLength,
+					numSteeredAxles);
 			}
 
 			public AxleGearData CreateDummyAxleGearData(IGearboxDeclarationInputData gbxData)
@@ -549,12 +526,40 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.PrimaryBus
 				throw new NotImplementedException();
 			}
 
+			public IAuxiliaryConfig CreateBusAuxiliariesData(Mission mission, IVehicleDeclarationInputData vehicleData,
+				VectoRunData runData)
+			{
+				return _auxDataAdapter.CreateBusAuxiliariesData(mission, vehicleData, runData);
+			}
+
 			#endregion
 		}
 
 		public class Conventional : PrimaryBusBase
 		{
+			protected IEngineDataAdapter _engineDataAdapter = new CombustionEngineComponentDataAdapter();
+			protected IGearboxDataAdapter _gearboxDataAdapter =
+				new GearboxDataAdapter(new TorqueConverterDataAdapter());
+			#region Overrides of PrimaryBusBase
 
+			public override CombustionEngineData CreateEngineData(IVehicleDeclarationInputData vehicle, IEngineModeDeclarationInputData engineMode,
+				Mission mission)
+			{
+				return _engineDataAdapter.CreateEngineData(vehicle, engineMode, mission);
+			}
+
+			public override GearboxData CreateGearboxData(IVehicleDeclarationInputData inputData, VectoRunData runData,
+				IShiftPolygonCalculator shiftPolygonCalc)
+			{
+				return _gearboxDataAdapter.CreateGearboxData(inputData, runData, shiftPolygonCalc, SupportedGearboxTypes);
+			}
+
+			public override ShiftStrategyParameters CreateGearshiftData(GearboxData gbx, double axleRatio, PerSecond engineIdlingSpeed)
+			{
+				return _gearboxDataAdapter.CreateGearshiftData(gbx, axleRatio, engineIdlingSpeed);
+			}
+
+			#endregion
 		}
 
 		public class HEV_S2 : PrimaryBusBase
@@ -627,23 +632,31 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.PrimaryBus
 
 		public class Exempted : PrimaryBusBase
 		{
+			#region Overrides of PrimaryBusBase
+
+			public override VehicleData CreateVehicleData(IVehicleDeclarationInputData vehicle, Segment segment, Mission mission,
+				KeyValuePair<LoadingType, Tuple<Kilogram, double?>> loading, bool allowVocational)
+			{
+				return _vehicleDataAdapter.CreateExemptedVehicleData(vehicle);
+			}
 
+			#endregion
 		}
     }
 
-	public class ElectricConsumerEntry {
+	//public class ElectricConsumerEntry {
 
-		public ElectricConsumerEntry()
-		{
-			ActiveDuringEngineStopStandstill = true;
-			ActiveDuringEngineStopDriving = true;
-		}
+	//	public ElectricConsumerEntry()
+	//	{
+	//		ActiveDuringEngineStopStandstill = true;
+	//		ActiveDuringEngineStopDriving = true;
+	//	}
 
-		public bool ActiveDuringEngineStopDriving { get; set; }
+	//	public bool ActiveDuringEngineStopDriving { get; set; }
 
-		public bool ActiveDuringEngineStopStandstill { get; set; }
+	//	public bool ActiveDuringEngineStopStandstill { get; set; }
 
-		public bool BaseVehicle { get; set; }
-		public Ampere Current { get; set; }
-	}
+	//	public bool BaseVehicle { get; set; }
+	//	public Ampere Current { get; set; }
+	//}
 }
diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/ADASDataAdapter.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/ADASDataAdapter.cs
new file mode 100644
index 0000000000..330e260c79
--- /dev/null
+++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/ADASDataAdapter.cs
@@ -0,0 +1,24 @@
+using TUGraz.VectoCommon.InputData;
+using TUGraz.VectoCore.Models.SimulationComponent.Data;
+
+namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponents
+{
+	public interface IADASDataAdapter
+	{
+		VehicleData.ADASData CreateADAS(IAdvancedDriverAssistantSystemDeclarationInputData adas);
+	}
+	public class ADASDataAdapter : IADASDataAdapter
+	{
+
+		public VehicleData.ADASData CreateADAS(IAdvancedDriverAssistantSystemDeclarationInputData adas)
+		{
+			return new VehicleData.ADASData
+			{
+				EngineStopStart = adas.EngineStopStart,
+				EcoRoll = adas.EcoRoll,
+				PredictiveCruiseControl = adas.PredictiveCruiseControl,
+				InputData = adas
+			};
+		}
+	}
+}
\ No newline at end of file
diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/AirdragDataAdapter.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/AirdragDataAdapter.cs
new file mode 100644
index 0000000000..479d1fdc11
--- /dev/null
+++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/AirdragDataAdapter.cs
@@ -0,0 +1,156 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using TUGraz.VectoCommon.InputData;
+using TUGraz.VectoCommon.Models;
+using TUGraz.VectoCommon.Utils;
+using TUGraz.VectoCore.Configuration;
+using TUGraz.VectoCore.InputData.Reader.ComponentData;
+using TUGraz.VectoCore.Models.Declaration;
+using TUGraz.VectoCore.Models.SimulationComponent.Data;
+using TUGraz.VectoCore.Utils;
+
+namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponents
+{
+	internal interface IAirdragDataAdapter
+	{
+		AirdragData CreateAirdragData(
+			IAirdragDeclarationInputData airdragInputData, Mission mission,
+			Segment segment);
+	}
+
+	internal class AirdragDataAdapter : IAirdragDataAdapter
+	{
+		public List<CrossWindCorrectionCurveReader.CrossWindCorrectionEntry>
+	GetDeclarationAirResistanceCurve(
+		string crosswindCorrectionParameters, SquareMeter aerodynamicDragAera, Meter vehicleHeight)
+		{
+			var startSpeed = Constants.SimulationSettings.CrosswindCorrection.MinVehicleSpeed;
+			var maxSpeed = Constants.SimulationSettings.CrosswindCorrection.MaxVehicleSpeed;
+			var speedStep = Constants.SimulationSettings.CrosswindCorrection.VehicleSpeedStep;
+
+			var maxAlpha = Constants.SimulationSettings.CrosswindCorrection.MaxAlpha;
+			var alphaStep = Constants.SimulationSettings.CrosswindCorrection.AlphaStep;
+
+			var startHeightPercent = Constants.SimulationSettings.CrosswindCorrection.MinHeight;
+			var maxHeightPercent = Constants.SimulationSettings.CrosswindCorrection.MaxHeight;
+			var heightPercentStep = Constants.SimulationSettings.CrosswindCorrection.HeightStep;
+			var heightShare = (double)heightPercentStep / maxHeightPercent;
+
+			var values = DeclarationData.AirDrag.Lookup(crosswindCorrectionParameters);
+
+			// first entry (0m/s) will get CdxA of second entry.
+			var points = new List<CrossWindCorrectionCurveReader.CrossWindCorrectionEntry> {
+					new CrossWindCorrectionCurveReader.CrossWindCorrectionEntry {
+						Velocity = 0.SI<MeterPerSecond>(),
+						EffectiveCrossSectionArea = 0.SI<SquareMeter>()
+					}
+				};
+
+			for (var speed = startSpeed; speed <= maxSpeed; speed += speedStep)
+			{
+				var vVeh = speed.KMPHtoMeterPerSecond();
+
+				var cdASum = 0.SI<SquareMeter>();
+
+				for (var heightPercent = startHeightPercent;
+					heightPercent < maxHeightPercent;
+					heightPercent += heightPercentStep)
+				{
+					var height = heightPercent / 100.0 * vehicleHeight;
+					var vWind = Physics.BaseWindSpeed *
+								Math.Pow(height / Physics.BaseWindHeight, Physics.HellmannExponent);
+
+					for (var alpha = 0; alpha <= maxAlpha; alpha += alphaStep)
+					{
+						var vAirX = vVeh + vWind * Math.Cos(alpha.ToRadian());
+						var vAirY = vWind * Math.Sin(alpha.ToRadian());
+
+						var beta = Math.Atan(vAirY / vAirX).ToDegree();
+
+						// ΔCdxA = A1β + A2β² + A3β³
+						var deltaCdA = values.A1 * beta + values.A2 * beta * beta + values.A3 * beta * beta * beta;
+
+						// CdxA(β) = CdxA(0) + ΔCdxA(β)
+						var cdA = aerodynamicDragAera + deltaCdA;
+
+						var share = (alpha == 0 || alpha == maxAlpha ? alphaStep / 2.0 : alphaStep) / maxAlpha;
+
+						// v_air = sqrt(v_airX²+vAirY²)
+						// cdASum = CdxA(β) * v_air²/v_veh²
+						cdASum += heightShare * share * cdA * (vAirX * vAirX + vAirY * vAirY) / (vVeh * vVeh);
+					}
+				}
+
+				points.Add(
+					new CrossWindCorrectionCurveReader.CrossWindCorrectionEntry
+					{
+						Velocity = vVeh,
+						EffectiveCrossSectionArea = cdASum
+					});
+			}
+
+			points[0].EffectiveCrossSectionArea = points[1].EffectiveCrossSectionArea;
+			return points;
+		}
+		protected virtual AirdragData DefaultAirdragData(Mission mission)
+		{
+			var aerodynamicDragArea = mission.DefaultCDxA + mission.Trailer.Sum(t => t.DeltaCdA).DefaultIfNull(0);
+
+			return new AirdragData()
+			{
+				CertificationMethod = CertificationMethod.StandardValues,
+				CrossWindCorrectionMode = CrossWindCorrectionMode.DeclarationModeCorrection,
+				DeclaredAirdragArea = mission.DefaultCDxA,
+				CrossWindCorrectionCurve = new CrosswindCorrectionCdxALookup(
+					aerodynamicDragArea,
+					GetDeclarationAirResistanceCurve(
+						mission.CrossWindCorrectionParameters, aerodynamicDragArea, mission.VehicleHeight),
+					CrossWindCorrectionMode.DeclarationModeCorrection)
+			};
+		}
+		internal AirdragData SetCommonAirdragData(IAirdragDeclarationInputData data)
+		{
+			var retVal = new AirdragData() {
+				SavedInDeclarationMode = data.SavedInDeclarationMode,
+				Manufacturer = data.Manufacturer,
+				ModelName = data.Model,
+				Date = data.Date,
+				CertificationMethod = data.CertificationMethod,
+				CertificationNumber = data.CertificationNumber,
+				DigestValueInput = data.DigestValue != null ? data.DigestValue.DigestValue : "",
+			};
+			return retVal;
+		}
+
+		public AirdragData CreateAirdragData(
+			IAirdragDeclarationInputData airdragInputData, Mission mission,
+			Segment segment)
+		{
+			if (airdragInputData == null || airdragInputData.AirDragArea == null)
+			{
+				return DefaultAirdragData(mission);
+			}
+
+			var retVal = SetCommonAirdragData(airdragInputData);
+			retVal.CrossWindCorrectionMode = CrossWindCorrectionMode.DeclarationModeCorrection;
+			retVal.DeclaredAirdragArea = mission.MissionType == MissionType.Construction
+				? mission.DefaultCDxA
+				: airdragInputData.AirDragArea;
+
+			var aerodynamicDragArea =
+				retVal.DeclaredAirdragArea + mission.Trailer.Sum(t => t.DeltaCdA).DefaultIfNull(0);
+
+			retVal.CrossWindCorrectionCurve =
+				new CrosswindCorrectionCdxALookup(
+					aerodynamicDragArea,
+					GetDeclarationAirResistanceCurve(
+						mission.CrossWindCorrectionParameters, aerodynamicDragArea, mission.VehicleHeight),
+					CrossWindCorrectionMode.DeclarationModeCorrection);
+			return retVal;
+		}
+
+	}
+}
diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/AngledriveDataAdapter.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/AngledriveDataAdapter.cs
new file mode 100644
index 0000000000..f748c6cbe9
--- /dev/null
+++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/AngledriveDataAdapter.cs
@@ -0,0 +1,78 @@
+using System;
+using NLog.Fluent;
+using TUGraz.VectoCommon.Exceptions;
+using TUGraz.VectoCommon.InputData;
+using TUGraz.VectoCommon.Models;
+using TUGraz.VectoCore.InputData.Reader.ComponentData;
+using TUGraz.VectoCore.Models.GenericModelData;
+using TUGraz.VectoCore.Models.SimulationComponent.Data;
+using TUGraz.VectoCore.Models.SimulationComponent.Data.Gearbox;
+
+namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponents
+{
+	public interface IAngledriveDataAdapter
+	{
+		AngledriveData CreateAngledriveData(IAngledriveInputData data, bool useEfficiencyFallback);
+	}
+
+	public class AngledriveDataAdapter : IAngledriveDataAdapter
+	{
+		public AngledriveData CreateAngledriveData(IAngledriveInputData data, bool useEfficiencyFallback)
+		{
+			try {
+				var type = data?.Type ?? AngledriveType.None;
+
+				switch (type) {
+					case AngledriveType.LossesIncludedInGearbox:
+					case AngledriveType.None:
+						return null;
+					case AngledriveType.SeparateAngledrive:
+						var angledriveData = new AngledriveData {
+							InputData = data,
+							SavedInDeclarationMode = data.SavedInDeclarationMode,
+							Manufacturer = data.Manufacturer,
+							ModelName = data.Model,
+							Date = data.Date,
+							CertificationMethod = data.CertificationMethod,
+							CertificationNumber = data.CertificationNumber,
+							DigestValueInput = data.DigestValue != null ? data.DigestValue.DigestValue : "",
+							Type = type,
+							Angledrive = new TransmissionData { Ratio = data.Ratio }
+						};
+						try {
+							angledriveData.Angledrive.LossMap = TransmissionLossMapReader.Create(data.LossMap,
+								data.Ratio, "Angledrive", true);
+						} catch (VectoException ex) {
+							Log.Info("Angledrive Loss Map not found.");
+							if (useEfficiencyFallback) {
+								Log.Info("Angledrive Trying with Efficiency instead of Loss Map.");
+								angledriveData.Angledrive.LossMap = TransmissionLossMapReader.Create(data.Efficiency,
+									data.Ratio, "Angledrive");
+							} else {
+								throw new VectoException("Angledrive: LossMap not found.", ex);
+							}
+						}
+
+						return angledriveData;
+					default:
+						throw new ArgumentOutOfRangeException(nameof(data), "Unknown Angledrive Type.");
+				}
+			} catch (Exception e) {
+				throw new VectoException("Error while reading Angledrive data: {0}", e.Message, e);
+			}
+		}
+	}
+
+	public class GenericAngledriveDataAdapter : IAngledriveDataAdapter
+	{
+		private readonly GenericTransmissionComponentData _genericPowertrainData = new GenericTransmissionComponentData();
+		#region Implementation of IAngledriveDataAdapter
+
+		public AngledriveData CreateAngledriveData(IAngledriveInputData data, bool useEfficiencyFallback)
+		{
+			return _genericPowertrainData.CreateGenericBusAngledriveData(data);
+		}
+
+		#endregion
+	}
+}
\ No newline at end of file
diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/AuxiliaryDataAdapter.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/AuxiliaryDataAdapter.cs
new file mode 100644
index 0000000000..8efb4c058f
--- /dev/null
+++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/AuxiliaryDataAdapter.cs
@@ -0,0 +1,565 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using TUGraz.VectoCommon.BusAuxiliaries;
+using TUGraz.VectoCommon.Exceptions;
+using TUGraz.VectoCommon.InputData;
+using TUGraz.VectoCommon.Models;
+using TUGraz.VectoCommon.Utils;
+using TUGraz.VectoCore.Configuration;
+using TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.PrimaryBus;
+using TUGraz.VectoCore.Models.BusAuxiliaries;
+using TUGraz.VectoCore.Models.BusAuxiliaries.DownstreamModules.Impl.Electrics;
+using TUGraz.VectoCore.Models.BusAuxiliaries.DownstreamModules.Impl.HVAC;
+using TUGraz.VectoCore.Models.BusAuxiliaries.DownstreamModules.Impl.Pneumatics;
+using TUGraz.VectoCore.Models.Declaration;
+using TUGraz.VectoCore.Models.Simulation.Data;
+using TUGraz.VectoCore.Utils;
+
+namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponents
+{
+	public interface IAuxiliaryDataAdapter
+	{
+		IList<VectoRunData.AuxData> CreateAuxiliaryData(IAuxiliariesDeclarationInputData auxInputData,
+			IBusAuxiliariesDeclarationData busAuxData, MissionType mission, VehicleClass hvdClass, Meter vehicleLength,
+			int? numSteeredAxles);
+
+		AuxiliaryConfig CreateBusAuxiliariesData(Mission mission, IVehicleDeclarationInputData vehicleData, VectoRunData runData);
+
+
+	}
+
+	public abstract class AuxiliaryDataAdapter : ComponentDataAdapterBase, IAuxiliaryDataAdapter
+	{
+		public class ElectricConsumerEntry
+		{
+
+			public ElectricConsumerEntry()
+			{
+				ActiveDuringEngineStopStandstill = true;
+				ActiveDuringEngineStopDriving = true;
+			}
+
+			public bool ActiveDuringEngineStopDriving { get; set; }
+
+			public bool ActiveDuringEngineStopStandstill { get; set; }
+
+			public bool BaseVehicle { get; set; }
+			public Ampere Current { get; set; }
+		}
+		public IList<VectoRunData.AuxData> CreateAuxiliaryData(IAuxiliariesDeclarationInputData auxInputData,
+			IBusAuxiliariesDeclarationData busAuxData, MissionType mission, VehicleClass hvdClass, Meter vehicleLength,
+			int? numSteeredAxles)
+		{
+			CheckDeclarationMode(auxInputData, "AuxiliariesData");
+			return DoCreateAuxiliaryData(auxInputData, busAuxData, mission, hvdClass, vehicleLength, numSteeredAxles);
+		}
+
+		public abstract AuxiliaryConfig CreateBusAuxiliariesData(Mission mission, IVehicleDeclarationInputData vehicleData, VectoRunData runData);
+
+		protected abstract IList<VectoRunData.AuxData> DoCreateAuxiliaryData(
+			IAuxiliariesDeclarationInputData auxInputData,
+			IBusAuxiliariesDeclarationData busAuxData, MissionType mission, VehicleClass hdvClass, Meter vehicleLength,
+			int? numSteeredAxles);
+
+
+	}
+
+	public class HeavyLorryAuxiliaryDataAdapter : AuxiliaryDataAdapter
+	{
+		#region Overrides of AuxiliaryDataAdapter
+
+		public override AuxiliaryConfig CreateBusAuxiliariesData(Mission mission, IVehicleDeclarationInputData vehicleData, VectoRunData runData)
+		{
+			throw new System.NotImplementedException();
+		}
+
+		protected override IList<VectoRunData.AuxData> DoCreateAuxiliaryData(IAuxiliariesDeclarationInputData auxInputData, IBusAuxiliariesDeclarationData busAuxData,
+			MissionType mission, VehicleClass hdvClass, Meter vehicleLength, int? numSteeredAxles)
+		{
+			var retVal = new List<VectoRunData.AuxData>();
+
+			if (auxInputData.Auxiliaries.Count != 5)
+			{
+				Log.Error(
+					"In Declaration Mode exactly 5 Auxiliaries must be defined: Fan, Steering pump, HVAC, Electric System, Pneumatic System.");
+				throw new VectoException(
+					"In Declaration Mode exactly 5 Auxiliaries must be defined: Fan, Steering pump, HVAC, Electric System, Pneumatic System.");
+			}
+
+			foreach (var auxType in EnumHelper.GetValues<AuxiliaryType>())
+			{
+				var auxData = auxInputData.Auxiliaries.FirstOrDefault(a => a.Type == auxType);
+				if (auxData == null)
+				{
+					throw new VectoException("Auxiliary {0} not found.", auxType);
+				}
+
+				var aux = new VectoRunData.AuxData
+				{
+					DemandType = AuxiliaryDemandType.Constant,
+					Technology = auxData.Technology
+				};
+
+				mission = mission.GetNonEMSMissionType();
+				switch (auxType)
+				{
+					case AuxiliaryType.Fan:
+						aux.PowerDemand = DeclarationData.Fan.LookupPowerDemand(hdvClass, mission, auxData.Technology.FirstOrDefault());
+						aux.ID = Constants.Auxiliaries.IDs.Fan;
+						break;
+					case AuxiliaryType.SteeringPump:
+						if (numSteeredAxles.HasValue && auxData.Technology.Count != numSteeredAxles.Value)
+						{
+							throw new VectoException($"Number of steering pump technologies does not match number of steered axles ({numSteeredAxles.Value}, {auxData.Technology.Count})");
+						}
+						aux.PowerDemand = DeclarationData.SteeringPump.Lookup(mission, hdvClass, auxData.Technology);
+						aux.ID = Constants.Auxiliaries.IDs.SteeringPump;
+						break;
+					case AuxiliaryType.HVAC:
+						aux.PowerDemand = DeclarationData.HeatingVentilationAirConditioning.Lookup(
+							mission,
+							auxData.Technology.FirstOrDefault(), hdvClass).PowerDemand;
+						aux.ID = Constants.Auxiliaries.IDs.HeatingVentilationAirCondition;
+						break;
+					case AuxiliaryType.PneumaticSystem:
+						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()).PowerDemand;
+						aux.ID = Constants.Auxiliaries.IDs.ElectricSystem;
+						break;
+					default: continue;
+				}
+
+				retVal.Add(aux);
+			}
+
+			return retVal;
+		}
+
+		#endregion
+	}
+
+	public class PrimaryBusAuxiliaryDataAdapter : AuxiliaryDataAdapter
+	{
+		private ElectricsUserInputsConfig GetDefaultElectricalUserConfig()
+		{
+			return new ElectricsUserInputsConfig()
+			{
+				PowerNetVoltage = Constants.BusAuxiliaries.ElectricSystem.PowernetVoltage,
+				StoredEnergyEfficiency = Constants.BusAuxiliaries.ElectricSystem.StoredEnergyEfficiency,
+				ResultCardIdle = new DummyResultCard(),
+				ResultCardOverrun = new DummyResultCard(),
+				ResultCardTraction = new DummyResultCard(),
+				AlternatorGearEfficiency = Constants.BusAuxiliaries.ElectricSystem.AlternatorGearEfficiency,
+				DoorActuationTimeSecond = Constants.BusAuxiliaries.ElectricalConsumers.DoorActuationTimeSecond,
+			};
+		}
+		private double GetNumberOfElectricalConsumersForMission(Mission mission, ElectricalConsumer consumer,
+			IVehicleDeclarationInputData vehicleData)
+		{
+			if (consumer.ConsumerName.Equals(Constants.BusAuxiliaries.ElectricalConsumers.DoorsPerVehicleConsumer,
+					StringComparison.CurrentCultureIgnoreCase))
+			{
+				var count = DeclarationData.BusAuxiliaries.DefaultElectricConsumerList.Items.First(x =>
+					x.ConsumerName.Equals(
+						Constants.BusAuxiliaries.ElectricalConsumers.DoorsPerVehicleConsumer,
+						StringComparison.CurrentCultureIgnoreCase)).NumberInActualVehicle.ToDouble();
+
+				switch (vehicleData.DoorDriveTechnology)
+				{
+					case ConsumerTechnology.Electrically:
+						return count;
+					case ConsumerTechnology.Mixed:
+						return count * 0.5;
+					default:
+						return 0;
+				}
+			}
+
+			return mission.BusParameter.ElectricalConsumers.GetVECTOValueOrDefault(consumer.ConsumerName, 0);
+		}
+
+		protected virtual Dictionary<string, ElectricConsumerEntry> GetDefaultElectricConsumers(
+			Mission mission, IVehicleDeclarationInputData vehicleData, IActuations actuations)
+		{
+			var retVal = new Dictionary<string, ElectricConsumerEntry>();
+			var doorDutyCycleFraction =
+				(actuations.ParkBrakeAndDoors * Constants.BusAuxiliaries.ElectricalConsumers.DoorActuationTimeSecond) /
+				actuations.CycleTime;
+			var busAux = vehicleData.Components.BusAuxiliaries;
+			var electricDoors = vehicleData.DoorDriveTechnology == ConsumerTechnology.Electrically ||
+								vehicleData.DoorDriveTechnology == ConsumerTechnology.Mixed;
+
+			foreach (var consumer in DeclarationData.BusAuxiliaries.DefaultElectricConsumerList.Items)
+			{
+				var applied = consumer.DefaultConsumer || consumer.Bonus
+					? 1.0
+					: GetNumberOfElectricalConsumersForMission(mission, consumer, vehicleData);
+				var nbr = consumer.DefaultConsumer
+					? GetNumberOfElectricalConsumersInVehicle(consumer.NumberInActualVehicle, mission, vehicleData)
+					: 1.0;
+
+				var dutyCycle = electricDoors && consumer.ConsumerName.Equals(
+					Constants.BusAuxiliaries.ElectricalConsumers.DoorsPerVehicleConsumer,
+					StringComparison.CurrentCultureIgnoreCase)
+					? doorDutyCycleFraction
+					: consumer.PhaseIdleTractionOn;
+
+				var current = applied * consumer.NominalCurrent(mission.MissionType) * dutyCycle * nbr;
+				if (consumer.Bonus && !VehicleHasElectricalConsumer(consumer.ConsumerName, busAux))
+				{
+					current = 0.SI<Ampere>();
+				}
+
+				retVal[consumer.ConsumerName] = new ElectricConsumerEntry
+				{
+					BaseVehicle = consumer.BaseVehicle,
+					Current = current
+				};
+			}
+
+			return retVal;
+		}
+
+		protected virtual bool VehicleHasElectricalConsumer(string consumerName, IBusAuxiliariesDeclarationData busAux)
+		{
+			switch (consumerName)
+			{
+				case "Day running lights LED bonus":
+				case "Position lights LED bonus":
+				case "Brake lights LED bonus": // return false;
+				case "Interior lights LED bonus":
+				case "Headlights LED bonus": return true;
+				default: return false;
+			}
+		}
+		protected virtual double CalculateLengthDependentElectricalConsumers(Mission mission, IVehicleDeclarationInputData vehicleData)
+		{
+			var busParams = mission.BusParameter;
+			return DeclarationData.BusAuxiliaries.CalculateLengthInteriorLights(
+					busParams.VehicleLength, busParams.VehicleCode, busParams.NumberPassengersLowerDeck)
+				.Value();
+		}
+
+		protected virtual double GetNumberOfElectricalConsumersInVehicle(string nbr, Mission mission, IVehicleDeclarationInputData vehicleData)
+		{
+			if ("f_IntLight(L_CoC)".Equals(nbr, StringComparison.InvariantCultureIgnoreCase))
+			{
+				return CalculateLengthDependentElectricalConsumers(mission, vehicleData);
+			}
+
+			return nbr.ToDouble();
+		}
+
+		private Dictionary<string, ElectricConsumerEntry> GetElectricConsumers(Mission mission, IVehicleDeclarationInputData vehicleData, IActuations actuations, VehicleClass vehicleClass)
+		{
+			var retVal = GetDefaultElectricConsumers(mission, vehicleData, actuations);
+
+			foreach (var entry in GetElectricAuxConsumers(mission, vehicleData, vehicleClass, vehicleData.Components.BusAuxiliaries))
+			{
+				retVal[entry.Key] = entry.Value;
+			}
+
+			return retVal;
+		}
+		protected virtual Dictionary<string, ElectricConsumerEntry> GetElectricAuxConsumers(Mission mission, IVehicleDeclarationInputData vehicleData, VehicleClass vehicleClass, IBusAuxiliariesDeclarationData busAux)
+		{
+			var retVal = new Dictionary<string, ElectricConsumerEntry>();
+			var spPower = DeclarationData.SteeringPumpBus.LookupElectricalPowerDemand(
+				mission.MissionType, busAux.SteeringPumpTechnology,
+				vehicleData.Length ?? mission.BusParameter.VehicleLength);
+			retVal[Constants.Auxiliaries.IDs.SteeringPump] = new ElectricConsumerEntry
+			{
+				ActiveDuringEngineStopStandstill = false,
+				BaseVehicle = false,
+				Current = spPower / Constants.BusAuxiliaries.ElectricSystem.PowernetVoltage
+			};
+
+			var fanPower = DeclarationData.Fan.LookupElectricalPowerDemand(
+				vehicleClass, mission.MissionType, busAux.FanTechnology);
+			retVal[Constants.Auxiliaries.IDs.Fan] = new ElectricConsumerEntry
+			{
+				ActiveDuringEngineStopStandstill = false,
+				ActiveDuringEngineStopDriving = false,
+				BaseVehicle = false,
+				Current = fanPower / Constants.BusAuxiliaries.ElectricSystem.PowernetVoltage
+			};
+			return retVal;
+		}
+		protected virtual double CalculateAlternatorEfficiency(IList<IAlternatorDeclarationInputData> alternators)
+		{
+			return DeclarationData.BusAuxiliaries.AlternatorTechnologies.Lookup("default");
+		}
+
+		private ElectricsUserInputsConfig GetElectricalUserConfig(
+			Mission mission, IVehicleDeclarationInputData vehicleData, IActuations actuations, VehicleClass vehicleClass)
+		{
+			var currentDemand = GetElectricConsumers(mission, vehicleData, actuations, vehicleClass);
+			var busAux = vehicleData.Components.BusAuxiliaries;
+
+			var retVal = GetDefaultElectricalUserConfig();
+
+			retVal.AlternatorType = busAux.ElectricSupply.AlternatorTechnology;
+			retVal.ElectricalConsumers = currentDemand;
+			retVal.AlternatorMap = new SimpleAlternator(CalculateAlternatorEfficiency(busAux.ElectricSupply.Alternators));
+
+			switch (retVal.AlternatorType)
+			{
+				case AlternatorType.Smart when busAux.ElectricSupply.Alternators.Count == 0:
+					throw new VectoException("at least one alternator is required when specifying smart electrics!");
+				case AlternatorType.Smart when busAux.ElectricSupply.ElectricStorage.Count == 0:
+					throw new VectoException("at least one electric storage (battery or capacitor) is required when specifying smart electrics!");
+			}
+
+			retVal.MaxAlternatorPower = busAux.ElectricSupply.Alternators.Sum(x => x.RatedVoltage * x.RatedCurrent);
+			retVal.ElectricStorageCapacity = busAux.ElectricSupply.ElectricStorage.Sum(x => x.ElectricStorageCapacity) ?? 0.SI<WattSecond>();
+
+			return retVal;
+		}
+		protected virtual PneumaticUserInputsConfig GetPneumaticUserConfig(IVehicleDeclarationInputData vehicleData, Mission mission)
+		{
+			var busAux = vehicleData.Components.BusAuxiliaries;
+
+			//throw new NotImplementedException();
+			return new PneumaticUserInputsConfig()
+			{
+				KneelingHeight = VectoMath.Max(0.SI<Meter>(), mission.BusParameter.EntranceHeight - Constants.BusParameters.EntranceHeight),
+				CompressorGearEfficiency = Constants.BusAuxiliaries.PneumaticUserConfig.CompressorGearEfficiency,
+				CompressorGearRatio = busAux.PneumaticSupply.Ratio,
+				CompressorMap = DeclarationData.BusAuxiliaries.GetCompressorMap(busAux.PneumaticSupply.CompressorSize, busAux.PneumaticSupply.Clutch),
+				SmartAirCompression = busAux.PneumaticSupply.SmartAirCompression,
+				SmartRegeneration = busAux.PneumaticSupply.SmartRegeneration,
+				AdBlueDosing = busAux.PneumaticConsumers.AdBlueDosing,
+				Doors = ConsumerTechnology.Pneumatically,
+				AirSuspensionControl = busAux.PneumaticConsumers.AirsuspensionControl,
+			};
+		}
+		protected internal virtual IPneumaticsConsumersDemand CreatePneumaticAuxConfig(RetarderType retarderType)
+		{
+			return new PneumaticsConsumersDemand()
+			{
+				AdBlueInjection = Constants.BusAuxiliaries.PneumaticConsumersDemands.AdBlueInjection,
+				AirControlledSuspension = Constants.BusAuxiliaries.PneumaticConsumersDemands.AirControlledSuspension,
+				Braking = retarderType == RetarderType.None
+					? Constants.BusAuxiliaries.PneumaticConsumersDemands.BrakingNoRetarder
+					: Constants.BusAuxiliaries.PneumaticConsumersDemands.BrakingWithRetarder,
+				BreakingWithKneeling = Constants.BusAuxiliaries.PneumaticConsumersDemands.BreakingAndKneeling,
+				DeadVolBlowOuts = Constants.BusAuxiliaries.PneumaticConsumersDemands.DeadVolBlowOuts,
+				DeadVolume = Constants.BusAuxiliaries.PneumaticConsumersDemands.DeadVolume,
+				NonSmartRegenFractionTotalAirDemand =
+					Constants.BusAuxiliaries.PneumaticConsumersDemands.NonSmartRegenFractionTotalAirDemand,
+				SmartRegenFractionTotalAirDemand =
+					Constants.BusAuxiliaries.PneumaticConsumersDemands.SmartRegenFractionTotalAirDemand,
+				OverrunUtilisationForCompressionFraction =
+					Constants.BusAuxiliaries.PneumaticConsumersDemands.OverrunUtilisationForCompressionFraction,
+				DoorOpening = Constants.BusAuxiliaries.PneumaticConsumersDemands.DoorOpening,
+				StopBrakeActuation = Constants.BusAuxiliaries.PneumaticConsumersDemands.StopBrakeActuation,
+			};
+		}
+		public virtual ISSMDeclarationInputs CreateSSMModelParameters(IBusAuxiliariesDeclarationData busAuxInputData, Mission mission, IFuelProperties heatingFuel, LoadingType loadingType)
+		{
+			var busParams = mission.BusParameter;
+
+			var isDoubleDecker = busParams.VehicleCode.IsDoubleDeckerBus();
+			var internalLength = busParams.HVACConfiguration == BusHVACSystemConfiguration.Configuration2
+				? 2 * Constants.BusParameters.DriverCompartmentLength // OK
+				: DeclarationData.BusAuxiliaries.CalculateInternalLength(busParams.VehicleLength,
+				busParams.VehicleCode, 10); // missing: correction length for low floor buses
+			var internalHeight = DeclarationData.BusAuxiliaries.CalculateInternalHeight(mission.BusParameter.VehicleCode, RegistrationClass.II, busParams.BodyHeight);
+			var coolingPower = CalculateMaxCoolingPower(null, null, mission);
+
+			var retVal = GetDefaulSSMInputs(heatingFuel);
+			retVal.BusFloorType = busParams.VehicleCode.GetFloorType();
+			retVal.Technologies = GetSSMTechnologyBenefits(busAuxInputData, mission.BusParameter.VehicleCode.GetFloorType());
+
+			retVal.FuelFiredHeaterPower = busParams.HVACAuxHeaterPower;
+			retVal.BusWindowSurface = DeclarationData.BusAuxiliaries.WindowHeight(busParams.DoubleDecker) * internalLength +
+									DeclarationData.BusAuxiliaries.FrontAndRearWindowArea(busParams.DoubleDecker);
+			retVal.BusSurfaceArea = 2 * (internalLength * busParams.VehicleWidth + internalLength * internalHeight +
+										(isDoubleDecker ? 2.0 : 1.0) * busParams.VehicleWidth * busParams.BodyHeight);
+			retVal.BusVolume = internalLength * busParams.VehicleWidth * internalHeight;
+
+			retVal.UValue = DeclarationData.BusAuxiliaries.UValue(busParams.VehicleCode.GetFloorType());
+			retVal.NumberOfPassengers =
+				DeclarationData.BusAuxiliaries.CalculateBusFloorSurfaceArea(internalLength, busParams.VehicleWidth) *
+				(loadingType == LoadingType.LowLoading ? mission.BusParameter.PassengerDensityLow : mission.BusParameter.PassengerDensityRef) *
+				(loadingType == LoadingType.LowLoading ? mission.MissionType.GetLowLoadFactorBus() : 1.0) + 1; // add driver for 'heat input'
+			retVal.VentilationRate = DeclarationData.BusAuxiliaries.VentilationRate(busParams.HVACConfiguration, false);
+			retVal.VentilationRateHeating = DeclarationData.BusAuxiliaries.VentilationRate(busParams.HVACConfiguration, true);
+
+			retVal.HVACMaxCoolingPower = coolingPower.Item1 + coolingPower.Item2;
+			retVal.HVACCompressorType = busParams.HVACCompressorType; // use passenger compartment
+			retVal.COP = DeclarationData.BusAuxiliaries.CalculateCOP(
+
+				coolingPower.Item1, HeatPumpType.none, coolingPower.Item2, busParams.HVACCompressorType,
+				busParams.VehicleCode.GetFloorType());
+			retVal.HVACTechnology = $"{busParams.HVACConfiguration.GetName()} " +
+									$"({string.Join(", ", busParams.HVACCompressorType.GetName(), HeatPumpType.none.GetName())})";
+
+			//SetHVACParameters(retVal, vehicleData, mission);
+
+			return retVal;
+		}
+		protected virtual TechnologyBenefits GetSSMTechnologyBenefits(IBusAuxiliariesDeclarationData inputData, FloorType floorType)
+		{
+			var onVehicle = new List<SSMTechnology>();
+			foreach (var item in DeclarationData.BusAuxiliaries.SSMTechnologyList)
+			{
+				if ("Adjustable coolant thermostat".Equals(item.BenefitName, StringComparison.InvariantCultureIgnoreCase) &&
+					(inputData?.HVACAux.AdjustableCoolantThermostat ?? false))
+				{
+					onVehicle.Add(item);
+				}
+
+				if ("Engine waste gas heat exchanger".Equals(item.BenefitName, StringComparison.InvariantCultureIgnoreCase) &&
+					(inputData?.HVACAux.EngineWasteGasHeatExchanger ?? false))
+				{
+					onVehicle.Add(item);
+				}
+			}
+
+			return SelectBenefitForFloorType(floorType, onVehicle);
+		}
+
+		protected virtual TechnologyBenefits SelectBenefitForFloorType(FloorType floorType, List<SSMTechnology> onVehicle)
+		{
+			var retVal = new TechnologyBenefits();
+
+			switch (floorType)
+			{
+				case FloorType.LowFloor:
+					retVal.CValueVariation = onVehicle.Sum(x => x.LowFloorC);
+					retVal.HValueVariation = onVehicle.Sum(x => x.LowFloorH);
+					retVal.VCValueVariation = onVehicle.Sum(x => x.ActiveVC ? x.LowFloorV : 0);
+					retVal.VHValueVariation = onVehicle.Sum(x => x.ActiveVH ? x.LowFloorV : 0);
+					retVal.VVValueVariation = onVehicle.Sum(x => x.ActiveVV ? x.LowFloorV : 0);
+					break;
+				case FloorType.HighFloor:
+					retVal.CValueVariation = onVehicle.Sum(x => x.RaisedFloorC);
+					retVal.HValueVariation = onVehicle.Sum(x => x.RaisedFloorH);
+					retVal.VCValueVariation = onVehicle.Sum(x => x.ActiveVC ? x.RaisedFloorV : 0);
+					retVal.VHValueVariation = onVehicle.Sum(x => x.ActiveVH ? x.RaisedFloorV : 0);
+					retVal.VVValueVariation = onVehicle.Sum(x => x.ActiveVV ? x.RaisedFloorV : 0);
+					break;
+				case FloorType.SemiLowFloor:
+					retVal.CValueVariation = onVehicle.Sum(x => x.SemiLowFloorC);
+					retVal.HValueVariation = onVehicle.Sum(x => x.SemiLowFloorH);
+					retVal.VCValueVariation = onVehicle.Sum(x => x.ActiveVC ? x.SemiLowFloorV : 0);
+					retVal.VHValueVariation = onVehicle.Sum(x => x.ActiveVH ? x.SemiLowFloorV : 0);
+					retVal.VVValueVariation = onVehicle.Sum(x => x.ActiveVV ? x.SemiLowFloorV : 0);
+					break;
+			}
+
+			return retVal;
+		}
+
+		public SSMInputs GetDefaulSSMInputs(IFuelProperties heatingFuel)
+		{
+			return new SSMInputs(null, heatingFuel)
+			{
+				DefaultConditions = new EnvironmentalConditionMapEntry(
+					Constants.BusAuxiliaries.SteadyStateModel.DefaultTemperature,
+					Constants.BusAuxiliaries.SteadyStateModel.DefaultSolar,
+					1.0),
+				EnvironmentalConditionsMap = DeclarationData.BusAuxiliaries.DefaultEnvironmentalConditions,
+				HeatingBoundaryTemperature = Constants.BusAuxiliaries.SteadyStateModel.HeatingBoundaryTemperature,
+				CoolingBoundaryTemperature = Constants.BusAuxiliaries.SteadyStateModel.CoolingBoundaryTemperature,
+
+				SpecificVentilationPower = Constants.BusAuxiliaries.SteadyStateModel.SpecificVentilationPower,
+
+				AuxHeaterEfficiency = Constants.BusAuxiliaries.SteadyStateModel.AuxHeaterEfficiency,
+				FuelEnergyToHeatToCoolant = Constants.BusAuxiliaries.Heater.FuelEnergyToHeatToCoolant,
+				CoolantHeatTransferredToAirCabinHeater = Constants.BusAuxiliaries.Heater.CoolantHeatTransferredToAirCabinHeater,
+				GFactor = Constants.BusAuxiliaries.SteadyStateModel.GFactor,
+
+				VentilationOnDuringHeating = true,
+				VentilationWhenBothHeatingAndACInactive = true,
+				VentilationDuringAC = true,
+
+				MaxPossibleBenefitFromTechnologyList =
+					Constants.BusAuxiliaries.SteadyStateModel.MaxPossibleBenefitFromTechnologyList,
+			};
+		}
+
+		protected virtual Tuple<Watt, Watt> CalculateMaxCoolingPower(IVehicleDeclarationInputData vehicleData, IVehicleDeclarationInputData primaryVehicle, Mission mission)
+		{
+			var busParams = mission.BusParameter;
+
+			var length = DeclarationData.BusAuxiliaries.CalculateInternalLength(
+				busParams.VehicleLength, busParams.VehicleCode,
+				busParams.NumberPassengersLowerDeck);
+			var height = DeclarationData.BusAuxiliaries.CalculateInternalHeight(busParams.VehicleCode, RegistrationClass.II, busParams.BodyHeight);
+			var volume = length * height * busParams.VehicleWidth;
+
+			var driver = DeclarationData.BusAuxiliaries.HVACMaxCoolingPower.DriverMaxCoolingPower(
+				busParams.HVACConfiguration, mission.MissionType);
+			var passenger = DeclarationData.BusAuxiliaries.HVACMaxCoolingPower.PassengerMaxCoolingPower(
+				busParams.HVACConfiguration, mission.MissionType, volume);
+
+			return Tuple.Create(driver, passenger);
+		}
+
+		#region Overrides of AuxiliaryDataAdapter
+
+		public override AuxiliaryConfig CreateBusAuxiliariesData(Mission mission, IVehicleDeclarationInputData vehicleData, VectoRunData runData)
+		{
+			var actuations = DeclarationData.BusAuxiliaries.ActuationsMap.Lookup(runData.Mission.MissionType);
+
+			var retVal = new AuxiliaryConfig
+			{
+				InputData = vehicleData.Components.BusAuxiliaries,
+				ElectricalUserInputsConfig = GetElectricalUserConfig(mission, vehicleData, actuations, runData.VehicleData.VehicleClass),
+				PneumaticUserInputsConfig = GetPneumaticUserConfig(vehicleData, mission),
+				PneumaticAuxillariesConfig = CreatePneumaticAuxConfig(runData.Retarder.Type),
+				Actuations = actuations,
+				SSMInputs = CreateSSMModelParameters(
+					vehicleData.Components.BusAuxiliaries, mission, FuelData.Diesel, runData.Loading),
+				VehicleData = runData.VehicleData,
+			};
+
+			return retVal;
+		}
+
+		protected override IList<VectoRunData.AuxData> DoCreateAuxiliaryData(IAuxiliariesDeclarationInputData auxInputData, IBusAuxiliariesDeclarationData busAuxData,
+			MissionType mission, VehicleClass hdvClass, Meter vehicleLength, int? numSteeredAxles)
+		{
+			if (auxInputData != null)
+			{
+				throw new VectoException("Only BusAuxiliaries can be provided as input!");
+			}
+
+			if (numSteeredAxles.HasValue && busAuxData.SteeringPumpTechnology.Count != numSteeredAxles.Value)
+			{
+				throw new VectoException($"Number of steering pump technologies does not match number of steered axles ({numSteeredAxles.Value}, {busAuxData.SteeringPumpTechnology.Count})");
+			}
+			var retVal = new List<VectoRunData.AuxData>();
+
+			retVal.Add(
+				new VectoRunData.AuxData()
+				{
+					DemandType = AuxiliaryDemandType.Constant,
+					Technology = new List<string>() { busAuxData.FanTechnology },
+					ID = Constants.Auxiliaries.IDs.Fan,
+					PowerDemand = DeclarationData.Fan.LookupMechanicalPowerDemand(hdvClass, mission, busAuxData.FanTechnology)
+				});
+			retVal.Add(
+				new VectoRunData.AuxData()
+				{
+					DemandType = AuxiliaryDemandType.Constant,
+					Technology = busAuxData.SteeringPumpTechnology,
+					ID = Constants.Auxiliaries.IDs.SteeringPump,
+					PowerDemand = DeclarationData.SteeringPumpBus.LookupMechanicalPowerDemand(
+						mission, busAuxData.SteeringPumpTechnology, vehicleLength)
+				});
+			return retVal;
+		}
+
+		#endregion
+	}
+
+
+}
\ No newline at end of file
diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/AxleGearDataAdapter.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/AxleGearDataAdapter.cs
new file mode 100644
index 0000000000..577e2922e0
--- /dev/null
+++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/AxleGearDataAdapter.cs
@@ -0,0 +1,79 @@
+using TUGraz.VectoCommon.Exceptions;
+using TUGraz.VectoCommon.InputData;
+using TUGraz.VectoCore.InputData.Reader.ComponentData;
+using TUGraz.VectoCore.Models.SimulationComponent.Data;
+using TUGraz.VectoCore.Models.SimulationComponent.Data.Gearbox;
+
+namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponents
+{
+	public interface IAxleGearDataAdapter
+	{
+		AxleGearData CreateAxleGearData(IAxleGearInputData data);
+		AxleGearData CreateDummyAxleGearData(IGearboxDeclarationInputData gbxData);
+	}
+
+	public class AxleGearDataAdapterBase : IAxleGearDataAdapter
+	{
+		public AxleGearData CreateDummyAxleGearData(IGearboxDeclarationInputData gbxData)
+		{
+			if (double.IsNaN(gbxData.AxlegearRatio))
+			{
+				throw new VectoException(
+					"Axlegear ratio required in gearbox data for gearboxes with included axlegear");
+			}
+
+			return new AxleGearData()
+			{
+				AxleGear = new TransmissionData()
+				{
+					Ratio = gbxData.AxlegearRatio,
+					LossMap = TransmissionLossMapReader.Create(1.0, gbxData.AxlegearRatio, "Axlegear")
+				}
+			};
+		}
+		internal TransmissionLossMap ReadAxleLossMap(IAxleGearInputData data, bool useEfficiencyFallback)
+		{
+			TransmissionLossMap axleLossMap;
+			if (data.LossMap == null && useEfficiencyFallback)
+			{
+				axleLossMap = TransmissionLossMapReader.Create(data.Efficiency, data.Ratio, "Axlegear");
+			}
+			else
+			{
+				if (data.LossMap == null)
+				{
+					throw new InvalidFileFormatException("LossMap for Axlegear is missing.");
+				}
+				axleLossMap = TransmissionLossMapReader.Create(data.LossMap, data.Ratio, "Axlegear", true);
+			}
+			if (axleLossMap == null)
+			{
+				throw new InvalidFileFormatException("LossMap for Axlegear is missing.");
+			}
+			return axleLossMap;
+		}
+		internal AxleGearData SetCommonAxleGearData(IAxleGearInputData data)
+		{
+			return new AxleGearData
+			{
+				InputData = data,
+				SavedInDeclarationMode = data.SavedInDeclarationMode,
+				Manufacturer = data.Manufacturer,
+				ModelName = data.Model,
+				LineType = data.LineType,
+				Date = data.Date,
+				CertificationMethod = data.CertificationMethod,
+				CertificationNumber = data.CertificationNumber,
+				DigestValueInput = data.DigestValue != null ? data.DigestValue.DigestValue : "",
+				AxleGear = new GearData { Ratio = data.Ratio }
+			};
+		}
+		public AxleGearData CreateAxleGearData(IAxleGearInputData data)
+		{
+			
+			var retVal = SetCommonAxleGearData(data);
+			retVal.AxleGear.LossMap = ReadAxleLossMap(data, false);
+			return retVal;
+		}
+	}
+}
\ No newline at end of file
diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/DataAdapterBase.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/DataAdapterBase.cs
new file mode 100644
index 0000000000..abb20ce585
--- /dev/null
+++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/DataAdapterBase.cs
@@ -0,0 +1,24 @@
+using TUGraz.VectoCommon.InputData;
+using TUGraz.VectoCommon.Models;
+
+namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponents
+{
+	public abstract class ComponentDataAdapterBase : LoggingObject
+	{
+		protected void CheckDeclarationMode(IComponentInputData component, string componentName)
+		{
+			if (!component.SavedInDeclarationMode)
+			{
+				Log.Warn("{0} not in Declaration Mode!", componentName);
+			}
+		}
+		protected void CheckDeclarationMode(IAuxiliariesDeclarationInputData aux, string componentName)
+		{
+			if (!aux.SavedInDeclarationMode)
+			{
+				Log.Warn("{0} not in Declaration Mode!", componentName);
+			}
+		}
+	}
+}
+
diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/EngineDataAdapter.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/EngineDataAdapter.cs
new file mode 100644
index 0000000000..7fdf303ac1
--- /dev/null
+++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/EngineDataAdapter.cs
@@ -0,0 +1,226 @@
+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;
+using TUGraz.VectoCore.InputData.Reader.ComponentData;
+using TUGraz.VectoCore.Models.Declaration;
+using TUGraz.VectoCore.Models.SimulationComponent;
+using TUGraz.VectoCore.Models.SimulationComponent.Data;
+using TUGraz.VectoCore.Models.SimulationComponent.Data.Engine;
+
+namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponents
+{
+	public interface IEngineDataAdapter
+	{
+		CombustionEngineData CreateEngineData(IVehicleDeclarationInputData vehicle,
+			IEngineModeDeclarationInputData mode, Mission mission);
+	}
+	public abstract class EngineComponentDataAdapter : ComponentDataAdapterBase, IEngineDataAdapter
+	{
+		internal static EngineFullLoadCurve IntersectFullLoadCurves(EngineFullLoadCurve engineCurve, NewtonMeter maxTorque)
+		{
+			if (maxTorque == null)
+			{
+				return engineCurve;
+			}
+
+			var entries = new List<EngineFullLoadCurve.FullLoadCurveEntry>();
+			var firstEntry = engineCurve.FullLoadEntries.First();
+			if (firstEntry.TorqueFullLoad < maxTorque)
+			{
+				entries.Add(engineCurve.FullLoadEntries.First());
+			}
+			else
+			{
+				entries.Add(new EngineFullLoadCurve.FullLoadCurveEntry
+				{
+					EngineSpeed = firstEntry.EngineSpeed,
+					TorqueFullLoad = maxTorque,
+					TorqueDrag = firstEntry.TorqueDrag
+				});
+			}
+			foreach (var entry in engineCurve.FullLoadEntries.Pairwise(Tuple.Create))
+			{
+				if (entry.Item1.TorqueFullLoad <= maxTorque && entry.Item2.TorqueFullLoad <= maxTorque)
+				{
+					// segment is below maxTorque line -> use directly
+					entries.Add(entry.Item2);
+				}
+				else if (entry.Item1.TorqueFullLoad > maxTorque && entry.Item2.TorqueFullLoad > maxTorque)
+				{
+					// segment is above maxTorque line -> add limited entry
+					entries.Add(new EngineFullLoadCurve.FullLoadCurveEntry
+					{
+						EngineSpeed = entry.Item2.EngineSpeed,
+						TorqueFullLoad = maxTorque,
+						TorqueDrag = entry.Item2.TorqueDrag
+					});
+				}
+				else
+				{
+					// segment intersects maxTorque line -> add new entry at intersection
+					var edgeFull = Edge.Create(
+						new Point(entry.Item1.EngineSpeed.Value(), entry.Item1.TorqueFullLoad.Value()),
+						new Point(entry.Item2.EngineSpeed.Value(), entry.Item2.TorqueFullLoad.Value()));
+					var edgeDrag = Edge.Create(
+						new Point(entry.Item1.EngineSpeed.Value(), entry.Item1.TorqueDrag.Value()),
+						new Point(entry.Item2.EngineSpeed.Value(), entry.Item2.TorqueDrag.Value()));
+					var intersectionX = (maxTorque.Value() - edgeFull.OffsetXY) / edgeFull.SlopeXY;
+					if (!entries.Any(x => x.EngineSpeed.IsEqual(intersectionX)) && !intersectionX.IsEqual(entry.Item2.EngineSpeed.Value()))
+					{
+						entries.Add(new EngineFullLoadCurve.FullLoadCurveEntry
+						{
+							EngineSpeed = intersectionX.SI<PerSecond>(),
+							TorqueFullLoad = maxTorque,
+							TorqueDrag = VectoMath.Interpolate(edgeDrag.P1, edgeDrag.P2, intersectionX).SI<NewtonMeter>()
+						});
+					}
+
+					entries.Add(new EngineFullLoadCurve.FullLoadCurveEntry
+					{
+						EngineSpeed = entry.Item2.EngineSpeed,
+						TorqueFullLoad = entry.Item2.TorqueFullLoad > maxTorque ? maxTorque : entry.Item2.TorqueFullLoad,
+						TorqueDrag = entry.Item2.TorqueDrag
+					});
+				}
+			}
+
+			var flc = new EngineFullLoadCurve(entries.ToList(), engineCurve.PT1Data)
+			{
+				EngineData = engineCurve.EngineData,
+			};
+			return flc;
+		}
+		protected static WHRData CreateWHRData(IWHRData whrInputData, MissionType missionType, WHRType type)
+		{
+			if (whrInputData == null || whrInputData.GeneratedPower == null)
+			{
+				throw new VectoException("Missing WHR Data");
+			}
+
+			var whr = new WHRData()
+			{
+				CFUrban = whrInputData.UrbanCorrectionFactor,
+				CFRural = whrInputData.RuralCorrectionFactor,
+				CFMotorway = whrInputData.MotorwayCorrectionFactor,
+				CFColdHot = whrInputData.BFColdHot,
+				CFRegPer = whrInputData.CFRegPer,
+				WHRMap = WHRPowerReader.Create(whrInputData.GeneratedPower, type)
+			};
+			whr.WHRCorrectionFactor = DeclarationData.WHTCCorrection.Lookup(
+				missionType.GetNonEMSMissionType(), whr.CFRural, whr.CFUrban,
+				whr.CFMotorway) * whr.CFColdHot * whr.CFRegPer;
+			return whr;
+		}
+		public static CombustionEngineData SetCommonCombustionEngineData(IEngineDeclarationInputData data, TankSystem? tankSystem)
+		{
+			var retVal = new CombustionEngineData
+			{
+				InputData = data,
+				SavedInDeclarationMode = data.SavedInDeclarationMode,
+				Manufacturer = data.Manufacturer,
+				ModelName = data.Model,
+				Date = data.Date,
+				CertificationNumber = data.CertificationNumber,
+				CertificationMethod = CertificationMethod.Measured,
+				DigestValueInput = data.DigestValue != null ? data.DigestValue.DigestValue : "",
+				Displacement = data.Displacement,
+				//IdleSpeed = data.IdleSpeed,
+				//ConsumptionMap = FuelConsumptionMapReader.Create(data.FuelConsumptionMap),
+				RatedPowerDeclared = data.RatedPowerDeclared,
+				RatedSpeedDeclared = data.RatedSpeedDeclared,
+				MaxTorqueDeclared = data.MaxTorqueDeclared,
+				//FuelData = DeclarationData.FuelData.Lookup(data.FuelType, tankSystem)
+				MultipleEngineFuelModes = data.EngineModes.Count > 1,
+				WHRType = data.WHRType,
+			};
+			return retVal;
+		}
+
+		#region Implementation of IEngineDataAdapter
+
+		public CombustionEngineData CreateEngineData(IVehicleDeclarationInputData vehicle, IEngineModeDeclarationInputData mode,
+			Mission mission)
+		{
+			CheckDeclarationMode(vehicle.Components.EngineInputData, "EngineData");
+			return DoCreateEngineData(vehicle, mode, mission);
+		}
+
+		protected abstract CombustionEngineData DoCreateEngineData(IVehicleDeclarationInputData vehicle, IEngineModeDeclarationInputData mode, Mission mission);
+
+		#endregion
+	}
+
+	public class CombustionEngineComponentDataAdapter : EngineComponentDataAdapter
+	{
+		#region Overrides of EngineDataAdapter
+
+		protected override CombustionEngineData DoCreateEngineData(IVehicleDeclarationInputData vehicle, IEngineModeDeclarationInputData mode, Mission mission)
+		{
+			var engine = vehicle.Components.EngineInputData;
+			var gearbox = vehicle.Components.GearboxInputData;
+
+			var retVal = SetCommonCombustionEngineData(engine, vehicle.TankSystem);
+			retVal.IdleSpeed = VectoMath.Max(mode.IdleSpeed, vehicle.EngineIdleSpeed);
+
+			retVal.Fuels = new List<CombustionEngineFuelData>();
+			foreach (var fuel in mode.Fuels)
+			{
+				retVal.Fuels.Add(
+					new CombustionEngineFuelData()
+					{
+						WHTCUrban = fuel.WHTCUrban,
+						WHTCRural = fuel.WHTCRural,
+						WHTCMotorway = fuel.WHTCMotorway,
+						ColdHotCorrectionFactor = fuel.ColdHotBalancingFactor,
+						CorrectionFactorRegPer = fuel.CorrectionFactorRegPer,
+						FuelData = DeclarationData.FuelData.Lookup(fuel.FuelType, vehicle.TankSystem),
+						ConsumptionMap = FuelConsumptionMapReader.Create(fuel.FuelConsumptionMap),
+						FuelConsumptionCorrectionFactor = DeclarationData.WHTCCorrection.Lookup(
+							mission.MissionType.GetNonEMSMissionType(), fuel.WHTCRural, fuel.WHTCUrban,
+							fuel.WHTCMotorway) * fuel.ColdHotBalancingFactor * fuel.CorrectionFactorRegPer,
+					});
+			}
+
+			retVal.Inertia = DeclarationData.Engine.EngineInertia(retVal.Displacement, gearbox.Type);
+			retVal.EngineStartTime = DeclarationData.Engine.DefaultEngineStartTime;
+			var limits = vehicle.TorqueLimits?.ToDictionary(e => e.Gear) ??
+						new Dictionary<int, ITorqueLimitInputData>();
+			var numGears = gearbox.Gears.Count;
+			var fullLoadCurves = new Dictionary<uint, EngineFullLoadCurve>(numGears + 1);
+			fullLoadCurves[0] = FullLoadCurveReader.Create(mode.FullLoadCurve, true);
+			fullLoadCurves[0].EngineData = retVal;
+			foreach (var gear in gearbox.Gears)
+			{
+				var maxTorque = VectoMath.Min(
+					GearboxDataAdapterBase.GbxMaxTorque(gear, numGears, fullLoadCurves[0].MaxTorque),
+					VehicleDataAdapter.VehMaxTorque(gear, numGears, limits, fullLoadCurves[0].MaxTorque));
+				fullLoadCurves[(uint)gear.Gear] = IntersectFullLoadCurves(fullLoadCurves[0], maxTorque);
+			}
+
+			retVal.FullLoadCurves = fullLoadCurves;
+
+			retVal.WHRType = engine.WHRType;
+			if ((retVal.WHRType & WHRType.ElectricalOutput) != 0)
+			{
+				retVal.ElectricalWHR = CreateWHRData(
+					mode.WasteHeatRecoveryDataElectrical, mission.MissionType, WHRType.ElectricalOutput);
+			}
+
+			if ((retVal.WHRType & WHRType.MechanicalOutputDrivetrain) != 0)
+			{
+				retVal.MechanicalWHR = CreateWHRData(
+					mode.WasteHeatRecoveryDataMechanical, mission.MissionType, WHRType.MechanicalOutputDrivetrain);
+			}
+
+			return retVal;
+		}
+
+		#endregion
+	}
+
+
+}
\ No newline at end of file
diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/GearBoxDataAdapter.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/GearBoxDataAdapter.cs
new file mode 100644
index 0000000000..6a13d24eaa
--- /dev/null
+++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/GearBoxDataAdapter.cs
@@ -0,0 +1,383 @@
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Linq;
+using TUGraz.VectoCommon.Exceptions;
+using TUGraz.VectoCommon.InputData;
+using TUGraz.VectoCommon.Models;
+using TUGraz.VectoCommon.Utils;
+using TUGraz.VectoCore.InputData.Reader.ComponentData;
+using TUGraz.VectoCore.InputData.Reader.ShiftStrategy;
+using TUGraz.VectoCore.Models.Declaration;
+using TUGraz.VectoCore.Models.Simulation.Data;
+using TUGraz.VectoCore.Models.SimulationComponent;
+using TUGraz.VectoCore.Models.SimulationComponent.Data;
+using TUGraz.VectoCore.Models.SimulationComponent.Data.Gearbox;
+using TUGraz.VectoCore.Utils;
+
+namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponents
+{
+	public interface IGearboxDataAdapter
+	{
+		GearboxData CreateGearboxData(IVehicleDeclarationInputData inputData, VectoRunData runData,
+			IShiftPolygonCalculator shiftPolygonCalculator, GearboxType[] supportedGearboxTypes);
+
+		ShiftStrategyParameters CreateGearshiftData(GearboxData gbx, double axleRatio,
+			PerSecond engineIdlingSpeed);
+	}
+
+	public abstract class GearboxDataAdapterBase : ComponentDataAdapterBase, IGearboxDataAdapter
+	{
+		#region Helper
+		protected internal static NewtonMeter GbxMaxTorque(
+			ITransmissionInputData gear, int numGears, NewtonMeter maxEngineTorque
+		)
+		{
+			if (gear.Gear - 1 < numGears / 2)
+			{
+				// gears count from 1 to n, -> n entries, lower half can always limit
+				if (gear.MaxTorque != null)
+				{
+					return gear.MaxTorque;
+				}
+			}
+			else
+			{
+				// upper half can only limit if max-torque <= 90% of engine max torque
+				if (gear.MaxTorque != null &&
+					gear.MaxTorque <= DeclarationData.Engine.TorqueLimitGearboxFactor * maxEngineTorque)
+				{
+					return gear.MaxTorque;
+				}
+			}
+
+			return null;
+		}
+		public static void CreateTCSecondGearATSerial(GearData gearData,
+			ShiftPolygon shiftPolygon)
+		{
+			gearData.TorqueConverterRatio = gearData.Ratio;
+			gearData.TorqueConverterGearLossMap = gearData.LossMap;
+			gearData.TorqueConverterShiftPolygon = shiftPolygon;
+		}
+
+		public static void CreateTCFirstGearATSerial(GearData gearData,
+			ShiftPolygon shiftPolygon)
+		{
+			gearData.TorqueConverterRatio = gearData.Ratio;
+			gearData.TorqueConverterGearLossMap = gearData.LossMap;
+			gearData.TorqueConverterShiftPolygon = shiftPolygon;
+		}
+
+		public static void CretateTCFirstGearATPowerSplit(GearData gearData, uint i, ShiftPolygon shiftPolygon)
+		{
+			gearData.TorqueConverterRatio = 1;
+			gearData.TorqueConverterGearLossMap = TransmissionLossMapReader.Create(1, 1, $"TCGear {i + 1}");
+			gearData.TorqueConverterShiftPolygon = shiftPolygon;
+		}
+
+		protected virtual void CreateATGearData(
+			IGearboxDeclarationInputData gearbox, uint i, GearData gearData,
+			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
+				CretateTCFirstGearATPowerSplit(gearData, i, tcShiftPolygon);
+			}
+
+			if (gearbox.Type == GearboxType.ATSerial)
+			{
+				if (i == 0)
+				{
+					// 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))
+				{
+					// 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);
+
+					// NOTE: the lower gear in 'gears' dictionary has index i !!
+					gears[i].Ratio = double.NaN;
+					gears[i].LossMap = null;
+				}
+			}
+		}
+
+		public static TransmissionLossMap CreateGearLossMap(ITransmissionInputData gear, uint i,
+			bool useEfficiencyFallback, VehicleCategory vehicleCategory, GearboxType gearboxType)
+		{
+			if (gear.LossMap != null)
+			{
+				return TransmissionLossMapReader.Create(gear.LossMap, gear.Ratio, $"Gear {i + 1}", true);
+			}
+			if (useEfficiencyFallback)
+			{
+				return TransmissionLossMapReader.Create(gear.Efficiency, gear.Ratio, $"Gear {i + 1}");
+			}
+			throw new InvalidFileFormatException("Gear {0} LossMap missing.", i + 1);
+		}
+		#endregion
+		protected static void SetDeclarationData(GearboxData retVal)
+		{
+			retVal.Inertia = DeclarationData.Gearbox.Inertia;
+			retVal.TractionInterruption = retVal.Type.TractionInterruption();
+		}
+
+		protected static GearboxData SetCommonGearboxData(IGearboxDeclarationInputData data)
+		{
+			return new GearboxData
+			{
+				InputData = data,
+				SavedInDeclarationMode = data.SavedInDeclarationMode,
+				Manufacturer = data.Manufacturer,
+				ModelName = data.Model,
+				Date = data.Date,
+				CertificationMethod = data.CertificationMethod,
+				CertificationNumber = data.CertificationMethod != CertificationMethod.StandardValues ?
+					data.CertificationNumber : "",
+				DigestValueInput = data.DigestValue != null ? data.DigestValue.DigestValue : "",
+				Type = data.Type
+			};
+		}
+
+		public GearboxData CreateGearboxData(IVehicleDeclarationInputData inputData, VectoRunData runData,
+			IShiftPolygonCalculator shiftPolygonCalculator, GearboxType[] supportedGearboxTypes)
+		{
+			CheckDeclarationMode(inputData.Components.GearboxInputData, "Gearbox");
+			return DoCreateGearboxData(inputData, runData, shiftPolygonCalculator, supportedGearboxTypes);
+		}
+
+		protected abstract GearboxData DoCreateGearboxData(IVehicleDeclarationInputData inputData, VectoRunData runData, IShiftPolygonCalculator shiftPolygonCalculator, GearboxType[] supportedGearboxTypes);
+
+
+		public ShiftStrategyParameters CreateGearshiftData(GearboxData gbx, double axleRatio,
+			PerSecond engineIdlingSpeed)
+		{
+			var retVal = new ShiftStrategyParameters
+			{
+				TorqueReserve = DeclarationData.GearboxTCU.TorqueReserve,
+				StartTorqueReserve = DeclarationData.GearboxTCU.TorqueReserveStart,
+				TimeBetweenGearshifts = DeclarationData.Gearbox.MinTimeBetweenGearshifts,
+				StartSpeed = DeclarationData.GearboxTCU.StartSpeed,
+				StartAcceleration = DeclarationData.GearboxTCU.StartAcceleration,
+				DownshiftAfterUpshiftDelay = DeclarationData.Gearbox.DownshiftAfterUpshiftDelay,
+				UpshiftAfterDownshiftDelay = DeclarationData.Gearbox.UpshiftAfterDownshiftDelay,
+				UpshiftMinAcceleration = DeclarationData.Gearbox.UpshiftMinAcceleration,
+
+				StartVelocity = DeclarationData.GearboxTCU.StartSpeed,
+				GearResidenceTime = DeclarationData.GearboxTCU.GearResidenceTime,
+				DnT99L_highMin1 = DeclarationData.GearboxTCU.DnT99L_highMin1,
+				DnT99L_highMin2 = DeclarationData.GearboxTCU.DnT99L_highMin2,
+				AllowedGearRangeUp = DeclarationData.GearboxTCU.AllowedGearRangeUp,
+				AllowedGearRangeDown = DeclarationData.GearboxTCU.AllowedGearRangeDown,
+				LookBackInterval = DeclarationData.GearboxTCU.LookBackInterval,
+				DriverAccelerationLookBackInterval = DeclarationData.GearboxTCU.DriverAccelerationLookBackInterval,
+				DriverAccelerationThresholdLow = DeclarationData.GearboxTCU.DriverAccelerationThresholdLow,
+				AverageCardanPowerThresholdPropulsion =
+					DeclarationData.GearboxTCU.AverageCardanPowerThresholdPropulsion,
+				CurrentCardanPowerThresholdPropulsion =
+					DeclarationData.GearboxTCU.CurrentCardanPowerThresholdPropulsion,
+				TargetSpeedDeviationFactor = DeclarationData.GearboxTCU.TargetSpeedDeviationFactor,
+				EngineSpeedHighDriveOffFactor = DeclarationData.GearboxTCU.EngineSpeedHighDriveOffFactor,
+				RatingFactorCurrentGear = gbx.Type.AutomaticTransmission()
+					? DeclarationData.GearboxTCU.RatingFactorCurrentGearAT
+					: DeclarationData.GearboxTCU.RatingFactorCurrentGear,
+				AccelerationReserveLookup = AccelerationReserveLookupReader.ReadFromStream(
+					RessourceHelper.ReadStream(
+						DeclarationData.DeclarationDataResourcePrefix +
+						".GearshiftParameters.AccelerationReserveLookup.csv")),
+				ShareTorque99L = ShareTorque99lLookupReader.ReadFromStream(
+					RessourceHelper.ReadStream(
+						DeclarationData.DeclarationDataResourcePrefix + ".GearshiftParameters.ShareTq99L.csv")
+				),
+				PredictionDurationLookup = PredictionDurationLookupReader.ReadFromStream(
+					RessourceHelper.ReadStream(
+						DeclarationData.DeclarationDataResourcePrefix +
+						".GearshiftParameters.PredictionTimeLookup.csv")
+				),
+				ShareIdleLow = ShareIdleLowReader.ReadFromStream(
+					RessourceHelper.ReadStream(
+						DeclarationData.DeclarationDataResourcePrefix + ".GearshiftParameters.ShareIdleLow.csv")
+				),
+				ShareEngineHigh = EngineSpeedHighLookupReader.ReadFromStream(
+					RessourceHelper.ReadStream(
+						DeclarationData.DeclarationDataResourcePrefix +
+						".GearshiftParameters.ShareEngineSpeedHigh.csv")
+				),
+
+				//--------------------
+				RatioEarlyUpshiftFC = DeclarationData.GearboxTCU.RatioEarlyUpshiftFC / axleRatio,
+				RatioEarlyDownshiftFC = DeclarationData.GearboxTCU.RatioEarlyDownshiftFC / axleRatio,
+				AllowedGearRangeFC = gbx.Type.AutomaticTransmission()
+					? (gbx.Gears.Count > DeclarationData.GearboxTCU.ATSkipGearsThreshold
+						? DeclarationData.GearboxTCU.AllowedGearRangeFCATSkipGear
+						: DeclarationData.GearboxTCU.AllowedGearRangeFCAT)
+					: DeclarationData.GearboxTCU.AllowedGearRangeFCAMT,
+				VelocityDropFactor = DeclarationData.GearboxTCU.VelocityDropFactor,
+				AccelerationFactor = DeclarationData.GearboxTCU.AccelerationFactor,
+				MinEngineSpeedPostUpshift = 0.RPMtoRad(),
+				ATLookAheadTime = DeclarationData.GearboxTCU.ATLookAheadTime,
+
+				LoadStageThresoldsUp = DeclarationData.GearboxTCU.LoadStageThresholdsUp,
+				LoadStageThresoldsDown = DeclarationData.GearboxTCU.LoadStageThresoldsDown,
+				ShiftSpeedsTCToLocked = DeclarationData.GearboxTCU.ShiftSpeedsTCToLocked
+					.Select(x => x.Select(y => y + engineIdlingSpeed.AsRPM).ToArray()).ToArray(),
+			};
+
+			return retVal;
+		}
+	}
+
+	public class GearboxDataAdapter : GearboxDataAdapterBase
+	{
+		private readonly ITorqueConverterDataAdapter _torqueConverterDataAdapter;
+
+		public GearboxDataAdapter(ITorqueConverterDataAdapter torqueConverterDataAdapter)
+		{
+			_torqueConverterDataAdapter = torqueConverterDataAdapter;
+		}
+		#region Overrides of GearBoxDataAdapterBase
+
+		protected override GearboxData DoCreateGearboxData(IVehicleDeclarationInputData inputData, VectoRunData runData,
+			IShiftPolygonCalculator shiftPolygonCalculator, GearboxType[] supportedGearboxTypes)
+		{
+			var gearbox = inputData.Components.GearboxInputData;
+
+			var adas = inputData.ADAS;
+			var torqueConverter = inputData.Components.TorqueConverterInputData;
+
+			var engine = runData.EngineData;
+			var axlegearRatio = runData.AxleGearData.AxleGear.Ratio;
+			var dynamicTyreRadius = runData.VehicleData.DynamicTyreRadius;
+
+			var retVal = SetCommonGearboxData(gearbox);
+
+			//if (adas != null && retVal.Type.AutomaticTransmission() && adas.EcoRoll != EcoRollType.None &&
+			//	!adas.ATEcoRollReleaseLockupClutch.HasValue) {
+			//	throw new VectoException("Input parameter ATEcoRollReleaseLockupClutch required for AT transmission");
+			//}
+
+			retVal.ATEcoRollReleaseLockupClutch =
+				adas != null && adas.EcoRoll != EcoRollType.None && retVal.Type.AutomaticTransmission()
+					? (adas.ATEcoRollReleaseLockupClutch.HasValue ? adas.ATEcoRollReleaseLockupClutch.Value : false)
+					: false;
+
+			if (!supportedGearboxTypes.Contains(gearbox.Type))
+			{
+				throw new VectoSimulationException("Unsupported gearbox type: {0}!", retVal.Type);
+			}
+
+			var gearsInput = gearbox.Gears;
+			if (gearsInput.Count < 1)
+			{
+				throw new VectoSimulationException(
+					"At least one Gear-Entry must be defined in Gearbox!");
+			}
+
+			SetDeclarationData(retVal);
+
+			var gearDifferenceRatio = gearbox.Type.AutomaticTransmission() && gearbox.Gears.Count > 2
+				? gearbox.Gears[0].Ratio / gearbox.Gears[1].Ratio
+				: 1.0;
+
+			var gears = new Dictionary<uint, GearData>();
+			var tcShiftPolygon = DeclarationData.TorqueConverter.ComputeShiftPolygon(engine.FullLoadCurves[0]);
+			var vehicleCategory = runData.VehicleData.VehicleCategory == VehicleCategory.GenericBusVehicle
+				? VehicleCategory.GenericBusVehicle
+				: inputData.VehicleCategory;
+			for (uint i = 0; i < gearsInput.Count; i++)
+			{
+				var gear = gearsInput[(int)i];
+				var lossMap = CreateGearLossMap(gear, i, false, vehicleCategory, gearbox.Type);
+
+				var shiftPolygon = shiftPolygonCalculator != null
+					? shiftPolygonCalculator.ComputeDeclarationShiftPolygon(
+						gearbox.Type, (int)i, engine.FullLoadCurves[i + 1], gearbox.Gears, engine, axlegearRatio,
+						dynamicTyreRadius)
+					: DeclarationData.Gearbox.ComputeShiftPolygon(
+						gearbox.Type, (int)i, engine.FullLoadCurves[i + 1],
+						gearsInput, engine,
+						axlegearRatio, dynamicTyreRadius, null);
+
+				var gearData = new GearData
+				{
+					ShiftPolygon = shiftPolygon,
+					MaxSpeed = gear.MaxInputSpeed,
+					MaxTorque = gear.MaxTorque,
+					Ratio = gear.Ratio,
+					LossMap = lossMap,
+				};
+
+				CreateATGearData(gearbox, i, gearData, tcShiftPolygon, gearDifferenceRatio, gears,
+					runData.VehicleData.VehicleCategory);
+				gears.Add(i + 1, gearData);
+			}
+
+			// remove disabled gears (only the last or last two gears may be removed)
+			if (inputData.TorqueLimits != null)
+			{
+				var toRemove = (from tqLimit in inputData.TorqueLimits
+								where tqLimit.Gear >= gears.Keys.Max() - 1 && tqLimit.MaxTorque.IsEqual(0)
+								select (uint)tqLimit.Gear).ToList();
+				if (toRemove.Count > 0 && toRemove.Min() <= gears.Count - toRemove.Count)
+				{
+					throw new VectoException(
+						"Only the last 1 or 2 gears can be disabled. Disabling gear {0} for a {1}-speed gearbox is not allowed.",
+						toRemove.Min(), gears.Count);
+				}
+
+				foreach (var entry in toRemove)
+				{
+					gears.Remove(entry);
+				}
+			}
+
+			retVal.Gears = gears;
+			if (retVal.Type.AutomaticTransmission())
+			{
+				var ratio = double.IsNaN(retVal.Gears[1].Ratio)
+					? 1
+					: retVal.Gears[1].TorqueConverterRatio / retVal.Gears[1].Ratio;
+				retVal.PowershiftShiftTime = DeclarationData.Gearbox.PowershiftShiftTime;
+
+				retVal.TorqueConverterData =
+					_torqueConverterDataAdapter.CreateTorqueConverterData(gearbox.Type, torqueConverter, ratio, engine);
+
+				if (torqueConverter != null)
+				{
+					retVal.TorqueConverterData.Manufacturer = torqueConverter.Manufacturer;
+					retVal.TorqueConverterData.ModelName = torqueConverter.Model;
+					retVal.TorqueConverterData.DigestValueInput = torqueConverter.DigestValue?.DigestValue;
+					retVal.TorqueConverterData.CertificationMethod = torqueConverter.CertificationMethod;
+					retVal.TorqueConverterData.CertificationNumber = torqueConverter.CertificationNumber;
+					retVal.TorqueConverterData.Date = torqueConverter.Date;
+					retVal.TorqueConverterData.AppVersion = torqueConverter.AppVersion;
+				}
+			}
+
+			// update disengageWhenHaltingSpeed
+			if (retVal.Type.AutomaticTransmission())
+			{
+				var firstGear = retVal.GearList.First(x => x.IsLockedGear());
+				if (retVal.Gears[firstGear.Gear].ShiftPolygon.Downshift.Any())
+				{
+					var downshiftSpeedInc = retVal.Gears[firstGear.Gear].ShiftPolygon
+						.InterpolateDownshiftSpeed(0.SI<NewtonMeter>()) * 1.05;
+					var vehicleSpeedDisengage =
+						downshiftSpeedInc / axlegearRatio / retVal.Gears[firstGear.Gear].Ratio *
+						dynamicTyreRadius;
+					retVal.DisengageWhenHaltingSpeed = vehicleSpeedDisengage;
+				}
+			}
+
+			return retVal;
+		}
+
+		#endregion
+	}
+}
\ No newline at end of file
diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/PTODataAdapter.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/PTODataAdapter.cs
new file mode 100644
index 0000000000..49f5ba3741
--- /dev/null
+++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/PTODataAdapter.cs
@@ -0,0 +1,40 @@
+using TUGraz.VectoCommon.InputData;
+using TUGraz.VectoCore.InputData.Reader.ComponentData;
+using TUGraz.VectoCore.Models.SimulationComponent.Data;
+
+namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponents
+{
+	public interface IPTODataAdapter
+	{
+		PTOData CreatePTOTransmissionData(IPTOTransmissionInputData pto);
+	}
+
+	public class PTODataAdapterLorry : IPTODataAdapter
+	{
+		public PTOData CreatePTOTransmissionData(IPTOTransmissionInputData pto)
+		{
+			if (pto != null && pto.PTOTransmissionType != "None")
+			{
+				return new PTOData
+				{
+					TransmissionType = pto.PTOTransmissionType,
+					LossMap = PTOIdleLossMapReader.GetZeroLossMap(),
+				};
+			}
+
+			return null;
+		}
+	}
+
+	public class PTODataAdapterBus : IPTODataAdapter
+	{
+		#region Implementation of IPTODataAdapter
+
+		public PTOData CreatePTOTransmissionData(IPTOTransmissionInputData pto)
+		{
+			return null;
+		}
+
+		#endregion
+	}
+}
\ No newline at end of file
diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/RetarderDataAdapter.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/RetarderDataAdapter.cs
new file mode 100644
index 0000000000..9461ddf32f
--- /dev/null
+++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/RetarderDataAdapter.cs
@@ -0,0 +1,88 @@
+using System;
+using TUGraz.VectoCommon.Exceptions;
+using TUGraz.VectoCommon.InputData;
+using TUGraz.VectoCommon.Models;
+using TUGraz.VectoCommon.Utils;
+using TUGraz.VectoCore.InputData.Reader.ComponentData;
+using TUGraz.VectoCore.Models.Declaration;
+using TUGraz.VectoCore.Models.SimulationComponent.Data;
+
+namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponents
+{
+	public interface IRetarderDataAdapter
+	{
+		RetarderData CreateRetarderData(IRetarderInputData retarder);
+	}
+	public class RetarderDataAdapter : IRetarderDataAdapter
+	{
+		public RetarderData CreateRetarderData(IRetarderInputData retarder)
+		{
+			return SetCommonRetarderData(retarder);
+		}
+		internal static RetarderData SetCommonRetarderData(IRetarderInputData retarderInputData,
+			PowertrainPosition position = PowertrainPosition.HybridPositionNotSet)
+		{
+			try
+			{
+				var retarder = new RetarderData { Type = retarderInputData.Type };
+
+				switch (retarder.Type)
+				{
+					case RetarderType.TransmissionInputRetarder:
+					case RetarderType.TransmissionOutputRetarder:
+						if (!(position.IsParallelHybrid() || position.IsOneOf(PowertrainPosition.HybridPositionNotSet, PowertrainPosition.BatteryElectricE2)))
+						{
+							throw new ArgumentException("Transmission retarder is only allowed in powertrains that " +
+														"contain a gearbox: Conventional, HEV-P, and PEV-E2.", nameof(retarder));
+						}
+
+						retarder.LossMap = RetarderLossMapReader.Create(retarderInputData.LossMap);
+						retarder.Ratio = retarderInputData.Ratio;
+						break;
+
+					case RetarderType.AxlegearInputRetarder:
+						if (position != PowertrainPosition.BatteryElectricE3)
+							throw new ArgumentException("AxlegearInputRetarder is only allowed for PEV-E3, HEV-S3, S-IEPC, E-IEPC. ", nameof(retarder));
+						retarder.LossMap = RetarderLossMapReader.Create(retarderInputData.LossMap);
+						retarder.Ratio = retarderInputData.Ratio;
+						break;
+
+					case RetarderType.None:
+					case RetarderType.LossesIncludedInTransmission:
+					case RetarderType.EngineRetarder:
+						retarder.Ratio = 1;
+						break;
+
+					default:
+						throw new ArgumentOutOfRangeException(nameof(retarder), retarder.Type, "RetarderType unknown");
+				}
+
+				if (retarder.Type.IsDedicatedComponent())
+				{
+					retarder.SavedInDeclarationMode = retarderInputData.SavedInDeclarationMode;
+					retarder.Manufacturer = retarderInputData.Manufacturer;
+					retarder.ModelName = retarderInputData.Model;
+					retarder.Date = retarderInputData.Date;
+					retarder.CertificationMethod = retarderInputData.CertificationMethod;
+					retarder.CertificationNumber = retarderInputData.CertificationNumber;
+					retarder.DigestValueInput = retarderInputData.DigestValue != null ? retarderInputData.DigestValue.DigestValue : "";
+				}
+
+				return retarder;
+			}
+			catch (Exception e)
+			{
+				throw new VectoException("Error while Reading Retarder Data: {0}", e.Message);
+			}
+		}
+	}
+
+	public class GenericRetarderDataAdapter : IRetarderDataAdapter
+	{
+		private readonly GenericBusRetarderData _genericRetarderData = new GenericBusRetarderData();
+		public  RetarderData CreateRetarderData(IRetarderInputData retarder)
+		{
+			return _genericRetarderData.CreateGenericBusRetarderData(retarder);
+		}
+	}
+}
\ No newline at end of file
diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/TorqueConverterDataAdapter.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/TorqueConverterDataAdapter.cs
new file mode 100644
index 0000000000..eb7d615599
--- /dev/null
+++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/TorqueConverterDataAdapter.cs
@@ -0,0 +1,53 @@
+using TUGraz.VectoCommon.InputData;
+using TUGraz.VectoCommon.Models;
+using TUGraz.VectoCore.InputData.Reader.ComponentData;
+using TUGraz.VectoCore.Models.Declaration;
+using TUGraz.VectoCore.Models.SimulationComponent.Data;
+using TUGraz.VectoCore.Models.SimulationComponent.Data.Gearbox;
+
+namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponents
+{
+	public interface ITorqueConverterDataAdapter
+	{
+		TorqueConverterData CreateTorqueConverterData(GearboxType gearboxType,
+			ITorqueConverterDeclarationInputData torqueConverter, double ratio,
+			CombustionEngineData engineData);
+	}
+	public class TorqueConverterDataAdapter : ITorqueConverterDataAdapter
+	{
+		public virtual TorqueConverterData CreateTorqueConverterData(GearboxType gearboxType,
+			ITorqueConverterDeclarationInputData torqueConverter, double ratio,
+			CombustionEngineData engineData)
+		{
+			return TorqueConverterDataReader.Create(
+				torqueConverter.TCData,
+				DeclarationData.TorqueConverter.ReferenceRPM, DeclarationData.TorqueConverter.MaxInputSpeed,
+				ExecutionMode.Declaration, ratio,
+				DeclarationData.TorqueConverter.CLUpshiftMinAcceleration,
+				DeclarationData.TorqueConverter.CCUpshiftMinAcceleration);
+		}
+	}
+
+	public class GenericCompletedBusTorqueConverterDataAdapter : ITorqueConverterDataAdapter
+	{
+		private readonly GenericTorqueConverterData _genericTorqueConverterData = new GenericTorqueConverterData();
+		#region Implementation of ITorqueConverterDataAdapter
+
+		public TorqueConverterData CreateTorqueConverterData(GearboxType gearboxType,
+			ITorqueConverterDeclarationInputData torqueConverter, double ratio, CombustionEngineData engineData)
+		{
+			if (torqueConverter != null && torqueConverter.TCData != null)
+			{
+				return TorqueConverterDataReader.Create(
+					torqueConverter.TCData,
+					DeclarationData.TorqueConverter.ReferenceRPM, DeclarationData.TorqueConverter.MaxInputSpeed,
+					ExecutionMode.Engineering, ratio,
+					DeclarationData.TorqueConverter.CLUpshiftMinAcceleration,
+					DeclarationData.TorqueConverter.CCUpshiftMinAcceleration);
+			}
+			return _genericTorqueConverterData.CreateTorqueConverterData(gearboxType, ratio, engineData);
+		}
+
+		#endregion
+	}
+}
\ No newline at end of file
diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/VehicleDataAdapter.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/VehicleDataAdapter.cs
new file mode 100644
index 0000000000..669bdec7ec
--- /dev/null
+++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/VehicleDataAdapter.cs
@@ -0,0 +1,247 @@
+
+using System.Collections.Generic;
+using System.Linq;
+using TUGraz.VectoCommon.Exceptions;
+using TUGraz.VectoCommon.InputData;
+using TUGraz.VectoCommon.Models;
+using TUGraz.VectoCommon.Utils;
+using TUGraz.VectoCore.Models.Declaration;
+using TUGraz.VectoCore.Models.SimulationComponent.Data;
+using TUGraz.VectoCore.Utils;
+
+namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponents
+{
+	public interface IVehicleDataAdapter
+	{
+		VehicleData CreateVehicleData(IVehicleDeclarationInputData data, Segment segment, Mission mission,
+			Kilogram loading, double? passengerCount, bool allowVocational);
+		VehicleData CreateExemptedVehicleData(IVehicleDeclarationInputData data);
+	}
+    internal abstract class VehicleDataAdapter : ComponentDataAdapterBase, IVehicleDataAdapter
+	{
+		public static NewtonMeter VehMaxTorque(
+			ITransmissionInputData gear, int numGears,
+			Dictionary<int, ITorqueLimitInputData> limits,
+			NewtonMeter maxEngineTorque)
+		{
+			if (gear.Gear - 1 >= numGears / 2)
+			{
+				// only upper half of gears can limit if max-torque <= 0.95 of engine max torque
+				if (limits.TryGetValue(gear.Gear, out var limit) && limit.MaxTorque <=
+					DeclarationData.Engine.TorqueLimitVehicleFactor * maxEngineTorque)
+				{
+					return limit.MaxTorque;
+				}
+			}
+
+			return null;
+		}
+		protected readonly IADASDataAdapter _adasDataAdapter = new ADASDataAdapter();
+		internal static VehicleData SetCommonVehicleData(IVehicleDeclarationInputData data)
+		{
+			var retVal = new VehicleData
+			{
+				InputData = data,
+				SavedInDeclarationMode = data.SavedInDeclarationMode,
+				Manufacturer = data.Manufacturer,
+				ModelName = data.Model,
+				Date = data.Date,
+				//CertificationNumber = data.CertificationNumber,
+				DigestValueInput = data.DigestValue != null ? data.DigestValue.DigestValue : "",
+				VehicleCategory = data.VehicleCategory,
+				CurbMass = data.CurbMassChassis,
+				GrossVehicleMass = data.GrossVehicleMassRating,
+				AirDensity = Physics.AirDensity,
+			};
+
+			return retVal;
+		}
+
+
+		#region Implementation of IVehicleDataAdapter
+
+		public VehicleData CreateVehicleData(IVehicleDeclarationInputData data,
+			Segment segment,
+			Mission mission,
+			Kilogram loading,
+			double? passengerCount,
+			bool allowVocational)
+		{
+			CheckDeclarationMode(data, "Vehicle");
+			return DoCreateVehicleData(data, segment, mission, loading, passengerCount, allowVocational);
+		}
+		protected abstract VehicleData DoCreateVehicleData(IVehicleDeclarationInputData data,
+			Segment segment,
+			Mission mission,
+			Kilogram loading,
+			double? passengerCount,
+			bool allowVocational);
+
+		public VehicleData CreateExemptedVehicleData(IVehicleDeclarationInputData data)
+		{
+			CheckDeclarationMode(data, "Vehicle");
+			return DoCreateExemptedVehicleData(data);
+		}
+
+		protected abstract VehicleData DoCreateExemptedVehicleData(IVehicleDeclarationInputData data);
+
+		#endregion
+	}
+
+	internal class LorryVehicleDataAdapter : VehicleDataAdapter
+	{
+		protected override VehicleData DoCreateVehicleData(IVehicleDeclarationInputData data,
+			Segment segment, Mission mission, Kilogram loading, double? passengerCount, bool allowVocational)
+		{
+			var retVal = SetCommonVehicleData(data);
+			retVal.LegislativeClass = data.LegislativeClass;
+			retVal.AxleConfiguration = data.AxleConfiguration;
+			retVal.AirDensity = DeclarationData.AirDensity;
+			retVal.VIN = data.VIN;
+			retVal.ManufacturerAddress = data.ManufacturerAddress;
+			//			retVal.LegislativeClass = data.LegislativeClass;
+			retVal.ZeroEmissionVehicle = data.ZeroEmissionVehicle;
+			retVal.VehicleClass = segment.VehicleClass;
+			retVal.SleeperCab = retVal.VehicleClass.IsMediumLorry() ? false : data.SleeperCab;
+			retVal.TrailerGrossVehicleMass = mission.Trailer.Sum(t => t.TrailerGrossVehicleWeight).DefaultIfNull(0);
+
+			retVal.BodyAndTrailerMass =
+				mission.BodyCurbWeight + mission.Trailer.Sum(t => t.TrailerCurbWeight).DefaultIfNull(0);
+
+			retVal.Loading = loading;
+			retVal.PassengerCount = passengerCount;
+			retVal.DynamicTyreRadius =
+				data.Components.AxleWheels.AxlesDeclaration.Where(axle => axle.AxleType == AxleType.VehicleDriven)
+					.Select(da => DeclarationData.Wheels.Lookup(da.Tyre.Dimension).DynamicTyreRadius)
+					.Average();
+			if (segment.VehicleClass.IsMediumLorry() && segment.VehicleClass.IsVan())
+			{
+				retVal.CargoVolume = data.CargoVolume;
+			}
+			else
+			{
+				retVal.CargoVolume = mission.MissionType != MissionType.Construction
+					? mission.TotalCargoVolume
+					: 0.SI<CubicMeter>();
+			}
+
+			retVal.VocationalVehicle = allowVocational && data.VocationalVehicle;
+			retVal.ADAS = _adasDataAdapter.CreateADAS(data.ADAS);
+
+			var axles = data.Components.AxleWheels.AxlesDeclaration;
+			if (axles.Count < mission.AxleWeightDistribution.Length)
+			{
+				throw new VectoException(
+					"Vehicle does not contain sufficient axles. {0} axles defined, {1} axles required",
+					axles.Count, mission.AxleWeightDistribution.Length);
+			}
+
+			var axleData = new List<Axle>();
+			for (var i = 0; i < mission.AxleWeightDistribution.Length; i++)
+			{
+				var axleInput = axles[i];
+				var axle = new Axle
+				{
+					WheelsDimension = axleInput.Tyre.Dimension,
+					AxleType = axleInput.AxleType,
+					AxleWeightShare = mission.AxleWeightDistribution[i],
+					TwinTyres = axleInput.TwinTyres,
+					RollResistanceCoefficient = axleInput.Tyre.RollResistanceCoefficient,
+					TyreTestLoad = axleInput.Tyre.TyreTestLoad,
+					FuelEfficiencyClass = axleInput.Tyre.FuelEfficiencyClass,
+					Inertia = DeclarationData.Wheels.Lookup(axleInput.Tyre.Dimension.RemoveWhitespace()).Inertia,
+					CertificationNumber = axleInput.Tyre.CertificationNumber,
+					DigestValueInput = axleInput.Tyre.DigestValue == null
+						? ""
+						: axleInput.Tyre.DigestValue.DigestValue,
+				};
+				axleData.Add(axle);
+			}
+
+			foreach (var trailer in mission.Trailer)
+			{
+				axleData.AddRange(
+					trailer.TrailerWheels.Select(
+						trailerWheel => new Axle
+						{
+							AxleType = AxleType.Trailer,
+							AxleWeightShare = trailer.TrailerAxleWeightShare / trailer.TrailerWheels.Count,
+							TwinTyres = DeclarationData.Trailer.TwinTyres,
+							RollResistanceCoefficient = DeclarationData.Trailer.RollResistanceCoefficient,
+							TyreTestLoad = DeclarationData.Trailer.TyreTestLoad.SI<Newton>(),
+							FuelEfficiencyClass = DeclarationData.Trailer.FuelEfficiencyClass,
+							Inertia = trailerWheel.Inertia,
+							WheelsDimension = trailerWheel.WheelType
+						}));
+			}
+
+			retVal.AxleData = axleData;
+			return retVal;
+		}
+
+		protected override VehicleData DoCreateExemptedVehicleData(IVehicleDeclarationInputData data)
+		{
+			var exempted = SetCommonVehicleData(data);
+			exempted.VIN = data.VIN;
+			exempted.ManufacturerAddress = data.ManufacturerAddress;
+			exempted.LegislativeClass = data.LegislativeClass;
+			exempted.ZeroEmissionVehicle = data.ZeroEmissionVehicle;
+			exempted.HybridElectricHDV = data.HybridElectricHDV;
+			exempted.DualFuelVehicle = data.DualFuelVehicle;
+			exempted.MaxNetPower1 = data.MaxNetPower1;
+			exempted.MaxNetPower2 = data.MaxNetPower2;
+			return exempted;
+		}
+	}
+
+
+	internal class PrimaryBusVehicleDataAdapter : LorryVehicleDataAdapter
+	{
+		#region Overrides of VehicleDataAdapter
+
+		protected override VehicleData DoCreateVehicleData(IVehicleDeclarationInputData data, Segment segment, Mission mission, Kilogram loading,
+			double? passengerCount, bool allowVocational)
+		{
+			var retVal = base.CreateVehicleData(data, segment, mission, loading, passengerCount, allowVocational);
+			if (data.ExemptedVehicle)
+			{ 
+				System.Diagnostics.Debug.Assert( false, "CreateExemptedVehicleData should be used");
+				return retVal;
+			}
+			retVal.CurbMass = mission.CurbMass;
+			retVal.GrossVehicleMass = 40000.SI<Kilogram>();
+			return retVal;
+		}
+
+		#endregion
+
+		protected override VehicleData DoCreateExemptedVehicleData(IVehicleDeclarationInputData data)
+		{
+			var exempted = new VehicleData
+			{
+				InputData = data,
+				SavedInDeclarationMode = data.SavedInDeclarationMode,
+				Manufacturer = data.Manufacturer,
+				ModelName = data.Model,
+				Date = data.Date,
+				//CertificationNumber = data.CertificationNumber,
+				DigestValueInput = data.DigestValue != null ? data.DigestValue.DigestValue : "",
+				VehicleCategory = data.VehicleCategory,
+				//CurbMass = data.CurbMassChassis,
+				GrossVehicleMass = data.GrossVehicleMassRating,
+				AirDensity = Physics.AirDensity,
+			};
+			exempted.VIN = data.VIN;
+			exempted.ManufacturerAddress = data.ManufacturerAddress;
+			exempted.LegislativeClass = data.LegislativeClass;
+			exempted.ZeroEmissionVehicle = data.ZeroEmissionVehicle;
+			exempted.HybridElectricHDV = data.HybridElectricHDV;
+			exempted.DualFuelVehicle = data.DualFuelVehicle;
+			exempted.MaxNetPower1 = data.MaxNetPower1;
+			exempted.MaxNetPower2 = data.MaxNetPower2;
+			exempted.AxleConfiguration = data.AxleConfiguration;
+			return exempted;
+		}
+
+	}
+}
diff --git a/VectoCore/VectoCore/InputData/Reader/VectoRunDataFactoryFactory.cs b/VectoCore/VectoCore/InputData/Reader/VectoRunDataFactoryFactory.cs
index bc24206808..73e944e9c2 100644
--- a/VectoCore/VectoCore/InputData/Reader/VectoRunDataFactoryFactory.cs
+++ b/VectoCore/VectoCore/InputData/Reader/VectoRunDataFactoryFactory.cs
@@ -16,7 +16,7 @@ namespace TUGraz.VectoCore.InputData.Reader
 {
 	public interface IInternalRunDataFactoryFactory
 	{
-
+		IVectoRunDataFactory CreateSingleBusRunDataFactory();
 		IVectoRunDataFactory CreateDeclarationRunDataFactory(VehicleTypeAndArchitectureStringHelperRundata.VehicleClassification vehicleClassification,
 			IDeclarationInputDataProvider dataProvider,
 			IDeclarationReport report);
@@ -119,7 +119,8 @@ namespace TUGraz.VectoCore.InputData.Reader
 
 		private IVectoRunDataFactory CreateRunDataReader(ISingleBusInputDataProvider singleBusProvider, IDeclarationReport report)
 		{
-			return new DeclarationModeSingleBusVectoRunDataFactory(singleBusProvider, report);
+			throw new NotImplementedException();
+			//return new DeclarationModeSingleBusVectoRunDataFactory(singleBusProvider, report);
 		}
 
 
diff --git a/VectoCore/VectoCore/InputData/Reader/VectoRunDataFactoryNinjectModule.cs b/VectoCore/VectoCore/InputData/Reader/VectoRunDataFactoryNinjectModule.cs
index 85c9413168..c40b0149f0 100644
--- a/VectoCore/VectoCore/InputData/Reader/VectoRunDataFactoryNinjectModule.cs
+++ b/VectoCore/VectoCore/InputData/Reader/VectoRunDataFactoryNinjectModule.cs
@@ -33,27 +33,13 @@ namespace TUGraz.VectoCore.InputData.Reader
 					() => new CombineArgumentsToNameInstanceProvider(
 							new CombineArgumentsToNameInstanceProvider.MethodSettings() {
 								combineToNameDelegate = _vehicleStringHelper.CreateName,
-								methods = new [] {
+								methods = new [] { 
 									typeof(IInternalRunDataFactoryFactory)
 										.GetMethod(nameof(IInternalRunDataFactoryFactory
-											.CreateDeclarationRunDataFactory),
-											new []
-											{
-												typeof(VehicleTypeAndArchitectureStringHelperRundata.VehicleClassification),
-												typeof(IDeclarationInputDataProvider),
-												typeof(IDeclarationReport)
-											}
-										),
+											.CreateDeclarationRunDataFactory)), 
 									typeof(IInternalRunDataFactoryFactory)
 										.GetMethod(nameof(IInternalRunDataFactoryFactory
-											.CreateDeclarationCompletedBusRunDataFactory)//, 
-											//new []
-											//{
-											//	typeof(VehicleTypeAndArchitectureStringHelperRundata.VehicleClassification),
-											//	typeof(IDeclarationInputDataProvider),
-											//	typeof(IDeclarationReport)
-											//}
-											)
+											.CreateDeclarationCompletedBusRunDataFactory))
 								},
 								skipArguments = 1,
 								takeArguments = 1,
diff --git a/VectoCore/VectoCore/Models/BusAuxiliaries/DownstreamModules/Impl/Electrics/ElectricsUserInputsConfig.cs b/VectoCore/VectoCore/Models/BusAuxiliaries/DownstreamModules/Impl/Electrics/ElectricsUserInputsConfig.cs
index e8fd9298b6..86610f8f3f 100644
--- a/VectoCore/VectoCore/Models/BusAuxiliaries/DownstreamModules/Impl/Electrics/ElectricsUserInputsConfig.cs
+++ b/VectoCore/VectoCore/Models/BusAuxiliaries/DownstreamModules/Impl/Electrics/ElectricsUserInputsConfig.cs
@@ -16,9 +16,7 @@ using Newtonsoft.Json;
 using TUGraz.VectoCommon.BusAuxiliaries;
 using TUGraz.VectoCommon.Models;
 using TUGraz.VectoCommon.Utils;
-using TUGraz.VectoCore.InputData.Reader.DataObjectAdapter;
-using TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.PrimaryBus;
-using TUGraz.VectoCore.Models.BusAuxiliaries.Interfaces.DownstreamModules.Electrics;
+using TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponents;
 
 namespace TUGraz.VectoCore.Models.BusAuxiliaries.DownstreamModules.Impl.Electrics
 {
@@ -41,7 +39,7 @@ namespace TUGraz.VectoCore.Models.BusAuxiliaries.DownstreamModules.Impl.Electric
 		public AlternatorType AlternatorType { get; set; }
 
 		[JsonIgnore]
-		public Dictionary<string, ElectricConsumerEntry> ElectricalConsumers { get; set; }
+		public Dictionary<string, AuxiliaryDataAdapter.ElectricConsumerEntry> ElectricalConsumers { get; set; }
 
 		public string[] ElectricalConsumersSerialized
 		{
diff --git a/VectoCore/VectoCore/VectoCore.csproj b/VectoCore/VectoCore/VectoCore.csproj
index 65670ee07e..161fb79169 100644
--- a/VectoCore/VectoCore/VectoCore.csproj
+++ b/VectoCore/VectoCore/VectoCore.csproj
@@ -134,7 +134,6 @@
 
   <ItemGroup>
     <Folder Include="InputData\Reader\DataObjectAdapter\CompletedBus\Generic\" />
-    <Folder Include="InputData\Reader\DataObjectAdapter\SimulationComponents\" />
   </ItemGroup>
 
 </Project>
\ No newline at end of file
diff --git a/VectoCore/VectoCoreTest/InputData/RunDataFactory/RunDataFactoryFactoryTest.cs b/VectoCore/VectoCoreTest/InputData/RunDataFactory/RunDataFactoryFactoryTest.cs
index f38a4d8a33..a48fe62e1d 100644
--- a/VectoCore/VectoCoreTest/InputData/RunDataFactory/RunDataFactoryFactoryTest.cs
+++ b/VectoCore/VectoCoreTest/InputData/RunDataFactory/RunDataFactoryFactoryTest.cs
@@ -1,5 +1,6 @@
 using System;
 using System.Collections.Generic;
+using System.ComponentModel.Design;
 using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
@@ -16,7 +17,6 @@ using TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.CompletedBus.Generic;
 using TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.CompletedBus.Specific;
 using TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.HeavyLorry;
 using TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.PrimaryBus;
-using TUGraz.VectoCore.InputData.Reader.Impl;
 using TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.CompletedBusRunDataFactory;
 using TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.HeavyLorryRunDataFactory;
 using TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.PrimaryBusRunDataFactory;
@@ -24,6 +24,7 @@ using TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.PrimaryBusRunDataFa
 namespace TUGraz.VectoCore.Tests.InputData.RunDataFactory
 {
     [TestFixture]
+	[Parallelizable(ParallelScope.All)]
     internal class RunDataFactoryFactoryTest
 	{
 		private IVectoRunDataFactoryFactory _runDataFactoryFactory;
@@ -221,7 +222,7 @@ namespace TUGraz.VectoCore.Tests.InputData.RunDataFactory
 		}
 
 		[Test]
-		public void Exempted_HeavyLorryTest([Values]ArchitectureID architectureId, [Values]VectoSimulationJobType simType)
+		public void Exempted_HeavyLorryTest([Values]ArchitectureID architectureId, [Values]VectoSimulationJobType simType, [Values]bool checkDeclarationDataAdapter)
 		{
 			var input = new Mock<IDeclarationInputDataProvider>()
 				.Exempted()
@@ -229,7 +230,8 @@ namespace TUGraz.VectoCore.Tests.InputData.RunDataFactory
 
 			input.Setup(m => m.JobInputData.JobType).Returns(simType);
 			input.Setup(m => m.JobInputData.Vehicle.ArchitectureID).Returns(architectureId);
-			CreateRunDataFactory(input, typeof(DeclarationModeHeavyLorryRunDataFactory.Exempted), null);
+			CreateRunDataFactory(input, typeof(DeclarationModeHeavyLorryRunDataFactory.Exempted), 
+				checkDeclarationDataAdapter ? typeof(DeclarationDataAdapterHeavyLorry.Exempted) : null);
 
 		}
 
@@ -380,7 +382,7 @@ namespace TUGraz.VectoCore.Tests.InputData.RunDataFactory
 
 
 		[Test]
-		public void Exempted_PrimaryBusTest([Values] ArchitectureID architectureId, [Values] VectoSimulationJobType simType)
+		public void Exempted_PrimaryBusTest([Values] ArchitectureID architectureId, [Values] VectoSimulationJobType simType, [Values] bool checkDeclarationDataAdapter)
 		{
 			var input = new Mock<IDeclarationInputDataProvider>()
 				.Exempted()
@@ -388,7 +390,7 @@ namespace TUGraz.VectoCore.Tests.InputData.RunDataFactory
 
 			input.Setup(m => m.JobInputData.JobType).Returns(simType);
 			input.Setup(m => m.JobInputData.Vehicle.ArchitectureID).Returns(architectureId);
-			CreateRunDataFactory(input, typeof(DeclarationModePrimaryBusRunDataFactory.Exempted), null);
+			CreateRunDataFactory(input, typeof(DeclarationModePrimaryBusRunDataFactory.Exempted), checkDeclarationDataAdapter ? typeof(DeclarationDataAdapterPrimaryBus.Exempted) : null);
 
 		}
 
-- 
GitLab