diff --git a/VectoCommon/VectoCommon/InputData/DeclarationInputData.cs b/VectoCommon/VectoCommon/InputData/DeclarationInputData.cs
index 0616a430fb7b31fdf8a272f0fb873503affbb172..556164df237d25e206c5992a102e2f5b8d0c3b2e 100644
--- a/VectoCommon/VectoCommon/InputData/DeclarationInputData.cs
+++ b/VectoCommon/VectoCommon/InputData/DeclarationInputData.cs
@@ -1236,6 +1236,7 @@ namespace TUGraz.VectoCommon.InputData
 		P2_5,
 		P3,
 		P4,
+		P_IHPC,
 		S2,
 		S3,
 		S4,
diff --git a/VectoCore/VectoCore/Configuration/Constants.cs b/VectoCore/VectoCore/Configuration/Constants.cs
index 726dd7ae3cf493ae82aeeb98c52c6ac62d050387..5895f7c3c45d08d3e9306af1c071ae3479c96c9a 100644
--- a/VectoCore/VectoCore/Configuration/Constants.cs
+++ b/VectoCore/VectoCore/Configuration/Constants.cs
@@ -334,8 +334,10 @@ namespace TUGraz.VectoCore.Configuration
 			public static readonly Meter GearboxLookaheadForAccelerationEstimation = 100.SI<Meter>();
 
 			public static readonly Kilogram MaximumGrossVehicleMass = 40000.SI<Kilogram>();
+			public static readonly Kilogram MaximumGrossVehicleMassOVCHev_NaturalGas = 41000.SI<Kilogram>();
 			public static readonly Kilogram MaximumGrossVehicleMassPEV = 42000.SI<Kilogram>();
 			public static readonly Kilogram MaximumGrossVehicleMassEMS = 60000.SI<Kilogram>();
+			public static readonly Kilogram MaximumGrossVehicleMassEMS_OVCHev_NaturalGas = 61000.SI<Kilogram>();
 			public static readonly Kilogram MaximumGrossVehicleMassEMS_PEV = 62000.SI<Kilogram>();
 
 			public static readonly MeterPerSecond HighwaySpeedThreshold = 70.KMPHtoMeterPerSecond();
diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapterNinjectModule.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapterNinjectModule.cs
index 1e629a88f58e50529e726191bfa5cac4bc6c0d37..0c8349f9ec449342000a84445c6c18ed12da0d7e 100644
--- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapterNinjectModule.cs
+++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapterNinjectModule.cs
@@ -53,6 +53,9 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter
 			Bind<ILorryDeclarationDataAdapter>().To<DeclarationDataAdapterHeavyLorry.HEV_P4>()
 				.WhenInjectedExactlyInto<DeclarationModeHeavyLorryRunDataFactory.HEV_P4>();
 
+			Bind<ILorryDeclarationDataAdapter>().To<DeclarationDataAdapterHeavyLorry.HEV_P2>()
+				.WhenInjectedExactlyInto<DeclarationModeHeavyLorryRunDataFactory.HEV_P_IHPC>();
+
 			Bind<ILorryDeclarationDataAdapter>().To<DeclarationDataAdapterHeavyLorry.PEV_E2>()
 				.WhenInjectedExactlyInto<DeclarationModeHeavyLorryRunDataFactory.PEV_E2>();
 
diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/ElectricMachinesDataAdapter.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/ElectricMachinesDataAdapter.cs
index 8c8951f18c337c8e869d5999a13be5b83c000978..d02868a0c7a52f00bbaed4d3847435a54b8c20ee 100644
--- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/ElectricMachinesDataAdapter.cs
+++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/ElectricMachinesDataAdapter.cs
@@ -3,16 +3,208 @@ using System.Collections.Generic;
 using System.Linq;
 using TUGraz.VectoCommon.Exceptions;
 using TUGraz.VectoCommon.InputData;
+using TUGraz.VectoCommon.Models;
 using TUGraz.VectoCommon.Utils;
+using TUGraz.VectoCore.InputData.FileIO.XML.Declaration.DataProvider;
 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;
