From 13a0c96711ce38fd6d102871a3e94e0389581509 Mon Sep 17 00:00:00 2001
From: "VKMTHD\\haraldmartini" <harald.martini@student.tugraz.at>
Date: Tue, 13 Sep 2022 18:13:42 +0200
Subject: [PATCH] added HybridStrategyParameterDataAdapter, BatteryDataAdapter,
 ElectricMachinesDataAdapter

---
 .../InputData/DeclarationInputData.cs         |   2 +-
 .../VectoCommon/Models/VehicleCategory.cs     |   5 +-
 .../FileIO/JSON/JSONComponentInputData.cs     |   2 +-
 .../InputData/FileIO/JSON/JSONVehicleData.cs  |   6 +-
 .../XMLDeclarationVehicleDataProvider.cs      |  10 +-
 ...ectricStorageSystemDeclarationInputData.cs |  15 +-
 ...eclarationHeavyLorryVehicleDataProvider.cs |   2 +-
 .../XMLDeclarationMultistageInputReader.cs    |   2 +-
 .../XMLEngineeringVehicleDataProvider.cs      |   2 +-
 .../EngineeringDataAdapter.cs                 |  10 +-
 .../DeclarationDataAdapterHeavyLorry.cs       | 118 ++++++-
 .../DeclarationDataAdapterHeavyLorry_old.cs   | 104 -------
 .../IDeclarationDataAdapter.cs                |  12 +-
 .../DeclarationDataAdapterPrimaryBus.cs       |  68 ++++-
 .../AuxiliaryDataAdapter.cs                   |   3 +
 .../BatteryDataAdapter.cs                     | 137 +++++++++
 .../ElectricMachinesDataAdapter.cs            | 288 ++++++++++++++++++
 .../SimulationComponents/EngineDataAdapter.cs |  11 +-
 .../RetarderDataAdapter.cs                    |   6 +-
 .../HybridStrategyParameterDataAdapter.cs     |  62 ++++
 .../VehicleDataAdapter.cs                     |   1 +
 .../DeclarationDataAdapterSingleBus.cs        |   4 +-
 ...DeclarationModeHeavyLorryRunDataFactory.cs | 215 +++++++------
 ...tionModeHeavyLorryRunDataFactory_Hybrid.cs | 155 ++++++++++
 ...DeclarationModePrimaryBusRunDataFactory.cs | 201 ++++++++----
 .../Models/Declaration/DeclarationData.cs     |  19 +-
 .../Models/Simulation/Data/VectoRunData.cs    |   4 +-
 .../Data/ElectricMotor/ElectricMotorData.cs   |   2 +-
 .../SimulationComponent/Impl/ElectricMotor.cs |   2 +-
 .../VIFElectricMotorTorqueLimitsType.cs       |   2 +-
 ...CombineArgumentsToNameInstanceProviders.cs |   2 +-
 .../VehicleTypeAndArchitectureStringHelper.cs |  10 +
 VectoCore/VectoCore/VectoCore.csproj          |   1 +
 .../Integration/Hybrid/SerialHybridTest.cs    |  12 +-
 .../Utils/MockDeclarationVehicleInputData.cs  |   4 +-
 .../Utils/MockSimulationDataFactory.cs        |  25 +-
 .../Utils/MockVehicleInputData.cs             |   2 +-
 37 files changed, 1177 insertions(+), 349 deletions(-)
 delete mode 100644 VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/DeclarationDataAdapterHeavyLorry_old.cs
 create mode 100644 VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/BatteryDataAdapter.cs
 create mode 100644 VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/ElectricMachinesDataAdapter.cs
 create mode 100644 VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/StrategyDataAdapter/HybridStrategyParameterDataAdapter.cs
 create mode 100644 VectoCore/VectoCore/InputData/Reader/Impl/DeclarationMode/HeavyLorryRunDataFactory/DeclarationModeHeavyLorryRunDataFactory_Hybrid.cs

diff --git a/VectoCommon/VectoCommon/InputData/DeclarationInputData.cs b/VectoCommon/VectoCommon/InputData/DeclarationInputData.cs
index f883e870b8..96f9a73011 100644
--- a/VectoCommon/VectoCommon/InputData/DeclarationInputData.cs
+++ b/VectoCommon/VectoCommon/InputData/DeclarationInputData.cs
@@ -196,7 +196,7 @@ namespace TUGraz.VectoCommon.InputData
 
 		VehicleDeclarationType VehicleDeclarationType { get; }
 
-		Dictionary<PowertrainPosition, List<Tuple<Volt, TableData>>> ElectricMotorTorqueLimits { get; }
+		IDictionary<PowertrainPosition, IList<Tuple<Volt, TableData>>> ElectricMotorTorqueLimits { get; }
 		
 		TableData BoostingLimitations { get; }
 
diff --git a/VectoCommon/VectoCommon/Models/VehicleCategory.cs b/VectoCommon/VectoCommon/Models/VehicleCategory.cs
index 7ebef4a669..73b19f61e3 100644
--- a/VectoCommon/VectoCommon/Models/VehicleCategory.cs
+++ b/VectoCommon/VectoCommon/Models/VehicleCategory.cs
@@ -73,6 +73,7 @@ namespace TUGraz.VectoCommon.Models
 			switch (category) {
 				case VehicleCategory.RigidTruck:
 				case VehicleCategory.Tractor:
+				case VehicleCategory.Van:
 					return Lorry;
 					break;
 				case VehicleCategory.HeavyBusPrimaryVehicle:
@@ -81,8 +82,8 @@ namespace TUGraz.VectoCommon.Models
 				case VehicleCategory.HeavyBusCompletedVehicle:
 					return CompletedBus;
 					break;
-				case VehicleCategory.Van:
-					return Van;
+				//case VehicleCategory.Van:
+				//	return Van;
 				default:
 					return category.GetLabel();
 			}
diff --git a/VectoCore/VectoCore/InputData/FileIO/JSON/JSONComponentInputData.cs b/VectoCore/VectoCore/InputData/FileIO/JSON/JSONComponentInputData.cs
index a0c64f7b78..1e677dedb0 100644
--- a/VectoCore/VectoCore/InputData/FileIO/JSON/JSONComponentInputData.cs
+++ b/VectoCore/VectoCore/InputData/FileIO/JSON/JSONComponentInputData.cs
@@ -261,7 +261,7 @@ namespace TUGraz.VectoCore.InputData.FileIO.JSON
 
 		public VehicleDeclarationType VehicleDeclarationType { get; }
 
-		public Dictionary<PowertrainPosition, List<Tuple<Volt, TableData>>> ElectricMotorTorqueLimits => Vehicle.ElectricMotorTorqueLimits;
+		public IDictionary<PowertrainPosition, IList<Tuple<Volt, TableData>>> ElectricMotorTorqueLimits => Vehicle.ElectricMotorTorqueLimits;
 		public TableData BoostingLimitations => Vehicle.BoostingLimitations;
 		
 
diff --git a/VectoCore/VectoCore/InputData/FileIO/JSON/JSONVehicleData.cs b/VectoCore/VectoCore/InputData/FileIO/JSON/JSONVehicleData.cs
index 82a85abcf1..c4872cb832 100644
--- a/VectoCore/VectoCore/InputData/FileIO/JSON/JSONVehicleData.cs
+++ b/VectoCore/VectoCore/InputData/FileIO/JSON/JSONVehicleData.cs
@@ -181,10 +181,10 @@ namespace TUGraz.VectoCore.InputData.FileIO.JSON
 
 		//public override Dictionary<PowertrainPosition, List<Tuple<Volt, TableData>>> ElectricMotorTorqueLimits =>
 		//	throw new NotImplementedException();
-		public override Dictionary<PowertrainPosition, List<Tuple<Volt, TableData>>> ElectricMotorTorqueLimits =>
+		public override IDictionary<PowertrainPosition, IList<Tuple<Volt, TableData>>> ElectricMotorTorqueLimits =>
 			Body["EMTorqueLimits"] == null
 				? null
