diff --git a/Documentation/User Manual Source/material User Manual.pptx b/Documentation/User Manual Source/material User Manual.pptx
index a3f5a0a78e18a538105222dac7fd93bbaca9f2f0..2d28b13f895c7b8ba85633cf3eb3d2411b28106a 100644
Binary files a/Documentation/User Manual Source/material User Manual.pptx and b/Documentation/User Manual Source/material User Manual.pptx differ
diff --git a/Generic Vehicles/Engineering Mode/GenericIEPC/IEPC_Gbx3Speed/Axlegear.vgbx b/Generic Vehicles/Engineering Mode/GenericIEPC/IEPC_Gbx3Speed/Axlegear.vgbx
index 8c4b5d9467fc9de8c168253de67633e521e24a0f..96a5496c2e5141440ff16906fcf3c3554e0503d3 100644
--- a/Generic Vehicles/Engineering Mode/GenericIEPC/IEPC_Gbx3Speed/Axlegear.vgbx	
+++ b/Generic Vehicles/Engineering Mode/GenericIEPC/IEPC_Gbx3Speed/Axlegear.vgbx	
@@ -21,7 +21,7 @@
     "StartTqReserve": 20.0,
     "StartSpeed": 2.22222222222222,
     "StartAcc": 0.8,
-    "GearboxType": "AMT",
+    "GearboxType": "IEPC",
     "TorqueConverter": {
       "Enabled": false
     },
diff --git a/VECTO/GUI/VectoJobForm.vb b/VECTO/GUI/VectoJobForm.vb
index 24f05e99539b69f13b1e1a961667ed776dd5a2d7..2a1ffb8d412bddc3c08cb27b145476d1e3139c4e 100644
--- a/VECTO/GUI/VectoJobForm.vb
+++ b/VECTO/GUI/VectoJobForm.vb
@@ -484,7 +484,7 @@ Public Class VectoJobForm
 		Else
 			TbENG.Text = ""
 		End If
-		If (JobType <> VectoSimulationJobType.BatteryElectricVehicle AndAlso inputData.JobInputData.Vehicle.Components.GearboxInputData IsNot Nothing) Then
+		If (JobType <> VectoSimulationJobType.BatteryElectricVehicle orelse inputData.JobInputData.Vehicle.Components.GearboxInputData IsNot Nothing) Then
 			TbGBX.Text = GetRelativePath(inputData.JobInputData.Vehicle.Components.GearboxInputData.DataSource.SourceFile, _basePath)
 		Else
 			TbGBX.Text = ""
@@ -1190,7 +1190,11 @@ Public Class VectoJobForm
 
 		If gearbox Is Nothing Then Return
 
-		TbGbxTxt.Text = $"{gearbox.Gears.Count}-Speed {gearbox.Type.ShortName()} {gearbox.Model}"
+        if (JobType = VectoSimulationJobType.IEPC_E OrElse  JobType = VectoSimulationJobType.IEPC_S) Then
+            TbGbxTxt.Text = $"IEPC {gearbox.Model}"
+        else
+            TbGbxTxt.Text = $"{gearbox.Gears.Count}-Speed {gearbox.Type.ShortName()} {gearbox.Model}"
+        End If
 
 	    If Cfg.DeclMode Then
 			For i = 1 To gearbox.Gears.Count
diff --git a/VECTO/GUI/VehicleForm.Designer.vb b/VECTO/GUI/VehicleForm.Designer.vb
index fe2600c7fd2ee8d95399dfa3c39a395c6b60708b..57014cc2535049434105d389039072b15149aabd 100644
--- a/VECTO/GUI/VehicleForm.Designer.vb
+++ b/VECTO/GUI/VehicleForm.Designer.vb
@@ -2047,7 +2047,7 @@ Partial Class VehicleForm
         Me.gbPropulsionTorque.Size = New System.Drawing.Size(604, 80)
         Me.gbPropulsionTorque.TabIndex = 2
         Me.gbPropulsionTorque.TabStop = false
-        Me.gbPropulsionTorque.Text = "Propulsion Torque Limit"
+        Me.gbPropulsionTorque.Text = "Boosting Torque Limits"
         '
         'btnPropulsionTorqueLimit
         '
diff --git a/VECTO/GUI/VehicleForm.vb b/VECTO/GUI/VehicleForm.vb
index f0eeab8f8baff1444a04eac4c92116682a461002..1783d6aaaae0051ee8ce52b29bf3979fdc6934ec 100644
--- a/VECTO/GUI/VehicleForm.vb
+++ b/VECTO/GUI/VehicleForm.vb
@@ -698,6 +698,12 @@ Public Class VehicleForm
 			    gbEMTorqueLimits.Enabled = False
 			    tcVehicleComponents.TabPages.Remove(tpTorqueLimits)
 
