From afddad24459c7e570f58345c9754b2a71e4f283c Mon Sep 17 00:00:00 2001
From: "VKMTHD\\franzjosefkober" <franz.josef.kober@ivt.tugraz.at>
Date: Fri, 12 Mar 2021 22:19:33 +0100
Subject: [PATCH] added primary vehicle reader for VIF xml

---
 .../InputData/IInputDataProvider.cs           |   2 +
 .../Resources/XMLNames.Designer.cs            |   9 +
 .../VectoCommon/Resources/XMLNames.resx       |   3 +
 .../XMLDeclarationAxlegearDataProvider.cs     |  19 +
 .../XMLDeclarationComponentsDataProvider.cs   |  22 +
 .../XMLDeclarationEngineDataProvider.cs       |  15 +
 .../XMLDeclarationGearboxDataProvider.cs      |  18 +
 .../XMLDeclarationInputDataProvider.cs        |   2 +
 .../XMLDeclarationJobInputDataProvider.cs     |  39 ++
 .../XMLDeclarationMultistageInputData.cs      |  90 +++-
 ...usApplicationInformationDataProviderV01.cs |  13 +
 ...ryVehicleBusResultsInputDataProviderV01.cs |  22 +-
 .../XMLDeclarationVehicleDataProvider.cs      |  23 +-
 .../Declaration/DataProvider/XMLGearData.cs   |  21 +
 .../Factory/IDeclarationInjectFactory.cs      |   4 +-
 ...ationInputDataMultistageV01InjectModule.cs |  55 +++
 .../Reader/Impl/XMLComponentReader.cs         |  17 +
 .../Reader/Impl/XMLDeclarationInputReader.cs  |   2 +-
 .../XMLDeclarationMultistageInputReader.cs    |  56 ++-
 .../Reader/Impl/XMLJobDataReader.cs           |  17 +
 ...ultistage_primary_vehicle_stage_2_full.xml |   4 +-
 .../XML/XMLMultistageBusDataTest.cs           | 437 +++++++++++++++++-
 22 files changed, 867 insertions(+), 23 deletions(-)

diff --git a/VectoCommon/VectoCommon/InputData/IInputDataProvider.cs b/VectoCommon/VectoCommon/InputData/IInputDataProvider.cs
index d8fdd5fc2a..440b8c6b2d 100644
--- a/VectoCommon/VectoCommon/InputData/IInputDataProvider.cs
+++ b/VectoCommon/VectoCommon/InputData/IInputDataProvider.cs
@@ -68,6 +68,8 @@ namespace TUGraz.VectoCommon.InputData
 
 		DigestData PrimaryVehicleInputDataHash { get; }
 
+		DigestData VehicleSignatureHash { get; }
+
 		IResultsInputData ResultsInputData { get; }
 
 		IApplicationInformation ApplicationInformation { get; }
diff --git a/VectoCommon/VectoCommon/Resources/XMLNames.Designer.cs b/VectoCommon/VectoCommon/Resources/XMLNames.Designer.cs
index 93dc8e5401..e256a7e643 100644
--- a/VectoCommon/VectoCommon/Resources/XMLNames.Designer.cs
+++ b/VectoCommon/VectoCommon/Resources/XMLNames.Designer.cs
@@ -717,6 +717,15 @@ namespace TUGraz.VectoCommon.Resources {
             }
         }
         
+        /// <summary>
+        ///   Looks up a localized string similar to PrimaryVehicle.
+        /// </summary>
+        public static string Bus_PrimaryVehicle {
+            get {
+                return ResourceManager.GetString("Bus_PrimaryVehicle", resourceCulture);
+            }
+        }
+        
         /// <summary>
         ///   Looks up a localized string similar to ResultCards.
         /// </summary>
diff --git a/VectoCommon/VectoCommon/Resources/XMLNames.resx b/VectoCommon/VectoCommon/Resources/XMLNames.resx
index 5eabf0880b..40d718a3d5 100644
--- a/VectoCommon/VectoCommon/Resources/XMLNames.resx
+++ b/VectoCommon/VectoCommon/Resources/XMLNames.resx
@@ -1422,4 +1422,7 @@
   <data name="VectoOutputMultistage" xml:space="preserve">
     <value>VectoOutputMultistage</value>
   </data>
+  <data name="Bus_PrimaryVehicle" xml:space="preserve">
+    <value>PrimaryVehicle</value>
+  </data>
 </root>
\ No newline at end of file
diff --git a/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLDeclarationAxlegearDataProvider.cs b/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLDeclarationAxlegearDataProvider.cs
index db695af2cd..b48d96e406 100644
--- a/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLDeclarationAxlegearDataProvider.cs
+++ b/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLDeclarationAxlegearDataProvider.cs
@@ -116,4 +116,23 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration.DataProvider
 			get { return NAMESPACE_URI; }
 		}
 	}
+
+	// ---------------------------------------------------------------------------------------
+
+	public class XMLDeclarationMultistagePrimaryVehicleBusAxlegearDataProviderV01 : XMLDeclarationAxlegearDataProviderV10
+	{
+		public new static XNamespace NAMESPACE_URI = XMLDefinitions.DECLARATION_MULTISTAGE_BUS_VEHICLE_NAMESPACE_VO1;
+
+		public new const string XSD_TYPE = "AxlegearDataPIFType";
+
+		public new static readonly string QUALIFIED_XSD_TYPE = XMLHelper.CombineNamespace(NAMESPACE_URI.NamespaceName, XSD_TYPE);
+
+		public XMLDeclarationMultistagePrimaryVehicleBusAxlegearDataProviderV01(IXMLDeclarationVehicleData vehicle, XmlNode componentNode, string sourceFile) 
+			: base(vehicle, componentNode, sourceFile) { }
+
+		protected override XNamespace SchemaNamespace
+		{
+			get { return NAMESPACE_URI; }
+		}
+	}
 }
diff --git a/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLDeclarationComponentsDataProvider.cs b/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLDeclarationComponentsDataProvider.cs
index d67d5da75b..3beb537134 100644
--- a/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLDeclarationComponentsDataProvider.cs
+++ b/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLDeclarationComponentsDataProvider.cs
@@ -288,6 +288,28 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration.DataProvider
 		#endregion
 	}
 
+	// ---------------------------------------------------------------------------------------
+
+	
+	public class XMLDeclarationComponentsMultistagePrimaryVehicleBusDataProviderV01 : XMLDeclarationComponentsPrimaryVehicleBusDataProviderV01
+	{
+		public new static readonly XNamespace NAMESPACE_URI = XMLDefinitions.DECLARATION_MULTISTAGE_BUS_VEHICLE_NAMESPACE_VO1;
+		
+		public new const string XSD_TYPE = "VehicleComponentsPIFType";
+
+		public new static readonly string QUALIFIED_XSD_TYPE = XMLHelper.CombineNamespace(NAMESPACE_URI.NamespaceName, XSD_TYPE);
+
+		public XMLDeclarationComponentsMultistagePrimaryVehicleBusDataProviderV01(IXMLDeclarationVehicleData vehicle,
+			XmlNode componentNode, string sourceFile) : base(vehicle, componentNode, sourceFile) { }
+
+		protected override XNamespace SchemaNamespace
+		{
+			get { return NAMESPACE_URI; }
+		}
+	}
+
+	
+	// ---------------------------------------------------------------------------------------
 
 	public class XMLDeclarationInterimStageBusComponentsDataProviderV28 : XMLDeclarationComponentsDataProviderV10,
 		IXMLVehicleComponentsDeclaration
diff --git a/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLDeclarationEngineDataProvider.cs b/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLDeclarationEngineDataProvider.cs
index db992c93b1..f07a6087fb 100644
--- a/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLDeclarationEngineDataProvider.cs
+++ b/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLDeclarationEngineDataProvider.cs
@@ -498,4 +498,19 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration.DataProvider
 			get { return NAMESPACE_URI; }
 		}
 	}
+
+	// ---------------------------------------------------------------------------------------
+
+	public class XMLDeclarationMultistagePrimaryVehicleBusEngineDataProviderV01 : XMLDeclarationPrimaryVehicleBusEngineDataProviderV01
+	{
+		public new static readonly XNamespace NAMESPACE_URI = XMLDefinitions.DECLARATION_MULTISTAGE_BUS_VEHICLE_NAMESPACE_VO1;
+
+		public new const string XSD_TYPE = "EngineDataPIFType";
+
+		public new static readonly string QUALIFIED_XSD_TYPE =
+			XMLHelper.CombineNamespace(NAMESPACE_URI.NamespaceName, XSD_TYPE);
+
+		public XMLDeclarationMultistagePrimaryVehicleBusEngineDataProviderV01(IXMLDeclarationVehicleData vehicle, XmlNode componentNode,
+			string sourceFile) : base(vehicle, componentNode, sourceFile) { }
+	}
 }