-				: new Dictionary<PowertrainPosition, List<Tuple<Volt, TableData>>>() {
+				: new Dictionary<PowertrainPosition, IList<Tuple<Volt, TableData>>>() {
 					{
 						GetElectricMachines().Entries.First().Position,
 						new List<Tuple<Volt, TableData>>() {
@@ -322,7 +322,7 @@ namespace TUGraz.VectoCore.InputData.FileIO.JSON
 
 		public virtual Meter Height => Body["VehicleHeight"] == null ? null : Body.GetEx<double>("VehicleHeight").SI<Meter>();
 		
-		public virtual Dictionary<PowertrainPosition, List<Tuple<Volt, TableData>>> ElectricMotorTorqueLimits => null;
+		public virtual IDictionary<PowertrainPosition, IList<Tuple<Volt, TableData>>> ElectricMotorTorqueLimits => null;
 		
 		public virtual TableData BoostingLimitations => null;
 		
diff --git a/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLDeclarationVehicleDataProvider.cs b/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLDeclarationVehicleDataProvider.cs
index 3b37daaa2b..7a8250bf57 100644
--- a/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLDeclarationVehicleDataProvider.cs
+++ b/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLDeclarationVehicleDataProvider.cs
@@ -229,7 +229,7 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration.DataProvider
 
 		public virtual ConsumerTechnology? DoorDriveTechnology => ConsumerTechnology.Unknown;
 		public virtual VehicleDeclarationType VehicleDeclarationType { get; }
-		public virtual Dictionary<PowertrainPosition, List<Tuple<Volt, TableData>>> ElectricMotorTorqueLimits => null;
+		public virtual IDictionary<PowertrainPosition, IList<Tuple<Volt, TableData>>> ElectricMotorTorqueLimits => null;
 		public virtual TableData BoostingLimitations => null;
 
 
@@ -551,7 +551,7 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration.DataProvider
 		public virtual ConsumerTechnology? DoorDriveTechnology => ConsumerTechnology.Unknown;
 
 		public virtual VehicleDeclarationType VehicleDeclarationType { get; }
-		public virtual Dictionary<PowertrainPosition, List<Tuple<Volt, TableData>>> ElectricMotorTorqueLimits { get; }
+		public virtual IDictionary<PowertrainPosition, IList<Tuple<Volt, TableData>>> ElectricMotorTorqueLimits { get; }
 		public virtual TableData BoostingLimitations { get; }
 		public virtual string VehicleTypeApprovalNumber { get; }
 		public virtual IVehicleComponentsDeclaration Components => _components ?? (_components = ComponentReader.ComponentInputData);
@@ -808,7 +808,7 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration.DataProvider
 
 		#endregion
 
-		public override Dictionary<PowertrainPosition, List<Tuple<Volt, TableData>>> ElectricMotorTorqueLimits
+		public override IDictionary<PowertrainPosition, IList<Tuple<Volt, TableData>>> ElectricMotorTorqueLimits
 			=> ElementExists(XMLNames.ElectricMotorTorqueLimits) ? ReadElectricMotorTorqueLimits() : null;
 
 		#region Overrides of XMLDeclarationVehicleDataProviderV20
@@ -820,10 +820,10 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration.DataProvider
 
 		#endregion
 
-		private Dictionary<PowertrainPosition, List<Tuple<Volt, TableData>>> ReadElectricMotorTorqueLimits()
+		private IDictionary<PowertrainPosition, IList<Tuple<Volt, TableData>>> ReadElectricMotorTorqueLimits()
 		{
 			var torqueLimitNodes = GetNodes(XMLNames.ElectricMotorTorqueLimits);
-			var motorTorqueLimits = new Dictionary<PowertrainPosition, List<Tuple<Volt, TableData>>>();
+			var motorTorqueLimits = new Dictionary<PowertrainPosition, IList<Tuple<Volt, TableData>>>();
 
 			foreach (XmlNode torqueLimitNode in torqueLimitNodes)
 			{
diff --git a/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLElectricStorageSystemDeclarationInputData.cs b/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLElectricStorageSystemDeclarationInputData.cs
index d2555cb1c6..ad83f62a6e 100644
--- a/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLElectricStorageSystemDeclarationInputData.cs
+++ b/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLElectricStorageSystemDeclarationInputData.cs
@@ -7,6 +7,7 @@ using TUGraz.VectoCommon.Resources;
 using TUGraz.VectoCommon.Utils;
 using TUGraz.VectoCore.InputData.FileIO.XML.Declaration.Interfaces;
 using TUGraz.VectoCore.InputData.FileIO.XML.Declaration.Reader;
+using TUGraz.VectoCore.InputData.Reader.ComponentData;
 using TUGraz.VectoCore.Utils;
 
 namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration.DataProvider
@@ -106,10 +107,10 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration.DataProvider
 		#region Implementation of IBatteryPackDeclarationInputData
 
 		public virtual double? MinSOC  => 
-			ElementExists(XMLNames.Battery_SOCmin) ? GetDouble(XMLNames.Battery_SOCmin) : (double?)null;
+			ElementExists(XMLNames.Battery_SOCmin) ? GetDouble(XMLNames.Battery_SOCmin) / 100 : (double?)null;
 
 		public virtual double? MaxSOC => 
-			ElementExists(XMLNames.Battery_SOCmax) ? GetDouble(XMLNames.Battery_SOCmax) : (double?)null;
+			ElementExists(XMLNames.Battery_SOCmax) ? GetDouble(XMLNames.Battery_SOCmax) / 100 : (double?)null;
 
 		public virtual BatteryType BatteryType => GetString(XMLNames.REESS_BatteryType).ParseEnum<BatteryType>();
 		public virtual AmpereSecond Capacity => GetDouble(XMLNames.REESS_RatedCapacity).SI(Unit.SI.Ampere.Hour).Cast<AmpereSecond>();
@@ -122,11 +123,11 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration.DataProvider
 
 		public virtual TableData InternalResistanceCurve => ReadTableData(XMLNames.REESS_InternalResistanceCurve, XMLNames.REESS_MapEntry,
 			new Dictionary<string, string> {
-				{XMLNames.REESS_InternalResistanceCurve_SoC, XMLNames.REESS_InternalResistanceCurve_SoC},
-				{XMLNames.REESS_InternalResistanceCurve_R2, XMLNames.REESS_InternalResistanceCurve_R2},
-				{XMLNames.REESS_InternalResistanceCurve_R10, XMLNames.REESS_InternalResistanceCurve_R10},
-				{XMLNames.REESS_InternalResistanceCurve_R20, XMLNames.REESS_InternalResistanceCurve_R20},
-				{XMLNames.REESS_InternalResistanceCurve_R120, XMLNames.REESS_InternalResistanceCurve_R120}
+				{BatteryInternalResistanceReader.Fields.StateOfCharge, XMLNames.REESS_InternalResistanceCurve_SoC},
+				{BatteryInternalResistanceReader.Fields.InternalResistance_2, XMLNames.REESS_InternalResistanceCurve_R2},
+				{BatteryInternalResistanceReader.Fields.InternalResistance_10, XMLNames.REESS_InternalResistanceCurve_R10},
+				{BatteryInternalResistanceReader.Fields.InternalResistance_20, XMLNames.REESS_InternalResistanceCurve_R20},
+				{BatteryInternalResistanceReader.Fields.InternalResistance_120, XMLNames.REESS_InternalResistanceCurve_R120}
 			});
 		
 		public virtual TableData VoltageCurve => ReadTableData(XMLNames.REESS_OCV, XMLNames.REESS_MapEntry, 
diff --git a/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/v24/XMLDeclarationHeavyLorryVehicleDataProvider.cs b/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/v24/XMLDeclarationHeavyLorryVehicleDataProvider.cs
index 4b0bed4c08..a8f7717978 100644
--- a/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/v24/XMLDeclarationHeavyLorryVehicleDataProvider.cs
+++ b/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/v24/XMLDeclarationHeavyLorryVehicleDataProvider.cs
@@ -232,7 +232,7 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration.DataProvider.v24
 
 		public override IList<ITorqueLimitInputData> TorqueLimits => null;
 
-		public override Dictionary<PowertrainPosition, List<Tuple<Volt, TableData>>> ElectricMotorTorqueLimits => null;
+		public override IDictionary<PowertrainPosition, IList<Tuple<Volt, TableData>>> ElectricMotorTorqueLimits => null;
 		public override TableData BoostingLimitations => null;
 
 		#endregion
diff --git a/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/Reader/Impl/XMLDeclarationMultistageInputReader.cs b/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/Reader/Impl/XMLDeclarationMultistageInputReader.cs
index c8bbb71626..d7409a81fd 100644
--- a/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/Reader/Impl/XMLDeclarationMultistageInputReader.cs
+++ b/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/Reader/Impl/XMLDeclarationMultistageInputReader.cs
@@ -502,7 +502,7 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration.Reader.Impl
 		public VehicleDeclarationType VehicleDeclarationType => _manufacturingStages?.First().Vehicle.VehicleDeclarationType ?? default(VehicleDeclarationType);
 
 
-		public Dictionary<PowertrainPosition, List<Tuple<Volt, TableData>>> ElectricMotorTorqueLimits => throw new NotImplementedException();
+		public IDictionary<PowertrainPosition, IList<Tuple<Volt, TableData>>> ElectricMotorTorqueLimits => throw new NotImplementedException();
 		public TableData BoostingLimitations => throw new NotImplementedException();
 
 		#endregion
diff --git a/VectoCore/VectoCore/InputData/FileIO/XML/Engineering/DataProvider/XMLEngineeringVehicleDataProvider.cs b/VectoCore/VectoCore/InputData/FileIO/XML/Engineering/DataProvider/XMLEngineeringVehicleDataProvider.cs
index 74c63b6ab0..3515153724 100644
--- a/VectoCore/VectoCore/InputData/FileIO/XML/Engineering/DataProvider/XMLEngineeringVehicleDataProvider.cs
+++ b/VectoCore/VectoCore/InputData/FileIO/XML/Engineering/DataProvider/XMLEngineeringVehicleDataProvider.cs
@@ -148,7 +148,7 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Engineering.DataProvider
 		public ConsumerTechnology? DoorDriveTechnology => ConsumerTechnology.Unknown;
 		public virtual VehicleDeclarationType VehicleDeclarationType { get; }
 
-		public Dictionary<PowertrainPosition, List<Tuple<Volt, TableData>>> ElectricMotorTorqueLimits => null;
+		public IDictionary<PowertrainPosition, IList<Tuple<Volt, TableData>>> ElectricMotorTorqueLimits => null;
 
 		public TableData BoostingLimitations => null;
 
diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/EngineeringDataAdapter.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/EngineeringDataAdapter.cs
index 9248c30bfc..e506ec9a26 100644
--- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/EngineeringDataAdapter.cs
+++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/EngineeringDataAdapter.cs
@@ -897,9 +897,9 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter
 			};
 		}
 
-		public List<Tuple<PowertrainPosition, ElectricMotorData>> CreateElectricMachines(
+		public IList<Tuple<PowertrainPosition, ElectricMotorData>> CreateElectricMachines(
 			IElectricMachinesEngineeringInputData electricMachines,
-			Dictionary<PowertrainPosition, List<Tuple<Volt, TableData>>> torqueLimits, Volt averageVoltage,
+			IDictionary<PowertrainPosition, IList<Tuple<Volt, TableData>>> torqueLimits, Volt averageVoltage,
 			GearList gearlist = null)
 		{
 			if (electricMachines == null) {
@@ -923,7 +923,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter
 		private ElectricMotorData CreateElectricMachine(PowertrainPosition powertrainPosition,
 			IElectricMotorEngineeringInputData motorData, int count,
 			double ratio, double[] ratioPerGear, double efficiency, TableData adcLossMap,
-			List<Tuple<Volt, TableData>> torqueLimits, Volt averageVoltage, GearList gearList)
+			IList<Tuple<Volt, TableData>> torqueLimits, Volt averageVoltage, GearList gearList)
 		{
 			var voltageLevels = new List<ElectricMotorVoltageLevelData>();
 
@@ -958,7 +958,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter
 				EfficiencyData = new VoltageLevelData() { VoltageLevels = voltageLevels},
 				EMDragCurve = ElectricMotorDragCurveReader.Create(motorData.DragCurve, count),
 				Inertia = motorData.Inertia * count,
-				OverloadRegenerationFactor = motorData.OverloadRecoveryFactor,
+				OverloadRecoveryFactor = motorData.OverloadRecoveryFactor,
 				RatioADC = ratio,
 				RatioPerGear = ratioPerGear,
 				TransmissionLossMap = lossMap,
@@ -1218,7 +1218,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter
 				EfficiencyData = new VoltageLevelData() { VoltageLevels = voltageLevels },
 				IEPCDragCurves = dragCurves,
 				Inertia = iepc.Inertia * count,
-				OverloadRegenerationFactor = iepc.OverloadRecoveryFactor,
+				OverloadRecoveryFactor = iepc.OverloadRecoveryFactor,
 				RatioADC = 1,
 				RatioPerGear = null,
 				TransmissionLossMap = TransmissionLossMapReader.CreateEmADCLossMap(1.0, 1.0, "EM ADC LossMap Eff"),
diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/DeclarationDataAdapterHeavyLorry.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/DeclarationDataAdapterHeavyLorry.cs
index 2c4de96055..6f3e5f2882 100644
--- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/DeclarationDataAdapterHeavyLorry.cs
+++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/DeclarationDataAdapterHeavyLorry.cs
@@ -39,13 +39,16 @@ 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.DataObjectAdapter.SimulationComponents.StrategyDataAdapter;
 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.Battery;
 using TUGraz.VectoCore.Models.SimulationComponent.Data.Engine;
 using TUGraz.VectoCore.Models.SimulationComponent.Data.Gearbox;
+using TUGraz.VectoCore.Models.SimulationComponent.Impl;
 using TUGraz.VectoCore.Utils;
 
 namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.HeavyLorry
@@ -62,6 +65,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.HeavyLorry
 			private readonly IRetarderDataAdapter _retarderDataAdapter = new RetarderDataAdapter();
 			private readonly IAirdragDataAdapter _airdragDataAdapter = new AirdragDataAdapter();
 			private readonly IPTODataAdapter _ptoDataAdapter = new PTODataAdapterLorry();
+			private IAngledriveDataAdapter _angleDriveDataAdapter = new AngledriveDataAdapter();
 			public DriverData CreateDriverData()
 			{
 				return _driverDataAdapter.CreateDriverData();
@@ -75,6 +79,29 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.HeavyLorry
 					loading.Value.Item2, allowVocational);
 			}
 
+			public virtual IList<Tuple<PowertrainPosition, ElectricMotorData>> CreateElectricMachines(
+				IElectricMachinesDeclarationInputData electricMachines,
+				IDictionary<PowertrainPosition, IList<Tuple<Volt, TableData>>> torqueLimits, Volt averageVoltage,
+				GearList gears = null)
+			{
+				throw new NotImplementedException();
+			}
+
+			public virtual BatterySystemData CreateBatteryData(IElectricStorageSystemDeclarationInputData componentsElectricStorage)
+			{
+				throw new NotImplementedException();
+			}
+
+			public virtual SuperCapData CreateSuperCapData(IElectricStorageSystemDeclarationInputData componentsElectricStorage)
+			{
+				throw new NotImplementedException();
+			}
+
+			public virtual HybridStrategyParameters CreateHybridStrategy(BatterySystemData runDataBatteryData, SuperCapData runDataSuperCapData)
+			{
+				throw new NotImplementedException();
+			}
+
 			public virtual AirdragData CreateAirdragData(IAirdragDeclarationInputData airdragData, Mission mission,
 				Segment segment)
 			{
@@ -86,9 +113,10 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.HeavyLorry
 				return _axleGearDataAdapter.CreateAxleGearData(axlegearData);
 			}
 
-			public virtual AngledriveData CreateAngledriveData(IAngledriveInputData angledriveData)
+
+			public AngledriveData CreateAngledriveData(IAngledriveInputData data)
 			{
-				throw new NotImplementedException();
+				return _angleDriveDataAdapter.CreateAngledriveData(data, false);
 			}
 
 			public virtual CombustionEngineData CreateEngineData(IVehicleDeclarationInputData vehicle,
@@ -104,12 +132,15 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.HeavyLorry
 				throw new NotImplementedException();
 			}
 
-			public abstract 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)
+			public RetarderData CreateRetarderData(IRetarderInputData retarderData, PowertrainPosition position)
 			{
-				return _retarderDataAdapter.CreateRetarderData(retarderData);
+				return _retarderDataAdapter.CreateRetarderData(retarderData, position);
 			}
 
 			public PTOData CreatePTOTransmissionData(IPTOTransmissionInputData ptoData)
@@ -136,7 +167,6 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.HeavyLorry
 
 			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)
@@ -161,10 +191,6 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.HeavyLorry
 			#endregion
 
 
-			public override AngledriveData CreateAngledriveData(IAngledriveInputData data)
-			{
-				return _angleDriveDataAdapter.CreateAngledriveData(data, false);
-			}
 
 
 			public override IList<VectoRunData.AuxData> CreateAuxiliaryData(
@@ -177,15 +203,49 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.HeavyLorry
 			}
 		}
 
-		public abstract class SerialHybrid : LorryBase
+		public abstract class Hybrid : LorryBase
 		{
+			private IEngineDataAdapter _engineDataAdapter = new CombustionEngineComponentDataAdapter();
+			private ElectricMachinesDataAdapter _electricMachinesDataAdapter = new ElectricMachinesDataAdapter();
+			private ElectricStorageAdapter _eletricStorageAdapter = new ElectricStorageAdapter();
+			public override CombustionEngineData CreateEngineData(
+				IVehicleDeclarationInputData vehicle, IEngineModeDeclarationInputData mode, Mission mission)
+			{
+				return _engineDataAdapter.CreateEngineData(vehicle, mode, mission);
+			}
+
 			#region Overrides of LorryBase
 
-			public override ShiftStrategyParameters CreateGearshiftData(GearboxData gbx, double axleRatio, PerSecond engineIdlingSpeed)
+			public override IList<Tuple<PowertrainPosition, ElectricMotorData>> CreateElectricMachines(
+				IElectricMachinesDeclarationInputData electricMachines,
+				IDictionary<PowertrainPosition, IList<Tuple<Volt, TableData>>> torqueLimits, Volt averageVoltage,
+				GearList gears = null)
 			{
-				throw new NotImplementedException();
+				return _electricMachinesDataAdapter.CreateElectricMachines(electricMachines, torqueLimits, averageVoltage,
+					gears);
+			}
+
+			public override BatterySystemData CreateBatteryData(IElectricStorageSystemDeclarationInputData batteryInputData)
+			{
+				return _eletricStorageAdapter.CreateBatteryData(batteryInputData);
 			}
 
+			public override SuperCapData CreateSuperCapData(IElectricStorageSystemDeclarationInputData reessInputData)
+			{
+				return _eletricStorageAdapter.CreateSuperCapData(reessInputData);
+			}
+
+			//public RetarderData CreateRetarderData 
+
+			#endregion
+		}
+
+		public abstract class SerialHybrid : Hybrid
+		{
+			#region Overrides of LorryBase
+
+			
+
 			public override IList<VectoRunData.AuxData> CreateAuxiliaryData(IAuxiliariesDeclarationInputData auxData, IBusAuxiliariesDeclarationData busAuxData,
 				MissionType missionType, VehicleClass vehicleClass, Meter vehicleLength, int? numSteeredAxles)
 			{
@@ -195,8 +255,10 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.HeavyLorry
 			#endregion
 		}
 
-		public abstract class ParallelHybrid : LorryBase
+		public abstract class ParallelHybrid : Hybrid
 		{
+			private ParallelHybridStrategyParameterDataAdapter _hybridStrategyDataAdapter =
+				new ParallelHybridStrategyParameterDataAdapter();
 			#region Overrides of LorryBase
 
 			public override ShiftStrategyParameters CreateGearshiftData(GearboxData gbx, double axleRatio, PerSecond engineIdlingSpeed)
@@ -210,6 +272,11 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.HeavyLorry
 				throw new NotImplementedException();
 			}
 
+			public override HybridStrategyParameters CreateHybridStrategy(BatterySystemData runDataBatteryData, SuperCapData runDataSuperCapData)
+			{
+				return _hybridStrategyDataAdapter.CreateHybridStrategyParameters(runDataBatteryData, runDataSuperCapData);
+			}
+
 			#endregion
 		}
 
@@ -230,7 +297,26 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.HeavyLorry
 
 			#endregion
 		}
-		public class HEV_S2 : SerialHybrid { }
+
+		public class HEV_S2 : SerialHybrid
+		{
+			#region Overrides of LorryBase
+			public static readonly GearboxType[] SupportedGearboxTypes =
+				{ GearboxType.AMT, GearboxType.ATPowerSplit, GearboxType.ATSerial, GearboxType.APTN };
+			private GearboxDataAdapter _gearBoxDataAdaper = new GearboxDataAdapter(new TorqueConverterDataAdapter());
+			public override GearboxData CreateGearboxData(IVehicleDeclarationInputData inputData, VectoRunData runData,
+				IShiftPolygonCalculator shiftPolygonCalc)
+			{
+				return _gearBoxDataAdaper.CreateGearboxData(inputData, runData, shiftPolygonCalc, SupportedGearboxTypes);
+			}
+
+			public override ShiftStrategyParameters CreateGearshiftData(GearboxData gbx, double axleRatio, PerSecond engineIdlingSpeed)
+			{
+				return _gearBoxDataAdaper.CreateGearshiftData(gbx, axleRatio, engineIdlingSpeed);
+			}
+
+			#endregion
+		}
 		public class HEV_S3 : SerialHybrid { }
 		public class HEV_S4 : SerialHybrid { }
 		public class HEV_S_IEPC : SerialHybrid { }
diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/DeclarationDataAdapterHeavyLorry_old.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/DeclarationDataAdapterHeavyLorry_old.cs
deleted file mode 100644
index feedd1a623..0000000000
--- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/DeclarationDataAdapterHeavyLorry_old.cs
+++ /dev/null
@@ -1,104 +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.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/IDeclarationDataAdapter.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/IDeclarationDataAdapter.cs
index 83f7c24a64..cd3fb54430 100644
--- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/IDeclarationDataAdapter.cs
+++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/IDeclarationDataAdapter.cs
@@ -8,6 +8,8 @@ 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.Battery;
+using TUGraz.VectoCore.Models.SimulationComponent.Impl;
 
 namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter
 {
@@ -45,7 +47,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter
 
 		PTOData CreatePTOTransmissionData(IPTOTransmissionInputData ptoData);
 
-		RetarderData CreateRetarderData(IRetarderInputData retarderData);
+		RetarderData CreateRetarderData(IRetarderInputData retarderData, PowertrainPosition position = PowertrainPosition.HybridPositionNotSet);
 
 		ShiftStrategyParameters CreateGearshiftData(GearboxData gbx, double axleRatio, PerSecond engineIdlingSpeed);
 
@@ -60,8 +62,12 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter
 		IList<VectoRunData.AuxData> CreateAuxiliaryData(IAuxiliariesDeclarationInputData auxData,
 			IBusAuxiliariesDeclarationData busAuxData, MissionType missionType, VehicleClass vehicleClass,
 			Meter vehicleLength, int? numSteeredAxles);
-
-		VehicleData CreateVehicleData(IVehicleDeclarationInputData vehicle, Segment segment, Mission mission, KeyValuePair<LoadingType, Tuple<Kilogram, double?>> loading, bool allowVocational);
+		
+		
+		IList<Tuple<PowertrainPosition, ElectricMotorData>> CreateElectricMachines(IElectricMachinesDeclarationInputData electricMachines, IDictionary<PowertrainPosition, IList<Tuple<Volt, TableData>>> torqueLimits, Volt averageVoltage, GearList gears = null);
+		BatterySystemData CreateBatteryData(IElectricStorageSystemDeclarationInputData componentsElectricStorage);
+		SuperCapData CreateSuperCapData(IElectricStorageSystemDeclarationInputData componentsElectricStorage);
+		HybridStrategyParameters CreateHybridStrategy(BatterySystemData runDataBatteryData, SuperCapData runDataSuperCapData);
 	}
 
 	public interface IPrimaryBusDeclarationDataAdapter : IDeclarationDataAdapter
diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/PrimaryBus/DeclarationDataAdapterPrimaryBus.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/PrimaryBus/DeclarationDataAdapterPrimaryBus.cs
index d051be2fe3..532be24428 100644
--- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/PrimaryBus/DeclarationDataAdapterPrimaryBus.cs
+++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/PrimaryBus/DeclarationDataAdapterPrimaryBus.cs
@@ -140,63 +140,107 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.PrimaryBus
 			#endregion
 		}
 
-		public class HEV_S2 : PrimaryBusBase
+		public abstract class Hybrid : PrimaryBusBase
 		{
+			private CombustionEngineComponentDataAdapter _engineDataAdapter = new CombustionEngineComponentDataAdapter();
 
+			#region Overrides of PrimaryBusBase
+
+			public override CombustionEngineData CreateEngineData(IVehicleDeclarationInputData vehicle, IEngineModeDeclarationInputData engineMode,
+				Mission mission)
+			{
+				return _engineDataAdapter.CreateEngineData(vehicle, engineMode, mission);
+			}
+
+			
+
+			#endregion
 		}
 
-		public class HEV_S3 : PrimaryBusBase
+		public abstract class SerialHybrid : Hybrid
 		{
 
 		}
 
-		public class HEV_S4 : PrimaryBusBase
+		public class HEV_S2 : SerialHybrid
 		{
 
 		}
 
-		public class HEV_S_IEPC : PrimaryBusBase
+		public class HEV_S3 : SerialHybrid
 		{
 
 		}
 
-		public class HEV_P1 : PrimaryBusBase
+		public class HEV_S4 : SerialHybrid
 		{
 
 		}
 
-		public class HEV_P2 : PrimaryBusBase
+		public class HEV_S_IEPC : SerialHybrid
 		{
 
 		}
 
-		public class HEV_P2_5 : PrimaryBusBase
+		public abstract class ParallelHybrid : Hybrid
 		{
+			private GearboxDataAdapter _gearboxDataAdapter = new GearboxDataAdapter(new TorqueConverterDataAdapter());
+			public override GearboxData CreateGearboxData(IVehicleDeclarationInputData inputData, VectoRunData runData,
+				IShiftPolygonCalculator shiftPolygonCalc)
+			{
+				return _gearboxDataAdapter.CreateGearboxData(inputData, runData, shiftPolygonCalc,
+					supportedGearboxTypes: SupportedGearboxTypes);
+			}
 
+			public override ShiftStrategyParameters CreateGearshiftData(GearboxData gbx, double axleRatio, PerSecond engineIdlingSpeed)
+			{
+				return _gearboxDataAdapter.CreateGearshiftData(gbx, axleRatio, engineIdlingSpeed);
+			}
 		}
 
-		public class HEV_P3 : PrimaryBusBase
+		public class HEV_P1 : ParallelHybrid
 		{
 
 		}
 
-		public class HEV_P4 : PrimaryBusBase
+		public class HEV_P2 : ParallelHybrid
 		{
 
 		}
 
-		public class PEV_E2 : PrimaryBusBase
+		public class HEV_P2_5 : ParallelHybrid
+		{
+
+		}
+
+		public class HEV_P3 : ParallelHybrid
+		{
+
+		}
+
+		public class HEV_P4 : ParallelHybrid
+		{
+
+		}
+
+		public abstract class BatteryElectric : PrimaryBusBase
+		{
+
+		}
+
+
+		public class PEV_E2 : BatteryElectric
 		{
 
 		}
 
-		public class PEV_E3 : PrimaryBusBase
+		public class PEV_E3 : BatteryElectric
 		{
 
 		}
 
 
-		public class PEV_E4 : PrimaryBusBase
+		public class PEV_E4 : BatteryElectric
 		{
 
 		}
diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/AuxiliaryDataAdapter.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/AuxiliaryDataAdapter.cs
index 388afe80d7..09cfb91903 100644
--- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/AuxiliaryDataAdapter.cs
+++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/AuxiliaryDataAdapter.cs
@@ -42,6 +42,9 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponen
 		TechnologyBenefits SelectBenefitForFloorType(FloorType floorType, List<SSMTechnology> onVehicle);
 	}
 
+
+	
+
 	public abstract class AuxiliaryDataAdapter : ComponentDataAdapterBase, IAuxiliaryDataAdapter
 	{
 		public class ElectricConsumerEntry
diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/BatteryDataAdapter.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/BatteryDataAdapter.cs
new file mode 100644
index 0000000000..35e85a25fc
--- /dev/null
+++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/BatteryDataAdapter.cs
@@ -0,0 +1,137 @@
+using System;
+using System.Linq;
+using System.Security.Policy;
+using TUGraz.VectoCommon.InputData;
+using TUGraz.VectoCommon.Utils;
+using TUGraz.VectoCore.InputData.Reader.ComponentData;
+using TUGraz.VectoCore.Models.Declaration;
+using TUGraz.VectoCore.Models.SimulationComponent.Data;
+using TUGraz.VectoCore.Models.SimulationComponent.Data.Battery;
+using TUGraz.VectoCore.Models.SimulationComponent.Impl;
+
+namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponents
+{
+	public class ElectricStorageAdapter
+	{
+		public BatterySystemData CreateBatteryData(IElectricStorageSystemDeclarationInputData batteryInputData)
+		{
+			if (batteryInputData == null)
+			{
+				return null;
+			}
+
+			var bat = batteryInputData.ElectricStorageElements.Where(x => x.REESSPack.StorageType == REESSType.Battery).ToArray();
+
+			if (bat.Length == 0)
+			{
+				return null;
+			}
+
+			var retVal = new BatterySystemData();
+			foreach (var entry in bat)
+			{
+				var b = entry.REESSPack as IBatteryPackDeclarationInputData;
+				if (b == null)
+				{
+					continue;
+				}
+
+				//for (var i = 0; i < entry.Count; i++) {
+					var minSoc = DeclarationData.Battery.GetMinSoc(b.BatteryType);
+					if (b.MinSOC != null && b.MinSOC > minSoc) {
+						minSoc = b.MinSOC.Value;
+					}
+					var maxSoc = DeclarationData.Battery.GetMaxSoc(b.BatteryType);
+					if (b.MaxSOC != null && b.MaxSOC < maxSoc) {
+						maxSoc = b.MaxSOC.Value;
+					}
+				
+					var batteryData = new BatteryData() {
+						MinSOC = minSoc,
+						MaxSOC = maxSoc,
+						MaxCurrent = BatteryMaxCurrentReader.Create(b.MaxCurrentMap),
+						Capacity = b.Capacity,
+						InternalResistance =
+							BatteryInternalResistanceReader.Create(b.InternalResistanceCurve, false),
+						SOCMap = BatterySOCReader.Create(b.VoltageCurve),
+					};
+
+					retVal.Batteries.Add(Tuple.Create(entry.StringId, batteryData));
+				//}
+			}
+
+
+
+			retVal.InitialSoC = CalculateInitialSoc(retVal);
+			return retVal;
+		}
+
+		private double CalculateInitialSoc(BatterySystemData battery)
+		{
+			var socLimits = battery.GetSocLimits();
+			return (socLimits.MaxSoc - socLimits.MinSoc) / 2;
+		}
+
+		public SuperCapData CreateSuperCapData(IElectricStorageSystemDeclarationInputData reessInputData)
+		{
+			if (reessInputData == null)
+			{
+				return null;
+			}
+
+			var superCaps = reessInputData.ElectricStorageElements.Where(x => x.REESSPack.StorageType == REESSType.SuperCap).ToArray();
+
+			var superCap = superCaps.FirstOrDefault()?.REESSPack as ISuperCapDeclarationInputData;
+
+			if (superCap == null)
+			{
+				return null;
+			}
+
+			return new SuperCapData()
+			{
+				Capacity = superCaps.First().Count * superCap.Capacity,
+				InternalResistance = superCap.InternalResistance / superCaps.First().Count,
+				MinVoltage = superCap.MinVoltage * DeclarationData.SuperCap.SocMin, //Ãœberschreiben prozent beziehen sich auf max voltage
+				MaxVoltage = superCap.MaxVoltage,
+				MaxCurrentCharge = superCap.MaxCurrentCharge,
+				MaxCurrentDischarge = -superCap.MaxCurrentDischarge,
+				InitialSoC = Math.Sqrt(Math.Pow(superCap.MaxVoltage.Value(), 2) - Math.Pow(superCap.MaxVoltage.Value(), 2)) /
+							superCap.MaxVoltage.Value()
+			};
+		}
+
+
+		
+	}
+
+	public static class BatterySystemHelper
+	{
+		public static Volt CalculateAverageVoltage(this BatterySystemData battery)
+		{
+			if (battery == null)
+			{
+				return null;
+			}
+			var tmpBattery = new BatterySystem(null, battery);
+			var min = tmpBattery.MinSoC;
+			var max = tmpBattery.MaxSoC;
+			var averageSoC = (min + max) / 2.0;
+
+			tmpBattery.Initialize(averageSoC);
+			return tmpBattery.InternalVoltage;
+		}
+
+
+		public static (double MinSoc, double MaxSoc) GetSocLimits(this BatterySystemData battery)
+		{
+			if (battery == null) {
+				throw new ArgumentNullException();
+			}
+
+			var tmpBattery = new BatterySystem(null, battery);
+			return (tmpBattery.MinSoC, tmpBattery.MaxSoC);
+		}
+	}
+	
+}
\ No newline at end of file
diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/ElectricMachinesDataAdapter.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/ElectricMachinesDataAdapter.cs
new file mode 100644
index 0000000000..80865bf1d6
--- /dev/null
+++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/ElectricMachinesDataAdapter.cs
@@ -0,0 +1,288 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using TUGraz.VectoCommon.Exceptions;
+using TUGraz.VectoCommon.InputData;
+using TUGraz.VectoCommon.Utils;
+using TUGraz.VectoCore.InputData.Reader.ComponentData;
+using TUGraz.VectoCore.Models.Declaration;
+using TUGraz.VectoCore.Models.SimulationComponent.Data;
+using TUGraz.VectoCore.Models.SimulationComponent.Data.ElectricMotor;
+using TUGraz.VectoCore.Models.SimulationComponent.Impl;
+
+namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponents
+{
+	public class ElectricMachinesDataAdapter
+	{
+		public IList<Tuple<PowertrainPosition, ElectricMotorData>> CreateElectricMachines(
+			IElectricMachinesDeclarationInputData electricMachines,
+			IDictionary<PowertrainPosition, IList<Tuple<Volt, TableData>>> torqueLimits, Volt averageVoltage, GearList gearlist = null)
+		{
+			var result = new List<Tuple<PowertrainPosition, ElectricMotorData>>();
+			if (electricMachines == null) {
+				return null;
+			}
+			if (electricMachines.Entries.Select(x => x.Position).Where(x => x != PowertrainPosition.GEN).Distinct().Count() > 1)
+			{
+				throw new VectoException("multiple electric propulsion motors are not supported at the moment");
+			}
+
+			return electricMachines.Entries
+				.Select(x => Tuple.Create(x.Position,
+					CreateElectricMachine(x.Position, x.ElectricMachine, x.Count, x.RatioADC, x.RatioPerGear, x.MechanicalTransmissionEfficiency,
+						x.MechanicalTransmissionLossMap, torqueLimits?.First(t => t.Key == x.Position).Value, averageVoltage, gearlist))).ToList();
+
+			return result;
+		}
+
+		private ElectricMotorData CreateElectricMachine(PowertrainPosition powertrainPosition, 
+			IElectricMotorDeclarationInputData motorData,
+			int count, 
+			double ratio,
+			double[] ratioPerGear,
+			double efficiency,
+			TableData adcLossMap,
+			IList<Tuple<Volt, TableData>> torqueLimits,
+			Volt averageVoltage, GearList gearList)
+		{
+
+			var voltageLevels = new List<ElectricMotorVoltageLevelData>();
+
+			foreach (var entry in motorData.VoltageLevels.OrderBy(x => x.VoltageLevel))
+			{
+				var fullLoadCurve = ElectricFullLoadCurveReader.Create(entry.FullLoadCurve, count);
+				var maxTorqueCurve = torqueLimits == null
+					? null
+					: ElectricFullLoadCurveReader.Create(
+						torqueLimits.FirstOrDefault(x => x.Item1 == null || x.Item1.IsEqual(entry.VoltageLevel))?.Item2, count);
+
+				var fullLoadCurveCombined = IntersectEMFullLoadCurves(fullLoadCurve, maxTorqueCurve);
+
+				var vLevelData = powertrainPosition == PowertrainPosition.IHPC
+					? CreateIHPCVoltageLevelData(count, entry, fullLoadCurveCombined, gearList)
+					: CreateEmVoltageLevelData(count, entry, fullLoadCurveCombined);
+				voltageLevels.Add(vLevelData);
+
+			}
+
+			if (averageVoltage == null)
+			{
+				// if no average voltage is provided (e.g. for supercap) use mean value of measured voltage maps
+				averageVoltage = (voltageLevels.Min(x => x.Voltage) + voltageLevels.Max(x => x.Voltage)) / 2.0;
+			}
+
+			var lossMap = powertrainPosition == PowertrainPosition.IHPC
+				? TransmissionLossMapReader.CreateEmADCLossMap(1.0, 1.0, "EM ADC IHPC LossMap Eff")
+				: adcLossMap != null
+					? TransmissionLossMapReader.CreateEmADCLossMap(adcLossMap, ratio, "EM ADC LossMap")
+					: TransmissionLossMapReader.CreateEmADCLossMap(efficiency, ratio, "EM ADC LossMap Eff");
+
+			var retVal = new ElectricMotorData()
+			{
+				EfficiencyData = new VoltageLevelData() { VoltageLevels = voltageLevels },
+				EMDragCurve = ElectricMotorDragCurveReader.Create(motorData.DragCurve, count),
+				Inertia = motorData.Inertia * count,
+				OverloadRecoveryFactor = DeclarationData.OverloadRecoveryFactor,
+				RatioADC = ratio,
+				RatioPerGear = ratioPerGear,
+				TransmissionLossMap = lossMap,
+			};
+			retVal.Overload = CalculateOverloadData(motorData, count, retVal.EfficiencyData, averageVoltage);
+			return retVal;
+		}
+
+		private static ElectricMotorFullLoadCurve IntersectEMFullLoadCurves(ElectricMotorFullLoadCurve fullLoadCurve,
+			ElectricMotorFullLoadCurve maxTorqueCurve)
+		{
+			if (maxTorqueCurve == null)
+			{
+				return fullLoadCurve;
+			}
+
+			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())
+			{
+				// 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 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
+				{
+					// add the point just before and just after the current list of points 
+					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))
+					{
+						maxPtsWithinSegment.Add(maxTorqueCurve.FullLoadEntries.First(x => x.MotorSpeed.IsGreater(fldTuple.Item2.MotorSpeed)));
+					}
+
+					maxPtsWithinSegment = maxPtsWithinSegment.OrderBy(x => x.MotorSpeed).ToList();
+				}
+
+				var fldEdgeDrive =
+					Edge.Create(new Point(fldTuple.Item1.MotorSpeed.Value(), fldTuple.Item1.FullDriveTorque.Value()),
+						new Point(fldTuple.Item2.MotorSpeed.Value(), fldTuple.Item2.FullDriveTorque.Value()));
+				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())
+				{
+					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))
+					{
+						// 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))
+						{
+							motorSpeeds.Add(nIntersectDrive);
+						}
+					}
+
+					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)))
+					{
+						// 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))
+						{
+							motorSpeeds.Add(nIntersectGenerate);
+						}
+					}
+				}
+			}
+
+			// create new full-load curve with values closest to zero.
+			return new ElectricMotorFullLoadCurve(motorSpeeds.OrderBy(x => x.Value()).Distinct().Select(x =>
+				new ElectricMotorFullLoadCurve.FullLoadEntry()
+				{
+					MotorSpeed = x,
+					FullDriveTorque = VectoMath.Max(fullLoadCurve.FullLoadDriveTorque(x),
+						maxTorqueCurve.FullLoadDriveTorque(x)),
+					FullGenerationTorque = VectoMath.Min(fullLoadCurve.FullGenerationTorque(x),
+						maxTorqueCurve.FullGenerationTorque(x)),
+				}).ToList());
+		}
+
+		private ElectricMotorVoltageLevelData CreateIHPCVoltageLevelData(int count, IElectricMotorVoltageLevel entry, ElectricMotorFullLoadCurve fullLoadCurveCombined, GearList gearList)
+		{
+			if (gearList == null)
+			{
+				throw new VectoException("no gears provided for IHPC EM");
+			}
+
+			if (gearList.Count() != entry.PowerMap.Count)
+			{
+				throw new VectoException(
+					$"number of gears in transmission does not match gears in electric motor (IHPC) - {gearList.Count()}/{entry.PowerMap.Count}");
+			}
+			var effMap = new Dictionary<uint, EfficiencyMap>();
+			foreach (var gear in gearList)
+			{
+				effMap.Add(gear.Gear, ElectricMotorMapReader.Create(entry.PowerMap[(int)gear.Gear - 1].PowerMap, count));
+			}
+			return new IEPCVoltageLevelData()
+			{
+				Voltage = entry.VoltageLevel,
+				FullLoadCurve = fullLoadCurveCombined,
+				EfficiencyMaps = effMap,
+			};
+		}
+
+		private static ElectricMotorVoltageLevelData CreateEmVoltageLevelData(int count, IElectricMotorVoltageLevel entry, ElectricMotorFullLoadCurve fullLoadCurveCombined)
+		{
+			return new ElectricMotorVoltageLevelData()
+			{
+				Voltage = entry.VoltageLevel,
+
+				FullLoadCurve = fullLoadCurveCombined,
+				// DragCurve = ElectricMotorDragCurveReader.Create(entry.DragCurve, count),
+				EfficiencyMap = ElectricMotorMapReader.Create(entry.PowerMap.First().PowerMap, count), //PowerMap
+			};
+		}
+
+		private OverloadData CalculateOverloadData(IElectricMotorDeclarationInputData motorData, int count, VoltageLevelData voltageLevels, Volt averageVoltage)
+		{
+
+			// if average voltage is outside of the voltage-level range, do not extrapolate but take the min voltage entry, or max voltage entry
+			if (averageVoltage < motorData.VoltageLevels.Min(x => x.VoltageLevel))
+			{
+				return CalculateOverloadBuffer(motorData.VoltageLevels.First(), count, voltageLevels);
+			}
+			if (averageVoltage > motorData.VoltageLevels.Max(x => x.VoltageLevel))
+			{
+				return CalculateOverloadBuffer(motorData.VoltageLevels.Last(), count, voltageLevels);
+			}
+
+			var (vLow, vHigh) = motorData.VoltageLevels.OrderBy(x => x.VoltageLevel).GetSection(x => x.VoltageLevel < averageVoltage);
+			var ovlLo = CalculateOverloadBuffer(vLow, count, voltageLevels);
+			var ovlHi = CalculateOverloadBuffer(vHigh, count, voltageLevels);
+
+			var retVal = new OverloadData()
+			{
+				OverloadBuffer = VectoMath.Interpolate(vLow.VoltageLevel, vHigh.VoltageLevel, ovlLo.OverloadBuffer, ovlHi.OverloadBuffer, averageVoltage),
+				ContinuousTorque = VectoMath.Interpolate(vLow.VoltageLevel, vHigh.VoltageLevel, ovlLo.ContinuousTorque, ovlHi.ContinuousTorque, averageVoltage),
+				ContinuousPowerLoss = VectoMath.Interpolate(vLow.VoltageLevel, vHigh.VoltageLevel, ovlLo.ContinuousPowerLoss, ovlHi.ContinuousPowerLoss, averageVoltage)
+			};
+			return retVal;
+		}
+
+		private OverloadData CalculateOverloadBuffer(IElectricMotorVoltageLevel voltageEntry,
+			int count, VoltageLevelData voltageLevels, Tuple<uint, double> gearUsedForMeasurement = null)
+		{
+			var gearRatioUsedForMeasurement = gearUsedForMeasurement?.Item2 ?? 1.0;
+			var gear = new GearshiftPosition(gearUsedForMeasurement?.Item1 ?? 1);
+			var continuousTorque = voltageEntry.ContinuousTorque * count / gearRatioUsedForMeasurement;
+			var continuousTorqueSpeed = voltageEntry.ContinuousTorqueSpeed * gearRatioUsedForMeasurement;
+			var overloadTorque = (voltageEntry.OverloadTorque ?? 0.SI<NewtonMeter>()) * count / gearRatioUsedForMeasurement;
+			var overloadTestSpeed = (voltageEntry.OverloadTestSpeed ?? 0.RPMtoRad()) * gearRatioUsedForMeasurement;
+
+
+			var peakElPwr = voltageLevels.LookupElectricPower(voltageEntry.VoltageLevel, overloadTestSpeed, -overloadTorque, gear, true)
+				.ElectricalPower;
+			var peakPwrLoss = -peakElPwr - overloadTorque * overloadTestSpeed; // losses need to be positive
+
+			var contElPwr = voltageLevels.LookupElectricPower(voltageEntry.VoltageLevel, continuousTorqueSpeed,
+								-continuousTorque, gear).ElectricalPower ??
+							voltageLevels.LookupElectricPower(voltageEntry.VoltageLevel, continuousTorqueSpeed,
+								voltageLevels.FullLoadDriveTorque(voltageEntry.VoltageLevel, continuousTorqueSpeed),
+								gear, true).ElectricalPower;
+			var continuousPowerLoss = -contElPwr - continuousTorque * continuousTorqueSpeed; // loss needs to be positive
+			var overloadBuffer = (peakPwrLoss - continuousPowerLoss) * voltageEntry.OverloadTime;
+			return new OverloadData()
+			{
+				OverloadBuffer = overloadBuffer,
+				ContinuousTorque = continuousTorque,
+				ContinuousPowerLoss = continuousPowerLoss
+			};
+		}
+	}
+
+}
\ No newline at end of file
diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/EngineDataAdapter.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/EngineDataAdapter.cs
index c085e1e886..39c0521b2b 100644
--- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/EngineDataAdapter.cs
+++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/EngineDataAdapter.cs
@@ -195,15 +195,20 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponen
 					});
 			}
 
