diff --git a/.gitignore b/.gitignore
index 83d5f953f1ebd2d9f2b795519129f9cd7e2ef0a1..1e56170040718eb8de84cd9612d3b86f5562cc7c 100644
--- a/.gitignore
+++ b/.gitignore
@@ -224,3 +224,4 @@ Documentation/VehiclesReleaseComparisonDeclarationMode/**/*.vsum
 /VectoCommon/VectoCommon/InputData/BusInputData.cd
 /.idea/.idea.VECTO/.idea
 
+/Generic Vehicles/Engineering Mode/GenericIHPC/6SpeedGbx/EM_Maps.xlsx
diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/DeclarationDataAdapterHeavyLorry.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/DeclarationDataAdapterHeavyLorry.cs
index 4c956cc9eea2d9c8cbfbbb2730a895a4386e6a6e..b0a5e4dbff3b1191259222e022b46e629c0adabf 100644
--- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/DeclarationDataAdapterHeavyLorry.cs
+++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/DeclarationDataAdapterHeavyLorry.cs
@@ -366,8 +366,8 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.HeavyLorry
 			private PTODataAdapterLorry _ptoAdapterLorry = new PTODataAdapterLorry();
 			protected override GearboxType[] SupportedGearboxTypes => new[]
 				{ GearboxType.AMT, GearboxType.ATPowerSplit, GearboxType.ATSerial };
-			//private IGearboxDataAdapter _gearboxDataAdapter = new GearboxDataAdapter(new TorqueConverterDataAdapter());
-			private GearboxDataAdapter _gearboxDataAdapter = new GearboxDataAdapter(null);
+			private IGearboxDataAdapter _gearboxDataAdapter = new GearboxDataAdapter(new TorqueConverterDataAdapter());
+			//private GearboxDataAdapter _gearboxDataAdapter = new GearboxDataAdapter(null);
 
 			//private ElectricStorageAdapter _electricStorageAdapter = new ElectricStorageAdapter();
 			#region Overrides of LorryBase
diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/ElectricMachinesDataAdapter.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/ElectricMachinesDataAdapter.cs
index d02868a0c7a52f00bbaed4d3847435a54b8c20ee..a73638a3d5fa72904f076d67e920f8ad9bca95aa 100644
--- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/ElectricMachinesDataAdapter.cs
+++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/ElectricMachinesDataAdapter.cs
@@ -156,6 +156,8 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponen
 
 			}
 
+			public IList<IElectricMotorVoltageLevel> VoltageLevels => _voltageLevels;
+
 
 			#region Implementation of IComponentInputData
 
@@ -191,7 +193,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponen
 
 			public string IHPCType => _electricMotorDeclarationInputDataImplementation.IHPCType;
 
-			public IList<IElectricMotorVoltageLevel> VoltageLevels => _electricMotorDeclarationInputDataImplementation.VoltageLevels;
+		
 
 			public TableData DragCurve => _electricMotorDeclarationInputDataImplementation.DragCurve;
 
@@ -211,18 +213,26 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponen
 			IElectricMachinesDeclarationInputData electricMachines,
 			IDictionary<PowertrainPosition, IList<Tuple<Volt, TableData>>> torqueLimits, Volt averageVoltage, GearList gearlist = null)
 		{
+
+
 			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");
 			}
+
+
+
+
 			CheckTorqueLimitVoltageLevels(electricMachines, torqueLimits);
 			
 			return electricMachines.Entries
 				.Select(m => Tuple.Create(m.Position,
-					CreateElectricMachine(m.Position, m.ElectricMachine, m.Count, m.ADC?.Ratio ?? 1.0, m.RatioPerGear,
+					CreateElectricMachine(m.Position, m.ElectricMachine, m.Count, m.RatioADC, m.RatioPerGear,
 						m.MechanicalTransmissionLossMap, torqueLimits?.FirstOrDefault(t => t.Key == m.Position).Value, averageVoltage, gearlist))).ToList();
 
 		}
