From 3523283f22cc5610f01982ccf0607331b40b994f Mon Sep 17 00:00:00 2001
From: Markus Quaritsch <markus.quaritsch@tugraz.at>
Date: Wed, 3 May 2017 10:52:48 +0200
Subject: [PATCH] make engineering xml writing tests work

---
 .../XMLEngineeringJobInputDataProvider.cs     |  44 +++-----
 .../OutputData/XML/AbstractXMLWriter.cs       |  24 +---
 .../OutputData/XML/XMLDeclarationWriter.cs    |  96 ++++++++++------
 .../OutputData/XML/XMLEngineeringWriter.cs    | 105 +++++++++++++-----
 VectoCore/VectoCore/Resources/XMLNames.resx   |  66 +++++++++++
 .../XSD/VectoEngineeringDefinitions.0.7.xsd   |  86 +++++++-------
 VectoCore/VectoCoreTest/XML/XMLWritingTest.cs |   8 +-
 7 files changed, 271 insertions(+), 158 deletions(-)

diff --git a/VectoCore/VectoCore/InputData/FileIO/XML/Engineering/XMLEngineeringJobInputDataProvider.cs b/VectoCore/VectoCore/InputData/FileIO/XML/Engineering/XMLEngineeringJobInputDataProvider.cs
index 0de4146d14..863989dab0 100644
--- a/VectoCore/VectoCore/InputData/FileIO/XML/Engineering/XMLEngineeringJobInputDataProvider.cs
+++ b/VectoCore/VectoCore/InputData/FileIO/XML/Engineering/XMLEngineeringJobInputDataProvider.cs
@@ -38,8 +38,7 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Engineering
 
 		public IList<ICycleData> Cycles
 		{
-			get
-			{
+			get {
 				var retVal = new List<ICycleData>();
 				var cycles = Navigator.Select(Helper.Query(XBasePath, XMLNames.VectoJob_MissionCycles,
 					Helper.QueryConstraint(XMLNames.Missions_Cycle, XMLNames.ExtResource_Type_Attr,
@@ -72,8 +71,7 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Engineering
 
 		public bool EngineOnlyMode
 		{
-			get
-			{
+			get {
 				return ElementExists(XMLNames.VectoJob_EngineOnlyMode) &&
 						XmlConvert.ToBoolean(GetElementValue(XMLNames.VectoJob_EngineOnlyMode));
 			}
@@ -81,8 +79,7 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Engineering
 
 		protected internal Second DownshiftAfterUpshiftDelay
 		{
-			get
-			{
+			get {
 				return
 					ElementExists(Helper.Query(XMLNames.Component_DriverModel, XMLNames.DriverModel_ShiftStrategyParameters,
 						"DownshiftAfterUpshiftDelay"))
@@ -94,8 +91,7 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Engineering
 
 		protected internal Second UpshiftAfterDownshiftDelay
 		{
-			get
-			{
+			get {
 				return
 					ElementExists(Helper.Query(XMLNames.Component_DriverModel, XMLNames.DriverModel_ShiftStrategyParameters,
 						"UpshiftAfterDownshiftDelay"))
@@ -107,8 +103,7 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Engineering
 
 		protected internal MeterPerSquareSecond UpshiftMinAcceleration
 		{
-			get
-			{
+			get {
 				return
 					ElementExists(Helper.Query(XMLNames.Component_DriverModel, XMLNames.DriverModel_ShiftStrategyParameters,
 						"UpshiftMinAcceleration"))
@@ -122,18 +117,16 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Engineering
 
 		public string JobName
 		{
-			get
-			{
+			get {
 				return InputData.JobInputData().EngineOnlyMode
-					? InputData.EngineInputData.TechnicalReportId
+					? InputData.EngineInputData.Model
 					: InputData._vehicleInputData.GetVehicleID;
 			}
 		}
 
 		public double TorqueReserve
 		{
-			get
-			{
+			get {
 				return
 					ElementExists(Helper.Query(XMLNames.Component_DriverModel, XMLNames.DriverModel_ShiftStrategyParameters,
 						XMLNames.DriverModel_ShiftStrategyParameters_TorqueReserve))
@@ -145,8 +138,7 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Engineering
 
 		public Second MinTimeBetweenGearshift
 		{
-			get
-			{
+			get {
 				return
 					ElementExists(Helper.Query(XMLNames.Component_DriverModel, XMLNames.DriverModel_ShiftStrategyParameters,
 						XMLNames.DriverModel_ShiftStrategyParameters_TimeBetweenGearshift))
@@ -158,8 +150,7 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Engineering
 
 		public MeterPerSecond StartSpeed
 		{
-			get
-			{
+			get {
 				return
 					ElementExists(Helper.Query(XMLNames.Component_DriverModel, XMLNames.DriverModel_ShiftStrategyParameters,
 						XMLNames.DriverModel_ShiftStrategyParameters_StartSpeed))
@@ -171,8 +162,7 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Engineering
 
 		public MeterPerSquareSecond StartAcceleration
 		{
-			get
-			{
+			get {
 				return
 					ElementExists(Helper.Query(XMLNames.Component_DriverModel, XMLNames.DriverModel_ShiftStrategyParameters,
 						XMLNames.DriverModel_ShiftStrategyParameters_StartAcceleration))
@@ -184,8 +174,7 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Engineering
 
 		public double StartTorqueReserve
 		{
-			get
-			{
+			get {
 				return
 					ElementExists(Helper.Query(XMLNames.Component_DriverModel, XMLNames.DriverModel_ShiftStrategyParameters,
 						XMLNames.DriverModel_ShiftStrategyParameters_StartTorqueReserve))
@@ -198,8 +187,7 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Engineering
 
 		public Second PowershiftShiftTime
 		{
-			get
-			{
+			get {
 				return
 					ElementExists(Helper.Query(XMLNames.Component_DriverModel, XMLNames.DriverModel_ShiftStrategyParameters,
 						"PowershiftShiftTime"))
@@ -211,8 +199,7 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Engineering
 
 		public MeterPerSquareSecond CCUpshiftMinAcceleration
 		{
-			get
-			{
+			get {
 				return
 					ElementExists(Helper.Query(XMLNames.Component_DriverModel, XMLNames.DriverModel_ShiftStrategyParameters,
 						"CCUpshiftMinAcceleration"))
@@ -224,8 +211,7 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Engineering
 
 		public MeterPerSquareSecond CLUpshiftMinAcceleration
 		{
-			get
-			{
+			get {
 				return
 					ElementExists(Helper.Query(XMLNames.Component_DriverModel, XMLNames.DriverModel_ShiftStrategyParameters,
 						"CLUpshiftMinAcceleration"))
diff --git a/VectoCore/VectoCore/OutputData/XML/AbstractXMLWriter.cs b/VectoCore/VectoCore/OutputData/XML/AbstractXMLWriter.cs
index 216a296f2e..9f84f91c41 100644
--- a/VectoCore/VectoCore/OutputData/XML/AbstractXMLWriter.cs
+++ b/VectoCore/VectoCore/OutputData/XML/AbstractXMLWriter.cs
@@ -20,7 +20,7 @@ namespace TUGraz.IVT.VectoXML.Writer
 		protected XNamespace rootNamespace;
 		protected XNamespace di;
 
-		private const string Creator = "TU Graz, IVT-EM XML Exporter";
+		protected const string Creator = "TU Graz, IVT-EM XML Exporter";
 		protected readonly string Vendor;
 
 		protected readonly string BasePath;
@@ -34,28 +34,6 @@ namespace TUGraz.IVT.VectoXML.Writer
 			di = "http://www.w3.org/2000/09/xmldsig#";
 		}
 
-		protected XElement[] GetDefaultComponentElements(string componentId, string makeAndModel)
-		{
-			return new[] {
-				new XElement(tns + XMLNames.Component_Manufacturer, string.Format("{0,-5}", Vendor)),
-				new XElement(tns + XMLNames.Component_Model, string.Format("{0,-10}", makeAndModel)),
-				new XElement(tns + XMLNames.Component_TechnicalReportId, string.Format("{0,-10}", componentId)),
-				new XElement(tns + XMLNames.Component_Date, XmlConvert.ToString(DateTime.Now, XmlDateTimeSerializationMode.Utc)),
-				new XElement(tns + XMLNames.Component_AppVersion, "VectoCore"),
-			};
-		}
-
-		protected XElement[] GetDefaultComponentElements(string vin, string makeAndModel, string address)
-		{
-			return new[] {
-				new XElement(tns + XMLNames.Component_Manufacturer, String.Format("{0,-5}", Vendor)),
-				new XElement(tns + XMLNames.Component_ManufacturerAddress, address),
-				new XElement(tns + XMLNames.Component_Model, string.Format("{0,-10}", makeAndModel)),
-				new XElement(tns + XMLNames.Vehicle_VIN, string.Format("{0,-10}", vin)),
-				new XElement(tns + XMLNames.Component_Date, XmlConvert.ToString(DateTime.Now, XmlDateTimeSerializationMode.Utc)),
-			};
-		}
-
 		protected object[] EmbedDataTable(DataTable table, Dictionary<string, string> mapping, string tagName = "Entry",
 			Dictionary<string, uint> precision = null)
 		{
diff --git a/VectoCore/VectoCore/OutputData/XML/XMLDeclarationWriter.cs b/VectoCore/VectoCore/OutputData/XML/XMLDeclarationWriter.cs
index 85ed7e47fa..725b98ead0 100644
--- a/VectoCore/VectoCore/OutputData/XML/XMLDeclarationWriter.cs
+++ b/VectoCore/VectoCore/OutputData/XML/XMLDeclarationWriter.cs
@@ -1,6 +1,7 @@
 using System;
 using System.Collections.Generic;
 using System.Linq;
+using System.Xml;
 using System.Xml.Linq;
 using DocumentFormat.OpenXml.Drawing.Diagrams;
 using TUGraz.IVT.VectoXML;
@@ -98,20 +99,20 @@ namespace TUGraz.VectoCore.OutputData.XML
 			return new XElement(tns + XMLNames.Component_Vehicle,
 				new XAttribute(XMLNames.Component_ID_Attr, "VEH-" + vehicle.Model),
 				GetDefaultComponentElements(vehicle.TechnicalReportId, vehicle.Model, "N.A."),
-				new XElement(tns + "LegislativeClass", "N3"),
+				new XElement(tns + XMLNames.Vehicle_LegislativeClass, "N3"),
 				new XElement(tns + XMLNames.Vehicle_VehicleCategory, GetVehicleCategoryXML(vehicle.VehicleCategory)),
 				new XElement(tns + XMLNames.Vehicle_AxleConfiguration, vehicle.AxleConfiguration.GetName()),
 				new XElement(tns + XMLNames.Vehicle_CurbMassChassis, vehicle.CurbMassChassis.ToXMLFormat(0)),
 				new XElement(tns + XMLNames.Vehicle_GrossVehicleMass, vehicle.GrossVehicleMassRating.ToXMLFormat(0)),
-				new XElement(tns + "IdlingSpeed", data.EngineInputData.IdleSpeed.ToXMLFormat(0)),
+				new XElement(tns + XMLNames.Vehicle_IdlingSpeed, data.EngineInputData.IdleSpeed.ToXMLFormat(0)),
 				new XElement(tns + XMLNames.Vehicle_RetarderType, GetRetarterTypeXML(retarder.Type)),
 				retarder.Type.IsDedicatedComponent()
 					? new XElement(tns + XMLNames.Vehicle_RetarderRatio, retarder.Ratio.ToXMLFormat(3))
 					: null,
 				new XElement(tns + XMLNames.Vehicle_AngledriveType, angledrive.Type.ToXMLFormat()),
-				new XElement(tns + "PTO",
-					new XElement(tns + "PTOShaftsGearWheels", "none"),
-					new XElement(tns + "PTOOtherElements", "none")),
+				new XElement(tns + XMLNames.Vehicle_PTO,
+					new XElement(tns + XMLNames.Vehicle_PTO_ShaftsGearWheels, "none"),
+					new XElement(tns + XMLNames.Vehicle_PTO_OtherElements, "none")),
 				// ToDo: TorqueLimits
 				new XElement(tns + XMLNames.Vehicle_Components,
 					CreateEngine(data.EngineInputData),
@@ -131,22 +132,22 @@ namespace TUGraz.VectoCore.OutputData.XML
 			var id = string.Format("ENG-{0}", data.Model.RemoveWhitespace());
 			var fld = EngineFullLoadCurve.Create(data.FullLoadCurve, true);
 			return new XElement(tns + XMLNames.Component_Engine,
-				new XAttribute("certificationNumber", string.Format("ENG-{0}", data.Model)),
+				new XAttribute(XMLNames.Component_CertificationNumber, string.Format("ENG-{0}", data.Model)),
 				new XElement(tns + XMLNames.ComponentDataWrapper,
 					new XAttribute(XMLNames.Component_ID_Attr, id),
 					GetDefaultComponentElements(string.Format("ENG-{0}", data.Model), data.Model),
 					new XElement(tns + XMLNames.Engine_Displacement, (data.Displacement.Value() * 1000 * 1000).ToXMLFormat(0)),
 					new XElement(tns + XMLNames.Engine_IdlingSpeed, data.IdleSpeed.AsRPM.ToXMLFormat(0)),
-					new XElement(tns + "RatedSpeed", fld.RatedSpeed.AsRPM.ToXMLFormat(0)),
-					new XElement(tns + "RatedPower", fld.FullLoadStationaryPower(fld.RatedSpeed).ToXMLFormat(0)),
-					new XElement(tns + "MaxEngineTorque", fld.MaxLoadTorque.ToXMLFormat(0)),
+					new XElement(tns + XMLNames.Engine_RatedSpeed, fld.RatedSpeed.AsRPM.ToXMLFormat(0)),
+					new XElement(tns + XMLNames.Engine_RatedPower, fld.FullLoadStationaryPower(fld.RatedSpeed).ToXMLFormat(0)),
+					new XElement(tns + XMLNames.Engine_MaxTorque, fld.MaxLoadTorque.ToXMLFormat(0)),
 					new XElement(tns + XMLNames.Engine_WHTCUrban, data.WHTCUrban.ToXMLFormat(4)),
 					new XElement(tns + XMLNames.Engine_WHTCRural, data.WHTCRural.ToXMLFormat(4)),
 					new XElement(tns + XMLNames.Engine_WHTCMotorway, data.WHTCMotorway.ToXMLFormat(4)),
 					new XElement(tns + XMLNames.Engine_ColdHotBalancingFactor, data.ColdHotBalancingFactor.ToXMLFormat(4)),
-					new XElement(tns + "CFRegPer", "1.0000"),
-					new XElement(tns + "CFNCV", "1.0000"),
-					new XElement(tns + "FuelType", "Diesel CI"),
+					new XElement(tns + XMLNames.Engine_CorrectionFactor_RegPer, "1.0000"),
+					new XElement(tns + XMLNames.Engine_CorrecionFactor_NCV, "1.0000"),
+					new XElement(tns + XMLNames.Engine_FuelType, "Diesel CI"),
 					new XElement(tns + XMLNames.Engine_FuelConsumptionMap,
 						EmbedDataTable(data.FuelConsumptionMap, AttributeMappings.FuelConsumptionMapMapping)),
 					new XElement(tns + XMLNames.Engine_FullLoadAndDragCurve,
@@ -177,12 +178,12 @@ namespace TUGraz.VectoCore.OutputData.XML
 			}
 			var id = string.Format("GBX-{0}", gbxData.Model.RemoveWhitespace());
 			return new XElement(tns + XMLNames.Component_Gearbox,
-				new XAttribute("certificationNumber", string.Format("GBX-{0}", gbxData.Model)),
+				new XAttribute(XMLNames.Component_CertificationNumber, string.Format("GBX-{0}", gbxData.Model)),
 				new XElement(tns + XMLNames.ComponentDataWrapper,
 					new XAttribute(XMLNames.Component_ID_Attr, id),
 					GetDefaultComponentElements(string.Format("GBX-{0}", gbxData.Model), gbxData.Model),
 					new XElement(tns + XMLNames.Gearbox_TransmissionType, gbxData.Type.ToXMLFormat()),
-					new XElement(tns + "MainCertificationMethod", "Standard values"),
+					new XElement(tns + XMLNames.Component_Gearbox_CertificationMethod, "Standard values"),
 					gears
 					),
 				AddSignatureDummy(id),
@@ -198,11 +199,11 @@ namespace TUGraz.VectoCore.OutputData.XML
 			}
 			var id = string.Format("TC-{0}", data.Model.RemoveWhitespace());
 			return new XElement(tns + XMLNames.Component_TorqueConverter,
-				new XAttribute("certificationNumber", id),
+				new XAttribute(XMLNames.Component_CertificationNumber, id),
 				new XElement(tns + XMLNames.ComponentDataWrapper,
 					new XAttribute(XMLNames.Component_ID_Attr, id),
 					GetDefaultComponentElements(data.TechnicalReportId, data.Model),
-					new XElement(tns + "CertificationMethod", "Standard values"),
+					new XElement(tns + XMLNames.Component_CertificationMethod, "Standard values"),
 					new XElement(tns + XMLNames.TorqueConverter_Characteristics,
 						EmbedDataTable(data.TCData, AttributeMappings.TorqueConverterDataMapping,
 							precision: new Dictionary<string, uint>() {
@@ -217,12 +218,12 @@ namespace TUGraz.VectoCore.OutputData.XML
 		{
 			var id = string.Format("ANGL-{0}", data.Model.RemoveWhitespace());
 			return new XElement(tns + XMLNames.Component_Angledrive,
-				new XAttribute("certificationNumber", "ANGL-" + data.Model),
+				new XAttribute(XMLNames.Component_CertificationNumber, "ANGL-" + data.Model),
 				new XElement(tns + XMLNames.ComponentDataWrapper,
 					new XAttribute(XMLNames.Component_ID_Attr, id),
 					GetDefaultComponentElements(data.TechnicalReportId, data.Model),
 					new XElement(tns + XMLNames.AngleDrive_Ratio, data.Ratio.ToXMLFormat(3)),
-					new XElement(tns + "CertificationMethod", "Standard values"),
+					new XElement(tns + XMLNames.Component_CertificationMethod, "Standard values"),
 					new XElement(tns + XMLNames.AngleDrive_TorqueLossMap,
 						EmbedDataTable(data.LossMap, AttributeMappings.TransmissionLossmapMapping))),
 				AddSignatureDummy(id));
@@ -232,11 +233,11 @@ namespace TUGraz.VectoCore.OutputData.XML
 		{
 			var id = string.Format("RET-{0}", data.Model.RemoveWhitespace());
 			return new XElement(tns + XMLNames.Component_Retarder,
-				new XAttribute("certificationNumber", "RET-none"),
+				new XAttribute(XMLNames.Component_CertificationNumber, "RET-none"),
 				new XElement(tns + XMLNames.ComponentDataWrapper,
 					new XAttribute(XMLNames.Component_ID_Attr, id),
 					GetDefaultComponentElements(data.TechnicalReportId, data.Model),
-					new XElement(tns + "CertificationMethod", "Standard values"),
+					new XElement(tns + XMLNames.Component_CertificationMethod, "Standard values"),
 					new XElement(tns + XMLNames.Retarder_RetarderLossMap,
 						EmbedDataTable(data.LossMap, AttributeMappings.RetarderLossmapMapping)
 						)
@@ -249,13 +250,13 @@ namespace TUGraz.VectoCore.OutputData.XML
 		{
 			var typeId = string.Format("AXLGEAR-{0:0.000}", data.Ratio);
 			return new XElement(tns + XMLNames.Component_Axlegear,
-				new XAttribute("certificationNumber", string.Format("AXL-{0}", data.Model)),
+				new XAttribute(XMLNames.Component_CertificationNumber, string.Format("AXL-{0}", data.Model)),
 				new XElement(tns + XMLNames.ComponentDataWrapper,
 					new XAttribute(XMLNames.Component_ID_Attr, typeId),
 					GetDefaultComponentElements(typeId, "N.A."),
 					new XElement(tns + "LineType", "Single portal axle"),
 					new XElement(tns + XMLNames.Axlegear_Ratio, data.Ratio.ToXMLFormat(3)),
-					new XElement(tns + "CertificationMethod", "Standard values"),
+					new XElement(tns + XMLNames.Component_CertificationMethod, "Standard values"),
 					new XElement(tns + XMLNames.Axlegear_TorqueLossMap,
 						EmbedDataTable(data.LossMap, AttributeMappings.TransmissionLossmapMapping))),
 				AddSignatureDummy(typeId)
@@ -274,7 +275,7 @@ namespace TUGraz.VectoCore.OutputData.XML
 					new XElement(tns + XMLNames.AxleWheels_Axles_Axle_AxleType_Attr,
 						i == 1 ? AxleType.VehicleDriven.ToString() : AxleType.VehicleNonDriven.ToString()),
 					new XElement(tns + XMLNames.AxleWheels_Axles_Axle_TwinTyres_Attr, axle.TwinTyres),
-					new XElement(tns + "Steered", i == 0),
+					new XElement(tns + XMLNames.AxleWheels_Axles_Axle_Steered, i == 0),
 					CreateTyre(axle)
 					));
 			}
@@ -291,7 +292,7 @@ namespace TUGraz.VectoCore.OutputData.XML
 		{
 			var id = string.Format("TYRE-{0}", axle.Wheels).RemoveWhitespace().Replace("/", "_");
 			return new XElement(tns + "Tyre",
-				new XAttribute("certificationNumber", id),
+				new XAttribute(XMLNames.Component_CertificationNumber, id),
 				new XElement(tns + XMLNames.ComponentDataWrapper,
 					new XAttribute(XMLNames.Component_ID_Attr, id),
 					GetDefaultComponentElements(string.Format("TYRE-{0}", axle.Wheels), axle.Wheels),
@@ -326,7 +327,7 @@ namespace TUGraz.VectoCore.OutputData.XML
 		{
 			var id = string.Format("Airdrag-{0}", data.Model);
 			return new XElement(tns + XMLNames.Component_AirDrag,
-				new XAttribute("certificationNumber", string.Format("TYRE-{0}", data.Model)),
+				new XAttribute(XMLNames.Component_CertificationNumber, string.Format("AD-{0}", data.Model)),
 				new XElement(tns + XMLNames.ComponentDataWrapper,
 					new XAttribute(XMLNames.Component_ID_Attr, id),
 					GetDefaultComponentElements(data.Model, "N.A."),
@@ -345,20 +346,43 @@ namespace TUGraz.VectoCore.OutputData.XML
 
 		private XElement AddSignatureDummy(string id)
 		{
-			return new XElement(tns + "Signature",
-				new XElement(di + "Reference",
-					new XAttribute("URI", "#" + id),
-					new XElement(di + "Transforms",
-						new XElement(di + "Transform",
-							new XAttribute("Algorithm", "http://www.w3.org/TR/2001/REC-xml-c14n-20010315#WithoutComments")),
-						new XElement(di + "Transform",
-							new XAttribute("Algorithm", "urn:vecto:xml:2017:canonicalization"))
+			return new XElement(tns + XMLNames.DI_Signature,
+				new XElement(di + XMLNames.DI_Signature_Reference,
+					new XAttribute(XMLNames.DI_Signature_Reference_URI_Attr, "#" + id),
+					new XElement(di + XMLNames.DI_Signature_Reference_Transforms,
+						new XElement(di + XMLNames.DI_Signature_Reference_Transforms_Transform,
+							new XAttribute(XMLNames.DI_Signature_Algorithm_Attr,
+								"http://www.w3.org/TR/2001/REC-xml-c14n-20010315#WithoutComments")),
+						new XElement(di + XMLNames.DI_Signature_Reference_Transforms_Transform,
+							new XAttribute(XMLNames.DI_Signature_Algorithm_Attr, "urn:vecto:xml:2017:canonicalization"))
 						),
-					new XElement(di + "DigestMethod",
-						new XAttribute("Algorithm", "http://www.w3.org/2001/04/xmlenc#sha256")),
-					new XElement(di + "DigestValue", "")
+					new XElement(di + XMLNames.DI_Signature_Reference_DigestMethod,
+						new XAttribute(XMLNames.DI_Signature_Algorithm_Attr, "http://www.w3.org/2001/04/xmlenc#sha256")),
+					new XElement(di + XMLNames.DI_Signature_Reference_DigestValue, "")
 					)
 				);
 		}
+
+		protected XElement[] GetDefaultComponentElements(string componentId, string makeAndModel)
+		{
+			return new[] {
+				new XElement(tns + XMLNames.Component_Manufacturer, Vendor),
+				new XElement(tns + XMLNames.Component_Model, makeAndModel),
+				new XElement(tns + XMLNames.Component_TechnicalReportId, componentId),
+				new XElement(tns + XMLNames.Component_Date, XmlConvert.ToString(DateTime.Now, XmlDateTimeSerializationMode.Utc)),
+				new XElement(tns + XMLNames.Component_AppVersion, "VectoCore"),
+			};
+		}
+
+		protected XElement[] GetDefaultComponentElements(string vin, string makeAndModel, string address)
+		{
+			return new[] {
+				new XElement(tns + XMLNames.Component_Manufacturer, Vendor),
+				new XElement(tns + XMLNames.Component_ManufacturerAddress, address),
+				new XElement(tns + XMLNames.Component_Model, makeAndModel),
+				new XElement(tns + XMLNames.Vehicle_VIN, vin),
+				new XElement(tns + XMLNames.Component_Date, XmlConvert.ToString(DateTime.Now, XmlDateTimeSerializationMode.Utc)),
+			};
+		}
 	}
 }
\ No newline at end of file
diff --git a/VectoCore/VectoCore/OutputData/XML/XMLEngineeringWriter.cs b/VectoCore/VectoCore/OutputData/XML/XMLEngineeringWriter.cs
index 1c55475b19..e65e761ece 100644
--- a/VectoCore/VectoCore/OutputData/XML/XMLEngineeringWriter.cs
+++ b/VectoCore/VectoCore/OutputData/XML/XMLEngineeringWriter.cs
@@ -3,12 +3,15 @@ using System.Collections.Generic;
 using System.Data;
 using System.IO;
 using System.Text.RegularExpressions;
+using System.Xml;
 using System.Xml.Linq;
 using TUGraz.IVT.VectoXML;
 using TUGraz.IVT.VectoXML.Writer;
 using TUGraz.VectoCommon.InputData;
 using TUGraz.VectoCommon.Models;
+using TUGraz.VectoCommon.Utils;
 using TUGraz.VectoCore.Configuration;
+using TUGraz.VectoCore.InputData.Reader.ComponentData;
 using TUGraz.VectoCore.Resources;
 using TUGraz.VectoCore.Utils;
 
@@ -182,7 +185,6 @@ namespace TUGraz.VectoCore.OutputData.XML
 			var retarder = data.RetarderInputData;
 			var gearbox = data.GearboxInputData;
 			var vehicle = data.VehicleInputData;
-			var airdrag = data.AirdragInputData;
 			var angledrive = data.AngledriveInputData;
 			var pto = data.PTOTransmissionInputData;
 
@@ -191,18 +193,18 @@ namespace TUGraz.VectoCore.OutputData.XML
 				GetDefaultComponentElements(vehicle.TechnicalReportId, vehicle.Model),
 				new XElement(tns + XMLNames.Vehicle_VehicleCategory, GetVehicleCategoryXML(vehicle.VehicleCategory)),
 				new XElement(tns + XMLNames.Vehicle_AxleConfiguration, vehicle.AxleConfiguration.GetName()),
-				new XElement(tns + XMLNames.Vehicle_CurbWeightChassis, vehicle.CurbMassChassis.Value()),
-				new XElement(tns + XMLNames.Vehicle_GrossVehicleMass, vehicle.GrossVehicleMassRating.Value()),
-				new XElement(tns + XMLNames.Vehicle_AirDragArea, airdrag.AirDragArea.Value()),
+				new XElement(tns + XMLNames.Vehicle_CurbMassChassis, vehicle.CurbMassChassis.Value().ToXMLFormat(0)),
+				new XElement(tns + XMLNames.Vehicle_GrossVehicleMass, vehicle.GrossVehicleMassRating.Value().ToXMLFormat(0)),
+				//new XElement(tns + XMLNames.Vehicle_AirDragArea, airdrag.AirDragArea.Value()),
 				new XElement(tns + XMLNames.Vehicle_RetarderType, GetRetarterTypeXML(retarder.Type)),
-				retarder.Type.IsDedicatedComponent() ? new XElement(tns + XMLNames.Vehicle_RetarderRatio, retarder.Ratio) : null,
-				new XElement(tns + XMLNames.Vehicle_AngledriveType, angledrive.Type),
+				retarder.Type.IsDedicatedComponent()
+					? new XElement(tns + XMLNames.Vehicle_RetarderRatio, retarder.Ratio.ToXMLFormat(3))
+					: null,
+				new XElement(tns + XMLNames.Vehicle_AngledriveType, angledrive.Type.ToXMLFormat()),
 				new XElement(tns + XMLNames.Vehicle_PTOType, pto.PTOTransmissionType),
 				GetPTOData(pto),
-				new XElement(tns + XMLNames.Vehicle_CurbWeightExtra, vehicle.CurbMassExtra.Value()),
+				new XElement(tns + XMLNames.Vehicle_CurbMassExtra, vehicle.CurbMassExtra.Value()),
 				new XElement(tns + XMLNames.Vehicle_Loading, vehicle.Loading.Value()),
-				new XElement(tns + XMLNames.Vehicle_CrossWindCorrectionMode, GetCorrectionModeXML(airdrag.CrossWindCorrectionMode)),
-				GetCrossWindCorrectionData(airdrag),
 				new XElement(tns + XMLNames.Vehicle_Components,
 					CreateEngine(data.EngineInputData),
 					CreateGearbox(gearbox, gearbox.TorqueConverter),
@@ -210,7 +212,8 @@ namespace TUGraz.VectoCore.OutputData.XML
 					retarder.Type.IsDedicatedComponent() ? CreateRetarder(retarder) : null,
 					CreateAxlegear(data.AxleGearInputData),
 					CreateAxleWheels(data.VehicleInputData),
-					CreateAuxiliaries(data.AuxiliaryInputData(), RemoveInvalidFileCharacters(data.VehicleInputData.Model))
+					CreateAuxiliaries(data.AuxiliaryInputData(), RemoveInvalidFileCharacters(data.VehicleInputData.Model)),
+					CreateAirdrag(data.AirdragInputData)
 					),
 				new XElement(tns + XMLNames.Vehicle_AdvancedDriverAssist,
 					new XElement(tns + XMLNames.Vehicle_AdvancedDriverAssist_EngineStartStop,
@@ -267,9 +270,10 @@ namespace TUGraz.VectoCore.OutputData.XML
 				new XElement(tns + XMLNames.ComponentDataWrapper,
 					new XAttribute(XMLNames.Component_ID_Attr, "ANGL-" + data.Model),
 					GetDefaultComponentElements(data.TechnicalReportId, data.Model),
-					new XElement(tns + XMLNames.AngleDrive_Ratio, data.Ratio),
+					new XElement(tns + XMLNames.AngleDrive_Ratio, data.Ratio.ToXMLFormat(3)),
 					data.LossMap == null
-						? new XElement(tns + XMLNames.AngleDrive_Efficiency, data.Efficiency)
+						? new XElement(tns + XMLNames.AngleDrive_TorqueLossMap,
+							new XElement(tns + XMLNames.AngleDrive_Efficiency, data.Efficiency))
 						: new XElement(tns + XMLNames.AngleDrive_TorqueLossMap, GetTransmissionLossMap(data.LossMap))));
 			//if (_singleFile) {
 			return angledrive;
@@ -308,7 +312,9 @@ namespace TUGraz.VectoCore.OutputData.XML
 			}
 
 			var aux = new XElement(tns + XMLNames.Component_Auxiliaries,
-				new XElement(tns + XMLNames.ComponentDataWrapper, new XAttribute(XMLNames.Component_ID_Attr, "AUX-none"), auxList));
+				new XElement(tns + XMLNames.ComponentDataWrapper,
+					//new XAttribute(XMLNames.Component_ID_Attr, "AUX-none"), 
+					auxList));
 			if (_singleFile) {
 				return aux;
 			}
@@ -324,10 +330,11 @@ namespace TUGraz.VectoCore.OutputData.XML
 				var axle = axleData[i];
 				axles.Add(new XElement(tns + XMLNames.AxleWheels_Axles_Axle,
 					new XAttribute(XMLNames.AxleWheels_Axles_Axle_AxleNumber_Attr, i + 1),
-					new XAttribute(XMLNames.AxleWheels_Axles_Axle_TwinTyres_Attr, axle.TwinTyres),
-					new XAttribute(XMLNames.AxleWheels_Axles_Axle_AxleType_Attr,
-						i == 1 ? AxleType.VehicleDriven.ToString() : AxleType.VehicleNonDriven.ToString()),
 					GetDefaultComponentElements(string.Format("WHEEL-{0}_{1}", i, axle.Wheels), axle.Wheels),
+					new XElement(tns + XMLNames.AxleWheels_Axles_Axle_AxleType,
+						i == 1 ? AxleType.VehicleDriven.ToString() : AxleType.VehicleNonDriven.ToString()),
+					new XElement(tns + XMLNames.AxleWheels_Axles_Axle_TwinTyres_Attr, axle.TwinTyres),
+					new XElement(tns + XMLNames.AxleWheels_Axles_Axle_Steered, i == 0),
 					string.IsNullOrWhiteSpace(axle.Wheels)
 						? null
 						: new XElement(tns + XMLNames.AxleWheels_Axles_Axle_Dimension, axle.Wheels),
@@ -351,14 +358,32 @@ namespace TUGraz.VectoCore.OutputData.XML
 				String.Format("AXLWHL-{0}.xml", data.AxleConfiguration.GetName()));
 		}
 
+		//private XElement CreateTyre(IAxleDeclarationInputData axle)
+		//{
+		//	var id = string.Format("TYRE-{0}", axle.Wheels).RemoveWhitespace().Replace("/", "_");
+		//	return new XElement(tns + "Tyre",
+		//		new XAttribute(XMLNames.Component_CertificationNumber, id),
+		//		new XElement(tns + XMLNames.ComponentDataWrapper,
+		//			GetDefaultComponentElements(string.Format("TYRE-{0}", axle.Wheels), axle.Wheels),
+		//			string.IsNullOrWhiteSpace(axle.Wheels)
+		//				? null
+		//				: new XElement(tns + XMLNames.AxleWheels_Axles_Axle_Dimension, axle.Wheels),
+		//			new XElement(tns + XMLNames.AxleWheels_Axles_Axle_RRCISO, axle.RollResistanceCoefficient.ToXMLFormat(4)),
+		//			new XElement(tns + XMLNames.AxleWheels_Axles_Axle_FzISO, axle.TyreTestLoad.Value().ToXMLFormat(0))
+		//			)
+		//		);
+		//}
+
 		public XElement CreateAxlegear(IAxleGearInputData data)
 		{
 			var typeId = string.Format("AXLGEAR-{0:0.000}", data.Ratio);
 			var axl = new XElement(tns + XMLNames.Component_Axlegear,
 				new XElement(tns + XMLNames.ComponentDataWrapper, new XAttribute(XMLNames.Component_ID_Attr, typeId),
-					GetDefaultComponentElements(typeId, "N.A."), new XElement(tns + XMLNames.Axlegear_Ratio, data.Ratio),
+					GetDefaultComponentElements(typeId, "N.A."),
+					new XElement(tns + XMLNames.Axlegear_Ratio, data.Ratio.ToXMLFormat(3)),
 					data.LossMap == null
-						? new XElement(tns + XMLNames.Axlegear_Efficiency, data.Efficiency)
+						? new XElement(tns + XMLNames.Axlegear_TorqueLossMap,
+							new XElement(tns + XMLNames.Axlegear_Efficiency, data.Efficiency))
 						: new XElement(tns + XMLNames.Axlegear_TorqueLossMap, GetTransmissionLossMap(data.LossMap))));
 			if (_singleFile) {
 				return axl;
@@ -390,14 +415,15 @@ namespace TUGraz.VectoCore.OutputData.XML
 			foreach (var gearData in data.Gears) {
 				var gear = new XElement(tns + XMLNames.Gearbox_Gears_Gear,
 					new XAttribute(XMLNames.Gearbox_Gear_GearNumber_Attr, i++),
-					new XElement(tns + XMLNames.Gearbox_Gear_Ratio, gearData.Ratio),
+					new XElement(tns + XMLNames.Gearbox_Gear_Ratio, gearData.Ratio.ToXMLFormat(3)),
 					gearData.MaxTorque != null
 						? new XElement(tns + XMLNames.Gearbox_Gears_MaxTorque, gearData.MaxTorque.Value())
 						: null);
 				if (gearData.LossMap != null) {
 					gear.Add(new XElement(tns + XMLNames.Gearbox_Gear_TorqueLossMap, GetTransmissionLossMap(gearData.LossMap)));
 				} else {
-					gear.Add(new XElement(tns + XMLNames.Gearbox_Gear_Efficiency, gearData.Efficiency));
+					gear.Add(new XElement(tns + XMLNames.Gearbox_Gear_TorqueLossMap,
+						new XElement(tns + XMLNames.Gearbox_Gear_Efficiency, gearData.Efficiency)));
 				}
 				if (gearData.ShiftPolygon != null) {
 					gear.Add(new XElement(tns + XMLNames.Gearbox_Gears_Gear_ShiftPolygon, CreateShiftPolygon(gearData.ShiftPolygon)));
@@ -424,10 +450,15 @@ namespace TUGraz.VectoCore.OutputData.XML
 		{
 			var tc = new XElement(tns + XMLNames.Component_TorqueConverter,
 				new XElement(tns + XMLNames.ComponentDataWrapper,
-					new XElement(tns + XMLNames.TorqueConverter_ReferenceRPM, torqueConverterData.ReferenceRPM.AsRPM),
+					new XAttribute(XMLNames.Component_ID_Attr, string.Format("TC-{0}", torqueConverterData.Model)),
+					GetDefaultComponentElements(string.Format("TC-{0}", torqueConverterData.Model), torqueConverterData.Model),
+					new XElement(tns + XMLNames.TorqueConverter_ReferenceRPM, torqueConverterData.ReferenceRPM.AsRPM.ToXMLFormat()),
 					new XElement(tns + XMLNames.TorqueConverter_Characteristics,
 						_singleFile
-							? EmbedDataTable(torqueConverterData.TCData, AttributeMappings.TorqueConverterDataMapping)
+							? EmbedDataTable(torqueConverterData.TCData, AttributeMappings.TorqueConverterDataMapping,
+								precision: new Dictionary<string, uint>() {
+									{ TorqueConverterDataReader.Fields.SpeedRatio, 4 }
+								})
 							: ExtCSVResource(torqueConverterData.TCData, Path.GetFileName(torqueConverterData.TCData.Source))),
 					new XElement(tns + XMLNames.TorqueConverter_Inertia, torqueConverterData.Inertia.Value())));
 			if (_singleFile) {
@@ -459,10 +490,10 @@ namespace TUGraz.VectoCore.OutputData.XML
 				new XElement(tns + XMLNames.ComponentDataWrapper,
 					new XAttribute(XMLNames.Component_ID_Attr, string.Format("ENG-{0}", data.Model)),
 					GetDefaultComponentElements(string.Format("ENG-{0}", data.Model), data.Model),
-					new XElement(tns + XMLNames.Engine_Displacement, data.Displacement.Value() * 1000 * 1000),
-					new XElement(tns + XMLNames.Engine_IdlingSpeed, data.IdleSpeed.AsRPM),
+					new XElement(tns + XMLNames.Engine_Displacement, (data.Displacement.Value() * 1000 * 1000).ToXMLFormat(0)),
+					new XElement(tns + XMLNames.Engine_IdlingSpeed, data.IdleSpeed.AsRPM.ToXMLFormat(0)),
 					new XElement(tns + XMLNames.Engine_Inertia, data.Inertia.Value()),
-					new XElement(tns + XMLNames.Engine_WHTCEngineering, data.WHTCEngineering),
+					new XElement(tns + XMLNames.Engine_WHTCEngineering, data.WHTCEngineering.ToXMLFormat(4)),
 					new XElement(tns + XMLNames.Engine_FuelConsumptionMap, GetFuelConsumptionMap(data)),
 					new XElement(tns + XMLNames.Engine_FullLoadAndDragCurve, GetFullLoadDragCurve(data))));
 			if (!allowSeparateFile || _singleFile) {
@@ -471,6 +502,19 @@ namespace TUGraz.VectoCore.OutputData.XML
 			return ExtComponent(XMLNames.Component_Engine, engine, string.Format("ENG-{0}.xml", data.Model));
 		}
 
+		private XElement CreateAirdrag(IAirdragEngineeringInputData data)
+		{
+			var id = string.Format("Airdrag-{0}", data.Model);
+			return new XElement(tns + XMLNames.Component_AirDrag,
+				new XElement(tns + XMLNames.ComponentDataWrapper,
+					new XAttribute(XMLNames.Component_ID_Attr, id),
+					GetDefaultComponentElements(data.Model, "N.A."),
+					new XElement(tns + XMLNames.Vehicle_CrossWindCorrectionMode, GetCorrectionModeXML(data.CrossWindCorrectionMode)),
+					new XElement(tns + XMLNames.Vehicle_AirDragArea, data.AirDragArea.Value().ToXMLFormat(2))),
+				GetCrossWindCorrectionData(data)
+				);
+		}
+
 		private XElement ExtComponent(string component, XElement componentXML, string filename)
 		{
 			GenerateComponentDocument(componentXML).Save(Path.Combine(BasePath, filename));
@@ -511,5 +555,16 @@ namespace TUGraz.VectoCore.OutputData.XML
 					new XAttribute(XMLNames.ExtResource_File_Attr, filename))
 			};
 		}
+
+		protected XElement[] GetDefaultComponentElements(string componentId, string makeAndModel)
+		{
+			return new[] {
+				new XElement(tns + XMLNames.Component_Manufacturer, Vendor),
+				new XElement(tns + XMLNames.Component_Model, makeAndModel),
+				new XElement(tns + XMLNames.Component_Creator, Creator),
+				new XElement(tns + XMLNames.Component_Date, XmlConvert.ToString(DateTime.Now, XmlDateTimeSerializationMode.Utc)),
+				new XElement(tns + XMLNames.Component_AppVersion, "VectoCore"),
+			};
+		}
 	}
 }
\ No newline at end of file
diff --git a/VectoCore/VectoCore/Resources/XMLNames.resx b/VectoCore/VectoCore/Resources/XMLNames.resx
index 8129ff050d..ad6df583b3 100644
--- a/VectoCore/VectoCore/Resources/XMLNames.resx
+++ b/VectoCore/VectoCore/Resources/XMLNames.resx
@@ -686,5 +686,71 @@
   </data>
 	<data name="Component_AppVersion" xml:space="preserve">
     <value>AppVersion</value>
+  </data>
+	<data name="Component_CertificationMethod" xml:space="preserve">
+    <value>CertificationMethod</value>
+  </data>
+	<data name="Component_Gearbox_CertificationMethod" xml:space="preserve">
+    <value>MainCertificationMethod</value>
+  </data>
+	<data name="Engine_RatedSpeed" xml:space="preserve">
+    <value>RatedSpeed</value>
+  </data>
+	<data name="Engine_RatedPower" xml:space="preserve">
+    <value>RatedPower</value>
+  </data>
+	<data name="Engine_MaxTorque" xml:space="preserve">
+    <value>MaxEngineTorque</value>
+  </data>
+	<data name="Engine_FuelType" xml:space="preserve">
+    <value>FuelType</value>
+  </data>
+	<data name="Engine_CorrecionFactor_NCV" xml:space="preserve">
+    <value>CFNCV</value>
+  </data>
+	<data name="Engine_CorrectionFactor_RegPer" xml:space="preserve">
+    <value>CFRegPer</value>
+  </data>
+	<data name="Vehicle_PTO" xml:space="preserve">
+    <value>PTO</value>
+  </data>
+	<data name="Vehicle_PTO_ShaftsGearWheels" xml:space="preserve">
+    <value>PTOShaftsGearWheels</value>
+  </data>
+	<data name="Vehicle_PTO_OtherElements" xml:space="preserve">
+    <value>PTOOtherElements</value>
+  </data>
+	<data name="Vehicle_IdlingSpeed" xml:space="preserve">
+    <value>IdlingSpeed</value>
+  </data>
+	<data name="Vehicle_LegislativeClass" xml:space="preserve">
+    <value>LegislativeClass</value>
+  </data>
+	<data name="DI_Signature" xml:space="preserve">
+    <value>Signature</value>
+  </data>
+	<data name="DI_Signature_Reference" xml:space="preserve">
+    <value>Reference</value>
+  </data>
+	<data name="DI_Signature_Reference_URI_Attr" xml:space="preserve">
+    <value>URI</value>
+  </data>
+	<data name="DI_Signature_Reference_Transforms" xml:space="preserve">
+    <value>Transforms</value>
+  </data>
+	<data name="DI_Signature_Reference_Transforms_Transform" xml:space="preserve">
+    <value>Transform</value>
+  </data>
+	<data name="DI_Signature_Algorithm_Attr" xml:space="preserve">
+    <value>Algorithm</value>
+  </data>
+	<data name="DI_Signature_Reference_DigestMethod" xml:space="preserve">
+    <value>DigestMethod</value>
+  </data>
+	<data name="DI_Signature_Reference_DigestValue" xml:space="preserve">
+    <value>DigestValue</value>
+  </data>
+	<data name="Component_ManufacturerAddress" xml:space="preserve">
+    <value>ManufacturerAddress</value>
   </data>
 </root>
\ No newline at end of file
diff --git a/VectoCore/VectoCore/Resources/XSD/VectoEngineeringDefinitions.0.7.xsd b/VectoCore/VectoCore/Resources/XSD/VectoEngineeringDefinitions.0.7.xsd
index 71af0f8f68..a97b44deb6 100644
--- a/VectoCore/VectoCore/Resources/XSD/VectoEngineeringDefinitions.0.7.xsd
+++ b/VectoCore/VectoCore/Resources/XSD/VectoEngineeringDefinitions.0.7.xsd
@@ -579,47 +579,51 @@
 	</xs:complexType>
 	<xs:complexType name="TorqueConverterComponentEngineeringType"/>
 	<xs:complexType name="TorqueConverterEngineeringDataType">
-		<xs:sequence>
-			<xs:element name="ReferenceRPM" type="tns:TorqueConverterReferenceRPMType">
-				<xs:annotation>
-					<xs:documentation>P092 - [1/min]</xs:documentation>
-				</xs:annotation>
-			</xs:element>
-			<xs:element name="Characteristics">
-				<xs:complexType>
-					<xs:choice>
-						<xs:element name="Entry" type="vdecdef:TorqueConverterCharacteristicsEntryType" minOccurs="2" maxOccurs="unbounded"/>
-						<xs:element name="Resource" type="tns:ExtResourceEngineeringType">
-							<xs:annotation>
-								<xs:documentation>P091</xs:documentation>
-							</xs:annotation>
-						</xs:element>
-					</xs:choice>
-				</xs:complexType>
-			</xs:element>
-			<xs:element name="Inertia" type="tns:TorqueConverterInertiaType">
-				<xs:annotation>
-					<xs:documentation>P127 - [kgm²]</xs:documentation>
-				</xs:annotation>
-			</xs:element>
-			<xs:element name="ShiftPolygon" minOccurs="0">
-				<xs:complexType>
-					<xs:choice>
-						<xs:element name="Entry" type="tns:ShiftPolygonEntryType" minOccurs="2" maxOccurs="unbounded"/>
-						<xs:element name="Resource" type="tns:ExtResourceEngineeringType">
-							<xs:annotation>
-								<xs:documentation>P091</xs:documentation>
-							</xs:annotation>
-						</xs:element>
-					</xs:choice>
-				</xs:complexType>
-			</xs:element>
-			<xs:element name="MaxInputSpeed" type="tns:TorqueConverterMaxInputSpeedType" minOccurs="0">
-				<xs:annotation>
-					<xs:documentation>P187 - [rpm]</xs:documentation>
-				</xs:annotation>
-			</xs:element>
-		</xs:sequence>
+		<xs:complexContent>
+			<xs:extension base="tns:EngineeringPowertrainComponentType">
+				<xs:sequence>
+					<xs:element name="ReferenceRPM" type="tns:TorqueConverterReferenceRPMType">
+						<xs:annotation>
+							<xs:documentation>P092 - [1/min]</xs:documentation>
+						</xs:annotation>
+					</xs:element>
+					<xs:element name="Characteristics">
+						<xs:complexType>
+							<xs:choice>
+								<xs:element name="Entry" type="vdecdef:TorqueConverterCharacteristicsEntryType" minOccurs="2" maxOccurs="unbounded"/>
+								<xs:element name="Resource" type="tns:ExtResourceEngineeringType">
+									<xs:annotation>
+										<xs:documentation>P091</xs:documentation>
+									</xs:annotation>
+								</xs:element>
+							</xs:choice>
+						</xs:complexType>
+					</xs:element>
+					<xs:element name="Inertia" type="tns:TorqueConverterInertiaType">
+						<xs:annotation>
+							<xs:documentation>P127 - [kgm²]</xs:documentation>
+						</xs:annotation>
+					</xs:element>
+					<xs:element name="ShiftPolygon" minOccurs="0">
+						<xs:complexType>
+							<xs:choice>
+								<xs:element name="Entry" type="tns:ShiftPolygonEntryType" minOccurs="2" maxOccurs="unbounded"/>
+								<xs:element name="Resource" type="tns:ExtResourceEngineeringType">
+									<xs:annotation>
+										<xs:documentation>P091</xs:documentation>
+									</xs:annotation>
+								</xs:element>
+							</xs:choice>
+						</xs:complexType>
+					</xs:element>
+					<xs:element name="MaxInputSpeed" type="tns:TorqueConverterMaxInputSpeedType" minOccurs="0">
+						<xs:annotation>
+							<xs:documentation>P187 - [rpm]</xs:documentation>
+						</xs:annotation>
+					</xs:element>
+				</xs:sequence>
+			</xs:extension>
+		</xs:complexContent>
 	</xs:complexType>
 	<xs:complexType name="VectoComponentEngineeringType">
 		<xs:choice>
diff --git a/VectoCore/VectoCoreTest/XML/XMLWritingTest.cs b/VectoCore/VectoCoreTest/XML/XMLWritingTest.cs
index 7fae8803fa..e4f1700e34 100644
--- a/VectoCore/VectoCoreTest/XML/XMLWritingTest.cs
+++ b/VectoCore/VectoCoreTest/XML/XMLWritingTest.cs
@@ -43,7 +43,7 @@ namespace TUGraz.VectoCore.Tests.XML
 			var xml = new XMLEngineeringInputDataProvider(outFile, true);
 
 			Assert.IsNotNull(xml);
-			Assert.AreEqual("ENG-175kW 6.8l Engine", xml.JobInputData().JobName);
+			Assert.AreEqual("175kW 6.8l Engine", xml.JobInputData().JobName);
 		}
 
 		[TestMethod]
@@ -59,7 +59,7 @@ namespace TUGraz.VectoCore.Tests.XML
 			var xml = new XMLEngineeringInputDataProvider(outFile, true);
 
 			Assert.IsNotNull(xml);
-			Assert.AreEqual("VEH-N/A", xml.JobInputData().JobName);
+			Assert.AreEqual("VEH-N.A.", xml.JobInputData().JobName);
 		}
 
 		[TestMethod]
@@ -75,7 +75,7 @@ namespace TUGraz.VectoCore.Tests.XML
 			var xml = new XMLEngineeringInputDataProvider(outFile, true);
 
 			Assert.IsNotNull(xml);
-			Assert.AreEqual("VEH-N/A", xml.JobInputData().JobName);
+			Assert.AreEqual("VEH-N.A.", xml.JobInputData().JobName);
 		}
 
 		[TestMethod]
@@ -93,7 +93,7 @@ namespace TUGraz.VectoCore.Tests.XML
 			var xml = new XMLEngineeringInputDataProvider(Path.Combine(outDir, outFile), true);
 
 			Assert.IsNotNull(xml);
-			Assert.AreEqual("VEH-N/A", xml.JobInputData().JobName);
+			Assert.AreEqual("VEH-N.A.", xml.JobInputData().JobName);
 		}
 
 		[TestMethod]
-- 
GitLab