-			retVal.Inertia = DeclarationData.Engine.EngineInertia(retVal.Displacement, gearbox.Type);
+			retVal.Inertia = DeclarationData.Engine.EngineInertia(retVal.Displacement, gearbox?.Type ?? GearboxType.NoGearbox);
+			//retVal.Inertia = engine.Inertia +
+			//				(gbx != null && gbx.Type.AutomaticTransmission()
+			//					? (gbx.Type == GearboxType.APTN || gbx.Type == GearboxType.IHPC ? 0.SI<KilogramSquareMeter>() : torqueConverter.Inertia)
+			//					: 0.SI<KilogramSquareMeter>());
+
 			retVal.EngineStartTime = DeclarationData.Engine.DefaultEngineStartTime;
 			var limits = vehicle.TorqueLimits?.ToDictionary(e => e.Gear) ??
 						new Dictionary<int, ITorqueLimitInputData>();
-			var numGears = gearbox.Gears.Count;
+			var numGears = gearbox?.Gears.Count ?? 0;
 			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)
+			foreach (var gear in gearbox?.Gears ?? new List<ITransmissionInputData>(0))
 			{
 				var maxTorque = VectoMath.Min(
 					GearboxDataAdapterBase.GbxMaxTorque(gear, numGears, fullLoadCurves[0].MaxTorque),
diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/RetarderDataAdapter.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/RetarderDataAdapter.cs
index 9461ddf32f..a9d7062e11 100644
--- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/RetarderDataAdapter.cs
+++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/RetarderDataAdapter.cs
@@ -11,11 +11,11 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponen
 {
 	public interface IRetarderDataAdapter
 	{
-		RetarderData CreateRetarderData(IRetarderInputData retarder);
+		RetarderData CreateRetarderData(IRetarderInputData retarder, PowertrainPosition position = PowertrainPosition.HybridPositionNotSet);
 	}
 	public class RetarderDataAdapter : IRetarderDataAdapter
 	{
-		public RetarderData CreateRetarderData(IRetarderInputData retarder)
+		public RetarderData CreateRetarderData(IRetarderInputData retarder, PowertrainPosition position)
 		{
 			return SetCommonRetarderData(retarder);
 		}
@@ -80,7 +80,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponen
 	public class GenericRetarderDataAdapter : IRetarderDataAdapter
 	{
 		private readonly GenericBusRetarderData _genericRetarderData = new GenericBusRetarderData();
-		public  RetarderData CreateRetarderData(IRetarderInputData retarder)
+		public  RetarderData CreateRetarderData(IRetarderInputData retarder, PowertrainPosition position)
 		{
 			return _genericRetarderData.CreateGenericBusRetarderData(retarder);
 		}
diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/StrategyDataAdapter/HybridStrategyParameterDataAdapter.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/StrategyDataAdapter/HybridStrategyParameterDataAdapter.cs
new file mode 100644
index 0000000000..63b4e6b7eb
--- /dev/null
+++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/StrategyDataAdapter/HybridStrategyParameterDataAdapter.cs
@@ -0,0 +1,62 @@
+using System;
+using System.ComponentModel;
+using TUGraz.VectoCommon.Exceptions;
+using TUGraz.VectoCommon.Utils;
+using TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.HeavyLorry;
+using TUGraz.VectoCore.Models.SimulationComponent.Data;
+using TUGraz.VectoCore.Models.SimulationComponent.Data.Battery;
+using TUGraz.VectoCore.Models.SimulationComponent.Impl;
+
+namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponents.StrategyDataAdapter
+{
+
+	public abstract class HybridStrategyDataAdapter{
+
+	}
+
+	public class ParallelHybridStrategyParameterDataAdapter : HybridStrategyParameters
+	{
+		public HybridStrategyParameters CreateHybridStrategyParameters(BatterySystemData batterySystemData, SuperCapData superCap)
+		{
+			if (batterySystemData == null && superCap == null) {
+				return null;
+			}
+			if(batterySystemData != null && superCap != null) {
+				throw new VectoException("Supercap AND Batteries not supported");
+			}
+			var result = new HybridStrategyParameters();
+			if (batterySystemData != null) {
+				var tmpBatterySystem = new BatterySystem(null, batterySystemData);
+				result.MinSoC = tmpBatterySystem.MinSoC;
+				result.MaxSoC = tmpBatterySystem.MaxSoC;
+				result.TargetSoC = (result.MaxSoC - result.MinSoC) / 2;
+			} else {
+				result.MinSoC = superCap.MinVoltage / superCap.MaxVoltage;
+				result.MaxSoC = 1;// superCap.MaxVoltage / superCap.MaxVoltage;
+				
+				result.TargetSoC = Math.Sqrt(Math.Pow(superCap.MaxVoltage.Value(), 2) - Math.Pow(superCap.MaxVoltage.Value(), 2)) /
+									superCap.MaxVoltage.Value();
+			}
+
+			//TODO Move to DeclarationData.Hybridstrategy.Parallel
+			result.AuxReserveTime = 0.SI<Second>();
+			result.AuxReserveChargeTime = 0.SI<Second>();
+			result.MinICEOnTime = 10.SI<Second>();
+			result.ICEStartPenaltyFactor = 0.1;
+			result.CostFactorSOCExponent = 1;
+
+			
+
+			return result;
+		}
+	}
+
+	public class SerialHybridStrategyParameterDataAdapter : HybridStrategyParameters
+	{
+		public HybridStrategyParameters CreateHybridStrategyParameters(BatterySystemData batterySystemData,
+			SuperCapData superCap)
+		{
+			return new HybridStrategyParameters();
+		}
+	}
+}
\ 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
index 73b5b2f50b..3844df0481 100644
--- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/VehicleDataAdapter.cs
+++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/VehicleDataAdapter.cs
@@ -53,6 +53,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponen
 				CurbMass = data.CurbMassChassis,
 				GrossVehicleMass = data.GrossVehicleMassRating,
 				AirDensity = Physics.AirDensity,
+				
 			};
 
 			return retVal;
diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SingleBus/DeclarationDataAdapterSingleBus.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SingleBus/DeclarationDataAdapterSingleBus.cs
index bdafee1668..40f9d3592d 100644
--- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SingleBus/DeclarationDataAdapterSingleBus.cs
+++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SingleBus/DeclarationDataAdapterSingleBus.cs
@@ -17,8 +17,6 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SingleBus
 {
 	public abstract class DeclarationDataAdapterSingleBus
 	{
-
-
 		public abstract class SingleBusBase : ISingleBusDeclarationDataAdapter
 		{
 			public static readonly GearboxType[] SupportedGearboxTypes =
@@ -126,7 +124,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SingleBus
 
 		public class Conventional : SingleBusBase { }
 
-		public class Hybrid : SingleBusBase { }
+		public abstract class Hybrid : SingleBusBase { }
 
 		public class SerialHybrid : Hybrid { }
 
diff --git a/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationMode/HeavyLorryRunDataFactory/DeclarationModeHeavyLorryRunDataFactory.cs b/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationMode/HeavyLorryRunDataFactory/DeclarationModeHeavyLorryRunDataFactory.cs
index 214155f6d1..8eb468caab 100644
--- a/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationMode/HeavyLorryRunDataFactory/DeclarationModeHeavyLorryRunDataFactory.cs
+++ b/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationMode/HeavyLorryRunDataFactory/DeclarationModeHeavyLorryRunDataFactory.cs
@@ -26,7 +26,6 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.HeavyLorryRunDa
 			public IDeclarationInputDataProvider InputDataProvider { get; }
 			public IDeclarationReport Report { get; }
 
-			protected Segment _segment;
 			protected DriverData _driverdata;
 			protected AirdragData _airdragData;
 			protected AxleGearData _axlegearData;
@@ -46,6 +45,52 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.HeavyLorryRunDa
 				InputDataProvider = dataProvider;
 				Report = report;
 			}
+			/// <summary>
+			/// Sets <see cref="VectoRunData.Loading"/>
+			///  ,<see cref="VectoRunData.JobName"/>
+			///  ,<see cref="VectoRunData.JobType"/>
+			///  ,<see cref="VectoRunData.Mission"/>
+			///  ,<see cref="VectoRunData.Report"/>
+			///  ,<see cref="VectoRunData.ExecutionMode"/>
+			///  ,<see cref="VectoRunData.Cycle"/>
+			///  ,<see cref="VectoRunData.SimulationType"/>
+			///  ,<see cref="VectoRunData.InputData"/>
+			///  ,<see cref="VectoRunData.ModFileSuffix"/>
+			///  ,<see cref="VectoRunData.VehicleDesignSpeed"/>
+			///  ,<see cref="VectoRunData.InputDataHash"/>
+			/// </summary>
+			/// <param name="vehicle"></param>
+			/// <param name="modeIdx"></param>
+			/// <param name="mission"></param>
+			/// <param name="loading"></param>
+			/// <param name="engineModes"></param>
+			/// <param name="segment"></param>
+			/// <returns></returns>
+			protected VectoRunData CreateCommonRunData(IVehicleDeclarationInputData vehicle, int modeIdx, Mission mission,
+				KeyValuePair<LoadingType, Tuple<Kilogram, double?>> loading,
+				IList<IEngineModeDeclarationInputData> engineModes,
+				Segment segment)
+			{
+				var cycle = DeclarationData.CyclesCache.GetOrAdd(mission.MissionType,
+					_ => DrivingCycleDataReader.ReadFromStream(mission.CycleFile, CycleType.DistanceBased, "", false));
+				var simulationRunData = new VectoRunData
+				{
+					Loading = loading.Key,
+					JobName = InputDataProvider.JobInputData.JobName,
+					JobType = vehicle.VehicleType,
+					Mission = mission,
+					Report = Report,
+					ExecutionMode = ExecutionMode.Declaration,
+					Cycle = new DrivingCycleProxy(cycle, mission.MissionType.ToString()),
+					SimulationType = SimulationType.DistanceCycle,
+					InputData = InputDataProvider,
+					ModFileSuffix = (engineModes.Count > 1 ? $"_EngineMode{modeIdx}_" : "") + loading.Key,
+					VehicleDesignSpeed = segment.DesignSpeed,
+					InputDataHash = InputDataProvider.XMLHash,
+				};
+				return simulationRunData;
+			}
+
 
 			protected override void Initialize()
 			{
@@ -137,17 +182,7 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.HeavyLorryRunDa
 				return segment;
 			}
 
-			protected override VectoRunData CreateVectoRunData(IVehicleDeclarationInputData vehicle, int modeIdx,
-				Mission mission, KeyValuePair<LoadingType, Tuple<Kilogram, double?>> loading)
-			{
-				throw new NotImplementedException();
-			}
-
 
-			protected override IEnumerable<VectoRunData> GetNextRun()
-			{
-				throw new NotImplementedException();
-			}
 			#endregion
 		}
 
@@ -179,6 +214,8 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.HeavyLorryRunDa
 				}
 			}
 
+			
+
 
 			protected override VectoRunData CreateVectoRunData(IVehicleDeclarationInputData vehicle, int modeIdx, Mission mission,
 				KeyValuePair<LoadingType, Tuple<Kilogram, double?>> loading)
@@ -187,122 +224,95 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.HeavyLorryRunDa
 				var engineModes = engine.EngineModes;
 				var engineMode = engineModes[modeIdx];
 
-				var cycle = DeclarationData.CyclesCache.GetOrAdd(mission.MissionType,
-					_ => DrivingCycleDataReader.ReadFromStream(mission.CycleFile, CycleType.DistanceBased, "", false));
+				var simulationRunData = CreateCommonRunData(vehicle, modeIdx, mission, loading, engineModes, _segment);
 
-				var simulationRunData = new VectoRunData {
-					Loading = loading.Key,
-					VehicleData = DataAdapter.CreateVehicleData(vehicle, _segment, mission, loading, _allowVocational),
-					VehicleDesignSpeed = _segment.DesignSpeed,
-					AirdragData = DataAdapter.CreateAirdragData(vehicle.Components.AirdragInputData, mission, _segment),
-					EngineData =
-						DataAdapter.CreateEngineData(InputDataProvider.JobInputData.Vehicle, engineMode,
-							mission), // _engineData.Copy(), // a copy is necessary because every run has a different correction factor!
-					ElectricMachinesData = new List<Tuple<PowertrainPosition, ElectricMotorData>>(),
-					GearboxData = _gearboxData,
-					AxleGearData = _axlegearData,
-					AngledriveData = _angledriveData,
-					Aux = DataAdapter.CreateAuxiliaryData(
-						vehicle.Components.AuxiliaryInputData,
-						vehicle.Components.BusAuxiliaries, mission.MissionType,
-						_segment.VehicleClass, vehicle.Length,
-						vehicle.Components.AxleWheels.NumSteeredAxles),
-					Cycle = new DrivingCycleProxy(cycle, mission.MissionType.ToString()),
-					Retarder = _retarderData,
-					DriverData = _driverdata,
-					ExecutionMode = ExecutionMode.Declaration,
-					JobName = InputDataProvider.JobInputData.JobName,
-					ModFileSuffix = (engineModes.Count > 1 ? $"_EngineMode{modeIdx}_" : "") + loading.Key,
-					Report = Report,
-					Mission = mission,
-					PTO = mission.MissionType == MissionType.MunicipalUtility
-						? _municipalPtoTransmissionData
-						: _ptoTransmissionData,
-					InputDataHash = InputDataProvider.XMLHash,
-					SimulationType = SimulationType.DistanceCycle,
-					GearshiftParameters = _gearshiftData,
-					InputData = InputDataProvider
-				};
+
+
+				simulationRunData.VehicleData =
+				DataAdapter.CreateVehicleData(vehicle, _segment, mission, loading, _allowVocational);
+
+				simulationRunData.AirdragData =
+					DataAdapter.CreateAirdragData(vehicle.Components.AirdragInputData, mission, _segment);
+
+				simulationRunData.EngineData =
+					DataAdapter.CreateEngineData(InputDataProvider.JobInputData.Vehicle, engineMode,
+						mission); // _engineData.Copy(), // a copy is necessary because every run has a different correction factor!
+
+				simulationRunData.ElectricMachinesData = new List<Tuple<PowertrainPosition, ElectricMotorData>>();
+				simulationRunData.GearboxData = _gearboxData;
+				simulationRunData.AxleGearData = _axlegearData;
+				simulationRunData.AngledriveData = _angledriveData;
+				simulationRunData.Aux = DataAdapter.CreateAuxiliaryData(
+					vehicle.Components.AuxiliaryInputData,
+					vehicle.Components.BusAuxiliaries, mission.MissionType,
+					_segment.VehicleClass, vehicle.Length,
+					vehicle.Components.AxleWheels.NumSteeredAxles);
+
+				simulationRunData.Retarder = _retarderData;
+				simulationRunData.DriverData = _driverdata;
+				simulationRunData.PTO = mission.MissionType == MissionType.MunicipalUtility
+					? _municipalPtoTransmissionData
+					: _ptoTransmissionData;
+				
+
+
+				simulationRunData.GearshiftParameters = _gearshiftData;
+				
+			
 				simulationRunData.EngineData.FuelMode = modeIdx;
 				simulationRunData.VehicleData.VehicleClass = _segment.VehicleClass;
 				simulationRunData.VehicleData.InputData = vehicle;
 				return simulationRunData;
 			}
-			#endregion
-		}
-		public class HEV_S2 : LorryBase
-		{
-			public HEV_S2(IDeclarationInputDataProvider dataProvider, IDeclarationReport report,
-				ILorryDeclarationDataAdapter declarationDataAdapter) : base(dataProvider, report, declarationDataAdapter) { }
-		}
 
-		public class HEV_S3 : LorryBase
-		{
-			public HEV_S3(IDeclarationInputDataProvider dataProvider, IDeclarationReport report,
-				ILorryDeclarationDataAdapter declarationDataAdapter) : base(dataProvider, report, declarationDataAdapter) { }
+			
+			#endregion
 		}
 
-		public class HEV_S4 : LorryBase
-		{
-			public HEV_S4(IDeclarationInputDataProvider dataProvider, IDeclarationReport report,
-				ILorryDeclarationDataAdapter declarationDataAdapter) : base(dataProvider, report, declarationDataAdapter) { }
-		}
 
-		public class HEV_S_IEPC : LorryBase
-		{
-			public HEV_S_IEPC(IDeclarationInputDataProvider dataProvider, IDeclarationReport report,
-				ILorryDeclarationDataAdapter declarationDataAdapter) : base(dataProvider, report, declarationDataAdapter) { }
-		}
 
-		public class HEV_P1 : LorryBase
+		public abstract class BatteryElectric : LorryBase
 		{
-			public HEV_P1(IDeclarationInputDataProvider dataProvider, IDeclarationReport report,
-				ILorryDeclarationDataAdapter declarationDataAdapter) : base(dataProvider, report, declarationDataAdapter) { }
-		}
-
-		public class HEV_P2 : LorryBase
-		{
-			public HEV_P2(IDeclarationInputDataProvider dataProvider, IDeclarationReport report,
-				ILorryDeclarationDataAdapter declarationDataAdapter) : base(dataProvider, report, declarationDataAdapter) { }
-		}
+			public BatteryElectric(IDeclarationInputDataProvider dataProvider, IDeclarationReport report,
+				ILorryDeclarationDataAdapter declarationDataAdapter) : base(dataProvider, report,
+				declarationDataAdapter)
+			{
 
-		public class HEV_P2_5 : LorryBase
-		{
-			public HEV_P2_5(IDeclarationInputDataProvider dataProvider, IDeclarationReport report,
-				ILorryDeclarationDataAdapter declarationDataAdapter) : base(dataProvider, report, declarationDataAdapter) { }
-		}
+			}
+			#region Overrides of AbstractDeclarationVectoRunDataFactory
 
-		public class HEV_P3 : LorryBase
-		{
-			public HEV_P3(IDeclarationInputDataProvider dataProvider, IDeclarationReport report,
-				ILorryDeclarationDataAdapter declarationDataAdapter) : base(dataProvider, report, declarationDataAdapter) { }
-		}
+			protected override IEnumerable<VectoRunData> GetNextRun()
+			{
+				throw new NotImplementedException();
+			}
+			protected override VectoRunData CreateVectoRunData(IVehicleDeclarationInputData vehicle, int modeIdx, Mission mission,
+				KeyValuePair<LoadingType, Tuple<Kilogram, double?>> loading)
+			{
+				throw new NotImplementedException();
+			}
 
-		public class HEV_P4 : LorryBase
-		{
-			public HEV_P4(IDeclarationInputDataProvider dataProvider, IDeclarationReport report,
-				ILorryDeclarationDataAdapter declarationDataAdapter) : base(dataProvider, report, declarationDataAdapter) { }
+			#endregion
 		}
 
-		public class PEV_E2 : LorryBase
+		public class PEV_E2 : BatteryElectric
 		{
 			public PEV_E2(IDeclarationInputDataProvider dataProvider, IDeclarationReport report,
 				ILorryDeclarationDataAdapter declarationDataAdapter) : base(dataProvider, report, declarationDataAdapter) { }
 		}
 
-		public class PEV_E3 : LorryBase
+		public class PEV_E3 : BatteryElectric
 		{
 			public PEV_E3(IDeclarationInputDataProvider dataProvider, IDeclarationReport report,
 				ILorryDeclarationDataAdapter declarationDataAdapter) : base(dataProvider, report, declarationDataAdapter) { }
 		}
 
-		public class PEV_E4 : LorryBase
+		public class PEV_E4 : BatteryElectric
 		{
 			public PEV_E4(IDeclarationInputDataProvider dataProvider, IDeclarationReport report,
 				ILorryDeclarationDataAdapter declarationDataAdapter) : base(dataProvider, report, declarationDataAdapter) { }
 		}
 
-		public class PEV_E_IEPC : LorryBase
+		public class PEV_E_IEPC : BatteryElectric
 		{
 			public PEV_E_IEPC(IDeclarationInputDataProvider dataProvider, IDeclarationReport report,
 				ILorryDeclarationDataAdapter declarationDataAdapter) : base(dataProvider, report, declarationDataAdapter) { }
@@ -312,6 +322,21 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.HeavyLorryRunDa
 		{
 			public Exempted(IDeclarationInputDataProvider dataProvider, IDeclarationReport report,
 				ILorryDeclarationDataAdapter declarationDataAdapter) : base(dataProvider, report, declarationDataAdapter) { }
+
+			#region Overrides of AbstractDeclarationVectoRunDataFactory
+
+			protected override IEnumerable<VectoRunData> GetNextRun()
+			{
+				throw new NotImplementedException();
+			}
+
+			protected override VectoRunData CreateVectoRunData(IVehicleDeclarationInputData vehicle, int modeIdx, Mission mission,
+				KeyValuePair<LoadingType, Tuple<Kilogram, double?>> loading)
+			{
+				throw new NotImplementedException();
+			}
+
+			#endregion
 		}
 		
 	}
diff --git a/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationMode/HeavyLorryRunDataFactory/DeclarationModeHeavyLorryRunDataFactory_Hybrid.cs b/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationMode/HeavyLorryRunDataFactory/DeclarationModeHeavyLorryRunDataFactory_Hybrid.cs
new file mode 100644
index 0000000000..13321328da
--- /dev/null
+++ b/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationMode/HeavyLorryRunDataFactory/DeclarationModeHeavyLorryRunDataFactory_Hybrid.cs
@@ -0,0 +1,155 @@
+using System;
+using System.Collections.Generic;
+using TUGraz.VectoCommon.InputData;
+using TUGraz.VectoCommon.Utils;
+using TUGraz.VectoCore.InputData.Reader.DataObjectAdapter;
+using TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponents;
+using TUGraz.VectoCore.Models.Declaration;
+using TUGraz.VectoCore.Models.Simulation.Data;
+using TUGraz.VectoCore.OutputData;
+
+namespace TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.HeavyLorryRunDataFactory
+{
+	public abstract partial class DeclarationModeHeavyLorryRunDataFactory
+	{
+		public abstract class Hybrid : LorryBase
+		{
+			public Hybrid(IDeclarationInputDataProvider dataProvider, IDeclarationReport report,
+				ILorryDeclarationDataAdapter declarationDataAdapter) : base(dataProvider, report,
+				declarationDataAdapter)
+			{
+
+			}
+
+			#region Overrides of AbstractDeclarationVectoRunDataFactory
+
+			protected override IEnumerable<VectoRunData> GetNextRun()
+			{
+				var vehicle = InputDataProvider.JobInputData.Vehicle;
+
+				var engine = InputDataProvider.JobInputData.Vehicle.Components.EngineInputData;
+				var engineModes = engine.EngineModes;
+
+				for (var modeIdx = 0; modeIdx < engineModes.Count; modeIdx++)
+				{
+					foreach (var mission in _segment.Missions)
+					{
+						if (mission.MissionType.IsEMS() &&
+							engine.RatedPowerDeclared.IsSmaller(DeclarationData.MinEnginePowerForEMS))
+						{
+							continue;
+						}
+
+						foreach (var loading in mission.Loadings)
+						{
+							var simulationRunData = CreateVectoRunData(vehicle, modeIdx, mission, loading);
+							yield return simulationRunData;
+						}
+					}
+				}
+			}
+
+			protected override VectoRunData CreateVectoRunData(IVehicleDeclarationInputData vehicle, int modeIdx, Mission mission,
+				KeyValuePair<LoadingType, Tuple<Kilogram, double?>> loading)
+			{
+				throw new NotImplementedException();
+			}
+
+			#endregion
+		}
+
+		public class HEV_S2 : Hybrid
+		{
+			public HEV_S2(IDeclarationInputDataProvider dataProvider, IDeclarationReport report,
+				ILorryDeclarationDataAdapter declarationDataAdapter) : base(dataProvider, report,
+				declarationDataAdapter)
+			{
+
+			}
+
+			#region Overrides of Hybrid
+
+			protected override VectoRunData CreateVectoRunData(IVehicleDeclarationInputData vehicle, int modeIdx, Mission mission,
+				KeyValuePair<LoadingType, Tuple<Kilogram, double?>> loading)
+			{
+
+				var engine = InputDataProvider.JobInputData.Vehicle.Components.EngineInputData;
+				var engineModes = engine.EngineModes;
+				var engineMode = engineModes[modeIdx];
+				var runData = CreateCommonRunData(vehicle, modeIdx, mission, loading, engineModes, _segment);
+				runData.VehicleData = DataAdapter.CreateVehicleData(vehicle, _segment, mission, loading, _allowVocational);
+				runData.EngineData = DataAdapter.CreateEngineData(vehicle, engineMode, mission);
+				//TODO HM use updated value for InitialSOC
+				runData.BatteryData = DataAdapter.CreateBatteryData(vehicle.Components.ElectricStorage);
+				runData.SuperCapData = DataAdapter.CreateSuperCapData(vehicle.Components.ElectricStorage);
+				runData.ElectricMachinesData = DataAdapter.CreateElectricMachines(vehicle.Components.ElectricMachines, vehicle.ElectricMotorTorqueLimits, runData.BatteryData.CalculateAverageVoltage());
+				runData.GearboxData = _gearboxData;
+				runData.AirdragData = _airdragData;
+				runData.AngledriveData = _angledriveData;
+				runData.HybridStrategyParameters =
+					DataAdapter.CreateHybridStrategy(runData.BatteryData, runData.SuperCapData);
+				runData.Aux = DataAdapter.CreateAuxiliaryData(vehicle.Components.AuxiliaryInputData,
+					vehicle.Components.BusAuxiliaries,
+					mission.MissionType,
+					_segment.VehicleClass, 
+					vehicle.Length,
+					vehicle.Components.AxleWheels.NumSteeredAxles);
+				
+
+
+
+				return runData;
+			}
+
+			#endregion
+		}
+
+		public class HEV_S3 : Hybrid
+		{
+			public HEV_S3(IDeclarationInputDataProvider dataProvider, IDeclarationReport report,
+				ILorryDeclarationDataAdapter declarationDataAdapter) : base(dataProvider, report, declarationDataAdapter) { }
+		}
+
+		public class HEV_S4 : Hybrid
+		{
+			public HEV_S4(IDeclarationInputDataProvider dataProvider, IDeclarationReport report,
+				ILorryDeclarationDataAdapter declarationDataAdapter) : base(dataProvider, report, declarationDataAdapter) { }
+		}
+
+		public class HEV_S_IEPC : Hybrid
+		{
+			public HEV_S_IEPC(IDeclarationInputDataProvider dataProvider, IDeclarationReport report,
+				ILorryDeclarationDataAdapter declarationDataAdapter) : base(dataProvider, report, declarationDataAdapter) { }
+		}
+
+		public class HEV_P1 : Hybrid
+		{
+			public HEV_P1(IDeclarationInputDataProvider dataProvider, IDeclarationReport report,
+				ILorryDeclarationDataAdapter declarationDataAdapter) : base(dataProvider, report, declarationDataAdapter) { }
+		}
+
+		public class HEV_P2 : Hybrid
+		{
+			public HEV_P2(IDeclarationInputDataProvider dataProvider, IDeclarationReport report,
+				ILorryDeclarationDataAdapter declarationDataAdapter) : base(dataProvider, report, declarationDataAdapter) { }
+		}
+
+		public class HEV_P2_5 : Hybrid
+		{
+			public HEV_P2_5(IDeclarationInputDataProvider dataProvider, IDeclarationReport report,
+				ILorryDeclarationDataAdapter declarationDataAdapter) : base(dataProvider, report, declarationDataAdapter) { }
+		}
+
+		public class HEV_P3 : Hybrid
+		{
+			public HEV_P3(IDeclarationInputDataProvider dataProvider, IDeclarationReport report,
+				ILorryDeclarationDataAdapter declarationDataAdapter) : base(dataProvider, report, declarationDataAdapter) { }
+		}
+
+		public class HEV_P4 : Hybrid
+		{
+			public HEV_P4(IDeclarationInputDataProvider dataProvider, IDeclarationReport report,
+				ILorryDeclarationDataAdapter declarationDataAdapter) : base(dataProvider, report, declarationDataAdapter) { }
+		}
+	}
+}
\ No newline at end of file
diff --git a/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationMode/PrimaryBusRunDataFactory/DeclarationModePrimaryBusRunDataFactory.cs b/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationMode/PrimaryBusRunDataFactory/DeclarationModePrimaryBusRunDataFactory.cs
index 0cb8590fc5..dd59c02308 100644
--- a/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationMode/PrimaryBusRunDataFactory/DeclarationModePrimaryBusRunDataFactory.cs
+++ b/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationMode/PrimaryBusRunDataFactory/DeclarationModePrimaryBusRunDataFactory.cs
@@ -10,6 +10,7 @@ using TUGraz.VectoCore.InputData.Reader.DataObjectAdapter;
 using TUGraz.VectoCore.Models.Declaration;
 using TUGraz.VectoCore.Models.Simulation.Data;
 using TUGraz.VectoCore.Models.Simulation.Impl;
+using TUGraz.VectoCore.Models.SimulationComponent;
 using TUGraz.VectoCore.Models.SimulationComponent.Data;
 using TUGraz.VectoCore.Models.SimulationComponent.Impl;
 using TUGraz.VectoCore.OutputData;
@@ -18,8 +19,6 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.PrimaryBusRunDa
 {
 	public abstract class DeclarationModePrimaryBusRunDataFactory
 	{
-
-
 		public abstract class PrimaryBusBase : AbstractDeclarationVectoRunDataFactory
 		{
 			#region Implementation of IVectoRunDataFactory
@@ -108,30 +107,22 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.PrimaryBusRunDa
 					_axlegearData = DataAdapter.CreateAxleGearData(InputDataProvider.JobInputData.Vehicle.Components.AxleGearInputData);
 				}
 				_angledriveData = DataAdapter.CreateAngledriveData(InputDataProvider.JobInputData.Vehicle.Components.AngledriveInputData);
-				var tmpRunData = new VectoRunData()
-				{
-					GearboxData = new GearboxData()
-					{
-						Type = vehicle.Components.GearboxInputData.Type,
-					}
-				};
-				var tmpStrategy = PowertrainBuilder.GetShiftStrategy(new SimplePowertrainContainer(tmpRunData));
+               
 				var tmpEngine = DataAdapter.CreateEngineData(
 					vehicle, vehicle.Components.EngineInputData.EngineModes[0], _segment.Missions.First());
-				_gearboxData = DataAdapter.CreateGearboxData(
-					vehicle, new VectoRunData() { EngineData = tmpEngine, AxleGearData = _axlegearData, VehicleData = tempVehicle },
-					tmpStrategy);
+				InitGearboxAndGearshiftData(vehicle, tmpEngine, tempVehicle);
+
 
 				_retarderData = DataAdapter.CreateRetarderData(vehicle.Components.RetarderInputData);
 
 				_ptoTransmissionData = DataAdapter.CreatePTOTransmissionData(vehicle.Components.PTOTransmissionInputData);
 
-				//_municipalPtoTransmissionData = CreateDefaultPTOData();
-				_gearshiftData = DataAdapter.CreateGearshiftData(
-					_gearboxData, _axlegearData.AxleGear.Ratio * (_angledriveData?.Angledrive.Ratio ?? 1.0), tmpEngine.IdleSpeed);
 
 			}
 
+			protected abstract void InitGearboxAndGearshiftData(IVehicleDeclarationInputData vehicle,
+				CombustionEngineData tmpEngine, VehicleData tempVehicle);
+
 			#endregion
 			protected override VectoRunData CreateVectoRunData(
 			IVehicleDeclarationInputData vehicle, int modeIdx, Mission mission, KeyValuePair<LoadingType, Tuple<Kilogram, double?>> loading)
@@ -187,6 +178,7 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.PrimaryBusRunDa
 					InputDataHash = InputDataProvider.XMLHash,
 					SimulationType = SimulationType.DistanceCycle,
 					GearshiftParameters = _gearshiftData,
+					JobType = vehicle.VehicleType,
 				};
 				simulationRunData.EngineData.FuelMode = modeIdx;
 				simulationRunData.VehicleData.VehicleClass = _segment.VehicleClass;
@@ -229,118 +221,203 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.PrimaryBusRunDa
 			#endregion
 
 			#region Overrides of AbstractDeclarationVectoRunDataFactory
+			protected override void InitGearboxAndGearshiftData(IVehicleDeclarationInputData vehicle,
+				CombustionEngineData tmpEngine,
+				VehicleData tempVehicle)
+			{
+				var tmpRunData = new VectoRunData()
+				{
+					GearboxData = new GearboxData()
+					{
+						Type = vehicle.Components.GearboxInputData.Type,
+					}
+				};
+				var tmpStrategy = PowertrainBuilder.GetShiftStrategy(new SimplePowertrainContainer(tmpRunData));
+				_gearboxData = DataAdapter.CreateGearboxData(
+					vehicle, new VectoRunData() { EngineData = tmpEngine, AxleGearData = _axlegearData, VehicleData = tempVehicle },
+					tmpStrategy);
+
+				_gearshiftData = DataAdapter.CreateGearshiftData(
+					_gearboxData, _axlegearData.AxleGear.Ratio * (_angledriveData?.Angledrive.Ratio ?? 1.0), tmpEngine.IdleSpeed);
+			}
 
-			
 
 			#endregion
 		}
 
