From 2aa8bf433cd04e55f41133b94bbb07f88d696099 Mon Sep 17 00:00:00 2001
From: Markus Quaritsch <markus.quaritsch@tugraz.at>
Date: Tue, 14 Apr 2020 18:23:30 +0200
Subject: [PATCH] started work on report for factor metod (completed bus)

---
 VECTO/MainModule.vb                           |   1 +
 VECTO3GUI/Helper/VehicleClassConverter.cs     |   1 +
 .../InputData/DeclarationInputData.cs         |   9 +-
 .../VectoCommon/Models}/VehicleClass.cs       | 441 +++++++++++-------
 VectoCommon/VectoCommon/VectoCommon.csproj    |   1 +
 ...ryVehicleBusResultsInputDataProviderV01.cs |  18 +-
 .../VectoCore/InputData/Impl/InputData.cs     |   7 +-
 .../Models/Declaration/WeightingGroups.cs     |   1 +
 .../Simulation/Impl/SimulatorFactory.cs       |  18 +-
 .../VectoCore/OutputData/DeclarationReport.cs |  86 ++--
 .../OutputData/XML/XMLCustomerReport.cs       |   2 +-
 .../XML/XMLCustomerReportCompletedBus.cs      |  19 +
 .../OutputData/XML/XMLDeclarationReport.cs    | 104 ++---
 .../XMLDeclarationReportCompletedVehicle.cs   |  58 +++
 .../XML/XMLDeclarationReportPrimaryVehicle.cs |  69 +++
 .../XML/XMLManufacturerReportPrimaryBus.cs    |  69 ++-
 .../OutputData/XML/XMLPrimaryVehicleReport.cs |   4 +-
 .../VectoCore/OutputData/XML/XMLVTPReport.cs  |  15 +
 VectoCore/VectoCore/VectoCore.csproj          |   4 +-
 .../Integration/XMLReportTest.cs              |   4 +-
 20 files changed, 611 insertions(+), 320 deletions(-)
 rename {VectoCore/VectoCore/Models/Declaration => VectoCommon/VectoCommon/Models}/VehicleClass.cs (54%)
 create mode 100644 VectoCore/VectoCore/OutputData/XML/XMLCustomerReportCompletedBus.cs
 create mode 100644 VectoCore/VectoCore/OutputData/XML/XMLDeclarationReportCompletedVehicle.cs
 create mode 100644 VectoCore/VectoCore/OutputData/XML/XMLDeclarationReportPrimaryVehicle.cs

diff --git a/VECTO/MainModule.vb b/VECTO/MainModule.vb
index fd355a7a26..f6a45397e3 100644
--- a/VECTO/MainModule.vb
+++ b/VECTO/MainModule.vb
@@ -14,6 +14,7 @@ Imports System.Reflection
 Imports System.Runtime.Remoting
 Imports TUGraz.VectoCommon
 Imports TUGraz.VectoCommon.InputData
+Imports TUGraz.VectoCommon.Models
 Imports TUGraz.VectoCommon.OutputData
 Imports TUGraz.VectoCommon.Utils
 Imports TUGraz.VectoCore.InputData.Reader.DataObjectAdapter
diff --git a/VECTO3GUI/Helper/VehicleClassConverter.cs b/VECTO3GUI/Helper/VehicleClassConverter.cs
index b164b376b8..1911a04741 100644
--- a/VECTO3GUI/Helper/VehicleClassConverter.cs
+++ b/VECTO3GUI/Helper/VehicleClassConverter.cs
@@ -1,6 +1,7 @@
 using System;
 using System.Globalization;
 using System.Windows.Data;
+using TUGraz.VectoCommon.Models;
 using TUGraz.VectoCore.Models.Declaration;
 
 namespace VECTO3GUI.Helper
diff --git a/VectoCommon/VectoCommon/InputData/DeclarationInputData.cs b/VectoCommon/VectoCommon/InputData/DeclarationInputData.cs
index 67c68513b5..f8483fcb49 100644
--- a/VectoCommon/VectoCommon/InputData/DeclarationInputData.cs
+++ b/VectoCommon/VectoCommon/InputData/DeclarationInputData.cs
@@ -775,18 +775,21 @@ namespace TUGraz.VectoCommon.InputData
 	{
 		string ResultStatus { get; }
 
-		string VehicleGroup { get; }
+		VehicleClass VehicleGroup { get; }
 
-		string Mission { get; }
+		MissionType Mission { get; }
 
 		ISimulationParameter SimulationParameter { get; }
+
+		Dictionary<FuelType, JoulePerMeter> EnergyConsumption { get; }
+
 	}
 
 	public interface ISimulationParameter
 	{
 		Kilogram TotalVehicleMass { get; }
 		Kilogram Payload { get; }
-		int PassengerCount { get; }
+		double PassengerCount { get; }
 		string FuelMode { get; }
 	}
 
