diff --git a/VectoCommon/VectoCommon/Models/VehicleCategory.cs b/VectoCommon/VectoCommon/Models/VehicleCategory.cs
index 732ed89df177098c8a543c231454a8da546019ab..11e0d37ca7dd511580c25edecac59591b2e00ea5 100644
--- a/VectoCommon/VectoCommon/Models/VehicleCategory.cs
+++ b/VectoCommon/VectoCommon/Models/VehicleCategory.cs
@@ -43,7 +43,8 @@ namespace TUGraz.VectoCommon.Models
 		//InterurbanBus,
 		Coach,
 		HeavyBusPrimaryVehicle,
-		HeavyBusCompletedVehicle
+		HeavyBusCompletedVehicle,
+		GenericBusVehicle
 	}
 
 	public static class VehicleCategoryHelper
@@ -129,6 +130,7 @@ namespace TUGraz.VectoCommon.Models
 				case VehicleCategory.Coach:
 				case VehicleCategory.HeavyBusPrimaryVehicle:
 				case VehicleCategory.HeavyBusCompletedVehicle:
+				case VehicleCategory.GenericBusVehicle:
 					return false;
 				default:
 					throw new ArgumentOutOfRangeException("VehicleCategory", category, null);
@@ -141,7 +143,8 @@ namespace TUGraz.VectoCommon.Models
 				case VehicleCategory.Coach:
 				case VehicleCategory.CityBus:
 				case VehicleCategory.HeavyBusPrimaryVehicle:
-				case VehicleCategory.HeavyBusCompletedVehicle: return true;
+				case VehicleCategory.HeavyBusCompletedVehicle:
+				case VehicleCategory.GenericBusVehicle: return true;
 				default: return false;
 			}
 		}
diff --git a/VectoCore/VectoCore/Configuration/Constants.cs b/VectoCore/VectoCore/Configuration/Constants.cs
index f28214c356e94063905c3a1c0d2e3e8a814e92a1..03d87f046813e5b760f52b477e3ab5541c6d0a09 100644
--- a/VectoCore/VectoCore/Configuration/Constants.cs
+++ b/VectoCore/VectoCore/Configuration/Constants.cs
@@ -358,7 +358,6 @@ namespace TUGraz.VectoCore.Configuration
 			public const double OutputTorqueStart = 250;
 			public const double OutputTorqueEnd = 10000;
 
-			public const double IAxl = 6.5;
 			public const double Efficiency = 0.98;
 
 			public const double T0 = 52.5;
@@ -366,6 +365,8 @@ namespace TUGraz.VectoCore.Configuration
 			public const double Td_n = 150;
 
 			public const double FactorAngleDrive = 0.75;
+
+			public const double RetarderGenericFactor = 0.5;
 		}
 	}
 }
\ No newline at end of file
diff --git a/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLDeclarationComponentsDataProvider.cs b/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLDeclarationComponentsDataProvider.cs
index 0b3ad62e0ff87221e59e1fa09b7f02efa586a4c3..786b0be8c14a4e842881463a7437b00b85ccb32f 100644
--- a/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLDeclarationComponentsDataProvider.cs
+++ b/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLDeclarationComponentsDataProvider.cs
@@ -2,6 +2,7 @@
 using System.Xml;
 using System.Xml.Linq;
 using TUGraz.VectoCommon.InputData;
+using TUGraz.VectoCommon.Models;
 using TUGraz.VectoCore.InputData.FileIO.XML.Declaration.Interfaces;
 using TUGraz.VectoCore.InputData.FileIO.XML.Declaration.Reader;
 using TUGraz.VectoCore.Utils;
@@ -234,7 +235,9 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration.DataProvider
 	// ---------------------------------------------------------------------------------------
 
 
-	public class XMLDeclarationComponentsPrimaryVehicleBusDataProviderV01 : XMLDeclarationComponentsDataProviderV10, IXMLVehicleComponentsDeclaration
+	public class XMLDeclarationComponentsPrimaryVehicleBusDataProviderV01 : XMLDeclarationComponentsDataProviderV10, IXMLVehicleComponentsDeclaration,
+		IRetarderInputData
+		
 	{
 		public new static readonly XNamespace NAMESPACE_URI = XMLDefinitions.DECLARATION_PRIMARY_BUS_VEHICLE_URI_V01;
 
@@ -244,13 +247,14 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration.DataProvider
 
 		private IBusAuxiliariesDeclarationData _busAuxiliaries;
 
-		
-		public XMLDeclarationComponentsPrimaryVehicleBusDataProviderV01(IXMLDeclarationVehicleData vehicle, XmlNode componentNode,
-			string sourceFile) : base(vehicle, componentNode, sourceFile) { }
+
+		public XMLDeclarationComponentsPrimaryVehicleBusDataProviderV01(IXMLDeclarationVehicleData vehicle,
+			XmlNode componentNode, string sourceFile) : base(vehicle, componentNode, sourceFile) { }
+
 
 		IRetarderInputData IVehicleComponentsDeclaration.RetarderInputData
 		{
-			get { return null; }
+			get { return this; }
 		}
 
 		ITorqueConverterDeclarationInputData IVehicleComponentsDeclaration.TorqueConverterInputData
@@ -277,5 +281,13 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration.DataProvider
 		{
 			get { return NAMESPACE_URI; }
 		}
+
+		#region IRetarderInputData Interface Implementation
+
+		public RetarderType Type { get{ return _vehicle.RetarderType; }}
+		public double Ratio { get { return _vehicle.RetarderRatio; }}
+		public TableData LossMap { get; }
+
+		#endregion
 	}
 }
\ No newline at end of file
diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/AbstractSimulationDataAdapter.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/AbstractSimulationDataAdapter.cs
index f049130efb609cfcfbbd51b2466652f3d88321ca..aea433164656b507af9e955a57f53446f1891c9e 100644
--- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/AbstractSimulationDataAdapter.cs
+++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/AbstractSimulationDataAdapter.cs
@@ -164,7 +164,8 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter
 				ModelName = data.Model,
 				Date = data.Date,
 				CertificationMethod = data.CertificationMethod,
-				CertificationNumber = data.CertificationNumber,
+				CertificationNumber = data.CertificationMethod != CertificationMethod.StandardValues ? 
+					data.CertificationNumber : "",
 				DigestValueInput = data.DigestValue != null ? data.DigestValue.DigestValue : "",
 				Type = data.Type
 			};
