diff --git a/VectoCommon/VectoCommon/InputData/DeclarationInputData.cs b/VectoCommon/VectoCommon/InputData/DeclarationInputData.cs
index 3fd317471c300f7c8c74c859c7ce85262f4f9a2d..292639d551dda097addf4bc13b5868caa58f40ca 100644
--- a/VectoCommon/VectoCommon/InputData/DeclarationInputData.cs
+++ b/VectoCommon/VectoCommon/InputData/DeclarationInputData.cs
@@ -277,7 +277,7 @@ namespace TUGraz.VectoCommon.InputData
 
 		public static string ToXMLFormat(this PredictiveCruiseControlType pcc)
 		{
-			return pcc.ToString().ToLowerInvariant().Replace(Prefix, "").Replace(SeparatorEnum, SeparatorXML);
+			return pcc.ToString().ToLowerInvariant().Replace(Prefix.ToLowerInvariant(), "").Replace(SeparatorEnum, SeparatorXML);
 		}
 
 		public static string GetName(this PredictiveCruiseControlType pcc)
diff --git a/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLDeclarationPrimaryVehicleBusResultsInputDataProviderV01.cs b/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLDeclarationPrimaryVehicleBusResultsInputDataProviderV01.cs
index e2d0b0065b4362cc106bd34ce79a2cdab37090ff..0e03640e378cbb660e2edf463da99ccbce3ea471 100644
--- a/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLDeclarationPrimaryVehicleBusResultsInputDataProviderV01.cs
+++ b/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLDeclarationPrimaryVehicleBusResultsInputDataProviderV01.cs
@@ -70,6 +70,17 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration.DataProvider
 												string.Format(".//*[local-name()='{0}' and @unit='MJ/km']", XMLNames.Report_Result_EnergyConsumption))?.InnerText
 													.ToDouble().SI(Unit.SI.Mega.Joule.Per.Kilo.Meter).Cast<JoulePerMeter>())).ToDictionary(x => x.Key, x => x.Value);
 
+			
+			var co2Nodes = GetNodes(XMLNames.Report_Results_CO2, xmlNode);
+			var resultCO2 = new Dictionary<string, double>();
+			foreach (XmlNode co2Node in co2Nodes) {
+				var attribute = GetAttribute(co2Node, XMLNames.Report_Results_Unit_Attr);
+				var value = co2Node?.InnerText;
+				if(value != null)
+					resultCO2.Add(attribute, value.ToDouble());
+			}
+			
+
 			return new Result
 			{
 				ResultStatus = resultStatus,
@@ -77,7 +88,7 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration.DataProvider
 				VehicleGroup = VehicleClassHelper.Parse(vehicleGroup),
 				SimulationParameter = simulationParams,
 				EnergyConsumption = energyConsumption,
-				CO2 = new Dictionary<string, double>()
+				CO2 = resultCO2
 			};
 		}
 