+using TUGraz.VectoCore.Utils.Ninject;
 
 
 namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponents
 {
+	internal abstract class StandardValuesInputData
+	{
+		/// <summary>
+		/// Wraps the standard value input data and overrides the voltage level
+		/// </summary>
+		internal class StandardValueVoltageLevelInputData : IElectricMotorVoltageLevel
+		{
+			
+			public StandardValueVoltageLevelInputData(IElectricMotorVoltageLevel inputData, Volt voltageLevel)
+			{
+				_electricMotorVoltageLevelImplementation = inputData;
+				_voltageLevel = voltageLevel;
+			}
+			private IElectricMotorVoltageLevel _electricMotorVoltageLevelImplementation;
+			private Volt _voltageLevel;
+
+			public Volt VoltageLevel => _voltageLevel;
+
+
+			#region Implementation of IElectricMotorVoltageLevel
+
+
+
+			public NewtonMeter ContinuousTorque => _electricMotorVoltageLevelImplementation.ContinuousTorque;
+
+			public PerSecond ContinuousTorqueSpeed => _electricMotorVoltageLevelImplementation.ContinuousTorqueSpeed;
+
+			public NewtonMeter OverloadTorque => _electricMotorVoltageLevelImplementation.OverloadTorque;
+
+			public PerSecond OverloadTestSpeed => _electricMotorVoltageLevelImplementation.OverloadTestSpeed;
+
+			public Second OverloadTime => _electricMotorVoltageLevelImplementation.OverloadTime;
+
+			public TableData FullLoadCurve => _electricMotorVoltageLevelImplementation.FullLoadCurve;
+
+			public IList<IElectricMotorPowerMap> PowerMap => _electricMotorVoltageLevelImplementation.PowerMap;
+
+			#endregion
+		}
+
+		internal class StandardValueIEPCInputData : IIEPCDeclarationInputData
+		{
+			private IIEPCDeclarationInputData _iiepcDeclarationInputDataImplementation;
+			private IList<IElectricMotorVoltageLevel> _voltageLevels = new List<IElectricMotorVoltageLevel>();
+
+			/// <summary>
+			/// Wraps the inputData and creates new voltage levels based on the voltage level provided in the input data
+			/// </summary>
+			/// <param name="inputData"></param>
+			/// <param name="voltageLevels"></param>
+			/// <exception cref="ArgumentException"></exception>
+			public StandardValueIEPCInputData(IIEPCDeclarationInputData inputData, params Volt[] voltageLevels)
+			{
+				_iiepcDeclarationInputDataImplementation = inputData;
+				if (inputData.CertificationMethod != CertificationMethod.StandardValues) {
+					throw new ArgumentException("Only for standard value certification");
+				}
+
+				foreach (var voltageLevel in voltageLevels) {
+					_voltageLevels.Add(new StandardValueVoltageLevelInputData(inputData.VoltageLevels.First(), voltageLevel));
+				}
+
+			}
+
+			public IList<IElectricMotorVoltageLevel> VoltageLevels => _voltageLevels;
+
+			#region Implementation of IComponentInputData
+
+			public DataSource DataSource => _iiepcDeclarationInputDataImplementation.DataSource;
+
+			public bool SavedInDeclarationMode => _iiepcDeclarationInputDataImplementation.SavedInDeclarationMode;
+
+			public string Manufacturer => _iiepcDeclarationInputDataImplementation.Manufacturer;
+
+			public string Model => _iiepcDeclarationInputDataImplementation.Model;
+
+			public DateTime Date => _iiepcDeclarationInputDataImplementation.Date;
+
+			public string AppVersion => _iiepcDeclarationInputDataImplementation.AppVersion;
+
+			public CertificationMethod CertificationMethod => _iiepcDeclarationInputDataImplementation.CertificationMethod;
+
+			public string CertificationNumber => _iiepcDeclarationInputDataImplementation.CertificationNumber;
+
+			public DigestData DigestValue => _iiepcDeclarationInputDataImplementation.DigestValue;
+
+			#endregion
+
+			#region Implementation of IIEPCDeclarationInputData
+
+			public ElectricMachineType ElectricMachineType => _iiepcDeclarationInputDataImplementation.ElectricMachineType;
+
+			public Watt R85RatedPower => _iiepcDeclarationInputDataImplementation.R85RatedPower;
+
+			public KilogramSquareMeter Inertia => _iiepcDeclarationInputDataImplementation.Inertia;
+
+			public bool DifferentialIncluded => _iiepcDeclarationInputDataImplementation.DifferentialIncluded;
+
+			public bool DesignTypeWheelMotor => _iiepcDeclarationInputDataImplementation.DesignTypeWheelMotor;
+
+			public int? NrOfDesignTypeWheelMotorMeasured => _iiepcDeclarationInputDataImplementation.NrOfDesignTypeWheelMotorMeasured;
+
+			public IList<IGearEntry> Gears => _iiepcDeclarationInputDataImplementation.Gears;
+
+	
+
+			public IList<IDragCurve> DragCurves => _iiepcDeclarationInputDataImplementation.DragCurves;
+
+			public TableData Conditioning => _iiepcDeclarationInputDataImplementation.Conditioning;
+
+			#endregion
+		}
+
+		internal class StandardValuesEmInputData : IElectricMotorDeclarationInputData
+		{
+			private IElectricMotorDeclarationInputData _electricMotorDeclarationInputDataImplementation;
+
+			private IList<IElectricMotorVoltageLevel> _voltageLevels = new List<IElectricMotorVoltageLevel>();
+
+			/// <summary>
+			/// Wraps the inputData and creates new voltage levels based on the voltage level provided in the input data
+			/// </summary>
+			/// <param name="inputData"></param>
+			/// <param name="voltageLevels"></param>
+			/// <exception cref="ArgumentException"></exception>
+			public StandardValuesEmInputData(IElectricMotorDeclarationInputData inputData, params Volt[] voltageLevels)
+			{
+				_electricMotorDeclarationInputDataImplementation = inputData;
+				if (inputData.CertificationMethod != CertificationMethod.StandardValues)
+				{
+					throw new ArgumentException("Only for standard value certification");
+				}
+
+				foreach (var voltageLevel in voltageLevels)
+				{
+					_voltageLevels.Add(new StandardValueVoltageLevelInputData(inputData.VoltageLevels.First(), voltageLevel));
+				}
+
+			}
+
+
+			#region Implementation of IComponentInputData
+
+			public DataSource DataSource => _electricMotorDeclarationInputDataImplementation.DataSource;
+
+			public bool SavedInDeclarationMode => _electricMotorDeclarationInputDataImplementation.SavedInDeclarationMode;
+
+			public string Manufacturer => _electricMotorDeclarationInputDataImplementation.Manufacturer;
+
+			public string Model => _electricMotorDeclarationInputDataImplementation.Model;
+
+			public DateTime Date => _electricMotorDeclarationInputDataImplementation.Date;
+
+			public string AppVersion => _electricMotorDeclarationInputDataImplementation.AppVersion;
+
+			public CertificationMethod CertificationMethod => _electricMotorDeclarationInputDataImplementation.CertificationMethod;
+
+			public string CertificationNumber => _electricMotorDeclarationInputDataImplementation.CertificationNumber;
+
+			public DigestData DigestValue => _electricMotorDeclarationInputDataImplementation.DigestValue;
+
+			#endregion
+
+			#region Implementation of IElectricMotorDeclarationInputData
+
+			public ElectricMachineType ElectricMachineType => _electricMotorDeclarationInputDataImplementation.ElectricMachineType;
+
+			public Watt R85RatedPower => _electricMotorDeclarationInputDataImplementation.R85RatedPower;
+
+			public KilogramSquareMeter Inertia => _electricMotorDeclarationInputDataImplementation.Inertia;
+
+			public bool DcDcConverterIncluded => _electricMotorDeclarationInputDataImplementation.DcDcConverterIncluded;
+
+			public string IHPCType => _electricMotorDeclarationInputDataImplementation.IHPCType;
+
+			public IList<IElectricMotorVoltageLevel> VoltageLevels => _electricMotorDeclarationInputDataImplementation.VoltageLevels;
+
+			public TableData DragCurve => _electricMotorDeclarationInputDataImplementation.DragCurve;
+
+			public TableData Conditioning => _electricMotorDeclarationInputDataImplementation.Conditioning;
+
+			#endregion
+		}
+	}
+
+
+
+
+
 	public class ElectricMachinesDataAdapter
 	{
 		public IList<Tuple<PowertrainPosition, ElectricMotorData>> CreateElectricMachines(
@@ -66,7 +258,10 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponen
 			Volt averageVoltage,
 			GearList gearList)
 		{
-
+			if (motorData.CertificationMethod == CertificationMethod.StandardValues) {
+				//Fake one very low voltage level and one very high for standard values
+				motorData = new StandardValuesInputData.StandardValuesEmInputData(motorData, 1.SI<Volt>(), 10E9.SI<Volt>());
+			}
 			var voltageLevels = new List<ElectricMotorVoltageLevelData>();
 
 			foreach (var entry in motorData.VoltageLevels.OrderBy(x => x.VoltageLevel))
@@ -260,12 +455,21 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponen
 			}
 		}
 
+
 		public List<Tuple<PowertrainPosition, ElectricMotorData>> CreateIEPCElectricMachines(IIEPCDeclarationInputData iepc, Volt averageVoltage)
 		{
 			if (iepc == null)
 			{
 				return null;
 			}
+			if (iepc.CertificationMethod == CertificationMethod.StandardValues)
+			{
+				//Fake one very low voltage level and one very high for standard values
+				iepc = new StandardValuesInputData.StandardValueIEPCInputData(iepc, 1.SI<Volt>(), 10E9.SI<Volt>());
+			}
+
+
+
 
 			var pos = PowertrainPosition.IEPC;
 			var count = iepc.DesignTypeWheelMotor && iepc.NrOfDesignTypeWheelMotorMeasured == 1 ? 2 : 1;
@@ -278,7 +482,13 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponen
 
 
 			var voltageLevels = new List<ElectricMotorVoltageLevelData>();
-			foreach (var entry in iepc.VoltageLevels.OrderBy(x => x.VoltageLevel))
+			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)
 			{
 				var effMap = new Dictionary<uint, EfficiencyMap>();
 				var fldCurve =
@@ -291,12 +501,17 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponen
 				}
 				voltageLevels.Add(new IEPCVoltageLevelData()
 				{
-					Voltage = entry.VoltageLevel,
+
+					Voltage = iepc.CertificationMethod != CertificationMethod.StandardValues ? entry.VoltageLevel : null, //No voltagelevel is provided for standard values
 					FullLoadCurve = fldCurve,
 					EfficiencyMaps = effMap,
 				});
 			}
 
