From a4b3f7f47dd3bb24ca66f3b4ba9c9e0cdf71b213 Mon Sep 17 00:00:00 2001
From: Markus Quaritsch <quaritsch@ivt.tugraz.at>
Date: Fri, 16 Dec 2022 09:35:36 +0100
Subject: [PATCH] adding results writer for VIF more testcases, minor
 refactoring

---
 .../VectoCore/Ninject/VectoNinjectModule.cs   |  10 +-
 .../Common/ElectricEnergyWriter.cs            |   8 +-
 .../Common/FuelConsumptionWriter.cs           |   8 +-
 .../Common/IInternalResultWriterFactory.cs    |   3 +
 .../Common/IResultsWriter.cs                  |   1 +
 .../Common/IResultsWriterFactory.cs           |   3 +
 .../Common/ResultGroupWriter.cs               |  28 ++-
 .../Common/ResultWriterFactory.cs             |  12 +
 .../Common/ResultsNinjectModule.cs            |   5 +-
 .../CIFResultsNinjectModule.cs                |   3 +
 .../MRFResultsNinjectModule.cs                |   3 +
 ...MRFResultWriter.cs => MRFResultsWriter.cs} |   0
 .../ResultWriter/IVIFResultsWriterFactory.cs  |   6 +
 .../ResultWriter/ResultGroupWriter.cs         | 229 ++++++++++++++++++
 .../ResultWriter/ResultWriter.cs              | 145 +++++++++++
 .../ResultWriter/VIFResultsWriter.cs          | 103 ++++++++
 .../VIFResultsNinjectModule.cs                | 106 ++++++++
 VectoCore/VectoCore/VectoCore.csproj          |   1 +
 .../Reports/TestXMLResultsWriting.cs          | 101 +++++++-
 19 files changed, 754 insertions(+), 21 deletions(-)
 rename VectoCore/VectoCore/OutputData/XML/DeclarationReports/ManufacturerReport/ManufacturerReport_0_9/ResultWriter/{MRFResultWriter.cs => MRFResultsWriter.cs} (100%)
 create mode 100644 VectoCore/VectoCore/OutputData/XML/DeclarationReports/VehicleInformationFile/VehicleInformationFile_0_1/ResultWriter/IVIFResultsWriterFactory.cs
 create mode 100644 VectoCore/VectoCore/OutputData/XML/DeclarationReports/VehicleInformationFile/VehicleInformationFile_0_1/ResultWriter/ResultGroupWriter.cs
 create mode 100644 VectoCore/VectoCore/OutputData/XML/DeclarationReports/VehicleInformationFile/VehicleInformationFile_0_1/ResultWriter/ResultWriter.cs
 create mode 100644 VectoCore/VectoCore/OutputData/XML/DeclarationReports/VehicleInformationFile/VehicleInformationFile_0_1/ResultWriter/VIFResultsWriter.cs
 create mode 100644 VectoCore/VectoCore/OutputData/XML/DeclarationReports/VehicleInformationFile/VehicleInformationFile_0_1/VIFResultsNinjectModule.cs

diff --git a/VectoCore/VectoCore/Ninject/VectoNinjectModule.cs b/VectoCore/VectoCore/Ninject/VectoNinjectModule.cs
index c3934a0ef1..b2480b3635 100644
--- a/VectoCore/VectoCore/Ninject/VectoNinjectModule.cs
+++ b/VectoCore/VectoCore/Ninject/VectoNinjectModule.cs
@@ -108,8 +108,10 @@ namespace TUGraz.VectoCore
 			
 			LoadModule<VIFNinjectModule>();
 			
+			LoadModule<VIFResultsNinjectModule>();
 
-#if (MOCKUP)  
+
+#if (MOCKUP)
 			var compiledModuleLoaderPlugin = new CompiledModuleLoaderPlugin(Kernel, new AssemblyNameRetriever());
 			var assembly = Assembly.LoadFile(Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location),"VectoMockup.dll"));
 			//var assembly = Assembly.LoadFile("VectoMockup.dll");
@@ -122,10 +124,10 @@ namespace TUGraz.VectoCore
 
 		}
 
-		
 
-#endregion
 
-		
+		#endregion
+
+
 	}
 }
diff --git a/VectoCore/VectoCore/OutputData/XML/DeclarationReports/Common/ElectricEnergyWriter.cs b/VectoCore/VectoCore/OutputData/XML/DeclarationReports/Common/ElectricEnergyWriter.cs
index 809cfdb831..4113d601ca 100644
--- a/VectoCore/VectoCore/OutputData/XML/DeclarationReports/Common/ElectricEnergyWriter.cs
+++ b/VectoCore/VectoCore/OutputData/XML/DeclarationReports/Common/ElectricEnergyWriter.cs
@@ -18,7 +18,7 @@ namespace TUGraz.VectoCore.OutputData.XML.DeclarationReports.Common
 
         public virtual XElement GetElement(IResultEntry entry)
         {
-            return new XElement(TNS + "ElectricEnergy",
+            return new XElement(TNS + ElectricEnergyConsumptionXMLElementName,
                 GetEnergyConsumption(entry.ElectricEnergyConsumption, entry.Distance, entry.Payload, entry.CargoVolume,
                     entry.PassengerCount).Select(x =>
                     new XElement(TNS + XMLNames.Report_Result_EnergyConsumption, x.ValueAsUnit(3, 1)))
@@ -27,7 +27,7 @@ namespace TUGraz.VectoCore.OutputData.XML.DeclarationReports.Common
 
         public virtual XElement GetElement(IWeightedResult weighted)
         {
-            return new XElement(TNS + "ElectricEnergy",
+            return new XElement(TNS + ElectricEnergyConsumptionXMLElementName,
                 GetEnergyConsumption(weighted.ElectricEnergyConsumption, weighted.Distance, weighted.Payload, weighted.CargoVolume,
                     weighted.PassengerCount).Select(x =>
                     new XElement(TNS + XMLNames.Report_Result_EnergyConsumption, x.ValueAsUnit(3, 1)))
@@ -39,7 +39,9 @@ namespace TUGraz.VectoCore.OutputData.XML.DeclarationReports.Common
             Kilogram payload, CubicMeter volume, double? passengers);
 
         #endregion
-    }
+
+		protected virtual string ElectricEnergyConsumptionXMLElementName => "ElectricEnergy";
+	}
 
     public class LorryElectricEnergyConsumptionWriter : ElectricEnergyConsumptionWriterBase
     {
diff --git a/VectoCore/VectoCore/OutputData/XML/DeclarationReports/Common/FuelConsumptionWriter.cs b/VectoCore/VectoCore/OutputData/XML/DeclarationReports/Common/FuelConsumptionWriter.cs
index 3b5b624b46..547beae36e 100644
--- a/VectoCore/VectoCore/OutputData/XML/DeclarationReports/Common/FuelConsumptionWriter.cs
+++ b/VectoCore/VectoCore/OutputData/XML/DeclarationReports/Common/FuelConsumptionWriter.cs
@@ -33,12 +33,12 @@ namespace TUGraz.VectoCore.OutputData.XML.DeclarationReports.Common
             );
         }
 
-        protected abstract IList<ConvertedSI> GetFuelConsumptionEntries(Kilogram fc,
-            IFuelProperties fuel, Meter distance, Kilogram payload, CubicMeter volume,
-            double? passenger);
-
         #endregion
 
+		protected abstract IList<ConvertedSI> GetFuelConsumptionEntries(Kilogram fc,
+			IFuelProperties fuel, Meter distance, Kilogram payload, CubicMeter volume,
+			double? passenger);
+
     }
 
     public class LorryFuelConsumptionWriter : FuelConsumptionWriterBase
diff --git a/VectoCore/VectoCore/OutputData/XML/DeclarationReports/Common/IInternalResultWriterFactory.cs b/VectoCore/VectoCore/OutputData/XML/DeclarationReports/Common/IInternalResultWriterFactory.cs
index a1e02ed869..7aef9181b1 100644
--- a/VectoCore/VectoCore/OutputData/XML/DeclarationReports/Common/IInternalResultWriterFactory.cs
+++ b/VectoCore/VectoCore/OutputData/XML/DeclarationReports/Common/IInternalResultWriterFactory.cs
@@ -10,5 +10,8 @@ namespace TUGraz.VectoCore.OutputData.XML.DeclarationReports.Common
 		IResultsWriter GetMRFResultsWriter(
 			VehicleTypeAndArchitectureStringHelperResults.ResultsVehicleClassification vehicleClasiClassification);
 
+		IResultsWriter GetVIFResultsWriter(
+			VehicleTypeAndArchitectureStringHelperResults.ResultsVehicleClassification vehicleClasiClassification);
+
     }
 }