diff --git a/VectoCore/VectoCore/Models/Declaration/VehicleClass.cs b/VectoCommon/VectoCommon/Models/VehicleClass.cs
similarity index 54%
rename from VectoCore/VectoCore/Models/Declaration/VehicleClass.cs
rename to VectoCommon/VectoCommon/Models/VehicleClass.cs
index 6249e4aa34..d8912836bc 100644
--- a/VectoCore/VectoCore/Models/Declaration/VehicleClass.cs
+++ b/VectoCommon/VectoCommon/Models/VehicleClass.cs
@@ -1,176 +1,267 @@
-/*
-* This file is part of VECTO.
-*
-* Copyright © 2012-2019 European Union
-*
-* Developed by Graz University of Technology,
-*              Institute of Internal Combustion Engines and Thermodynamics,
-*              Institute of Technical Informatics
-*
-* VECTO is licensed under the EUPL, Version 1.1 or - as soon they will be approved
-* by the European Commission - subsequent versions of the EUPL (the "Licence");
-* You may not use VECTO except in compliance with the Licence.
-* You may obtain a copy of the Licence at:
-*
-* https://joinup.ec.europa.eu/community/eupl/og_page/eupl
-*
-* Unless required by applicable law or agreed to in writing, VECTO
-* distributed under the Licence is distributed on an "AS IS" basis,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the Licence for the specific language governing permissions and
-* limitations under the Licence.
-*
-* Authors:
-*   Stefan Hausberger, hausberger@ivt.tugraz.at, IVT, Graz University of Technology
-*   Christian Kreiner, christian.kreiner@tugraz.at, ITI, Graz University of Technology
-*   Michael Krisper, michael.krisper@tugraz.at, ITI, Graz University of Technology
-*   Raphael Luz, luz@ivt.tugraz.at, IVT, Graz University of Technology
-*   Markus Quaritsch, markus.quaritsch@tugraz.at, IVT, Graz University of Technology
-*   Martin Rexeis, rexeis@ivt.tugraz.at, IVT, Graz University of Technology
-*/
-
-using TUGraz.VectoCommon.Utils;
-
-namespace TUGraz.VectoCore.Models.Declaration
-{
-	public enum VehicleClass
-	{
-		Unknown,
-		ClassML2r,
-		ClassML2van,
-		ClassML3r,
-		ClassML3van,
-		ClassML4r,
-		ClassML4van,
-		Class1s,
-		Class0,
-		Class1,
-		Class2,
-		Class3,
-		Class4,
-		Class5,
-		Class6,
-		Class7,
-		Class8,
-		Class9,
-		Class10,
-		Class11,
-		Class12,
-		Class13,
-		Class14,
-		Class15,
-		Class16,
-		Class17,
-		ClassP31SD,
-		ClassP31DD,
-		ClassP32SD,
-		ClassP32DD,
-		ClassP33SD,
-		ClassP33DD,
-		ClassP34SD,
-		ClassP34DD,
-		ClassP35SD,
-		ClassP35DD,
-		ClassP36SD,
-		ClassP36DD,
-		ClassP37SD,
-		ClassP37DD,
-		ClassP38SD,
-		ClassP38DD,
-		ClassP39SD,
-		ClassP39DD,
-		ClassP40SD,
-		ClassP40DD,
-		ClassPB41,
-		ClassPB42,
-		ClassPB43,
-		ClassPB44,
-		ClassPB45,
-
-		ClassCB31a,
-		ClassCB31b,
-		ClassCB31c,
-		ClassCB31d,
-		ClassCB31e,
-		ClassCB32a,
-		ClassCB32b,
-		ClassCB32c,
-		ClassCB32d,
-		ClassCB32e,
-		ClassCB32f,
-
-		ClassCB33a,
-		ClassCB33b,
-		ClassCB33c,
-		ClassCB33d,
-		ClassCB33e,
-		ClassCB34a,
-		ClassCB34b,
-		ClassCB34c,
-		ClassCB34d,
-		ClassCB34e,
-		ClassCB34f,
-
-		ClassCB35a,
-		ClassCB35b,
-		ClassCB35c,
-		ClassCB36a,
-		ClassCB36b,
-		ClassCB36c,
-		ClassCB36d,
-		ClassCB36e,
-		ClassCB36f,
-
-		ClassCB37a,
-		ClassCB37b,
-		ClassCB37c,
-		ClassCB37d,
-		ClassCB37e,
-		ClassCB38a,
-		ClassCB38b,
-		ClassCB38c,
-		ClassCB38d,
-		ClassCB38e,
-		ClassCB38f,
-
-		ClassCB39a,
-		ClassCB39b,
-		ClassCB39c,
-		ClassCB40a,
-		ClassCB40b,
-		ClassCB40c,
-		ClassCB40d,
-		ClassCB40e,
-		ClassCB40f,
-	}
-
-	public static class VehicleClassHelper
-	{
-		private const string Prefix = "Class";
-
-		public static VehicleClass Parse(string text)
-		{
-			return (Prefix + text).ParseEnum<VehicleClass>();
-		}
-
-		public static string GetClassNumber(this VehicleClass hdvClass)
-		{
-			return hdvClass == VehicleClass.Unknown ? "-" : hdvClass.ToString().Substring(Prefix.Length);
-		}
-
-		public static bool IsMediumLorry(this VehicleClass vehicleClass)
-		{
-			switch (vehicleClass) {
-				case VehicleClass.ClassML2r:
-				case VehicleClass.ClassML2van:
-				case VehicleClass.ClassML3r:
-				case VehicleClass.ClassML3van:
-				case VehicleClass.ClassML4r:
-				case VehicleClass.ClassML4van:
-					return true;
-				default:
-					return false;
-			}
-		}
-	}
+/*
+* This file is part of VECTO.
+*
+* Copyright © 2012-2019 European Union
+*
+* Developed by Graz University of Technology,
+*              Institute of Internal Combustion Engines and Thermodynamics,
+*              Institute of Technical Informatics
+*
+* VECTO is licensed under the EUPL, Version 1.1 or - as soon they will be approved
+* by the European Commission - subsequent versions of the EUPL (the "Licence");
+* You may not use VECTO except in compliance with the Licence.
+* You may obtain a copy of the Licence at:
+*
+* https://joinup.ec.europa.eu/community/eupl/og_page/eupl
+*
+* Unless required by applicable law or agreed to in writing, VECTO
+* distributed under the Licence is distributed on an "AS IS" basis,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the Licence for the specific language governing permissions and
+* limitations under the Licence.
+*
+* Authors:
+*   Stefan Hausberger, hausberger@ivt.tugraz.at, IVT, Graz University of Technology
+*   Christian Kreiner, christian.kreiner@tugraz.at, ITI, Graz University of Technology
+*   Michael Krisper, michael.krisper@tugraz.at, ITI, Graz University of Technology
+*   Raphael Luz, luz@ivt.tugraz.at, IVT, Graz University of Technology
+*   Markus Quaritsch, markus.quaritsch@tugraz.at, IVT, Graz University of Technology
+*   Martin Rexeis, rexeis@ivt.tugraz.at, IVT, Graz University of Technology
+*/
+
+using TUGraz.VectoCommon.Utils;
+
+namespace TUGraz.VectoCommon.Models
+{
+	public enum VehicleClass
+	{
+		Unknown,
+		ClassML2r,
+		ClassML2van,
+		ClassML3r,
+		ClassML3van,
+		ClassML4r,
+		ClassML4van,
+		Class1s,
+		Class0,
+		Class1,
+		Class2,
+		Class3,
+		Class4,
+		Class5,
+		Class6,
+		Class7,
+		Class8,
+		Class9,
+		Class10,
+		Class11,
+		Class12,
+		Class13,
+		Class14,
+		Class15,
+		Class16,
+		Class17,
+		ClassP31SD,
+		ClassP31DD,
+		ClassP32SD,
+		ClassP32DD,
+		ClassP33SD,
+		ClassP33DD,
+		ClassP34SD,
+		ClassP34DD,
+		ClassP35SD,
+		ClassP35DD,
+		ClassP36SD,
+		ClassP36DD,
+		ClassP37SD,
+		ClassP37DD,
+		ClassP38SD,
+		ClassP38DD,
+		ClassP39SD,
+		ClassP39DD,
+		ClassP40SD,
+		ClassP40DD,
+		ClassPB41,
+		ClassPB42,
+		ClassPB43,
+		ClassPB44,
+		ClassPB45,
+
+		ClassCB31a,
+		ClassCB31b,
+		ClassCB31c,
+		ClassCB31d,
+		ClassCB31e,
+		ClassCB32a,
+		ClassCB32b,
+		ClassCB32c,
+		ClassCB32d,
+		ClassCB32e,
+		ClassCB32f,
+
+		ClassCB33a,
+		ClassCB33b,
+		ClassCB33c,
+		ClassCB33d,
+		ClassCB33e,
+		ClassCB34a,
+		ClassCB34b,
+		ClassCB34c,
+		ClassCB34d,
+		ClassCB34e,
+		ClassCB34f,
+
+		ClassCB35a,
+		ClassCB35b,
+		ClassCB35c,
+		ClassCB36a,
+		ClassCB36b,
+		ClassCB36c,
+		ClassCB36d,
+		ClassCB36e,
+		ClassCB36f,
+
+		ClassCB37a,
+		ClassCB37b,
+		ClassCB37c,
+		ClassCB37d,
+		ClassCB37e,
+		ClassCB38a,
+		ClassCB38b,
+		ClassCB38c,
+		ClassCB38d,
+		ClassCB38e,
+		ClassCB38f,
+
+		ClassCB39a,
+		ClassCB39b,
+		ClassCB39c,
+		ClassCB40a,
+		ClassCB40b,
+		ClassCB40c,
+		ClassCB40d,
+		ClassCB40e,
+		ClassCB40f,
+	}
+
+	public static class VehicleClassHelper
+	{
+		private const string Prefix = "Class";
+
+		public static VehicleClass Parse(string text)
+		{
+			return (Prefix + text).ParseEnum<VehicleClass>();
+		}
+
+		public static string GetClassNumber(this VehicleClass hdvClass)
+		{
+			return hdvClass == VehicleClass.Unknown ? "-" : hdvClass.ToString().Substring(Prefix.Length);
+		}
+
+		public static bool IsMediumLorry(this VehicleClass vehicleClass)
+		{
+			switch (vehicleClass) {
+				case VehicleClass.ClassML2r:
+				case VehicleClass.ClassML2van:
+				case VehicleClass.ClassML3r:
+				case VehicleClass.ClassML3van:
+				case VehicleClass.ClassML4r:
+				case VehicleClass.ClassML4van:
+					return true;
+				default:
+					return false;
+			}
+		}
+
+		public static bool IsPrimaryBus(this VehicleClass vehicleClass)
+		{
+			switch (vehicleClass) {
+				case VehicleClass.ClassP31SD:
+				case VehicleClass.ClassP31DD:
+				case VehicleClass.ClassP32SD:
+				case VehicleClass.ClassP32DD:
+				case VehicleClass.ClassP33SD:
+				case VehicleClass.ClassP33DD:
+				case VehicleClass.ClassP34SD:
+				case VehicleClass.ClassP34DD:
+				case VehicleClass.ClassP35SD:
+				case VehicleClass.ClassP35DD:
+				case VehicleClass.ClassP36SD:
+				case VehicleClass.ClassP36DD:
+				case VehicleClass.ClassP37SD:
+				case VehicleClass.ClassP37DD:
+				case VehicleClass.ClassP38SD:
+				case VehicleClass.ClassP38DD:
+				case VehicleClass.ClassP39SD:
+				case VehicleClass.ClassP39DD:
+				case VehicleClass.ClassP40SD:
+				case VehicleClass.ClassP40DD:
+				case VehicleClass.ClassPB41:
+				case VehicleClass.ClassPB42:
+				case VehicleClass.ClassPB43:
+				case VehicleClass.ClassPB44:
+				case VehicleClass.ClassPB45: return true;
+				default: return false;
+
+			}
+		}
+
+		public static bool IsCompletedBus(this VehicleClass vehicleClass)
+		{
+			switch (vehicleClass) {
+					case VehicleClass.ClassCB31a:
+					case VehicleClass.ClassCB31b:
+					case VehicleClass.ClassCB31c:
+					case VehicleClass.ClassCB31d:
+					case VehicleClass.ClassCB31e:
+					case VehicleClass.ClassCB32a:
+					case VehicleClass.ClassCB32b:
+					case VehicleClass.ClassCB32c:
+					case VehicleClass.ClassCB32d:
+					case VehicleClass.ClassCB32e:
+					case VehicleClass.ClassCB32f:
+					case VehicleClass.ClassCB33a:
+					case VehicleClass.ClassCB33b:
+					case VehicleClass.ClassCB33c:
+					case VehicleClass.ClassCB33d:
+					case VehicleClass.ClassCB33e:
+					case VehicleClass.ClassCB34a:
+					case VehicleClass.ClassCB34b:
+					case VehicleClass.ClassCB34c:
+					case VehicleClass.ClassCB34d:
+					case VehicleClass.ClassCB34e:
+					case VehicleClass.ClassCB34f:
+					case VehicleClass.ClassCB35a:
+					case VehicleClass.ClassCB35b:
+					case VehicleClass.ClassCB35c:
+					case VehicleClass.ClassCB36a:
+					case VehicleClass.ClassCB36b:
+					case VehicleClass.ClassCB36c:
+					case VehicleClass.ClassCB36d:
+					case VehicleClass.ClassCB36e:
+					case VehicleClass.ClassCB36f:
+					case VehicleClass.ClassCB37a:
+					case VehicleClass.ClassCB37b:
+					case VehicleClass.ClassCB37c:
+					case VehicleClass.ClassCB37d:
+					case VehicleClass.ClassCB37e:
+					case VehicleClass.ClassCB38a:
+					case VehicleClass.ClassCB38b:
+					case VehicleClass.ClassCB38c:
+					case VehicleClass.ClassCB38d:
+					case VehicleClass.ClassCB38e:
+					case VehicleClass.ClassCB38f:
+					case VehicleClass.ClassCB39a:
+					case VehicleClass.ClassCB39b:
+					case VehicleClass.ClassCB39c:
+					case VehicleClass.ClassCB40a:
+					case VehicleClass.ClassCB40b:
+					case VehicleClass.ClassCB40c:
+					case VehicleClass.ClassCB40d:
+					case VehicleClass.ClassCB40e:
+				case VehicleClass.ClassCB40f: return true;
+				default: return false;
+			}
+		}
+	}
 }
\ No newline at end of file
diff --git a/VectoCommon/VectoCommon/VectoCommon.csproj b/VectoCommon/VectoCommon/VectoCommon.csproj
index b562b4b244..e91e7e53c7 100644
--- a/VectoCommon/VectoCommon/VectoCommon.csproj
+++ b/VectoCommon/VectoCommon/VectoCommon.csproj
@@ -112,6 +112,7 @@
     <Compile Include="Models\RetarderType.cs" />
     <Compile Include="Models\SimulationType.cs" />
     <Compile Include="Models\VehicleCategory.cs" />
+    <Compile Include="Models\VehicleClass.cs" />
     <Compile Include="Models\VehicleCode.cs" />
     <Compile Include="Models\WHRType.cs" />
     <Compile Include="OutputData\IOutputFileWriter.cs" />
diff --git a/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLDeclarationPrimaryVehicleBusResultsInputDataProviderV01.cs b/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLDeclarationPrimaryVehicleBusResultsInputDataProviderV01.cs
index 39f4078eb1..867b590ef4 100644
--- a/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLDeclarationPrimaryVehicleBusResultsInputDataProviderV01.cs
+++ b/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLDeclarationPrimaryVehicleBusResultsInputDataProviderV01.cs
@@ -7,11 +7,13 @@ 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.InputData.Impl;
+using TUGraz.VectoCore.Models.Declaration;
 using TUGraz.VectoCore.Utils;
 
 namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration.DataProvider
@@ -60,15 +62,23 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration.DataProvider
 		{
 			var resultStatus = GetAttribute(xmlNode, XMLNames.Result_Status);
 			var vehicleGroup = GetString(XMLNames.Report_Vehicle_VehicleGroup, xmlNode);
-			var mission = GetString(XMLNames.Report_Result_Mission, xmlNode);
+			var mission = GetString(XMLNames.Report_Result_Mission, xmlNode).ParseEnum<MissionType>();
 			var simulationNode = GetNode(XMLNames.Report_ResultEntry_SimulationParameters, xmlNode);
 			var simulationParams = GetSimulationParameter(simulationNode);
 
+			var energyConsumption = GetNodes(XMLNames.Report_Results_Fuel, xmlNode)
+				.Cast<XmlNode>().Select(x => new KeyValuePair<FuelType, JoulePerMeter>(
+											GetAttribute(x, XMLNames.Report_Results_Fuel_Type_Attr).ParseEnum<FuelType>(),
+											x.SelectSingleNode(
+												string.Format(".//*[local-name()='{0}' and @unit='MJ/km']", XMLNames.Report_Result_EnergyConsumption))?.InnerText
+													.ToDouble().SI(Unit.SI.Mega.Joule.Per.Kilo.Meter).Cast<JoulePerMeter>())).ToDictionary(x => x.Key, x => x.Value);
+
 			return new Result {
 				ResultStatus = resultStatus,
 				Mission = mission,
-				VehicleGroup = vehicleGroup,
-				SimulationParameter = simulationParams
+				VehicleGroup = VehicleClassHelper.Parse(vehicleGroup),
+				SimulationParameter = simulationParams,
+				EnergyConsumption = energyConsumption
 			};
 		}
 
@@ -79,7 +89,7 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration.DataProvider
 			{
 				TotalVehicleMass = GetString(XMLNames.Report_ResultEntry_TotalVehicleMass, xmlNode).ToDouble().SI<Kilogram>(),
 				Payload = GetString(XMLNames.Report_Result_Payload, xmlNode).ToDouble().SI<Kilogram>(),
-				PassengerCount =  GetString(XMLNames.Bus_PassengerCount, xmlNode).ToInt(),
+				PassengerCount =  GetString(XMLNames.Bus_PassengerCount, xmlNode).ToDouble(),
 				FuelMode =  GetString(XMLNames.Report_Result_FuelMode, xmlNode)
 			};
 		}