+			voltageLevels.First().Voltage = 1.SI<Volt>();
+			voltageLevels.Last().Voltage = 10E9.SI<Volt>();
+
+
 			var dragCurves = new Dictionary<uint, DragCurve>();
 			if (iepc.DragCurves.Count > 1)
 			{
@@ -334,21 +549,22 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponen
 		}
 
 		private OverloadData CalculateOverloadData(IIEPCDeclarationInputData iepc, int count,
-			VoltageLevelData voltageLevels, Volt averageVoltage, Tuple<uint, double> gearRatioUsedForMeasurement)
+			VoltageLevelData voltageLevel, Volt averageVoltage, Tuple<uint, double> gearRatioUsedForMeasurement)
 		{
+			
 			// 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 < iepc.VoltageLevels.Min(x => x.VoltageLevel))
 			{
-				return CalculateOverloadBuffer(iepc.VoltageLevels.First(), count, voltageLevels, gearRatioUsedForMeasurement);
+				return CalculateOverloadBuffer(iepc.VoltageLevels.First(), count, voltageLevel, gearRatioUsedForMeasurement);
 			}
 			if (averageVoltage > iepc.VoltageLevels.Max(x => x.VoltageLevel))
 			{
-				return CalculateOverloadBuffer(iepc.VoltageLevels.Last(), count, voltageLevels, gearRatioUsedForMeasurement);
+				return CalculateOverloadBuffer(iepc.VoltageLevels.Last(), count, voltageLevel, gearRatioUsedForMeasurement);
 			}
 
 			var (vLow, vHigh) = iepc.VoltageLevels.OrderBy(x => x.VoltageLevel).GetSection(x => x.VoltageLevel < averageVoltage);
-			var ovlLo = CalculateOverloadBuffer(vLow, count, voltageLevels, gearRatioUsedForMeasurement);
-			var ovlHi = CalculateOverloadBuffer(vHigh, count, voltageLevels, gearRatioUsedForMeasurement);
+			var ovlLo = CalculateOverloadBuffer(vLow, count, voltageLevel, gearRatioUsedForMeasurement);
+			var ovlHi = CalculateOverloadBuffer(vHigh, count, voltageLevel, gearRatioUsedForMeasurement);
 
 			var retVal = new OverloadData()
 			{
@@ -360,22 +576,22 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponen
 		}
 
 
-		private OverloadData CalculateOverloadData(IElectricMotorDeclarationInputData motorData, int count, VoltageLevelData voltageLevels, Volt averageVoltage)
+		private OverloadData CalculateOverloadData(IElectricMotorDeclarationInputData motorData, int count, VoltageLevelData voltageLevel, 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);
+				return CalculateOverloadBuffer(motorData.VoltageLevels.First(), count, voltageLevel);
 			}
 			if (averageVoltage > motorData.VoltageLevels.Max(x => x.VoltageLevel))
 			{
-				return CalculateOverloadBuffer(motorData.VoltageLevels.Last(), count, voltageLevels);
+				return CalculateOverloadBuffer(motorData.VoltageLevels.Last(), count, voltageLevel);
 			}
 
 			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 ovlLo = CalculateOverloadBuffer(vLow, count, voltageLevel);