\ No newline at end of file
diff --git a/VectoCore/VectoCore/OutputData/XML/DeclarationReports/Common/IResultsWriter.cs b/VectoCore/VectoCore/OutputData/XML/DeclarationReports/Common/IResultsWriter.cs
index fa9fcf98e3..8c1be5c413 100644
--- a/VectoCore/VectoCore/OutputData/XML/DeclarationReports/Common/IResultsWriter.cs
+++ b/VectoCore/VectoCore/OutputData/XML/DeclarationReports/Common/IResultsWriter.cs
@@ -89,6 +89,7 @@ namespace TUGraz.VectoCore.OutputData.XML.DeclarationReports.Common
         IResultSequenceWriter GetSuccessMissionWriter(ICommonResultsWriterFactory factory, XNamespace ns);
 		IResultSequenceWriter GetErrorMissionWriter(ICommonResultsWriterFactory factory, XNamespace ns);
         IResultGroupWriter GetLorrySimulationParameterWriter(ICommonResultsWriterFactory factory, XNamespace ns);
+		IResultGroupWriter GetErrorSimulationParameterWriter(ICommonResultsWriterFactory factory, XNamespace ns);
 
         IResultGroupWriter GetLorryConvTotalWriter(ICommonResultsWriterFactory factory, XNamespace ns);
         IResultGroupWriter GetLorryHEVNonOVCTotalWriter(ICommonResultsWriterFactory factory, XNamespace ns);
diff --git a/VectoCore/VectoCore/OutputData/XML/DeclarationReports/Common/IResultsWriterFactory.cs b/VectoCore/VectoCore/OutputData/XML/DeclarationReports/Common/IResultsWriterFactory.cs
index 04f7c9db5d..5541fa5b91 100644
--- a/VectoCore/VectoCore/OutputData/XML/DeclarationReports/Common/IResultsWriterFactory.cs
+++ b/VectoCore/VectoCore/OutputData/XML/DeclarationReports/Common/IResultsWriterFactory.cs
@@ -10,5 +10,8 @@ namespace TUGraz.VectoCore.OutputData.XML.DeclarationReports.Common
 		IResultsWriter GetMRFResultsWriter(string vehicleCategory, VectoSimulationJobType jobType, bool ovc,
 			bool exempted);
 
+		IResultsWriter GetVIFResultsWriter(string vehicleCategory, VectoSimulationJobType jobType, bool ovc,
+			bool exempted);
+
     }
 }
\ No newline at end of file
diff --git a/VectoCore/VectoCore/OutputData/XML/DeclarationReports/Common/ResultGroupWriter.cs b/VectoCore/VectoCore/OutputData/XML/DeclarationReports/Common/ResultGroupWriter.cs
index 8e39e7e081..18703255bc 100644
--- a/VectoCore/VectoCore/OutputData/XML/DeclarationReports/Common/ResultGroupWriter.cs
+++ b/VectoCore/VectoCore/OutputData/XML/DeclarationReports/Common/ResultGroupWriter.cs
@@ -67,6 +67,24 @@ namespace TUGraz.VectoCore.OutputData.XML.DeclarationReports.Common
 		#endregion
 	}
 
+	public class ResultSimulationParameterErrorWriter : AbstractResultGroupWriter
+	{
+		public ResultSimulationParameterErrorWriter(ICommonResultsWriterFactory factory, XNamespace ns) : base(factory, ns) { }
+
+		#region Overrides of AbstractResultWriter
+
+		public override XElement GetElement(IResultEntry entry)
+		{
+			return new XElement(TNS + XMLNames.Report_ResultEntry_SimulationParameters,
+				new XElement(TNS + XMLNames.Report_ResultEntry_TotalVehicleMass,
+					XMLHelper.ValueAsUnit(entry.TotalVehicleMass, XMLNames.Unit_kg)),
+				new XElement(TNS + XMLNames.Report_ResultEntry_Payload,
+					XMLHelper.ValueAsUnit(entry.Payload, XMLNames.Unit_kg)));
+		}
+
+		#endregion
+	}
+
 	public class ElectricRangeWriter : AbstractResultWriter, IElectricRangeWriter
 	{
 		public ElectricRangeWriter(ICommonResultsWriterFactory factory, XNamespace ns) : base(factory, ns) { }
@@ -115,9 +133,9 @@ namespace TUGraz.VectoCore.OutputData.XML.DeclarationReports.Common
 
 			return new XElement(TNS + XMLNames.Report_Result_Result,
 				new XAttribute(XMLNames.Report_Result_Status_Attr, "error"),
-				new XAttribute(xsi + "type", "ResultErrorType"),
+				ResultXMLType != null ? new XAttribute(xsi + "type", ResultXMLType) : null,
 				_factory.GetErrorMissionWriter(_factory, TNS).GetElement(entry),
-				_factory.GetLorrySimulationParameterWriter(_factory, TNS).GetElement(entry),
+				_factory.GetErrorSimulationParameterWriter(_factory, TNS).GetElement(entry),
 				_factory.GetErrorDetailsWriter(_factory, TNS).GetElement(entry)
 			);
 		}
@@ -130,13 +148,15 @@ namespace TUGraz.VectoCore.OutputData.XML.DeclarationReports.Common
 			}
 			return new XElement(TNS + XMLNames.Report_Result_Result,
 				new XAttribute(XMLNames.Report_Result_Status_Attr, "error"),
-				new XAttribute(xsi + "type", "ResultErrorType"),
+				ResultXMLType != null ? new XAttribute(xsi + "type", ResultXMLType) : null,
 				_factory.GetErrorMissionWriter(_factory, TNS).GetElement(errorEntry),
-				_factory.GetLorrySimulationParameterWriter(_factory, TNS).GetElement(errorEntry),
+				_factory.GetErrorSimulationParameterWriter(_factory, TNS).GetElement(errorEntry),
 				_factory.GetErrorDetailsWriter(_factory, TNS).GetElement(errorEntry)
 			);
 		}
 
 		#endregion
+
+		protected virtual string ResultXMLType => "ResultErrorType";
 	}
 }
\ No newline at end of file
diff --git a/VectoCore/VectoCore/OutputData/XML/DeclarationReports/Common/ResultWriterFactory.cs b/VectoCore/VectoCore/OutputData/XML/DeclarationReports/Common/ResultWriterFactory.cs
index 3b753e4e78..44397115ff 100644
--- a/VectoCore/VectoCore/OutputData/XML/DeclarationReports/Common/ResultWriterFactory.cs
+++ b/VectoCore/VectoCore/OutputData/XML/DeclarationReports/Common/ResultWriterFactory.cs
@@ -40,6 +40,18 @@ namespace TUGraz.VectoCore.OutputData.XML.DeclarationReports.Common
 			}
         }
 
+		public IResultsWriter GetVIFResultsWriter(string vehicleCategory, VectoSimulationJobType jobType, bool ovc, bool exempted)
+		{
+			try {
+				return _internalFactory.GetVIFResultsWriter(
+					new VehicleTypeAndArchitectureStringHelperResults.ResultsVehicleClassification(
+						XmlDocumentType.MultistepOutputData, vehicleCategory,
+						jobType.GetPowertrainArchitectureType(), ovc, exempted));
+			} catch (Exception e) {
+				throw new Exception($"Could not create ResultsWriter for vehicle category {vehicleCategory}, {jobType}, ovc: {ovc}, exempted: {exempted}", e);
+			}
+		}
+
 		#endregion
     }
 }
\ No newline at end of file
diff --git a/VectoCore/VectoCore/OutputData/XML/DeclarationReports/Common/ResultsNinjectModule.cs b/VectoCore/VectoCore/OutputData/XML/DeclarationReports/Common/ResultsNinjectModule.cs
index 74850fa24d..2ec47d8781 100644
--- a/VectoCore/VectoCore/OutputData/XML/DeclarationReports/Common/ResultsNinjectModule.cs
+++ b/VectoCore/VectoCore/OutputData/XML/DeclarationReports/Common/ResultsNinjectModule.cs
@@ -25,7 +25,10 @@ namespace TUGraz.VectoCore.OutputData.XML.DeclarationReports.Common
 						typeof(IInternalResultWriterFactory).GetMethod(nameof(IInternalResultWriterFactory
 							.GetCIFResultsWriter)),
 						typeof(IInternalResultWriterFactory).GetMethod(nameof(IInternalResultWriterFactory
-							.GetMRFResultsWriter))
+							.GetMRFResultsWriter)),
+						typeof(IInternalResultWriterFactory).GetMethod(nameof(IInternalResultWriterFactory
+							.GetVIFResultsWriter))
+
 					}
 				})).InSingletonScope();
 		}