@@ -275,7 +285,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponen
 				var fullLoadCurveCombined = IntersectEMFullLoadCurves(fullLoadCurve, maxTorqueCurve);
 
 				try {
-					var vLevelData = powertrainPosition == PowertrainPosition.IHPC
+					var vLevelData = motorData.IsIHPC()
 						? CreateIHPCVoltageLevelData(count, entry, fullLoadCurveCombined, gearList)
 						: CreateEmVoltageLevelData(count, entry, fullLoadCurveCombined);
 					voltageLevels.Add(vLevelData);
@@ -482,13 +492,8 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponen
 
 
 			var voltageLevels = new List<ElectricMotorVoltageLevelData>();
-			var inputDataVoltageLevels = iepc.CertificationMethod != CertificationMethod.StandardValues
-				? iepc.VoltageLevels.OrderBy(x => x.VoltageLevel).AsEnumerable()
-				: new List<IElectricMotorVoltageLevel>() {
-					iepc.VoltageLevels.First(), iepc.VoltageLevels.First()
-				};
 
-			foreach (var entry in inputDataVoltageLevels)
+			foreach (var entry in iepc.VoltageLevels.OrderBy(x => x.VoltageLevel).AsEnumerable())
 			{
 				var effMap = new Dictionary<uint, EfficiencyMap>();
 				var fldCurve =
diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/GearBoxDataAdapter.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/GearBoxDataAdapter.cs
index 3ea0b1f1e4aaf54c5ae2146c3c07bf179aec4fb7..e558f05d57c16d473b71b5c741add1b80598e2bf 100644
--- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/GearBoxDataAdapter.cs
+++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/GearBoxDataAdapter.cs
@@ -377,7 +377,8 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponen
 			}
 
 			retVal.Gears = gears;
-			if (retVal.Type.AutomaticTransmission())
+			
+			if (retVal.Type.AutomaticTransmission() && retVal.Type != GearboxType.APTN && retVal.Type != GearboxType.IHPC)
 			{
 				var ratio = double.IsNaN(retVal.Gears[1].Ratio)
 					? 1
diff --git a/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationMode/HeavyLorryRunDataFactory/DeclarationModeHeavyLorryRunDataFactory.cs b/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationMode/HeavyLorryRunDataFactory/DeclarationModeHeavyLorryRunDataFactory.cs
index 7975950d17d6c832f5ab8f1a6a274d81aecd50bf..15d02bc33cb5a58d17a75bac09d38dca7ed9b545 100644
--- a/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationMode/HeavyLorryRunDataFactory/DeclarationModeHeavyLorryRunDataFactory.cs
+++ b/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationMode/HeavyLorryRunDataFactory/DeclarationModeHeavyLorryRunDataFactory.cs
@@ -195,6 +195,9 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.HeavyLorryRunDa
 
 
 			#endregion
+
+			protected abstract bool AxleGearRequired();
+
 		}
 
 		public sealed class Conventional : LorryBase
@@ -311,6 +314,13 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.HeavyLorryRunDa
 					ShiftPolygonCalculator.Create(shiftStrategyName, runData.GearshiftParameters));
 			}
 
+			protected override bool AxleGearRequired()
+			{
+				return true;
+			}
+
+			
+
 			#endregion
 		}
 
