diff --git a/VectoCommon/VectoCommon/Models/PowertrainPosition.cs b/VectoCommon/VectoCommon/Models/PowertrainPosition.cs
index 234587ed79c907266b875081e82c8af61c4c8d80..90c7bc5adf9da51eb16a58ebc0e48889fa2b623c 100644
--- a/VectoCommon/VectoCommon/Models/PowertrainPosition.cs
+++ b/VectoCommon/VectoCommon/Models/PowertrainPosition.cs
@@ -78,6 +78,7 @@ namespace TUGraz.VectoCommon.InputData
 				case PowertrainPosition.BatteryElectricE2:
 				case PowertrainPosition.BatteryElectricE3:
 				case PowertrainPosition.BatteryElectricE4:
+				case PowertrainPosition.IEPC:
 					return true;
 				default:
 					return false;
diff --git a/VectoCore/VectoCore/InputData/FileIO/JSON/JSONInputData.cs b/VectoCore/VectoCore/InputData/FileIO/JSON/JSONInputData.cs
index 7a964cfbe5c709a3fe11a5a68b1562643bacc8fc..3241e88cfe7e455c87fdd5b88e9cd0777a684b90 100644
--- a/VectoCore/VectoCore/InputData/FileIO/JSON/JSONInputData.cs
+++ b/VectoCore/VectoCore/InputData/FileIO/JSON/JSONInputData.cs
@@ -1148,7 +1148,10 @@ namespace TUGraz.VectoCore.InputData.FileIO.JSON
 			tolerateMissing)
 		{
 			VehicleData = ReadVehicle();
-			
+			if (Body[JsonKeys.Vehicle_EngineFile] != null) {
+				Engine = ReadEngine();
+			}
+
 			if (Body[JsonKeys.Vehicle_GearboxFile] != null && !string.IsNullOrWhiteSpace(Body[JsonKeys.Vehicle_GearboxFile].Value<string>())) {
 				AxleGear = ReadGearbox() as IAxleGearInputData;
 			}
@@ -1159,6 +1162,11 @@ namespace TUGraz.VectoCore.InputData.FileIO.JSON
 				? null
 				: JSONInputDataFactory.ReadShiftParameters(Path.Combine(BasePath, Body.GetEx<string>("TCU")), false);
 
+		public override IHybridStrategyParameters HybridStrategyParameters =>
+			Body["HybridStrategyParams"] == null
+				? null : JSONInputDataFactory.ReadHybridStrategyParameters(
+					Path.Combine(BasePath, Body.GetEx<string>("HybridStrategyParams")), false);
+
 		public override VectoSimulationJobType JobType => VehicleData.VehicleType;
 	}
 
diff --git a/VectoCore/VectoCore/InputData/Reader/Impl/EngineeringModeVectoRunDataFactory.cs b/VectoCore/VectoCore/InputData/Reader/Impl/EngineeringModeVectoRunDataFactory.cs
index c740263f4c96a2910675341d99c8080d1eef5781..a009bb79ceb44a4dfc9e623c0af3dafec63a2158 100644
--- a/VectoCore/VectoCore/InputData/Reader/Impl/EngineeringModeVectoRunDataFactory.cs
+++ b/VectoCore/VectoCore/InputData/Reader/Impl/EngineeringModeVectoRunDataFactory.cs
@@ -82,13 +82,13 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl
 					return GetSerialHybridRunData();
 				case VectoSimulationJobType.IEPC_E:
 					return GetIEPCRunData();
+				case VectoSimulationJobType.IEPC_S:
+					return GetIEPC_S_RunData();
 				default:
 					throw new ArgumentOutOfRangeException($"Invalid JobType {InputDataProvider.JobInputData.JobType}");
 			}
 		}
 
-		
-
 		private IEnumerable<VectoRunData> GetSerialHybridRunData()
 		{
 			var engine = InputDataProvider.JobInputData.Vehicle.Components.EngineInputData;
@@ -343,6 +343,15 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl
 		}
 
 		private IEnumerable<VectoRunData> GetIEPCRunData()