diff --git a/VectoCore/VectoCore/OutputData/XML/DeclarationReports/CustomerInformationFile/CustomerInformationFile_0_9/CIFResultsNinjectModule.cs b/VectoCore/VectoCore/OutputData/XML/DeclarationReports/CustomerInformationFile/CustomerInformationFile_0_9/CIFResultsNinjectModule.cs
index 630d288562..da90cf8a5a 100644
--- a/VectoCore/VectoCore/OutputData/XML/DeclarationReports/CustomerInformationFile/CustomerInformationFile_0_9/CIFResultsNinjectModule.cs
+++ b/VectoCore/VectoCore/OutputData/XML/DeclarationReports/CustomerInformationFile/CustomerInformationFile_0_9/CIFResultsNinjectModule.cs
@@ -71,6 +71,9 @@ namespace TUGraz.VectoCore.OutputData.XML.DeclarationReports.CustomerInformation
 			Bind<IResultGroupWriter>().To<ResultSimulationParameterLorryWriter>().When(AccessedViaCIFResultsWriterFactory)
 				.NamedLikeFactoryMethod((ICIFResultsWriterFactory c) => c.GetLorrySimulationParameterWriter(null, XNamespace.None));
 
+			Bind<IResultGroupWriter>().To<ResultSimulationParameterLorryWriter>().When(AccessedViaCIFResultsWriterFactory)
+				.NamedLikeFactoryMethod((ICIFResultsWriterFactory c) => c.GetErrorSimulationParameterWriter(null, XNamespace.None));
+
 			Bind<IResultGroupWriter>().To<LorryConvTotalWriter>().When(AccessedViaCIFResultsWriterFactory)
 				.NamedLikeFactoryMethod((ICIFResultsWriterFactory c) => c.GetLorryConvTotalWriter(null, XNamespace.None));
 			Bind<IResultGroupWriter>().To<LorryHEVNonOVCTotalWriter>().When(AccessedViaCIFResultsWriterFactory)
diff --git a/VectoCore/VectoCore/OutputData/XML/DeclarationReports/ManufacturerReport/ManufacturerReport_0_9/MRFResultsNinjectModule.cs b/VectoCore/VectoCore/OutputData/XML/DeclarationReports/ManufacturerReport/ManufacturerReport_0_9/MRFResultsNinjectModule.cs
index d5d909ab6b..ae25772560 100644
--- a/VectoCore/VectoCore/OutputData/XML/DeclarationReports/ManufacturerReport/ManufacturerReport_0_9/MRFResultsNinjectModule.cs
+++ b/VectoCore/VectoCore/OutputData/XML/DeclarationReports/ManufacturerReport/ManufacturerReport_0_9/MRFResultsNinjectModule.cs
@@ -71,6 +71,9 @@ namespace TUGraz.VectoCore.OutputData.XML.DeclarationReports.CustomerInformation
             Bind<IResultGroupWriter>().To<ResultSimulationParameterLorryWriter>().When(AccessedViaMRFResultsWriterFactory)
                 .NamedLikeFactoryMethod((IMRFResultsWriterFactory c) => c.GetLorrySimulationParameterWriter(null, XNamespace.None));
 
+			Bind<IResultGroupWriter>().To<ResultSimulationParameterErrorWriter>().When(AccessedViaMRFResultsWriterFactory)
+				.NamedLikeFactoryMethod((IMRFResultsWriterFactory c) => c.GetErrorSimulationParameterWriter(null, XNamespace.None));
+
             Bind<IResultGroupWriter>().To<LorryConvTotalWriter>().When(AccessedViaMRFResultsWriterFactory)
                 .NamedLikeFactoryMethod((IMRFResultsWriterFactory c) => c.GetLorryConvTotalWriter(null, XNamespace.None));
             Bind<IResultGroupWriter>().To<LorryHEVNonOVCTotalWriter>().When(AccessedViaMRFResultsWriterFactory)