@@ -318,6 +328,15 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.HeavyLorryRunDa
 
 		public abstract class BatteryElectric : LorryBase
 		{
+			#region Overrides of LorryBase
+
+			protected override bool AxleGearRequired()
+			{
+				return InputDataProvider.JobInputData.Vehicle.ArchitectureID != ArchitectureID.E4;
+			}
+
+			#endregion
+
 			public BatteryElectric(IDeclarationInputDataProvider dataProvider, IDeclarationReport report,
 				ILorryDeclarationDataAdapter declarationDataAdapter) : base(dataProvider, report,
 				declarationDataAdapter)
@@ -379,7 +398,7 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.HeavyLorryRunDa
 
 
 				result.AngledriveData = DataAdapter.CreateAngledriveData(vehicle.Components.AngledriveInputData);
-				if (vehicle.ArchitectureID != ArchitectureID.E4) {
+				if (AxleGearRequired()) {
 					result.AxleGearData = DataAdapter.CreateAxleGearData(vehicle.Components.AxleGearInputData);
 				}
 				
@@ -502,6 +521,38 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.HeavyLorryRunDa
 
 			}
 
+			protected override bool AxleGearRequired()
+			{
+				var vehicle = InputDataProvider.JobInputData.Vehicle;
+				var iepcInput = vehicle.Components.IEPC;
+				var axleGearRequired = !iepcInput.DifferentialIncluded && !iepcInput.DesignTypeWheelMotor;
+				if (axleGearRequired && vehicle.Components.AxleGearInputData == null)
+				{
+					throw new VectoException(
+						$"Axlegear reqhired for selected type of IEPC! DifferentialIncluded: {iepcInput.DifferentialIncluded}, DesignTypeWheelMotor: {iepcInput.DesignTypeWheelMotor}");
+				}
+
+				var numGearsPowermap =
+					iepcInput.VoltageLevels.Select(x => Tuple.Create(x.VoltageLevel, x.PowerMap.Count)).ToArray();
+				var gearCount = iepcInput.Gears.Count;
+				var numGearsDrag = iepcInput.DragCurves.Count;
+
+				if (numGearsPowermap.Any(x => x.Item2 != gearCount))
+				{
+					throw new VectoException(
+						$"Number of gears for voltage levels does not match! PowerMaps: {numGearsPowermap.Select(x => $"{x.Item1}: {x.Item2}").Join()}; Gear count: {gearCount}");
+				}
+
+				if (numGearsDrag > 1 && numGearsDrag != gearCount)
+				{
+					throw new VectoException(
+						$"Number of gears drag curve does not match gear count! DragCurve {numGearsDrag}; Gear count: {gearCount}");
+				}
+
+				return axleGearRequired;
+
+			}
+
 			#region Overrides of BatteryElectric
 
 			protected override void CreateGearboxAndGearshiftData(IVehicleDeclarationInputData vehicle, VectoRunData runData)
@@ -561,6 +612,14 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.HeavyLorryRunDa
 
 			#endregion
 
+			#region Overrides of LorryBase
+
+			protected override bool AxleGearRequired()
+			{
+				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
index bda414eb6074fdcd06dc2ea3126eccb8e80eb487..fa2139e19df884fb6edf5fc1a8c0b5c5222aed50 100644
--- a/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationMode/HeavyLorryRunDataFactory/DeclarationModeHeavyLorryRunDataFactory_Hybrid.cs
+++ b/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationMode/HeavyLorryRunDataFactory/DeclarationModeHeavyLorryRunDataFactory_Hybrid.cs
@@ -75,6 +75,14 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.HeavyLorryRunDa
 
 		public class SerialHybrid : Hybrid
 		{
+			#region Overrides of LorryBase
+
+			protected override bool AxleGearRequired()
+			{
+				return InputDataProvider.JobInputData.Vehicle.Components.AxleGearInputData != null;
+			}
+
+			#endregion
 
 			public SerialHybrid(IDeclarationInputDataProvider dataProvider, IDeclarationReport report,
 				ILorryDeclarationDataAdapter declarationDataAdapter) : base(dataProvider, report,
@@ -127,7 +135,7 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.HeavyLorryRunDa
 					iepcData.ForEach(iepc => runData.ElectricMachinesData.Add(iepc));
 				}
 
-				if (vehicle.Components.AxleGearInputData != null) {
+				if (AxleGearRequired()) {
 					runData.AxleGearData = DataAdapter.CreateAxleGearData(vehicle.Components.AxleGearInputData);
 				}
 				
@@ -193,6 +201,8 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.HeavyLorryRunDa
 				_segment = GetSegment(InputDataProvider.JobInputData.Vehicle, false);
 			}
 
+			
+
 			#endregion
 		}
 
@@ -227,9 +237,7 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.HeavyLorryRunDa
 				DataAdapter.CreateREESSData(vehicle.Components.ElectricStorage, vehicle.VehicleType, vehicle.OvcHev,
 					((batteryData) => runData.BatteryData = batteryData),
 					((sCdata => runData.SuperCapData = sCdata)));
-				runData.ElectricMachinesData = DataAdapter.CreateElectricMachines(
-					vehicle.Components.ElectricMachines, vehicle.ElectricMotorTorqueLimits,
-					runData.BatteryData.CalculateAverageVoltage());
+			
 
 
 				
@@ -245,6 +253,9 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.HeavyLorryRunDa
 
 		
 				CreateGearboxAndGearshiftData(vehicle, runData);
+				runData.ElectricMachinesData = DataAdapter.CreateElectricMachines(
+					vehicle.Components.ElectricMachines, vehicle.ElectricMotorTorqueLimits,
+					runData.BatteryData.CalculateAverageVoltage(), runData.GearboxData.GearList);
 
 				runData.HybridStrategyParameters =
 					DataAdapter.CreateHybridStrategy(runData.BatteryData, runData.SuperCapData, runData.VehicleData.TotalVehicleMass, ovcMode, loading.Key, runData.VehicleData.VehicleClass, mission.MissionType);
@@ -307,6 +318,10 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.HeavyLorryRunDa
 					ShiftPolygonCalculator.Create(shiftStrategyName, runData.GearshiftParameters));
 			}
 