diff --git a/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLDeclarationGearboxDataProvider.cs b/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLDeclarationGearboxDataProvider.cs
index 25d2370f86..656f528311 100644
--- a/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLDeclarationGearboxDataProvider.cs
+++ b/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLDeclarationGearboxDataProvider.cs
@@ -165,4 +165,22 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration.DataProvider
 			get { return NAMESPACE_URI; }
 		}
 	}
+	
+	// ---------------------------------------------------------------------------------------
+
+	public class XMLDeclarationMultistagePrimaryVehicleBusGearboxDataProviderV01 : XMLDeclarationPrimaryVehicleBusGearboxDataProviderV01
+	{
+		public new static readonly XNamespace NAMESPACE_URI = XMLDefinitions.DECLARATION_MULTISTAGE_BUS_VEHICLE_NAMESPACE_VO1;
+
+		public new const string XSD_TYPE = "TransmissionDataPIFType";
+
+		public new static readonly string QUALIFIED_XSD_TYPE = XMLHelper.CombineNamespace(NAMESPACE_URI.NamespaceName, XSD_TYPE);
+
+		public XMLDeclarationMultistagePrimaryVehicleBusGearboxDataProviderV01(IXMLDeclarationVehicleData vehicle,
+			XmlNode componentNode, string sourceFile) : base(vehicle, componentNode, sourceFile) { }
+		protected override XNamespace SchemaNamespace
+		{
+			get { return NAMESPACE_URI; }
+		}
+	}
 }
diff --git a/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLDeclarationInputDataProvider.cs b/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLDeclarationInputDataProvider.cs
index 336500a52f..1705f01b4c 100644
--- a/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLDeclarationInputDataProvider.cs
+++ b/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLDeclarationInputDataProvider.cs
@@ -153,6 +153,8 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration
 			get { return Reader.GetDigestData(GetNode("InputDataSignature")); }
 		}
 
+		public DigestData VehicleSignatureHash { get { return null; } }
+
 		public DigestData ManufacturerRecordHash
 		{
 			get { return Reader.GetDigestData(GetNode("ManufacturerRecordSignature")); }
diff --git a/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLDeclarationJobInputDataProvider.cs b/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLDeclarationJobInputDataProvider.cs
index 1a7a223970..4ec71bf122 100644
--- a/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLDeclarationJobInputDataProvider.cs
+++ b/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLDeclarationJobInputDataProvider.cs
@@ -140,4 +140,43 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration.DataProvider
 		public IXMLJobDataReader Reader { protected get; set; }
 		public IXMLPrimaryVehicleBusInputData InputData { get; }
 	}
+
+
+	// ---------------------------------------------------------------------------------------
+
+	public class XMLDeclarationMultistagePrimaryVehicleBusJobInputDataProviderV01 : AbstractXMLResource,
+		IXMLPrimaryVehicleBusJobInputData
+	{
+		public static readonly XNamespace NAMESPACE_URI = XMLDefinitions.DECLARATION_MULTISTAGE_BUS_VEHICLE_NAMESPACE_VO1;
+
+		public const string XSD_TYPE = "VehiclePIFType";
+
+		public static readonly string QUALIFIED_XSD_TYPE = XMLHelper.CombineNamespace(NAMESPACE_URI.NamespaceName, XSD_TYPE);
+
+		protected IVehicleDeclarationInputData _vehicle;
+
+		public XMLDeclarationMultistagePrimaryVehicleBusJobInputDataProviderV01(XmlNode node, IXMLPrimaryVehicleBusInputData inputProvider,
+			string fileName) : base(node, fileName)
+		{
+			InputData = inputProvider;
+		}
+		protected override XNamespace SchemaNamespace
+		{
+			get { return NAMESPACE_URI; }
+		}
+
+		public IVehicleDeclarationInputData Vehicle
+		{
+			get { return _vehicle ?? (_vehicle = Reader.CreateVehicle); }
+		}
+
+		protected override DataSourceType SourceType { get; }
+		public bool SavedInDeclarationMode { get; }
+		public string JobName { get; }
+		public string ShiftStrategy { get{ return null; } }
+		public IXMLJobDataReader Reader { protected get; set; }
+		public IXMLPrimaryVehicleBusInputData InputData { get; }
+	}
+
+
 }
diff --git a/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLDeclarationMultistageInputData.cs b/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLDeclarationMultistageInputData.cs
index 149767eb7f..a409a46353 100644
--- a/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLDeclarationMultistageInputData.cs
+++ b/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLDeclarationMultistageInputData.cs
@@ -1,11 +1,16 @@
 using System;
 using System.Collections.Generic;
+using System.Linq;
 using System.Xml;
 using System.Xml.Linq;
 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;
+using TUGraz.VectoHashing;
 
 namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration.DataProvider
 {
@@ -79,7 +84,90 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration.DataProvider
 
 		public IXMLMultistageJobReader Reader { get; set; }
 		public IXMLMultistageInputDataProvider InputData { get; }
-		protected override XNamespace SchemaNamespace { get; }
+		protected override XNamespace SchemaNamespace
+		{
+			get { return NAMESPACE_URI; }
+		}
+		protected override DataSourceType SourceType { get; }
+	}
+
+
+	// ---------------------------------------------------------------------------------------
+	
+	public class XMLDeclarationMultistagePrimaryVehicleInputDataV01 :  AbstractXMLResource, IXMLPrimaryVehicleBusInputData
+	{
+		public static readonly XNamespace NAMESPACE_URI = XMLDefinitions.DECLARATION_MULTISTAGE_BUS_VEHICLE_NAMESPACE_VO1;
+
+		public const string XSD_TYPE = "PrimaryVehicleDataType";
+		
+		public static readonly string QUALIFIED_XSD_TYPE = XMLHelper.CombineNamespace(NAMESPACE_URI.NamespaceName, XSD_TYPE);
+
+		private IVehicleDeclarationInputData _vehicle;
+		private IApplicationInformation _applicationInformation;
+		private IResultsInputData _resultsInputData;
+		private XmlNode _signatureNode;
+
+		public XMLDeclarationMultistagePrimaryVehicleInputDataV01(XmlNode xmlNode, string fileName) 
+			: base(xmlNode, fileName)
+		{
+			SourceType = DataSourceType.XMLFile;
+			_signatureNode = xmlNode.LastChild;
+		}
+
+		protected override XNamespace SchemaNamespace
+		{
+			get { return NAMESPACE_URI; }
+		}
 		protected override DataSourceType SourceType { get; }
+
+		public IVehicleDeclarationInputData Vehicle
+		{
+			get { return _vehicle ?? (_vehicle = Reader.JobData.Vehicle); }
+		}
+
+		public DigestData PrimaryVehicleInputDataHash
+		{
+			get { return Reader.GetDigestData(GetNode("InputDataSignature")); }
+		}
+
+		public DigestData VehicleSignatureHash
+		{
+			get { return Reader.GetDigestData(_signatureNode); }
+		}
+
+		public DigestData ManufacturerRecordHash
+		{
+			get { return Reader.GetDigestData(GetNode("ManufacturerRecordSignature")); }
+		}
+
+		public IResultsInputData ResultsInputData
+		{
+			get { return _resultsInputData ?? (_resultsInputData = Reader.ResultsInputData); }
+		}
+		
+		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 XmlNode ResultsNode { get { return GetNode(XMLNames.Report_Results); } }
+
+		public IApplicationInformation ApplicationInformation
+		{
+			get { return _applicationInformation ?? (_applicationInformation = Reader.ApplicationInformation); }
+		}
+
+		public XmlNode ApplicationInformationNode
+		{
+			get { return GetNode(XMLNames.Tag_ApplicationInformation); }
+		}
+
+		public XElement XMLHash { get; }
+		public IXMLDeclarationPrimaryVehicleBusInputDataReader Reader { get; set; }
+
+		
 	}
 }
\ No newline at end of file
diff --git a/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLDeclarationPrimaryVehicleBusApplicationInformationDataProviderV01.cs b/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLDeclarationPrimaryVehicleBusApplicationInformationDataProviderV01.cs
index 3a2197108f..7ab263b7fe 100644
--- a/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLDeclarationPrimaryVehicleBusApplicationInformationDataProviderV01.cs
+++ b/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLDeclarationPrimaryVehicleBusApplicationInformationDataProviderV01.cs
@@ -35,4 +35,17 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration.DataProvider
 			get { return XmlConvert.ToDateTime(GetString(XMLNames.Report_ApplicationInfo_Date), XmlDateTimeSerializationMode.Utc); }
 		}
 	}