diff --git a/VectoCore/VectoCore/OutputData/XML/DeclarationReports/ManufacturerReport/ManufacturerReport_0_9/ResultWriter/MRFResultWriter.cs b/VectoCore/VectoCore/OutputData/XML/DeclarationReports/ManufacturerReport/ManufacturerReport_0_9/ResultWriter/MRFResultsWriter.cs
similarity index 100%
rename from VectoCore/VectoCore/OutputData/XML/DeclarationReports/ManufacturerReport/ManufacturerReport_0_9/ResultWriter/MRFResultWriter.cs
rename to VectoCore/VectoCore/OutputData/XML/DeclarationReports/ManufacturerReport/ManufacturerReport_0_9/ResultWriter/MRFResultsWriter.cs
diff --git a/VectoCore/VectoCore/OutputData/XML/DeclarationReports/VehicleInformationFile/VehicleInformationFile_0_1/ResultWriter/IVIFResultsWriterFactory.cs b/VectoCore/VectoCore/OutputData/XML/DeclarationReports/VehicleInformationFile/VehicleInformationFile_0_1/ResultWriter/IVIFResultsWriterFactory.cs
new file mode 100644
index 0000000000..c77632fd47
--- /dev/null
+++ b/VectoCore/VectoCore/OutputData/XML/DeclarationReports/VehicleInformationFile/VehicleInformationFile_0_1/ResultWriter/IVIFResultsWriterFactory.cs
@@ -0,0 +1,6 @@
+using TUGraz.VectoCore.OutputData.XML.DeclarationReports.Common;
+
+namespace TUGraz.VectoCore.OutputData.XML.DeclarationReports.VehicleInformationFile.VehicleInformationFile_0_1.ResultWriter
+{
+	public interface IVIFResultsWriterFactory : ICommonResultsWriterFactory { }
+}
\ No newline at end of file
diff --git a/VectoCore/VectoCore/OutputData/XML/DeclarationReports/VehicleInformationFile/VehicleInformationFile_0_1/ResultWriter/ResultGroupWriter.cs b/VectoCore/VectoCore/OutputData/XML/DeclarationReports/VehicleInformationFile/VehicleInformationFile_0_1/ResultWriter/ResultGroupWriter.cs
new file mode 100644
index 0000000000..84275be7fe
--- /dev/null
+++ b/VectoCore/VectoCore/OutputData/XML/DeclarationReports/VehicleInformationFile/VehicleInformationFile_0_1/ResultWriter/ResultGroupWriter.cs
@@ -0,0 +1,229 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Xml.Linq;
+using TUGraz.VectoCommon.BusAuxiliaries;
+using TUGraz.VectoCommon.Models;
+using TUGraz.VectoCommon.Resources;
+using TUGraz.VectoCommon.Utils;
+using TUGraz.VectoCore.Models.Declaration;
+using TUGraz.VectoCore.OutputData.XML.DeclarationReports.Common;
+using TUGraz.VectoCore.Utils;
+
+namespace TUGraz.VectoCore.OutputData.XML.DeclarationReports.VehicleInformationFile.VehicleInformationFile_0_1.ResultWriter
+{
+	public class VIFErrorResultWriter : ErrorResultWriter
+	{
+		public VIFErrorResultWriter(ICommonResultsWriterFactory factory, XNamespace ns) : base(factory, ns) { }
+
+		#region Overrides of ErrorResultWriter
+
+		protected override string ResultXMLType => null;
+
+		#endregion
+	}
+
+	public class ResultSimulationParameterVIFBusWriter : AbstractResultGroupWriter
+	{
+		public ResultSimulationParameterVIFBusWriter(ICommonResultsWriterFactory factory, XNamespace ns) : base(factory, ns) { }
+
+		#region Overrides of AbstractResultWriter
+
+		public override XElement GetElement(IResultEntry entry)
+		{
+			return new XElement(TNS + XMLNames.Report_ResultEntry_SimulationParameters,
+				new XElement(TNS + XMLNames.Report_ResultEntry_TotalVehicleMass,
+					entry.TotalVehicleMass.ValueAsUnit(XMLNames.Unit_kg)),
+				new XElement(TNS + XMLNames.Report_Result_Payload,
+					entry.Payload.ValueAsUnit(XMLNames.Unit_kg)),
+				new XElement(TNS + XMLNames.Report_Result_PassengerCount,
+					(entry.PassengerCount ?? double.NaN).ToXMLFormat(2))
+			);
+		}
+
+		#endregion
+	}
+
+	public class VIFResultErrorMissionWriter : AbstractResultWriter, IResultSequenceWriter
+	{
+		public VIFResultErrorMissionWriter(ICommonResultsWriterFactory factory, XNamespace ns) : base(factory, ns) { }
+
+		#region Overrides of AbstractResultWriter
+
+		public virtual XElement[] GetElement(IResultEntry entry)
+		{
+			return new[] {
+				new XElement(TNS + XMLNames.Report_Results_PrimaryVehicleSubgroup, entry.VehicleClass.ToXML()),
+				new XElement(TNS + XMLNames.Report_Result_Mission, entry.Mission.ToXMLFormat())
+			};
+		}
+
+		public XElement[] GetElement(IOVCResultEntry entry)
+		{
+			return null;
+		}
+
+		#endregion
+	}
+
+	public class VIFResultSimulationParameterErrorWriter : AbstractResultGroupWriter
+	{
+		public VIFResultSimulationParameterErrorWriter(ICommonResultsWriterFactory factory, XNamespace ns) : base(factory, ns) { }
+
+		#region Overrides of AbstractResultWriter
+
+		public override XElement GetElement(IResultEntry entry)
+		{
+			return new XElement(TNS + XMLNames.Report_ResultEntry_SimulationParameters,
+				new XElement(TNS + XMLNames.Report_ResultEntry_TotalVehicleMass,
+					XMLHelper.ValueAsUnit(entry.TotalVehicleMass, XMLNames.Unit_kg)),
+				new XElement(TNS + XMLNames.Report_ResultEntry_Payload,
+					XMLHelper.ValueAsUnit(entry.Payload, XMLNames.Unit_kg)),
+				new XElement(TNS + XMLNames.Report_ResultEntry_PassengerCount,
+					entry.PassengerCount?.ToXMLFormat(2) ?? "NaN")
+				);
+		}
+
+		#endregion
+	}
+
+
+	public class VehiclePerformanceVIFWriter : AbstractResultGroupWriter
+	{
+		public VehiclePerformanceVIFWriter(ICommonResultsWriterFactory factory, XNamespace ns) : base(factory, ns) { }
+
+		#region Overrides of AbstractResultGroupWriter
+
+		public override XElement GetElement(IResultEntry entry)
+		{
+			return null;
+		}
+
+		public override XElement GetElement(IOVCResultEntry entry)
+		{
+			return null;
+		}
+
+		#endregion
+	}
+
+	public class VIFFuelConsumptionWriter : AbstractResultWriter, IFuelConsumptionWriter
+	{
+		public VIFFuelConsumptionWriter(ICommonResultsWriterFactory factory, XNamespace ns) : base(factory, ns) { }
+
+
+		#region Implementation of IFuelConsumptionWriter
+
+		public XElement GetElement(IResultEntry entry, IFuelConsumptionCorrection fc)
+		{
+			return new XElement(TNS + XMLNames.Report_Results_Fuel,
+				new XAttribute(XMLNames.Report_Results_Fuel_Type_Attr, fc.Fuel.FuelType.ToXMLFormat()),
+				GetFuelConsumptionEntries(fc.TotalFuelConsumptionCorrected, fc.Fuel, entry.Distance, entry.Payload,
+					entry.CargoVolume, entry.PassengerCount).Select(x =>
+					new XElement(TNS + XMLNames.Report_Result_EnergyConsumption, x.ValueAsUnit(3, 1)))
+			);
+		}
+
+		public XElement GetElement(IWeightedResult entry, IFuelProperties fuel, Kilogram consumption)
+		{
+			return new XElement(TNS + XMLNames.Report_Results_Fuel,
+				new XAttribute(XMLNames.Report_Results_Fuel_Type_Attr, fuel.FuelType.ToXMLFormat()),
+				GetFuelConsumptionEntries(consumption, fuel, entry.Distance, entry.Payload, entry.CargoVolume,
+					entry.PassengerCount).Select(x =>
+					new XElement(TNS + XMLNames.Report_Result_EnergyConsumption, x.ValueAsUnit(3, 1)))
+			);
+		}
+
+		#endregion
+
+		protected virtual IList<ConvertedSI> GetFuelConsumptionEntries(Kilogram fc, IFuelProperties fuel,
+			Meter distance, Kilogram payload, CubicMeter volume, double? passenger)
+		{
+			return new List<ConvertedSI> {
+				(fc * fuel.LowerHeatingValueVecto / distance).ConvertToMegaJoulePerKilometer(),
+			};
+		}
+
+	}
+
+	public class VIFElectricEnergyConsumptionWriter : ElectricEnergyConsumptionWriterBase
+	{
+		public VIFElectricEnergyConsumptionWriter(ICommonResultsWriterFactory factory, XNamespace ns) : base(factory, ns) { }
+
+		#region Overrides of ElectricEnergyConsumptionWriterBase
+
+		protected override string ElectricEnergyConsumptionXMLElementName => "ElectricEnergyConsumption";
+
+
+		protected override IList<ConvertedSI> GetEnergyConsumption(WattSecond elEnergy, Meter distance,
+			Kilogram payload, CubicMeter volume, double? passengers)
+		{
+			return new[] {
+				(elEnergy / distance).ConvertToMegaJoulePerKiloMeter(),
+			};
+		}
+
+		#endregion
+	}
+
+	public class VIFCO2Writer : ICO2Writer
+	{
+		#region Implementation of ICO2Writer
+
+		public XElement[] GetElements(IResultEntry entry)
+		{
+			return null;
+		}
+
+		public XElement[] GetElements(IWeightedResult entry)
+		{
+			return null;
+		}
+
+		#endregion
+	}
+
+	public class VIFResultSuccessMissionWriter : AbstractResultWriter, IResultSequenceWriter
+	{
+		public VIFResultSuccessMissionWriter(ICommonResultsWriterFactory factory, XNamespace ns) : base(factory, ns) { }
+
+		#region Overrides of AbstractResultWriter
+
+		public virtual XElement[] GetElement(IResultEntry entry)
+		{
+			return new[] {
+				new XElement(TNS + XMLNames.Report_Results_PrimaryVehicleSubgroup, entry.VehicleClass.ToXML()),
+				new XElement(TNS + XMLNames.Report_Result_Mission, entry.Mission.ToXMLFormat())
+			};
+		}
+
+		public XElement[] GetElement(IOVCResultEntry entry)
+		{
+			return null;
+		}
+
+		#endregion
+	}
+
+	public class VIFErrorDetailsWriter : AbstractResultWriter, IResultSequenceWriter
+	{
+		public VIFErrorDetailsWriter(ICommonResultsWriterFactory factory, XNamespace ns) : base(factory, ns) { }
+
+		#region Implementation of IResultSequenceWriter
+
+		public XElement[] GetElement(IResultEntry entry)
+		{
+			return new[] {
+				new XElement(TNS + XMLNames.Report_Results_Error, entry.Error),
+				new XElement(TNS + XMLNames.Report_Results_ErrorDetails, entry.StackTrace)
+			};
+		}
+
+		public XElement[] GetElement(IOVCResultEntry entry)
+		{
+			throw new NotImplementedException();
+		}
+
+		#endregion
+	}
+}
\ No newline at end of file
diff --git a/VectoCore/VectoCore/OutputData/XML/DeclarationReports/VehicleInformationFile/VehicleInformationFile_0_1/ResultWriter/ResultWriter.cs b/VectoCore/VectoCore/OutputData/XML/DeclarationReports/VehicleInformationFile/VehicleInformationFile_0_1/ResultWriter/ResultWriter.cs
new file mode 100644
index 0000000000..a18a13594a
--- /dev/null
+++ b/VectoCore/VectoCore/OutputData/XML/DeclarationReports/VehicleInformationFile/VehicleInformationFile_0_1/ResultWriter/ResultWriter.cs
@@ -0,0 +1,145 @@
+using System;
+using System.Linq;
+using System.Xml.Linq;
+using TUGraz.VectoCommon.Resources;
+using TUGraz.VectoCore.OutputData.XML.DeclarationReports.Common;
+
+namespace TUGraz.VectoCore.OutputData.XML.DeclarationReports.VehicleInformationFile.VehicleInformationFile_0_1.
+	ResultWriter
+{
+
+	public abstract class VIFResultWriterBase : AbstractResultGroupWriter
+	{
+		protected VIFResultWriterBase(ICommonResultsWriterFactory factory, XNamespace ns) : base(factory, ns) { }
+
+		#region Overrides of AbstractResultGroupWriter
+
+		public override XElement GetElement(IResultEntry entry)
+		{
+			return new XElement(TNS + XMLNames.Report_Result_Result,
+				new XAttribute(XMLNames.Report_Result_Status_Attr, "success"),
+				//new XAttribute(xsi + "type", ResultXMLType),
+				_factory.GetSuccessMissionWriter(_factory, TNS).GetElement(entry),
+				SimulationParameterWriter.GetElement(entry),
+				entry.FuelData.Select(f =>
+					FuelConsumptionWriter?.GetElement(entry, entry.FuelConsumptionFinal(f.FuelType))),
+				ElectricEnergyConsumptionWriter?.GetElement(entry)
+			);
+		}
+		#endregion
+
+		//public virtual string ResultXMLType => "ResultPrimaryVehicleType";
+
+		public abstract IResultGroupWriter SimulationParameterWriter { get; }
+
+		protected abstract IFuelConsumptionWriter FuelConsumptionWriter { get; }
+
+		protected abstract IElectricEnergyConsumptionWriter ElectricEnergyConsumptionWriter { get; }
+
+	}
+
+	public class VIFConvResultWriter : VIFResultWriterBase
+	{
+		public VIFConvResultWriter(ICommonResultsWriterFactory factory, XNamespace ns) : base(factory, ns) { }
+
+		#region Overrides of CIFResultWriterBase
+		
+		public override IResultGroupWriter SimulationParameterWriter => _factory.GetBusSimulationParameterWriter(_factory, TNS);
+		protected override IFuelConsumptionWriter FuelConsumptionWriter => _factory.GetFuelConsumptionBus(_factory, TNS);
+		protected override IElectricEnergyConsumptionWriter ElectricEnergyConsumptionWriter => null;
+
+		#endregion
+	}
+
+	public class VIFHEVNonOVCResultWriter : VIFResultWriterBase
+	{
+		public VIFHEVNonOVCResultWriter(ICommonResultsWriterFactory factory, XNamespace ns) : base(factory, ns) { }
+
+		#region Overrides of CIFResultWriterBase
+		
+		public override IResultGroupWriter SimulationParameterWriter => _factory.GetBusSimulationParameterWriter(_factory, TNS);
+		protected override IFuelConsumptionWriter FuelConsumptionWriter => _factory.GetFuelConsumptionBus(_factory, TNS);
+		protected override IElectricEnergyConsumptionWriter ElectricEnergyConsumptionWriter => _factory.GetElectricEnergyConsumptionBus(_factory, TNS);
+
+		#endregion
+	}
+
+	public class VIFPEVResultWriter : VIFResultWriterBase
+	{
+		public VIFPEVResultWriter(ICommonResultsWriterFactory factory, XNamespace ns) : base(factory, ns) { }
+
+		#region Overrides of CIFResultWriterBase
+		
+		public override IResultGroupWriter SimulationParameterWriter => _factory.GetBusSimulationParameterWriter(_factory, TNS);
+		protected override IFuelConsumptionWriter FuelConsumptionWriter => null;
+		protected override IElectricEnergyConsumptionWriter ElectricEnergyConsumptionWriter => _factory.GetElectricEnergyConsumptionBus(_factory, TNS);
+
+		#endregion
+	}
+
+	public class VIFHEVOVCResultWriter : AbstractResultGroupWriter
+	{
+
+		public VIFHEVOVCResultWriter(ICommonResultsWriterFactory factory, XNamespace ns) : base(factory, ns) { }
+
+		#region Implementation of IResultGroupWriter
+
+		public override XElement GetElement(IResultEntry entry)
+		{
+			throw new NotImplementedException();
+		}
+
+		public override XElement GetElement(IOVCResultEntry entry)
+		{
+			return new XElement(TNS + XMLNames.Report_Result_Result,
+				new XAttribute(XMLNames.Report_Result_Status_Attr, "success"),
+				_factory.GetSuccessMissionWriter(_factory, TNS).GetElement(entry.ChargeDepletingResult),
+				_factory.GetBusSimulationParameterWriter(_factory, TNS).GetElement(entry.ChargeDepletingResult),
+				_factory.GetBusHEVOVCResultWriterChargeDepleting(_factory, TNS).GetElement(entry.ChargeDepletingResult),
+				_factory.GetBusHEVOVCResultWriterChargeSustaining(_factory, TNS).GetElement(entry.ChargeSustainingResult)
+			);
+		}
+
+		#endregion
+
+	}
+
+	public abstract class VIFOVCCModeWriterBase : AbstractResultGroupWriter
+	{
+		protected VIFOVCCModeWriterBase(ICommonResultsWriterFactory factory, XNamespace ns) : base(factory, ns) { }
+
+		public override XElement GetElement(IResultEntry entry)
+		{
+			return new XElement(TNS + "OVCMode",
+				new XAttribute("type", OVCMode),
+				entry.FuelData.Select(f =>
+					_factory.GetFuelConsumptionBus(_factory, TNS).GetElement(entry, entry.FuelConsumptionFinal(f.FuelType))),
+				_factory.GetElectricEnergyConsumptionBus(_factory, TNS).GetElement(entry)
+			);
+		}
+
+		public abstract  string OVCMode { get; }
+	}
+
+	public class VIFOVCChargeDepletingWriter : VIFOVCCModeWriterBase
+	{
+		public VIFOVCChargeDepletingWriter(ICommonResultsWriterFactory factory, XNamespace ns) : base(factory, ns) { }
+
+		#region Overrides of VIFOVCCModeWriter
+
+		public override string OVCMode => "charge depleting";
+		
+		#endregion
+	}
+
+	public class VIFOVCChargeSustainingWriter : VIFOVCCModeWriterBase
+	{
+		public VIFOVCChargeSustainingWriter(ICommonResultsWriterFactory factory, XNamespace ns) : base(factory, ns) { }
+
+		#region Overrides of VIFOVCCModeWriter
+
+		public override string OVCMode => "charge sustaining";
+
+		#endregion
+	}
+}
\ No newline at end of file
diff --git a/VectoCore/VectoCore/OutputData/XML/DeclarationReports/VehicleInformationFile/VehicleInformationFile_0_1/ResultWriter/VIFResultsWriter.cs b/VectoCore/VectoCore/OutputData/XML/DeclarationReports/VehicleInformationFile/VehicleInformationFile_0_1/ResultWriter/VIFResultsWriter.cs
new file mode 100644
index 0000000000..c6ff97b8aa
--- /dev/null
+++ b/VectoCore/VectoCore/OutputData/XML/DeclarationReports/VehicleInformationFile/VehicleInformationFile_0_1/ResultWriter/VIFResultsWriter.cs
@@ -0,0 +1,103 @@
+using System.Collections.Generic;
+using System.Linq;
+using System.Xml.Linq;
+using TUGraz.VectoCommon.Resources;
+using TUGraz.VectoCore.Models.Simulation.Impl;
+using TUGraz.VectoCore.OutputData.XML.DeclarationReports.Common;
+using TUGraz.VectoCore.OutputData.XML.DeclarationReports.CustomerInformationFile.CustomerInformationFile_0_9.ResultWriter;
+
+namespace TUGraz.VectoCore.OutputData.XML.DeclarationReports.VehicleInformationFile.VehicleInformationFile_0_1.ResultWriter
+{
+	public abstract class AbstractVIFFResultsWriter : AbstractResultsWriter
+	{
+		protected readonly IVIFResultsWriterFactory _vifFactory;
+
+		protected AbstractVIFFResultsWriter(IVIFResultsWriterFactory vifFactory)
+		{
+			_vifFactory = vifFactory;
+		}
+		protected override XNamespace TNS => "urn:tugraz:ivt:VectoAPI:DeclarationOutput:VehicleInterimFile:v0.1";
+
+	}
+
+	public class VIFResultsWriter
+	{
+		public class ConventionalBus : AbstractVIFFResultsWriter
+		{
+			public ConventionalBus(IVIFResultsWriterFactory vifFactory) : base(vifFactory) { }
+
+			protected override IResultGroupWriter ResultSuccessWriter => _vifFactory.GetBusConvSuccessResultWriter(_vifFactory, TNS);
+			protected override IResultGroupWriter ResultErrorWriter => _vifFactory.GetBusErrorResultWriter(_vifFactory, TNS);
+			public override IReportResultsSummaryWriter SummaryWriter => _vifFactory.GetBusConvSummaryWriter(_vifFactory, TNS);
+
+		}
+
+		public class HEVNonOVCBus : AbstractVIFFResultsWriter
+		{
+			public HEVNonOVCBus(IVIFResultsWriterFactory vifFactory) : base(vifFactory) { }
+
+			protected override IResultGroupWriter ResultSuccessWriter => _vifFactory.GetBusHEVNonOVCSuccessResultWriter(_vifFactory, TNS);
+			protected override IResultGroupWriter ResultErrorWriter => _vifFactory.GetBusErrorResultWriter(_vifFactory, TNS);
+			public override IReportResultsSummaryWriter SummaryWriter => _vifFactory.GetBusHEVNonOVCSummaryWriter(_vifFactory, TNS);
+
+		}
+
+		public class HEVOVCBus : AbstractVIFFResultsWriter
+		{
+			public HEVOVCBus(IVIFResultsWriterFactory vifFactory) : base(vifFactory) { }
+
+			public override XElement GenerateResults(List<IResultEntry> results)
+			{
+				var ordered = GetOrderedResultsOVC(results);
+				var allSuccess = results.All(x => x.Status == VectoRun.Status.Success);
+				return new XElement(TNS + "Results",
+					new XElement(TNS + XMLNames.Report_Result_Status, allSuccess ? "success" : "error"),
+					ordered.Select(x =>
+						x.ChargeDepletingResult.Status == VectoRun.Status.Success &&
+						x.ChargeSustainingResult.Status == VectoRun.Status.Success
+							? ResultSuccessWriter.GetElement(x)
+							: ResultErrorWriter.GetElement(x)),
+					SummaryWriter.GetElement(ordered)
+				);
+			}
+
+			protected override IResultGroupWriter ResultSuccessWriter => _vifFactory.GetBusHEVOVCSuccessResultWriter(_vifFactory, TNS);
+			protected override IResultGroupWriter ResultErrorWriter => _vifFactory.GetBusErrorResultWriter(_vifFactory, TNS);
+			public override IReportResultsSummaryWriter SummaryWriter => _vifFactory.GetBusHEVOVCSummaryWriter(_vifFactory, TNS);
+
+		}
+
+		public class PEVBus : AbstractVIFFResultsWriter
+		{
+			public PEVBus(IVIFResultsWriterFactory vifFactory) : base(vifFactory) { }
+
+			protected override IResultGroupWriter ResultSuccessWriter => _vifFactory.GetBusPEVSuccessResultWriter(_vifFactory, TNS);
+			protected override IResultGroupWriter ResultErrorWriter => _vifFactory.GetBusErrorResultWriter(_vifFactory, TNS);
+			public override IReportResultsSummaryWriter SummaryWriter => _vifFactory.GetBusPEVSummaryWriter(_vifFactory, TNS);
+
+		}
+
+		public class ExemptedVehicle : AbstractVIFFResultsWriter
+		{
+			public ExemptedVehicle(IVIFResultsWriterFactory vifFactory) : base(vifFactory) { }
+
+			#region Implementation of IResultsWriter
+
+			public override XElement GenerateResults(List<IResultEntry> results)
+			{
+				return new XElement(TNS + "Results",
+					new XElement(TNS + "Status", "success"),
+					new XElement(TNS + "ExemptedVehicle"));
+			}
+
+			protected override IResultGroupWriter ResultSuccessWriter => null;
+			protected override IResultGroupWriter ResultErrorWriter => null;
+			public override IReportResultsSummaryWriter SummaryWriter => null;
+
+
+			#endregion
+
+
+		}
+	}
+}
\ No newline at end of file
diff --git a/VectoCore/VectoCore/OutputData/XML/DeclarationReports/VehicleInformationFile/VehicleInformationFile_0_1/VIFResultsNinjectModule.cs b/VectoCore/VectoCore/OutputData/XML/DeclarationReports/VehicleInformationFile/VehicleInformationFile_0_1/VIFResultsNinjectModule.cs
new file mode 100644
index 0000000000..deaa694af5
--- /dev/null
+++ b/VectoCore/VectoCore/OutputData/XML/DeclarationReports/VehicleInformationFile/VehicleInformationFile_0_1/VIFResultsNinjectModule.cs
@@ -0,0 +1,106 @@
+using System.Xml.Linq;
+using Ninject.Activation;
+using Ninject.Extensions.Factory;
+using Ninject.Modules;
+using TUGraz.VectoCommon.InputData;
+using TUGraz.VectoCommon.Models;
+using TUGraz.VectoCore.OutputData.XML.DeclarationReports.Common;
+using TUGraz.VectoCore.OutputData.XML.DeclarationReports.CustomerInformationFile.CustomerInformationFile_0_9.ResultWriter;
+using TUGraz.VectoCore.OutputData.XML.DeclarationReports.VehicleInformationFile.VehicleInformationFile_0_1.ResultWriter;
+using TUGraz.VectoCore.Utils;
+using TUGraz.VectoCore.Utils.Ninject;
+
+namespace TUGraz.VectoCore.OutputData.XML.DeclarationReports.VehicleInformationFile.VehicleInformationFile_0_1
+{
+	public class VIFResultsNinjectModule : NinjectModule
+	{
+		private VehicleTypeAndArchitectureStringHelperResults _namingHelper =
+			new VehicleTypeAndArchitectureStringHelperResults();
+
+		#region Overrides of NinjectModule
+
+		public override void Load()
+		{
+			Bind<IVIFResultsWriterFactory>().ToFactory().InSingletonScope();
+
+			var vif = XmlDocumentType.MultistepOutputData;
+			Bind<IResultsWriter>().To<VIFResultsWriter.ConventionalBus>().Named(
+				_namingHelper.GetName(vif, VehicleCategoryHelper.PrimaryBus, VectoSimulationJobTypeHelper.Conventional, false));
+			Bind<IResultsWriter>().To<VIFResultsWriter.HEVNonOVCBus>().Named(
+				_namingHelper.GetName(vif, VehicleCategoryHelper.PrimaryBus, VectoSimulationJobTypeHelper.Hybrid, false));
+			Bind<IResultsWriter>().To<VIFResultsWriter.HEVOVCBus>().Named(
+				_namingHelper.GetName(vif, VehicleCategoryHelper.PrimaryBus, VectoSimulationJobTypeHelper.Hybrid, true));
+			Bind<IResultsWriter>().To<VIFResultsWriter.PEVBus>().Named(
+				_namingHelper.GetName(vif, VehicleCategoryHelper.PrimaryBus, VectoSimulationJobTypeHelper.PureElectric, true));
+			Bind<IResultsWriter>().To<VIFResultsWriter.ExemptedVehicle>().Named(
+				_namingHelper.GetName(vif, VehicleCategoryHelper.PrimaryBus, true));
+
+			// --- Primary Bus
+
+			Bind<IResultGroupWriter>().To<VIFConvResultWriter>().When(AccessedViaVIFResultsWriterFactory)
+				.NamedLikeFactoryMethod((IVIFResultsWriterFactory c) => c.GetBusConvSuccessResultWriter(null, XNamespace.None));
+			Bind<IResultGroupWriter>().To<VIFHEVNonOVCResultWriter>().When(AccessedViaVIFResultsWriterFactory)
+				.NamedLikeFactoryMethod((IVIFResultsWriterFactory c) => c.GetBusHEVNonOVCSuccessResultWriter(null, XNamespace.None));
+			Bind<IResultGroupWriter>().To<VIFHEVOVCResultWriter>().When(AccessedViaVIFResultsWriterFactory)
+				.NamedLikeFactoryMethod((IVIFResultsWriterFactory c) => c.GetBusHEVOVCSuccessResultWriter(null, XNamespace.None));
+			Bind<IResultGroupWriter>().To<VIFOVCChargeDepletingWriter>().When(AccessedViaVIFResultsWriterFactory)
+				.NamedLikeFactoryMethod((IVIFResultsWriterFactory c) => c.GetBusHEVOVCResultWriterChargeDepleting(null, XNamespace.None));
+			Bind<IResultGroupWriter>().To<VIFOVCChargeSustainingWriter>().When(AccessedViaVIFResultsWriterFactory)
+				.NamedLikeFactoryMethod((IVIFResultsWriterFactory c) => c.GetBusHEVOVCResultWriterChargeSustaining(null, XNamespace.None));
+			Bind<IResultGroupWriter>().To<VIFPEVResultWriter>().When(AccessedViaVIFResultsWriterFactory)
+				.NamedLikeFactoryMethod((IVIFResultsWriterFactory c) => c.GetBusPEVSuccessResultWriter(null, XNamespace.None));
+
+			Bind<IResultSequenceWriter>().To<VIFResultSuccessMissionWriter>().When(AccessedViaVIFResultsWriterFactory)
+				.NamedLikeFactoryMethod((IMRFResultsWriterFactory c) => c.GetSuccessMissionWriter(null, XNamespace.None));
+			Bind<IResultGroupWriter>().To<ResultSimulationParameterVIFBusWriter>().When(AccessedViaVIFResultsWriterFactory)
+				.NamedLikeFactoryMethod((IVIFResultsWriterFactory c) => c.GetBusSimulationParameterWriter(null, XNamespace.None));
+
+			Bind<IResultGroupWriter>().To<VehiclePerformanceVIFWriter>().When(AccessedViaVIFResultsWriterFactory)
+				.NamedLikeFactoryMethod((IMRFResultsWriterFactory c) => c.GetVehiclePerformanceBus(null, XNamespace.None));
+			Bind<IResultGroupWriter>().To<VehiclePerformanceVIFWriter>().When(AccessedViaVIFResultsWriterFactory)
+				.NamedLikeFactoryMethod((IMRFResultsWriterFactory c) => c.GetVehiclePerformancePEVBus(null, XNamespace.None));
+
+			Bind<IFuelConsumptionWriter>().To<VIFFuelConsumptionWriter>().When(AccessedViaVIFResultsWriterFactory)
+				.NamedLikeFactoryMethod((IMRFResultsWriterFactory c) => c.GetFuelConsumptionBus(null, XNamespace.None));
+			Bind<IElectricEnergyConsumptionWriter>().To<VIFElectricEnergyConsumptionWriter>().When(AccessedViaVIFResultsWriterFactory)
+				.NamedLikeFactoryMethod((IMRFResultsWriterFactory c) => c.GetElectricEnergyConsumptionBus(null, XNamespace.None));
+			Bind<ICO2Writer>().To<VIFCO2Writer>().When(AccessedViaVIFResultsWriterFactory)
+				.NamedLikeFactoryMethod((IMRFResultsWriterFactory c) => c.GetCO2ResultBus(null, XNamespace.None));
+			Bind<ICO2Writer>().To<VIFCO2Writer>().When(AccessedViaVIFResultsWriterFactory)
+				.NamedLikeFactoryMethod((IMRFResultsWriterFactory c) => c.GetCO2ResultPEVBus(null, XNamespace.None));
+
+
+			Bind<IResultGroupWriter>().To<VIFErrorResultWriter>().When(AccessedViaVIFResultsWriterFactory)
+				.NamedLikeFactoryMethod((IVIFResultsWriterFactory c) => c.GetBusErrorResultWriter(null, XNamespace.None));
+			Bind<IResultSequenceWriter>().To<VIFResultErrorMissionWriter>().When(AccessedViaVIFResultsWriterFactory)
+				.NamedLikeFactoryMethod((IVIFResultsWriterFactory c) => c.GetErrorMissionWriter(null, XNamespace.None));
+			Bind<IResultGroupWriter>().To<VIFResultSimulationParameterErrorWriter>().When(AccessedViaVIFResultsWriterFactory)
+				.NamedLikeFactoryMethod((IVIFResultsWriterFactory c) => c.GetErrorSimulationParameterWriter(null, XNamespace.None));
+			Bind<IResultSequenceWriter>().To<VIFErrorDetailsWriter>().When(AccessedViaVIFResultsWriterFactory)
+				.NamedLikeFactoryMethod((ICIFResultsWriterFactory c) => c.GetErrorDetailsWriter(null, XNamespace.None));
+
+
+
+			Bind<IReportResultsSummaryWriter>().To<NoSummaryWriter>().When(AccessedViaVIFResultsWriterFactory)
+				.NamedLikeFactoryMethod((IVIFResultsWriterFactory c) => c.GetBusConvSummaryWriter(null, XNamespace.None));
+			Bind<IReportResultsSummaryWriter>().To<NoSummaryWriter>().When(AccessedViaVIFResultsWriterFactory)
+				.NamedLikeFactoryMethod((IVIFResultsWriterFactory c) => c.GetBusHEVNonOVCSummaryWriter(null, XNamespace.None));
+			Bind<IReportResultsSummaryWriter>().To<NoSummaryWriter>().When(AccessedViaVIFResultsWriterFactory)
+				.NamedLikeFactoryMethod((IVIFResultsWriterFactory c) => c.GetBusHEVOVCSummaryWriter(null, XNamespace.None));
+			Bind<IReportResultsSummaryWriter>().To<NoSummaryWriter>().When(AccessedViaVIFResultsWriterFactory)
+				.NamedLikeFactoryMethod((IVIFResultsWriterFactory c) => c.GetBusPEVSummaryWriter(null, XNamespace.None));
+
+		}
+
+		#endregion
+
+		private bool AccessedViaVIFResultsWriterFactory(IRequest request)
+		{
+			if (request.ParentRequest == null) {
+				return false;
+			}
+
+			return typeof(IVIFResultsWriterFactory).IsAssignableFrom(request.ParentRequest.Service);
+		}
+	}
+}
\ No newline at end of file
diff --git a/VectoCore/VectoCore/VectoCore.csproj b/VectoCore/VectoCore/VectoCore.csproj
index a3ed1b0696..6676e568f5 100644
--- a/VectoCore/VectoCore/VectoCore.csproj
+++ b/VectoCore/VectoCore/VectoCore.csproj
@@ -145,6 +145,7 @@
     <Folder Include="InputData\Reader\DataObjectAdapter\CompletedBus\Generic\" />
     <Folder Include="InputData\Reader\DataObjectAdapter\SimulationComponents\StrategyDataAdapter\" />
     <Folder Include="Models\SimulationComponent\Impl\Controller\" />