+			var ovlHi = CalculateOverloadBuffer(vHigh, count, voltageLevel);
 
 			var retVal = new OverloadData()
 			{
@@ -387,7 +603,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponen
 		}
 
 		private OverloadData CalculateOverloadBuffer(IElectricMotorVoltageLevel voltageEntry,
-			int count, VoltageLevelData voltageLevels, Tuple<uint, double> gearUsedForMeasurement = null)
+			int count, VoltageLevelData voltageLevel, Tuple<uint, double> gearUsedForMeasurement = null)
 		{
 			var gearRatioUsedForMeasurement = gearUsedForMeasurement?.Item2 ?? 1.0;
 			var gear = new GearshiftPosition(gearUsedForMeasurement?.Item1 ?? 1);
@@ -397,7 +613,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponen
 			var overloadTestSpeed = (voltageEntry.OverloadTestSpeed ?? 0.RPMtoRad()) * gearRatioUsedForMeasurement;
 
 
-            var peakElPwr = voltageLevels.LookupElectricPower(voltageEntry.VoltageLevel,
+            var peakElPwr = voltageLevel.LookupElectricPower(voltageEntry.VoltageLevel,
                     overloadTestSpeed,
 					-overloadTorque,
 					gear, 
@@ -405,10 +621,10 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponen
 					.ElectricalPower;
 			var peakPwrLoss = -peakElPwr - overloadTorque * overloadTestSpeed; // losses need to be positive
 
-			var contElPwr = voltageLevels.LookupElectricPower(voltageEntry.VoltageLevel, continuousTorqueSpeed,
+			var contElPwr = voltageLevel.LookupElectricPower(voltageEntry.VoltageLevel, continuousTorqueSpeed,
 								-continuousTorque, gear).ElectricalPower ??
-							voltageLevels.LookupElectricPower(voltageEntry.VoltageLevel, continuousTorqueSpeed,
-								voltageLevels.FullLoadDriveTorque(voltageEntry.VoltageLevel, continuousTorqueSpeed),
+							voltageLevel.LookupElectricPower(voltageEntry.VoltageLevel, continuousTorqueSpeed,
+								voltageLevel.FullLoadDriveTorque(voltageEntry.VoltageLevel, continuousTorqueSpeed),
 								gear, true).ElectricalPower;
 			var continuousPowerLoss = -contElPwr - continuousTorque * continuousTorqueSpeed; // loss needs to be positive
 			var overloadBuffer = (peakPwrLoss - continuousPowerLoss) * voltageEntry.OverloadTime;
diff --git a/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationMode/HeavyLorryRunDataFactory/DeclarationModeHeavyLorryRunDataFactory.cs b/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationMode/HeavyLorryRunDataFactory/DeclarationModeHeavyLorryRunDataFactory.cs
index 1879cfcac1e019974882c95cfbf21f7a603b4e56..7975950d17d6c832f5ab8f1a6a274d81aecd50bf 100644
--- a/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationMode/HeavyLorryRunDataFactory/DeclarationModeHeavyLorryRunDataFactory.cs
+++ b/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationMode/HeavyLorryRunDataFactory/DeclarationModeHeavyLorryRunDataFactory.cs
@@ -163,13 +163,16 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.HeavyLorryRunDa
 			protected Segment GetSegment(IVehicleDeclarationInputData vehicle, bool batteryElectric = false)
 			{
 				_allowVocational = true;
+				var ng = vehicle.Components.EngineInputData?.EngineModes.Any(e =>
+					e.Fuels.Any(f => f.FuelType.IsOneOf(FuelType.LPGPI, FuelType.NGCI, FuelType.NGPI))) ?? false;
+				var ovcHev = vehicle.OvcHev;
 				Segment segment;
 				try
 				{
 					segment = DeclarationData.TruckSegments.Lookup(
 						vehicle.VehicleCategory, batteryElectric, vehicle.AxleConfiguration, vehicle.GrossVehicleMassRating,
 						vehicle.CurbMassChassis,
-						vehicle.VocationalVehicle);
+						vehicle.VocationalVehicle, ng, ovcHev);
 				}
 				catch (VectoException)
 				{
@@ -177,7 +180,7 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.HeavyLorryRunDa
 					segment = DeclarationData.TruckSegments.Lookup(
 						vehicle.VehicleCategory, batteryElectric, vehicle.AxleConfiguration, vehicle.GrossVehicleMassRating,
 						vehicle.CurbMassChassis,
-						false);
+						false, ng, ovcHev);
 				}
 
 				if (!segment.Found)
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 3b94ea8957d0ee77e3e59946a02b1def7484549e..bda414eb6074fdcd06dc2ea3126eccb8e80eb487 100644
--- a/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationMode/HeavyLorryRunDataFactory/DeclarationModeHeavyLorryRunDataFactory_Hybrid.cs
+++ b/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationMode/HeavyLorryRunDataFactory/DeclarationModeHeavyLorryRunDataFactory_Hybrid.cs
@@ -457,5 +457,16 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.HeavyLorryRunDa
 			public HEV_P4(IDeclarationInputDataProvider dataProvider, IDeclarationReport report,
 				ILorryDeclarationDataAdapter declarationDataAdapter) : base(dataProvider, report, declarationDataAdapter) { }
 		}
+
+		public class HEV_P_IHPC : HEV_P2
+		{
+
+			public HEV_P_IHPC(IDeclarationInputDataProvider dataProvider, IDeclarationReport report,
+				ILorryDeclarationDataAdapter declarationDataAdapter) : base(dataProvider, report,
+				declarationDataAdapter)
+			{
+
+			}
+		}
 	}
 }
\ No newline at end of file
diff --git a/VectoCore/VectoCore/InputData/Reader/VectoRunDataFactoryNinjectModule.cs b/VectoCore/VectoCore/InputData/Reader/VectoRunDataFactoryNinjectModule.cs
index 17f13e5b5ca41d8175341a465b7431217e0ac9f8..d70f70dd1867932da4286d9ff11498d9a4adb19b 100644
--- a/VectoCore/VectoCore/InputData/Reader/VectoRunDataFactoryNinjectModule.cs
+++ b/VectoCore/VectoCore/InputData/Reader/VectoRunDataFactoryNinjectModule.cs
@@ -54,6 +54,7 @@ namespace TUGraz.VectoCore.InputData.Reader
 
 			#region Lorries
 
+			
 			Bind<IVectoRunDataFactory>().To<DeclarationModeHeavyLorryRunDataFactory.Conventional>().Named(
 				_vehicleStringHelper.GetName(VehicleCategoryHelper.Lorry, VectoSimulationJobType.ConventionalVehicle));
 
@@ -94,6 +95,10 @@ namespace TUGraz.VectoCore.InputData.Reader
 				_vehicleStringHelper.GetName(VehicleCategoryHelper.Lorry, VectoSimulationJobType.ParallelHybridVehicle,
 					ArchitectureID.P4));
 