diff --git a/VectoCore/VectoCore/InputData/Impl/InputData.cs b/VectoCore/VectoCore/InputData/Impl/InputData.cs
index f2562c63d0..ae876007a7 100644
--- a/VectoCore/VectoCore/InputData/Impl/InputData.cs
+++ b/VectoCore/VectoCore/InputData/Impl/InputData.cs
@@ -215,16 +215,17 @@ namespace TUGraz.VectoCore.InputData.Impl
 	public class Result : IResult
 	{
 		public string ResultStatus { get; internal set; }
-		public string VehicleGroup { get; internal set; }
-		public string Mission { get; internal set; }
+		public VehicleClass VehicleGroup { get; internal set; }
+		public MissionType Mission { get; internal set; }
 		public ISimulationParameter SimulationParameter { get; internal set; }
+		public Dictionary<FuelType, JoulePerMeter> EnergyConsumption { get; set; }
 	}
 
 	public class SimulationParameter : ISimulationParameter
 	{
 		public Kilogram TotalVehicleMass { get; internal set; }
 		public Kilogram Payload { get; internal set; }
-		public int PassengerCount { get; internal set; }
+		public double PassengerCount { get; internal set; }
 		public string FuelMode { get; internal set; }
 	}
 
diff --git a/VectoCore/VectoCore/Models/Declaration/WeightingGroups.cs b/VectoCore/VectoCore/Models/Declaration/WeightingGroups.cs
index 302da1d4cc..9d77b385b3 100644
--- a/VectoCore/VectoCore/Models/Declaration/WeightingGroups.cs
+++ b/VectoCore/VectoCore/Models/Declaration/WeightingGroups.cs
@@ -33,6 +33,7 @@ using System;
 using System.Collections.Generic;
 using System.Data;
 using System.Linq;