+    <Folder Include="OutputData\XML\DeclarationReports\VehicleInformationFile\VehicleInformationFile_0_1\ResultWriter\" />
   </ItemGroup>
 
 </Project>
\ No newline at end of file
diff --git a/VectoCore/VectoCoreTest/Reports/TestXMLResultsWriting.cs b/VectoCore/VectoCoreTest/Reports/TestXMLResultsWriting.cs
index 03bbe5a9a6..edf6a7fdf7 100644
--- a/VectoCore/VectoCoreTest/Reports/TestXMLResultsWriting.cs
+++ b/VectoCore/VectoCoreTest/Reports/TestXMLResultsWriting.cs
@@ -24,6 +24,7 @@ using TUGraz.VectoCore.OutputData.XML.DeclarationReports.Common;
 using TUGraz.VectoCore.OutputData.XML.DeclarationReports.CustomerInformationFile;
 using TUGraz.VectoCore.OutputData.XML.DeclarationReports.CustomerInformationFile.CustomerInformationFile_0_9;
 using TUGraz.VectoCore.OutputData.XML.DeclarationReports.CustomerInformationFile.CustomerInformationFile_0_9.ResultWriter;
+using TUGraz.VectoCore.OutputData.XML.DeclarationReports.VehicleInformationFile.VehicleInformationFile_0_1.ResultWriter;
 using TUGraz.VectoCore.Utils;
 using XmlDocumentType = TUGraz.VectoCore.Utils.XmlDocumentType;
 