+				'ADAS ---------------------------------------------------------------------
+				cbEngineStopStart.Visible = False
+				cbAtEcoRollReleaseLockupClutch.Visible = False
+				pnEcoRoll.Visible = False
+				cbEcoRoll.SelectedIndex = 0
+
 				'PTO
 				gbPTO.Enabled = False
 				pnPTO.Enabled = false
@@ -710,6 +716,12 @@ Public Class VehicleForm
 			    gbEMTorqueLimits.Enabled = False
 			    tcVehicleComponents.TabPages.Remove(tpTorqueLimits)
 				
+				'ADAS ---------------------------------------------------------------------
+				cbEngineStopStart.Visible = False
+				cbAtEcoRollReleaseLockupClutch.Visible = False
+				pnEcoRoll.Visible = False
+				cbEcoRoll.SelectedIndex = 0
+
 			    'PTO
 				gbPTO.Enabled = False
 				pnPTO.Enabled = false
diff --git a/VectoCommon/VectoCommon/Models/GearboxType.cs b/VectoCommon/VectoCommon/Models/GearboxType.cs
index bedc03bf0a1f245ac0031fde00238a33269366b8..b10f2acc2edaeb7ced1c902c3b08f6ae5e5fbcd8 100644
--- a/VectoCommon/VectoCommon/Models/GearboxType.cs
+++ b/VectoCommon/VectoCommon/Models/GearboxType.cs
@@ -70,7 +70,7 @@ namespace TUGraz.VectoCommon.Models
 
 		[DebuggerStepThrough]
 		public static bool AutomaticTransmission(this GearboxType type) =>
-			type == GearboxType.ATPowerSplit || type == GearboxType.ATSerial || type == GearboxType.APTN;
+			type == GearboxType.ATPowerSplit || type == GearboxType.ATSerial || type == GearboxType.APTN || type == GearboxType.IHPC;
 
 		[DebuggerStepThrough]
 		public static bool ManualTransmission(this GearboxType type) =>
diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/EngineeringDataAdapter.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/EngineeringDataAdapter.cs
index b4099bce7110123711fd37563883652be267ef2b..33745b5cf809f44ea5f3249c1ae39d4ea11f6abf 100644
--- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/EngineeringDataAdapter.cs
+++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/EngineeringDataAdapter.cs
@@ -210,7 +210,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter
 
 			retVal.Inertia = engine.Inertia +
 							(gbx != null && gbx.Type.AutomaticTransmission()
-								? (gbx.Type == GearboxType.APTN ? 0.SI<KilogramSquareMeter>() : torqueConverter.Inertia)
+								? (gbx.Type == GearboxType.APTN || gbx.Type == GearboxType.IHPC ? 0.SI<KilogramSquareMeter>() : torqueConverter.Inertia)
 								: 0.SI<KilogramSquareMeter>());
 			retVal.EngineStartTime = engine.EngineStartTime ?? DeclarationData.Engine.DefaultEngineStartTime;
 			var limits = torqueLimits.ToDictionary(e => e.Gear);
@@ -333,7 +333,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter
 
 			SetEngineeringData(gearbox, gearshiftData, retVal);
 
-			var hasTorqueConverter = retVal.Type.AutomaticTransmission() && retVal.Type != GearboxType.APTN;
+			var hasTorqueConverter = retVal.Type.AutomaticTransmission() && retVal.Type != GearboxType.APTN && retVal.Type != GearboxType.IHPC;
 
 			var gearDifferenceRatio = hasTorqueConverter && gearbox.Gears.Count > 2
 				? gearbox.Gears[0].Ratio / gearbox.Gears[1].Ratio
@@ -431,8 +431,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter
 			IGearboxEngineeringInputData gearbox, IGearshiftEngineeringInputData gearshiftData, GearboxData retVal)
 		{
 			retVal.Inertia = gearbox.Type.ManualTransmission() ? gearbox.Inertia : 0.SI<KilogramSquareMeter>();
-			retVal.TractionInterruption = gearbox.Type == GearboxType.APTN ? 0.SI<Second>() : gearbox.TractionInterruption;
-			
+			retVal.TractionInterruption = gearbox.Type == GearboxType.APTN || gearbox.Type == GearboxType.IHPC ? 0.SI<Second>() : gearbox.TractionInterruption;
 		}
 
 		public AxleGearData CreateAxleGearData(IAxleGearInputData data)
diff --git a/VectoCore/VectoCore/InputData/Reader/Impl/EngineeringModeVectoRunDataFactory.cs b/VectoCore/VectoCore/InputData/Reader/Impl/EngineeringModeVectoRunDataFactory.cs
index da4e2d0104c2110bc5c8d452f9f273c916f236bf..17625e41092ba0b2261a5d2bdd54e8dae53cf746 100644
--- a/VectoCore/VectoCore/InputData/Reader/Impl/EngineeringModeVectoRunDataFactory.cs
+++ b/VectoCore/VectoCore/InputData/Reader/Impl/EngineeringModeVectoRunDataFactory.cs
@@ -311,9 +311,9 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl
 
 				var crossWindRequired = vehicle.Components.AirdragInputData.CrossWindCorrectionMode ==
 										CrossWindCorrectionMode.VAirBetaLookupTable;