+using TUGraz.VectoCommon.Models;
 using TUGraz.VectoCommon.Utils;
 using TUGraz.VectoCore.Utils;
 
diff --git a/VectoCore/VectoCore/Models/Simulation/Impl/SimulatorFactory.cs b/VectoCore/VectoCore/Models/Simulation/Impl/SimulatorFactory.cs
index dfdb6ccfc2..5232565aff 100644
--- a/VectoCore/VectoCore/Models/Simulation/Impl/SimulatorFactory.cs
+++ b/VectoCore/VectoCore/Models/Simulation/Impl/SimulatorFactory.cs
@@ -59,6 +59,11 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl
 		private readonly ExecutionMode _mode;
 		private bool _engineOnlyMode;
 
+		public SimulatorFactory(ExecutionMode mode, IInputDataProvider dataProvider, IOutputDataWriter writer) : this(mode, dataProvider, writer, null, null, true)
+		{
+			
+		}
+
 		public SimulatorFactory(ExecutionMode mode, IInputDataProvider dataProvider, IOutputDataWriter writer,
 			IDeclarationReport declarationReport = null, IVTPReport vtpReport = null, bool validate = true)
 		{
@@ -99,25 +104,28 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl
 
 			if (dataProvider is ISingleBusInputDataProvider) {
 				var singleBus = dataProvider as ISingleBusInputDataProvider;
-				var report = declarationReport ?? new XMLDeclarationReport(ModWriter, false);
+				var report = declarationReport ?? new XMLDeclarationReport(ModWriter);
 				DataReader = new DeclarationModeSingleBusVectoRunDataFactory(singleBus, report);
 				return;
 			}
 			if (dataProvider is IDeclarationInputDataProvider) {
 				var declDataProvider = dataProvider as IDeclarationInputDataProvider;
-				var report = declarationReport ?? new XMLDeclarationReport(ModWriter, declDataProvider.JobInputData.Vehicle.VehicleCategory == VehicleCategory.HeavyBusPrimaryVehicle);
 				if (declDataProvider.JobInputData.Vehicle.VehicleCategory.IsTruck()) {
+					var report = declarationReport ?? new XMLDeclarationReport(ModWriter);
 					DataReader = new DeclarationModeTruckVectoRunDataFactory(declDataProvider, report);
 					return;
 				}
 
 				switch (declDataProvider.JobInputData.Vehicle.VehicleCategory) {
 					case VehicleCategory.HeavyBusCompletedVehicle:
-						DataReader = new DeclarationModeCompletedBusVectoRunDataFactory(declDataProvider, report);
-						report.PrimaryResults = declDataProvider.PrimaryVehicleData;
+						var reportCompleted = declarationReport ?? new XMLDeclarationReportCompletedVehicle(ModWriter, declDataProvider.JobInputData.Vehicle.VehicleCategory == VehicleCategory.HeavyBusPrimaryVehicle) {
+							PrimaryResults = declDataProvider.PrimaryVehicleData,
+						};
+						DataReader = new DeclarationModeCompletedBusVectoRunDataFactory(declDataProvider, reportCompleted);
 						return;
 					case VehicleCategory.HeavyBusPrimaryVehicle:
-						DataReader = new DeclarationModePrimaryBusVectoRunDataFactory(declDataProvider, report);
+						var reportPrimary = declarationReport ?? new XMLDeclarationReportPrimaryVehicle(ModWriter, declDataProvider.JobInputData.Vehicle.VehicleCategory == VehicleCategory.HeavyBusPrimaryVehicle);
+						DataReader = new DeclarationModePrimaryBusVectoRunDataFactory(declDataProvider, reportPrimary);
 						return;
 				}
 			}
diff --git a/VectoCore/VectoCore/OutputData/DeclarationReport.cs b/VectoCore/VectoCore/OutputData/DeclarationReport.cs
index add3078325..955c751c5e 100644
--- a/VectoCore/VectoCore/OutputData/DeclarationReport.cs
+++ b/VectoCore/VectoCore/OutputData/DeclarationReport.cs
@@ -67,7 +67,6 @@ namespace TUGraz.VectoCore.OutputData
 		void AddResult(
 			LoadingType loadingType, Mission mission, int fuelMode, VectoRunData runData, IModalDataContainer modData);
 
-		IPrimaryVehicleInformationInputDataProvider PrimaryResults { get; set; }
 	}
 
 	public interface IResultEntry