@@ -39,6 +40,7 @@ public class TestXMLResultsWriting
 
 	XNamespace CIF_NS = XNamespace.Get("urn:tugraz:ivt:VectoAPI:CustomerOutput:v0.9");
 	XNamespace MRF_NS = XNamespace.Get("urn:tugraz:ivt:VectoAPI:DeclarationOutput:v0.9");
+	XNamespace VIF_NS = XNamespace.Get("urn:tugraz:ivt:VectoAPI:DeclarationOutput:VehicleInterimFile:v0.1");
 
 	[OneTimeSetUp]
 	public void OneTimeSetup()
@@ -56,6 +58,14 @@ public class TestXMLResultsWriting
 		TestCase(VehicleCategory.RigidTruck, VectoSimulationJobType.ParallelHybridVehicle, false, false, typeof(CIFResultsWriter.HEVNonOVCLorry)),
 		TestCase(VehicleCategory.RigidTruck, VectoSimulationJobType.SerialHybridVehicle, true, false, typeof(CIFResultsWriter.HEVOVCLorry)),
 		TestCase(VehicleCategory.RigidTruck, VectoSimulationJobType.BatteryElectricVehicle, true, false, typeof(CIFResultsWriter.PEVLorry)),
+
+		TestCase(VehicleCategory.HeavyBusCompletedVehicle, VectoSimulationJobType.ConventionalVehicle, false, true, typeof(CIFResultsWriter.ExemptedVehicle)),
+		TestCase(VehicleCategory.HeavyBusCompletedVehicle, VectoSimulationJobType.ConventionalVehicle, false, false, typeof(CIFResultsWriter.ConventionalBus)),
+		TestCase(VehicleCategory.HeavyBusCompletedVehicle, VectoSimulationJobType.ConventionalVehicle, false, false, typeof(CIFResultsWriter.ConventionalBus)),
+		TestCase(VehicleCategory.HeavyBusCompletedVehicle, VectoSimulationJobType.ParallelHybridVehicle, false, false, typeof(CIFResultsWriter.HEVNonOVCBus)),
+		TestCase(VehicleCategory.HeavyBusCompletedVehicle, VectoSimulationJobType.SerialHybridVehicle, true, false, typeof(CIFResultsWriter.HEVOVCBus)),
+		TestCase(VehicleCategory.HeavyBusCompletedVehicle, VectoSimulationJobType.BatteryElectricVehicle, true, false, typeof(CIFResultsWriter.PEVBus)),
+
 	]
 	public void Test_CIF_ReportResultInstance(VehicleCategory vehicleCategory, VectoSimulationJobType jobType, bool ovc,
 		bool exempted, Type expectedResultWriterType)