-		public class HEV_S2 : PrimaryBusBase
+		public abstract class Hybrid : PrimaryBusBase
+		{
+			protected Hybrid(IDeclarationInputDataProvider dataProvider, IDeclarationReport report, IPrimaryBusDeclarationDataAdapter declarationDataAdapter) : base(dataProvider, report, declarationDataAdapter) { }
+			
+			protected override IEnumerable<VectoRunData> VectoRunDataHeavyBusPrimary()
+			{
+				var vehicle = DataProvider.JobInputData.Vehicle;
+				var engine = vehicle.Components.EngineInputData;
+				var engineModes = engine.EngineModes;
+
+				for (var modeIdx = 0; modeIdx < engineModes.Count; modeIdx++)
+				{
+					foreach (var mission in _segment.Missions)
+					{
+						foreach (var loading in mission.Loadings)
+						{
+							var simulationRunData = CreateVectoRunData(vehicle, modeIdx, mission, loading);
+							if (simulationRunData == null)
+							{
+								continue;
+							}
+							yield return simulationRunData;
+						}
+					}
+				}
+			}
+		}
+
+		public abstract class SerialHybrid : Hybrid
+		{
+			protected SerialHybrid(IDeclarationInputDataProvider dataProvider, IDeclarationReport report,
+				IPrimaryBusDeclarationDataAdapter declarationDataAdapter) : base(dataProvider, report,
+				declarationDataAdapter)
+			{
+
+			}
+
+			protected override void InitGearboxAndGearshiftData(IVehicleDeclarationInputData vehicle,
+				CombustionEngineData tmpEngine,
+				VehicleData tempVehicle)
+			{
+				//_gearboxData = ;
+				_gearshiftData = null;
+			}
+		}
+
+
+		public class HEV_S2 : SerialHybrid
 		{
 			public HEV_S2(IDeclarationInputDataProvider dataProvider, IDeclarationReport report,
 				IPrimaryBusDeclarationDataAdapter declarationDataAdapter) : base(dataProvider, report, declarationDataAdapter) { }
 
+			//#region Overrides of PrimaryBusBase
+
+			//protected override IEnumerable<VectoRunData> VectoRunDataHeavyBusPrimary()
+			//{
+			//	throw new NotImplementedException();
+			//}
+
+			//#endregion
+
+			#region Overrides of PrimaryBusBase
+
+		
+
+			#endregion
+
 			#region Overrides of PrimaryBusBase
 
-			protected override IEnumerable<VectoRunData> VectoRunDataHeavyBusPrimary()
-			{
-				throw new NotImplementedException();
-			}
 
 			#endregion
 		}
 