@@ -135,29 +134,6 @@ namespace TUGraz.VectoCore.OutputData
 		[MethodImpl(MethodImplOptions.Synchronized)]
 		public void PrepareResult(LoadingType loading, Mission mission, int fuelMode, VectoRunData runData)
 		{
-			//if (!Missions.ContainsKey(fuelMode)) {
-			//	Missions[fuelMode] = new Dictionary<MissionType, ResultContainer<T>>();
-			//}
-			//var missions = Missions[fuelMode];
-
-			//var missionType = mission.MissionType;
-			//if (!missions.ContainsKey(missionType)) {
-			//	missions[missionType] = new ResultContainer<T>() {
-			//		Mission = missionType,
-			//		ResultEntry = new Dictionary<LoadingType, T>(),
-			//	};
-			//}
-			//if (missionType != MissionType.ExemptedMission) {
-			//	var entry = new T();
-			//	entry.FuelData = runData.EngineData.Fuels.Select(x => x.FuelData).ToList();
-			//	entry.Payload = runData.VehicleData.Loading;
-			//	entry.TotalVehicleWeight = runData.VehicleData.TotalVehicleMass;
-			//	entry.CargoVolume = runData.VehicleData.CargoVolume;
-			//	// subtract driver!
-			//	entry.PassengerCount = runData.BusAuxiliaries?.SSMInputs.NumberOfPassengers ?? 0 - 1;
-
-			//	missions[mission.MissionType].ResultEntry[loading] = entry;
-			//}
 			_resultCount++;
 		}
 
@@ -168,8 +144,6 @@ namespace TUGraz.VectoCore.OutputData
 			_resultCount--;
 			if (_resultCount == 0) {
 				DoWriteReport();
-
-				//Flc = null;
 			}
 		}
 
@@ -177,32 +151,20 @@ namespace TUGraz.VectoCore.OutputData
 			LoadingType loadingType, Mission mission, int fuelMode, VectoRunData runData,
 			IModalDataContainer modData)
 		{
-			//if (!Missions.ContainsKey(fuelMode)) {
-			//	throw new VectoException("Unknown fuel mode {0} for generating declaration report", fuelMode);
-			//}
-			//if (!Missions[fuelMode].ContainsKey(mission.MissionType)) {
-			//	throw new VectoException("Unknown mission type {0} for generating declaration report", mission.MissionType);
-			//}
-			//if (mission.MissionType != MissionType.ExemptedMission && !Missions[fuelMode][mission.MissionType].ResultEntry.ContainsKey(loadingType)) {
-			//	throw new VectoException("Unknown loading type {0} for mission {1}", loadingType, mission.MissionType);
-			//}
-
-			//if (mission.MissionType != MissionType.ExemptedMission) {
-			//	DoAddResult(Missions[fuelMode][mission.MissionType].ResultEntry[loadingType], runData, modData);
-			//}
-
 			if (mission.MissionType != MissionType.ExemptedMission) {
-				var entry = new T();
-				entry.Mission = mission.MissionType;
-				entry.LoadingType = loadingType;
-				entry.FuelMode = fuelMode;
-				entry.FuelData = runData.EngineData.Fuels.Select(x => x.FuelData).ToList();
-				entry.Payload = runData.VehicleData.Loading;
-				entry.TotalVehicleWeight = runData.VehicleData.TotalVehicleMass;
-				entry.CargoVolume = runData.VehicleData.CargoVolume;
-				entry.VehicleClass = runData.VehicleData.VehicleClass;
-
-				entry.PassengerCount = runData.VehicleData.PassengerCount;
+				var entry = new T {
+					Mission = mission.MissionType,
+					LoadingType = loadingType,
+					FuelMode = fuelMode,
+					FuelData = runData.EngineData.Fuels.Select(x => x.FuelData).ToList(),
+					Payload = runData.VehicleData.Loading,
+					TotalVehicleWeight = runData.VehicleData.TotalVehicleMass,
+					CargoVolume = runData.VehicleData.CargoVolume,
+					VehicleClass = runData.Mission?.BusParameter?.BusGroup ?? runData.VehicleData.VehicleClass,
+					//runData.VehicleData.VehicleClass,
+					PassengerCount = runData.VehicleData.PassengerCount
+				};
+
 				Results.Add(entry);
 				DoStoreResult(entry, runData, modData);
 			}
@@ -210,9 +172,7 @@ namespace TUGraz.VectoCore.OutputData
 			WriteResults();
 		}
 