+			Bind<IVectoRunDataFactory>().To<DeclarationModeHeavyLorryRunDataFactory.HEV_P_IHPC>().Named(
+				_vehicleStringHelper.GetName(VehicleCategoryHelper.Lorry, VectoSimulationJobType.IHPC,
+					ArchitectureID.P_IHPC));
+
 			Bind<IVectoRunDataFactory>().To<DeclarationModeHeavyLorryRunDataFactory.PEV_E2>().Named(
 				_vehicleStringHelper.GetName(VehicleCategoryHelper.Lorry, VectoSimulationJobType.BatteryElectricVehicle,
 					ArchitectureID.E2));
diff --git a/VectoCore/VectoCore/Models/Declaration/TruckSegments.cs b/VectoCore/VectoCore/Models/Declaration/TruckSegments.cs
index a69fc0621e753c99e8d55e9bbf1555cf3ae3bccd..d9abe40dfdcc17d6d89f63cd3be2a190879c5add 100644
--- a/VectoCore/VectoCore/Models/Declaration/TruckSegments.cs
+++ b/VectoCore/VectoCore/Models/Declaration/TruckSegments.cs
@@ -61,7 +61,7 @@ namespace TUGraz.VectoCore.Models.Declaration
 			Kilogram grossVehicleMassRating, Kilogram curbWeight, bool vocational)
 		{
 			
-			return Lookup(vehicleCategory, axleConfiguration, grossVehicleMassRating, curbWeight, vocational, false, false);
+			return Lookup(vehicleCategory, axleConfiguration, grossVehicleMassRating, curbWeight, vocational, false, false, false, false);
 		}
 
 		public VehicleCategory[] GetVehicleCategories(bool declarationOnly = true)