@@ -115,7 +125,7 @@ public class TestXMLResultsWriting
 
 		Assert.NotNull(results);
 
-		var doc = CreateXmlDocument(results, "VectoOutputCustomer", CIF_NS);
+		var doc = CreateXmlDocument(results, "VectoOutputCustomer.0.9", CIF_NS);
 		var validator = GetValidator(doc);
 
 		WriteToConsole(doc);
@@ -180,7 +190,7 @@ public class TestXMLResultsWriting
 
 		Assert.NotNull(results);
 
-		var doc = CreateXmlDocument(results, "VectoOutputCustomer", CIF_NS);
+		var doc = CreateXmlDocument(results, "VectoOutputCustomer.0.9", CIF_NS);
 		var validator = GetValidator(doc);
 
 		WriteToConsole(doc);
@@ -201,6 +211,12 @@ public class TestXMLResultsWriting
 		TestCase(VehicleCategory.RigidTruck, VectoSimulationJobType.ParallelHybridVehicle, false, false, typeof(MRFResultsWriter.HEVNonOVCLorry)),
 		TestCase(VehicleCategory.RigidTruck, VectoSimulationJobType.SerialHybridVehicle, true, false, typeof(MRFResultsWriter.HEVOVCLorry)),
 		TestCase(VehicleCategory.RigidTruck, VectoSimulationJobType.BatteryElectricVehicle, true, false, typeof(MRFResultsWriter.PEVLorry)),