+		{
+			var axleGearRequired = AxleGearRequired();
+			var dao = new EngineeringDataAdapter();
+			foreach (var cycle in InputDataProvider.JobInputData.Cycles) {
+				yield return GetIEPCVectoRunData(axleGearRequired, cycle, dao);
+			}
+		}
+
+		private bool AxleGearRequired()
 		{
 			var vehicle = InputDataProvider.JobInputData.Vehicle;
 			var iepcInput = vehicle.Components.IEPCEngineeringInputData;
@@ -352,10 +361,11 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl
 					$"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 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}");
@@ -366,87 +376,128 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl
 					$"Number of gears drag curve does not match gear count! DragCurve {numGearsDrag}; Gear count: {gearCount}");
 			}
 
-			foreach (var cycle in InputDataProvider.JobInputData.Cycles) {
-				var dao = new EngineeringDataAdapter();
-				var driver = dao.CreateDriverData(InputDataProvider.DriverInputData);
+			return axleGearRequired;
+		}
 
-				var axlegearData = axleGearRequired && vehicle.Components.AxleGearInputData != null
-					? dao.CreateAxleGearData(vehicle.Components.AxleGearInputData)
-					: null;
-					//new AxleGearData() {
-					//	AxleGear = new TransmissionData() {
-					//		Ratio = 1.0,
-					//		LossMap = TransmissionLossMapReader.Create(1.0, 1.0, "DummyAxleGearIEPC")
-					//	}
-					//};
+		private IEnumerable<VectoRunData> GetIEPC_S_RunData()
+		{
+			var axleGearRequired = AxleGearRequired();
 
-				var batteryData = dao.CreateBatteryData(vehicle.Components.ElectricStorage, vehicle.InitialSOC);
-				var supercapData = dao.CreateSuperCapData(vehicle.Components.ElectricStorage, vehicle.InitialSOC);
+			var vehicle = InputDataProvider.JobInputData.Vehicle;
+			var engine = vehicle.Components.EngineInputData;
+			if (engine == null) {
+				throw new VectoException("Combustion Engine is required for IEPC-S vehicle configurations");
+			}
+			var engineModes = engine.EngineModes;
 
-				var averageVoltage = batteryData != null ? CalculateAverageVoltage(batteryData) : null;
-				var electricMachinesData = dao.CreateIEPCElectricMachines(vehicle.Components.IEPCEngineeringInputData, averageVoltage);
-				var powertrainPosition = electricMachinesData.First(e => e.Item1 != PowertrainPosition.GEN).Item1;
-				var retarderData = axleGearRequired
-					? dao.CreateRetarderData(vehicle.Components.RetarderInputData, powertrainPosition)
-					: new RetarderData() {
-						Type = RetarderType.LossesIncludedInTransmission
-					};
+			var dao = new EngineeringDataAdapter();
+			for (var modeIdx = 0; modeIdx < engineModes.Count; modeIdx++) {
+				var engineMode = engineModes[modeIdx];
+				foreach (var cycle in InputDataProvider.JobInputData.Cycles) {
+					var engineData = dao.CreateEngineData(vehicle, engineMode);
+					engineData.FuelMode = modeIdx;
+					
+					var runData = GetIEPCVectoRunData(axleGearRequired, cycle, dao);
+					var averageVoltage = CalculateAverageVoltage(runData.BatteryData);
+					
+					var electricMachinesData = dao.CreateElectricMachines(vehicle.Components.ElectricMachines, vehicle.ElectricMotorTorqueLimits, averageVoltage);
 
-				var gearshiftParams = dao.CreateGearshiftData(GearboxType.APTN,
-						InputDataProvider.DriverInputData.GearshiftInputData,
-						axlegearData?.AxleGear.Ratio ?? 1.0, null);
-				var tmpRunData = new VectoRunData() {
-					JobType = VectoSimulationJobType.IEPC_E,
-					GearboxData = new GearboxData() {
-						Type = GearboxType.APTN,
-					},
-					GearshiftParameters = gearshiftParams,
-					ElectricMachinesData = electricMachinesData,
-					//VehicleData = dao.CreateVehicleData(vehicle)
-				};
-				var tempVehicle = dao.CreateVehicleData(vehicle);
-				var tmpStrategy = PowertrainBuilder.GetShiftStrategy(new SimplePowertrainContainer(tmpRunData));
-				var gearboxData = dao.CreateIEPCGearboxData(
-					InputDataProvider, new VectoRunData() {
-						JobType = VectoSimulationJobType.IEPC_E,
-						VehicleData = tempVehicle,
-						AxleGearData = axlegearData,
-						ElectricMachinesData = electricMachinesData
-					}, tmpStrategy);
+					var hybridParameters = dao.CreateHybridStrategyParameters(InputDataProvider.JobInputData,
+						engineData, runData.GearboxData);
 
-				var crossWindRequired = vehicle.Components.AirdragInputData.CrossWindCorrectionMode ==
-										CrossWindCorrectionMode.VAirBetaLookupTable;
-				//var ptoTransmissionData = dao.CreatePTOTransmissionData(vehicle.Components.PTOTransmissionInputData);
+					foreach (var gear in runData.GearboxData.Gears.Keys) {
+						engineData.FullLoadCurves[gear] = engineData.FullLoadCurves[0];
+					}
+					runData.JobType = VectoSimulationJobType.IEPC_S;
+					runData.EngineData = engineData;
+					runData.ElectricMachinesData.Add(electricMachinesData.First(x => x.Item1 == PowertrainPosition.GEN));
+					runData.HybridStrategyParameters = hybridParameters;
+					yield return runData;
+				}
+			}
+		}
 
