From 2113437751d3f0c3f7664e2793ab91bcd9e51347 Mon Sep 17 00:00:00 2001
From: Markus Quaritsch <markus.quaritsch@tugraz.at>
Date: Thu, 16 Apr 2020 08:32:42 +0200
Subject: [PATCH] started work on manufacturer report completed vehicle

---
 .../InputData/IInputDataProvider.cs           |   4 +
 VectoCommon/VectoCommon/Utils/SI.cs           |   5 +
 .../Utils/SIConvertExtensionMethods.cs        |   5 +
 .../XMLDeclarationInputDataProvider.cs        |  12 +
 ...clarationDataAdapterCompletedBusGeneric.cs |   4 +-
 .../DeclarationDataAdapterPrimaryBus.cs       |  11 +-
 .../DeclarationDataAdapterSingleBus.cs        |   9 +
 ...tionModeCompletedBusVectoRunDataFactory.cs |  78 +++-
 .../GenericModelData/GenericBusEngineData.cs  |  16 +-
 .../Models/Simulation/Data/VectoRunData.cs    |   4 +
 .../OutputData/SummaryDataContainer.cs        |   5 +-
 .../XML/AbstractXMLManufacturerReport.cs      |   2 +-
 .../OutputData/XML/XMLDeclarationReport.cs    |   6 +
 .../XMLDeclarationReportCompletedVehicle.cs   |  25 +-
 .../XML/XMLManufacturerReportCompletedBus.cs  | 423 ++++++++++++++++++
 .../XML/XMLManufacturerReportPrimaryBus.cs    |  70 +--
 .../OutputData/XML/XMLPrimaryVehicleReport.cs |   4 +-
 .../Declaration/Buses/ElectricConsumers.csv   |   2 +-
 VectoCore/VectoCore/VectoCore.csproj          |   1 +
 .../CompletedBusFactorMethodTest.cs           |   1 +
 .../FactorMethod/SingleBus_41-32b_AT-P.vecto  |  12 +
 ...mary_heavyBus group42_SmartPS.RSLT_PIF.xml | 134 +++---
 .../primary_heavyBus group42_SmartPS.xml      |  12 +-
 VectoCore/VectoCoreTest/VectoCoreTest.csproj  |   3 +
 24 files changed, 653 insertions(+), 195 deletions(-)
 create mode 100644 VectoCore/VectoCore/OutputData/XML/XMLManufacturerReportCompletedBus.cs
 create mode 100644 VectoCore/VectoCoreTest/TestData/Integration/Buses/FactorMethod/SingleBus_41-32b_AT-P.vecto

diff --git a/VectoCommon/VectoCommon/InputData/IInputDataProvider.cs b/VectoCommon/VectoCommon/InputData/IInputDataProvider.cs
index 15890e7a8c..7533af593c 100644
--- a/VectoCommon/VectoCommon/InputData/IInputDataProvider.cs
+++ b/VectoCommon/VectoCommon/InputData/IInputDataProvider.cs
@@ -30,6 +30,8 @@
 */
 
 using System.Xml.Linq;
+using TUGraz.VectoCommon.Models;
+using TUGraz.VectoCommon.Utils;
 
 namespace TUGraz.VectoCommon.InputData
 {
@@ -67,6 +69,8 @@ namespace TUGraz.VectoCommon.InputData
 		IApplicationInformation ApplicationInformation { get; }
 
 		DigestData ManufacturerHash { get; }
+
+		IResult GetResult(VehicleClass vehicleClass, MissionType mission, string fuelMode, Kilogram payload);
 	}
 
 	public interface ISingleBusInputDataProvider : IDeclarationInputDataProvider
diff --git a/VectoCommon/VectoCommon/Utils/SI.cs b/VectoCommon/VectoCommon/Utils/SI.cs
index 69bb2e1dc6..bd533a54eb 100644
--- a/VectoCommon/VectoCommon/Utils/SI.cs
+++ b/VectoCommon/VectoCommon/Utils/SI.cs
@@ -824,6 +824,11 @@ namespace TUGraz.VectoCommon.Utils
 		private JoulePerMeter(double val) : base(val, Units) { }
 
 		public override string UnitString { get { return "J/m"; } }
+
+		public static KilogramPerMeter operator /(JoulePerMeter jpm, JoulePerKilogramm jpkg)
+		{
+			return SIBase<KilogramPerMeter>.Create(jpm.Val / jpkg.Value());
+		}
 	}
 
 	/// <summary>
diff --git a/VectoCommon/VectoCommon/Utils/SIConvertExtensionMethods.cs b/VectoCommon/VectoCommon/Utils/SIConvertExtensionMethods.cs
index 3bbd12d234..553964b2fb 100644
--- a/VectoCommon/VectoCommon/Utils/SIConvertExtensionMethods.cs
+++ b/VectoCommon/VectoCommon/Utils/SIConvertExtensionMethods.cs
@@ -236,6 +236,11 @@ namespace TUGraz.VectoCommon.Utils
 		{
 			return new ConvertedSI(nlps.Value() * 60.0, "Nl/min");
 		}
+
+		public static ConvertedSI ConvertToMegaJouleperKilometer(this JoulePerMeter jpm)
+		{
+			return new ConvertedSI(jpm.Value() * 1e-3, "MJ/km");
+		}
 	}
 }
 
diff --git a/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLDeclarationInputDataProvider.cs b/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLDeclarationInputDataProvider.cs
index bae1003efd..b9282412d5 100644
--- a/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLDeclarationInputDataProvider.cs
+++ b/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLDeclarationInputDataProvider.cs
@@ -29,11 +29,15 @@
 *   Martin Rexeis, rexeis@ivt.tugraz.at, IVT, Graz University of Technology
 */
 
+using System;
+using System.Linq;
 using System.Xml;
 using System.Xml.Linq;
 using Castle.Components.DictionaryAdapter.Xml;
 using TUGraz.VectoCommon.InputData;
+using TUGraz.VectoCommon.Models;
 using TUGraz.VectoCommon.Resources;
+using TUGraz.VectoCommon.Utils;
 using TUGraz.VectoCore.InputData.FileIO.XML.Common;
 using TUGraz.VectoCore.InputData.FileIO.XML.Declaration.Interfaces;
 using TUGraz.VectoCore.Utils;
@@ -156,6 +160,14 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration
 			get { return Reader.GetDigestData(Document.LastChild.LastChild); }
 		}
 
+		public IResult GetResult(VehicleClass vehicleClass, MissionType mission, string fuelMode, Kilogram payload)
+		{
+			return ResultsInputData.Results.FirstOrDefault(
+				x => x.VehicleGroup == vehicleClass &&
+					(x.SimulationParameter.Payload - payload).IsEqual(0, 1) && x.Mission == mission &&
+					x.SimulationParameter.FuelMode.Equals(fuelMode, StringComparison.InvariantCultureIgnoreCase));
+		}
+
 		public IResultsInputData ResultsInputData
 		{
 			get { return _resultsInputData ?? (_resultsInputData = Reader.ResultsInputData); }
diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapterCompletedBusGeneric.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapterCompletedBusGeneric.cs
index 50c8a93962..451b761a54 100644
--- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapterCompletedBusGeneric.cs
+++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapterCompletedBusGeneric.cs
@@ -38,9 +38,9 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter
 		// only powertrain components are different
 
 		
-		public CombustionEngineData CreateEngineData(IVehicleDeclarationInputData primaryVehicle)
+		public CombustionEngineData CreateEngineData(IVehicleDeclarationInputData primaryVehicle, int modeIdx)
 		{
-			return GenericBusEngineData.Instance.CreateGenericBusEngineData(primaryVehicle);
+			return GenericBusEngineData.Instance.CreateGenericBusEngineData(primaryVehicle, modeIdx);
 		}
 
 		#region Overrides of DeclarationDataAdapterHeavyLorry
diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapterPrimaryBus.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapterPrimaryBus.cs
index 3434093cbf..a2ef8aa194 100644
--- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapterPrimaryBus.cs
+++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapterPrimaryBus.cs
@@ -21,8 +21,15 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter
 {
 	public class DeclarationDataAdapterPrimaryBus : DeclarationDataAdapterHeavyLorry
 	{
-	
-		#region Overrides of DeclarationDataAdapterTruck
+		#region Overrides of DeclarationDataAdapterHeavyLorry
+
+		public override DriverData CreateDriverData()
+		{
+			var retVal = base.CreateDriverData();
+			retVal.LookAheadCoasting.Enabled = false;
+			return retVal;
+		}
+
 
 		public override VehicleData CreateVehicleData(IVehicleDeclarationInputData data, Mission mission, KeyValuePair<LoadingType, Tuple<Kilogram, double?>> loading)
 		{
diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapterSingleBus.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapterSingleBus.cs
index 5c4288d039..22630f9f2b 100644
--- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapterSingleBus.cs
+++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapterSingleBus.cs
@@ -77,6 +77,15 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter
 			return retVal;
 		}
 
+		#region Overrides of DeclarationDataAdapterCompletedBusGeneric
+
+		public override RetarderData CreateRetarderData(IRetarderInputData retarder)
+		{
+			return SetCommonRetarderData(retarder);
+		}
+
+		#endregion
+
 		public ISingleBusInputDataProvider SingleBusInputData { get; set; }
 
 		protected IVehicleDeclarationInputData CompletedVehicle
diff --git a/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationModeCompletedBusVectoRunDataFactory.cs b/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationModeCompletedBusVectoRunDataFactory.cs
index 04a1e5f61a..eb0ce95dcb 100644
--- a/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationModeCompletedBusVectoRunDataFactory.cs
+++ b/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationModeCompletedBusVectoRunDataFactory.cs
@@ -48,7 +48,7 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl
 		protected ICompressorMap _compressorMap;
 		//protected IPneumaticsConsumersDemand _consumersDeclarationData;
 
-		protected CombustionEngineData _combustionEngineData;
+		//protected CombustionEngineData _combustionEngineData;
 
 		//protected Exception InitException;
 		protected ShiftStrategyParameters _gearshiftData;
@@ -93,7 +93,7 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl
 		{
 			var powertrainConfig = _segmentCompletedBus.Missions.Select(
 														mission => CreateVectoRunDataSpecific(
-															 mission, mission.Loadings.First()))
+															 mission, mission.Loadings.First(), 0))
 													.FirstOrDefault(x => x != null);
 			
 			Report.InitializeReport(powertrainConfig, new List<List<FuelData.Entry>>());
@@ -113,7 +113,7 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl
 																_segmentCompletedBus.Missions.First().Loadings.First());
 			tmpVehicleData.VehicleCategory = VehicleCategory.GenericBusVehicle;
 
-			_combustionEngineData = DataAdapterGeneric.CreateEngineData(PrimaryVehicle);
+			var combustionEngineData = DataAdapterGeneric.CreateEngineData(PrimaryVehicle, 0);
 
 			_axlegearData = DataAdapterGeneric.CreateAxleGearData(PrimaryVehicle.Components.AxleGearInputData);
 
@@ -127,11 +127,11 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl
 			};
 			var tmpStrategy = PowertrainBuilder.GetShiftStrategy(tmpRunData, new SimplePowertrainContainer(tmpRunData));
 			