+
+	public class XMLDeclarationMultistagePrimaryVehicleBusApplicationInformationDataProviderV01 :
+		XMLDeclarationPrimaryVehicleBusApplicationInformationDataProviderV01
+	{
+		public new static XNamespace NAMESPACE_URI = XMLDefinitions.DECLARATION_MULTISTAGE_BUS_VEHICLE_NAMESPACE_VO1;
+
+		public new const string XSD_TYPE = "ApplicationInformationPrimaryVehicleType";
+
+		public new static readonly string QUALIFIED_XSD_TYPE = XMLHelper.CombineNamespace(NAMESPACE_URI.NamespaceName, XSD_TYPE);
+		
+		public XMLDeclarationMultistagePrimaryVehicleBusApplicationInformationDataProviderV01(XmlNode applicationNode) 
+			: base(applicationNode) { }
+	}
 }
\ No newline at end of file
diff --git a/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLDeclarationPrimaryVehicleBusResultsInputDataProviderV01.cs b/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLDeclarationPrimaryVehicleBusResultsInputDataProviderV01.cs
index dafcb0266a..61d93e7262 100644
--- a/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLDeclarationPrimaryVehicleBusResultsInputDataProviderV01.cs
+++ b/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLDeclarationPrimaryVehicleBusResultsInputDataProviderV01.cs
@@ -1,11 +1,7 @@
-using System;
-using System.Collections.Generic;
+using System.Collections.Generic;
 using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
 using System.Xml;
 using System.Xml.Linq;
-using Castle.Components.DictionaryAdapter.Xml;
 using TUGraz.VectoCommon.InputData;
 using TUGraz.VectoCommon.Models;
 using TUGraz.VectoCommon.Resources;
@@ -13,7 +9,6 @@ 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
@@ -96,4 +91,19 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration.DataProvider
 			};
 		}
 	}
+
+	// ---------------------------------------------------------------------------------------
+
+	public class XMLDeclarationMultistagePrimaryVehicleBusResultsInputDataProviderV01 :
+		XMLDeclarationPrimaryVehicleBusResultsInputDataProviderV01
+	{
+		public new static XNamespace NAMESPACE_URI = XMLDefinitions.DECLARATION_MULTISTAGE_BUS_VEHICLE_NAMESPACE_VO1;
+
+		public new const string XSD_TYPE = "ResultsPrimaryVehicleType";
+
+		public new static readonly string QUALIFIED_XSD_TYPE = XMLHelper.CombineNamespace(NAMESPACE_URI.NamespaceName, XSD_TYPE);
+
+		public XMLDeclarationMultistagePrimaryVehicleBusResultsInputDataProviderV01(XmlNode resultsNode) 
+			: base(resultsNode) { }
+	}
 }
diff --git a/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLDeclarationVehicleDataProvider.cs b/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLDeclarationVehicleDataProvider.cs
index 188dbe194a..4be0c766b4 100644
--- a/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLDeclarationVehicleDataProvider.cs
+++ b/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLDeclarationVehicleDataProvider.cs
@@ -1118,7 +1118,28 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration.DataProvider
 		}
 	}
 
-	
+	// ---------------------------------------------------------------------------------------
+
+	public class XMLDeclarationMultistagePrimaryVehicleBusDataProviderV01 : XMLDeclarationPrimaryVehicleBusDataProviderV01
+	{
+		public new static readonly XNamespace NAMESPACE_URI = XMLDefinitions.DECLARATION_MULTISTAGE_BUS_VEHICLE_NAMESPACE_VO1;
+
+		public new const string XSD_TYPE = "VehiclePIFType";
+
+		public new static readonly string QUALIFIED_XSD_TYPE = XMLHelper.CombineNamespace(NAMESPACE_URI.NamespaceName, XSD_TYPE);
+
+		public XMLDeclarationMultistagePrimaryVehicleBusDataProviderV01(IXMLPrimaryVehicleBusJobInputData busJobData,
+			XmlNode xmlNode, string sourceFile)
+			: base(busJobData, xmlNode, sourceFile) { }
+		
+		protected override XNamespace SchemaNamespace
+		{
+			get { return NAMESPACE_URI; }
+		}
+		protected override DataSourceType SourceType { get; }
+	}
+
+
 	// ---------------------------------------------------------------------------------------
 
 	public class XMLDeclarationInterimStageBusDataProviderV28 : XMLDeclarationVehicleDataProviderV20
diff --git a/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLGearData.cs b/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLGearData.cs
index 828a61afa9..982a95e1d4 100644
--- a/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLGearData.cs
+++ b/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLGearData.cs
@@ -142,4 +142,25 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration.DataProvider
 			get { return NAMESPACE_URI; }
 		}
 	}
+
+	// ---------------------------------------------------------------------------------------
+
+
+	public class XMLMultistagePrimaryVehicleBusTransmissionDataV01 : XMLGearDataV10
+	{
+		public new static readonly XNamespace NAMESPACE_URI = XMLDefinitions.DECLARATION_MULTISTAGE_BUS_VEHICLE_NAMESPACE_VO1;
+
+		public new const string XSD_TYPE = "TransmissionGearPIFType";
+
+		public new static readonly string QUALIFIED_XSD_TYPE = XMLHelper.CombineNamespace(NAMESPACE_URI.NamespaceName, XSD_TYPE);
+
+		public XMLMultistagePrimaryVehicleBusTransmissionDataV01(XmlNode gearNode, string sourceFile)
+			: base(gearNode, sourceFile) { }
+
+		protected override XNamespace SchemaNamespace
+		{
+			get { return NAMESPACE_URI; }
+		}
+	}
+
 }
diff --git a/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/Factory/IDeclarationInjectFactory.cs b/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/Factory/IDeclarationInjectFactory.cs
index 5983e72dfd..451a81949c 100644
--- a/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/Factory/IDeclarationInjectFactory.cs
+++ b/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/Factory/IDeclarationInjectFactory.cs
@@ -38,7 +38,9 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration.Factory
 		
 		IXMLDeclarationVehicleData CreatePrimaryVehicleData(
 			string version, IXMLPrimaryVehicleBusJobInputData busJobData, XmlNode xmlNode, string sourceFile);