-		public IPrimaryVehicleInformationInputDataProvider PrimaryResults { get; set; }
-
-		protected IEnumerable<T> OrderedResults
+		protected virtual IEnumerable<T> OrderedResults
 		{
 			get {
 				return Results.OrderBy(x => x.VehicleClass).ThenBy(x => x.FuelMode).ThenBy(x => x.Mission)
@@ -230,8 +190,24 @@ namespace TUGraz.VectoCore.OutputData
 		protected abstract void DoStoreResult(T entry, VectoRunData runData, IModalDataContainer modData);
 
 
-		protected internal abstract void DoWriteReport();
+		protected internal virtual void DoWriteReport()
+		{
+			foreach (var result in OrderedResults) {
+				WriteResult(result);
+			}
+
+			GenerateReports();
+
+			if (Writer != null) {
+				OutputReports();
+			}
+		}
+
+		protected abstract void OutputReports();
+
+		protected abstract void GenerateReports();
 
+		protected abstract void WriteResult(T result);
 
 		public abstract void InitializeReport(VectoRunData modelData, List<List<FuelData.Entry>> fuelModes);
 	}
diff --git a/VectoCore/VectoCore/OutputData/XML/XMLCustomerReport.cs b/VectoCore/VectoCore/OutputData/XML/XMLCustomerReport.cs
index 585a562d61..d6905a4914 100644
--- a/VectoCore/VectoCore/OutputData/XML/XMLCustomerReport.cs
+++ b/VectoCore/VectoCore/OutputData/XML/XMLCustomerReport.cs
@@ -171,7 +171,7 @@ namespace TUGraz.VectoCore.OutputData.XML
 				);
 		}
 