-			_gearboxData = DataAdapterGeneric.CreateGearboxData(PrimaryVehicle, new VectoRunData() { EngineData = _combustionEngineData, AxleGearData = _axlegearData, VehicleData = tmpVehicleData },
+			_gearboxData = DataAdapterGeneric.CreateGearboxData(PrimaryVehicle, new VectoRunData() { EngineData = combustionEngineData, AxleGearData = _axlegearData, VehicleData = tmpVehicleData },
 				tmpStrategy);
 
 			_gearshiftData = DataAdapterGeneric.CreateGearshiftData(
-				_gearboxData, _axlegearData.AxleGear.Ratio * (_angledriveData?.Angledrive.Ratio ?? 1.0), _combustionEngineData.IdleSpeed);
+				_gearboxData, _axlegearData.AxleGear.Ratio * (_angledriveData?.Angledrive.Ratio ?? 1.0), combustionEngineData.IdleSpeed);
 
 			_retarderData = DataAdapterGeneric.CreateRetarderData(PrimaryVehicle.Components.RetarderInputData);
 				
@@ -151,23 +151,53 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl
 
 		private IEnumerable<VectoRunData> VectoRunDataHeavyBusCompleted()
 		{
-			foreach (var mission in _segmentCompletedBus.Missions) {
-				foreach (var loading in mission.Loadings) {
-					var simulationRunData = CreateVectoRunDataSpecific(mission, loading);
-					if (simulationRunData != null) {
+			var engineModes = InputDataProvider.PrimaryVehicleData.Vehicle.Components.EngineInputData.EngineModes;
+
+			for (var modeIdx = 0; modeIdx < engineModes.Count; modeIdx++) {
+				var fuelMode = "single fuel mode";
+				if (engineModes[modeIdx].Fuels.Count > 1) {
+					fuelMode = "dual fuel mode";
+				}
+				foreach (var mission in _segmentCompletedBus.Missions) {
+					foreach (var loading in mission.Loadings) {
+						var simulationRunData = CreateVectoRunDataSpecific(mission, loading, modeIdx);
+						if (simulationRunData != null) {
+							yield return simulationRunData;
+						}
+
+						var primarySegment = GetPrimarySegment(PrimaryVehicle);
+						var primaryMission = primarySegment.Missions.Where(
+							m => {
+								return m.BusParameter.DoubleDecker == CompletedVehicle.VehicleCode.IsDoubleDeckerBus() &&
+										m.MissionType == mission.MissionType;
+							}).First();
+						simulationRunData = CreateVectoRunDataGeneric(
+							primaryMission,
+							new KeyValuePair<LoadingType, Tuple<Kilogram, double?>>(loading.Key, primaryMission.Loadings[loading.Key]),
+							primarySegment, modeIdx);
+
+
+						var primaryResult = InputDataProvider.PrimaryVehicleData.GetResult(
+							simulationRunData.Mission.BusParameter.BusGroup, simulationRunData.Mission.MissionType, fuelMode,
+							simulationRunData.VehicleData.Loading);
+						if (primaryResult == null) {
+							throw new VectoException(
+								"Failed to find results in PrimaryVehicleReport for vehicle group: {0},  mission: {1}, fuel mode: '{2}', payload: {3}. Make sure PIF and completed vehicle data match!",
+								simulationRunData.Mission.BusParameter.BusGroup, simulationRunData.Mission.MissionType, fuelMode,
+								simulationRunData.VehicleData.Loading);
+						}
+
+						if (primaryResult.ResultStatus != "success") {
+							throw new VectoException(
+								"Simulation results in PrimaryVehicleReport for vehicle group: {0},  mission: {1}, fuel mode: '{2}', payload: {3} not finished successfully.",
+								simulationRunData.Mission.BusParameter.BusGroup, simulationRunData.Mission.MissionType, fuelMode,
+								simulationRunData.VehicleData.Loading);
+						}
+
+						simulationRunData.PrimaryResult = primaryResult;
+
 						yield return simulationRunData;
 					}
-
-					var primarySegment = GetPrimarySegment(PrimaryVehicle);
-					var primaryMission = primarySegment.Missions.Where(
-						m => {
-							return m.BusParameter.DoubleDecker == CompletedVehicle.VehicleCode.IsDoubleDeckerBus() &&
-									m.MissionType == mission.MissionType;
-						}).First();
-					simulationRunData = CreateVectoRunDataGeneric(
-						primaryMission, new KeyValuePair<LoadingType, Tuple<Kilogram, double?>>(loading.Key, primaryMission.Loadings[loading.Key]),
-						primarySegment);
-					yield return simulationRunData;
 				}
 			}
 		}
@@ -205,7 +235,7 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl
 		}
 
 
-		protected VectoRunData CreateVectoRunDataSpecific(Mission mission, KeyValuePair<LoadingType, Tuple<Kilogram, double?>> loading)
+		protected VectoRunData CreateVectoRunDataSpecific(Mission mission, KeyValuePair<LoadingType, Tuple<Kilogram, double?>> loading, int modeIdx)
 		{
 			DrivingCycleData cycle;
 			lock (CyclesCacheLock) {
@@ -224,7 +254,7 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl
 				VehicleData = DataAdapterSpecific.CreateVehicleData(PrimaryVehicle, CompletedVehicle, 
 					mission, loading),
 				AirdragData = DataAdapterSpecific.CreateAirdragData(CompletedVehicle, mission),
-				EngineData = _combustionEngineData,
+				EngineData = DataAdapterSpecific.CreateEngineData(PrimaryVehicle, modeIdx),
 				GearboxData = _gearboxData,
 				AxleGearData = _axlegearData,
 				AngledriveData = _angledriveData,
@@ -251,7 +281,7 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl
 		}
 
 		
-		protected VectoRunData CreateVectoRunDataGeneric(Mission mission, KeyValuePair<LoadingType, Tuple<Kilogram, double?>> loading, Segment primarySegment)
+		protected VectoRunData CreateVectoRunDataGeneric(Mission mission, KeyValuePair<LoadingType, Tuple<Kilogram, double?>> loading, Segment primarySegment, int modeIdx)
 		{
 			DrivingCycleData cycle;
 			lock (CyclesCacheLock) {
@@ -269,7 +299,7 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl
 				Loading = loading.Key,
 				VehicleData = DataAdapterGeneric.CreateVehicleData(PrimaryVehicle, mission, loading),
 				AirdragData = DataAdapterGeneric.CreateAirdragData(null, mission, new Segment()),
-				EngineData = _combustionEngineData,
+				EngineData = DataAdapterGeneric.CreateEngineData(PrimaryVehicle, modeIdx),
 				GearboxData = _gearboxData,
 				AxleGearData = _axlegearData,
 				AngledriveData = _angledriveData,
diff --git a/VectoCore/VectoCore/Models/GenericModelData/GenericBusEngineData.cs b/VectoCore/VectoCore/Models/GenericModelData/GenericBusEngineData.cs
index 1de3adf980..9498cb77d2 100644
--- a/VectoCore/VectoCore/Models/GenericModelData/GenericBusEngineData.cs
+++ b/VectoCore/VectoCore/Models/GenericModelData/GenericBusEngineData.cs
@@ -4,6 +4,7 @@ using System.Data;
 using System.Linq;
 using System.Runtime.CompilerServices;
 using TUGraz.VectoCommon.BusAuxiliaries;
+using TUGraz.VectoCommon.Exceptions;
 using TUGraz.VectoCommon.InputData;
 using TUGraz.VectoCommon.Models;
 using TUGraz.VectoCommon.Utils;
@@ -39,13 +40,18 @@ namespace TUGraz.VectoCore.Models.Declaration
 			
 		}
 
-		public CombustionEngineData CreateGenericBusEngineData(IVehicleDeclarationInputData primaryVehicle)
+		public CombustionEngineData CreateGenericBusEngineData(IVehicleDeclarationInputData primaryVehicle, int modeIdx)
 		{
+			if (modeIdx >= primaryVehicle.Components.EngineInputData.EngineModes.Count) {
+				throw new VectoException(
+					"requested engine mode {0}, only {1} modes in engine of primary vehicle available!", modeIdx,
+					primaryVehicle.Components.EngineInputData.EngineModes.Count);
+			}
 			var engineData = primaryVehicle.Components.EngineInputData;
 			var gearbox = primaryVehicle.Components.GearboxInputData;
 
 			var engine = new CombustionEngineData {
-				IdleSpeed = engineData.EngineModes[0].IdleSpeed,
+				IdleSpeed = engineData.EngineModes[modeIdx].IdleSpeed,
 				Displacement = engineData.Displacement,
 				WHRType = WHRType.None,
 				Inertia = DeclarationData.Engine.EngineInertia(engineData.Displacement, gearbox.Type),
@@ -55,10 +61,10 @@ namespace TUGraz.VectoCore.Models.Declaration
 				MaxTorqueDeclared = engineData.MaxTorqueDeclared,
 			};
 
-		var limits = primaryVehicle.TorqueLimits.ToDictionary(e => e.Gear);
+			var limits = primaryVehicle.TorqueLimits.ToDictionary(e => e.Gear);
 			var numGears = gearbox.Gears.Count;
 			var fullLoadCurves = new Dictionary<uint, EngineFullLoadCurve>(numGears + 1);
-			fullLoadCurves[0] = FullLoadCurveReader.Create(engineData.EngineModes.First().FullLoadCurve, true);
+			fullLoadCurves[0] = FullLoadCurveReader.Create(engineData.EngineModes[modeIdx].FullLoadCurve, true);
 			fullLoadCurves[0].EngineData = engine;
 
 			foreach (var gear in gearbox.Gears) {
@@ -71,7 +77,7 @@ namespace TUGraz.VectoCore.Models.Declaration
 			engine.FullLoadCurves = fullLoadCurves;
 			
 
-			var fuel = GetCombustionEngineFuelData(primaryVehicle.Components.EngineInputData.EngineModes.First(), fullLoadCurves[0]);
+			var fuel = GetCombustionEngineFuelData(primaryVehicle.Components.EngineInputData.EngineModes[modeIdx], fullLoadCurves[0]);
 			
 			
 
diff --git a/VectoCore/VectoCore/Models/Simulation/Data/VectoRunData.cs b/VectoCore/VectoCore/Models/Simulation/Data/VectoRunData.cs
index 56f4358033..7e8e66d353 100644
--- a/VectoCore/VectoCore/Models/Simulation/Data/VectoRunData.cs
+++ b/VectoCore/VectoCore/Models/Simulation/Data/VectoRunData.cs
@@ -36,6 +36,7 @@ using System.Xml.Linq;
 using Newtonsoft.Json;
 using TUGraz.VectoCommon.BusAuxiliaries;
 using TUGraz.VectoCommon.Exceptions;
+using TUGraz.VectoCommon.InputData;
 using TUGraz.VectoCommon.Models;
 using TUGraz.VectoCommon.Utils;
 using TUGraz.VectoCore.Configuration;
@@ -127,6 +128,9 @@ namespace TUGraz.VectoCore.Models.Simulation.Data
 		public string ShiftStrategy { get; set; }
 		public MeterPerSecond VehicleDesignSpeed { get; internal set; }
 
+		// only used for factor method
+		public IResult PrimaryResult { get; set; }
+
 		public class AuxData
 		{
 			// ReSharper disable once InconsistentNaming
diff --git a/VectoCore/VectoCore/OutputData/SummaryDataContainer.cs b/VectoCore/VectoCore/OutputData/SummaryDataContainer.cs
index a598007435..c09dd9b617 100644
--- a/VectoCore/VectoCore/OutputData/SummaryDataContainer.cs
+++ b/VectoCore/VectoCore/OutputData/SummaryDataContainer.cs
@@ -369,8 +369,8 @@ namespace TUGraz.VectoCore.OutputData
 			var workBusAuxESMech = 0.SI<WattSecond>();
 			if (runData.BusAuxiliaries != null) {
 				var workBusAuxPSCompOff = modData.EnergyPneumaticCompressorPowerOff();
-				var workBusAuxPSCompOn = modData.EnergyPneumaticCompressorOn();
-				var airBusAuxPSON = modData.AirGenerated();
+				var workBusAuxPSCompOn = modData.EnergyPneumaticCompressorAlwaysOn();
+				var airBusAuxPSON = modData.AirGeneratedAlwaysOn();
 				var deltaAir = modData.AirConsumed() - modData.AirGenerated();
 
 				var kAir = (workBusAuxPSCompOn - workBusAuxPSCompOff) / (airBusAuxPSON - 0.SI<NormLiter>());
@@ -381,6 +381,7 @@ namespace TUGraz.VectoCore.OutputData
 										runData.BusAuxiliaries.ElectricalUserInputsConfig.AlternatorMap.GetEfficiency(0.RPMtoRad(), 0.SI<Ampere>()) /
 										runData.BusAuxiliaries.ElectricalUserInputsConfig.AlternatorGearEfficiency;
 
+
 			}
 			row[Fields.E_BusAux_PS_corr] = workBusAuxPSCorr.ConvertToKiloWattHour();
 			row[Fields.E_BusAux_ES_mech_corr] = workBusAuxESMech.ConvertToKiloWattHour();
diff --git a/VectoCore/VectoCore/OutputData/XML/AbstractXMLManufacturerReport.cs b/VectoCore/VectoCore/OutputData/XML/AbstractXMLManufacturerReport.cs
index d441b77113..6879eab7b2 100644
--- a/VectoCore/VectoCore/OutputData/XML/AbstractXMLManufacturerReport.cs
+++ b/VectoCore/VectoCore/OutputData/XML/AbstractXMLManufacturerReport.cs
@@ -34,7 +34,7 @@ namespace TUGraz.VectoCore.OutputData.XML
 		protected XElement Results;
 		protected XElement InputDataIntegrity;
 
-		private bool _allSuccess = true;
+		protected bool _allSuccess = true;
 
 		protected XNamespace xsi = XNamespace.Get("http://www.w3.org/2001/XMLSchema-instance");
 		protected XNamespace tns = "urn:tugraz:ivt:VectoAPI:DeclarationOutput:v0.8";
diff --git a/VectoCore/VectoCore/OutputData/XML/XMLDeclarationReport.cs b/VectoCore/VectoCore/OutputData/XML/XMLDeclarationReport.cs
index 8b1e8bcff5..8096a70821 100644
--- a/VectoCore/VectoCore/OutputData/XML/XMLDeclarationReport.cs
+++ b/VectoCore/VectoCore/OutputData/XML/XMLDeclarationReport.cs
@@ -38,6 +38,7 @@ using System.Xml;
 using System.Xml.Linq;
 using System.Xml.XPath;
 using TUGraz.VectoCommon.BusAuxiliaries;
+using TUGraz.VectoCommon.InputData;
 using TUGraz.VectoCommon.Models;
 using TUGraz.VectoCommon.Resources;
 using TUGraz.VectoCommon.Utils;
@@ -123,6 +124,9 @@ namespace TUGraz.VectoCore.OutputData.XML
 
 			public double WeightingFactor { get; set; }
 
+			// used for factor method
+			public IResult PrimaryResult { get; set; }
+
 
 			public virtual void SetResultData(VectoRunData runData, IModalDataContainer data, double weightingFactor)
 			{
@@ -206,6 +210,8 @@ namespace TUGraz.VectoCore.OutputData.XML
 				AverageAxlegearEfficiency = eAxlOut / eAxlIn;
 
 				WeightingFactor = weightingFactor;
+
+				PrimaryResult = runData.PrimaryResult;
 			}
 
 			private static WattSecond WorkWHRCorrection(IModalDataContainer data)
diff --git a/VectoCore/VectoCore/OutputData/XML/XMLDeclarationReportCompletedVehicle.cs b/VectoCore/VectoCore/OutputData/XML/XMLDeclarationReportCompletedVehicle.cs
index aae61d59a9..5c906d13f3 100644
--- a/VectoCore/VectoCore/OutputData/XML/XMLDeclarationReportCompletedVehicle.cs
+++ b/VectoCore/VectoCore/OutputData/XML/XMLDeclarationReportCompletedVehicle.cs
@@ -1,5 +1,6 @@
 using System;
 using System.Linq;
+using TUGraz.VectoCommon.Exceptions;
 using TUGraz.VectoCommon.InputData;
 using TUGraz.VectoCommon.Models;
 using TUGraz.VectoCore.Models.Declaration;
@@ -16,7 +17,9 @@ namespace TUGraz.VectoCore.OutputData.XML {
 
 		protected override void InstantiateReports(VectoRunData modelData)
 		{
-			ManufacturerRpt = new XMLManufacturerReportCompletedBus();
+			ManufacturerRpt = new XMLManufacturerReportCompletedBus() {
+				PrimaryVehicle = PrimaryResults.Vehicle
+			};
 			CustomerRpt = new XMLCustomerReportCompletedBus();
 		}
 
@@ -29,7 +32,12 @@ namespace TUGraz.VectoCore.OutputData.XML {
 
 				var genericResult = Results.First(x => x.VehicleClass.IsPrimaryBus() && x.FuelMode == specificResult.FuelMode &&
 						x.Mission == specificResult.Mission && x.LoadingType == specificResult.LoadingType);
-				var primaryResult = SelectPrimaryResult(genericResult);
+				var primaryResult = genericResult.PrimaryResult ?? specificResult.PrimaryResult;
+				if (primaryResult == null) {
+					throw new VectoException(
+						"no primary result entry set for simulation run vehicle class: {0}, mission: {1}, payload: {2}",
+						genericResult.VehicleClass, genericResult.Mission, genericResult.Payload);
+				}
 
 				(ManufacturerRpt as XMLManufacturerReportCompletedBus).WriteResult(genericResult, specificResult, primaryResult);
 				(CustomerRpt as XMLCustomerReportCompletedBus).WriteResult(genericResult, specificResult, primaryResult);
@@ -41,18 +49,5 @@ namespace TUGraz.VectoCore.OutputData.XML {
 				OutputReports();
 			}
 		}
-
-		private IResult SelectPrimaryResult(ResultEntry genericResult)
-		{
-			var isDualModeEngine = Results.Select(x => x.FuelMode).Distinct().Count() > 1;
-			var fuelMode = "single fuel mode";
-			if (isDualModeEngine && genericResult.FuelMode > 0) {
-				fuelMode = "dual fuel mode";
-			}
-			return PrimaryResults.ResultsInputData.Results.First(
-				x => x.VehicleGroup == genericResult.VehicleClass &&
-					(x.SimulationParameter.Payload - genericResult.Payload).IsEqual(0, 1) && x.Mission == genericResult.Mission &&
-					x.SimulationParameter.FuelMode.Equals(fuelMode, StringComparison.InvariantCultureIgnoreCase));
-		}
 	}
 }
\ No newline at end of file
diff --git a/VectoCore/VectoCore/OutputData/XML/XMLManufacturerReportCompletedBus.cs b/VectoCore/VectoCore/OutputData/XML/XMLManufacturerReportCompletedBus.cs
new file mode 100644
index 0000000000..741060ee39
--- /dev/null
+++ b/VectoCore/VectoCore/OutputData/XML/XMLManufacturerReportCompletedBus.cs
@@ -0,0 +1,423 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Xml.Linq;
+using TUGraz.VectoCommon.InputData;
+using TUGraz.VectoCommon.Models;
+using TUGraz.VectoCommon.Resources;
+using TUGraz.VectoCommon.Utils;
+using TUGraz.VectoCore.Models.Declaration;
+using TUGraz.VectoCore.Models.Simulation.Data;
+using TUGraz.VectoCore.Models.Simulation.Impl;
+using TUGraz.VectoCore.Models.SimulationComponent.Data;
+using TUGraz.VectoCore.Models.SimulationComponent.Data.Gearbox;
+using TUGraz.VectoCore.Utils;
+
+namespace TUGraz.VectoCore.OutputData.XML {
+	public class XMLManufacturerReportCompletedBus : AbstractXMLManufacturerReport
+	{
+
+		public IVehicleDeclarationInputData PrimaryVehicle { get; set; }
+
+
+		#region Overrides of AbstractXMLManufacturerReport
+
+		public override void Initialize(VectoRunData modelData, List<List<FuelData.Entry>> fuelModes)
+		{
+			VehiclePart.Add(
+				new XAttribute(xsi + "type", "VehiclePrimaryBusType"),
+				new XElement(tns + XMLNames.Component_Model, modelData.VehicleData.ModelName),
+				new XElement(tns + XMLNames.Component_Manufacturer, modelData.VehicleData.Manufacturer),
+				new XElement(tns + XMLNames.Component_ManufacturerAddress, modelData.VehicleData.ManufacturerAddress),
+				new XElement(tns + XMLNames.Vehicle_VIN, modelData.VehicleData.VIN),
+				new XElement(
+					tns + XMLNames.Vehicle_GrossVehicleMass,
+					XMLHelper.ValueAsUnit(modelData.VehicleData.GrossVehicleMass, XMLNames.Unit_t, 1)),
+				new XElement(
+					tns + XMLNames.Vehicle_CurbMassChassis, XMLHelper.ValueAsUnit(modelData.VehicleData.CurbMass, XMLNames.Unit_kg)),
+				new XElement(tns + XMLNames.Vehicle_ZeroEmissionVehicle, modelData.VehicleData.ZeroEmissionVehicle),
+				new XElement(tns + XMLNames.Vehicle_HybridElectricHDV, modelData.VehicleData.HybridElectricHDV),
+				new XElement(tns + XMLNames.Vehicle_DualFuelVehicle, modelData.VehicleData.DualFuelVehicle),
+				new XElement(tns + XMLNames.Vehicle_AxleConfiguration, modelData.VehicleData.AxleConfiguration.GetName()),
+				new XElement(tns + XMLNames.Report_Vehicle_VehicleGroup, modelData.VehicleData.VehicleClass.GetClassNumber()),
+
+				GetADAS(modelData.VehicleData.ADAS),
+				GetTorqueLimits(modelData.EngineData),
+				VehicleComponents(modelData, fuelModes)
+
+			);
+
+			InputDataIntegrity = GetInputDataSignature(modelData);
+		}
+
+		public virtual void WriteResult(XMLDeclarationReport.ResultEntry genericResult, XMLDeclarationReport.ResultEntry specificResult, IResult primaryResult)
+		{
+			
+			_allSuccess &= genericResult.Status == VectoRun.Status.Success;
+			_allSuccess &= specificResult.Status == VectoRun.Status.Success;
+			Results.Add(
+				new XElement(
+					tns + XMLNames.Report_Result_Result,
+					new XAttribute(
+						XMLNames.Report_Result_Status_Attr,
+						genericResult.Status == VectoRun.Status.Success && specificResult.Status == VectoRun.Status.Success ? "success" : "error"),
+					new XElement(tns + XMLNames.Report_Result_Mission, genericResult.Mission.ToXMLFormat()),
+					GetResults(genericResult, specificResult, primaryResult)));
+		}
+
+		private object GetResults(XMLDeclarationReport.ResultEntry genericResult, XMLDeclarationReport.ResultEntry specificResult, IResult primaryResult)
+		{
+			if (genericResult.Status == VectoRun.Status.Pending || genericResult.Status == VectoRun.Status.Running ||
+				specificResult.Status == VectoRun.Status.Pending || specificResult.Status == VectoRun.Status.Running) {
+				return new object[] {
+					GetSimulationParameters(specificResult),
+					new XElement(
+						tns + XMLNames.Report_Results_Error,
+						string.Format("Simulation not finished! Status: {0} / {1}", genericResult.Status, specificResult.Status)),
+					new XElement(tns + XMLNames.Report_Results_ErrorDetails, ""),
+				}; // should not happen!
+			}
+
+			if (genericResult.Status == VectoRun.Status.Canceled || genericResult.Status == VectoRun.Status.Aborted || specificResult.Status == VectoRun.Status.Canceled || specificResult.Status == VectoRun.Status.Aborted) {
+				return new object[] {
+					GetSimulationParameters(specificResult),
+					new XElement(tns + XMLNames.Report_Results_Error, genericResult.Error ?? "" + Environment.NewLine +  specificResult.Error ?? ""),
+					new XElement(tns + XMLNames.Report_Results_ErrorDetails, genericResult.StackTrace ?? "" + Environment.NewLine + specificResult.StackTrace ?? ""),
+				};
+			}
+
+			if (genericResult.Status == VectoRun.Status.Success && specificResult.Status == VectoRun.Status.Success) {
+				return GetSuccessResultEntry(genericResult, specificResult, primaryResult);
+			}
+			throw new ArgumentOutOfRangeException();
+		}
+
+		private object GetSuccessResultEntry(XMLDeclarationReport.ResultEntry genericResult, XMLDeclarationReport.ResultEntry specificResult, IResult primaryResult)
+		{
+			return new object[] {
+				new XElement(
+					tns + XMLNames.Report_ResultEntry_Distance, new XAttribute(XMLNames.Report_Results_Unit_Attr, XMLNames.Unit_km),
+					specificResult.Distance.ConvertToKiloMeter().ToXMLFormat(3)),
+				GetSimulationParameters(specificResult),
+				new XElement(
+					tns + XMLNames.Report_ResultEntry_VehiclePerformance,
+					new XElement(
+						tns + XMLNames.Report_ResultEntry_AverageSpeed,
+						XMLHelper.ValueAsUnit(specificResult.AverageSpeed, XMLNames.Unit_kmph, 1)),
+					new XElement(
+						tns + XMLNames.Report_ResultEntry_AvgDrivingSpeed,
+						XMLHelper.ValueAsUnit(specificResult.AverageDrivingSpeed, XMLNames.Unit_kmph, 1)),
+					new XElement(
+						tns + XMLNames.Report_ResultEntry_MinSpeed, XMLHelper.ValueAsUnit(specificResult.MinSpeed, XMLNames.Unit_kmph, 1)),
+					new XElement(
+						tns + XMLNames.Report_ResultEntry_MaxSpeed, XMLHelper.ValueAsUnit(specificResult.MaxSpeed, XMLNames.Unit_kmph, 1)),
+					new XElement(
+						tns + XMLNames.Report_ResultEntry_MaxDeceleration,
+						XMLHelper.ValueAsUnit(specificResult.MaxDeceleration, XMLNames.Unit_mps2, 2)),
+					new XElement(
+						tns + XMLNames.Report_ResultEntry_MaxAcceleration,
+						XMLHelper.ValueAsUnit(specificResult.MaxAcceleration, XMLNames.Unit_mps2, 2)),
+					new XElement(
+						tns + XMLNames.Report_ResultEntry_FullLoadDrivingtimePercentage,
+						specificResult.FullLoadPercentage.ToXMLFormat(2)),
+					new XElement(tns + XMLNames.Report_ResultEntry_GearshiftCount, specificResult.GearshiftCount.ToXMLFormat(0)),
+					new XElement(
+						tns + XMLNames.Report_ResultEntry_EngineSpeedDriving,
+						new XElement(
+							tns + XMLNames.Report_ResultEntry_EngineSpeedDriving_Min,
+							XMLHelper.ValueAsUnit(specificResult.EngineSpeedDrivingMin, XMLNames.Unit_RPM, 1)),
+						new XElement(
+							tns + XMLNames.Report_ResultEntry_EngineSpeedDriving_Avg,
+							XMLHelper.ValueAsUnit(specificResult.EngineSpeedDrivingAvg, XMLNames.Unit_RPM, 1)),
+						new XElement(
+							tns + XMLNames.Report_ResultEntry_EngineSpeedDriving_Max,
+							XMLHelper.ValueAsUnit(specificResult.EngineSpeedDrivingMax, XMLNames.Unit_RPM, 1))
+					),
+					new XElement(
+						tns + XMLNames.Report_Results_AverageGearboxEfficiency,
+						XMLHelper.ValueAsUnit(specificResult.AverageGearboxEfficiency, XMLNames.UnitPercent, 2)),
+					new XElement(
+						tns + XMLNames.Report_Results_AverageAxlegearEfficiency,
+						XMLHelper.ValueAsUnit(specificResult.AverageAxlegearEfficiency, XMLNames.UnitPercent, 2))
+				),
+
+				//FC
+				GetFuelConsumptionResults(genericResult, specificResult, primaryResult)
+			};
+
+		}
+
+		private XElement[] GetFuelConsumptionResults(XMLDeclarationReport.ResultEntry genericResult, XMLDeclarationReport.ResultEntry specificResult, IResult primaryResult)
+		{
+			var factor = specificResult.EnergyConsumptionTotal.Value() / genericResult.EnergyConsumptionTotal.Value();
+			var retVal = new List<XElement>();
+
+			var co2Sum = 0.SI<KilogramPerMeter>();
+
+			foreach (var entry in primaryResult.EnergyConsumption) {
+				var fcEnergy = entry.Value * factor;  // J/m
+				var fuelData = FuelData.Instance().Lookup(entry.Key);
+				var fcMass = fcEnergy / fuelData.LowerHeatingValueVecto; // kg/m
+				co2Sum += fcMass * fuelData.CO2PerFuelWeight;
+
+				var fcResult = new XElement(tns + XMLNames.Report_Results_Fuel, new XAttribute(XMLNames.Report_Results_Fuel_Type_Attr, fuelData.FuelType.ToXMLFormat()));
+				fcResult.Add(
+					new XElement(
+						tns + XMLNames.Report_Results_FuelConsumption,
+						new XAttribute(XMLNames.Report_Results_Unit_Attr, "g/km"),
+						fcMass.ConvertToGrammPerKiloMeter().ToMinSignificantDigits(3, 1)),
+					new XElement(
+						tns + XMLNames.Report_Results_FuelConsumption,
+						new XAttribute(XMLNames.Report_Results_Unit_Attr, "g/t-km"),
+						(fcMass / specificResult.Payload)
+						.ConvertToGrammPerTonKilometer().ToMinSignificantDigits(3, 1)),
+					specificResult.CargoVolume > 0
+						? new XElement(
+							tns + XMLNames.Report_Results_FuelConsumption,
+							new XAttribute(XMLNames.Report_Results_Unit_Attr, "g/m³-km"),
+							(fcMass.ConvertToGrammPerKiloMeter() / specificResult.CargoVolume)
+							.Value().ToMinSignificantDigits(3, 1))
+						: null,
+					specificResult.PassengerCount.HasValue && specificResult.PassengerCount.Value > 0
+						? new XElement(
+							tns + XMLNames.Report_Results_FuelConsumption,
+							new XAttribute(XMLNames.Report_Results_Unit_Attr, "g/p-km"),
+							(fcMass.ConvertToGrammPerKiloMeter() / specificResult.PassengerCount.Value).ToMinSignificantDigits(3, 1))
+						: null,
+					new XElement(
+						tns + XMLNames.Report_Results_FuelConsumption,
+						new XAttribute(XMLNames.Report_Results_Unit_Attr, "MJ/km"),
+						fcEnergy.ConvertToMegaJouleperKilometer().ToMinSignificantDigits(3, 1)),
+					new XElement(
+						tns + XMLNames.Report_Results_FuelConsumption,
+						new XAttribute(XMLNames.Report_Results_Unit_Attr, "MJ/t-km"),
+						(fcEnergy.ConvertToMegaJouleperKilometer() / specificResult.Payload.ConvertToTon())
+						.ToMinSignificantDigits(3, 1)),
+					specificResult.CargoVolume > 0
+						? new XElement(
+							tns + XMLNames.Report_Results_FuelConsumption,
+							new XAttribute(XMLNames.Report_Results_Unit_Attr, "MJ/m³-km"),
+							(fcEnergy.ConvertToMegaJouleperKilometer() / specificResult.CargoVolume.Value()).ToMinSignificantDigits(3, 1))
+						: null,
+					specificResult.PassengerCount.HasValue && specificResult.PassengerCount.Value > 0
+						? new XElement(
+							tns + XMLNames.Report_Results_FuelConsumption,
+							new XAttribute(XMLNames.Report_Results_Unit_Attr, "MJ/p-km"),
+							(fcEnergy.ConvertToMegaJouleperKilometer() / specificResult.PassengerCount.Value).ToMinSignificantDigits(3, 1))
+						: null
+				);
+				if (fuelData.FuelDensity != null) {
+					fcResult.Add(
+						new XElement(
+							tns + XMLNames.Report_Results_FuelConsumption,
+							new XAttribute(XMLNames.Report_Results_Unit_Attr, "l/100km"),
+							(fcMass.ConvertToGrammPerKiloMeter() / fuelData.FuelDensity * 100).Value().ToMinSignificantDigits(3, 1)),
+						new XElement(
+							tns + XMLNames.Report_Results_FuelConsumption,
+							new XAttribute(XMLNames.Report_Results_Unit_Attr, "l/t-km"),
+							(fcMass.ConvertToGrammPerKiloMeter() / fuelData.FuelDensity /
+							specificResult.Payload.ConvertToTon()).Value().ToMinSignificantDigits(3, 1)));
+					if (specificResult.CargoVolume > 0) {
+						fcResult.Add(
+							new XElement(
+								tns + XMLNames.Report_Results_FuelConsumption,
+								new XAttribute(XMLNames.Report_Results_Unit_Attr, "l/m³-km"),
+								(fcMass.ConvertToGrammPerKiloMeter() / fuelData.FuelDensity /
+								specificResult.CargoVolume).Value().ToMinSignificantDigits(3, 1)));
+					}
+					if (specificResult.PassengerCount.HasValue && specificResult.PassengerCount.Value > 0) {
+						fcResult.Add(
+							new XElement(
+								tns + XMLNames.Report_Results_FuelConsumption,
+								new XAttribute(XMLNames.Report_Results_Unit_Attr, "l/p-km"),
+								(fcMass.ConvertToGrammPerKiloMeter() / fuelData.FuelDensity /
+								specificResult.PassengerCount.Value).Value().ToMinSignificantDigits(3, 1))
+						);
+					}
+				}
+				retVal.Add(fcResult);
+			}
+
+			//CO2
+			retVal.Add(
+				new XElement(
+					tns + XMLNames.Report_Results_CO2, new XAttribute(XMLNames.Report_Results_Unit_Attr, "g/km"),
+					co2Sum.ConvertToGrammPerKiloMeter().ToMinSignificantDigits(3, 1)));
+			retVal.Add(
+				new XElement(
+					tns + XMLNames.Report_Results_CO2,
+					new XAttribute(XMLNames.Report_Results_Unit_Attr, "g/t-km"),
+					(co2Sum.ConvertToGrammPerKiloMeter() / specificResult.Payload.ConvertToTon()).ToMinSignificantDigits(3, 1)));
+			if (specificResult.CargoVolume > 0)
+				retVal.Add(
+					new XElement(
+						tns + XMLNames.Report_Results_CO2,
+						new XAttribute(XMLNames.Report_Results_Unit_Attr, "g/m³-km"),
+						(co2Sum.ConvertToGrammPerKiloMeter() / specificResult.CargoVolume).Value().ToMinSignificantDigits(3, 1)));
+			if (specificResult.PassengerCount.HasValue && specificResult.PassengerCount.Value > 0) {
+				retVal.Add(
+					new XElement(
+						tns + XMLNames.Report_Results_CO2,
+						new XAttribute(XMLNames.Report_Results_Unit_Attr, "g/p-km"),
+						(co2Sum.ConvertToGrammPerKiloMeter() / specificResult.PassengerCount.Value).ToMinSignificantDigits(3, 1)));
+			}
+
+			return retVal.ToArray();
+		}
+
+		protected override XElement VehicleComponents(VectoRunData modelData, List<List<FuelData.Entry>> fuelModes)
+		{
+			return new XElement(
+				tns + XMLNames.Vehicle_Components,
+				new XAttribute(xsi + "type", "ComponentsPrimaryBusType"),
+				GetEngineDescription(modelData.EngineData, fuelModes),
+				GetGearboxDescription(modelData.GearboxData),
+				GetTorqueConverterDescription(modelData.GearboxData.TorqueConverterData),
+				GetRetarderDescription(modelData.Retarder),
+				GetAngledriveDescription(modelData.AngledriveData),
+				GetAxlegearDescription(modelData.AxleGearData),
+				GetAxleWheelsDescription(modelData.VehicleData),
+				GetAuxiliariesDescription(modelData)
+			);
+		}
+
+		protected override XElement GetEngineDescription(CombustionEngineData engineData, List<List<FuelData.Entry>> fuelModes)
+		{
+			return new XElement(
+				tns + XMLNames.Component_Engine,
+				GetCommonDescription(PrimaryVehicle.Components.EngineInputData),
+				new XElement(
+					tns + XMLNames.Engine_RatedPower, XMLHelper.ValueAsUnit(engineData.RatedPowerDeclared, XMLNames.Unit_kW)),
+				new XElement(tns + XMLNames.Engine_IdlingSpeed, XMLHelper.ValueAsUnit(engineData.IdleSpeed, XMLNames.Unit_RPM)),
+				new XElement(
+					tns + XMLNames.Engine_RatedSpeed, XMLHelper.ValueAsUnit(engineData.RatedSpeedDeclared, XMLNames.Unit_RPM)),
+				new XElement(
+					tns + XMLNames.Engine_Displacement, XMLHelper.ValueAsUnit(engineData.Displacement, XMLNames.Unit_ltr, 1)),
+				new XElement(tns + XMLNames.Engine_WHRType, engineData.WHRType.ToXMLFormat()),
+				PrimaryVehicle.Components.EngineInputData.EngineModes.Select(
+					x => new XElement(
+						tns + XMLNames.Report_Engine_FuelMode,
+						x.Fuels.Select(f => new XElement(tns + XMLNames.Engine_FuelType, f.FuelType.ToXMLFormat()))))
+			);
+		}
+
+		protected override XElement GetGearboxDescription(GearboxData gearboxData)
+		{
+			return new XElement(
+				tns + XMLNames.Component_Gearbox,
+				GetCommonDescription(PrimaryVehicle.Components.GearboxInputData),
+				new XElement(tns + XMLNames.Gearbox_TransmissionType, gearboxData.Type.ToXMLFormat()),
+				new XElement(tns + XMLNames.Report_GetGearbox_GearsCount, gearboxData.Gears.Count),
+				new XElement(
+					tns + XMLNames.Report_Gearbox_TransmissionRatioFinalGear,
+					gearboxData.Gears[gearboxData.Gears.Keys.Max()].Ratio.ToXMLFormat(3))
+			);
+		}
+
+		protected override XElement GetGearboxDescription(GearboxData gearboxData, AxleGearData axlegearData)
+		{
+			return new XElement(
+				tns + XMLNames.Component_Gearbox,
+				GetCommonDescription(PrimaryVehicle.Components.GearboxInputData),
+				new XElement(tns + XMLNames.Gearbox_TransmissionType, gearboxData.Type.ToXMLFormat()),
+				new XElement(tns + XMLNames.Report_GetGearbox_GearsCount, gearboxData.Gears.Count),
+				new XElement(tns + XMLNames.Gearbox_AxlegearRatio, axlegearData.AxleGear.Ratio.ToXMLFormat(3)),
+				new XElement(
+					tns + XMLNames.Report_Gearbox_TransmissionRatioFinalGear,
+					gearboxData.Gears[gearboxData.Gears.Keys.Max()].Ratio.ToXMLFormat(3))
+			);
+		}
+
+
+		protected override XElement GetTorqueConverterDescription(TorqueConverterData torqueConverterData)
+		{
+			if (torqueConverterData == null) {
+				return null;
+			}
+
+			return new XElement(
+				tns + XMLNames.Component_TorqueConverter,
+				GetCommonDescription(PrimaryVehicle.Components.TorqueConverterInputData));
+		}
+
+		protected override XElement GetRetarderDescription(RetarderData retarder)
+		{
+			return new XElement(
+				tns + XMLNames.Component_Retarder,
+				new XElement(tns + XMLNames.Vehicle_RetarderType, retarder.Type.ToXMLFormat())
+				//retarder.Type.IsDedicatedComponent() ? GetCommonDescription(PrimaryVehicle.Components.RetarderInputData) : null
+				);
+		}
+
+		protected override XElement GetAngledriveDescription(AngledriveData angledriveData)
+		{
+			if (angledriveData == null) {
+				return null;
+			}
+
+			return new XElement(
+				tns + XMLNames.Component_Angledrive,
+				GetCommonDescription(PrimaryVehicle.Components.AngledriveInputData),
+				new XElement(tns + XMLNames.AngleDrive_Ratio, angledriveData.Angledrive.Ratio.ToXMLFormat(3)));
+		}
+
+		protected override XElement GetAxlegearDescription(AxleGearData axleGearData)
+		{
+			return new XElement(
+				tns + XMLNames.Component_Axlegear,
+				GetCommonDescription(PrimaryVehicle.Components.AxleGearInputData),
+				new XElement(tns + XMLNames.Axlegear_LineType, axleGearData.LineType.ToXMLFormat()),
+				new XElement(tns + XMLNames.Axlegear_Ratio, axleGearData.AxleGear.Ratio.ToXMLFormat(3)));
+		}
+
+		protected override XElement GetAirDragDescription(AirdragData airdragData)
+		{
+			if (airdragData.CertificationMethod == CertificationMethod.StandardValues) {
+				return new XElement(
+					tns + XMLNames.Component_AirDrag,
+					new XElement(tns + XMLNames.Report_Component_CertificationMethod, airdragData.CertificationMethod.ToXMLFormat()),
+					new XElement(tns + XMLNames.Report_AirDrag_CdxA, airdragData.DeclaredAirdragArea.ToXMLFormat(2))
+				);
+			}
+
+			return new XElement(
+				tns + XMLNames.Component_AirDrag,
+				new XElement(tns + XMLNames.Component_Model, airdragData.ModelName),
+				new XElement(tns + XMLNames.Report_Component_CertificationMethod, airdragData.CertificationMethod.ToXMLFormat()),
+				new XElement(tns + XMLNames.Report_Component_CertificationNumber, airdragData.CertificationNumber),
+				new XElement(tns + XMLNames.DI_Signature_Reference_DigestValue, airdragData.DigestValueInput),
+				new XElement(tns + XMLNames.Report_AirDrag_CdxA, airdragData.DeclaredAirdragArea.ToXMLFormat(2))
+			);
+		}
+
+
+		protected virtual object[] GetCommonDescription(IEngineDeclarationInputData data)
+		{
+			return new object[] {
+				new XElement(tns + XMLNames.Component_Model, data.Model),
+				new XElement(tns + XMLNames.Report_Component_CertificationNumber, data.CertificationNumber),
+				new XElement(tns + XMLNames.DI_Signature_Reference_DigestValue, data.DigestValue.DigestValue)
+			};
+		}
+
+		protected virtual object[] GetCommonDescription(IComponentInputData data)
+		{
+			return new object[] {
+				new XElement(tns + XMLNames.Component_Model, data.Model),
+				new XElement(tns + XMLNames.Report_Component_CertificationMethod, data.CertificationMethod.ToXMLFormat()),
+				data.CertificationMethod == CertificationMethod.StandardValues
+					? null
+					: new XElement(tns + XMLNames.Report_Component_CertificationNumber, data.CertificationNumber),
+				new XElement(tns + XMLNames.DI_Signature_Reference_DigestValue, data.DigestValue.DigestValue)
+			};
+		}
+		#endregion
+
+		public override void WriteResult(XMLDeclarationReport.ResultEntry resultEntry)
+		{
+			throw new NotSupportedException();
+		}
+
+		
+	}
+}
\ No newline at end of file
diff --git a/VectoCore/VectoCore/OutputData/XML/XMLManufacturerReportPrimaryBus.cs b/VectoCore/VectoCore/OutputData/XML/XMLManufacturerReportPrimaryBus.cs
index 679a0c0f21..ccd4d9ae6d 100644
--- a/VectoCore/VectoCore/OutputData/XML/XMLManufacturerReportPrimaryBus.cs
+++ b/VectoCore/VectoCore/OutputData/XML/XMLManufacturerReportPrimaryBus.cs
@@ -1,7 +1,6 @@
-using System;
-using System.Collections.Generic;
+using System.Collections.Generic;
+using System.Linq;
 using System.Xml.Linq;
-using TUGraz.VectoCommon.InputData;
 using TUGraz.VectoCommon.Models;
 using TUGraz.VectoCommon.Resources;
 using TUGraz.VectoCore.Models.Declaration;
@@ -9,71 +8,6 @@ using TUGraz.VectoCore.Models.Simulation.Data;
 using TUGraz.VectoCore.Utils;
 
 namespace TUGraz.VectoCore.OutputData.XML {
-
-	public class XMLManufacturerReportCompletedBus : AbstractXMLManufacturerReport
-	{
-		#region Overrides of AbstractXMLManufacturerReport
-
-		public override void Initialize(VectoRunData modelData, List<List<FuelData.Entry>> fuelModes)
-		{
-			VehiclePart.Add(
-				new XAttribute(xsi + "type", "VehiclePrimaryBusType"),
-				new XElement(tns + XMLNames.Component_Model, modelData.VehicleData.ModelName),
-				new XElement(tns + XMLNames.Component_Manufacturer, modelData.VehicleData.Manufacturer),
-				new XElement(tns + XMLNames.Component_ManufacturerAddress, modelData.VehicleData.ManufacturerAddress),
-				new XElement(tns + XMLNames.Vehicle_VIN, modelData.VehicleData.VIN),
-				new XElement(
-					tns + XMLNames.Vehicle_GrossVehicleMass,
-					XMLHelper.ValueAsUnit(modelData.VehicleData.GrossVehicleMass, XMLNames.Unit_t, 1)),
-				new XElement(
-					tns + XMLNames.Vehicle_CurbMassChassis, XMLHelper.ValueAsUnit(modelData.VehicleData.CurbMass, XMLNames.Unit_kg)),
-				new XElement(tns + XMLNames.Vehicle_ZeroEmissionVehicle, modelData.VehicleData.ZeroEmissionVehicle),
-				new XElement(tns + XMLNames.Vehicle_HybridElectricHDV, modelData.VehicleData.HybridElectricHDV),
-				new XElement(tns + XMLNames.Vehicle_DualFuelVehicle, modelData.VehicleData.DualFuelVehicle),
-				new XElement(tns + XMLNames.Vehicle_AxleConfiguration, modelData.VehicleData.AxleConfiguration.GetName()),
-				new XElement(tns + XMLNames.Report_Vehicle_VehicleGroup, modelData.VehicleData.VehicleClass.GetClassNumber()),
-
-				GetADAS(modelData.VehicleData.ADAS),
-				GetTorqueLimits(modelData.EngineData),
-				VehicleComponents(modelData, fuelModes)
-
-			);
-
-			InputDataIntegrity = GetInputDataSignature(modelData);
-		}
-
-		public virtual void WriteResult(XMLDeclarationReport.ResultEntry genericResult, XMLDeclarationReport.ResultEntry specificResult, IResult primaryResult)
-		{
-			foreach (var entry in primaryResult.EnergyConsumption) {
-				
-			}
-		}
-
-		protected override XElement VehicleComponents(VectoRunData modelData, List<List<FuelData.Entry>> fuelModes)
-		{
-			return new XElement(
-				tns + XMLNames.Vehicle_Components,
-				new XAttribute(xsi + "type", "ComponentsPrimaryBusType"),
-				GetEngineDescription(modelData.EngineData, fuelModes),
-				GetGearboxDescription(modelData.GearboxData),
-				GetTorqueConverterDescription(modelData.GearboxData.TorqueConverterData),
-				GetRetarderDescription(modelData.Retarder),
-				GetAngledriveDescription(modelData.AngledriveData),
-				GetAxlegearDescription(modelData.AxleGearData),
-				GetAxleWheelsDescription(modelData.VehicleData),
-				GetAuxiliariesDescription(modelData)
-			);
-		}
-
-		#endregion
-
-		public override void WriteResult(XMLDeclarationReport.ResultEntry resultEntry)
-		{
-			throw new NotSupportedException();
-		}
-
-	}
-
 	public class XMLManufacturerReportPrimaryBus : AbstractXMLManufacturerReport
 	{
 		public override void Initialize(VectoRunData modelData, List<List<FuelData.Entry>> fuelModes)
diff --git a/VectoCore/VectoCore/OutputData/XML/XMLPrimaryVehicleReport.cs b/VectoCore/VectoCore/OutputData/XML/XMLPrimaryVehicleReport.cs
index 4ab7de225f..4ee33626f1 100644
--- a/VectoCore/VectoCore/OutputData/XML/XMLPrimaryVehicleReport.cs
+++ b/VectoCore/VectoCore/OutputData/XML/XMLPrimaryVehicleReport.cs
@@ -386,7 +386,7 @@ namespace TUGraz.VectoCore.OutputData.XML
 							tns + XMLNames.Report_Result_Payload, XMLHelper.ValueAsUnit(resultEntry.Payload, XMLNames.Unit_kg, 2)),
 						new XElement(
 							tns + XMLNames.Report_ResultEntry_PassengerCount,
-							resultEntry.PassengerCount),
+							resultEntry.PassengerCount?.ToXMLFormat(2) ?? "NaN"),
 						new XElement(
 							tns + XMLNames.Report_Result_FuelMode,
 							resultEntry.FuelData.Count > 1
@@ -425,7 +425,7 @@ namespace TUGraz.VectoCore.OutputData.XML
 						new XAttribute(XMLNames.Report_Results_Unit_Attr, "MJ/km"),
 						(result.FuelConsumptionFinal[fuel.FuelType] * fuel.LowerHeatingValueVecto /
 						result.Distance.ConvertToKiloMeter() / 1e6)
-						.Value().ToMinSignificantDigits(3, 3)));
+						.Value().ToMinSignificantDigits(5, 5)));
 				retVal.Add(fcResult);
 			}
 
diff --git a/VectoCore/VectoCore/Resources/Declaration/Buses/ElectricConsumers.csv b/VectoCore/VectoCore/Resources/Declaration/Buses/ElectricConsumers.csv
index d6bd7019a7..3e404525c0 100644
--- a/VectoCore/VectoCore/Resources/Declaration/Buses/ElectricConsumers.csv
+++ b/VectoCore/VectoCore/Resources/Declaration/Buses/ElectricConsumers.csv
@@ -7,7 +7,7 @@ Vehicle basic equipment   , Interior lights per meter              , 0
 Vehicle basic equipment   , Interior lights LED bonus              , 0            , 0                , 1     , -0.4        , -0.4  , -0.4     , -0.4       , -0.4  , 0.7       , f_IntLight(L_CoC) , per meter vehicle length
 Customer specific equipm. , External displays                      , 0            , 0                , 0     , 2.7         , 2.7   , 2.7      , 2.7        , 2.7   , 1.0       , 2.0               ,
 Customer specific equipm. , Internal displays                      , 0            , 0                , 0     , 1.1         , 1.1   , 1.1      , 1.1        , 1.1   , 1.0       , 1.0               ,
-Customer specific equipm. , Citybus customer specific value (EBSF) , 0            , 0                , 0     , 9.3         , 9.3   , 9.3      , 0.0        , 0.0   , 1.0       , 1.0               ,
+Customer specific equipm. , Citybus customer specific value (EBSF) , 0            , 1                , 0     , 9.3         , 9.3   , 9.3      , 0.0        , 0.0   , 1.0       , 1.0               ,
 Lights                    , Exterior lights (bulb)                 , 1            , 1                , 0     , 7.4         , 7.4   , 7.4      , 7.4        , 7.4   , 1.0       , 1.0               ,
 Lights                    , Day running lights LED bonus           , 0            , 0                , 1     , -0.7        , -0.7  , -0.7     , -0.7       , -0.7  , 1.0       , 1.0               ,
 Lights                    , Position lights LED bonus              , 0            , 0                , 1     , -1.2        , -1.2  , -1.2     , -1.2       , -1.2  , 1.0       , 1.0               ,
diff --git a/VectoCore/VectoCore/VectoCore.csproj b/VectoCore/VectoCore/VectoCore.csproj
index 232cc3e90b..54bc445712 100644
--- a/VectoCore/VectoCore/VectoCore.csproj
+++ b/VectoCore/VectoCore/VectoCore.csproj
@@ -424,6 +424,7 @@
     <Compile Include="OutputData\XML\XMLCustomerReportCompletedBus.cs" />
     <Compile Include="OutputData\XML\XMLDeclarationReportCompletedVehicle.cs" />
     <Compile Include="OutputData\XML\XMLDeclarationReportPrimaryVehicle.cs" />
+    <Compile Include="OutputData\XML\XMLManufacturerReportCompletedBus.cs" />
     <Compile Include="OutputData\XML\XMLManufacturerReportExemptedTruck.cs" />
     <Compile Include="OutputData\XML\XMLManufacturerReportPrimaryBus.cs" />
     <Compile Include="OutputData\XML\XMLPrimaryVehicleReport.cs" />
diff --git a/VectoCore/VectoCoreTest/Integration/CompletedBus/CompletedBusFactorMethodTest.cs b/VectoCore/VectoCoreTest/Integration/CompletedBus/CompletedBusFactorMethodTest.cs
index 3ddc3f06ab..6721219de6 100644
--- a/VectoCore/VectoCoreTest/Integration/CompletedBus/CompletedBusFactorMethodTest.cs
+++ b/VectoCore/VectoCoreTest/Integration/CompletedBus/CompletedBusFactorMethodTest.cs
@@ -1014,6 +1014,7 @@ namespace TUGraz.VectoCore.Tests.Integration.CompletedBus
 		TestCase(JobFilePrimary42, TestName = "RunPrimaryBusSimulation Group42"),
 		TestCase(@"TestData\Integration\Buses\FactorMethod\SingleBus_41-32b.vecto", TestName = "RunSingleBusSimulation Group 41/32b"),
 		TestCase(@"TestData\Integration\Buses\FactorMethod\SingleBus_42-33b.vecto", TestName = "RunSingleBusSimulation Group 42/33b"),
+		TestCase(@"TestData\Integration\Buses\FactorMethod\SingleBus_41-32b_AT-P.vecto", TestName = "RunSingleBusSimulation Group 41/32b AT-P"),
 		]
 		public void TestRunCompletedBusSimulation(string jobName)
 		{
diff --git a/VectoCore/VectoCoreTest/TestData/Integration/Buses/FactorMethod/SingleBus_41-32b_AT-P.vecto b/VectoCore/VectoCoreTest/TestData/Integration/Buses/FactorMethod/SingleBus_41-32b_AT-P.vecto
new file mode 100644
index 0000000000..274154b0fc
--- /dev/null
+++ b/VectoCore/VectoCoreTest/TestData/Integration/Buses/FactorMethod/SingleBus_41-32b_AT-P.vecto
@@ -0,0 +1,12 @@
+{
+  "Header": {
+	"CreatedBy": "Markus Quaritsch, IVT, Graz University of Technology",
+	"Date": "2020-02-07T15:06:30.9725917Z",
+	"AppVersion": "2.2",
+	"FileVersion": 6
+  },
+  "Body": {
+	"PrimaryVehicle":  "primary_heavyBus group41_nonSmart_AT-P.xml",
+	"CompletedVehicle": "vecto_vehicle-completed_heavyBus_41.xml"
+  }
+}
\ No newline at end of file
diff --git a/VectoCore/VectoCoreTest/TestData/Integration/Buses/FactorMethod/primary_heavyBus group42_SmartPS.RSLT_PIF.xml b/VectoCore/VectoCoreTest/TestData/Integration/Buses/FactorMethod/primary_heavyBus group42_SmartPS.RSLT_PIF.xml
index 34acaf8f30..edb50f75f4 100644
--- a/VectoCore/VectoCoreTest/TestData/Integration/Buses/FactorMethod/primary_heavyBus group42_SmartPS.RSLT_PIF.xml	
+++ b/VectoCore/VectoCoreTest/TestData/Integration/Buses/FactorMethod/primary_heavyBus group42_SmartPS.RSLT_PIF.xml	
@@ -1,10 +1,10 @@
 <?xml version="1.0" encoding="utf-8"?>
 <pif:VectoOutputPrimaryVehicle xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="urn:tugraz:ivt:VectoAPI:DeclarationOutput:PrimaryVehicleInformation:HeavyBus:v0.1" xmlns:pif="urn:tugraz:ivt:VectoAPI:DeclarationOutput:PrimaryVehicleInformation" xmlns:di="http://www.w3.org/2000/09/xmldsig#" xsi:schemaLocation="urn:tugraz:ivt:VectoAPI:DeclarationOutput:PrimaryVehicleInformation https://webgate.ec.europa.eu/CITnet/svn/VECTO/trunk/Share/XML/XSD//DEV/VectoOutputPrimaryVehicleInformation.xsd">
-  <pif:Data xsi:type="PrimaryVehicleHeavyBusDataType" id="PIF-bef5aabfa8f44ed1b8ad">
+  <pif:Data xsi:type="PrimaryVehicleHeavyBusDataType" id="PIF-b1f9a6097ed74a6b82de">
     <Vehicle xsi:type="VehiclePIFType">
       <ManufacturerPrimaryVehicle>Generic Truck Manufacturer</ManufacturerPrimaryVehicle>
       <ManufacturerAddressPrimaryVehicle>Street, ZIP City</ManufacturerAddressPrimaryVehicle>
-      <Model>Generic Model</Model>
+      <Model>Generic Model Primary</Model>
       <VIN>VEH-1234567890_SmartPS</VIN>
       <Date>2017-02-15T11:00:00Z</Date>
       <VehicleCategory>Bus</VehicleCategory>
@@ -30,8 +30,8 @@
       <Components xsi:type="VehicleComponentsPIFType">
         <Engine>
           <Data xsi:type="EngineDataPIFType">
-            <Manufacturer>Generic Engine Manufacturer</Manufacturer>
-            <Model>Bus 6x2</Model>
+            <Manufacturer>Generic Engine Manufacturer Primary</Manufacturer>
+            <Model>Bus 6x2 Engine</Model>
             <CertificationNumber>e12*0815/8051*2017/05E0000*00</CertificationNumber>
             <Date>2017-02-15T11:00:00Z</Date>
             <AppVersion>VectoEngine x.y</AppVersion>
@@ -66,8 +66,8 @@
         </Engine>
         <Transmission>
           <Data xsi:type="TransmissionDataPIFType">
-            <Manufacturer>Generic Gearbox Manufacturer</Manufacturer>
-            <Model>Generic 40t Long Haul Truck Gearbox</Model>
+            <Manufacturer>Generic Gearbox Manufacturer Primary</Manufacturer>
+            <Model>Generic 40t Long Haul Truck Gearbox Primary</Model>
             <MainCertificationMethod>Standard values</MainCertificationMethod>
             <Date>2017-01-11T11:00:00Z</Date>
             <AppVersion>3.0.1</AppVersion>
@@ -127,7 +127,7 @@
         </Transmission>
         <Axlegear>
           <Data xsi:type="AxlegearDataPIFType">
-            <Manufacturer>Generic Gearbox Manufacturer</Manufacturer>
+            <Manufacturer>Generic Gearbox Manufacturer Primary</Manufacturer>
             <Model>Generic 40t Long Haul Truck AxleGear</Model>
             <CertificationMethod>Standard values</CertificationMethod>
             <Date>2017-01-11T11:00:00Z</Date>
@@ -255,13 +255,13 @@
       </Components>
     </Vehicle>
     <ResultDataSignature>
-      <di:Reference URI="#RESULT-a52e27d5dcfa45809a15">
+      <di:Reference URI="#RESULT-f61bd2ce3c3341eb8048">
         <di:Transforms>
           <di:Transform Algorithm="urn:vecto:xml:2017:canonicalization" />
           <di:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
         </di:Transforms>
         <di:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256" />
-        <di:DigestValue>N2rLz4OswTYm2BXlnnIUcNNKumZ3Y5jrcT66OO7E/bU=</di:DigestValue>
+        <di:DigestValue>heugWRk0GnYtGPjosKwy3WhcNUMVeLC6nTE69GzCYnY=</di:DigestValue>
       </di:Reference>
     </ResultDataSignature>
     <Results>
@@ -276,9 +276,9 @@
           <FuelMode>single fuel mode</FuelMode>
         </SimulationParameters>
         <Fuel type="Diesel CI">
-          <EnergyConsumption unit="MJ/km">20.576</EnergyConsumption>
+          <EnergyConsumption unit="MJ/km">20.88156</EnergyConsumption>
         </Fuel>
-        <CO2 unit="g/km">1508.3</CO2>
+        <CO2 unit="g/km">1530.7</CO2>
       </Result>
       <Result status="success">
         <VehicleGroup>P33SD</VehicleGroup>
@@ -286,13 +286,13 @@
         <SimulationParameters>
           <TotalVehicleMass unit="kg">18762.60</TotalVehicleMass>
           <Payload unit="kg">6762.60</Payload>
-          <PassengerCount>99.449999999999989</PassengerCount>
+          <PassengerCount>99.45</PassengerCount>
           <FuelMode>single fuel mode</FuelMode>
         </SimulationParameters>
         <Fuel type="Diesel CI">
-          <EnergyConsumption unit="MJ/km">24.818</EnergyConsumption>
+          <EnergyConsumption unit="MJ/km">25.19313</EnergyConsumption>
         </Fuel>
-        <CO2 unit="g/km">1819.2</CO2>
+        <CO2 unit="g/km">1846.7</CO2>
       </Result>
       <Result status="success">
         <VehicleGroup>P33SD</VehicleGroup>
@@ -304,9 +304,9 @@
           <FuelMode>single fuel mode</FuelMode>
         </SimulationParameters>
         <Fuel type="Diesel CI">
-          <EnergyConsumption unit="MJ/km">15.985</EnergyConsumption>
+          <EnergyConsumption unit="MJ/km">16.27847</EnergyConsumption>
         </Fuel>
-        <CO2 unit="g/km">1171.7</CO2>
+        <CO2 unit="g/km">1193.2</CO2>
       </Result>
       <Result status="success">
         <VehicleGroup>P33SD</VehicleGroup>
@@ -314,13 +314,13 @@
         <SimulationParameters>
           <TotalVehicleMass unit="kg">18762.60</TotalVehicleMass>
           <Payload unit="kg">6762.60</Payload>
-          <PassengerCount>99.449999999999989</PassengerCount>
+          <PassengerCount>99.45</PassengerCount>
           <FuelMode>single fuel mode</FuelMode>
         </SimulationParameters>
         <Fuel type="Diesel CI">
-          <EnergyConsumption unit="MJ/km">19.482</EnergyConsumption>
+          <EnergyConsumption unit="MJ/km">19.84642</EnergyConsumption>
         </Fuel>
-        <CO2 unit="g/km">1428.1</CO2>
+        <CO2 unit="g/km">1454.8</CO2>
       </Result>
       <Result status="success">
         <VehicleGroup>P33SD</VehicleGroup>
@@ -332,9 +332,9 @@
           <FuelMode>single fuel mode</FuelMode>
         </SimulationParameters>
         <Fuel type="Diesel CI">
-          <EnergyConsumption unit="MJ/km">13.271</EnergyConsumption>
+          <EnergyConsumption unit="MJ/km">13.77284</EnergyConsumption>
         </Fuel>
-        <CO2 unit="g/km">972.8</CO2>
+        <CO2 unit="g/km">1009.6</CO2>
       </Result>
       <Result status="success">
         <VehicleGroup>P33SD</VehicleGroup>
@@ -342,13 +342,13 @@
         <SimulationParameters>
           <TotalVehicleMass unit="kg">18762.60</TotalVehicleMass>
           <Payload unit="kg">6762.60</Payload>
-          <PassengerCount>99.449999999999989</PassengerCount>
+          <PassengerCount>99.45</PassengerCount>
           <FuelMode>single fuel mode</FuelMode>
         </SimulationParameters>
         <Fuel type="Diesel CI">
-          <EnergyConsumption unit="MJ/km">16.445</EnergyConsumption>
+          <EnergyConsumption unit="MJ/km">17.16015</EnergyConsumption>
         </Fuel>
-        <CO2 unit="g/km">1205.5</CO2>
+        <CO2 unit="g/km">1257.9</CO2>
       </Result>
       <Result status="success">
         <VehicleGroup>P33DD</VehicleGroup>
@@ -356,13 +356,13 @@
         <SimulationParameters>
           <TotalVehicleMass unit="kg">13578.29</TotalVehicleMass>
           <Payload unit="kg">1578.29</Payload>
-          <PassengerCount>23.2101</PassengerCount>
+          <PassengerCount>23.21</PassengerCount>
           <FuelMode>single fuel mode</FuelMode>
         </SimulationParameters>
         <Fuel type="Diesel CI">
-          <EnergyConsumption unit="MJ/km">20.921</EnergyConsumption>
+          <EnergyConsumption unit="MJ/km">21.20835</EnergyConsumption>
         </Fuel>
-        <CO2 unit="g/km">1533.6</CO2>
+        <CO2 unit="g/km">1554.6</CO2>
       </Result>
       <Result status="success">
         <VehicleGroup>P33DD</VehicleGroup>
@@ -370,13 +370,13 @@
         <SimulationParameters>
           <TotalVehicleMass unit="kg">19891.43</TotalVehicleMass>
           <Payload unit="kg">7891.43</Payload>
-          <PassengerCount>116.0505</PassengerCount>
+          <PassengerCount>116.05</PassengerCount>
           <FuelMode>single fuel mode</FuelMode>
         </SimulationParameters>
         <Fuel type="Diesel CI">
-          <EnergyConsumption unit="MJ/km">25.759</EnergyConsumption>
+          <EnergyConsumption unit="MJ/km">26.15141</EnergyConsumption>
         </Fuel>
-        <CO2 unit="g/km">1888.2</CO2>
+        <CO2 unit="g/km">1917.0</CO2>
       </Result>
       <Result status="success">
         <VehicleGroup>P33DD</VehicleGroup>
@@ -384,13 +384,13 @@
         <SimulationParameters>
           <TotalVehicleMass unit="kg">13578.29</TotalVehicleMass>
           <Payload unit="kg">1578.29</Payload>
-          <PassengerCount>23.2101</PassengerCount>
+          <PassengerCount>23.21</PassengerCount>
           <FuelMode>single fuel mode</FuelMode>
         </SimulationParameters>
         <Fuel type="Diesel CI">
-          <EnergyConsumption unit="MJ/km">16.318</EnergyConsumption>
+          <EnergyConsumption unit="MJ/km">16.61571</EnergyConsumption>
         </Fuel>
-        <CO2 unit="g/km">1196.1</CO2>
+        <CO2 unit="g/km">1218.0</CO2>
       </Result>
       <Result status="success">
         <VehicleGroup>P33DD</VehicleGroup>
@@ -398,13 +398,13 @@
         <SimulationParameters>
           <TotalVehicleMass unit="kg">19891.43</TotalVehicleMass>
           <Payload unit="kg">7891.43</Payload>
-          <PassengerCount>116.0505</PassengerCount>
+          <PassengerCount>116.05</PassengerCount>
           <FuelMode>single fuel mode</FuelMode>
         </SimulationParameters>
         <Fuel type="Diesel CI">
-          <EnergyConsumption unit="MJ/km">20.349</EnergyConsumption>
+          <EnergyConsumption unit="MJ/km">20.72374</EnergyConsumption>
         </Fuel>
-        <CO2 unit="g/km">1491.6</CO2>
+        <CO2 unit="g/km">1519.1</CO2>
       </Result>
       <Result status="success">
         <VehicleGroup>P33DD</VehicleGroup>
@@ -412,13 +412,13 @@
         <SimulationParameters>
           <TotalVehicleMass unit="kg">13578.29</TotalVehicleMass>
           <Payload unit="kg">1578.29</Payload>
-          <PassengerCount>23.2101</PassengerCount>
+          <PassengerCount>23.21</PassengerCount>
           <FuelMode>single fuel mode</FuelMode>
         </SimulationParameters>
         <Fuel type="Diesel CI">
-          <EnergyConsumption unit="MJ/km">13.627</EnergyConsumption>
+          <EnergyConsumption unit="MJ/km">14.11255</EnergyConsumption>
         </Fuel>
-        <CO2 unit="g/km">998.9</CO2>
+        <CO2 unit="g/km">1034.5</CO2>
       </Result>
       <Result status="success">
         <VehicleGroup>P33DD</VehicleGroup>
@@ -426,13 +426,13 @@
         <SimulationParameters>
           <TotalVehicleMass unit="kg">19891.43</TotalVehicleMass>
           <Payload unit="kg">7891.43</Payload>
-          <PassengerCount>116.0505</PassengerCount>
+          <PassengerCount>116.05</PassengerCount>
           <FuelMode>single fuel mode</FuelMode>
         </SimulationParameters>
         <Fuel type="Diesel CI">
-          <EnergyConsumption unit="MJ/km">17.218</EnergyConsumption>
+          <EnergyConsumption unit="MJ/km">18.01528</EnergyConsumption>
         </Fuel>
-        <CO2 unit="g/km">1262.1</CO2>
+        <CO2 unit="g/km">1320.6</CO2>
       </Result>
       <Result status="success">
         <VehicleGroup>P34SD</VehicleGroup>
@@ -440,13 +440,13 @@
         <SimulationParameters>
           <TotalVehicleMass unit="kg">14007.48</TotalVehicleMass>
           <Payload unit="kg">2007.48</Payload>
-          <PassengerCount>28.274400000000004</PassengerCount>
+          <PassengerCount>28.27</PassengerCount>
           <FuelMode>single fuel mode</FuelMode>
         </SimulationParameters>
         <Fuel type="Diesel CI">
-          <EnergyConsumption unit="MJ/km">11.200</EnergyConsumption>
+          <EnergyConsumption unit="MJ/km">11.47502</EnergyConsumption>
         </Fuel>
-        <CO2 unit="g/km">821.0</CO2>
+        <CO2 unit="g/km">841.1</CO2>
       </Result>
       <Result status="success">
         <VehicleGroup>P34SD</VehicleGroup>
@@ -454,13 +454,13 @@
         <SimulationParameters>
           <TotalVehicleMass unit="kg">17018.71</TotalVehicleMass>
           <Payload unit="kg">5018.71</Payload>
-          <PassengerCount>70.686</PassengerCount>
+          <PassengerCount>70.69</PassengerCount>
           <FuelMode>single fuel mode</FuelMode>
         </SimulationParameters>
         <Fuel type="Diesel CI">
-          <EnergyConsumption unit="MJ/km">12.592</EnergyConsumption>
+          <EnergyConsumption unit="MJ/km">12.95176</EnergyConsumption>
         </Fuel>
-        <CO2 unit="g/km">923.0</CO2>
+        <CO2 unit="g/km">949.4</CO2>
       </Result>
       <Result status="success">
         <VehicleGroup>P34SD</VehicleGroup>
@@ -468,13 +468,13 @@
         <SimulationParameters>
           <TotalVehicleMass unit="kg">13277.49</TotalVehicleMass>
           <Payload unit="kg">1277.49</Payload>
-          <PassengerCount>17.9928</PassengerCount>
+          <PassengerCount>17.99</PassengerCount>
           <FuelMode>single fuel mode</FuelMode>
         </SimulationParameters>
         <Fuel type="Diesel CI">
-          <EnergyConsumption unit="MJ/km">8.713</EnergyConsumption>
+          <EnergyConsumption unit="MJ/km">8.74194</EnergyConsumption>
         </Fuel>
-        <CO2 unit="g/km">638.7</CO2>
+        <CO2 unit="g/km">640.8</CO2>
       </Result>
       <Result status="success">
         <VehicleGroup>P34SD</VehicleGroup>
@@ -482,13 +482,13 @@
         <SimulationParameters>
           <TotalVehicleMass unit="kg">15193.72</TotalVehicleMass>
           <Payload unit="kg">3193.72</Payload>
-          <PassengerCount>44.982</PassengerCount>
+          <PassengerCount>44.98</PassengerCount>
           <FuelMode>single fuel mode</FuelMode>
         </SimulationParameters>
         <Fuel type="Diesel CI">
-          <EnergyConsumption unit="MJ/km">9.175</EnergyConsumption>
+          <EnergyConsumption unit="MJ/km">9.21875</EnergyConsumption>
         </Fuel>
-        <CO2 unit="g/km">672.6</CO2>
+        <CO2 unit="g/km">675.8</CO2>
       </Result>
       <Result status="success">
         <VehicleGroup>P34DD</VehicleGroup>
@@ -496,13 +496,13 @@
         <SimulationParameters>
           <TotalVehicleMass unit="kg">14780.93</TotalVehicleMass>
           <Payload unit="kg">2780.93</Payload>
-          <PassengerCount>39.168000000000006</PassengerCount>
+          <PassengerCount>39.17</PassengerCount>
           <FuelMode>single fuel mode</FuelMode>
         </SimulationParameters>
         <Fuel type="Diesel CI">
-          <EnergyConsumption unit="MJ/km">11.720</EnergyConsumption>
+          <EnergyConsumption unit="MJ/km">12.01195</EnergyConsumption>
         </Fuel>
-        <CO2 unit="g/km">859.1</CO2>
+        <CO2 unit="g/km">880.5</CO2>
       </Result>
       <Result status="success">
         <VehicleGroup>P34DD</VehicleGroup>
@@ -514,9 +514,9 @@
           <FuelMode>single fuel mode</FuelMode>
         </SimulationParameters>
         <Fuel type="Diesel CI">
-          <EnergyConsumption unit="MJ/km">13.656</EnergyConsumption>
+          <EnergyConsumption unit="MJ/km">14.07047</EnergyConsumption>
         </Fuel>
-        <CO2 unit="g/km">1001.0</CO2>
+        <CO2 unit="g/km">1031.4</CO2>
       </Result>
       <Result status="success">
         <VehicleGroup>P34DD</VehicleGroup>
@@ -524,13 +524,13 @@
         <SimulationParameters>
           <TotalVehicleMass unit="kg">13853.95</TotalVehicleMass>
           <Payload unit="kg">1853.95</Payload>
-          <PassengerCount>26.112000000000002</PassengerCount>
+          <PassengerCount>26.11</PassengerCount>
           <FuelMode>single fuel mode</FuelMode>
         </SimulationParameters>
         <Fuel type="Diesel CI">
-          <EnergyConsumption unit="MJ/km">9.247</EnergyConsumption>
+          <EnergyConsumption unit="MJ/km">9.27959</EnergyConsumption>
         </Fuel>
-        <CO2 unit="g/km">677.8</CO2>
+        <CO2 unit="g/km">680.2</CO2>
       </Result>
       <Result status="success">
         <VehicleGroup>P34DD</VehicleGroup>
@@ -542,24 +542,24 @@
           <FuelMode>single fuel mode</FuelMode>
         </SimulationParameters>
         <Fuel type="Diesel CI">
-          <EnergyConsumption unit="MJ/km">9.908</EnergyConsumption>
+          <EnergyConsumption unit="MJ/km">9.95462</EnergyConsumption>
         </Fuel>
-        <CO2 unit="g/km">726.3</CO2>
+        <CO2 unit="g/km">729.7</CO2>
       </Result>
     </Results>
     <ApplicationInformation>
       <SimulationToolVersion>0.6.0.1884-DEV !!NOT FOR CERTIFICATION!!</SimulationToolVersion>
-      <Date>2020-04-14T18:12:14.4272157Z</Date>
+      <Date>2020-04-16T05:38:26.8930564Z</Date>
     </ApplicationInformation>
   </pif:Data>
   <pif:Signature>
-    <di:Reference URI="#PIF-bef5aabfa8f44ed1b8ad">
+    <di:Reference URI="#PIF-b1f9a6097ed74a6b82de">
       <di:Transforms>
         <di:Transform Algorithm="urn:vecto:xml:2017:canonicalization" />
         <di:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
       </di:Transforms>
       <di:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256" />
-      <di:DigestValue>hSBXQqP35eesjLIzipHtocUgivICfUAlZ0QRgf4GrD8=</di:DigestValue>
+      <di:DigestValue>igtEc9rHHfZ+4xt2XsbxYnD7yW0qLkrVe/UJL/bMZ5U=</di:DigestValue>
     </di:Reference>
   </pif:Signature>
 </pif:VectoOutputPrimaryVehicle>
\ No newline at end of file
diff --git a/VectoCore/VectoCoreTest/TestData/Integration/Buses/FactorMethod/primary_heavyBus group42_SmartPS.xml b/VectoCore/VectoCoreTest/TestData/Integration/Buses/FactorMethod/primary_heavyBus group42_SmartPS.xml
index 48caa0c3f0..6bf1c79c66 100644
--- a/VectoCore/VectoCoreTest/TestData/Integration/Buses/FactorMethod/primary_heavyBus group42_SmartPS.xml	
+++ b/VectoCore/VectoCoreTest/TestData/Integration/Buses/FactorMethod/primary_heavyBus group42_SmartPS.xml	
@@ -3,7 +3,7 @@
 	<v2.0:Vehicle id="VEH-PrimaryBus_SmartPS" xsi:type="PrimaryVehicleDeclarationType" xmlns="urn:tugraz:ivt:VectoAPI:DeclarationDefinitions:DEV:v2.6">
 		<Manufacturer>Generic Truck Manufacturer</Manufacturer>
 		<ManufacturerAddress>Street, ZIP City</ManufacturerAddress>
-		<Model>Generic Model</Model>
+		<Model>Generic Model Primary</Model>
 		<VIN>VEH-1234567890_SmartPS</VIN>
 		<Date>2017-02-15T11:00:00Z</Date>
 		<VehicleCategory>Bus</VehicleCategory>
@@ -29,8 +29,8 @@
 		<Components xsi:type="PrimaryVehicleComponentsDeclarationType">
 			<v2.6:Engine xsi:type="v2.0:EngineComponentDeclarationType" xmlns="urn:tugraz:ivt:VectoAPI:DeclarationDefinitions:v2.0">
 				<v2.0:Data id="ENG-gooZah3D" xsi:type="v2.1:EngineDataDeclarationType" xmlns="urn:tugraz:ivt:VectoAPI:DeclarationDefinitions:v2.1">
-					<Manufacturer>Generic Engine Manufacturer</Manufacturer>
-					<Model>Bus 6x2</Model>
+					<Manufacturer>Generic Engine Manufacturer Primary</Manufacturer>
+					<Model>Bus 6x2 Engine</Model>
 					<CertificationNumber>e12*0815/8051*2017/05E0000*00</CertificationNumber>
 					<Date>2017-02-15T11:00:00Z</Date>
 					<AppVersion>VectoEngine x.y</AppVersion>
@@ -194,8 +194,8 @@
 			</v2.6:Engine>
 			<v2.6:Gearbox xmlns="urn:tugraz:ivt:VectoAPI:DeclarationDefinitions:v2.0" xsi:type="GearboxComponentDeclarationType">
 				<Data id="gbx-vi2Oak2N" xsi:type="GearboxDataDeclarationType">
-					<Manufacturer>Generic Gearbox Manufacturer</Manufacturer>
-					<Model>Generic 40t Long Haul Truck Gearbox</Model>
+					<Manufacturer>Generic Gearbox Manufacturer Primary</Manufacturer>
+					<Model>Generic 40t Long Haul Truck Gearbox Primary</Model>
 					<CertificationNumber>e12*0815/8051*2017/05E0000*00</CertificationNumber>
 					<Date>2017-01-11T11:00:00Z</Date>
 					<AppVersion>3.0.1</AppVersion>
@@ -2728,7 +2728,7 @@
 			<v2.6:Axlegear xmlns="urn:tugraz:ivt:VectoAPI:DeclarationDefinitions:v2.0" xsi:type="AxlegearComponentDeclarationType">
 				<Data id="AXL-EC3ohnoh" xsi:type="AxlegearDataDeclarationType">
 					<Manufacturer>Generic Gearbox Manufacturer</Manufacturer>
-					<Model>Generic 40t Long Haul Truck AxleGear</Model>
+					<Model>Generic 40t Long Haul Truck AxleGear Primary</Model>
 					<CertificationNumber>e12*0815/8051*2017/05E0000*00</CertificationNumber>
 					<Date>2017-01-11T11:00:00Z</Date>
 					<AppVersion>3.0.1</AppVersion>
diff --git a/VectoCore/VectoCoreTest/VectoCoreTest.csproj b/VectoCore/VectoCoreTest/VectoCoreTest.csproj
index ab8d082f9f..2ab230b8f3 100644
--- a/VectoCore/VectoCoreTest/VectoCoreTest.csproj
+++ b/VectoCore/VectoCoreTest/VectoCoreTest.csproj
@@ -307,6 +307,9 @@
     <None Include="TestData\Integration\Buses\FactorMethod\CompletedBus_42-33b.vecto">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </None>
+    <None Include="TestData\Integration\Buses\FactorMethod\SingleBus_41-32b_AT-P.vecto">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
     <None Include="TestData\Integration\Buses\FactorMethod\SingleBus_42-33b.vecto">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </None>
-- 
GitLab