+
+		TestCase(VehicleCategory.HeavyBusCompletedVehicle, VectoSimulationJobType.ConventionalVehicle, false, true, typeof(MRFResultsWriter.ExemptedVehicle)),
+		TestCase(VehicleCategory.HeavyBusCompletedVehicle, VectoSimulationJobType.ConventionalVehicle, false, false, typeof(MRFResultsWriter.ConventionalBus)),
+		TestCase(VehicleCategory.HeavyBusCompletedVehicle, VectoSimulationJobType.ParallelHybridVehicle, false, false, typeof(MRFResultsWriter.HEVNonOVCBus)),
+		TestCase(VehicleCategory.HeavyBusCompletedVehicle, VectoSimulationJobType.SerialHybridVehicle, true, false, typeof(MRFResultsWriter.HEVOVCBus)),
+		TestCase(VehicleCategory.HeavyBusCompletedVehicle, VectoSimulationJobType.BatteryElectricVehicle, true, false, typeof(MRFResultsWriter.PEVBus)),
 	]
 	public void Test_MRF_ReportResultInstance(VehicleCategory vehicleCategory, VectoSimulationJobType jobType, bool ovc,
 		bool exempted, Type expectedResultWriterType)
@@ -260,7 +276,7 @@ public class TestXMLResultsWriting
 
 		Assert.NotNull(results);
 
-		var doc = CreateXmlDocument(results, "VectoOutputManufacturer", MRF_NS);
+		var doc = CreateXmlDocument(results, "VectoOutputManufacturer.0.9", MRF_NS);
 		var validator = GetValidator(doc);
 
 		WriteToConsole(doc);
@@ -319,7 +335,7 @@ public class TestXMLResultsWriting
 
 		Assert.NotNull(results);
 
-		var doc = CreateXmlDocument(results, "VectoOutputManufacturer", MRF_NS);
+		var doc = CreateXmlDocument(results, "VectoOutputManufacturer.0.9", MRF_NS);
 		var validator = GetValidator(doc);
 
 		WriteToConsole(doc);
@@ -329,7 +345,82 @@ public class TestXMLResultsWriting
 		WriteToFile("MRF", doc, runData, success, exempted);
 	}
 
+	// ------------
+	// VIF Tests
+
+	[
+		TestCase(VehicleCategory.HeavyBusPrimaryVehicle, VectoSimulationJobType.ConventionalVehicle, false, true, typeof(VIFResultsWriter.ExemptedVehicle)),
+		TestCase(VehicleCategory.HeavyBusPrimaryVehicle, VectoSimulationJobType.ConventionalVehicle, false, false, typeof(VIFResultsWriter.ConventionalBus)),
+		TestCase(VehicleCategory.HeavyBusPrimaryVehicle, VectoSimulationJobType.ParallelHybridVehicle, false, false, typeof(VIFResultsWriter.HEVNonOVCBus)),
+		TestCase(VehicleCategory.HeavyBusPrimaryVehicle, VectoSimulationJobType.SerialHybridVehicle, true, false, typeof(VIFResultsWriter.HEVOVCBus)),
+		TestCase(VehicleCategory.HeavyBusPrimaryVehicle, VectoSimulationJobType.BatteryElectricVehicle, true, false, typeof(VIFResultsWriter.PEVBus)),
+	]
+	public void Test_VIF_ReportResultInstance(VehicleCategory vehicleCategory, VectoSimulationJobType jobType, bool ovc,
+		bool exempted, Type expectedResultWriterType)
+	{
+		var resultsWriter = _reportResultsFactory.GetVIFResultsWriter(vehicleCategory.GetVehicleType(), jobType, ovc, exempted);
+
+		Assert.AreEqual(expectedResultWriterType, resultsWriter.GetType());
+	}
+
+	[
+		TestCase(VectoSimulationJobType.ConventionalVehicle, false, false, true, TestName = "VIF_ReportResult_WritingResults: PrimaryBus Conv SUCCESS"),
+		TestCase(VectoSimulationJobType.ConventionalVehicle, false, false, true, FuelType.NGCI, FuelType.DieselCI, TestName = "VIF_ReportResult_WritingResults: PrimaryBus Conv DualFuel SUCCESS"),
+		TestCase(VectoSimulationJobType.ConventionalVehicle, false, false, true, FuelType.NGPI, TestName = "VIF_ReportResult_WritingResults: PrimaryBus Conv LNG SUCCESS"),
+		TestCase(VectoSimulationJobType.ConventionalVehicle, false, false, false, TestName = "VIF_ReportResult_WritingResults: PrimaryBus Conv ERROR"),
 
+		TestCase(VectoSimulationJobType.ParallelHybridVehicle, true, false, true, TestName = "VIF_ReportResult_WritingResults: PrimaryBus HEV OVC SUCCESS"),
+		TestCase(VectoSimulationJobType.SerialHybridVehicle, true, false, true, FuelType.NGCI, FuelType.DieselCI, TestName = "VIF_ReportResult_WritingResults: PrimaryBus HEV OVC DualFuel SUCCESS"),
+		TestCase(VectoSimulationJobType.IEPC_S, true, false, true, FuelType.NGPI, TestName = "VIF_ReportResult_WritingResults: PrimaryBus HEV OVC LNG SUCCESS"),
+		TestCase(VectoSimulationJobType.ParallelHybridVehicle, true, false, false, TestName = "VIF_ReportResult_WritingResults: PrimaryBus HEV OVC ERROR"),
+
+		TestCase(VectoSimulationJobType.ParallelHybridVehicle, false, false, true, TestName = "VIF_ReportResult_WritingResults: PrimaryBus HEV non-OVC SUCCESS"),
+		TestCase(VectoSimulationJobType.ParallelHybridVehicle, false, false, false, TestName = "VIF_ReportResult_WritingResults: PrimaryBus HEV non-OVC ERROR"),
+
+		TestCase(VectoSimulationJobType.BatteryElectricVehicle, true, false, true, TestName = "VIF_ReportResult_WritingResults: PrimaryBus PEV SUCCESS"),
+		TestCase(VectoSimulationJobType.BatteryElectricVehicle, true, false, false, TestName = "VIF_ReportResult_WritingResults: PrimaryBus PEV ERROR"),
+
+		TestCase(VectoSimulationJobType.ParallelHybridVehicle, true, true, true, TestName = "VIF_ReportResult_WritingResults: PrimaryBus HEV exempted"),
+		TestCase(VectoSimulationJobType.ConventionalVehicle, true, true, true, TestName = "VIF_ReportResult_WritingResults: PrimaryBus Conv exempted"),
+	]
+	public void Test_VIF_ReportResult_WritingResults_Bus(VectoSimulationJobType jobType, bool ovc, bool exempted, bool success, params FuelType[] fuels)
+	{
+		var vehicleCategory = VehicleCategory.HeavyBusPrimaryVehicle;
+		var ovcmode = ovc ? VectoRunData.OvcHevMode.ChargeDepleting : VectoRunData.OvcHevMode.NotApplicable;
+		var runData = GetMockRunData(vehicleCategory, jobType, ovc, exempted, ovcmode, fuels);
+		var modData = GetMockModData(success ? VectoRun.Status.Success : VectoRun.Status.Aborted, fuels);
+
+		var resultEntries = new List<IResultEntry>();
+
+		var resultEntry = GetResultEntry(runData);
+		resultEntry.SetResultData(runData, modData, 1);
+
+		resultEntries.Add(resultEntry);
+
+		if (ovc && jobType.GetPowertrainArchitectureType() == VectoSimulationJobTypeHelper.Hybrid) {
+			var run2 = GetMockRunData(vehicleCategory, jobType, true, exempted, VectoRunData.OvcHevMode.ChargeSustaining, fuels);
+			var res2 = GetResultEntry(run2);
+			res2.SetResultData(run2, modData, 1);
+			resultEntries.Add(res2);
+		}
+
+		var resultsWriter = _reportResultsFactory.GetVIFResultsWriter(
+			runData.VehicleData.VehicleCategory.GetVehicleType(),
+			runData.JobType, runData.VehicleData.OffVehicleCharging, runData.Exempted);
+
+		var results = resultsWriter.GenerateResults(resultEntries);
+
+		Assert.NotNull(results);
+
+		var doc = CreateXmlDocument(results, "VectoOutputMultistep.0.1", VIF_NS);
+		var validator = GetValidator(doc);
+
+		WriteToConsole(doc);
+
+		Assert.IsTrue(validator.ValidateXML(XmlDocumentType.MultistepOutputData), validator.ValidationError);
+
+		WriteToFile("VIF", doc, runData, success, exempted);
+	}
 
 	// ===================================
 
@@ -426,7 +517,7 @@ public class TestXMLResultsWriting
 		var doc = new XDocument();
 		doc.Add(new XElement(ns + "VectoMockResults",
 			new XAttribute(XNamespace.Xmlns + "xsi", xsi.NamespaceName),
-			new XAttribute(xsi + "schemaLocation", $@"{ns.NamespaceName} V:\VectoCore\VectoCore\Resources\XSD\{reportType}.0.9.xsd"),
+			new XAttribute(xsi + "schemaLocation", $@"{ns.NamespaceName} V:\VectoCore\VectoCore\Resources\XSD\{reportType}.xsd"),
 			results));
 
 		return doc;
-- 
GitLab