-                var ptoTransmissionData = dao.CreateBatteryElectricPTOTransmissionData(vehicle.Components.PTOTransmissionInputData);
+				var ptoTransmissionData = dao.CreateBatteryElectricPTOTransmissionData(vehicle.Components.PTOTransmissionInputData);
 
-                var drivingCycle = GetDrivingCycle(cycle, crossWindRequired);
+				var drivingCycle = GetDrivingCycle(cycle, crossWindRequired);
 
 				var vehicleData = dao.CreateVehicleData(vehicle);
 				yield return new VectoRunData
@@ -329,8 +329,8 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl
 					Aux = dao.CreateAuxiliaryData(vehicle.Components.AuxiliaryInputData),
 					BusAuxiliaries = dao.CreateBusAuxiliariesData(vehicle.Components.AuxiliaryInputData, vehicleData, VectoSimulationJobType.BatteryElectricVehicle),
 					Retarder = dao.CreateRetarderData(vehicle.Components.RetarderInputData, powertrainPosition),
-                    PTO = ptoTransmissionData,
-                    Cycle = new DrivingCycleProxy(drivingCycle, cycle.Name),
+					PTO = ptoTransmissionData,
+					Cycle = new DrivingCycleProxy(drivingCycle, cycle.Name),
 					ExecutionMode = ExecutionMode.Engineering,
 					ElectricMachinesData = electricMachinesData,
 					//HybridStrategyParameters = dao.CreateHybridStrategyParameters(InputDataProvider.JobInputData.HybridStrategyParameters),
@@ -578,6 +578,10 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl
 						? VectoSimulationJobType.ParallelHybridVehicle
 						: VectoSimulationJobType.ConventionalVehicle;
 