-		public class HEV_S3 : PrimaryBusBase
+		public class HEV_S3 : SerialHybrid
 		{
 			public HEV_S3(IDeclarationInputDataProvider dataProvider, IDeclarationReport report,
 				IPrimaryBusDeclarationDataAdapter declarationDataAdapter) : base(dataProvider, report, declarationDataAdapter) { }
 
 			#region Overrides of PrimaryBusBase
 
-			protected override IEnumerable<VectoRunData> VectoRunDataHeavyBusPrimary()
-			{
-				throw new NotImplementedException();
-			}
 
 			#endregion
 		}
 
-		public class HEV_S4 : PrimaryBusBase
+		public class HEV_S4 : SerialHybrid
 		{
 			public HEV_S4(IDeclarationInputDataProvider dataProvider, IDeclarationReport report, IPrimaryBusDeclarationDataAdapter declarationDataAdapter) : base(dataProvider, report, declarationDataAdapter) { }
 
 			#region Overrides of PrimaryBusBase
 
-			protected override IEnumerable<VectoRunData> VectoRunDataHeavyBusPrimary()
-			{
-				throw new NotImplementedException();
-			}
 
 			#endregion
 		}
 
-		public class HEV_S_IEPC : PrimaryBusBase
+		public class HEV_S_IEPC : SerialHybrid
 		{
 			public HEV_S_IEPC(IDeclarationInputDataProvider dataProvider, IDeclarationReport report, IPrimaryBusDeclarationDataAdapter declarationDataAdapter) : base(dataProvider, report, declarationDataAdapter) { }
 
 			#region Overrides of PrimaryBusBase
 
+
+			#endregion
+		}
+
+		public abstract class ParallelHybrid : PrimaryBusBase
+		{
+			protected ParallelHybrid(IDeclarationInputDataProvider dataProvider, IDeclarationReport report, IPrimaryBusDeclarationDataAdapter declarationDataAdapter) : base(dataProvider, report, declarationDataAdapter) { }
+
+			#region Overrides of PrimaryBusBase
+
 			protected override IEnumerable<VectoRunData> VectoRunDataHeavyBusPrimary()
 			{
 				throw new NotImplementedException();
 			}
 
+			protected override void InitGearboxAndGearshiftData(IVehicleDeclarationInputData vehicle,
+				CombustionEngineData tmpEngine,
+				VehicleData tempVehicle)
+			{
+
+
+			}
+
+
 			#endregion
 		}
 