diff --git a/VectoCore/VectoCore/OutputData/XML/XMLMultistageBusReport.cs b/VectoCore/VectoCore/OutputData/XML/XMLMultistageBusReport.cs
new file mode 100644
index 0000000000000000000000000000000000000000..03cc921bda8cc7fbb47e758a0fb118fa0fab83ec
--- /dev/null
+++ b/VectoCore/VectoCore/OutputData/XML/XMLMultistageBusReport.cs
@@ -0,0 +1,512 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text.RegularExpressions;
+using System.Xml;
+using System.Xml.Linq;
+using TUGraz.VectoCommon.InputData;
+using TUGraz.VectoCommon.Models;
+using TUGraz.VectoCommon.Resources;
+using TUGraz.VectoCommon.Utils;
+using TUGraz.VectoCore.InputData.Reader.ComponentData;
+using TUGraz.VectoCore.Models.Declaration;
+using TUGraz.VectoCore.Models.Simulation.Data;
+using TUGraz.VectoCore.Utils;
+
+namespace TUGraz.VectoCore.OutputData.XML
+{
+	public interface IXMLMultistageReport
+	{
+		void Initialize(VectoRunData modelData);
+		XDocument Report { get; }
+		void GenerateReport();
+	}
+
+	public class XMLMultistageBusReport: IXMLMultistageReport 
+	{
+		protected XNamespace tns = "urn:tugraz:ivt:VectoAPI:DeclarationOutput:VehicleInterimFile:v0.1";
+		protected XNamespace di = "http://www.w3.org/2000/09/xmldsig#";
+		protected XNamespace xsi = XNamespace.Get("http://www.w3.org/2001/XMLSchema-instance");
+
+		protected XNamespace v20 = "urn:tugraz:ivt:VectoAPI:DeclarationDefinitions:v2.0";
+		protected XNamespace v21 = "urn:tugraz:ivt:VectoAPI:DeclarationDefinitions:v2.1";
+		protected XNamespace v23 = "urn:tugraz:ivt:VectoAPI:DeclarationDefinitions:DEV:v2.3";
+		protected XNamespace v26 = "urn:tugraz:ivt:VectoAPI:DeclarationDefinitions:DEV:v2.6";
+		protected XNamespace v28 = "urn:tugraz:ivt:VectoAPI:DeclarationDefinitions:DEV:v2.8";
+
+		protected XElement PrimaryVehicle;
+		protected XElement InputDataSignature;
+		protected XElement ManufacturerRecordSignature;
+		protected XElement Results;
+		protected XElement ApplicationInformation; 
+		protected XElement PrimarySignature;
+
+
+		private IPrimaryVehicleInformationInputDataProvider primaryVehicleInputData;
+		private IList<IManufacturingStageInputData> manufacturingStageInputData;
+		private IVehicleDeclarationInputData vehicleInputData;
+
+		public XDocument Report { get; protected set; }
+
+		public XMLMultistageBusReport()
+		{
+			PrimaryVehicle = new XElement(tns + XMLNames.Component_Vehicle);
+			InputDataSignature = new XElement(tns + XMLNames.Report_InputDataSignature);
+			ManufacturerRecordSignature = new XElement(tns + "ManufacturerRecordSignature");
+			Results = new XElement(tns + XMLNames.Report_Results);
+			PrimarySignature = new XElement(tns + XMLNames.DI_Signature);
+			ApplicationInformation = new XElement(tns + XMLNames.Report_ApplicationInfo_ApplicationInformation);
+		}
+
+
+
+		public void Initialize(VectoRunData modelData)
+		{
+			primaryVehicleInputData = modelData.MultistageVIFInputData.MultistageJobInputData.JobInputData.PrimaryVehicle;
+			manufacturingStageInputData = modelData.MultistageVIFInputData.MultistageJobInputData.JobInputData.ManufacturingStages;
+			vehicleInputData = modelData.MultistageVIFInputData.VehicleInputData;
+			
+			SetPrimaryVehicle(primaryVehicleInputData);
+			SetInputDataSignature(primaryVehicleInputData);
+			SetManufacturerRecordSignature(primaryVehicleInputData);
+			SetResults(primaryVehicleInputData);
+			SetApplicationInformation(primaryVehicleInputData);
+			SetPrimarySignature(primaryVehicleInputData);
+		}
+
+
+
+		public void GenerateReport()
+		{
+			var retVal = new XDocument();
+
+			retVal.Add(
+			
+				new XElement(tns + "VectoOutputMultistage",
+					new XAttribute("xmlns" , tns),
+					new XAttribute(XNamespace.Xmlns + "xsi", xsi.NamespaceName),
+					new XAttribute(XNamespace.Xmlns + "di", di),
+					new XAttribute(XNamespace.Xmlns + "v2.0", v20),
+					new XAttribute(XNamespace.Xmlns + "v2.1", v21),
+					new XAttribute(XNamespace.Xmlns + "v2.3", v23),
+					new XAttribute(XNamespace.Xmlns + "v2.6", v26),
+					new XAttribute(XNamespace.Xmlns + "v2.8", v28),
+					new XAttribute(
+						xsi + "schemaLocation",
+						string.Format("{0} {1}", tns, @"E:\VECTO_DEV\fk_vecto-dev\VectoCore\VectoCore\Resources\XSD/VectoOutputMultistage.0.1.xsd")),
+
+					new XElement(tns + "PrimaryVehicle",
+
+							new XElement(tns + XMLNames.Report_DataWrap,
+								new XAttribute("id", "text"),
+								new XAttribute(xsi + "type", "PrimaryVehicleDataType"),
+
+									PrimaryVehicle,
+									InputDataSignature,
+									ManufacturerRecordSignature,
+									Results,
+									ApplicationInformation	
+								),
+								PrimarySignature
+							)
+						)
+					);
+			Report = retVal;
+
+		}
+
+		private void SetApplicationInformation(IPrimaryVehicleInformationInputDataProvider primaryData)
+		{
+			ApplicationInformation = new XElement(
+				tns + XMLNames.Report_ApplicationInfo_ApplicationInformation,
+				new XElement(tns + XMLNames.Report_ApplicationInfo_SimulationToolVersion, primaryData.ApplicationInformation.SimulationToolVersion),
+				new XElement(
+					tns + XMLNames.Report_ApplicationInfo_Date,
+					XmlConvert.ToString(primaryData.ApplicationInformation.Date, XmlDateTimeSerializationMode.Utc)));
+		}
+		
+		private void SetPrimarySignature(IPrimaryVehicleInformationInputDataProvider primaryData)
+		{
+			PrimarySignature.Add(primaryData.VehicleSignatureHash.ToXML(di));
+		}
+
+		private void SetResults(IPrimaryVehicleInformationInputDataProvider primaryData)
+		{
+			Results.Add(new XElement(tns+ XMLNames.Report_Result_Status, primaryData.ResultsInputData.Status));
+			
+			foreach (var resultEntry in primaryData.ResultsInputData.Results) {
+				SetResult(resultEntry);
+			}
+		}
+
+		private void SetResult(IResult result)
+		{
+			Results.Add(new XElement(
+					tns + XMLNames.Report_Result_Result,
+					new XAttribute(XMLNames.Report_Result_Status_Attr, result.ResultStatus),
+						new XElement(tns + XMLNames.Report_Vehicle_VehicleGroup, result.VehicleGroup.GetClassNumber()),
+						new XElement(tns + XMLNames.Report_Result_Mission, result.Mission.ToXMLFormat()),
+						new XElement(tns + XMLNames.Report_ResultEntry_SimulationParameters,
+							new XElement(
+								tns + XMLNames.Report_ResultEntry_TotalVehicleMass,
+								XMLHelper.ValueAsUnit(result.SimulationParameter.TotalVehicleMass, XMLNames.Unit_kg, 2)),
+							new XElement(
+								tns + XMLNames.Report_Result_Payload,
+								XMLHelper.ValueAsUnit(result.SimulationParameter.Payload, XMLNames.Unit_kg, 2)),
+							new XElement(
+								tns + XMLNames.Report_ResultEntry_PassengerCount,
+								result.SimulationParameter.PassengerCount.ToXMLFormat(2)),
+							new XElement(
+								tns + XMLNames.Report_Result_FuelMode, result.SimulationParameter.FuelMode)
+						),
+						GetResultFuel(result.EnergyConsumption),
+						GetResultCo2(result.CO2)
+					)	
+				);
+		}
+
+		private List<XElement> GetResultFuel(Dictionary<FuelType, JoulePerMeter> fuels)
+		{
+			var resultFuels = new List<XElement>();
+
+			foreach (var fuel in fuels) {
+				resultFuels.Add(
+					new XElement(tns + XMLNames.Report_Results_Fuel,
+						new XAttribute(XMLNames.Report_Results_Fuel_Type_Attr, fuel.Key.ToXMLFormat()),
+						new XElement(tns + XMLNames.Report_Result_EnergyConsumption,
+							XMLHelper.ValueAsUnit(fuel.Value.ConvertToMegaJouleperKilometer(), "MJ/km", 5))
+						)
+					);
+			}
+
+			return resultFuels;
+		}
+
+		private List<XElement> GetResultCo2(Dictionary<string, double> co2s)
+		{
+			var resultCo2 = new List<XElement>();
+
+			foreach (var co2 in co2s) {
+				resultCo2.Add(
+					new XElement(tns + XMLNames.Report_Results_CO2,
+							XMLHelper.ValueAsUnit(co2.Value, "g/km", 2)));
+			}
+
+			return resultCo2;
+		}
+
+
+		private void SetManufacturerRecordSignature(IPrimaryVehicleInformationInputDataProvider primaryData)
+		{
+			ManufacturerRecordSignature.Add(primaryData.ManufacturerRecordHash.ToXML(di));
+		}
+
+		private void SetInputDataSignature(IPrimaryVehicleInformationInputDataProvider primaryData)
+		{
+			InputDataSignature.Add(primaryData.PrimaryVehicleInputDataHash.ToXML(di));
+		}
+		
+		private void SetPrimaryVehicle(IPrimaryVehicleInformationInputDataProvider primaryData)
+		{
+			var primaryVehicle = primaryData.Vehicle;
+			
+			PrimaryVehicle.Add(
+				new XAttribute(xsi + "type", "VehiclePIFType"),
+				new XElement(tns + XMLNames.ManufacturerPrimaryVehicle, primaryVehicle.Manufacturer),
+				new XElement(tns + XMLNames.ManufacturerAddressPrimaryVehicle, primaryVehicle.ManufacturerAddress),
+				new XElement(tns + XMLNames.Component_Model, primaryVehicle.Model),
+				new XElement(tns + XMLNames.Vehicle_VIN, primaryVehicle.VIN),
+				new XElement(tns + XMLNames.Component_Date, XmlConvert.ToString(primaryVehicle.Date, XmlDateTimeSerializationMode.Utc)),
+				new XElement(tns + XMLNames.Vehicle_VehicleCategory, primaryVehicle.VehicleCategory.ToXMLFormat()),
+				new XElement(tns + XMLNames.Vehicle_AxleConfiguration, primaryVehicle.AxleConfiguration.GetName()),
+				new XElement(tns + XMLNames.Vehicle_Articulated, primaryVehicle.Articulated),
+				new XElement(tns + XMLNames.TPMLM, primaryVehicle.GrossVehicleMassRating.ToXMLFormat(0)),
+				new XElement(tns + XMLNames.Vehicle_IdlingSpeed, primaryVehicle.EngineIdleSpeed.AsRPM.ToXMLFormat(0)),
+				new XElement(tns + XMLNames.Vehicle_RetarderType, primaryVehicle.Components.RetarderInputData.Type.ToXMLFormat()),
+				primaryVehicle.Components.RetarderInputData.Type.IsDedicatedComponent()
+					? new XElement(tns + XMLNames.Vehicle_RetarderRatio, primaryVehicle.Components.RetarderInputData.Ratio.ToXMLFormat(3))
+					: null,
+				new XElement(
+					tns + XMLNames.Vehicle_AngledriveType, (primaryVehicle.Components?.AngledriveInputData?.Type ?? AngledriveType.None).ToXMLFormat()),
+				new XElement(tns + XMLNames.Vehicle_ZeroEmissionVehicle, primaryVehicle.ZeroEmissionVehicle),
+				GetADAS(primaryVehicle.ADAS),
+				GetTorqueLimits(primaryVehicleInputData),
+				GetVehicleComponents(primaryVehicle.Components));
+		}
+
+		private XElement GetADAS(IAdvancedDriverAssistantSystemDeclarationInputData adasData)
+		{
+			var ns = XNamespace.Get(adasData.XMLSource.SchemaInfo.SchemaType.QualifiedName.Namespace);
+			var versionNumber = GetNamespaceVersionNumber(ns);
+			return new XElement(
+				tns + XMLNames.Vehicle_ADAS,
+				
+				new XAttribute(
+					xsi + "type",
+					$"{versionNumber}:{adasData.XMLSource.SchemaInfo.SchemaType.QualifiedName.Name}"),
+				new XElement(ns + XMLNames.Vehicle_ADAS_EngineStopStart, adasData.EngineStopStart),
+				new XElement(ns + XMLNames.Vehicle_ADAS_EcoRollWithoutEngineStop, adasData.EcoRoll.WithoutEngineStop()),
+				new XElement(ns + XMLNames.Vehicle_ADAS_EcoRollWithEngineStopStart, adasData.EcoRoll.WithEngineStop()),
+				new XElement(ns + XMLNames.Vehicle_ADAS_PCC, adasData.PredictiveCruiseControl.ToXMLFormat()),
+				adasData.ATEcoRollReleaseLockupClutch != null 
+					? new XElement(ns + XMLNames.Bus_ADAS_APTEcoRollReleaseLockupClutch, adasData.ATEcoRollReleaseLockupClutch)
+					: null
+				);
+		}
+
+		private XElement GetTorqueLimits(IPrimaryVehicleInformationInputDataProvider vehicleInputData)
+		{
+			var inputData = vehicleInputData.Vehicle.XMLSource;
+			var tcLimits = inputData.SelectSingleNode(XMLHelper.QueryLocalName(XMLNames.Vehicle_TorqueLimits));
+			if (tcLimits == null)
+			{
+				return null;
+			}
+
+			var ns = XNamespace.Get(tcLimits.SchemaInfo.SchemaType.QualifiedName.Namespace);
+			const string tclPrefix = "tcl";
+			return new XElement(
+				tns + XMLNames.Vehicle_TorqueLimits,
+				new XAttribute(XNamespace.Xmlns + tclPrefix, ns.NamespaceName),
+				new XAttribute(xsi + "type", string.Format("{0}:{1}", tclPrefix, tcLimits.SchemaInfo.SchemaType.QualifiedName.Name)),
+				XElement.Parse(tcLimits.OuterXml).Elements()
+			);
+		}
+
+
+		protected XElement GetVehicleComponents(IVehicleComponentsDeclaration vehicleComponents)
+		{
+			return new XElement(
+				tns + XMLNames.Vehicle_Components,
+				new XAttribute(xsi + "type", "VehicleComponentsPIFType"),
+				
+				GetEngineDescription(vehicleComponents.EngineInputData),
+				GetGearboxDescription(vehicleComponents.GearboxInputData),
+				GetTorqueConverterDescription(vehicleComponents.TorqueConverterInputData),
+				GetAngledriveDescription(vehicleComponents.AngledriveInputData),
+				GetAxelgearData(vehicleComponents.AxleGearInputData),
+				GetAxleWheelDescription(vehicleComponents.AxleWheels),
+				GetAuxiliariesDescription(vehicleComponents.BusAuxiliaries)
+			);
+		}
+
+
+
+		#region Engine Data
+
+		private XElement GetEngineDescription(IEngineDeclarationInputData engineData)
+		{
+			return new XElement(tns + XMLNames.Component_Engine,
+				new XElement(tns + XMLNames.ComponentDataWrapper,
+					new XAttribute(xsi + "type", "EngineDataPIFType"),
+					GetCommonDescription(engineData),
+					new XElement(tns + XMLNames.Engine_Displacement, engineData.Displacement.ConvertToCubicCentiMeter().ToXMLFormat(0)),
+					new XElement(tns + XMLNames.Engine_RatedSpeed, engineData.RatedSpeedDeclared.AsRPM.ToXMLFormat(0)),
+					new XElement(tns + XMLNames.Engine_RatedPower, engineData.RatedPowerDeclared.ToXMLFormat(0)),
+					new XElement(tns + XMLNames.Engine_MaxTorque, engineData.MaxTorqueDeclared.ToXMLFormat(0)),
+					new XElement(
+						tns + XMLNames.Engine_WHRType,
+						new XElement(
+							v23 + XMLNames.Engine_WHR_MechanicalOutputICE, (engineData.WHRType & WHRType.MechanicalOutputICE) != 0),
+						new XElement(
+							v23 + XMLNames.Engine_WHR_MechanicalOutputIDrivetrain,
+							(engineData.WHRType & WHRType.MechanicalOutputDrivetrain) != 0),
+						new XElement(v23 + XMLNames.Engine_WHR_ElectricalOutput, (engineData.WHRType & WHRType.ElectricalOutput) != 0)
+					),
+					GetEngineModes(engineData)
+				));
+		}
+
+		private List<XElement> GetEngineModes(IEngineDeclarationInputData engineData)
+		{
+			var fuels = new List<XElement>();
+			var engineModes = engineData.EngineModes;
+
+			foreach (var mode in engineModes) {
+				fuels.Add(
+					new XElement(
+						tns + XMLNames.Engine_FuelModes,
+						new XElement(tns + XMLNames.Engine_IdlingSpeed, mode.IdleSpeed.AsRPM.ToXMLFormat(0)),
+						new XElement(
+							tns + XMLNames.Engine_FullLoadAndDragCurve,
+							FullLoadCurveReader.Create(mode.FullLoadCurve, true).FullLoadEntries.Select(
+								x => new XElement(
+									tns + XMLNames.Engine_FullLoadCurve_Entry,
+									new XAttribute(XMLNames.Engine_EngineFullLoadCurve_EngineSpeed_Attr,
+										x.EngineSpeed.AsRPM.ToXMLFormat(2)),
+									new XAttribute(XMLNames.Engine_FullLoadCurve_MaxTorque_Attr,
+										x.TorqueFullLoad.ToXMLFormat(2)),
+									new XAttribute(XMLNames.Engine_FullLoadCurve_DragTorque_Attr,
+										x.TorqueDrag.ToXMLFormat(2)))
+							)),
+						new XElement(
+							tns + "Fuels",
+							mode.Fuels.Select(x => new XElement(tns + "FuelType", x.FuelType.ToXMLFormat())))
+					));
+			}
+			return fuels;
+		}
+
+		#endregion
+
+		#region Gearbox/Transmission Data
+
+		private XElement GetGearboxDescription(IGearboxDeclarationInputData transmissionData)
+		{
+			return new XElement(tns + XMLNames.Component_Transmission,
+				new XElement(tns + XMLNames.ComponentDataWrapper,
+					new XAttribute(xsi + "type", "TransmissionDataPIFType"),
+					GetCommonDescription(transmissionData, true),
+					new XElement(tns + XMLNames.Gearbox_TransmissionType, transmissionData.Type.ToXMLFormat()),
+					new XElement(
+						tns + XMLNames.Gearbox_Gears,
+						new XAttribute(xsi + "type", "TransmissionGearsPIFType"),
+						transmissionData.Gears.Select(
+							x =>
+								new XElement(
+									tns + XMLNames.Gearbox_Gears_Gear,
+									new XAttribute(XMLNames.Gearbox_Gear_GearNumber_Attr, x.Gear),
+									new XElement(tns + XMLNames.Gearbox_Gear_Ratio, x.Ratio.ToXMLFormat(3)),
+									x.MaxTorque != null
+										? new XElement(tns + XMLNames.Gearbox_Gears_MaxTorque, x.MaxTorque.ToXMLFormat(0))
+										: null,
+									x.MaxInputSpeed != null
+										? new XElement(tns + XMLNames.Gearbox_Gear_MaxSpeed, x.MaxInputSpeed.AsRPM.ToXMLFormat(0))
+										: null)))
+				));
+		}
+
+		#endregion
+
+		#region Torque Converter Data
+
+		private XElement GetTorqueConverterDescription(ITorqueConverterDeclarationInputData tcData)
+		{
+			return new XElement(tns + XMLNames.Component_TorqueConverter,
+				new XElement(tns + XMLNames.ComponentDataWrapper,
+					new XAttribute(xsi + "type", "TorqueConverterDataPIFType"),
+					GetCommonDescription(tcData),
+					GetTorqueConverterCharacteristics(tcData.TCData))
+			);
+		}
+
+		private XElement GetTorqueConverterCharacteristics(TableData tcData)
+		{
+			if (tcData == null)
+				return null;
+			
+			var characteristics = new List<XElement>();
+			for (int i = 0; i < tcData.Rows.Count; i++) {
+				var speedRatio = tcData.Rows[i][TorqueConverterDataReader.Fields.SpeedRatio].ToString();
+				var torqueRatio = tcData.Rows[i][TorqueConverterDataReader.Fields.TorqueRatio].ToString();
+				var torqueRef = tcData.Rows[i][TorqueConverterDataReader.Fields.CharacteristicTorque].ToString();
+
+				characteristics.Add(
+					new XElement(tns +  XMLNames.TorqueConverter_Characteristics_Entry,
+						new XAttribute(XMLNames.TorqueConverterData_SpeedRatio_Attr, speedRatio),
+						new XAttribute(XMLNames.TorqueConverterData_TorqueRatio_Attr, torqueRatio),
+						new XAttribute(XMLNames.TorqueConverterDataMapping_InputTorqueRef_Attr, torqueRef)
+					));
+			}
+
+			return characteristics.Count == 0 
+				? null : new XElement(tns + XMLNames.TorqueConverter_Characteristics, characteristics);
+		}
+
+		#endregion
+
+		#region Angledrive Data
+
+		private XElement GetAngledriveDescription(IAngledriveInputData angledriveData)
+		{
+			return new XElement(tns + XMLNames.Component_Angledrive,
+				new XElement(tns + XMLNames.ComponentDataWrapper,
+					new XAttribute(xsi + "type", "AngledriveDataPIFType"),
+					GetCommonDescription(angledriveData),
+					new XElement(tns + XMLNames.AngleDrive_Ratio, angledriveData.Ratio
+					)));
+		}
+
+		#endregion
+
+
+		#region Axelgear Data
+		
+		private XElement GetAxelgearData(IAxleGearInputData axleGearData)
+		{
+			return new XElement(tns + XMLNames.Component_Axlegear,
+				new XElement(tns + XMLNames.ComponentDataWrapper,
+					new XAttribute(xsi + "type", "AxlegearDataPIFType"),
+					GetCommonDescription(axleGearData),
+					new XElement(tns + XMLNames.Axlegear_LineType, axleGearData.LineType.ToXMLFormat()),
+					new XElement(tns + XMLNames.Axlegear_Ratio, axleGearData.Ratio.ToXMLFormat(3))));
+		}
+
+		#endregion
+
+		#region AxleWheels Data
+
+		private XElement GetAxleWheelDescription(IAxlesDeclarationInputData axleWheelsData)
+		{
+			return new XElement(
+				tns + XMLNames.Component_AxleWheels,
+				new XElement(tns + XMLNames.ComponentDataWrapper,
+					new XAttribute(xsi + "type", "AxleWheelsDataPIFType"),
+					XElement.Parse(axleWheelsData.XMLSource.InnerXml).Elements())
+				);
+		}
+
+
+		#endregion
+
+
+		#region Auxiliary Data
+
+		private XElement GetAuxiliariesDescription(IBusAuxiliariesDeclarationData busAux)
+		{
+			var busAuxXML = busAux.XMLSource;
+
+			return new XElement(
+				tns + XMLNames.Component_Auxiliaries,
+				new XElement(
+					tns + XMLNames.ComponentDataWrapper,
+					new XAttribute(xsi + "type", "AuxiliaryDataPIFType"),
+					XElement.Parse(busAuxXML.InnerXml).Elements()
+				));
+		}
+		
+
+		#endregion
+
+
+
+		protected virtual object[] GetCommonDescription(IComponentInputData componentInput, bool isTransmissionData = false)
+		{
+			var certificationMethod = componentInput.CertificationMethod != CertificationMethod.Measured ?
+				componentInput.CertificationMethod.ToXMLFormat() : null;
+
+			var certificationMethodTag = isTransmissionData
+				? XMLNames.Component_Gearbox_CertificationMethod
+				: XMLNames.Component_CertificationMethod;
+
+			return new object[] {
+				new XElement(tns + XMLNames.Component_Manufacturer, componentInput.Manufacturer),
+				new XElement(tns + XMLNames.Component_Model, componentInput.Model),
+				certificationMethod != null ? new XElement(tns + certificationMethodTag, certificationMethod) : null,
+				new XElement(tns + XMLNames.Component_CertificationNumber, componentInput.CertificationNumber),
+				new XElement(tns + XMLNames.Component_Date,  XmlConvert.ToString(componentInput.Date, XmlDateTimeSerializationMode.Utc)),
+				new XElement(tns + XMLNames.Component_AppVersion,  componentInput.AppVersion)
+			};
+		}
+
+		private string GetNamespaceVersionNumber(XNamespace ns)
+		{
+			if (ns == null)
+				return null;
+
+			var pattern = @"(?<=:v)\d+\.\d+";
+			var versionNumber = Regex.Match(ns.NamespaceName, pattern);
+			return $"v{versionNumber}";
+		}
+	}
+}
diff --git a/VectoCore/VectoCoreTest/Integration/Multistage/MultistageVehicleTest.cs b/VectoCore/VectoCoreTest/Integration/Multistage/MultistageVehicleTest.cs
new file mode 100644
index 0000000000000000000000000000000000000000..6b073424cfb152a96b8784342b0c74142ee520f4
--- /dev/null
+++ b/VectoCore/VectoCoreTest/Integration/Multistage/MultistageVehicleTest.cs
@@ -0,0 +1,87 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Xml;
+using Ninject;
+using NUnit.Framework;
+using TUGraz.VectoCommon.InputData;
+using TUGraz.VectoCommon.Models;
+using TUGraz.VectoCore.Configuration;
+using TUGraz.VectoCore.InputData.FileIO.XML;
+using TUGraz.VectoCore.InputData.FileIO.XML.Declaration.DataProvider;
+using TUGraz.VectoCore.Models.Simulation.Impl;
+using TUGraz.VectoCore.OutputData.FileIO;
+using TUGraz.VectoCore.Tests.Models.Simulation;
+using TUGraz.VectoCore.Utils;
+using XmlDocumentType = System.Xml.XmlDocumentType;
+
+namespace TUGraz.VectoCore.Tests.Integration.Multistage
+{
+	[TestFixture]
+	[Parallelizable(ParallelScope.All)]
+	public class MultistageVehicleTest
+	{
+		const string VIFDirPath = @"TestData\XML\XMLReaderDeclaration\SchemaVersionMultistage.0.1\";
+		const string InputDirPath = @"TestData\XML\XMLReaderDeclaration\SchemaVersion2.8\";
+		
+		const string InputFilePath = InputDirPath  + "vecto_vehicle-stage_vif_input.xml";
+		const string VIFInputFile = VIFDirPath  + "vecto_multistage_primary_vehicle_stage_2_3.xml";
+
+		private const string vifResult = VIFDirPath + "vif_vehicle-sample.xml";
+
+		protected IXMLInputDataReader xmlInputReader;
+		protected IXMLInputDataReader xmlVIFInputReader;
+
+		private IKernel _kernel;
+
+
+		[OneTimeSetUp]
+		public void RunBeforeAnyTests()
+		{
+			Directory.SetCurrentDirectory(TestContext.CurrentContext.TestDirectory);
+
+			_kernel = new StandardKernel(new VectoNinjectModule());
+			xmlInputReader = _kernel.Get<IXMLInputDataReader>();
+			xmlVIFInputReader = _kernel.Get<IXMLInputDataReader>();
+		}
+
+		[TestCase(VIFInputFile, InputFilePath, 1)]
+		public void TestSimulationMultistageVehicle(string vifFilename, string inputFilename, int numRuns)
+		{
+			//Input files
+			var inputReader = XmlReader.Create(inputFilename);
+			var inputDataProvider = xmlInputReader.CreateDeclaration(inputReader);
+			var vehicle = inputDataProvider.JobInputData.Vehicle;
+
+			var vifReader = XmlReader.Create(vifFilename);
+			var vifDataProvider = xmlInputReader.Create(vifReader) as IMultistageBusInputDataProvider;
+			
+			var writer = new FileOutputWriter(vifResult);
+			var inputData = new XMLDeclarationVIFInputData(vifDataProvider, vehicle);
+			
+			var factory = new SimulatorFactory(ExecutionMode.Declaration, inputData, writer);
+			
+			var jobContainer = new JobContainer(new MockSumWriter());
+
+			var runs = factory.SimulationRuns().ToList();
+			Assert.AreEqual(numRuns, runs.Count);
+			foreach (var run in runs)
+			{
+				jobContainer.AddRun(run);
+			}
+
+			jobContainer.Execute();
+			jobContainer.WaitFinished();
+			var progress = jobContainer.GetProgress();
+			Assert.IsTrue(progress.All(r => r.Value.Success), string.Concat<Exception>(progress.Select(r => r.Value.Error)));
+
+
+			var validator = new XMLValidator(XmlReader.Create(writer.XMLMultistageReportFileName));
+			Assert.IsTrue(validator.ValidateXML(VectoCore.Utils.XmlDocumentType.MultistageOutputData), validator.ValidationError);
+		}
+
+	}
+}
diff --git a/VectoCore/VectoCoreTest/VectoCoreTest.csproj b/VectoCore/VectoCoreTest/VectoCoreTest.csproj
index 05a4ae7fcc646c3eb852bbf896535533bdd45372..7aa23e09e27a651fe32ed947e6bcd74111b01cfa 100644
--- a/VectoCore/VectoCoreTest/VectoCoreTest.csproj
+++ b/VectoCore/VectoCoreTest/VectoCoreTest.csproj
@@ -4681,6 +4681,9 @@
     <Content Include="TestData\XML\XMLReaderDeclaration\SchemaVersion2.8\vecto_vehicle-stage_input_only_mandatory_standard_value_airdrag.xml">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
+    <Content Include="TestData\XML\XMLReaderDeclaration\SchemaVersion2.8\vecto_vehicle-stage_vif_input.xml">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </Content>
     <Content Include="TestData\XML\XMLReaderDeclaration\SchemaVersionMultistage.0.1\vecto_multistage_consolidated_multiple_stages.xml">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
@@ -4696,6 +4699,9 @@
     <Content Include="TestData\XML\XMLReaderDeclaration\SchemaVersionMultistage.0.1\vecto_multistage_consolidated_multiple_stages_NGTankSystem.xml">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
+    <Content Include="TestData\XML\XMLReaderDeclaration\SchemaVersionMultistage.0.1\vecto_multistage_consolidated_multiple_stages_vif.xml">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </Content>
     <Content Include="TestData\XML\XMLReaderDeclaration\SchemaVersionMultistage.0.1\vecto_multistage_consolidated_one_stage.xml">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>