-
+		
+		IXMLPrimaryVehicleBusInputData CreatePrimaryMultistageVehicleData(
+			string version, XmlNode xmlNode, string fileName);
 
 
 		IXMLVehicleComponentsDeclaration CreateComponentData(
diff --git a/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/NinjectModules/XMLDeclarationInputDataMultistageV01InjectModule.cs b/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/NinjectModules/XMLDeclarationInputDataMultistageV01InjectModule.cs
index 218144ded1..9458e0723c 100644
--- a/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/NinjectModules/XMLDeclarationInputDataMultistageV01InjectModule.cs
+++ b/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/NinjectModules/XMLDeclarationInputDataMultistageV01InjectModule.cs
@@ -1,6 +1,7 @@
 using Ninject.Modules;
 using TUGraz.VectoCore.InputData.FileIO.XML.Declaration.DataProvider;
 using TUGraz.VectoCore.InputData.FileIO.XML.Declaration.Interfaces;
+using TUGraz.VectoCore.InputData.FileIO.XML.Declaration.Reader;
 using TUGraz.VectoCore.InputData.FileIO.XML.Declaration.Reader.Impl;
 
 namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration.NinjectModules
@@ -23,6 +24,60 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration.NinjectModules
 
 			Bind<IXMLMultistageJobReader>().To<XMLMultistageJobReaderV01>()
 				.Named(XMLMultistageJobReaderV01.QUALIFIED_XSD_TYPE);
+
+			// -----------------------------------
+
+			Bind<IXMLPrimaryVehicleBusInputData>().To<XMLDeclarationMultistagePrimaryVehicleInputDataV01>()
+				.Named(XMLDeclarationMultistagePrimaryVehicleInputDataV01.QUALIFIED_XSD_TYPE);
+
+
+			Bind<IXMLDeclarationPrimaryVehicleBusInputDataReader>().To<XMLMultistagePrimaryVehicleReaderV01>()
+				.Named(XMLMultistagePrimaryVehicleReaderV01.QUALIFIED_XSD_TYPE);
+
+			
+			Bind<IXMLPrimaryVehicleBusJobInputData>().To<XMLDeclarationMultistagePrimaryVehicleBusJobInputDataProviderV01>()
+				.Named(XMLDeclarationMultistagePrimaryVehicleBusJobInputDataProviderV01.QUALIFIED_XSD_TYPE);
+
+
+			Bind<IXMLJobDataReader>().To<XMLJobDataMultistagePrimaryVehicleReaderV01>()
+				.Named(XMLJobDataMultistagePrimaryVehicleReaderV01.QUALIFIED_XSD_TYPE);
+
+			Bind<IXMLDeclarationVehicleData>().To<XMLDeclarationMultistagePrimaryVehicleBusDataProviderV01>()
+				.Named(XMLDeclarationMultistagePrimaryVehicleBusDataProviderV01.QUALIFIED_XSD_TYPE);
+
+
+			// -----------------------------------
+
+			Bind<IXMLComponentReader>().To<XMLMultistagePrimaryVehicleBusComponentReaderV01>()
+				.Named(XMLMultistagePrimaryVehicleBusComponentReaderV01.QUALIFIED_XSD_TYPE);
+
+			Bind<IXMLGearboxReader>().To<XMLMultistagePrimaryVehicleBusComponentReaderV01>()
+				.Named(XMLMultistagePrimaryVehicleBusComponentReaderV01.GEARBOX_READER_QUALIFIED_XSD_TYPE);
+
+			Bind<IXMLVehicleComponentsDeclaration>()
+				.To<XMLDeclarationComponentsMultistagePrimaryVehicleBusDataProviderV01>()
+				.Named(XMLDeclarationComponentsMultistagePrimaryVehicleBusDataProviderV01.QUALIFIED_XSD_TYPE);
+
+			// -----------------------------------
+
+			Bind<IXMLEngineDeclarationInputData>().To<XMLDeclarationMultistagePrimaryVehicleBusEngineDataProviderV01>()
+				.Named(XMLDeclarationMultistagePrimaryVehicleBusEngineDataProviderV01.QUALIFIED_XSD_TYPE);
+
+			Bind<IXMLGearboxDeclarationInputData>().To<XMLDeclarationMultistagePrimaryVehicleBusGearboxDataProviderV01>()
+				.Named(XMLDeclarationMultistagePrimaryVehicleBusGearboxDataProviderV01.QUALIFIED_XSD_TYPE);
+
+			Bind<IXMLGearData>().To<XMLMultistagePrimaryVehicleBusTransmissionDataV01>()
+				.Named(XMLMultistagePrimaryVehicleBusTransmissionDataV01.QUALIFIED_XSD_TYPE);
+
+			Bind<IXMLAxleGearInputData>().To<XMLDeclarationMultistagePrimaryVehicleBusAxlegearDataProviderV01>().Named(
+				XMLDeclarationMultistagePrimaryVehicleBusAxlegearDataProviderV01.QUALIFIED_XSD_TYPE);
+
+			Bind<IXMLApplicationInformationData>().To<XMLDeclarationMultistagePrimaryVehicleBusApplicationInformationDataProviderV01>()
+				.Named(XMLDeclarationMultistagePrimaryVehicleBusApplicationInformationDataProviderV01.QUALIFIED_XSD_TYPE);
+
+			Bind<IXMLResultsInputData>().To<XMLDeclarationMultistagePrimaryVehicleBusResultsInputDataProviderV01>()
+				.Named(XMLDeclarationMultistagePrimaryVehicleBusResultsInputDataProviderV01.QUALIFIED_XSD_TYPE);
+
 		}
 	}
 }
\ No newline at end of file
diff --git a/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/Reader/Impl/XMLComponentReader.cs b/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/Reader/Impl/XMLComponentReader.cs
index 1487632fdd..cfd6db1ef7 100644
--- a/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/Reader/Impl/XMLComponentReader.cs
+++ b/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/Reader/Impl/XMLComponentReader.cs
@@ -412,6 +412,23 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration.Reader.Impl
 		}
 	}
 
+	// ---------------------------------------------------------------------------------------
+
+	public class XMLMultistagePrimaryVehicleBusComponentReaderV01 : XMLPrimaryVehicleBusComponentReaderV01
+	{
+		public new static readonly XNamespace NAMESPACE_URI = XMLDefinitions.DECLARATION_MULTISTAGE_BUS_VEHICLE_NAMESPACE_VO1;
+
+		public new const string XSD_TYPE = "VehicleComponentsPIFType";
+		public new const string GEARBOX_READER_TYPE = "TransmissionDataPIFType";
+
+		public new static readonly string QUALIFIED_XSD_TYPE = XMLHelper.CombineNamespace(NAMESPACE_URI.NamespaceName, XSD_TYPE);
+		public new static readonly string GEARBOX_READER_QUALIFIED_XSD_TYPE = XMLHelper.CombineNamespace(NAMESPACE_URI, GEARBOX_READER_TYPE);
+		
+		public XMLMultistagePrimaryVehicleBusComponentReaderV01(IXMLDeclarationVehicleData vehicle, XmlNode componentsNode) 
+			: base(vehicle, componentsNode) { }
+	}
+	
+
 	// ---------------------------------------------------------------------------------------
 
 	public class XMLComponentReaderNoAxlegearV26 : XMLComponentReaderV20
diff --git a/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/Reader/Impl/XMLDeclarationInputReader.cs b/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/Reader/Impl/XMLDeclarationInputReader.cs
index 0fd34e5e01..044778c991 100644
--- a/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/Reader/Impl/XMLDeclarationInputReader.cs
+++ b/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/Reader/Impl/XMLDeclarationInputReader.cs
@@ -94,7 +94,7 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration.Reader.Impl
 			_primaryInputData = inputData;
 		}
 