-		public class HEV_P1 : PrimaryBusBase
+		public class HEV_P1 : ParallelHybrid
 		{
 			public HEV_P1(IDeclarationInputDataProvider dataProvider, IDeclarationReport report, IPrimaryBusDeclarationDataAdapter declarationDataAdapter) : base(dataProvider, report, declarationDataAdapter) { }
 
 			#region Overrides of PrimaryBusBase
 
-			protected override IEnumerable<VectoRunData> VectoRunDataHeavyBusPrimary()
-			{
-				throw new NotImplementedException();
-			}
 
 			#endregion
 		}
 
-		public class HEV_P2 : PrimaryBusBase
+		public class HEV_P2 : ParallelHybrid
 		{
 			public HEV_P2(IDeclarationInputDataProvider dataProvider, IDeclarationReport report, IPrimaryBusDeclarationDataAdapter declarationDataAdapter) : base(dataProvider, report, declarationDataAdapter) { }
 
 			#region Overrides of PrimaryBusBase
 
-			protected override IEnumerable<VectoRunData> VectoRunDataHeavyBusPrimary()
-			{
-				throw new NotImplementedException();
-			}
 
 			#endregion
 		}
 
-		public class HEV_P2_5 : PrimaryBusBase
+		public class HEV_P2_5 : ParallelHybrid
 		{
 			public HEV_P2_5(IDeclarationInputDataProvider dataProvider, IDeclarationReport report, IPrimaryBusDeclarationDataAdapter declarationDataAdapter) : base(dataProvider, report, declarationDataAdapter) { }
 
 			#region Overrides of PrimaryBusBase
 
-			protected override IEnumerable<VectoRunData> VectoRunDataHeavyBusPrimary()
-			{
-				throw new NotImplementedException();
-			}
 
 			#endregion
 		}
 