-		public void WriteResult(XMLDeclarationReport.ResultEntry resultEntry)
+		public virtual void WriteResult(XMLDeclarationReport.ResultEntry resultEntry)
 		{
 			//foreach (var resultEntry in entry.ResultEntry) {
 				_allSuccess &= resultEntry.Status == VectoRun.Status.Success;
diff --git a/VectoCore/VectoCore/OutputData/XML/XMLCustomerReportCompletedBus.cs b/VectoCore/VectoCore/OutputData/XML/XMLCustomerReportCompletedBus.cs
new file mode 100644
index 0000000000..8a1857d5c7
--- /dev/null
+++ b/VectoCore/VectoCore/OutputData/XML/XMLCustomerReportCompletedBus.cs
@@ -0,0 +1,19 @@
+using System;
+using TUGraz.VectoCommon.InputData;
+
+namespace TUGraz.VectoCore.OutputData.XML {
+	public class XMLCustomerReportCompletedBus : XMLCustomerReport
+	{
+		internal void WriteResult(XMLDeclarationReport.ResultEntry genericResult, XMLDeclarationReport.ResultEntry specificResult, IResult primaryResult)
+		{
+			foreach (var entry in primaryResult.EnergyConsumption) {
+				// TODO!
+			}
+		}
+
+		public override void WriteResult(XMLDeclarationReport.ResultEntry resultEntry)
+		{
+			throw new NotSupportedException();
+		}
+	}
+}
\ No newline at end of file
diff --git a/VectoCore/VectoCore/OutputData/XML/XMLDeclarationReport.cs b/VectoCore/VectoCore/OutputData/XML/XMLDeclarationReport.cs
index c13e1a3fa9..f92b0737aa 100644
--- a/VectoCore/VectoCore/OutputData/XML/XMLDeclarationReport.cs
+++ b/VectoCore/VectoCore/OutputData/XML/XMLDeclarationReport.cs
@@ -34,10 +34,10 @@ using System.Collections.Generic;
 using System.Collections.ObjectModel;
 using System.Data;
 using System.Linq;
+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;
@@ -49,23 +49,16 @@ namespace TUGraz.VectoCore.OutputData.XML
 {
 	public class XMLDeclarationReport : DeclarationReport<XMLDeclarationReport.ResultEntry>
 	{
-		private IXMLManufacturerReport _manufacturerReport;
-		private XMLCustomerReport _customerReport;
-		private XMLMonitoringReport _monitoringReport;
-
-		private XMLPrimaryVehicleReport _primaryReport;
+		protected IXMLManufacturerReport ManufacturerRpt;
 
+		protected XMLCustomerReport CustomerRpt;
+		
 
 		private IDictionary<Tuple<MissionType, LoadingType>, double> _weightingFactors;
 
-		public XMLDeclarationReport(IReportWriter writer = null, bool writePIF = false) : base(writer)
+		public XMLDeclarationReport(IReportWriter writer) : base(writer)
 		{
-			//_manufacturerReport = new XMLManufacturerReport();
-			//_customerReport = new XMLCustomerReport();
-			//_monitoringReport = new XMLMonitoringReport(_manufacturerReport);
-			//if (writePIF) {
-			//	_primaryReport = new XMLPrimaryVehicleReport();
-			//}
+			
 		}
 
 		public class ResultEntry : IResultEntry
@@ -247,24 +240,19 @@ namespace TUGraz.VectoCore.OutputData.XML
 
 		
 
-		public XDocument FullReport
-		{
-			get { return _manufacturerReport.Report; }
-		}
-
-		public XDocument CustomerReport
+		public virtual XDocument FullReport
 		{
-			get { return _customerReport.Report; }
+			get { return ManufacturerRpt.Report; }
 		}
 
-		public XDocument MonitoringReport
+		public virtual XDocument CustomerReport
 		{
-			get { return _monitoringReport.Report; }
+			get { return CustomerRpt.Report; }
 		}
 
-		public XDocument PrimaryVehicleReport
+		public virtual XDocument PrimaryVehicleReport
 		{
-			get { return _primaryReport?.Report; }
+			get { return null; }
 		}
 
 
@@ -274,39 +262,28 @@ namespace TUGraz.VectoCore.OutputData.XML
 			entry.SetResultData(runData, modData, factor);
 		}
 
-		protected internal override void DoWriteReport()
+		protected override void WriteResult(ResultEntry result)
 		{
-			foreach (var result in OrderedResults) {
-				_manufacturerReport.WriteResult(result);
-				_customerReport.WriteResult(result);
-				if (_primaryReport != null) {
-					_primaryReport.WriteResult(result);
-				} 
-			}
+			ManufacturerRpt.WriteResult(result);
+			CustomerRpt.WriteResult(result);
+		}
 
-			//foreach (var fuelMode in Missions.OrderBy(f => f.Key)) {
-			//	foreach (var result in fuelMode.Value.OrderBy(m => m.Key)) {
-			//		_manufacturerReport.WriteResult(result.Value);
-			//		_customerReport.WriteResult(result.Value);
-			//	}
-			//}
-
-			_manufacturerReport.GenerateReport();
-			var fullReportHash = GetSignature(_manufacturerReport.Report);
-			_customerReport.GenerateReport(fullReportHash);
-			_primaryReport?.GenerateReport(fullReportHash);
-
-			if (Writer != null) {
-				Writer.WriteReport(ReportType.DeclarationReportCustomerXML, _customerReport.Report);
-				Writer.WriteReport(ReportType.DeclarationReportManufacturerXML, _manufacturerReport.Report);
-				//Writer.WriteReport(ReportType.DeclarationReportMonitoringXML, _monitoringReport.Report);
-				if (_primaryReport != null) {
-					Writer.WriteReport(ReportType.DeclarationReportPrimaryVehicleXML, _primaryReport.Report);
-				}
-			}
+		protected override void GenerateReports()
+		{
+			ManufacturerRpt.GenerateReport();
+			var fullReportHash = GetSignature(ManufacturerRpt.Report);
+			CustomerRpt.GenerateReport(fullReportHash);
+		}
+
+
+		protected override void OutputReports()
+		{
+			Writer.WriteReport(ReportType.DeclarationReportCustomerXML, CustomerRpt.Report);
+			Writer.WriteReport(ReportType.DeclarationReportManufacturerXML, ManufacturerRpt.Report);
 		}
 
-		private XElement GetSignature(XDocument report)
+
+		protected XElement GetSignature(XDocument report)
 		{
 			return report.XPathSelectElement("/*[local-name()='VectoOutput']/*[local-name()='Signature']/*");
 		}
@@ -325,27 +302,18 @@ namespace TUGraz.VectoCore.OutputData.XML
 
 			InstantiateReports(modelData);
 
-			_manufacturerReport.Initialize(modelData, fuelModes);
-			_customerReport.Initialize(modelData, fuelModes);
-			_primaryReport?.Initialize(modelData, fuelModes);
-			_monitoringReport.Initialize(modelData);
+			ManufacturerRpt.Initialize(modelData, fuelModes);
+			CustomerRpt.Initialize(modelData, fuelModes);
 		}
 
-		private void InstantiateReports(VectoRunData modelData)
+		protected virtual void InstantiateReports(VectoRunData modelData)
 		{
 			if (modelData.Exempted) {
-				_manufacturerReport = new XMLManufacturerReportExemptedTruck();
+				ManufacturerRpt = new XMLManufacturerReportExemptedTruck();
 			} else {
-				if (modelData.VehicleData.VehicleCategory == VehicleCategory.HeavyBusPrimaryVehicle) {
-					_manufacturerReport = new XMLManufacturerReportPrimaryBus();
-					_primaryReport = new XMLPrimaryVehicleReport();
-				} else {
-					_manufacturerReport = new XMLManufacturerReportTruck();
-				}
+				ManufacturerRpt = new XMLManufacturerReportTruck();
 			}
-			_customerReport = new XMLCustomerReport();
-			_monitoringReport = new XMLMonitoringReport(_manufacturerReport);
-
+			CustomerRpt = new XMLCustomerReport();
 		}
 
 		private static IDictionary<Tuple<MissionType, LoadingType>, double> ZeroWeighting
diff --git a/VectoCore/VectoCore/OutputData/XML/XMLDeclarationReportCompletedVehicle.cs b/VectoCore/VectoCore/OutputData/XML/XMLDeclarationReportCompletedVehicle.cs
new file mode 100644
index 0000000000..aae61d59a9
--- /dev/null
+++ b/VectoCore/VectoCore/OutputData/XML/XMLDeclarationReportCompletedVehicle.cs
@@ -0,0 +1,58 @@
+using System;
+using System.Linq;
+using TUGraz.VectoCommon.InputData;
+using TUGraz.VectoCommon.Models;
+using TUGraz.VectoCore.Models.Declaration;
+using TUGraz.VectoCore.Models.Simulation.Data;
+
+namespace TUGraz.VectoCore.OutputData.XML {
+	public class XMLDeclarationReportCompletedVehicle : XMLDeclarationReport
+	{
+		public XMLDeclarationReportCompletedVehicle(IReportWriter writer, bool writePIF = false) : base(writer) { }
+
+		public IPrimaryVehicleInformationInputDataProvider PrimaryResults { get; set; }
+
+		#region Overrides of XMLDeclarationReport
+
+		protected override void InstantiateReports(VectoRunData modelData)
+		{
+			ManufacturerRpt = new XMLManufacturerReportCompletedBus();
+			CustomerRpt = new XMLCustomerReportCompletedBus();
+		}
+
+		#endregion
+
+		protected internal override void DoWriteReport()
+		{
+			foreach (var specificResult in Results.Where(x => VehicleClassHelper.IsCompletedBus(x.VehicleClass)).OrderBy(x => x.VehicleClass)
+												.ThenBy(x => x.FuelMode).ThenBy(x => x.Mission)) {
+
+				var genericResult = Results.First(x => x.VehicleClass.IsPrimaryBus() && x.FuelMode == specificResult.FuelMode &&
+						x.Mission == specificResult.Mission && x.LoadingType == specificResult.LoadingType);
+				var primaryResult = SelectPrimaryResult(genericResult);
+
+				(ManufacturerRpt as XMLManufacturerReportCompletedBus).WriteResult(genericResult, specificResult, primaryResult);
+				(CustomerRpt as XMLCustomerReportCompletedBus).WriteResult(genericResult, specificResult, primaryResult);
+			}
+
+			GenerateReports();
+
+			if (Writer != null) {
+				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/XMLDeclarationReportPrimaryVehicle.cs b/VectoCore/VectoCore/OutputData/XML/XMLDeclarationReportPrimaryVehicle.cs
new file mode 100644
index 0000000000..916452a050
--- /dev/null
+++ b/VectoCore/VectoCore/OutputData/XML/XMLDeclarationReportPrimaryVehicle.cs
@@ -0,0 +1,69 @@
+using System;
+using System.Collections.Generic;
+using System.Xml.Linq;
+using TUGraz.VectoCore.Models.Declaration;
+using TUGraz.VectoCore.Models.Simulation.Data;
+
+namespace TUGraz.VectoCore.OutputData.XML {
+	public class XMLDeclarationReportPrimaryVehicle : XMLDeclarationReport
+	{
+		private XMLPrimaryVehicleReport _primaryReport;
+
+
+		public XMLDeclarationReportPrimaryVehicle(IReportWriter writer, bool writePIF = false) : base(writer)
+		{
+			_primaryReport = new XMLPrimaryVehicleReport();
+		}
+
+		public override XDocument CustomerReport
+		{
+			get { return null; }
+		}
+
+		public override XDocument PrimaryVehicleReport
+		{
+			get { return _primaryReport?.Report; }
+		}
+
+		
+		#region Overrides of XMLDeclarationReport
+
+		protected override void InstantiateReports(VectoRunData modelData)
+		{
+			ManufacturerRpt = new XMLManufacturerReportPrimaryBus();
+			CustomerRpt = new XMLCustomerReport();
+		}
+
+		public override void InitializeReport(VectoRunData modelData, List<List<FuelData.Entry>> fuelModes)
+		{
+			base.InitializeReport(modelData, fuelModes);
+			_primaryReport.Initialize(modelData,fuelModes);
+		}
+
+
+
+		protected override void WriteResult(ResultEntry result)
+		{
+			base.WriteResult(result);
+			_primaryReport.WriteResult(result);
+		}
+
+		protected override void GenerateReports()
+		{
+			ManufacturerRpt.GenerateReport();
+			var fullReportHash = GetSignature(ManufacturerRpt.Report);
+			CustomerRpt.GenerateReport(fullReportHash);
+			_primaryReport.GenerateReport(fullReportHash);
+		}
+
+	
+
+		protected override void OutputReports()
+		{
+			base.OutputReports();
+			Writer.WriteReport(ReportType.DeclarationReportPrimaryVehicleXML, _primaryReport.Report);
+		}
+
+		#endregion
+	}
+}
\ No newline at end of file
diff --git a/VectoCore/VectoCore/OutputData/XML/XMLManufacturerReportPrimaryBus.cs b/VectoCore/VectoCore/OutputData/XML/XMLManufacturerReportPrimaryBus.cs
index e3562a4f66..679a0c0f21 100644
--- a/VectoCore/VectoCore/OutputData/XML/XMLManufacturerReportPrimaryBus.cs
+++ b/VectoCore/VectoCore/OutputData/XML/XMLManufacturerReportPrimaryBus.cs
@@ -1,5 +1,7 @@
-using System.Collections.Generic;
+using System;
+using System.Collections.Generic;
 using System.Xml.Linq;
+using TUGraz.VectoCommon.InputData;
 using TUGraz.VectoCommon.Models;
 using TUGraz.VectoCommon.Resources;
 using TUGraz.VectoCore.Models.Declaration;
@@ -7,6 +9,71 @@ 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 644b7bf941..64a8a72b08 100644
--- a/VectoCore/VectoCore/OutputData/XML/XMLPrimaryVehicleReport.cs
+++ b/VectoCore/VectoCore/OutputData/XML/XMLPrimaryVehicleReport.cs
@@ -383,7 +383,7 @@ namespace TUGraz.VectoCore.OutputData.XML
 							tns + XMLNames.Report_ResultEntry_TotalVehicleMass,
 							XMLHelper.ValueAsUnit(resultEntry.Payload, XMLNames.Unit_kg, 0)),
 						new XElement(
-							tns + XMLNames.Report_Result_Payload, XMLHelper.ValueAsUnit(resultEntry.Payload, XMLNames.Unit_kg, 0)),
+							tns + XMLNames.Report_Result_Payload, XMLHelper.ValueAsUnit(resultEntry.Payload, XMLNames.Unit_kg, 2)),
 						new XElement(
 							tns + XMLNames.Report_ResultEntry_PassengerCount,
 							resultEntry.PassengerCount),
@@ -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, 1)));
+						.Value().ToMinSignificantDigits(3, 3)));
 				retVal.Add(fcResult);
 			}
 