@@ -82,16 +82,16 @@ namespace TUGraz.VectoCore.Models.Declaration
 								.Select(row => AxleConfigurationHelper.Parse(row.Field<string>("axleconf."))).Distinct();
 		}
 
-		public Segment Lookup(
-			VehicleCategory vehicleCategory, bool isBatteryElectric, AxleConfiguration axleConfiguration,
-			Kilogram grossVehicleMassRating, Kilogram curbWeight, bool vocational)
+		public Segment Lookup(VehicleCategory vehicleCategory, bool isBatteryElectric,
+			AxleConfiguration axleConfiguration,
+			Kilogram grossVehicleMassRating, Kilogram curbWeight, bool vocational, bool hasNgFuel, bool isOvcHev)
 		{
-			return Lookup(vehicleCategory,  axleConfiguration, grossVehicleMassRating, curbWeight, vocational,false, isBatteryElectric);
+			return Lookup(vehicleCategory,  axleConfiguration, grossVehicleMassRating, curbWeight, vocational,false, isBatteryElectric, hasNgFuel, isOvcHev);
 		}
 
-		public Segment Lookup(
-			VehicleCategory vehicleCategory, AxleConfiguration axleConfiguration,
-			Kilogram grossVehicleMassRating, Kilogram curbWeight, bool vocational, bool considerInvalid, bool isBatteryElectric)
+		public Segment Lookup(VehicleCategory vehicleCategory, AxleConfiguration axleConfiguration,
+			Kilogram grossVehicleMassRating, Kilogram curbWeight, bool vocational, bool considerInvalid,
+			bool isBatteryElectric, bool hasNgFuel, bool isOvcHev)
 		{
 			var row = GetSegmentDataRow(vehicleCategory, axleConfiguration, grossVehicleMassRating, vocational, considerInvalid);
 			if (row == null) {
@@ -110,7 +110,7 @@ namespace TUGraz.VectoCore.Models.Declaration
 					RessourceHelper.ReadStream(
 						DeclarationData.DeclarationDataResourcePrefix + ".VACC." +
 						row.Field<string>(".vaccfile")),
-				Missions = CreateMissions(grossVehicleMassRating, curbWeight, row, vehicleHeight, isBatteryElectric),
+				Missions = CreateMissions(grossVehicleMassRating, curbWeight, row, vehicleHeight, isBatteryElectric, hasNgFuel:hasNgFuel, isOvcHev),
 				DesignSpeed = row.ParseDouble("designspeed").KMPHtoMeterPerSecond(),
 
 				//GrossVehicleMassRating = grossVehicleMassRating,
@@ -188,7 +188,7 @@ namespace TUGraz.VectoCore.Models.Declaration
 		}
 
 		private static Mission[] CreateMissions(Kilogram grossVehicleWeight, Kilogram curbWeight, DataRow row,
-			Meter vehicleHeight, bool isBatteryElectric)
+			Meter vehicleHeight, bool isBatteryElectric, bool hasNgFuel, bool isOvcHev)
 		{
 			var missionTypes = Enum.GetValues(typeof(MissionType)).Cast<MissionType>();
 			var missions = new List<Mission>();
@@ -198,14 +198,29 @@ namespace TUGraz.VectoCore.Models.Declaration
 				var trailers = GetTrailers(row, missionType);
 
 				Kilogram maxGVW;
+
+
 				if (missionType.IsEMS()) {
-					maxGVW = isBatteryElectric
-						? Constants.SimulationSettings.MaximumGrossVehicleMassEMS_PEV
-						: Constants.SimulationSettings.MaximumGrossVehicleMassEMS;
+					if (isBatteryElectric) {
+						maxGVW = Constants.SimulationSettings.MaximumGrossVehicleMassEMS_PEV;
+					} else if(hasNgFuel || isOvcHev) {
+						maxGVW = Constants.SimulationSettings.MaximumGrossVehicleMassEMS_OVCHev_NaturalGas;
+					} else {
+						maxGVW = Constants.SimulationSettings.MaximumGrossVehicleMassEMS;
+					}
 				} else {
-					maxGVW = isBatteryElectric
-						? Constants.SimulationSettings.MaximumGrossVehicleMassPEV
-						: Constants.SimulationSettings.MaximumGrossVehicleMass;
+					if (isBatteryElectric)
+					{
+						maxGVW = Constants.SimulationSettings.MaximumGrossVehicleMassPEV;
+					}
+					else if (hasNgFuel || isOvcHev)
+					{
+						maxGVW = Constants.SimulationSettings.MaximumGrossVehicleMassOVCHev_NaturalGas;
+					}
+					else
+					{
+						maxGVW = Constants.SimulationSettings.MaximumGrossVehicleMass;
+					}
 				}
 				
 	
diff --git a/VectoCore/VectoCoreTest/InputData/RunDataFactory/RunDataFactoryFactoryTest.cs b/VectoCore/VectoCoreTest/InputData/RunDataFactory/RunDataFactoryFactoryTest.cs
index ecfcb9212b048682746e04eedd2100e993fa54fe..6d7e561d754a65643ea3f5ddee50ca3ab8065fb8 100644
--- a/VectoCore/VectoCoreTest/InputData/RunDataFactory/RunDataFactoryFactoryTest.cs
+++ b/VectoCore/VectoCoreTest/InputData/RunDataFactory/RunDataFactoryFactoryTest.cs
@@ -183,6 +183,19 @@ namespace TUGraz.VectoCore.Tests.InputData.RunDataFactory
 			CreateRunDataFactory(input, typeof(DeclarationModeHeavyLorryRunDataFactory.HEV_P4), expectedDataAdapter);
 		}
 