-		public IDeclarationJobInputData JobData
+		public virtual IDeclarationJobInputData JobData
 		{
 			get
 			{
diff --git a/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/Reader/Impl/XMLDeclarationMultistageInputReader.cs b/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/Reader/Impl/XMLDeclarationMultistageInputReader.cs
index 08aaea621a..0ce7ed3a3e 100644
--- a/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/Reader/Impl/XMLDeclarationMultistageInputReader.cs
+++ b/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/Reader/Impl/XMLDeclarationMultistageInputReader.cs
@@ -42,7 +42,7 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration.Reader.Impl
 
 		protected virtual IDeclarationMultistageJobInputData JobCreator(string version, XmlNode node, string arg3)
 		{
-			var job = Factory.CreateMultiStageJobData(version, BaseNode, InputData,"foo"); //(InputData as IXMLResource).DataSource.SourceFile);
+			var job = Factory.CreateMultiStageJobData(version, BaseNode, InputData, (InputData as IXMLResource).DataSource.SourceFile);
 			job.Reader = Factory.CreateMultistageJobReader(version, job, JobNode);
 			return job;
 
@@ -60,21 +60,63 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration.Reader.Impl
 		public static readonly string QUALIFIED_XSD_TYPE = XMLHelper.CombineNamespace(NAMESPACE_URI.NamespaceName, XSD_TYPE);
 
 		protected IXMLDeclarationMultistageJobInputData InputData;
+		protected IPrimaryVehicleInformationInputDataProvider _primaryVehicle;
 
-		public XMLMultistageJobReaderV01(IXMLDeclarationMultistageJobInputData inputData, XmlNode baseNode) : base(
-			inputData, baseNode)
+
+		[Inject]
+		public IDeclarationInjectFactory Factory { protected get; set; }
+
+
+
+		public XMLMultistageJobReaderV01(IXMLDeclarationMultistageJobInputData inputData, XmlNode baseNode)
+			: base(inputData, baseNode)
 		{
 			InputData = inputData;
+
 		}
 
-		public IPrimaryVehicleInformationInputDataProvider PrimaryVehicle {
-			get { return null; }
+		public IPrimaryVehicleInformationInputDataProvider PrimaryVehicle
+		{
+			get { return _primaryVehicle ?? (_primaryVehicle = CreateComponent(XMLNames.Bus_PrimaryVehicle, PrimaryVehicleCreator)); }
 		}
-		public IList<IManufacturingStageInputData> ManufacturingStages {
-			get {
+		public IList<IManufacturingStageInputData> ManufacturingStages
+		{
+			get
+			{
 				//InputData.ManufacturingStages.Select(x => CreateComponent(x, ManufacturingStageCreator)).ToList();
 				return null;
 			}
 		}
+
+		protected IPrimaryVehicleInformationInputDataProvider PrimaryVehicleCreator(string version, XmlNode node,
+			string arg3)
+		{
+			var vehicle = Factory.CreatePrimaryMultistageVehicleData(version, node, arg3);
+			vehicle.Reader = Factory.CreatePrimaryVehicleBusInputReader(version, vehicle, node.FirstChild);
+			return vehicle;
+		}
+	}
+
+	// ---------------------------------------------------------------------------------------
+
+	
+	public class XMLMultistagePrimaryVehicleReaderV01 : XMLPrimaryVehicleBusInputReaderV01
+	{
+		public new static readonly XNamespace NAMESPACE_URI = XMLDefinitions.DECLARATION_MULTISTAGE_BUS_VEHICLE_NAMESPACE_VO1;
+
+		public new const string XSD_TYPE = "PrimaryVehicleDataType";
+
+		public new static readonly string QUALIFIED_XSD_TYPE = XMLHelper.CombineNamespace(NAMESPACE_URI.NamespaceName, XSD_TYPE);
+
+		public XMLMultistagePrimaryVehicleReaderV01(IXMLPrimaryVehicleBusInputData inputData, XmlNode baseNode)
+			: base(inputData, baseNode) { }
+
+		public override IDeclarationJobInputData JobData
+		{
+			get
+			{
+				return _jobData ?? (_jobData = CreateComponent(XMLNames.Tag_Vehicle, JobCreator));
+			}
+		}
 	}
 }
\ No newline at end of file
diff --git a/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/Reader/Impl/XMLJobDataReader.cs b/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/Reader/Impl/XMLJobDataReader.cs
index 74bc6a042f..aabcb27d14 100644
--- a/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/Reader/Impl/XMLJobDataReader.cs
+++ b/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/Reader/Impl/XMLJobDataReader.cs
@@ -146,4 +146,21 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration.Reader.Impl
 			return vehicle;
 		}
 	}
+
+
+	// ---------------------------------------------------------------------------------------
+
+
+	public class XMLJobDataMultistagePrimaryVehicleReaderV01 : XMLJobDataPrimaryVehicleReaderV01
+	{
+		public new static readonly XNamespace NAMESPACE_URI = XMLDefinitions.DECLARATION_MULTISTAGE_BUS_VEHICLE_NAMESPACE_VO1;
+
+		public new const string XSD_TYPE = "VehiclePIFType";
+
+		public new static readonly string QUALIFIED_XSD_TYPE = XMLHelper.CombineNamespace(NAMESPACE_URI.NamespaceName, XSD_TYPE);
+
+		public XMLJobDataMultistagePrimaryVehicleReaderV01(IXMLPrimaryVehicleBusJobInputData busJobData,
+			XmlNode jobNode) : base(busJobData, jobNode) { }
+	}
+
 }
diff --git a/VectoCore/VectoCoreTest/TestData/XML/XMLReaderDeclaration/SchemaVersionMultistage.0.1/vecto_multistage_primary_vehicle_stage_2_full.xml b/VectoCore/VectoCoreTest/TestData/XML/XMLReaderDeclaration/SchemaVersionMultistage.0.1/vecto_multistage_primary_vehicle_stage_2_full.xml
index 449565cb38..7c67942acc 100644
--- a/VectoCore/VectoCoreTest/TestData/XML/XMLReaderDeclaration/SchemaVersionMultistage.0.1/vecto_multistage_primary_vehicle_stage_2_full.xml
+++ b/VectoCore/VectoCoreTest/TestData/XML/XMLReaderDeclaration/SchemaVersionMultistage.0.1/vecto_multistage_primary_vehicle_stage_2_full.xml
@@ -27,7 +27,7 @@ xsi:schemaLocation="urn:tugraz:ivt:VectoAPI:DeclarationOutput:VehicleInterimFile
 				<ZeroEmissionVehicle>false</ZeroEmissionVehicle>
 				<ADAS xsi:type="v2.3:AdvancedDriverAssistantSystemsType">
 					<v2.3:EngineStopStart>true</v2.3:EngineStopStart>
-					<v2.3:EcoRollWithoutEngineStop>true</v2.3:EcoRollWithoutEngineStop>
+					<v2.3:EcoRollWithoutEngineStop>false</v2.3:EcoRollWithoutEngineStop>
 					<v2.3:EcoRollWithEngineStop>true</v2.3:EcoRollWithEngineStop>
 					<v2.3:PredictiveCruiseControl>1,2,3</v2.3:PredictiveCruiseControl>
 					<v2.3:APTEcoRollReleaseLockupClutch>false</v2.3:APTEcoRollReleaseLockupClutch>
@@ -213,7 +213,7 @@ xsi:schemaLocation="urn:tugraz:ivt:VectoAPI:DeclarationOutput:VehicleInterimFile
 											<Model>Generic Wheel</Model>
 											<CertificationNumber>e12*0815/8051*2017/05E0000*00</CertificationNumber>
 											<Date>2017-01-11T14:00:00Z</Date>
-											<AppVersion>Tyre Generation App 1.0</AppVersion>
+											<AppVersion>Tyre Generation App 1.1</AppVersion>
 											<Dimension>315/70 R22.5</Dimension>
 											<RRCDeclared>0.0055</RRCDeclared>
 											<FzISO>31300</FzISO>
diff --git a/VectoCore/VectoCoreTest/XML/XMLMultistageBusDataTest.cs b/VectoCore/VectoCoreTest/XML/XMLMultistageBusDataTest.cs
index 9e20550d2a..d0bb247370 100644
--- a/VectoCore/VectoCoreTest/XML/XMLMultistageBusDataTest.cs
+++ b/VectoCore/VectoCoreTest/XML/XMLMultistageBusDataTest.cs
@@ -2,13 +2,15 @@
 using System.Collections.Generic;
 using System.IO;
 using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
 using System.Xml;
 using Ninject;
 using NUnit.Framework;
+using TUGraz.VectoCommon.BusAuxiliaries;
 using TUGraz.VectoCommon.InputData;
+using TUGraz.VectoCommon.Models;
+using TUGraz.VectoCommon.Utils;
 using TUGraz.VectoCore.InputData.FileIO.XML;
+using TUGraz.VectoCore.Models.Declaration;
 
 namespace TUGraz.VectoCore.Tests.XML
 {
@@ -35,10 +37,437 @@ namespace TUGraz.VectoCore.Tests.XML
 		{
 			var reader = XmlReader.Create(VIF);
 			var inputDataProvider = xmlInputReader.Create(reader) as IMultistageBusInputDataProvider;
-			var vehicle = inputDataProvider.JobInputData.PrimaryVehicle;
+			TestPrimaryVehicleDataType(inputDataProvider.JobInputData.PrimaryVehicle);
+
+			//var prodStages = inputDataProvider.JobInputData.ManufacturingStages;
+		}
+
+
+		private void TestPrimaryVehicleDataType(IPrimaryVehicleInformationInputDataProvider primaryVehicle)
+		{
+			TestVehicleData(primaryVehicle.Vehicle);
+			TestADASData(primaryVehicle.Vehicle.ADAS);
+			TestTorqueLimitsData(primaryVehicle.Vehicle.TorqueLimits);
+			TestComponentsData(primaryVehicle.Vehicle.Components);
+			TestInputDataSignature(primaryVehicle.PrimaryVehicleInputDataHash);
+			TestManufacturerRecordSignatureData(primaryVehicle.ManufacturerRecordHash);
+			TestApplicationInformationData(primaryVehicle.ApplicationInformation);
+			TestResultsData(primaryVehicle.ResultsInputData);
+			TestSignatureHashData(primaryVehicle.VehicleSignatureHash);
+		}
+
+
+		#region Vehicle Test Methods
+		
+		private void TestVehicleData(IVehicleDeclarationInputData vehicleData)
+		{
+			Assert.AreEqual("Generic Truck Manufacturer", vehicleData.Manufacturer);
+			Assert.AreEqual("Street, ZIP City", vehicleData.ManufacturerAddress);
+			Assert.AreEqual("Generic Model", vehicleData.Model);
+			Assert.AreEqual("VEH-1234567890_nonSmart-ESS", vehicleData.VIN);
+			Assert.AreEqual(DateTime.Parse("2017-02-15T11:00:00Z").ToUniversalTime(), vehicleData.Date);
+			Assert.AreEqual("Bus", vehicleData.VehicleCategory.ToXMLFormat());
+			Assert.AreEqual(AxleConfiguration.AxleConfig_8x2, vehicleData.AxleConfiguration);
+			Assert.AreEqual(true, vehicleData.Articulated);
+			Assert.AreEqual(4000, vehicleData.GrossVehicleMassRating.Value());
+			Assert.AreEqual(600, vehicleData.EngineIdleSpeed.AsRPM);
+			Assert.AreEqual("Transmission Output Retarder", vehicleData.Components.RetarderInputData.Type.ToXMLFormat());
+			Assert.AreEqual("None", vehicleData.Components.AngledriveInputData.Type.ToXMLFormat());
+			Assert.AreEqual(false, vehicleData.ZeroEmissionVehicle);
+		}
+
+		private void TestADASData(IAdvancedDriverAssistantSystemDeclarationInputData adas)
+		{
+			Assert.AreEqual(true, adas.EngineStopStart);
+			Assert.AreEqual(EcoRollType.WithEngineStop, adas.EcoRoll);
+			Assert.AreEqual(PredictiveCruiseControlType.Option_1_2_3, adas.PredictiveCruiseControl);
+			Assert.AreEqual(false, adas.ATEcoRollReleaseLockupClutch);
+		}
+
+		private void TestTorqueLimitsData(IList<ITorqueLimitInputData> torqueLimits)
+		{
+			Assert.AreEqual(3, torqueLimits.Count);
+
+			Assert.AreEqual(6, torqueLimits[0].Gear);
+			Assert.AreEqual(1800, torqueLimits[0].MaxTorque.Value());
+
+			Assert.AreEqual(1, torqueLimits[1].Gear);
+			Assert.AreEqual(2500, torqueLimits[1].MaxTorque.Value());
+
+			Assert.AreEqual(12, torqueLimits[2].Gear);
+			Assert.AreEqual(1900, torqueLimits[2].MaxTorque.Value());
+		}
+
+		#endregion
+
+
+		private void TestComponentsData(IVehicleComponentsDeclaration vehicleComponents)
+		{
+			TestEngineData(vehicleComponents.EngineInputData);
+			TestTransmissionData(vehicleComponents.GearboxInputData);
+			TestAxelgearData(vehicleComponents.AxleGearInputData);
+			TestAxelWheelsData(vehicleComponents.AxleWheels);
+			TestAuxiliarieData(vehicleComponents.BusAuxiliaries);
+		}
+		#region Components Data Tests
+
+		#region Engine Data Test
+
+		private void TestEngineData(IEngineDeclarationInputData engineData)
+		{
+			Assert.AreEqual("Generic Engine Manufacturer", engineData.Manufacturer);
+			Assert.AreEqual("Bus 6x2", engineData.Model);
+			Assert.AreEqual("e12*0815/8051*2017/05E0000*00", engineData.CertificationNumber);
+			Assert.AreEqual(DateTime.Parse("2017-02-15T11:00:00Z").ToUniversalTime(), engineData.Date);
+			Assert.AreEqual("VectoEngine x.y", engineData.AppVersion);
+			Assert.AreEqual(12730.SI(Unit.SI.Cubic.Centi.Meter).Cast<CubicMeter>(), engineData.Displacement);
+			Assert.AreEqual(1800, engineData.RatedSpeedDeclared.AsRPM);
+			Assert.AreEqual(325032.SI<Watt>(), engineData.RatedPowerDeclared);
+			Assert.AreEqual(2134, engineData.MaxTorqueDeclared.Value());
+			Assert.AreEqual(WHRType.ElectricalOutput, engineData.WHRType);
+			TestEngineModes(engineData.EngineModes);
+		}
+
+		private void TestEngineModes(IList<IEngineModeDeclarationInputData> engineModes)
+		{
+			Assert.AreEqual(1, engineModes.Count);
+			Assert.AreEqual(600, engineModes[0].IdleSpeed.AsRPM);
+
+			var fullLoadCurve = engineModes[0].FullLoadCurve;
+			var entryIndex = 0;
+			Assert.IsTrue(CheckFullLoadAndDragCurveEntry("600.00", "1188.00", "-138.00", fullLoadCurve, ref entryIndex));
+			Assert.IsTrue(CheckFullLoadAndDragCurveEntry("800.00", "1661.00", "-143.00", fullLoadCurve, ref entryIndex));
+			Assert.IsTrue(CheckFullLoadAndDragCurveEntry("1000.00", "2134.00", "-152.00", fullLoadCurve, ref entryIndex));
+			Assert.IsTrue(CheckFullLoadAndDragCurveEntry("1200.00", "2134.00", "-165.00", fullLoadCurve, ref entryIndex));
+			Assert.IsTrue(CheckFullLoadAndDragCurveEntry("1400.00", "2134.00", "-187.00", fullLoadCurve, ref entryIndex));
+			Assert.IsTrue(CheckFullLoadAndDragCurveEntry("1600.00", "1928.00", "-217.00", fullLoadCurve, ref entryIndex));
+			Assert.IsTrue(CheckFullLoadAndDragCurveEntry("1800.00", "1722.00", "-244.00", fullLoadCurve, ref entryIndex));
+			Assert.IsTrue(CheckFullLoadAndDragCurveEntry("2000.00", "1253.00", "-278.00", fullLoadCurve, ref entryIndex));
+			Assert.IsTrue(CheckFullLoadAndDragCurveEntry("2100.00", "1019.00", "-296.00", fullLoadCurve, ref entryIndex));
+			Assert.IsTrue(CheckFullLoadAndDragCurveEntry("2200.00", "0.00", "-314.00", fullLoadCurve, ref entryIndex));
 			
-			var prodStages = inputDataProvider.JobInputData.ManufacturingStages;
+			Assert.AreEqual(1, engineModes[0].Fuels.Count);
+			Assert.AreEqual(FuelType.DieselCI, engineModes[0].Fuels.First().FuelType);
+		}
+
+		private bool CheckFullLoadAndDragCurveEntry(string engineSpeed, string maxTorque, string dragTorque, TableData loadCurve, ref int currentRow)
+		{
+			var result = engineSpeed == loadCurve.Rows[currentRow][0].ToString() &&
+						maxTorque == loadCurve.Rows[currentRow][1].ToString() &&
+						dragTorque == loadCurve.Rows[currentRow][2].ToString();
+
+			currentRow++;
+			return result;
+		}
+
+		#endregion
+
+		#region Transmission Data Test
+
+		private void TestTransmissionData(IGearboxDeclarationInputData transmissionData)
+		{
+			Assert.AreEqual("Generic Gearbox Manufacturer", transmissionData.Manufacturer);
+			Assert.AreEqual("Generic 40t Long Haul Truck Gearbox", transmissionData.Model);
+			Assert.AreEqual(CertificationMethod.StandardValues, transmissionData.CertificationMethod);
+			Assert.AreEqual(DateTime.Parse("2017-01-11T11:00:00Z").ToUniversalTime(), transmissionData.Date);
+			Assert.AreEqual("3.0.1", transmissionData.AppVersion);
+			Assert.AreEqual(GearboxType.AMT, transmissionData.Type);
+			Assert.AreEqual(12, transmissionData.Gears.Count);
+
+			var entryIndex = 0;
+			Assert.IsTrue(CheckTransmissionGear(1, 14.930, 1900, 2000, transmissionData.Gears[entryIndex], ref entryIndex));
+			Assert.IsTrue(CheckTransmissionGear(2, 11.640, 1900, 2000, transmissionData.Gears[entryIndex], ref entryIndex));
+			Assert.IsTrue(CheckTransmissionGear(3, 9.020, null, 2000, transmissionData.Gears[entryIndex], ref entryIndex));
+			Assert.IsTrue(CheckTransmissionGear(4, 7.040, null, 2000, transmissionData.Gears[entryIndex], ref entryIndex));
+			Assert.IsTrue(CheckTransmissionGear(5, 5.640, null, 2000, transmissionData.Gears[entryIndex], ref entryIndex));
+			Assert.IsTrue(CheckTransmissionGear(6, 4.400, null, 2000, transmissionData.Gears[entryIndex], ref entryIndex));
+			Assert.IsTrue(CheckTransmissionGear(7, 3.390, null, 2000, transmissionData.Gears[entryIndex], ref entryIndex));
+			Assert.IsTrue(CheckTransmissionGear(8, 2.650, null, 2000, transmissionData.Gears[entryIndex], ref entryIndex));
+			Assert.IsTrue(CheckTransmissionGear(9, 2.050, null, 2000, transmissionData.Gears[entryIndex], ref entryIndex));
+			Assert.IsTrue(CheckTransmissionGear(10, 1.600, null, 2000, transmissionData.Gears[entryIndex], ref entryIndex));
+			Assert.IsTrue(CheckTransmissionGear(11, 1.280, null, 2000, transmissionData.Gears[entryIndex], ref entryIndex));
+			Assert.IsTrue(CheckTransmissionGear(12, 1.000, null, null, transmissionData.Gears[entryIndex], ref entryIndex));
+		}
+
+		private bool CheckTransmissionGear(int gear, double ratio, int? maxTorque, double? maxSpeed, ITransmissionInputData entry, ref int entryIndex)
+		{
+			Assert.AreEqual(gear, entry.Gear);
+			Assert.AreEqual(ratio, entry.Ratio);
+
+			if(maxTorque == null)
+				Assert.IsNull(entry.MaxTorque);
+			else
+				Assert.AreEqual(((int) maxTorque).SI<NewtonMeter>(), entry.MaxTorque);
+
+			if(maxSpeed == null)
+				Assert.IsNull(entry.MaxInputSpeed);
+			else 
+				Assert.AreEqual((double)maxSpeed, entry.MaxInputSpeed.AsRPM, 1e-6);
+			
+			entryIndex++;
+			return true;
+		}
+
+		#endregion
+
+		#region Axelgear Test
+		private void TestAxelgearData(IAxleGearInputData axelgearData)
+		{
+			Assert.AreEqual("Generic Gearbox Manufacturer", axelgearData.Manufacturer);
+			Assert.AreEqual("Generic 40t Long Haul Truck AxleGear", axelgearData.Model);
+			Assert.AreEqual(CertificationMethod.StandardValues, axelgearData.CertificationMethod);
+			Assert.AreEqual(DateTime.Parse("2017-01-11T11:00:00Z").ToUniversalTime(), axelgearData.Date);
+			Assert.AreEqual("3.0.1", axelgearData.AppVersion);
+			Assert.AreEqual(AxleLineType.SinglePortalAxle, axelgearData.LineType);
+			Assert.AreEqual(2.590, axelgearData.Ratio);
+		}
+
+		#endregion
+
+		#region AxleWheels Data Test
+		private void TestAxelWheelsData(IAxlesDeclarationInputData axelWheels)
+		{
+			Assert.AreEqual(3, axelWheels.AxlesDeclaration.Count);
+			
+			var entry = axelWheels.AxlesDeclaration[0];
+			Assert.AreEqual(AxleType.VehicleNonDriven, entry.AxleType);
+			Assert.AreEqual(false, entry.TwinTyres);
+			
+			var tyre1 = entry.Tyre;
+			Assert.AreEqual("Generic Wheels Manufacturer", tyre1.Manufacturer);
+			Assert.AreEqual("Generic Wheel", tyre1.Model);
+			Assert.AreEqual("e12*0815/8051*2017/05E0000*00", tyre1.CertificationNumber);
+			Assert.AreEqual(DateTime.Parse("2017-01-11T14:00:00Z").ToUniversalTime(), tyre1.Date);
+			Assert.AreEqual("Tyre Generation App 1.0", tyre1.AppVersion);
+			Assert.AreEqual("315/70 R22.5", tyre1.Dimension);
+			Assert.AreEqual(0.0055, tyre1.RollResistanceCoefficient);
+			Assert.AreEqual(31300, tyre1.TyreTestLoad.Value());//85% of the maximum tyre payload
+
+			Assert.AreEqual("#WHL-5432198760-315-70-R22.5", tyre1.DigestValue.Reference);
+			Assert.AreEqual("urn:vecto:xml:2017:canonicalization", tyre1.DigestValue.CanonicalizationMethods[0]);
+			Assert.AreEqual("http://www.w3.org/2001/10/xml-exc-c14n#", tyre1.DigestValue.CanonicalizationMethods[1]);
+			Assert.AreEqual("http://www.w3.org/2001/04/xmlenc#sha256", tyre1.DigestValue.DigestMethod);
+			Assert.AreEqual("4TkUGQTX8tevHOU9Cj9uyCFuI/aqcEYlo/gyVjVQmv0=", tyre1.DigestValue.DigestValue);
+
+
+			entry = axelWheels.AxlesDeclaration[1];
+			Assert.AreEqual(AxleType.VehicleDriven, entry.AxleType);
+			Assert.AreEqual(true, entry.TwinTyres);
+
+			var tyre2 = entry.Tyre;
+			Assert.AreEqual("Generic Wheels Manufacturer", tyre2.Manufacturer);
+			Assert.AreEqual("Generic Wheel", tyre2.Model);
+			Assert.AreEqual("e12*0815/8051*2017/05E0000*00", tyre2.CertificationNumber);
+			Assert.AreEqual(DateTime.Parse("2017-01-11T14:00:00Z").ToUniversalTime(), tyre2.Date);
+			Assert.AreEqual("Tyre Generation App 1.0", tyre2.AppVersion);
+			Assert.AreEqual("315/70 R22.5", tyre2.Dimension);
+			Assert.AreEqual(0.0063, tyre2.RollResistanceCoefficient);
+			Assert.AreEqual(31300, tyre2.TyreTestLoad.Value());
+
+			Assert.AreEqual("#WHL-5432198760-315-70-R22.5", tyre2.DigestValue.Reference);
+			Assert.AreEqual("urn:vecto:xml:2017:canonicalization", tyre2.DigestValue.CanonicalizationMethods[0]);
+			Assert.AreEqual("http://www.w3.org/2001/10/xml-exc-c14n#", tyre2.DigestValue.CanonicalizationMethods[1]);
+			Assert.AreEqual("http://www.w3.org/2001/04/xmlenc#sha256", tyre2.DigestValue.DigestMethod);
+			Assert.AreEqual("KljvtvGUUQ/L7MiLVAqU+bckL5PNDNNwdeLH9kUVrfM=", tyre2.DigestValue.DigestValue);
+
+			entry = axelWheels.AxlesDeclaration[2];
+			Assert.AreEqual(AxleType.VehicleNonDriven, entry.AxleType);
+			Assert.AreEqual(false, entry.TwinTyres);
 
+			var tyre3 = entry.Tyre;
+			Assert.AreEqual("Generic Wheels Manufacturer", tyre3.Manufacturer);
+			Assert.AreEqual("Generic Wheel", tyre3.Model);
+			Assert.AreEqual("e12*0815/8051*2017/05E0000*00", tyre3.CertificationNumber);
+			Assert.AreEqual(DateTime.Parse("2017-01-11T14:00:00Z").ToUniversalTime(), tyre3.Date);
+			Assert.AreEqual("Tyre Generation App 1.1", tyre3.AppVersion);
+			Assert.AreEqual("315/70 R22.5", tyre3.Dimension);
+			Assert.AreEqual(0.0055, tyre3.RollResistanceCoefficient);
+			Assert.AreEqual(31300, tyre3.TyreTestLoad.Value());
+
+			Assert.AreEqual("#WHL-5432198760-315-70-R22.5", tyre3.DigestValue.Reference);
+			Assert.AreEqual("urn:vecto:xml:2017:canonicalization", tyre3.DigestValue.CanonicalizationMethods[0]);
+			Assert.AreEqual("http://www.w3.org/2001/10/xml-exc-c14n#", tyre3.DigestValue.CanonicalizationMethods[1]);
+			Assert.AreEqual("http://www.w3.org/2001/04/xmlenc#sha256", tyre3.DigestValue.DigestMethod);
+			Assert.AreEqual("4TkUGQTX8tevHOU9Cj9uyCFuI/aqcEYlo/gyVjVQmv0=", tyre3.DigestValue.DigestValue);
+		}
+
+
+		#endregion
+		
+		#region Auxiliaries Test
+		private void TestAuxiliarieData(IBusAuxiliariesDeclarationData aux)
+		{
+			Assert.AreEqual("Hydraulic driven - Constant displacement pump", aux.FanTechnology);
+			
+			Assert.AreEqual(1, aux.SteeringPumpTechnology.Count);
+			Assert.AreEqual("Variable displacement elec. controlled", aux.SteeringPumpTechnology[0]);
+
+			Assert.AreEqual(1, aux.ElectricSupply.Alternators.Count);
+			Assert.AreEqual("default", aux.ElectricSupply.Alternators[0].Technology);
+			Assert.AreEqual(true, aux.ElectricSupply.SmartElectrics);
+			Assert.AreEqual(15000, aux.ElectricSupply.MaxAlternatorPower.Value());
+			Assert.AreEqual(50.SI(Unit.SI.Watt.Hour).Cast<WattSecond>(), aux.ElectricSupply.ElectricStorageCapacity);
+			
+			Assert.AreEqual("Large Supply 2-stage", aux.PneumaticSupply.CompressorSize);
+			Assert.AreEqual("none", aux.PneumaticSupply.Clutch);
+			Assert.AreEqual(1.000, aux.PneumaticSupply.Ratio);
+			Assert.AreEqual(true, aux.PneumaticSupply.SmartAirCompression);
+			Assert.AreEqual(false, aux.PneumaticSupply.SmartRegeneration);
+			Assert.AreEqual(ConsumerTechnology.Electrically, aux.PneumaticConsumers.AirsuspensionControl);
+			Assert.AreEqual(ConsumerTechnology.Electrically, aux.PneumaticConsumers.AirsuspensionControl);
+			Assert.AreEqual(ConsumerTechnology.Pneumatically, aux.PneumaticConsumers.AdBlueDosing); 
+
+			Assert.AreEqual(true, aux.HVACAux.AdjustableCoolantThermostat);
+			Assert.AreEqual(true, aux.HVACAux.EngineWasteGasHeatExchanger);
+		}
+
+		#endregion
+
+		#endregion
+
+		#region Input Data Signature Test
+
+		private void TestInputDataSignature(DigestData data)
+		{
+			Assert.AreEqual("#VEH-PrimaryBus_SmartPS", data.Reference);
+			Assert.AreEqual("urn:vecto:xml:2017:canonicalization", data.CanonicalizationMethods[0]);
+			Assert.AreEqual("http://www.w3.org/2001/10/xml-exc-c14n#", data.CanonicalizationMethods[1]);
+			Assert.AreEqual("http://www.w3.org/2001/04/xmlenc#sha256", data.DigestMethod);
+			Assert.AreEqual("uqcFIXtDYxvl513ruiYYJCrV1fIiyw37t8vJhg4xxoo=", data.DigestValue);
+		}
+
+		#endregion
+
+		#region Input Data Manufacturer Signature Test
+
+		private void TestManufacturerRecordSignatureData(DigestData data)
+		{
+			Assert.AreEqual("#RESULT-5f30c7fe665a47938f6b", data.Reference);
+			Assert.AreEqual("urn:vecto:xml:2017:canonicalization", data.CanonicalizationMethods[0]);
+			Assert.AreEqual("http://www.w3.org/2001/10/xml-exc-c14n#", data.CanonicalizationMethods[1]);
+			Assert.AreEqual("http://www.w3.org/2001/04/xmlenc#sha256", data.DigestMethod);
+			Assert.AreEqual("KUpFCKh1bu/YPwYj36kJK1uCrv++BTLf2OUZcOt43Os=", data.DigestValue);
+		}
+
+		#endregion
+
+		#region Application Information Test
+		
+		private void TestApplicationInformationData(IApplicationInformation appInfo)
+		{
+			Assert.AreEqual("String", appInfo.SimulationToolVersion);
+			Assert.AreEqual(DateTime.Parse("2017-01-01T00:00:00Z").ToUniversalTime(), appInfo.Date);
+		}
+
+		#endregion
+
+		#region Results Data Test
+		
+		private void TestResultsData(IResultsInputData data)
+		{
+			Assert.AreEqual("success", data.Status);
+			Assert.AreEqual(22, data.Results.Count);
+
+			var index = 0;
+			CheckResultData(VehicleClass.ClassP33SD, MissionType.HeavyUrban, 21.22359, data.Results[index]);
+			CheckSimulationParameters(15527.52, 1352.52, 19.89, "single fuel mode", data.Results[index], ref index);
+
+			CheckResultData(VehicleClass.ClassP33SD, MissionType.HeavyUrban, 25.40945, data.Results[index]);
+			CheckSimulationParameters(20937.60, 6762.60, 99.45, "single fuel mode", data.Results[index], ref index);
+
+			CheckResultData(VehicleClass.ClassP33SD, MissionType.Urban, 16.74101, data.Results[index]);
+			CheckSimulationParameters(15527.52, 1352.52, 19.89, "single fuel mode", data.Results[index], ref index);
+
+			CheckResultData(VehicleClass.ClassP33SD, MissionType.Urban, 20.24221, data.Results[index]);
+			CheckSimulationParameters(20937.60, 6762.60, 99.45, "single fuel mode", data.Results[index], ref index);
+
+			CheckResultData(VehicleClass.ClassP33SD, MissionType.Suburban, 14.34578, data.Results[index]);
+			CheckSimulationParameters(15527.52, 1352.52, 19.89, "single fuel mode", data.Results[index], ref index);
+
+			CheckResultData(VehicleClass.ClassP33SD, MissionType.Suburban, 17.60016, data.Results[index]);
+			CheckSimulationParameters(20937.60, 6762.60, 99.45, "single fuel mode", data.Results[index], ref index);
+
+			CheckResultData(VehicleClass.ClassP33SD, MissionType.Interurban, 11.82313, data.Results[index]);
+			CheckSimulationParameters(15469.51, 1294.51, 18.23, "single fuel mode", data.Results[index], ref index);
+
+			CheckResultData(VehicleClass.ClassP33SD, MissionType.Interurban, 13.24283, data.Results[index]);
+			CheckSimulationParameters(18411.57, 4236.57, 59.67, "single fuel mode", data.Results[index], ref index);
+
+			CheckResultData(VehicleClass.ClassP33DD, MissionType.HeavyUrban, 22.72091, data.Results[index]);
+			CheckSimulationParameters(16303.29, 1578.29, 23.21, "single fuel mode", data.Results[index], ref index);
+
+			CheckResultData(VehicleClass.ClassP33DD, MissionType.HeavyUrban, 27.95930, data.Results[index]);
+			CheckSimulationParameters(22616.43, 7891.43, 116.05, "single fuel mode", data.Results[index], ref index);
+
+			CheckResultData(VehicleClass.ClassP33DD, MissionType.Urban, 17.90756, data.Results[index]);
+			CheckSimulationParameters(16303.29, 1578.29, 23.21, "single fuel mode", data.Results[index], ref index);
+
+			CheckResultData(VehicleClass.ClassP33DD, MissionType.Urban, 22.23796, data.Results[index]);
+			CheckSimulationParameters(22616.43, 7891.43, 116.05, "single fuel mode", data.Results[index], ref index);
+
+			CheckResultData(VehicleClass.ClassP33DD, MissionType.Suburban, 15.28035, data.Results[index]);
+			CheckSimulationParameters(16303.29, 1578.29, 23.21, "single fuel mode", data.Results[index], ref index);
+
+			CheckResultData(VehicleClass.ClassP33DD, MissionType.Suburban, 19.26201, data.Results[index]);
+			CheckSimulationParameters(22616.43, 7891.43, 116.05, "single fuel mode", data.Results[index], ref index);
+
+			CheckResultData(VehicleClass.ClassP34SD, MissionType.Interurban, 11.93701, data.Results[index]);
+			CheckSimulationParameters(16467.68, 1254.68, 17.67, "single fuel mode", data.Results[index], ref index);
+
+			CheckResultData(VehicleClass.ClassP34SD, MissionType.Interurban, 13.32341, data.Results[index]);
+			CheckSimulationParameters(19319.21, 4106.21, 57.83, "single fuel mode", data.Results[index], ref index);
+
+			CheckResultData(VehicleClass.ClassP34SD, MissionType.Coach, 8.71847, data.Results[index]);
+			CheckSimulationParameters(16490.49, 1277.49, 17.99, "single fuel mode", data.Results[index], ref index);
+
+			CheckResultData(VehicleClass.ClassP34SD, MissionType.Coach, 9.20255, data.Results[index]);
+			CheckSimulationParameters(18406.72, 3193.72, 44.98, "single fuel mode", data.Results[index], ref index);
+
+			CheckResultData(VehicleClass.ClassP34DD, MissionType.Interurban, 13.58335, data.Results[index]);
+			CheckSimulationParameters(19588.08, 1738.08, 24.48, "single fuel mode", data.Results[index], ref index);
+
+			CheckResultData(VehicleClass.ClassP34DD, MissionType.Interurban, 15.56740, data.Results[index]);
+			CheckSimulationParameters(23643.60, 5793.60, 81.60, "single fuel mode", data.Results[index], ref index);
+
+			CheckResultData(VehicleClass.ClassP34DD, MissionType.Coach, 9.82937, data.Results[index]);
+			CheckSimulationParameters(19703.95, 1853.95, 26.11, "single fuel mode", data.Results[index], ref index);
+
+			CheckResultData(VehicleClass.ClassP34DD, MissionType.Coach, 10.56728, data.Results[index]);
+			CheckSimulationParameters(22484.88, 4634.88, 65.28, "single fuel mode", data.Results[index], ref index);
+		}
+
+		private void CheckResultData(VehicleClass vGroup, MissionType mission, double energyCon,  IResult result)
+		{
+			Assert.AreEqual(vGroup, result.VehicleGroup);
+			Assert.AreEqual(mission, result.Mission);
+			Assert.AreEqual(FuelType.DieselCI, result.EnergyConsumption.First().Key);
+			energyCon = energyCon * 1000;
+			Assert.AreEqual(energyCon.SI<JoulePerMeter>(), result.EnergyConsumption.First().Value);
+		}
+
+		private void CheckSimulationParameters(double totalMass, double payload, double passenger, string fuelMode, IResult result, ref int index)
+		{
+			Assert.AreEqual(totalMass.SI<Kilogram>(), result.SimulationParameter.TotalVehicleMass);
+			Assert.AreEqual(payload.SI<Kilogram>(), result.SimulationParameter.Payload);
+			Assert.AreEqual(passenger, result.SimulationParameter.PassengerCount);
+			Assert.AreEqual(fuelMode, result.SimulationParameter.FuelMode);
+
+			index++;
+		}
+
+		#endregion
+
+		#region Signature Test
+
+		private void TestSignatureHashData(DigestData data)
+		{
+			Assert.AreEqual("#PIF-d10aff76c5d149948046", data.Reference);
+			Assert.AreEqual("urn:vecto:xml:2017:canonicalization", data.CanonicalizationMethods[0]);
+			Assert.AreEqual("http://www.w3.org/2001/10/xml-exc-c14n#", data.CanonicalizationMethods[1]);
+			Assert.AreEqual("http://www.w3.org/2001/04/xmlenc#sha256", data.DigestMethod);
+			Assert.AreEqual("nI+57QQtWA2rFqJTZ41t0XrXcJbcGmc7j4E66iGJyT0=", data.DigestValue);
 		}
+		
+		#endregion
 	}
 }
-- 
GitLab