-				var drivingCycle = GetDrivingCycle(cycle, crossWindRequired);
 
-				var vehicleData = dao.CreateVehicleData(vehicle);
-				yield return new VectoRunData {
-					JobName = InputDataProvider.JobInputData.JobName,
+		private VectoRunData GetIEPCVectoRunData(bool axleGearRequired, ICycleData cycle, EngineeringDataAdapter dao)
+		{
+			var vehicle = InputDataProvider.JobInputData.Vehicle;
+			
+			var driver = dao.CreateDriverData(InputDataProvider.DriverInputData);
+
+			var axlegearData = axleGearRequired && vehicle.Components.AxleGearInputData != null
+				? dao.CreateAxleGearData(vehicle.Components.AxleGearInputData)
+				: null;
+
+			var batteryData = dao.CreateBatteryData(vehicle.Components.ElectricStorage, vehicle.InitialSOC);
+			var supercapData = dao.CreateSuperCapData(vehicle.Components.ElectricStorage, vehicle.InitialSOC);
+
+			var averageVoltage = batteryData != null ? CalculateAverageVoltage(batteryData) : null;
+			var electricMachinesData =
+				dao.CreateIEPCElectricMachines(vehicle.Components.IEPCEngineeringInputData, averageVoltage);
+			var powertrainPosition = electricMachinesData.First(e => e.Item1 != PowertrainPosition.GEN).Item1;
+			var retarderData = axleGearRequired
+				? dao.CreateRetarderData(vehicle.Components.RetarderInputData, powertrainPosition)
+				: new RetarderData() {
+					Type = RetarderType.LossesIncludedInTransmission
+				};
+
+			var gearshiftParams = dao.CreateGearshiftData(GearboxType.APTN,
+				InputDataProvider.DriverInputData.GearshiftInputData,
+				axlegearData?.AxleGear.Ratio ?? 1.0, null);
+			var tmpRunData = new VectoRunData() {
+				JobType = VectoSimulationJobType.IEPC_E,
+				GearboxData = new GearboxData() {
+					Type = GearboxType.APTN,
+				},
+				GearshiftParameters = gearshiftParams,
+				ElectricMachinesData = electricMachinesData,
+				//VehicleData = dao.CreateVehicleData(vehicle)
+			};
+			var tempVehicle = dao.CreateVehicleData(vehicle);
+			var tmpStrategy = PowertrainBuilder.GetShiftStrategy(new SimplePowertrainContainer(tmpRunData));
+			var gearboxData = dao.CreateIEPCGearboxData(
+				InputDataProvider, new VectoRunData() {
 					JobType = VectoSimulationJobType.IEPC_E,
-					GearboxData = gearboxData,
+					VehicleData = tempVehicle,
 					AxleGearData = axlegearData,
-					AngledriveData = null,
-					VehicleData = vehicleData,
-					AirdragData = dao.CreateAirdragData(vehicle.Components.AirdragInputData, vehicle),
-					DriverData = driver,
-					Aux = dao.CreateAuxiliaryData(vehicle.Components.AuxiliaryInputData),
-					BusAuxiliaries = dao.CreateBusAuxiliariesData(vehicle.Components.AuxiliaryInputData, vehicleData, VectoSimulationJobType.BatteryElectricVehicle),
-					Retarder = retarderData,
-					//PTO = ptoTransmissionData,
-					Cycle = new DrivingCycleProxy(drivingCycle, cycle.Name),
-					ExecutionMode = ExecutionMode.Engineering,
-					ElectricMachinesData = electricMachinesData,
-					//HybridStrategyParameters = dao.CreateHybridStrategyParameters(InputDataProvider.JobInputData.HybridStrategyParameters),
-					BatteryData = batteryData,
-					SuperCapData = supercapData,
-					SimulationType = SimulationType.DistanceCycle | SimulationType.MeasuredSpeedCycle | SimulationType.PWheel,
-					GearshiftParameters = gearshiftParams,
-					ElectricAuxDemand = InputDataProvider.JobInputData.Vehicle.Components.AuxiliaryInputData.Auxiliaries.ElectricPowerDemand,
-				};
-			}
+					ElectricMachinesData = electricMachinesData
+				}, tmpStrategy);
+
+			var crossWindRequired = vehicle.Components.AirdragInputData.CrossWindCorrectionMode ==
+									CrossWindCorrectionMode.VAirBetaLookupTable;
+			//var ptoTransmissionData = dao.CreatePTOTransmissionData(vehicle.Components.PTOTransmissionInputData);
+
+			var drivingCycle = GetDrivingCycle(cycle, crossWindRequired);
+
+			var vehicleData = dao.CreateVehicleData(vehicle);
+			return new VectoRunData {
+				JobName = InputDataProvider.JobInputData.JobName,
+				JobType = VectoSimulationJobType.IEPC_E,
+				GearboxData = gearboxData,
+				AxleGearData = axlegearData,
+				AngledriveData = null,
+				VehicleData = vehicleData,
+				AirdragData = dao.CreateAirdragData(vehicle.Components.AirdragInputData, vehicle),
+				DriverData = driver,
+				Aux = dao.CreateAuxiliaryData(vehicle.Components.AuxiliaryInputData),
+				BusAuxiliaries = dao.CreateBusAuxiliariesData(vehicle.Components.AuxiliaryInputData, vehicleData,
+					VectoSimulationJobType.BatteryElectricVehicle),
+				Retarder = retarderData,
+				//PTO = ptoTransmissionData,
+				Cycle = new DrivingCycleProxy(drivingCycle, cycle.Name),
+				ExecutionMode = ExecutionMode.Engineering,
+				ElectricMachinesData = electricMachinesData,
+				//HybridStrategyParameters = dao.CreateHybridStrategyParameters(InputDataProvider.JobInputData.HybridStrategyParameters),
+				BatteryData = batteryData,
+				SuperCapData = supercapData,
+				SimulationType = SimulationType.DistanceCycle | SimulationType.MeasuredSpeedCycle | SimulationType.PWheel,
+				GearshiftParameters = gearshiftParams,
+				ElectricAuxDemand = InputDataProvider.JobInputData.Vehicle.Components.AuxiliaryInputData.Auxiliaries
+					.ElectricPowerDemand,
+			};
 		}
 
+
 		protected virtual IEnumerable<VectoRunData> GetConventionalVehicleRunData()
 		{
 			var engine = InputDataProvider.JobInputData.Vehicle.Components.EngineInputData;