diff --git a/VectoCore/VectoCore/OutputData/XML/XMLVTPReport.cs b/VectoCore/VectoCore/OutputData/XML/XMLVTPReport.cs
index 0c02b536af..474e3b4636 100644
--- a/VectoCore/VectoCore/OutputData/XML/XMLVTPReport.cs
+++ b/VectoCore/VectoCore/OutputData/XML/XMLVTPReport.cs
@@ -179,6 +179,21 @@ namespace TUGraz.VectoCore.OutputData.XML
 			}
 		}
 
+		protected override void OutputReports()
+		{
+			throw new NotImplementedException();
+		}
+
+		protected override void GenerateReports()
+		{
+			throw new NotImplementedException();
+		}
+
+		protected override void WriteResult(ResultEntry result)
+		{
+			throw new NotImplementedException();
+		}
+
 		private void GenerateResults()
 		{
 			//var vtpResult = Missions.First().Value.FirstOrDefault(x => x.Key == MissionType.VerificationTest).Value.ResultEntry
diff --git a/VectoCore/VectoCore/VectoCore.csproj b/VectoCore/VectoCore/VectoCore.csproj
index 4957a25a89..232cc3e90b 100644
--- a/VectoCore/VectoCore/VectoCore.csproj
+++ b/VectoCore/VectoCore/VectoCore.csproj
@@ -421,6 +421,9 @@
     <Compile Include="OutputData\XML\Engineering\XMLEngineeringWriter.cs" />
     <Compile Include="OutputData\XML\Engineering\XMLEngineeringWriterInjectModule.cs" />
     <Compile Include="OutputData\XML\Engineering\XMLWriterMapping.cs" />
+    <Compile Include="OutputData\XML\XMLCustomerReportCompletedBus.cs" />
+    <Compile Include="OutputData\XML\XMLDeclarationReportCompletedVehicle.cs" />
+    <Compile Include="OutputData\XML\XMLDeclarationReportPrimaryVehicle.cs" />
     <Compile Include="OutputData\XML\XMLManufacturerReportExemptedTruck.cs" />
     <Compile Include="OutputData\XML\XMLManufacturerReportPrimaryBus.cs" />
     <Compile Include="OutputData\XML\XMLPrimaryVehicleReport.cs" />
@@ -545,7 +548,6 @@
     <Compile Include="Models\Declaration\TruckSegments.cs" />
     <Compile Include="Models\Declaration\StandardBodies.cs" />
     <Compile Include="Models\Declaration\SteeringPump.cs" />
-    <Compile Include="Models\Declaration\VehicleClass.cs" />
     <Compile Include="Models\Declaration\Wheels.cs" />
     <Compile Include="Models\Declaration\WHTCCorrection.cs" />
     <Compile Include="Models\SimulationComponent\Data\CrosswindCorrectionCdxALookup.cs" />
diff --git a/VectoCore/VectoCoreTest/Integration/XMLReportTest.cs b/VectoCore/VectoCoreTest/Integration/XMLReportTest.cs
index 0c056f2f75..1f9f8359fb 100644
--- a/VectoCore/VectoCoreTest/Integration/XMLReportTest.cs
+++ b/VectoCore/VectoCoreTest/Integration/XMLReportTest.cs
@@ -183,8 +183,8 @@ namespace TUGraz.VectoCore.Tests.Integration
 			var cifValidator = GetValidator(xmlReport.CustomerReport);
 			cifValidator.ValidateXML(XmlDocumentType.DeclarationComponentData | XmlDocumentType.DeclarationJobData | XmlDocumentType.CustomerReport | XmlDocumentType.ManufacturerReport);
 
-			var monitoringValidator = GetValidator(xmlReport.MonitoringReport);
-			monitoringValidator.ValidateXML(XmlDocumentType.DeclarationComponentData | XmlDocumentType.DeclarationJobData | XmlDocumentType.CustomerReport | XmlDocumentType.ManufacturerReport);
+			//var monitoringValidator = GetValidator(xmlReport.MonitoringReport);
+			//monitoringValidator.ValidateXML(XmlDocumentType.DeclarationComponentData | XmlDocumentType.DeclarationJobData | XmlDocumentType.CustomerReport | XmlDocumentType.ManufacturerReport);
 		}
 
 		private static XMLValidator GetValidator(XDocument xmlReport)
-- 
GitLab