-		public class HEV_P3 : PrimaryBusBase
+		public class HEV_P3 : ParallelHybrid
 		{
 			public HEV_P3(IDeclarationInputDataProvider dataProvider, IDeclarationReport report, IPrimaryBusDeclarationDataAdapter declarationDataAdapter) : base(dataProvider, report, declarationDataAdapter) { }
 
 			#region Overrides of PrimaryBusBase
 
+
+			#endregion
+		}
+
+		public class HEV_P4 : ParallelHybrid
+		{
+			public HEV_P4(IDeclarationInputDataProvider dataProvider, IDeclarationReport report, IPrimaryBusDeclarationDataAdapter declarationDataAdapter) : base(dataProvider, report, declarationDataAdapter) { }
+
+			#region Overrides of PrimaryBusBase
+
 			protected override IEnumerable<VectoRunData> VectoRunDataHeavyBusPrimary()
 			{
 				throw new NotImplementedException();
@@ -349,9 +426,9 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.PrimaryBusRunDa
 			#endregion
 		}
 
-		public class HEV_P4 : PrimaryBusBase
+		public abstract class BatteryElectric : PrimaryBusBase
 		{
-			public HEV_P4(IDeclarationInputDataProvider dataProvider, IDeclarationReport report, IPrimaryBusDeclarationDataAdapter declarationDataAdapter) : base(dataProvider, report, declarationDataAdapter) { }
+			public BatteryElectric(IDeclarationInputDataProvider dataProvider, IDeclarationReport report, IPrimaryBusDeclarationDataAdapter declarationDataAdapter) : base(dataProvider, report, declarationDataAdapter) { }
 
 			#region Overrides of PrimaryBusBase
 
@@ -360,11 +437,18 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.PrimaryBusRunDa
 				throw new NotImplementedException();
 			}
 
+			protected override void InitGearboxAndGearshiftData(IVehicleDeclarationInputData vehicle,
+				CombustionEngineData tmpEngine,
+				VehicleData tempVehicle)
+			{
+				throw new NotImplementedException();
+			}
+
 			#endregion
 		}
 
 
-		public class PEV_E2 : PrimaryBusBase
+		public class PEV_E2 : BatteryElectric
 		{
 			public PEV_E2(IDeclarationInputDataProvider dataProvider, IDeclarationReport report, IPrimaryBusDeclarationDataAdapter declarationDataAdapter) : base(dataProvider, report, declarationDataAdapter) { }
 
@@ -378,7 +462,7 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.PrimaryBusRunDa
 			#endregion
 		}
 
-		public class PEV_E3 : PrimaryBusBase
+		public class PEV_E3 : BatteryElectric
 		{
 			public PEV_E3(IDeclarationInputDataProvider dataProvider, IDeclarationReport report, IPrimaryBusDeclarationDataAdapter declarationDataAdapter) : base(dataProvider, report, declarationDataAdapter) { }
 
@@ -392,7 +476,7 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.PrimaryBusRunDa
 			#endregion
 		}
 
-		public class PEV_E4 : PrimaryBusBase
+		public class PEV_E4 : BatteryElectric
 		{
 			public PEV_E4(IDeclarationInputDataProvider dataProvider, IDeclarationReport report, IPrimaryBusDeclarationDataAdapter declarationDataAdapter) : base(dataProvider, report, declarationDataAdapter) { }
 
@@ -406,7 +490,7 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.PrimaryBusRunDa
 			#endregion
 		}
 
-		public class PEV_E_IEPC : PrimaryBusBase
+		public class PEV_E_IEPC : BatteryElectric
 		{
 			public PEV_E_IEPC(IDeclarationInputDataProvider dataProvider, IDeclarationReport report, IPrimaryBusDeclarationDataAdapter declarationDataAdapter) : base(dataProvider, report, declarationDataAdapter) { }
 
@@ -431,6 +515,13 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.PrimaryBusRunDa
 				throw new NotImplementedException();
 			}
 
+			protected override void InitGearboxAndGearshiftData(IVehicleDeclarationInputData vehicle,
+				CombustionEngineData tmpEngine,
+				VehicleData tempVehicle)
+			{
+				throw new NotImplementedException();
+			}
+
 			#endregion
 		}
 	}
diff --git a/VectoCore/VectoCore/Models/Declaration/DeclarationData.cs b/VectoCore/VectoCore/Models/Declaration/DeclarationData.cs
index cd37d6637d..b908450f98 100644
--- a/VectoCore/VectoCore/Models/Declaration/DeclarationData.cs
+++ b/VectoCore/VectoCore/Models/Declaration/DeclarationData.cs
@@ -1208,18 +1208,24 @@ namespace TUGraz.VectoCore.Models.Declaration
 			}
 		}
 
+		public static class SuperCap
+		{
+			public const double SocMin = 0.45;
+		}
+
+
 		public static class Battery
 		{
 			/// <summary>
 			/// Percentage of the maximum voltage of the battery
 			/// </summary>
-			private const double SOCMinHP = 0.3;
-			private const double SOCMaxHP = 0.7;
+			private const double SOCMinHP = 0.2;
+			private const double SOCMaxHP = 0.8;
 
-			private const double SOCMinHE = 0.1;
-			private const double SOCMaxHE = 0.9;
+			private const double SOCMinHE = 0.05;
+			private const double SOCMaxHE = 0.95;
 
-			public static double GetDefaultMinSoc(BatteryType type)
+			public static double GetMinSoc(BatteryType type)
 			{
 				switch (type) {
 					case BatteryType.HPBS:
@@ -1233,7 +1239,8 @@ namespace TUGraz.VectoCore.Models.Declaration
 				}
 			}
 
-			public static double GetDefaultMaxSoc(BatteryType type)
+
+			public static double GetMaxSoc(BatteryType type)
 			{
 				switch (type)
 				{
diff --git a/VectoCore/VectoCore/Models/Simulation/Data/VectoRunData.cs b/VectoCore/VectoCore/Models/Simulation/Data/VectoRunData.cs
index 91a78f96b3..3ee80e9bab 100644
--- a/VectoCore/VectoCore/Models/Simulation/Data/VectoRunData.cs
+++ b/VectoCore/VectoCore/Models/Simulation/Data/VectoRunData.cs
@@ -128,7 +128,7 @@ namespace TUGraz.VectoCore.Models.Simulation.Data
 
 		public AuxFanData FanDataVTP { get; internal set; }
 
-		public List<Tuple<PowertrainPosition, ElectricMotorData>> ElectricMachinesData { get; internal set; }
+		public IList<Tuple<PowertrainPosition, ElectricMotorData>> ElectricMachinesData { get; internal set; }
 
 		public BatterySystemData BatteryData { get; internal set; }
 
@@ -350,6 +350,7 @@ namespace TUGraz.VectoCore.Models.Simulation.Data
 			}
 			return null;
 		}
+
 	}
 
 	public class VTPData