+					if (powertrainPosition == PowertrainPosition.HybridP2 && gearboxData.Type.AutomaticTransmission()) {
+						throw new VectoException(
+							"Powertrain Architecture 'hybrid electric vehicle, P2' with AT transmission not supported");
+					}
 					var vehicleData = dao.CreateVehicleData(vehicle);
 
 					var gearshiftParams = dao.CreateGearshiftData(
diff --git a/VectoCore/VectoCore/Models/Simulation/Impl/PCCEcoRollEngineStopPreprocessor.cs b/VectoCore/VectoCore/Models/Simulation/Impl/PCCEcoRollEngineStopPreprocessor.cs
index d2b1379ec1550d6139d663c702fa8d296f6cc1eb..1b6c4c75fbfd4bd1b5210f1c1a66119c29697cbc 100644
--- a/VectoCore/VectoCore/Models/Simulation/Impl/PCCEcoRollEngineStopPreprocessor.cs
+++ b/VectoCore/VectoCore/Models/Simulation/Impl/PCCEcoRollEngineStopPreprocessor.cs
@@ -125,7 +125,9 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl
 			var gradient = 0.SI<Radian>();
 
 			foreach (var motor in container.ElectricMotors.Values) {
-				((motor as ElectricMotor).Control as DummyElectricMotorControl).EmTorque = null;
+				if ((motor as ElectricMotor).Control is DummyElectricMotorControl emCtl) {
+					emCtl.EmTorque = null;
+				}
 			}
 
 			var initialResponse = vehicle.Request(absTime, simulationInterval, acceleration, gradient);
diff --git a/VectoCore/VectoCore/Models/Simulation/Impl/PowertrainBuilder.cs b/VectoCore/VectoCore/Models/Simulation/Impl/PowertrainBuilder.cs
index f4f4561b5fbbc2f748b1e98231e658e449bc798b..f9fc271aaa8d4bc3cef25bd782d66669b349ecf8 100644
--- a/VectoCore/VectoCore/Models/Simulation/Impl/PowertrainBuilder.cs
+++ b/VectoCore/VectoCore/Models/Simulation/Impl/PowertrainBuilder.cs
@@ -1627,7 +1627,7 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl
 
 		private static IGearbox GetSimpleGearbox(IVehicleContainer container, VectoRunData runData)
 		{
-			if (runData.GearboxData.Type.AutomaticTransmission() && runData.GearboxData.Type != GearboxType.APTN) {
+			if (runData.GearboxData.Type.AutomaticTransmission() && runData.GearboxData.Type != GearboxType.APTN && runData.GearboxData.Type != GearboxType.IHPC) {
 				new ATClutchInfo(container);
 				return new ATGearbox(container, null);
 			}
diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Data/GearboxData.cs b/VectoCore/VectoCore/Models/SimulationComponent/Data/GearboxData.cs
index 36384aae716e1f57ee561071ee5894ea66798b71..f93e0b4c043bd2a70946d05f09d6c39383429604 100644
--- a/VectoCore/VectoCore/Models/SimulationComponent/Data/GearboxData.cs
+++ b/VectoCore/VectoCore/Models/SimulationComponent/Data/GearboxData.cs
@@ -135,11 +135,11 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data
 					return new ValidationResult("Torque Converter can only be used with AT gearbox model");
 				}
 			} else {
-				if (gearboxData.Type.AutomaticTransmission() && gearboxData.Type != GearboxType.APTN) {
+				if (gearboxData.Type.AutomaticTransmission() && gearboxData.Type != GearboxType.APTN && gearboxData.Type != GearboxType.IHPC) {
 					return new ValidationResult("AT gearbox model requires torque converter");
 				}
 			}
-			if (gearboxData.Type.AutomaticTransmission() && gearboxData.Type != GearboxType.APTN) {
+			if (gearboxData.Type.AutomaticTransmission() && gearboxData.Type != GearboxType.APTN && gearboxData.Type != GearboxType.IHPC) {
 				gearboxData.TorqueConverterData.RequiredSpeedRatio =
 					Math.Round(gearboxData.Gears[1].TorqueConverterRatio / gearboxData.Gears[1].Ratio, 4) * 0.95;
 				result.AddRange(gearboxData.TorqueConverterData.Validate(mode, jobType, emPos, gearboxData.Type, emsMission));
diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/DefaultDriverStrategy.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/DefaultDriverStrategy.cs
index c29e39b125985a7d13abd1bc2b1a339ca52f4976..0683d8833c5b63eb0a19c6c705a09fcdb795349e 100644
--- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/DefaultDriverStrategy.cs
+++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/DefaultDriverStrategy.cs
@@ -114,12 +114,25 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 			if (ADAS.PredictiveCruiseControl != PredictiveCruiseControlType.None) {
 				// create a dummy powertrain for pre-processing and estimations
 				var testContainer = new SimplePowertrainContainer(data);
-				if (data.JobType != VectoSimulationJobType.BatteryElectricVehicle && data.JobType != VectoSimulationJobType.SerialHybridVehicle)
-					PowertrainBuilder.BuildSimplePowertrain(data, testContainer);
-				else {
-					PowertrainBuilder.BuildSimplePowertrainElectric(data, testContainer);
-				}
 
+				switch (data.JobType) {
+					case VectoSimulationJobType.BatteryElectricVehicle:
+					case VectoSimulationJobType.SerialHybridVehicle:
+					case VectoSimulationJobType.IEPC_E:
+					case VectoSimulationJobType.IEPC_S:
+						PowertrainBuilder.BuildSimplePowertrainElectric(data, testContainer);
+						break;
+					case VectoSimulationJobType.IHPC:
+					case VectoSimulationJobType.ParallelHybridVehicle:
+						PowertrainBuilder.BuildSimpleHybridPowertrain(data, testContainer);
+						break;
+					case VectoSimulationJobType.ConventionalVehicle:
+						PowertrainBuilder.BuildSimplePowertrain(data, testContainer);
+						break;
+					default:
+						throw new ArgumentOutOfRangeException(nameof(data.JobType));
+				}
+				
 				container.AddPreprocessor(new PCCSegmentPreprocessor(testContainer, PCCSegments, data?.DriverData.PCC));
 			}
 		}
@@ -425,7 +438,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 			var axleLoss = DataBus.AxlegearInfo.AxlegearLoss();
 			var emDragLoss = CalculateElectricMotorDragLoss();
 			var iceDragLoss = 0.SI<Watt>();
-			if (dataBus.GearboxInfo.GearboxType.AutomaticTransmission()) {
+			if (dataBus.GearboxInfo.GearboxType.AutomaticTransmission() && dataBus.GearboxInfo.GearboxType != GearboxType.IHPC) {
 				if (ADAS.EcoRoll == EcoRollType.None && ATEcoRollReleaseLockupClutch) {
 					iceDragLoss = DataBus.EngineInfo.EngineDragPower(DataBus.EngineInfo.EngineSpeed);
 				}
diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/HybridController.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/HybridController.cs
index 3b0b51dc8c526f0678ff790fe8c4423752bed34e..81a91730778d258669e80b1c3ab230f635acd7a3 100644
--- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/HybridController.cs
+++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/HybridController.cs
@@ -38,9 +38,22 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 		public HybridController(IVehicleContainer container, IHybridControlStrategy strategy, IElectricSystem es) : base(container)
 		{
 			_electricMotorCtl = new Dictionary<PowertrainPosition, ElectricMotorController>();
-			_shiftStrategy = container.RunData.GearboxData.Type.AutomaticTransmission()
-				? new HybridCtlATShiftStrategy(this, container)
-				: new HybridCtlShiftStrategy(this, container);
+
+			switch (container.RunData.GearboxData.Type) {
+				case GearboxType.ATPowerSplit:
+				case GearboxType.ATSerial:
+					_shiftStrategy = new HybridCtlATShiftStrategy(this, container);
+					break;
+				case GearboxType.AMT:
+					_shiftStrategy = new HybridCtlShiftStrategy(this, container);
+					break;
+				case GearboxType.APTN:
+				case GearboxType.IHPC:
+					_shiftStrategy = new HybridCtlIHPCShiftStrategy(this, container);
+					break;
+				default: throw new ArgumentException($"Unsupported Gearbox type for Hybrid Controller: {container.RunData.GearboxData.Type}");
+			}
+			
 			_hybridStrategy = strategy;
 			strategy.Controller = this;
 
@@ -291,7 +304,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 			protected GearshiftPosition _nextGear { get; set; }
 
 			protected readonly GearList GearList;
-			private readonly VectoRunData _runData;
+			protected readonly VectoRunData _runData;
 
 			public HybridCtlShiftStrategy(HybridController hybridController, IVehicleContainer container) : base(
 				container)
@@ -564,5 +577,84 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 				return base.SpeedTooHighForEngine(gear, outAngularSpeed);
 			}
 		}
+
+		///=======================================================================================
+
+		public class HybridCtlIHPCShiftStrategy : HybridCtlATShiftStrategy
+		{
+			protected new APTNGearbox _gearbox;
+
+			public HybridCtlIHPCShiftStrategy(HybridController hybridController, IVehicleContainer container) : base(hybridController, container) { }
+
+			public override IGearbox Gearbox {
+				get => _gearbox;
+				set => _gearbox = value as APTNGearbox ?? throw new VectoException("This shift strategy can't handle gearbox of type {0}", value.GetType());
+			}
+
+			public override GearshiftPosition InitGear(Second absTime, Second dt, NewtonMeter torque, PerSecond outAngularVelocity)
+			{
+				if (DataBus.VehicleInfo.VehicleSpeed.IsEqual(0)) {
+					return InitStartGear(absTime, torque, outAngularVelocity);
+				}
+
+				foreach (var gear in Gears.Reverse()) {
+					var response = _gearbox.Initialize(absTime, gear, torque, outAngularVelocity);
+
+					if (response.Engine.EngineSpeed > DataBus.EngineInfo.EngineRatedSpeed || response.Engine.EngineSpeed < DataBus.EngineInfo.EngineIdleSpeed) {
+						continue;
+					}
+
+					if (!IsBelowDownShiftCurve(gear, response.Engine.PowerRequest / response.Engine.EngineSpeed, response.Engine.EngineSpeed)) {
+						_gearbox.Disengaged = false;
+						return gear;
+					}
+				}
+
+				// fallback: start with first gear;
+				_gearbox.Disengaged = false;
+				return Gears.First();
+			}
+
+			public override void Disengage(Second absTime, Second dt, NewtonMeter outTorque, PerSecond outAngularVelocity) { }
+
+			protected GearshiftPosition InitStartGear(Second absTime, NewtonMeter outTorque, PerSecond outAngularVelocity)
+			{
+				if (!DataBus.EngineCtl.CombustionEngineOn) {
+					return _nextGear;
+				}
+
+				foreach (var gear in GearList.IterateGears(MaxStartGear, GearList.First())) {
+					//for (var gear = MaxStartGear; gear > 1; gear--) {
+					var inAngularSpeed = outAngularVelocity * GearboxModelData.Gears[gear.Gear].Ratio;
+
+					var ratedSpeed = DataBus.EngineInfo.EngineRatedSpeed;
+					if (inAngularSpeed > ratedSpeed || inAngularSpeed.IsEqual(0)) {
+						continue;
+					}
+
+					var response = _gearbox.Initialize(absTime, gear, outTorque, outAngularVelocity);
+
+					var fullLoadPower =
+						response.Engine.DynamicFullLoadTorque; //EnginePowerRequest - response.DeltaFullLoad;
+					var reserve = 1 - response.Engine.TorqueOutDemand / fullLoadPower;
+
+					if (_runData != null && _runData.HybridStrategyParameters.MaxPropulsionTorque?.GetVECTOValueOrDefault(gear) != null) {
+						var tqRequest = response.Gearbox.InputTorque;
+						var maxTorque = _runData.HybridStrategyParameters.MaxPropulsionTorque[gear].FullLoadDriveTorque(response.Gearbox.InputSpeed);
+						reserve = 1 - VectoMath.Min(response.Engine.TorqueOutDemand / fullLoadPower, tqRequest / maxTorque);
+					}
+
+					if (response.Engine.EngineSpeed > DataBus.EngineInfo.EngineIdleSpeed &&
+						reserve.IsGreaterOrEqual(0)) {
+						//reserve >= GearshiftParams.StartTorqueReserve) {
+						_nextGear = gear;
+						return gear;
+					}
+				}
+
+				_nextGear = GearList.First();
+				return _nextGear;
+			}
+		}
 	}
 }
\ No newline at end of file
diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/IEPC.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/IEPC.cs
index 9fabd9458353d275e6d74db6be0283f0ce31b56a..64ab097e1aea9f8ca1aefffd4e3dc227e0964177 100644
--- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/IEPC.cs
+++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/IEPC.cs
@@ -41,7 +41,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl{
 
 			container[ModalResultField.P_IEPC_el_, Position] = CurrentState.ElectricPowerToBattery;
 
-			container[ModalResultField.P_IEPC_electricMotorLoss_, Position] = (CurrentState.EmTorqueMap ?? 0.SI<NewtonMeter>()) * avgEMSpeed - CurrentState.ElectricPowerToBattery;
+			container[ModalResultField.P_IEPC_electricMotorLoss_, Position] = (CurrentState.DrivetrainInTorque - CurrentState.DrivetrainOutTorque) * avgDTSpeed - CurrentState.ElectricPowerToBattery;
 
 			//container[ModalResultField.P_EM_TransmissionLoss_, Position] = CurrentState.TransmissionTorqueLoss * avgDTSpeed;
 
diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Strategies/HybridStrategy.cs b/VectoCore/VectoCore/Models/SimulationComponent/Strategies/HybridStrategy.cs
index f752c820dee32c1ebe5c5d32ee99aee228e2f8a6..38e36b8cf9a9cdaef02709c0dec790d6404a75f1 100644
--- a/VectoCore/VectoCore/Models/SimulationComponent/Strategies/HybridStrategy.cs
+++ b/VectoCore/VectoCore/Models/SimulationComponent/Strategies/HybridStrategy.cs
@@ -421,46 +421,6 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Strategies
 
 		}
 
-		//protected virtual bool? CheckUpshiftTcTc(
-		//	Second absTime, Second dt, NewtonMeter outTorque, PerSecond outAngularVelocity, NewtonMeter inTorque,
-		//	PerSecond inAngularVelocity, GearshiftPosition gear, GearData currentGear, IResponse response)
-		//{
-		//	// C -> C+1
-		//	var nextGearPos = GearList.Successor(gear); // GearboxModelData.Gears[gear + 1];
-		//	var nextGear = ModelData.GearboxData.Gears[nextGearPos.Gear];
-		//	var gearRatio = nextGear.TorqueConverterRatio / currentGear.TorqueConverterRatio;
-		//	var minEngineSpeed = VectoMath.Min(700.RPMtoRad(), gearRatio * (DataBus.EngineInfo.EngineN80hSpeed - 150.RPMtoRad()));
-
-		//	var nextGearboxInSpeed = outAngularVelocity * nextGear.TorqueConverterRatio;
-		//	var nextGearboxInTorque = outTorque / nextGear.TorqueConverterRatio;
-		//	var shiftLosses = _gearbox.ComputeShiftLosses(outTorque, outAngularVelocity, nextGearPos) /
-		//					ModelData.GearboxData.PowershiftShiftTime / nextGearboxInSpeed;
-		//	nextGearboxInTorque += shiftLosses;
-		//	var tcOperatingPoint =
-		//		_gearbox.TorqueConverter.FindOperatingPoint(absTime, dt, nextGearboxInTorque, nextGearboxInSpeed);
-
-		//	var engineSpeedOverMin = tcOperatingPoint.InAngularVelocity.IsGreater(minEngineSpeed);
-		//	var avgSpeed = (DataBus.EngineInfo.EngineSpeed + tcOperatingPoint.InAngularVelocity) / 2;
-		//	var engineMaxTorque = DataBus.EngineInfo.EngineStationaryFullPower(avgSpeed) / avgSpeed;
-		//	var engineInertiaTorque = Formulas.InertiaPower(
-		//								DataBus.EngineInfo.EngineSpeed, tcOperatingPoint.InAngularVelocity, ModelData.EngineData.Inertia, dt) / avgSpeed;
-		//	var engineTorqueBelowMax =
-		//		tcOperatingPoint.InTorque.IsSmallerOrEqual(engineMaxTorque - engineInertiaTorque);
-
-		//	var reachableAcceleration =
-		//		EstimateAcceleration(
-		//			outAngularVelocity, outTorque, inAngularVelocity, inTorque, gear.Gear, response); // EstimateAccelerationForGear(gear + 1, outAngularVelocity);
-		//	var minAcceleration = VectoMath.Min(
-		//		ModelData.GearboxData.TorqueConverterData.CCUpshiftMinAcceleration,
-		//		DataBus.DriverInfo.DriverAcceleration);
-		//	var minAccelerationReachable = reachableAcceleration.IsGreaterOrEqual(minAcceleration);
-
-		//	if (engineSpeedOverMin && engineTorqueBelowMax && minAccelerationReachable) {
-		//		return true;
-		//	}
-
-		//	return null;
-		//}
 	}
 
 	// =====================================================
@@ -1102,7 +1062,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Strategies
 				var endSpeed = DataBus.VehicleInfo.VehicleSpeed +
 								DataBus.DriverInfo.DriverAcceleration * ModelData.GearboxData.TractionInterruption;
 				if (EngineSpeedTooLow(response)
-					&& DataBus.GearboxInfo.GearboxType.ManualTransmission() 
+					&& (DataBus.GearboxInfo.GearboxType.ManualTransmission() || DataBus.GearboxInfo.GearboxType == GearboxType.IHPC) 
 					&& endSpeed.IsSmallerOrEqual(disengageSpeedThreshold, 0.1.KMPHtoMeterPerSecond())) {
 					var responseEmOff = ResponseEmOff;
 					responseEmOff.Gear = new GearshiftPosition(0);
@@ -1234,7 +1194,9 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Strategies
 					? (maxRecuperationResponse as ResponseDryRun).DeltaDragLoadTorque
 					: maxRecuperationResponse.Engine.TotalTorqueDemand - maxRecuperationResponse.Engine.DragTorque;
 
-				if (!maxRecuperationResponse.Engine.EngineOn && DataBus.GearboxInfo.GearboxType.AutomaticTransmission()) {
+				var isAPTWithTorqueConverter = DataBus.GearboxInfo.GearboxType.AutomaticTransmission() &&
+												DataBus.GearboxInfo.GearboxType != GearboxType.IHPC;
+				if (!maxRecuperationResponse.Engine.EngineOn && isAPTWithTorqueConverter) {
 					deltaDragTqMaxRecuperation = maxRecuperationResponse.Gearbox.InputTorque;
 				}
 
@@ -1278,7 +1240,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Strategies
 						var deltaDragLoad = disengaged
 							? (r as ResponseDryRun).DeltaDragLoadTorque
 							: r.Engine.TotalTorqueDemand - r.Engine.DragTorque;
-						if (!r.Engine.EngineOn && DataBus.GearboxInfo.GearboxType.AutomaticTransmission()) {
+						if (!r.Engine.EngineOn && isAPTWithTorqueConverter) {
 							deltaDragLoad = r.Gearbox.InputTorque;
 						}
 						return deltaDragLoad;
@@ -1299,7 +1261,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Strategies
 						var deltaDragLoad = disengaged
 							? (r as ResponseDryRun).DeltaDragLoadTorque
 							: r.Engine.TotalTorqueDemand - r.Engine.DragTorque;
-						if (!r.Engine.EngineOn && DataBus.GearboxInfo.GearboxType.AutomaticTransmission()) {
+						if (!r.Engine.EngineOn && isAPTWithTorqueConverter) {
 							deltaDragLoad = r.Gearbox.InputTorque;
 						}
 						return deltaDragLoad.Value();
@@ -1321,7 +1283,19 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Strategies
 						}
 					};
 					entry.Response = RequestDryRun(absTime, dt, outTorque, outAngularVelocity, nextGear, entry.Setting);
-					eval.Add(entry);
+					if (entry.Response.ElectricSystem.ConsumerPower.IsGreater(0)) {
+						eval.Add(entry);
+					} else {
+						// for the found operating point, although recuperating no electric energy is generated. leave EM off
+						var off = ResponseEmOff;
+						if (vehiclespeedBelowThreshold && (emPos == PowertrainPosition.HybridP2 || emPos == PowertrainPosition.HybridP1)) {
+							off.Setting.GearboxInNeutral = true;
+						} else {
+							off.Setting.GearboxInNeutral = PreviousState.Solution?.Setting.GearboxInNeutral ?? false;
+						}
+
+						eval.Add(off);
+					}
 				} else {
 					if (emRecuperationTq.IsGreater(0)) {
 						eval.Add(
@@ -1359,7 +1333,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Strategies
 				return false;
 			}
 
-			if (DataBus.GearboxInfo.GearboxType.AutomaticTransmission()) {
+			if (DataBus.GearboxInfo.GearboxType.AutomaticTransmission() && DataBus.GearboxInfo.GearboxType != GearboxType.IHPC) {
 				return firstResponse.Engine.EngineOn
 					? firstResponse.Engine.EngineSpeed.IsSmaller(ModelData.EngineData.IdleSpeed)
 					: (firstResponse.Gearbox.InputSpeed?.IsSmaller(ModelData.EngineData.IdleSpeed) ?? false);
diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Strategies/TestPowertrain.cs b/VectoCore/VectoCore/Models/SimulationComponent/Strategies/TestPowertrain.cs
index 6e45b89d2204b9dc9f8869ec3b58a9af75e88b51..42c94ada790908d2e4738c008ef42098078168a5 100644
--- a/VectoCore/VectoCore/Models/SimulationComponent/Strategies/TestPowertrain.cs
+++ b/VectoCore/VectoCore/Models/SimulationComponent/Strategies/TestPowertrain.cs
@@ -81,7 +81,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Strategies
 				}
 			}
 			
-			if (Gearbox != null && Gearbox.GearboxType.AutomaticTransmission() && Gearbox.GearboxType != GearboxType.APTN) {
+			if (Gearbox != null && Gearbox.GearboxType.AutomaticTransmission() && Gearbox.GearboxType != GearboxType.APTN && Gearbox.GearboxType != GearboxType.IHPC) {
 				TorqueConverter = Container.TorqueConverterInfo as TorqueConverter;
 				if (TorqueConverter == null) {
 					throw new VectoException("Torque converter missing for automatic transmission: {0}", Container.TorqueConverterInfo?.GetType().FullName);
diff --git a/VectoCore/VectoCore/OutputData/FileIO/JSONFileWriter.cs b/VectoCore/VectoCore/OutputData/FileIO/JSONFileWriter.cs
index 6dc185bc8e07d0ab0375dad2af40644445078bd7..d74e5936b04e372a22cc2c44fd5aa9c3e33f866e 100644
--- a/VectoCore/VectoCore/OutputData/FileIO/JSONFileWriter.cs
+++ b/VectoCore/VectoCore/OutputData/FileIO/JSONFileWriter.cs
@@ -355,7 +355,7 @@ public class JSONFileWriter : IOutputFileWriter
 		body.Add(JsonKeys.Gearbox_GearboxType, gbx.Type.ToString());
 
 		var torqueConverterDict = new Dictionary<string, object> { { "Enabled", torqueConverter != null && gbx.Type.AutomaticTransmission() } };
-		if (gbx.Type.AutomaticTransmission() && gbx.Type != GearboxType.APTN) {
+		if (gbx.Type.AutomaticTransmission() && gbx.Type != GearboxType.APTN && gbx.Type != GearboxType.IHPC) {
 			torqueConverterDict.Add("File", GetRelativePath(torqueConverter.TCData.Source, Path.GetDirectoryName(filename)));
 			torqueConverterDict.Add(JsonKeys.Gearbox_TorqueConverter_ReferenceRPM, Math.Round(torqueConverter.ReferenceRPM.AsRPM, 4));
 			torqueConverterDict.Add(JsonKeys.Gearbox_TorqueConverter_Inertia, torqueConverter.Inertia.Value());
diff --git a/VectoCore/VectoCore/OutputData/SummaryDataContainer.cs b/VectoCore/VectoCore/OutputData/SummaryDataContainer.cs
index 1933a89eb7c7351b8f83c89b69ec85aa39c8f753..7d73e77a65a93c756b4fd64bb89ca06e2e479109 100644
--- a/VectoCore/VectoCore/OutputData/SummaryDataContainer.cs
+++ b/VectoCore/VectoCore/OutputData/SummaryDataContainer.cs
@@ -660,7 +660,7 @@ namespace TUGraz.VectoCore.OutputData
 			var eGbxOut = modData.TimeIntegral<WattSecond>(gbxOutSignal, x => x > 0);
 			row[Fields.AVERAGE_GEARBOX_EFFICIENCY] = eGbxIn.IsEqual(0, 1e-9) ? 0 : (eGbxOut / eGbxIn).Value();
 
-			if (runData.GearboxData != null && runData.GearboxData.Type.AutomaticTransmission() && runData.GearboxData.Type != GearboxType.APTN) {
+			if (runData.GearboxData != null && runData.GearboxData.Type.AutomaticTransmission() && runData.GearboxData.Type != GearboxType.APTN && runData.GearboxData.Type != GearboxType.IHPC) {
 				var eTcIn = modData.TimeIntegral<WattSecond>(ModalResultField.P_TC_in, x => x > 0);
 				var eTcOut = eGbxIn;
 				row[Fields.AVERAGE_TORQUE_CONVERTER_EFFICIENCY_WITHOUT_LOCKUP] = eTcIn.IsEqual(0, 1e-9) ? 0 : (eTcOut / eTcIn).Value();
@@ -1116,7 +1116,7 @@ namespace TUGraz.VectoCore.OutputData
 				row[Fields.GEAR_RATIO_LAST_GEAR] = data.Gears.Count > 0
 					? (ConvertedSI)data.Gears.Last().Value.Ratio.SI<Scalar>()
 					: (ConvertedSI)0.SI<Scalar>();
-				if (data.Type != GearboxType.APTN) {
+				if (data.Type != GearboxType.APTN && data.Type != GearboxType.IHPC) {
 					row[Fields.TORQUECONVERTER_MANUFACTURER] = data.TorqueConverterData.Manufacturer;
 					row[Fields.TORQUECONVERTER_MODEL] = data.TorqueConverterData.ModelName;
 					row[Fields.TORQUE_CONVERTER_CERTIFICATION_NUMBER] =