+		[TestCase()]
+		//[TestCase(typeof(DeclarationDataAdapterHeavyLorry.HEV_))]
+		public void HEV_P_IHPC_HeavyLorryTest(Type expectedDataAdapter = null)
+		{
+			var input = new Mock<IDeclarationInputDataProvider>()
+				.HEV(ArchitectureID.P_IHPC)
+				.Lorry();
+			CreateRunDataFactory(input, typeof(DeclarationModeHeavyLorryRunDataFactory.HEV_P_IHPC), expectedDataAdapter);
+		}
+
+
+
+
 
 		[TestCase()]
 		[TestCase(typeof(DeclarationDataAdapterHeavyLorry.PEV_E2))]
@@ -634,11 +647,8 @@ namespace TUGraz.VectoCore.Tests.InputData.RunDataFactory
 
 		internal static Mock<IDeclarationInputDataProvider> HEV(this Mock<IDeclarationInputDataProvider> mock, ArchitectureID arch)
 		{
-			var type = arch.ToString().StartsWith("P")
-				? VectoSimulationJobType.ParallelHybridVehicle
-				: VectoSimulationJobType.SerialHybridVehicle;
-
 
+			VectoSimulationJobType type;
 			switch (arch) {
 				case ArchitectureID.P1:
 				case ArchitectureID.P2:
@@ -647,6 +657,9 @@ namespace TUGraz.VectoCore.Tests.InputData.RunDataFactory
 				case ArchitectureID.P4:
 					type = VectoSimulationJobType.ParallelHybridVehicle;
 					break;
+				case ArchitectureID.P_IHPC:
+					type = VectoSimulationJobType.IHPC;
+					break;
 				case ArchitectureID.S2:
 				case ArchitectureID.S3:
 				case ArchitectureID.S4:
diff --git a/VectoCore/VectoCoreTest/Integration/Declaration/HeavyLorry/HeavyLorrySimulation.cs b/VectoCore/VectoCoreTest/Integration/Declaration/HeavyLorry/HeavyLorrySimulation.cs
index a6dfba3cb8029f18243fadb2abd579182f7ba770..f8ea61004dbde16fdef881ea365ea168cdaf2e9e 100644
--- a/VectoCore/VectoCoreTest/Integration/Declaration/HeavyLorry/HeavyLorrySimulation.cs
+++ b/VectoCore/VectoCoreTest/Integration/Declaration/HeavyLorry/HeavyLorrySimulation.cs
@@ -275,7 +275,7 @@ public class HeavyLorrySimulation
 	[TestCase(Group5_HEV_P3_OVC, 20)]
 	[TestCase(Group5_HEV_P4_OVC, 20)]
 	[TestCase(Group5_HEV_P2_5_OVC, 20)]
-	[TestCase(@"E:\MARTINI\source\hm_vecto-dev\VectoCore\VectoCoreTest\TestData\Integration\DeclarationMode\V24_DeclarationMode\HeavyLorry\P-HEV\Group5_HEV_IHPC.xml", 20)]
+	[TestCase(@"HeavyLorry\P-HEV\Group5_HEV_IHPC.xml", 20)]
 
 	public void PHEV_ChargeDepleting(string jobFile, int nrRuns)
 	{
diff --git a/VectoCore/VectoCoreTest/TestData/Integration/DeclarationMode/V24_DeclarationMode/HeavyLorry/P-HEV/Group5_HEV_P2_5_ovc.xml b/VectoCore/VectoCoreTest/TestData/Integration/DeclarationMode/V24_DeclarationMode/HeavyLorry/P-HEV/Group5_HEV_P2_5_ovc.xml
index ba7a850eb6d2b30865ada9b86b5d32f990f74674..bee701752a8467db014814ce12706a9282909743 100644
--- a/VectoCore/VectoCoreTest/TestData/Integration/DeclarationMode/V24_DeclarationMode/HeavyLorry/P-HEV/Group5_HEV_P2_5_ovc.xml
+++ b/VectoCore/VectoCoreTest/TestData/Integration/DeclarationMode/V24_DeclarationMode/HeavyLorry/P-HEV/Group5_HEV_P2_5_ovc.xml
@@ -2188,35 +2188,20 @@
 						</di:Reference>
 					</v2.3:Signature>
 				</ElectricMachineSystem>
-				<ADC>
-					<v2.3:Data xsi:type="v2.3:ADCDataDeclarationType" id="ADC34533">
-						<v2.3:Manufacturer>ADC Manufacturer</v2.3:Manufacturer>
-						<v2.3:Model>Some ADC Model</v2.3:Model>
-						<v2.3:CertificationNumber>CertNmbr23451</v2.3:CertificationNumber>
-						<v2.3:Date>2022-01-01T00:00:00Z</v2.3:Date>
-						<v2.3:AppVersion>ADC Declaration App</v2.3:AppVersion>
-						<v2.3:Ratio>1.000</v2.3:Ratio>
-						<v2.3:CertificationMethod>Option 2</v2.3:CertificationMethod>
-						<v2.3:TorqueLossMap>
-							<v2.3:Entry inputSpeed='0.00' inputTorque='-50000.00' torqueLoss='0.00'/>
-							<v2.3:Entry inputSpeed='0.00' inputTorque='-200.00' torqueLoss='0.00'/>
-							<v2.3:Entry inputSpeed='0.00' inputTorque='0.00' torqueLoss='0.00'/>
-							<v2.3:Entry inputSpeed='0.00' inputTorque='200.00' torqueLoss='0.00'/>
-							<v2.3:Entry inputSpeed='0.00' inputTorque='50000.00' torqueLoss='0.00'/>
-							<v2.3:Entry inputSpeed='5000.00' inputTorque='-50000.00' torqueLoss='0.00'/>
-							<v2.3:Entry inputSpeed='5000.00' inputTorque='-1253.00' torqueLoss='0.00'/>
-							<v2.3:Entry inputSpeed='5000.00' inputTorque='0.00' torqueLoss='0.00'/>
-							<v2.3:Entry inputSpeed='5000.00' inputTorque='1253.00' torqueLoss='0.00'/>
-							<v2.3:Entry inputSpeed='5000.00' inputTorque='50000.00' torqueLoss='0.00'/>
-						</v2.3:TorqueLossMap>
-					</v2.3:Data>
-					<v2.3:Signature>
-						<di:Reference>
-							<di:DigestMethod Algorithm=""></di:DigestMethod>
-							<di:DigestValue>DummyDigestValue</di:DigestValue>
-						</di:Reference>
-					</v2.3:Signature>
-				</ADC>
+				<P2.5GearRatios>
+					<Ratio gear="1">1.025</Ratio>
+					<Ratio gear="2">0.813</Ratio>
+					<Ratio gear="3">1.026</Ratio>
+					<Ratio gear="4">0.813</Ratio>
+					<Ratio gear="5">1.026</Ratio>
+					<Ratio gear="6">0.813</Ratio>
+					<Ratio gear="7">1.025</Ratio>
+					<Ratio gear="8">0.813</Ratio>
+					<Ratio gear="9">1.026</Ratio>
+					<Ratio gear="10">0.813</Ratio>
+					<Ratio gear="11">1.026</Ratio>
+					<Ratio gear="12">0.813</Ratio>
+				</P2.5GearRatios>
 			</ElectricMachine>
 			<ElectricEnergyStorage>
 				<Battery>