@@ -172,8 +173,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter
 
 		protected static TransmissionLossMap CreateGearLossMap(ITransmissionInputData gear, uint i, bool useEfficiencyFallback, VehicleCategory vehicleCategory )
 		{
-			// TODO MQ 20200401 maybe vehiclecategory heavybuscompleted is not correct here.
-			if (vehicleCategory == VehicleCategory.HeavyBusCompletedVehicle) {
+			if (vehicleCategory == VehicleCategory.GenericBusVehicle) {
 				return gear.Ratio.IsEqual(1)
 					? TransmissionLossMapReader.Create(0.98, gear.Ratio, $"Gear {i + 1}")
 					: TransmissionLossMapReader.Create(0.96, gear.Ratio, $"Gear {i + 1}");
diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapterHeavyLorry.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapterHeavyLorry.cs
index f80af57120def5d0d3e0d362df92087741a42549..96d475ca97b612ce60a2634686aa5e70730e56c3 100644
--- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapterHeavyLorry.cs
+++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapterHeavyLorry.cs
@@ -360,7 +360,9 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter
 
 			var gears = new Dictionary<uint, GearData>();
 			var tcShiftPolygon = DeclarationData.TorqueConverter.ComputeShiftPolygon(engine.FullLoadCurves[0]);
-			var vehicleCategory = inputData.VehicleCategory;
+			var vehicleCategory = runData.VehicleData.VehicleCategory == VehicleCategory.GenericBusVehicle
+				? VehicleCategory.GenericBusVehicle
+				: inputData.VehicleCategory;
 			for (uint i = 0; i < gearsInput.Count; i++) {
 				var gear = gearsInput[(int)i];
 				var lossMap = CreateGearLossMap(gear, i, false, vehicleCategory);
@@ -401,8 +403,8 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter
 			if (retVal.Type.AutomaticTransmission()) {
 				var ratio = double.IsNaN(retVal.Gears[1].Ratio) ? 1 : retVal.Gears[1].TorqueConverterRatio / retVal.Gears[1].Ratio;
 				retVal.PowershiftShiftTime = DeclarationData.Gearbox.PowershiftShiftTime;
-				// TODO MQ 20200401 maybe vehiclecategory heavybuscompleted is not correct here.
-				if (vehicleCategory == VehicleCategory.HeavyBusCompletedVehicle) {
+
+				if (vehicleCategory == VehicleCategory.GenericBusVehicle) {
 					var fileStream = RessourceHelper.ReadStream(DeclarationData.FactorMethodBus.GenericTorqueConvert);
 					retVal.TorqueConverterData = TorqueConverterDataReader.ReadFromStream(fileStream,
 						DeclarationData.TorqueConverter.ReferenceRPM,
@@ -420,10 +422,12 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter
 						DeclarationData.TorqueConverter.CCUpshiftMinAcceleration);
 				}
 
-				retVal.TorqueConverterData.ModelName = torqueConverter.Model;
-				retVal.TorqueConverterData.DigestValueInput = torqueConverter.DigestValue?.DigestValue;
-				retVal.TorqueConverterData.CertificationMethod = torqueConverter.CertificationMethod;
-				retVal.TorqueConverterData.CertificationNumber = torqueConverter.CertificationNumber;
+				if (torqueConverter != null) {
+					retVal.TorqueConverterData.ModelName = torqueConverter.Model;
+					retVal.TorqueConverterData.DigestValueInput = torqueConverter.DigestValue?.DigestValue;
+					retVal.TorqueConverterData.CertificationMethod = torqueConverter.CertificationMethod;
+					retVal.TorqueConverterData.CertificationNumber = torqueConverter.CertificationNumber;
+				}
 			}
 
 			return retVal;
diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapterPrimaryBus.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapterPrimaryBus.cs
index a3f729163fe1b7ab301e67966cde5766acb2126c..e436a195c96f83f31af3847c63f16ddba65949c2 100644
--- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapterPrimaryBus.cs
+++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapterPrimaryBus.cs
@@ -25,64 +25,13 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter
 	{
 		#region Overrides of DeclarationDataAdapterTruck
 
-		public DriverData CreateDriverData(Segment segment, IVehicleDeclarationInputData primaryVehicle)
-		{
-			var lookAheadData = new DriverData.LACData {
-				Enabled = DeclarationData.Driver.LookAhead.Enabled,
-				//Deceleration = DeclarationData.Driver.LookAhead.Deceleration,
-				MinSpeed = DeclarationData.Driver.LookAhead.MinimumSpeed,
-				LookAheadDecisionFactor = new LACDecisionFactor(),
-				LookAheadDistanceFactor = DeclarationData.Driver.LookAhead.LookAheadDistanceFactor
-			};
-
-			var overspeedData = new DriverData.OverSpeedData {
-				Enabled = true,
-				MinSpeed = DeclarationData.Driver.OverSpeed.MinSpeed,
-				OverSpeed = DeclarationData.Driver.OverSpeed.AllowedOverSpeed,
-			};
-
-			var driver = new DriverData {
-				AccelerationCurve = AccelerationCurveReader.ReadFromStream(segment.AccelerationFile),
-				LookAheadCoasting = lookAheadData,
-				OverSpeed = overspeedData,
-				EngineStopStart = primaryVehicle.ADAS.EngineStopStart
-					? new DriverData.EngineStopStartData {
-						EngineOffStandStillActivationDelay = DeclarationData.Driver.EngineStopStart.ActivationDelay,
-						MaxEngineOffTimespan = DeclarationData.Driver.EngineStopStart.MaxEngineOffTimespan,
-						UtilityFactor = DeclarationData.Driver.EngineStopStart.UtilityFactor
-					}
-					: null,
-				EcoRoll = primaryVehicle.ADAS.EcoRoll != EcoRollType.None
-					? new DriverData.EcoRollData {
-						UnderspeedThreshold = DeclarationData.Driver.EcoRoll.UnderspeedThreshold,
-						MinSpeed = DeclarationData.Driver.EcoRoll.MinSpeed,
-						ActivationPhaseDuration = DeclarationData.Driver.EcoRoll.ActivationDelay,
-						AccelerationLowerLimit = DeclarationData.Driver.EcoRoll.AccelerationLowerLimit,
-						AccelerationUpperLimit = DeclarationData.Driver.EcoRoll.AccelerationUpperLimit
-					}
-					: null,
-				PCC = primaryVehicle.ADAS.PredictiveCruiseControl != PredictiveCruiseControlType.None
-					? new DriverData.PCCData {
-						PCCEnableSpeed = DeclarationData.Driver.PCC.PCCEnableSpeed,
-						MinSpeed = DeclarationData.Driver.PCC.MinSpeed,
-						PreviewDistanceUseCase1 = DeclarationData.Driver.PCC.PreviewDistanceUseCase1,
-						PreviewDistanceUseCase2 = DeclarationData.Driver.PCC.PreviewDistanceUseCase2,
-						UnderSpeed = DeclarationData.Driver.PCC.Underspeed,
-						OverspeedUseCase3 = DeclarationData.Driver.PCC.OverspeedUseCase3
-					}
-					: null
-			};
-			
-			return driver;
-		}
-
-
-		public override VehicleData CreateVehicleData(IVehicleDeclarationInputData pifVehicle, Mission mission, KeyValuePair<LoadingType, Kilogram> loading)
+		public VehicleData CreateVehicleData(IVehicleDeclarationInputData pifVehicle, Mission mission,
+			KeyValuePair<LoadingType, Kilogram> loading, Meter dynamicTyreRadius)
 		{
 			var vehicleData = new VehicleData
 			{
 				AxleData = GetAxles(pifVehicle.Components.AxleWheels.AxlesDeclaration, mission.AxleWeightDistribution),
-				DynamicTyreRadius = GetDynamicTyreRadius(pifVehicle.Components.AxleWheels.AxlesDeclaration),
+				DynamicTyreRadius = dynamicTyreRadius,
 				AxleConfiguration = pifVehicle.AxleConfiguration,
 				CurbMass = mission.CurbMass,
 				BodyAndTrailerMass = 0.SI<Kilogram>(),
@@ -122,23 +71,6 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter
 			return axles;
 		}
 
-		private Meter GetDynamicTyreRadius(IList<IAxleDeclarationInputData> axleWheels)
-		{
-			Meter dynamicTyreRadius = null;
-
-			for (int i = 0; i < axleWheels.Count; i++)
-			{
-				if (axleWheels[i].AxleType == AxleType.VehicleDriven)
-				{
-					dynamicTyreRadius = DeclarationData.Wheels.Lookup(axleWheels[i].Tyre.Dimension.RemoveWhitespace()).DynamicTyreRadius;
-					break;
-				}
-			}
-
-			return dynamicTyreRadius;
-		}
-
-
 		public ElectricsUserInputsConfig CreateElectricalUserInputsConfig(IVehicleDeclarationInputData primaryVehicle,
 			IAlternatorMap alternatorMap, Mission mission)
 		{
diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/EngineeringDataAdapter.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/EngineeringDataAdapter.cs
index 6db127ed4e183f3d0dccfca09d0aee692b494305..46cc7d7187a5cbb01575aa6a6e9e7abfdf36e70c 100644
--- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/EngineeringDataAdapter.cs
+++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/EngineeringDataAdapter.cs
@@ -317,7 +317,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter
 			}
 			for (uint i = 0; i < gearbox.Gears.Count; i++) {
 				var gear = gearbox.Gears[(int)i];
-				var lossMap = CreateGearLossMap(gear, i, true);
+				var lossMap = CreateGearLossMap(gear, i, true, VehicleCategory.Unknown);
 
 				var shiftPolygon = gear.ShiftPolygon != null && gear.ShiftPolygon.SourceType != DataSourceType.Missing
 					? ShiftPolygonReader.Create(gear.ShiftPolygon)
diff --git a/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationDataAdapterCompletedBus.cs b/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationDataAdapterCompletedBus.cs
index b5a47867af9768e0dc99333645f94e4071dce35b..e0e67622880b230d47728b869d480480b19c3151 100644
--- a/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationDataAdapterCompletedBus.cs
+++ b/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationDataAdapterCompletedBus.cs
@@ -20,57 +20,6 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl
 {
 	public class DeclarationDataAdapterCompletedBus
 	{
-		public DriverData CreateDriverData(Segment segment)
-		{
-			var lookAheadData = new DriverData.LACData
-			{
-				Enabled = DeclarationData.Driver.LookAhead.Enabled,
-				//Deceleration = DeclarationData.Driver.LookAhead.Deceleration,
-				MinSpeed = DeclarationData.Driver.LookAhead.MinimumSpeed,
-				LookAheadDecisionFactor = new LACDecisionFactor(),
-				LookAheadDistanceFactor = DeclarationData.Driver.LookAhead.LookAheadDistanceFactor
-			};
-
-			var overspeedData = new DriverData.OverSpeedData
-			{
-				Enabled = true,
-				MinSpeed = DeclarationData.Driver.OverSpeed.MinSpeed,
-				OverSpeed = DeclarationData.Driver.OverSpeed.AllowedOverSpeed,
-			};
-
-			var driver = new DriverData
-			{
-				AccelerationCurve = AccelerationCurveReader.ReadFromStream(segment.AccelerationFile),
-				LookAheadCoasting = lookAheadData,
-				OverSpeed = overspeedData,
-				EngineStopStart =  new DriverData.EngineStopStartData
-					{
-						EngineOffStandStillActivationDelay = DeclarationData.Driver.EngineStopStart.ActivationDelay,
-						MaxEngineOffTimespan = DeclarationData.Driver.EngineStopStart.MaxEngineOffTimespan,
-						UtilityFactor = DeclarationData.Driver.EngineStopStart.UtilityFactor
-					},
-				EcoRoll =  new DriverData.EcoRollData
-					{
-						UnderspeedThreshold = DeclarationData.Driver.EcoRoll.UnderspeedThreshold,
-						MinSpeed = DeclarationData.Driver.EcoRoll.MinSpeed,
-						ActivationPhaseDuration = DeclarationData.Driver.EcoRoll.ActivationDelay,
-						AccelerationLowerLimit = DeclarationData.Driver.EcoRoll.AccelerationLowerLimit,
-						AccelerationUpperLimit = DeclarationData.Driver.EcoRoll.AccelerationUpperLimit
-					},
-				PCC = new DriverData.PCCData
-					{
-						PCCEnableSpeed = DeclarationData.Driver.PCC.PCCEnableSpeed,
-						MinSpeed = DeclarationData.Driver.PCC.MinSpeed,
-						PreviewDistanceUseCase1 = DeclarationData.Driver.PCC.PreviewDistanceUseCase1,
-						PreviewDistanceUseCase2 = DeclarationData.Driver.PCC.PreviewDistanceUseCase2,
-						UnderSpeed = DeclarationData.Driver.PCC.Underspeed,
-						OverspeedUseCase3 = DeclarationData.Driver.PCC.OverspeedUseCase3
-					}
-			};
-
-
-			return driver;
-		}
 
 		public AirdragData CreateAirdragData(IVehicleDeclarationInputData completedVehicle, Mission mission)
 		{
@@ -101,7 +50,8 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl
 		}
 		
 		public VehicleData CreateVehicleData(IVehicleDeclarationInputData pifVehicle,
-			IVehicleDeclarationInputData completedVehicle, Mission mission, KeyValuePair<LoadingType, Kilogram> loading)
+			IVehicleDeclarationInputData completedVehicle, Mission mission, 
+			KeyValuePair<LoadingType, Kilogram> loading, Meter dynamicTyreRadius)
 		{
 			var vehicleData = new VehicleData
 			{
@@ -110,7 +60,7 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl
 				BodyAndTrailerMass = 0.SI<Kilogram>(),
 				Loading = GetLoading(completedVehicle, mission, loading),
 				GrossVehicleMass = completedVehicle.GrossVehicleMassRating,
-				DynamicTyreRadius = GetDynamicTyreRadius(pifVehicle.Components.AxleWheels.AxlesDeclaration),
+				DynamicTyreRadius = dynamicTyreRadius,
 				AxleData = GetAxles(pifVehicle.Components.AxleWheels.AxlesDeclaration, mission.AxleWeightDistribution)
 			};
 
@@ -392,23 +342,7 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl
 
 			return axles;
 		}
-
-		private Meter GetDynamicTyreRadius(IList<IAxleDeclarationInputData> axleWheels)
-		{
-			Meter dynamicTyreRadius = null;
-
-			for (int i = 0; i < axleWheels.Count; i++)
-			{
-				if (axleWheels[i].AxleType == AxleType.VehicleDriven)
-				{
-					dynamicTyreRadius = DeclarationData.Wheels.Lookup(axleWheels[i].Tyre.Dimension.RemoveWhitespace()).DynamicTyreRadius;
-					break;
-				}
-			}
-
-			return dynamicTyreRadius;
-		}
-
+		
 		private Kilogram GetLoading(IVehicleDeclarationInputData completedVehicle, Mission mission, KeyValuePair<LoadingType, Kilogram> loading)
 		{
 			var busFloorArea = DeclarationData.BusAuxiliaries.CalculateBusFloorSurfaceArea(completedVehicle.Length,
diff --git a/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationModeCompletedBusVectoRunDataFactory.cs b/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationModeCompletedBusVectoRunDataFactory.cs
index 02a9d675cf5d79d313ddb73b75a83cf7bf0010bd..37fa283c37e34443594ff5ebeffd410402c12bc4 100644
--- a/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationModeCompletedBusVectoRunDataFactory.cs
+++ b/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationModeCompletedBusVectoRunDataFactory.cs
@@ -36,6 +36,7 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl
 
 
 		protected Segment _segment;
+		
 		protected DriverData _driverdata;
 		protected AirdragData _airdragData;
 		protected AxleGearData _axlegearData;
@@ -52,6 +53,9 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl
 		//protected Exception InitException;
 		protected ShiftStrategyParameters _gearshiftData;
 
+		private VehicleData _tmpVehicleData;
+		private DriverData _driverData;
+
 
 		protected IDeclarationDataAdapter DataAdapter { get; }
 
@@ -130,16 +134,26 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl
 
 			//_municipalPtoTransmissionData = null;
 
+			_tmpVehicleData = new VehicleData {
+				DynamicTyreRadius = DeclarationData.FactorMethodBus.GetDynamicTyreRadius(primaryVehicle),
+				VehicleCategory = VehicleCategory.GenericBusVehicle
+			};
+
 
 			_combustionEngineData = DeclarationData.FactorMethodBus.CreateBusEngineData(primaryVehicle);
 
 			_axlegearData = DeclarationData.FactorMethodBus.CreateAxlegearData(primaryVehicle.Components.AxleGearInputData);
-			_angledriveData =
-				DeclarationData.FactorMethodBus.CreateAngledriveData(primaryVehicle.Components.AngledriveInputData);
+
+			_angledriveData = DeclarationData.FactorMethodBus.CreateAngledriveData(
+								primaryVehicle.Components.AngledriveInputData,
+								primaryVehicle.Components.AxleGearInputData.Ratio);
 			
-			_gearboxData = DeclarationData.FactorMethodBus.CreateGearboxData(primaryVehicle, new VectoRunData() { EngineData = _combustionEngineData, AxleGearData = _axlegearData, VehicleData =  },
+
+			_gearboxData = DeclarationData.FactorMethodBus.CreateGearboxData(primaryVehicle,
+				new VectoRunData() { EngineData = _combustionEngineData, AxleGearData = _axlegearData, VehicleData = _tmpVehicleData },
 				null);
 
+	
 			_gearshiftData = DataAdapterPrimary.CreateGearshiftData(
 				_gearboxData, _axlegearData.AxleGear.Ratio * (_angledriveData?.Angledrive.Ratio ?? 1.0), _combustionEngineData.IdleSpeed);
 
@@ -158,7 +172,8 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl
 
 			_retarderData =
 				DeclarationData.FactorMethodBus.CreateRetarderData(primaryVehicle.Components.RetarderInputData);
-		
+
+			_driverData = new GenericBusDriverData().CreateGenericBusDriverData(_segment);
 		}
 
 		protected virtual IEnumerable<VectoRunData> GetNextRun()
@@ -275,15 +290,13 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl
 			//	mission, InputDataProvider.JobInputData.Vehicle, simulationRunData);
 			//return simulationRunData;
 
-
-			// TODO MQ completedSegment == _segment?
-			var completedSegment = GetCompletedSegment(completedVehicle, primaryVehicle.AxleConfiguration);
 			var primaryBusAuxiliaries = primaryVehicle.Components.BusAuxiliaries;
 
 			var simulationRunData = new VectoRunData {
 
 				Loading = loading.Key,
-				VehicleData = DataAdapterCompleted.CreateVehicleData(primaryVehicle, completedVehicle, mission, loading),
+				VehicleData = DataAdapterCompleted.CreateVehicleData(primaryVehicle, completedVehicle, 
+					mission, loading, _tmpVehicleData.DynamicTyreRadius),
 				AirdragData = DataAdapterCompleted.CreateAirdragData(completedVehicle, mission),
 				EngineData = _combustionEngineData,
 				GearboxData = _gearboxData,
@@ -291,7 +304,7 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl
 				AngledriveData = _angledriveData,
 				GearshiftParameters = _gearshiftData,
 				Aux = DataAdapterPrimary.CreateAuxiliaryData(primaryVehicle.Components.AuxiliaryInputData,
-				primaryBusAuxiliaries, mission.MissionType, completedSegment.VehicleClass,
+				primaryBusAuxiliaries, mission.MissionType, _segment.VehicleClass,
 				completedVehicle.Length)
 			};
 			
@@ -310,9 +323,8 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl
 			simulationRunData.BusAuxiliaries = auxiliaryConfig;
 
 			simulationRunData.Retarder = _retarderData;
-			
-			// todo MQ 20200401: move driver data to initialize method and set member.
-			simulationRunData.DriverData = DataAdapterCompleted.CreateDriverData(completedSegment);
+
+			simulationRunData.DriverData = _driverData;
 			
 			simulationRunData.Cycle = new DrivingCycleProxy(cycle, mission.MissionType.ToString());
 			
@@ -388,7 +400,8 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl
 
 			var simulationRunData = new VectoRunData {
 				Loading = loading.Key,
-				VehicleData = DataAdapterPrimary.CreateVehicleData(primaryVehicle, mission, loading),
+				VehicleData = DataAdapterPrimary.CreateVehicleData(primaryVehicle, mission, loading,
+					_tmpVehicleData.DynamicTyreRadius),
 				AirdragData = DataAdapterPrimary.CreateAirdragData(null, mission, new Segment()),
 				EngineData = _combustionEngineData,
 				GearboxData = _gearboxData,
@@ -416,8 +429,7 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl
 
 			simulationRunData.Retarder = _retarderData;
 			
-			// todo: use driver data from initialize method
-			simulationRunData.DriverData = DataAdapterPrimary.CreateDriverData(primarySegment, primaryVehicle);
+			simulationRunData.DriverData = _driverData;
 
 			simulationRunData.Cycle = new DrivingCycleProxy(cycle, mission.MissionType.ToString());
 
diff --git a/VectoCore/VectoCore/Models/Declaration/DeclarationData.cs b/VectoCore/VectoCore/Models/Declaration/DeclarationData.cs
index a63f95eb5a57acd5abfc88a6c95ca809b09e020d..59f3421862c0586cd3ee746e5ba4899c35b59604 100644
--- a/VectoCore/VectoCore/Models/Declaration/DeclarationData.cs
+++ b/VectoCore/VectoCore/Models/Declaration/DeclarationData.cs
@@ -82,6 +82,10 @@ namespace TUGraz.VectoCore.Models.Declaration
 		public static readonly ElectricSystem ElectricSystem = new ElectricSystem();
 		public static readonly Fan Fan = new Fan();
 
+		public static readonly GenericBusEngineData GenericBusEngineData = new GenericBusEngineData();
+		public static readonly GenericBusAxelgearData GenericBusAxelgearData = new GenericBusAxelgearData();
+		public static readonly GenericBusAngledriveData GenericBusAngledriveData = new GenericBusAngledriveData();
+		public static readonly GenericBusRetarderData GenericBusRetarderData = new GenericBusRetarderData();
 
 		public static readonly HeatingVentilationAirConditioning HeatingVentilationAirConditioning =
 			new HeatingVentilationAirConditioning();
@@ -146,331 +150,38 @@ namespace TUGraz.VectoCore.Models.Declaration
 		public static class FactorMethodBus
 		{
 			#region Constans
-			private static string GenericEngineCM_Normed_CI =
-				$"{DeclarationDataResourcePrefix}.GenericBusData.EngineConsumptionMap_CI_Normed.vmap";
 
-			private static string GenericEngineCM_Normed_PI =
-				$"{DeclarationDataResourcePrefix}.GenericBusData.EngineConsumptionMap_PI_Normed.vmap";
-			
 			public static string GenericTorqueConvert =
 				$"{DeclarationDataResourcePrefix}.GenericBusData.GenericTorqueConverter.csv";
+			
 			#endregion
-
-
+			
 			#region Create Engine Data
 
 			public static CombustionEngineData CreateBusEngineData(IVehicleDeclarationInputData pifVehicle)
 			{
-				var enginePif = pifVehicle.Components.EngineInputData;
-				var gearbox = pifVehicle.Components.GearboxInputData;
-
-				var engine = new CombustionEngineData();
-
-				var fullLoadCurves = new Dictionary<uint, EngineFullLoadCurve>
-				{
-					[0] = FullLoadCurveReader.Create(enginePif.EngineModes.First().FullLoadCurve, true)
-				};
-				// TODO: MQ 20200401 add full-load curves per gear, limited by max torque (gbx or vehicle)
-				//   see DeclarationDataAdapterHeavyLorry ln 235ff.
-
-				engine.FullLoadCurves = fullLoadCurves;
-
-				engine.IdleSpeed = enginePif.EngineModes[0].IdleSpeed;
-				engine.Displacement = enginePif.Displacement;
-
-				var fuel = GetCombustionEngineFuelData(enginePif.EngineModes.First().Fuels.First().FuelType,
-					pifVehicle.DualFuelVehicle);
-
-
-				engine.WHRType = WHRType.None;
-
-				engine.Fuels = new List<CombustionEngineFuelData> { fuel };
-
-				engine.Inertia = Engine.EngineInertia(engine.Displacement, gearbox.Type);
-				return engine;
-			}
-
-
-			private static CombustionEngineFuelData GetCombustionEngineFuelData(FuelType fuelType, bool isDualFuel)
-			{
-				var ressourceId = string.Empty;
-
-				if (isDualFuel)
-				{
-					ressourceId = GenericEngineCM_Normed_CI;
-				}
-				else
-				{
-					switch (fuelType)
-					{
-						case FuelType.DieselCI:
-						case FuelType.EthanolCI:
-						case FuelType.NGCI:
-							ressourceId = GenericEngineCM_Normed_CI;
-							break;
-						case FuelType.EthanolPI:
-						case FuelType.LPGPI:
-						case FuelType.PetrolPI:
-						case FuelType.NGPI:
-							ressourceId = GenericEngineCM_Normed_PI;
-							break;
-					}
-				}
-				//ToDo ConsumptionMap
-				//var denormalizedData = DenormalizeData(ressourceId);
-				//var fcMap = FuelConsumptionMapReader.Create(denormalizedData);
-
-				var fuel = new CombustionEngineFuelData
-				{
-					WHTCUrban = 1,
-					WHTCRural = 1,
-					WHTCMotorway = 1,
-					ColdHotCorrectionFactor = 1,
-					CorrectionFactorRegPer = 1,
-					//ConsumptionMap = fcMap
-				};
-
-				return fuel;
-
-			}
-
-			private static DataTable DenormalizeData(string ressourceId)
-			{
-				// TODO: use vehicle specific values. n_idle  from PIF, nRated calculated from
-				// full-load curve (fullLoadCurves[0].RatedSpeed), m_rated => max torque (fullLoadCurves[0].MaxTorque)
-				var nIdle = 600.0;
-				var nRated = 1800.0;
-				var mRated = 1750.0;
-
-				var normedData = VectoCSVFile.ReadStream(RessourceHelper.ReadStream(ressourceId), source: ressourceId);
-
-				var result = new DataTable();
-				result.Columns.Add(FuelConsumptionMapReader.Fields.EngineSpeed);
-				result.Columns.Add(FuelConsumptionMapReader.Fields.Torque);
-				result.Columns.Add(FuelConsumptionMapReader.Fields.FuelConsumption);
-
-				foreach (DataRow row in normedData.Rows)
-				{
-					var engineSpeed = DenormalizeEngineSpeed((string)row[FuelConsumptionMapReader.Fields.EngineSpeed],
-						nIdle, nRated);
-					var torque = DenormalizeTorque((string)row[FuelConsumptionMapReader.Fields.Torque], mRated);
-					var fc = DenormalizeFC((string)row[FuelConsumptionMapReader.Fields.FuelConsumption], mRated);
-
-					var newRow = result.NewRow();
-					newRow[FuelConsumptionMapReader.Fields.EngineSpeed] = engineSpeed;
-					newRow[FuelConsumptionMapReader.Fields.Torque] = torque;
-					newRow[FuelConsumptionMapReader.Fields.FuelConsumption] = fc;
-					result.Rows.Add(newRow);
-				}
-
-				return result;
-			}
-
-			private static double DenormalizeFC(string fc, double mRated)
-			{
-				return fc.ToDouble() * mRated;
-			}
-
-			private static double DenormalizeTorque(string torque, double mRated)
-			{
-				return torque.ToDouble() * mRated;
-			}
-
-			private static double DenormalizeEngineSpeed(string engineSpeed, double nIdle, double nRated)
-			{
-				return engineSpeed.ToDouble() * (nRated - nIdle) + nIdle;
+				return GenericBusEngineData.CreateGenericBusEngineData(pifVehicle);
 			}
 			
 			#endregion
 
 			#region Create Axlegear Data
-			public static AxleGearData CreateAxlegearData(IAxleGearInputData axlegearData)
-			{
-				var axleGear = new AxleGearData
-				{
-					LineType = axlegearData.LineType,
-					InputData = axlegearData
-				};
-
-				var outputLossMap = CreateAxlegearOutputLossMap();
-				var inputLossMap = CalculateAxleInputLossMap(outputLossMap);
-
-				var transmissionData = new TransmissionData
-				{
-					Ratio = axlegearData.Ratio,
-					LossMap = TransmissionLossMapReader.Create(inputLossMap, axlegearData.Ratio, "Axlegear")
-				};
-					
-				axleGear.AxleGear = transmissionData;
-
-				return axleGear;
-			}
-			
-			private static DataTable CreateAxlegearOutputLossMap()
-			{
-				var lossMap = new DataTable();
-				lossMap.Columns.Add("output speed");
-				lossMap.Columns.Add("output torque");
-				lossMap.Columns.Add("output torque loss");
-				
-				var torques = new [] {
-					Constants.GenericLossMapSettings.OutputTorqueEnd * -1.0,
-					Constants.GenericLossMapSettings.OutputTorqueStart *-1.0,
-					Constants.GenericLossMapSettings.OutputTorqueStart,
-					Constants.GenericLossMapSettings.OutputTorqueEnd
-				};
 
-				// TODO: MQ 20200401  I_axl from PIF
-				var td0 = Constants.GenericLossMapSettings.T0 +
-						Constants.GenericLossMapSettings.IAxl *
-						Constants.GenericLossMapSettings.T1;
-
-				var td0_ = td0 * 0.5;
-				var td150_ = td0 * 0.5;
-				var td_n = Constants.GenericLossMapSettings.Td_n;
-				var efficiency = Constants.GenericLossMapSettings.Efficiency;
-
-				var torqueIndex = 0;
-
-				for (int i = 0; i < 12; i++) {
-					var speed = 0.0;
-					double calculationSpeed;
-					double torque;
-	
-					if (i % 4 == 0)
-						torqueIndex = 0;
-
-					if (i < 4) 
-						speed = 0.0;
-					else if (i >= 4 && i < 8)
-						speed = Constants.GenericLossMapSettings.OutputSpeedStart;
-					else if (i >= 8 && i < 12)
-						speed = Constants.GenericLossMapSettings.OutputSpeedEnd;
-					
-					calculationSpeed = speed.Equals(0.0) 
-						? Constants.GenericLossMapSettings.OutputSpeedStart 
-						: speed;
-
-					torque = torques[torqueIndex++];
-
-					var newRow = lossMap.NewRow();
-					newRow[lossMap.Columns[0]] = speed;
-					newRow[lossMap.Columns[1]] = torque;
-					newRow[lossMap.Columns[2]] =
-						CalculateOutputTorqueLoss(td0_, td150_, td_n, calculationSpeed, torque, efficiency);
-
-					lossMap.Rows.Add(newRow);
-				}
-				
-				return lossMap;
-			}
-
-			private static double CalculateOutputTorqueLoss(double td0_, double td150_, double td_n, 
-				double outputspeed, double ouputTorque, double efficiency)
-			{
-				if (ouputTorque < 0)
-					ouputTorque = ouputTorque * -1.0;
-				
-				return td0_+ td150_ * outputspeed/td_n + ouputTorque/ efficiency - ouputTorque;
-			}
-
-			private static DataTable CalculateAxleInputLossMap(DataTable outputLossMap)
-			{
-				var inputLossMap = new DataTable();
-
-				inputLossMap.Columns.Add(TransmissionLossMapReader.Fields.InputSpeed);
-				inputLossMap.Columns.Add(TransmissionLossMapReader.Fields.InputTorque);
-				inputLossMap.Columns.Add(TransmissionLossMapReader.Fields.TorqeLoss);
-
-				// TODO: MQ 20200401 use axlegear ratio from PIF
-				var iAxle = Constants.GenericLossMapSettings.IAxl;
-
-				foreach (DataRow row in outputLossMap.Rows) {
-					var outputSpeed = row[0].ToString().ToDouble();
-					var outputTorque = row[1].ToString().ToDouble();
-					var outputLoss = row[2].ToString().ToDouble();
-
-					var newRow = inputLossMap.NewRow();
-					newRow[0] = GetInputSpeed(outputSpeed, iAxle);
-					newRow[1] = GetInputTorque(outputTorque, outputLoss, iAxle);
-					newRow[2] = GetInputTorqueLoss(outputLoss, iAxle);
-					inputLossMap.Rows.Add(newRow);
-				}
-
-				return inputLossMap;
-			}
-
-			[MethodImpl(MethodImplOptions.AggressiveInlining)]
-			private static double GetInputSpeed(double outputSpeed, double iAxle)
-			{
-				return outputSpeed * iAxle;
-			}
-
-			[MethodImpl(MethodImplOptions.AggressiveInlining)]
-			private static double GetInputTorque(double outputTorque, double outputLoss, double iAxle)
-			{
-				return (outputTorque + outputLoss) / iAxle;
-			}
-
-			[MethodImpl(MethodImplOptions.AggressiveInlining)]
-			private static double GetInputTorqueLoss(double outputLoss, double iAxle)
+			public static AxleGearData CreateAxlegearData(IAxleGearInputData axlegearData)
 			{
-				return outputLoss / iAxle;
+				return GenericBusAxelgearData.CreateGenericBusAxlegearData(axlegearData);
 			}
 
 			#endregion
 
 			#region Create Angledrive Data
 
-			public static AngledriveData CreateAngledriveData(IAngledriveInputData angledriveInputData)
+			public static AngledriveData CreateAngledriveData(IAngledriveInputData angledriveInputData, double axleRatio)
 			{
-				if (angledriveInputData.DataSource.SourceFile == null)
-					return null;
-
-				var angledriveData = new AngledriveData
-				{
-					Type = angledriveInputData.Type,
-					InputData = angledriveInputData
-				};
-
-				var axleGearOutputLossMap = CreateAxlegearOutputLossMap();
-				var axleGearInputLossMap = CalculateAxleInputLossMap(axleGearOutputLossMap);
-
-				var transmissionAngleDrive = new TransmissionData
-				{
-					Ratio = angledriveInputData.Ratio,
-					LossMap = GetAngleDriveLossMap(axleGearInputLossMap, angledriveInputData.Ratio)
-				};
-				
-
-				angledriveData.Angledrive = transmissionAngleDrive;
-
-				return angledriveData;
-			}
-
-			private static TransmissionLossMap GetAngleDriveLossMap(DataTable axleGearInputTable, double ratio)
-			{
-				var angleDriveLossMap = new DataTable();
-				angleDriveLossMap.Columns.Add(TransmissionLossMapReader.Fields.InputSpeed);
-				angleDriveLossMap.Columns.Add(TransmissionLossMapReader.Fields.InputTorque);
-				angleDriveLossMap.Columns.Add(TransmissionLossMapReader.Fields.TorqeLoss);
-
-				var angleDriveFactor = Constants.GenericLossMapSettings.FactorAngleDrive;
-				foreach (DataRow row in axleGearInputTable.Rows) {
-					var inputSpeed = row[0].ToString().ToDouble();
-					var inputTorque = row[1].ToString().ToDouble();
-					var inputTorqueLoss = row[2].ToString().ToDouble() * angleDriveFactor;
-
-					var newRow = angleDriveLossMap.NewRow();
-					newRow[0] = inputSpeed;
-					newRow[1] = inputTorque;
-					newRow[2] = inputTorqueLoss;
-					angleDriveLossMap.Rows.Add(newRow);
-				}
-
-				return TransmissionLossMapReader.Create(angleDriveFactor, ratio, "AngleDrive");
+				return GenericBusAngledriveData.CreateGenericBusAngledriveData(angledriveInputData, axleRatio,
+					GenericBusAxelgearData.AxleGearInputLossMap);
 			}
-
+			
 			#endregion
 
 			#region Create Gearbox Data
@@ -479,16 +190,6 @@ namespace TUGraz.VectoCore.Models.Declaration
 				IShiftPolygonCalculator shiftPolygonCalc)
 			{
 				return DeclarationDataAdapterHeavyLorry.DoCreateGearboxData(pifVehicle, runData, shiftPolygonCalc);
-				//var gearbox = new GearboxData
-				//{
-				//	Inertia = 0.SI<KilogramSquareMeter>(),
-				//	TractionInterruption =
-				//		GearBoxTypeHelper.TractionInterruption(pifVehicle.Components.GearboxInputData.Type),
-				//	Gears = GetGearData(pifVehicle.Components.GearboxInputData,
-				//		pifVehicle.TorqueLimits.ToDictionary(e => e.Gear), fullLoadMaxTorque)
-				//};
-
-				//return gearbox;
 			}
 
 			
@@ -521,69 +222,32 @@ namespace TUGraz.VectoCore.Models.Declaration
 
 			public static RetarderData CreateRetarderData(IRetarderInputData retarderInput)
 			{
-				if (retarderInput == null)
-					return null;
-
-				var retarder = new RetarderData
-				{
-					Ratio = retarderInput.Ratio,
-					Type = retarderInput.Type,
-					LossMap = GenerateGenericLossMap(retarderInput.Ratio)
-				};
-
-				return retarder;
+				 return GenericBusRetarderData.CreateGenericBusRetarderData(retarderInput);
 			}
 
-			private static RetarderLossMap GenerateGenericLossMap(double stepUpRatio)
-			{
-				var factorGeneric = 0.5; 
-
-				var retarderSpeeds = new double [] {
-					0, 200 , 400, 600, 900, 1200,
-					1600, 2000, 2500, 3000, 3500, 4000,
-					4500, 5000
-				};
+			#endregion
 
-				var genericRetarderLosses = GetHydrodynamicRetardersLoss(retarderSpeeds, stepUpRatio);
-				//var genericRetarderLosses = GetMagneticRetarderLoss(retarderSpeeds, stepUpRatio);
-
-				var torqueLoss = new DataTable();
-				torqueLoss.Columns.Add(RetarderLossMapReader.Fields.RetarderSpeed);
-				torqueLoss.Columns.Add(RetarderLossMapReader.Fields.TorqueLoss);
-				
-				for (int i = 0; i < genericRetarderLosses.Length; i++) {
-					var newRow = torqueLoss.NewRow();
-					newRow[RetarderLossMapReader.Fields.RetarderSpeed] = retarderSpeeds[i];
-					newRow[RetarderLossMapReader.Fields.TorqueLoss] = genericRetarderLosses[i] * factorGeneric;
-					torqueLoss.Rows.Add(newRow);
-				}
+			#region Common Getters
 
-				return RetarderLossMapReader.Create(torqueLoss);
-			}
-			
-			private static double[] GetHydrodynamicRetardersLoss(double[] retarderSpeeds, double stepUpRatio)
+			public static Meter GetDynamicTyreRadius(IVehicleDeclarationInputData primaryVehicle)
 			{
-				var losses = new double[retarderSpeeds.Length];
+				var axleWheels = primaryVehicle.Components.AxleWheels.AxlesDeclaration;
+				Meter dynamicTyreRadius = null;
 
-				for (int i = 0; i < retarderSpeeds.Length; i++) {
-					losses[i] = 10.0 / stepUpRatio + 2.0 / Math.Pow(stepUpRatio, 3) * Math.Pow(retarderSpeeds[i] / 1000.0, 2);
+				for (int i = 0; i < axleWheels.Count; i++)
+				{
+					if (axleWheels[i].AxleType == AxleType.VehicleDriven)
+					{
+						dynamicTyreRadius = DeclarationData.Wheels.Lookup(axleWheels[i].Tyre.Dimension.RemoveWhitespace()).DynamicTyreRadius;
+						break;
+					}
 				}
 
-				return losses;
+				return dynamicTyreRadius;
 			}
 
-			private static double[] GetMagneticRetarderLoss(double[] retarderSpeeds, double stepUpRatio)
-			{
-				var losses = new double[retarderSpeeds.Length];
-
-				for (int i = 0; i < retarderSpeeds.Length; i++) {
-					losses[i] = 15.0 / stepUpRatio + 2.0 / Math.Pow(stepUpRatio, 4) * Math.Pow(retarderSpeeds[i] / 1000.0, 3);
-				}
-
-				return losses;
-			}
-			
 			#endregion
+
 		}
 
 
diff --git a/VectoCore/VectoCore/Models/Declaration/GenericBusAngledriveData.cs b/VectoCore/VectoCore/Models/Declaration/GenericBusAngledriveData.cs
new file mode 100644
index 0000000000000000000000000000000000000000..d92d0ed3ed5a0288e05aeb547cae0e779a682e93
--- /dev/null
+++ b/VectoCore/VectoCore/Models/Declaration/GenericBusAngledriveData.cs
@@ -0,0 +1,61 @@
+using System;
+using System.Data;
+using TUGraz.VectoCommon.InputData;
+using TUGraz.VectoCommon.Utils;
+using TUGraz.VectoCore.Configuration;
+using TUGraz.VectoCore.InputData.Reader.ComponentData;
+using TUGraz.VectoCore.Models.SimulationComponent.Data;
+using TUGraz.VectoCore.Models.SimulationComponent.Data.Gearbox;
+
+namespace TUGraz.VectoCore.Models.Declaration
+{
+	public class GenericBusAngledriveData
+	{
+		public AngledriveData CreateGenericBusAngledriveData(IAngledriveInputData angledriveInputData, double axleRatio,
+			DataTable axleGearInputLossMap)
+		{
+			if (angledriveInputData.DataSource.SourceFile == null)
+				return null;
+
+			var angledriveData = new AngledriveData
+			{
+				Type = angledriveInputData.Type,
+				InputData = angledriveInputData
+			};
+			
+			var transmissionAngleDrive = new TransmissionData
+			{
+				Ratio = angledriveInputData.Ratio,
+				LossMap = GetAngleDriveLossMap(axleGearInputLossMap, angledriveInputData.Ratio)
+			};
+
+			angledriveData.Angledrive = transmissionAngleDrive;
+
+			return angledriveData;
+		}
+
+		private TransmissionLossMap GetAngleDriveLossMap(DataTable axleGearInputTable, double ratio)
+		{
+			var angleDriveLossMap = new DataTable();
+			angleDriveLossMap.Columns.Add(TransmissionLossMapReader.Fields.InputSpeed);
+			angleDriveLossMap.Columns.Add(TransmissionLossMapReader.Fields.InputTorque);
+			angleDriveLossMap.Columns.Add(TransmissionLossMapReader.Fields.TorqeLoss);
+
+			var angleDriveFactor = Constants.GenericLossMapSettings.FactorAngleDrive;
+			foreach (DataRow row in axleGearInputTable.Rows)
+			{
+				var inputSpeed = row[0].ToString().ToDouble();
+				var inputTorque = row[1].ToString().ToDouble();
+				var inputTorqueLoss = row[2].ToString().ToDouble() * angleDriveFactor;
+
+				var newRow = angleDriveLossMap.NewRow();
+				newRow[0] = inputSpeed;
+				newRow[1] = inputTorque;
+				newRow[2] = inputTorqueLoss;
+				angleDriveLossMap.Rows.Add(newRow);
+			}
+
+			return TransmissionLossMapReader.Create(angleDriveFactor, ratio, "AngleDrive");
+		}
+	}
+}
diff --git a/VectoCore/VectoCore/Models/Declaration/GenericBusAxelgearData.cs b/VectoCore/VectoCore/Models/Declaration/GenericBusAxelgearData.cs
new file mode 100644
index 0000000000000000000000000000000000000000..d52f7643efe13555466dc45976bd14cd0feab57c
--- /dev/null
+++ b/VectoCore/VectoCore/Models/Declaration/GenericBusAxelgearData.cs
@@ -0,0 +1,150 @@
+using System;
+using System.Data;
+using System.Runtime.CompilerServices;
+using TUGraz.VectoCommon.InputData;
+using TUGraz.VectoCommon.Utils;
+using TUGraz.VectoCore.Configuration;
+using TUGraz.VectoCore.InputData.Reader.ComponentData;
+using TUGraz.VectoCore.Models.SimulationComponent.Data;
+using TUGraz.VectoCore.Models.SimulationComponent.Data.Gearbox;
+
+namespace TUGraz.VectoCore.Models.Declaration
+{
+	public class GenericBusAxelgearData
+	{
+		public DataTable AxleGearInputLossMap { get; private set; }
+
+		public AxleGearData CreateGenericBusAxlegearData(IAxleGearInputData axlegearData)
+		{
+			var axleGear = new AxleGearData
+			{
+				LineType = axlegearData.LineType,
+				InputData = axlegearData
+			};
+
+			var ratio = axlegearData.Ratio;
+
+			var outputLossMap = CreateAxlegearOutputLossMap(ratio);
+			AxleGearInputLossMap = CalculateAxleInputLossMap(outputLossMap, ratio);
+
+			var transmissionData = new TransmissionData
+			{
+				Ratio = axlegearData.Ratio,
+				LossMap = TransmissionLossMapReader.Create(AxleGearInputLossMap, ratio, "Axlegear")
+			};
+
+			axleGear.AxleGear = transmissionData;
+
+			return axleGear;
+		}
+
+		private DataTable CreateAxlegearOutputLossMap(double axleRatio)
+		{
+			var torques = new[] {
+					Constants.GenericLossMapSettings.OutputTorqueEnd * -1.0,
+					Constants.GenericLossMapSettings.OutputTorqueStart *-1.0,
+					Constants.GenericLossMapSettings.OutputTorqueStart,
+					Constants.GenericLossMapSettings.OutputTorqueEnd
+				};
+
+			var outStart = Constants.GenericLossMapSettings.OutputSpeedStart;
+			var outEnd = Constants.GenericLossMapSettings.OutputSpeedEnd;
+
+			var outputSpeeds = new[] {
+					0, 0, 0, 0,
+					outStart, outStart,outStart, outStart,
+					outEnd, outEnd, outEnd, outEnd
+				};
+
+			var td0 = Constants.GenericLossMapSettings.T0 +
+					  axleRatio * Constants.GenericLossMapSettings.T1;
+
+			var td0_ = td0 * 0.5;
+			var td150_ = td0 * 0.5;
+			var td_n = Constants.GenericLossMapSettings.Td_n;
+			var efficiency = Constants.GenericLossMapSettings.Efficiency;
+
+			var torqueIndex = 0;
+
+
+			var lossMap = new DataTable();
+			lossMap.Columns.Add("output speed");
+			lossMap.Columns.Add("output torque");
+			lossMap.Columns.Add("output torque loss");
+
+			for (int i = 0; i < 12; i++)
+			{
+				if (i % 4 == 0)
+					torqueIndex = 0;
+
+				var calculationSpeed = outputSpeeds[i].IsEqual(0)
+					? outputSpeeds[4]
+					: outputSpeeds[i];
+
+				var torque = torques[torqueIndex++];
+
+				var newRow = lossMap.NewRow();
+				newRow[lossMap.Columns[0]] = outputSpeeds[i];
+				newRow[lossMap.Columns[1]] = torque;
+				newRow[lossMap.Columns[2]] =
+					CalculateOutputTorqueLoss(td0_, td150_, td_n, calculationSpeed, torque, efficiency);
+
+				lossMap.Rows.Add(newRow);
+
+			}
+
+			return lossMap;
+		}
+
+		private double CalculateOutputTorqueLoss(double td0_, double td150_, double td_n,
+			double outputspeed, double ouputTorque, double efficiency)
+		{
+			if (ouputTorque < 0)
+				ouputTorque = ouputTorque * -1.0;
+
+			return td0_ + td150_ * outputspeed / td_n + ouputTorque / efficiency - ouputTorque;
+		}
+
+		private DataTable CalculateAxleInputLossMap(DataTable outputLossMap, double axleRatio)
+		{
+			var inputLossMap = new DataTable();
+
+			inputLossMap.Columns.Add(TransmissionLossMapReader.Fields.InputSpeed);
+			inputLossMap.Columns.Add(TransmissionLossMapReader.Fields.InputTorque);
+			inputLossMap.Columns.Add(TransmissionLossMapReader.Fields.TorqeLoss);
+
+			foreach (DataRow row in outputLossMap.Rows)
+			{
+				var outputSpeed = row[0].ToString().ToDouble();
+				var outputTorque = row[1].ToString().ToDouble();
+				var outputLoss = row[2].ToString().ToDouble();
+
+				var newRow = inputLossMap.NewRow();
+				newRow[0] = GetInputSpeed(outputSpeed, axleRatio);
+				newRow[1] = GetInputTorque(outputTorque, outputLoss, axleRatio);
+				newRow[2] = GetInputTorqueLoss(outputLoss, axleRatio);
+				inputLossMap.Rows.Add(newRow);
+			}
+
+			return inputLossMap;
+		}
+
+		[MethodImpl(MethodImplOptions.AggressiveInlining)]
+		private double GetInputSpeed(double outputSpeed, double iAxle)
+		{
+			return outputSpeed * iAxle;
+		}
+
+		[MethodImpl(MethodImplOptions.AggressiveInlining)]
+		private double GetInputTorque(double outputTorque, double outputLoss, double iAxle)
+		{
+			return (outputTorque + outputLoss) / iAxle;
+		}
+
+		[MethodImpl(MethodImplOptions.AggressiveInlining)]
+		private double GetInputTorqueLoss(double outputLoss, double iAxle)
+		{
+			return outputLoss / iAxle;
+		}
+	}
+}
diff --git a/VectoCore/VectoCore/Models/Declaration/GenericBusDriverData.cs b/VectoCore/VectoCore/Models/Declaration/GenericBusDriverData.cs
new file mode 100644
index 0000000000000000000000000000000000000000..000a1939cb32130f266d82a8e3c17932cfa545e9
--- /dev/null
+++ b/VectoCore/VectoCore/Models/Declaration/GenericBusDriverData.cs
@@ -0,0 +1,60 @@
+using System;
+using TUGraz.VectoCore.InputData.Reader.ComponentData;
+using TUGraz.VectoCore.Models.SimulationComponent.Data;
+
+namespace TUGraz.VectoCore.Models.Declaration
+{
+	public class GenericBusDriverData
+	{
+		public DriverData CreateGenericBusDriverData(Segment completedSegment)
+		{
+			var lookAheadData = new DriverData.LACData
+			{
+				Enabled = DeclarationData.Driver.LookAhead.Enabled,
+				//Deceleration = DeclarationData.Driver.LookAhead.Deceleration,
+				MinSpeed = DeclarationData.Driver.LookAhead.MinimumSpeed,
+				LookAheadDecisionFactor = new LACDecisionFactor(),
+				LookAheadDistanceFactor = DeclarationData.Driver.LookAhead.LookAheadDistanceFactor
+			};
+
+			var overspeedData = new DriverData.OverSpeedData
+			{
+				Enabled = true,
+				MinSpeed = DeclarationData.Driver.OverSpeed.MinSpeed,
+				OverSpeed = DeclarationData.Driver.OverSpeed.AllowedOverSpeed,
+			};
+
+			var driver = new DriverData
+			{
+				AccelerationCurve = AccelerationCurveReader.ReadFromStream(completedSegment.AccelerationFile),
+				LookAheadCoasting = lookAheadData,
+				OverSpeed = overspeedData,
+				EngineStopStart = new DriverData.EngineStopStartData
+				{
+					EngineOffStandStillActivationDelay = DeclarationData.Driver.EngineStopStart.ActivationDelay,
+					MaxEngineOffTimespan = DeclarationData.Driver.EngineStopStart.MaxEngineOffTimespan,
+					UtilityFactor = DeclarationData.Driver.EngineStopStart.UtilityFactor
+				},
+				EcoRoll = new DriverData.EcoRollData
+				{
+					UnderspeedThreshold = DeclarationData.Driver.EcoRoll.UnderspeedThreshold,
+					MinSpeed = DeclarationData.Driver.EcoRoll.MinSpeed,
+					ActivationPhaseDuration = DeclarationData.Driver.EcoRoll.ActivationDelay,
+					AccelerationLowerLimit = DeclarationData.Driver.EcoRoll.AccelerationLowerLimit,
+					AccelerationUpperLimit = DeclarationData.Driver.EcoRoll.AccelerationUpperLimit
+				},
+				PCC = new DriverData.PCCData
+				{
+					PCCEnableSpeed = DeclarationData.Driver.PCC.PCCEnableSpeed,
+					MinSpeed = DeclarationData.Driver.PCC.MinSpeed,
+					PreviewDistanceUseCase1 = DeclarationData.Driver.PCC.PreviewDistanceUseCase1,
+					PreviewDistanceUseCase2 = DeclarationData.Driver.PCC.PreviewDistanceUseCase2,
+					UnderSpeed = DeclarationData.Driver.PCC.Underspeed,
+					OverspeedUseCase3 = DeclarationData.Driver.PCC.OverspeedUseCase3
+				}
+			};
+
+			return driver;
+		}
+	}
+}
diff --git a/VectoCore/VectoCore/Models/Declaration/GenericBusEngineData.cs b/VectoCore/VectoCore/Models/Declaration/GenericBusEngineData.cs
new file mode 100644
index 0000000000000000000000000000000000000000..0508826008ceb6249e11f5d2feeed40f377269e1
--- /dev/null
+++ b/VectoCore/VectoCore/Models/Declaration/GenericBusEngineData.cs
@@ -0,0 +1,183 @@
+using System;
+using System.Collections.Generic;
+using System.Data;
+using System.Linq;
+using System.Runtime.CompilerServices;
+using TUGraz.VectoCommon.InputData;
+using TUGraz.VectoCommon.Models;
+using TUGraz.VectoCommon.Utils;
+using TUGraz.VectoCore.InputData.Reader.ComponentData;
+using TUGraz.VectoCore.InputData.Reader.DataObjectAdapter;
+using TUGraz.VectoCore.Models.SimulationComponent.Data;
+using TUGraz.VectoCore.Models.SimulationComponent.Data.Engine;
+using TUGraz.VectoCore.Utils;
+
+namespace TUGraz.VectoCore.Models.Declaration
+{
+	public class GenericBusEngineData
+	{
+		#region Constans
+
+		private static string GenericEngineCM_Normed_CI =
+			$"{DeclarationData.DeclarationDataResourcePrefix}.GenericBusData.EngineConsumptionMap_CI_Normed.vmap";
+
+		private static string GenericEngineCM_Normed_PI =
+			$"{DeclarationData.DeclarationDataResourcePrefix}.GenericBusData.EngineConsumptionMap_PI_Normed.vmap";
+
+		#endregion
+
+		public CombustionEngineData CreateGenericBusEngineData(IVehicleDeclarationInputData pifVehicle)
+		{
+			var enginePif = pifVehicle.Components.EngineInputData;
+			var gearbox = pifVehicle.Components.GearboxInputData;
+
+			var engine = new CombustionEngineData();
+
+			var limits = pifVehicle.TorqueLimits.ToDictionary(e => e.Gear);
+			var numGears = gearbox.Gears.Count;
+			var fullLoadCurves = new Dictionary<uint, EngineFullLoadCurve>(numGears + 1);
+			fullLoadCurves[0] = FullLoadCurveReader.Create(enginePif.EngineModes.First().FullLoadCurve, true);
+			fullLoadCurves[0].EngineData = engine;
+
+			foreach (var gear in gearbox.Gears)
+			{
+				var maxTorque = VectoMath.Min(
+					DeclarationDataAdapterHeavyLorry.GbxMaxTorque(gear, numGears, fullLoadCurves[0].MaxTorque),
+					DeclarationDataAdapterHeavyLorry.VehMaxTorque(gear, numGears, limits, fullLoadCurves[0].MaxTorque));
+				fullLoadCurves[(uint)gear.Gear] = AbstractSimulationDataAdapter.IntersectFullLoadCurves(fullLoadCurves[0], maxTorque);
+			}
+
+			engine.FullLoadCurves = fullLoadCurves;
+			engine.IdleSpeed = enginePif.EngineModes[0].IdleSpeed;
+			engine.Displacement = enginePif.Displacement;
+
+			var fuel = GetCombustionEngineFuelData(pifVehicle, fullLoadCurves[0]);
+			
+			engine.WHRType = WHRType.None;
+
+			engine.Fuels = new List<CombustionEngineFuelData> { fuel };
+
+			engine.Inertia = DeclarationData.Engine.EngineInertia(engine.Displacement, gearbox.Type);
+			return engine;
+		}
+
+
+		private string GetEngineRessourceId(IVehicleDeclarationInputData vehiclePif)
+		{
+			var fuelType = vehiclePif.Components.EngineInputData.EngineModes.First().Fuels.First().FuelType;
+			var isDualFuel = vehiclePif.DualFuelVehicle;
+			
+			if (isDualFuel)
+				return GenericEngineCM_Normed_CI;
+
+			switch (fuelType)
+			{
+				case FuelType.DieselCI:
+				case FuelType.EthanolCI:
+				case FuelType.NGCI:
+					return GenericEngineCM_Normed_CI;
+				default:
+					return GenericEngineCM_Normed_PI;
+			}
+		}
+
+
+		private CombustionEngineFuelData GetCombustionEngineFuelData(IVehicleDeclarationInputData vehiclePif,
+			EngineFullLoadCurve fullLoadCurve)
+		{
+			var ressourceId = GetEngineRessourceId(vehiclePif);
+
+			var nIdle = vehiclePif.Components.EngineInputData.RatedSpeedDeclared.AsRPM;
+			var nRated = fullLoadCurve.RatedSpeed.Value();
+			var mRated = fullLoadCurve.MaxTorque.Value();
+			
+			var denormalizedData = DenormalizeData(ressourceId, nIdle, nRated, mRated);
+			
+			var engineSpeed = denormalizedData.AsEnumerable().Select(r => 
+				r.Field<string>(FuelConsumptionMapReader.Fields.EngineSpeed).ToDouble()).ToArray();
+
+			var clusterResult = new MeanShiftClustering().FindClusters(engineSpeed, 1);
+			
+			for (int i = 0; i < clusterResult.Length; i++) {
+				var currentTorque = fullLoadCurve.DragLoadStationaryTorque(clusterResult[i].RPMtoRad()).Value();
+				SetDragLoadFuelConsumption(denormalizedData, clusterResult[i], currentTorque);
+			}
+			
+			var fcMap = FuelConsumptionMapReader.Create(denormalizedData);
+
+			var fuel = new CombustionEngineFuelData
+			{
+				WHTCUrban = 1,
+				WHTCRural = 1,
+				WHTCMotorway = 1,
+				ColdHotCorrectionFactor = 1,
+				CorrectionFactorRegPer = 1,
+				ConsumptionMap = fcMap
+			};
+
+			return fuel;
+		}
+
+		private void SetDragLoadFuelConsumption(DataTable currentDataTable, double engineSpeed, double torque)
+		{
+			for (int i = 0; i < currentDataTable.Rows.Count; i++) {
+				var currentRowSpeed = currentDataTable.Rows[i]
+					[FuelConsumptionMapReader.Fields.EngineSpeed].ToString().ToDouble();
+
+				if (currentRowSpeed.IsEqual(engineSpeed)) {
+					var newRow = currentDataTable.NewRow();
+					newRow[FuelConsumptionMapReader.Fields.EngineSpeed] = engineSpeed;
+					newRow[FuelConsumptionMapReader.Fields.Torque] = torque;
+					newRow[FuelConsumptionMapReader.Fields.FuelConsumption] = 0;
+					currentDataTable.Rows.InsertAt(newRow, i);
+					break;
+				}
+			}
+		}
+		
+		private DataTable DenormalizeData(string ressourceId, double nIdle, double nRated, double mRated)
+		{
+			var normedData = VectoCSVFile.ReadStream(RessourceHelper.ReadStream(ressourceId), source: ressourceId);
+
+			var result = new DataTable();
+			result.Columns.Add(FuelConsumptionMapReader.Fields.EngineSpeed);
+			result.Columns.Add(FuelConsumptionMapReader.Fields.Torque);
+			result.Columns.Add(FuelConsumptionMapReader.Fields.FuelConsumption);
+
+			foreach (DataRow row in normedData.Rows)
+			{
+				var engineSpeed = DenormalizeEngineSpeed((string)row[FuelConsumptionMapReader.Fields.EngineSpeed],
+					nIdle, nRated);
+				var torque = DenormalizeTorque((string)row[FuelConsumptionMapReader.Fields.Torque], mRated);
+				var fc = DenormalizeFC((string)row[FuelConsumptionMapReader.Fields.FuelConsumption], mRated);
+
+				var newRow = result.NewRow();
+				newRow[FuelConsumptionMapReader.Fields.EngineSpeed] = engineSpeed;
+				newRow[FuelConsumptionMapReader.Fields.Torque] = torque;
+				newRow[FuelConsumptionMapReader.Fields.FuelConsumption] = fc;
+				result.Rows.Add(newRow);
+			}
+
+			return result;
+		}
+
+		[MethodImpl(MethodImplOptions.AggressiveInlining)]
+		private double DenormalizeFC(string fc, double mRated)
+		{
+			return fc.ToDouble() * mRated;
+		}
+
+		[MethodImpl(MethodImplOptions.AggressiveInlining)]
+		private double DenormalizeTorque(string torque, double mRated)
+		{
+			return torque.ToDouble() * mRated;
+		}
+
+		[MethodImpl(MethodImplOptions.AggressiveInlining)]
+		private double DenormalizeEngineSpeed(string engineSpeed, double nIdle, double nRated)
+		{
+			return engineSpeed.ToDouble() * (nRated - nIdle) + nIdle;
+		}
+
+	}
+}
diff --git a/VectoCore/VectoCore/Models/Declaration/GenericBusRetarderData.cs b/VectoCore/VectoCore/Models/Declaration/GenericBusRetarderData.cs
new file mode 100644
index 0000000000000000000000000000000000000000..865975904fa460ae945c5b707c29e313fa8123f5
--- /dev/null
+++ b/VectoCore/VectoCore/Models/Declaration/GenericBusRetarderData.cs
@@ -0,0 +1,78 @@
+using System;
+using System.Data;
+using TUGraz.VectoCommon.InputData;
+using TUGraz.VectoCore.Configuration;
+using TUGraz.VectoCore.InputData.Reader.ComponentData;
+using TUGraz.VectoCore.Models.SimulationComponent.Data;
+
+namespace TUGraz.VectoCore.Models.Declaration
+{
+	public class GenericBusRetarderData
+	{
+		public RetarderData CreateGenericBusRetarderData(IRetarderInputData retarderInput)
+		{
+			if (retarderInput == null)
+				return null;
+
+			var retarder = new RetarderData
+			{
+				Ratio = retarderInput.Ratio,
+				Type = retarderInput.Type,
+				LossMap = GenerateGenericLossMap(retarderInput.Ratio)
+			};
+
+			return retarder;
+		}
+
+		private RetarderLossMap GenerateGenericLossMap(double stepUpRatio)
+		{
+			var retarderSpeeds = new double[] {
+					0, 200 , 400, 600, 900, 1200,
+					1600, 2000, 2500, 3000, 3500, 4000,
+					4500, 5000
+				};
+
+			var genericRetarderLosses = GetHydrodynamicRetardersLoss(retarderSpeeds, stepUpRatio);
+			//var genericRetarderLosses = GetMagneticRetarderLoss(retarderSpeeds, stepUpRatio);
+
+			var torqueLoss = new DataTable();
+			torqueLoss.Columns.Add(RetarderLossMapReader.Fields.RetarderSpeed);
+			torqueLoss.Columns.Add(RetarderLossMapReader.Fields.TorqueLoss);
+
+			for (int i = 0; i < genericRetarderLosses.Length; i++)
+			{
+				var newRow = torqueLoss.NewRow();
+				newRow[RetarderLossMapReader.Fields.RetarderSpeed] = retarderSpeeds[i];
+				newRow[RetarderLossMapReader.Fields.TorqueLoss] = genericRetarderLosses[i] *
+					Constants.GenericLossMapSettings.RetarderGenericFactor;
+				torqueLoss.Rows.Add(newRow);
+			}
+
+			return RetarderLossMapReader.Create(torqueLoss);
+		}
+
+		private double[] GetHydrodynamicRetardersLoss(double[] retarderSpeeds, double stepUpRatio)
+		{
+			var losses = new double[retarderSpeeds.Length];
+
+			for (int i = 0; i < retarderSpeeds.Length; i++)
+			{
+				losses[i] = 10.0 / stepUpRatio + 2.0 / Math.Pow(stepUpRatio, 3) * Math.Pow(retarderSpeeds[i] / 1000.0, 2);
+			}
+
+			return losses;
+		}
+
+		private double[] GetMagneticRetarderLoss(double[] retarderSpeeds, double stepUpRatio)
+		{
+			var losses = new double[retarderSpeeds.Length];
+
+			for (int i = 0; i < retarderSpeeds.Length; i++)
+			{
+				losses[i] = 15.0 / stepUpRatio + 2.0 / Math.Pow(stepUpRatio, 4) * Math.Pow(retarderSpeeds[i] / 1000.0, 3);
+			}
+
+			return losses;
+		}
+	}
+}
diff --git a/VectoCore/VectoCore/VectoCore.csproj b/VectoCore/VectoCore/VectoCore.csproj
index 122ebd80b08065037bd66b794c8f70a685621b61..2f8f9f4b9514a7af3b2d06a5e50166fff05b772d 100644
--- a/VectoCore/VectoCore/VectoCore.csproj
+++ b/VectoCore/VectoCore/VectoCore.csproj
@@ -320,6 +320,11 @@
     <Compile Include="Models\BusAuxiliaries\DownstreamModules\Impl\HVAC\SSMRun.cs" />
     <Compile Include="Models\BusAuxiliaries\DownstreamModules\Impl\HVAC\SSMTOOL.cs" />
     <Compile Include="Models\Declaration\CompletedBusSegments.cs" />
+    <Compile Include="Models\Declaration\GenericBusAngledriveData.cs" />
+    <Compile Include="Models\Declaration\GenericBusAxelgearData.cs" />
+    <Compile Include="Models\Declaration\GenericBusDriverData.cs" />
+    <Compile Include="Models\Declaration\GenericBusEngineData.cs" />
+    <Compile Include="Models\Declaration\GenericBusRetarderData.cs" />
     <Compile Include="Models\Declaration\SSMTechnology.cs" />
     <Compile Include="Models\BusAuxiliaries\DownstreamModules\Impl\M06Impl.cs" />
     <Compile Include="Models\BusAuxiliaries\DownstreamModules\Impl\M07Impl.cs" />
diff --git a/VectoCore/VectoCoreTest/Integration/CompletedBus/CompletedBusFactorMethodTest.cs b/VectoCore/VectoCoreTest/Integration/CompletedBus/CompletedBusFactorMethodTest.cs
index 35ff24b1de430bd7bc82ad3ec76e172797cc2202..48465ec2c7e41eb485c0869430ce81d0a0975d2a 100644
--- a/VectoCore/VectoCoreTest/Integration/CompletedBus/CompletedBusFactorMethodTest.cs
+++ b/VectoCore/VectoCoreTest/Integration/CompletedBus/CompletedBusFactorMethodTest.cs
@@ -275,7 +275,7 @@ namespace TUGraz.VectoCore.Tests.Integration.CompletedBus
 			var genericEngine = relatedRun.VectoRunDataGenericBody.EngineData;
 			var specificEngine = relatedRun.VectoRunDataSpezificBody.EngineData;
 
-			Assert.AreEqual(1, genericEngine.FullLoadCurves.Count);
+			Assert.AreEqual(7, genericEngine.FullLoadCurves.Count);
 			AssertFullLoadAndDragCurve(genericEngine.FullLoadCurves[0].FullLoadEntries);
 			AssertFullLoadAndDragCurve(specificEngine.FullLoadCurves[0].FullLoadEntries);
 
@@ -806,8 +806,13 @@ namespace TUGraz.VectoCore.Tests.Integration.CompletedBus
 			var genericRetarder = relatedRun.VectoRunDataGenericBody.Retarder;
 			var specificRetarder = relatedRun.VectoRunDataSpezificBody.Retarder;
 
-			Assert.IsNull(genericRetarder);
-			Assert.IsNull(specificRetarder);
+			Assert.AreEqual(1, genericRetarder.Ratio);
+			Assert.AreEqual( genericRetarder.Ratio, specificRetarder.Ratio);
+
+			Assert.AreEqual(RetarderType.TransmissionOutputRetarder, genericRetarder.Type);
+			Assert.AreEqual(genericRetarder.Type, specificRetarder.Type);
+
+			Assert.AreEqual(genericRetarder.LossMap, specificRetarder.LossMap);
 		}
 
 		#endregion
@@ -835,17 +840,42 @@ namespace TUGraz.VectoCore.Tests.Integration.CompletedBus
 			Assert.AreEqual(DeclarationData.Driver.OverSpeed.AllowedOverSpeed, genericDriver.OverSpeed.OverSpeed);
 			Assert.AreEqual(genericDriver.OverSpeed, specificDriver.OverSpeed);
 
-			Assert.IsNull(genericDriver.EngineStopStart);
-			Assert.IsNull(genericDriver.EcoRoll);
-			Assert.IsNull(genericDriver.PCC);
+			AssertStopStartData(genericDriver.EngineStopStart);
+			AssertEcoRoll(genericDriver.EcoRoll);
+			AssertPccData(genericDriver.PCC);
 
-			Assert.IsNull(specificDriver.EngineStopStart);
-			Assert.IsNull(specificDriver.EcoRoll);
-			Assert.IsNull(specificDriver.PCC);
+			AssertStopStartData(specificDriver.EngineStopStart);
+			AssertEcoRoll(specificDriver.EcoRoll);
+			AssertPccData(specificDriver.PCC);
+		}
+
+		private void AssertStopStartData(DriverData.EngineStopStartData engineStopStart)
+		{
+			Assert.AreEqual(DeclarationData.Driver.EngineStopStart.ActivationDelay, engineStopStart.EngineOffStandStillActivationDelay);
+			Assert.AreEqual(DeclarationData.Driver.EngineStopStart.MaxEngineOffTimespan, engineStopStart.MaxEngineOffTimespan);
+			Assert.AreEqual(DeclarationData.Driver.EngineStopStart.UtilityFactor, engineStopStart.UtilityFactor);
 		}
-		
-		#endregion
 
+		private void AssertEcoRoll(DriverData.EcoRollData ecoRoll)
+		{
+			Assert.AreEqual(DeclarationData.Driver.EcoRoll.UnderspeedThreshold, ecoRoll.UnderspeedThreshold);
+			Assert.AreEqual(DeclarationData.Driver.EcoRoll.MinSpeed, ecoRoll.MinSpeed);
+			Assert.AreEqual(DeclarationData.Driver.EcoRoll.ActivationDelay, ecoRoll.ActivationPhaseDuration);
+			Assert.AreEqual(DeclarationData.Driver.EcoRoll.AccelerationLowerLimit, ecoRoll.AccelerationLowerLimit);
+			Assert.AreEqual(DeclarationData.Driver.EcoRoll.AccelerationUpperLimit, ecoRoll.AccelerationUpperLimit);
+		}
+
+		private void AssertPccData(DriverData.PCCData pccData)
+		{
+			Assert.AreEqual(DeclarationData.Driver.PCC.PCCEnableSpeed, pccData.PCCEnableSpeed);
+			Assert.AreEqual(DeclarationData.Driver.PCC.MinSpeed, pccData.MinSpeed);
+			Assert.AreEqual(DeclarationData.Driver.PCC.PreviewDistanceUseCase1, pccData.PreviewDistanceUseCase1);
+			Assert.AreEqual(DeclarationData.Driver.PCC.PreviewDistanceUseCase2, pccData.PreviewDistanceUseCase2);
+			Assert.AreEqual(DeclarationData.Driver.PCC.Underspeed, pccData.UnderSpeed);
+			Assert.AreEqual(DeclarationData.Driver.PCC.OverspeedUseCase3, pccData.OverspeedUseCase3);
+		}
+
+		#endregion
 
 		private CrosswindCorrectionCdxALookup GetCrosswindCorrection(string crossWindCorrectionParams,
 			SquareMeter aerodynamicDragArea, Meter vehicleHeight)
diff --git a/VectoCore/VectoCoreTest/XML/XMLPrimaryVehicleReportBusReaderTest.cs b/VectoCore/VectoCoreTest/XML/XMLPrimaryVehicleReportBusReaderTest.cs
index da65eb60efbe92d2d1c0abf52bf62ac734d601d9..9ad11695f9dd1db55e8d84abf84e023b7214ed0d 100644
--- a/VectoCore/VectoCoreTest/XML/XMLPrimaryVehicleReportBusReaderTest.cs
+++ b/VectoCore/VectoCoreTest/XML/XMLPrimaryVehicleReportBusReaderTest.cs
@@ -61,9 +61,9 @@ namespace TUGraz.VectoCore.Tests.XML
 			Assert.AreEqual(false, vehicle.Articulated);
 			Assert.AreEqual(25000, vehicle.GrossVehicleMassRating.Value());
 			Assert.AreEqual(600, vehicle.EngineIdleSpeed.Value());
-			Assert.AreEqual("Transmission Output Retarder", ((XMLDeclarationPrimaryVehicleBusDataProviderV01)vehicle).RetarderType.ToXMLFormat());
-			Assert.AreEqual(1.000, ((XMLDeclarationPrimaryVehicleBusDataProviderV01)vehicle).RetarderRatio);
-			Assert.AreEqual("None", ((XMLDeclarationPrimaryVehicleBusDataProviderV01)vehicle).AngledriveType.ToXMLFormat());
+			Assert.AreEqual("Transmission Output Retarder", vehicle.Components.RetarderInputData.Type.ToXMLFormat());
+			Assert.AreEqual(1.000, vehicle.Components.RetarderInputData.Ratio);
+			Assert.AreEqual("None", vehicle.Components.AngledriveInputData.Type.ToXMLFormat());
 			Assert.IsFalse(vehicle.ZeroEmissionVehicle);
 
 			Assert.IsFalse(vehicle.ADAS.EngineStopStart);
@@ -89,7 +89,7 @@ namespace TUGraz.VectoCore.Tests.XML
 
 			TestAngledrive(components.AngledriveInputData);
 
-			Assert.IsNull(components.RetarderInputData);
+			TestRetarderInputData(components.RetarderInputData);
 
 			TestAxlegear(components.AxleGearInputData);
 
@@ -199,6 +199,14 @@ namespace TUGraz.VectoCore.Tests.XML
 			Assert.That(() => angeldrive.Efficiency, Throws.TypeOf<VectoException>());
 		}
 
+		private void TestRetarderInputData(IRetarderInputData retarder)
+		{
+			Assert.IsNotNull(retarder);
+			Assert.IsNull(retarder.LossMap);
+			Assert.AreEqual("Transmission Output Retarder", retarder.Type.ToXMLFormat());
+			Assert.AreEqual(1.000, retarder.Ratio);
+		}
+		
 		private void TestAxlegear(IAxleGearInputData axelGear)
 		{
 			Assert.AreEqual("Generic Gearbox Manufacturer", axelGear.Manufacturer);