+			protected override bool AxleGearRequired()
+			{
+				return true;
+			}
 			#endregion
 
 			#endregion
@@ -364,18 +379,9 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.HeavyLorryRunDa
 
 			}
 
-			#region Overrides of SerialHybrid
-
-			protected override VectoRunData CreateVectoRunData(IVehicleDeclarationInputData vehicle, Mission mission, KeyValuePair<LoadingType, Tuple<Kilogram, double?>> loading,
-				int? modeIdx, VectoRunData.OvcHevMode ovcMode = VectoRunData.OvcHevMode.NotApplicable)
-			{
-				AxleGearRequired();
-				return base.CreateVectoRunData(vehicle, mission, loading, modeIdx, ovcMode);
-			}
-
-			#endregion
+			#region Overrides of LorryBase
 
-			private bool AxleGearRequired()
+			protected override bool AxleGearRequired()
 			{
 				var vehicle = InputDataProvider.JobInputData.Vehicle;
 				var iepcInput = vehicle.Components.IEPC;
@@ -406,6 +412,19 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.HeavyLorryRunDa
 				return axleGearRequired;
 			}
 
+			#endregion
+
+			#region Overrides of SerialHybrid
+
+			protected override VectoRunData CreateVectoRunData(IVehicleDeclarationInputData vehicle, Mission mission, KeyValuePair<LoadingType, Tuple<Kilogram, double?>> loading,
+				int? modeIdx, VectoRunData.OvcHevMode ovcMode = VectoRunData.OvcHevMode.NotApplicable)
+			{
+				AxleGearRequired();
+				return base.CreateVectoRunData(vehicle, mission, loading, modeIdx, ovcMode);
+			}
+
+			#endregion
+
 			#region Overrides of SerialHybrid
 
 			protected override void CreateGearboxAndGearshiftData(IVehicleDeclarationInputData vehicle, VectoRunData runData)
diff --git a/VectoCore/VectoCoreTest/Integration/Declaration/HeavyLorry/HeavyLorrySimulation.cs b/VectoCore/VectoCoreTest/Integration/Declaration/HeavyLorry/HeavyLorrySimulation.cs
index 0666a4e0d5c1cca546787932382feedcc180586d..9105e8792172b6ae229e0216da584f22169b6ff0 100644
--- a/VectoCore/VectoCoreTest/Integration/Declaration/HeavyLorry/HeavyLorrySimulation.cs
+++ b/VectoCore/VectoCoreTest/Integration/Declaration/HeavyLorry/HeavyLorrySimulation.cs
@@ -427,7 +427,7 @@ public class HeavyLorrySimulation
 	[TestCase(@"HeavyLorry\PEV\PEV_heavyLorry_AMT_E2.xml", 6)]
 	[TestCase(Group5_PEV_E3,10)]
 	[TestCase(@"HeavyLorry\PEV\Group5_ PEV_E4.xml",10)]
-	[TestCase(@"HeavyLorry\PEV\PEV_heavyLorry_E4_standardValues.xml", 10)]
+	[TestCase(@"HeavyLorry\PEV\PEV_heavyLorry_E4_standardValues.xml", 6)]
 	[TestCase(@"HeavyLorry\PEV\Group5_ PEV_IEPC_E.xml",10)]
 	public void PEV(string jobFile, int nrRuns)
 	{