@@ -363,4 +364,5 @@ namespace TUGraz.VectoCore.Models.Simulation.Data
 
 		public Meter FanDiameter;
 	}
+
 }
\ No newline at end of file
diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Data/ElectricMotor/ElectricMotorData.cs b/VectoCore/VectoCore/Models/SimulationComponent/Data/ElectricMotor/ElectricMotorData.cs
index 88f5c076d7..ef257670d0 100644
--- a/VectoCore/VectoCore/Models/SimulationComponent/Data/ElectricMotor/ElectricMotorData.cs
+++ b/VectoCore/VectoCore/Models/SimulationComponent/Data/ElectricMotor/ElectricMotorData.cs
@@ -15,7 +15,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data
 		public KilogramSquareMeter Inertia { get; internal set; }
 
 		[SIRange(0, 1)]
-		public double OverloadRegenerationFactor { get; internal set; }
+		public double OverloadRecoveryFactor { get; internal set; }
 
 		public double RatioADC { get; internal set; }
 
diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/ElectricMotor.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/ElectricMotor.cs
index 88247fe0a3..208df1a28d 100644
--- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/ElectricMotor.cs
+++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/ElectricMotor.cs
@@ -548,7 +548,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 			}
 
 			if (DeRatingActive) {
-				if (ThermalBuffer.IsSmallerOrEqual(ModelData.Overload.OverloadBuffer * ModelData.OverloadRegenerationFactor)) {
+				if (ThermalBuffer.IsSmallerOrEqual(ModelData.Overload.OverloadBuffer * ModelData.OverloadRecoveryFactor)) {
 					DeRatingActive = false;
 				}
 			} else {
diff --git a/VectoCore/VectoCore/OutputData/XML/DeclarationReports/VehicleInformationFile/VehicleInformationFile_0_1/PrimaryComponents/VIFElectricMotorTorqueLimitsType.cs b/VectoCore/VectoCore/OutputData/XML/DeclarationReports/VehicleInformationFile/VehicleInformationFile_0_1/PrimaryComponents/VIFElectricMotorTorqueLimitsType.cs
index e7e4fc4ac4..5ab423295f 100644
--- a/VectoCore/VectoCore/OutputData/XML/DeclarationReports/VehicleInformationFile/VehicleInformationFile_0_1/PrimaryComponents/VIFElectricMotorTorqueLimitsType.cs
+++ b/VectoCore/VectoCore/OutputData/XML/DeclarationReports/VehicleInformationFile/VehicleInformationFile_0_1/PrimaryComponents/VIFElectricMotorTorqueLimitsType.cs
@@ -36,7 +36,7 @@ namespace TUGraz.VectoCore.OutputData.XML.DeclarationReports.VehicleInformationF
 				electricMachine);
 		}
 
-		private  List<XElement> GetVoltageLevels(List<Tuple<Volt, TableData>> voltageLevels)
+		private IList<XElement> GetVoltageLevels(IList<Tuple<Volt, TableData>> voltageLevels)
 		{
 			var voltageEntries = new List<XElement>();
 			foreach (var voltageLevel in voltageLevels) 
diff --git a/VectoCore/VectoCore/Utils/Ninject/CombineArgumentsToNameInstanceProviders.cs b/VectoCore/VectoCore/Utils/Ninject/CombineArgumentsToNameInstanceProviders.cs
index bd593b0387..5916afc3ab 100644
--- a/VectoCore/VectoCore/Utils/Ninject/CombineArgumentsToNameInstanceProviders.cs
+++ b/VectoCore/VectoCore/Utils/Ninject/CombineArgumentsToNameInstanceProviders.cs
@@ -68,7 +68,7 @@ namespace TUGraz.VectoCore.Utils.Ninject
 			}
 			catch (Exception e) {
 				var name = GetName(methodInfo, arguments);
-				throw new VectoException("failed to create instance for '{1}' via '{0}' version '{2}' name'{3}'", e, methodInfo.Name, methodInfo.ReturnType.Name, arguments[0], name);
+				throw new VectoException("failed to create instance for '{1}' via '{0}' version '{2}' name'{3}'", e, methodInfo.Name, methodInfo.ReturnType.Name, arguments[0].ToString(), name);
 				
 				//throw e;
 			}
diff --git a/VectoCore/VectoCore/Utils/Ninject/VehicleTypeAndArchitectureStringHelper.cs b/VectoCore/VectoCore/Utils/Ninject/VehicleTypeAndArchitectureStringHelper.cs
index ba319a1f6f..80901c3a64 100644
--- a/VectoCore/VectoCore/Utils/Ninject/VehicleTypeAndArchitectureStringHelper.cs
+++ b/VectoCore/VectoCore/Utils/Ninject/VehicleTypeAndArchitectureStringHelper.cs
@@ -249,6 +249,16 @@ namespace TUGraz.VectoCore.Utils.Ninject
 					return hashCode;
 				}
 			}
+
+			#region Overrides of ValueType
+
+			public override string ToString()
+			{
+				return string.Join("\n", VehicleType, JobType, ArchId, Exempted ? "Exempted" : "Non Exempted",
+					IsSingleBus ? "Single Bus" : "");
+			}
+
+			#endregion
 		}
 	}
 }
\ No newline at end of file
diff --git a/VectoCore/VectoCore/VectoCore.csproj b/VectoCore/VectoCore/VectoCore.csproj
index 161fb79169..e2e18071af 100644
--- a/VectoCore/VectoCore/VectoCore.csproj
+++ b/VectoCore/VectoCore/VectoCore.csproj
@@ -134,6 +134,7 @@
 
   <ItemGroup>
     <Folder Include="InputData\Reader\DataObjectAdapter\CompletedBus\Generic\" />
+    <Folder Include="InputData\Reader\DataObjectAdapter\SimulationComponents\StrategyDataAdapter\" />
   </ItemGroup>
 
 </Project>
\ No newline at end of file
diff --git a/VectoCore/VectoCoreTest/Integration/Hybrid/SerialHybridTest.cs b/VectoCore/VectoCoreTest/Integration/Hybrid/SerialHybridTest.cs
index 8a6f72a615..3f7206e64b 100644
--- a/VectoCore/VectoCoreTest/Integration/Hybrid/SerialHybridTest.cs
+++ b/VectoCore/VectoCoreTest/Integration/Hybrid/SerialHybridTest.cs
@@ -5,6 +5,7 @@ using System.Linq;
 using NUnit.Framework;
 using System.Data;
 using System.Reflection;
+using System.Runtime.CompilerServices;
 using TUGraz.VectoCommon.Exceptions;
 using TUGraz.VectoCommon.InputData;
 using TUGraz.VectoCommon.Models;
@@ -612,12 +613,12 @@ namespace TUGraz.VectoCore.Tests.Integration.Hybrid
 			jobContainer.AddRun(run);
 			return jobContainer;
 		}
-
 		public static VehicleContainer CreateSerialHybridPowerTrain(DrivingCycleData cycleData, string modFileName,
 			double initialBatCharge, SummaryDataContainer sumData, double pAuxEl,
 			PowertrainPosition pos, double ratio, Kilogram payload = null, Watt maxDriveTrainPower = null, 
 			GearboxType gearboxType = GearboxType.NoGearbox, RetarderType retarderType = RetarderType.None)
 		{
+			
 			var gearboxData = CreateGearboxData(gearboxType);
 			var axleGearData = CreateAxleGearData(gearboxType);
 			
@@ -632,8 +633,13 @@ namespace TUGraz.VectoCore.Tests.Integration.Hybrid
 			var electricMotorData = MockSimulationDataFactory.CreateElectricMotorData(emFile, 2, pos, correctedRatio, 1);
 
 			var genFile = GeneratorFile;
-			electricMotorData.AddRange(
-				MockSimulationDataFactory.CreateElectricMotorData(genFile, 1, PowertrainPosition.GEN, 2.6, 1));
+
+			foreach (var md in MockSimulationDataFactory.CreateElectricMotorData(genFile, 1,
+						PowertrainPosition.GEN, 2.6, 1)) {
+				electricMotorData.Add(md);
+			}
+			//electricMotorData.AddRange(
+			//	MockSimulationDataFactory.CreateElectricMotorData(genFile, 1, PowertrainPosition.GEN, 2.6, 1));
 
 			var batFile = BatFile;
 			var batteryData = MockSimulationDataFactory.CreateBatteryData(batFile, initialBatCharge);
diff --git a/VectoCore/VectoCoreTest/Utils/MockDeclarationVehicleInputData.cs b/VectoCore/VectoCoreTest/Utils/MockDeclarationVehicleInputData.cs
index 6c78f97dc7..e37abccbfd 100644
--- a/VectoCore/VectoCoreTest/Utils/MockDeclarationVehicleInputData.cs
+++ b/VectoCore/VectoCoreTest/Utils/MockDeclarationVehicleInputData.cs
@@ -64,7 +64,7 @@ namespace TUGraz.VectoCore.Tests.Utils
 		public Meter EntranceHeight { get; }
 		public ConsumerTechnology? DoorDriveTechnology { get; }
 		public VehicleDeclarationType VehicleDeclarationType { get; }
-		public Dictionary<PowertrainPosition, List<Tuple<Volt, TableData>>> ElectricMotorTorqueLimits { get; }
+		public IDictionary<PowertrainPosition, IList<Tuple<Volt, TableData>>> ElectricMotorTorqueLimits { get; }
 		public TableData BoostingLimitations { get; }
 		public IVehicleComponentsDeclaration Components => this;
 		public XmlNode XMLSource { get; }
@@ -194,7 +194,7 @@ namespace TUGraz.VectoCore.Tests.Utils
 		public IElectricMachinesEngineeringInputData ElectricMachines { get; set; }
 		public IIEPCEngineeringInputData IEPCEngineeringInputData { get; }
 
-		Dictionary<PowertrainPosition, List<Tuple<Volt, TableData>>> IVehicleDeclarationInputData.ElectricMotorTorqueLimits => throw new NotImplementedException();
+		IDictionary<PowertrainPosition, IList<Tuple<Volt, TableData>>> IVehicleDeclarationInputData.ElectricMotorTorqueLimits => throw new NotImplementedException();
 
 		#endregion
 	}
diff --git a/VectoCore/VectoCoreTest/Utils/MockSimulationDataFactory.cs b/VectoCore/VectoCoreTest/Utils/MockSimulationDataFactory.cs
index 140c9e06bf..ea65332b74 100644
--- a/VectoCore/VectoCoreTest/Utils/MockSimulationDataFactory.cs
+++ b/VectoCore/VectoCoreTest/Utils/MockSimulationDataFactory.cs
@@ -200,19 +200,22 @@ namespace TUGraz.VectoCore.Tests.Utils
 			return dao.CreateDriverData(engineeringJob.DriverInputData);
 		}
 
-		public static List<Tuple<PowertrainPosition, ElectricMotorData>> CreateElectricMotorData(string file, int count,
+		public static IList<Tuple<PowertrainPosition, ElectricMotorData>> CreateElectricMotorData(string file, int count,
 			PowertrainPosition pos, double ratio, double efficiency)
 		{
 			var inputData = JSONInputDataFactory.ReadElectricMotorData(file, false);
-			return new EngineeringDataAdapter().CreateElectricMachines(new MockElectricMachinesInputData() {
-				Entries = new[] {
-					new ElectricMachineEntry<IElectricMotorEngineeringInputData>()
-					{
-						Count = count, ElectricMachine = inputData, Position = pos, RatioADC = ratio, MechanicalTransmissionEfficiency = efficiency,
-					}
-				}
-			}, null, null);
-		}
+            
+
+            return new EngineeringDataAdapter().CreateElectricMachines(new MockElectricMachinesInputData()
+            {
+                Entries = new[] {
+                    new ElectricMachineEntry<IElectricMotorEngineeringInputData>()
+                    {
+                        Count = count, ElectricMachine = inputData, Position = pos, RatioADC = ratio, MechanicalTransmissionEfficiency = efficiency,
+                    }
+                }
+            }, null, null);
+        }
 	
 
 		public static BatterySystemData CreateBatteryData(string file, double initialSoC)
@@ -296,7 +299,7 @@ namespace TUGraz.VectoCore.Tests.Utils
 		public Meter EntranceHeight { get; }
 		public ConsumerTechnology? DoorDriveTechnology { get; }
 		public VehicleDeclarationType VehicleDeclarationType { get; }
-		public Dictionary<PowertrainPosition, List<Tuple<Volt, TableData>>> ElectricMotorTorqueLimits { get; }
+		public IDictionary<PowertrainPosition, IList<Tuple<Volt, TableData>>> ElectricMotorTorqueLimits { get; }
 		public TableData BoostingLimitations { get; }
 		public string VehicleTypeApprovalNumber { get; }
 		public ArchitectureID ArchitectureID { get; }
diff --git a/VectoCore/VectoCoreTest/Utils/MockVehicleInputData.cs b/VectoCore/VectoCoreTest/Utils/MockVehicleInputData.cs
index 632be8b00f..d52875e985 100644
--- a/VectoCore/VectoCoreTest/Utils/MockVehicleInputData.cs
+++ b/VectoCore/VectoCoreTest/Utils/MockVehicleInputData.cs
@@ -102,7 +102,7 @@ namespace TUGraz.VectoCore.Tests.Utils
 
 		public VehicleDeclarationType VehicleDeclarationType { get; }
 
-		public Dictionary<PowertrainPosition, List<Tuple<Volt, TableData>>> ElectricMotorTorqueLimits { get; }
+		public IDictionary<PowertrainPosition, IList<Tuple<Volt, TableData>>> ElectricMotorTorqueLimits { get; }
 
 		public TableData BoostingLimitations => throw new NotImplementedException();
 
-- 
GitLab