diff --git a/VECTO/GUI/GearboxForm.vb b/VECTO/GUI/GearboxForm.vb
index ce627dd40915b78c8d2e58edd4715bf7225c11da..e7444abdc5ac65f7600b80ec8b50e088306854f6 100644
--- a/VECTO/GUI/GearboxForm.vb
+++ b/VECTO/GUI/GearboxForm.vb
@@ -129,7 +129,7 @@ Public Class GearboxForm
 	Private Sub ToolStripBtOpen_Click(sender As Object, e As EventArgs) Handles ToolStripBtOpen.Click
 		If GearboxFileBrowser.OpenDialog(_gbxFile) Then
 			Try
-				OpenGbx(GearboxFileBrowser.Files(0))
+				OpenGbx(GearboxFileBrowser.Files(0), VehicleCategory.RigidTruck)
 			Catch ex As Exception
 				MsgBox("Failed to open Gearbox File: " + ex.Message)
 			End Try
@@ -231,7 +231,7 @@ Public Class GearboxForm
 	End Sub
 
 	'Open file
-	Public Sub OpenGbx(file As String)
+	Public Sub OpenGbx(file As String, vehicleCategory As VehicleCategory)
 
 		If ChangeCheckCancel() Then Exit Sub
 
@@ -240,6 +240,8 @@ Public Class GearboxForm
 		Dim gearbox As IGearboxEngineeringInputData = inputData.GearboxInputData
 		Dim axlegear As IAxleGearInputData = inputData.AxleGearInputData
 
+		_vehicleCategory = vehicleCategory
+
 		If Cfg.DeclMode <> gearbox.SavedInDeclarationMode Then
 			Select Case WrongMode()
 				Case 1
@@ -521,7 +523,8 @@ Public Class GearboxForm
 			If LvGears.Items.Count > 2 Then
 				Dim ratio1 As Double = LvGears.Items.Item(1).SubItems(GearboxTbl.Ratio).Text.ToDouble(0)
 				Dim ratio2 As Double = LvGears.Items.Item(2).SubItems(GearboxTbl.Ratio).Text.ToDouble(0)
-				If ratio1 / ratio2 >= DeclarationData.Gearbox.TorqueConverterSecondGearThreshold Then
+
+				If ratio1 / ratio2 >= DeclarationData.Gearbox.TorqueConverterSecondGearThreshold(_vehicleCategory) Then
 					text = "Torque converter is used in 1st and 2nd gear"
 				Else
 					text = "Torque converter is used in 1st gear only"
@@ -693,6 +696,7 @@ Public Class GearboxForm
 #Region "Open File Context Menu"
 
 	Private _contextMenuFiles As String()
+	Private _vehicleCategory As VehicleCategory
 
 	Private Sub OpenFiles(ParamArray files() As String)
 
diff --git a/VECTO/GUI/MainForm.vb b/VECTO/GUI/MainForm.vb
index 9b9b7d3b381dddfe6db2d36fb579d4b1bfd4cf76..68cdc222cacd816d3e24aeff9121a668878edd61 100644
--- a/VECTO/GUI/MainForm.vb
+++ b/VECTO/GUI/MainForm.vb
@@ -341,7 +341,7 @@ Imports TUGraz.VectoCore.OutputData.FileIO
 						GearboxForm.BringToFront()
 					End If
 					Try
-						GearboxForm.OpenGbx(file)
+						GearboxForm.OpenGbx(file, VehicleCategory.RigidTruck)
 					Catch ex As Exception
 						MsgBox("Failed to open Gearbox File: " + ex.Message)
 					End Try
diff --git a/VECTO/GUI/VectoJobForm.vb b/VECTO/GUI/VectoJobForm.vb
index ba1a4fc34c90668aba3c5713d010bb9b89658b17..18bd338ee58e8a67da2967b6ff8302c114d6b7bf 100644
--- a/VECTO/GUI/VectoJobForm.vb
+++ b/VECTO/GUI/VectoJobForm.vb
@@ -296,8 +296,20 @@ Public Class VectoJobForm
 			If GearboxForm.WindowState = FormWindowState.Minimized Then GearboxForm.WindowState = FormWindowState.Normal
 			GearboxForm.BringToFront()
 		End If
+		Dim vehicleType As VehicleCategory
 		Try
-			If Not Trim(f) = "" Then GearboxForm.OpenGbx(f)
+			If Not Trim(f) = "" Then
+				Dim vehInput As IVehicleDeclarationInputData =
+						CType(JSONInputDataFactory.ReadComponentData(FileRepl(TbVEH.Text, GetPath(VectoFile))), 
+							IEngineeringInputDataProvider).VehicleInputData
+				vehicleType = vehInput.VehicleCategory
+			End If
+
+		Catch ex As Exception
+			vehicleType = VehicleCategory.RigidTruck
+		End Try
+		Try
+			If Not Trim(f) = "" Then GearboxForm.OpenGbx(f, vehicleType)
 		Catch ex As Exception
 			MsgBox("Failed to open Gearbox File: " + ex.Message)
 		End Try
@@ -680,7 +692,8 @@ Public Class VectoJobForm
 
 		CbEngOnly.Checked = False
 
-		RdOff.Checked = True
+		'RdOff.Checked = True
+		RdOverspeed.Checked = True
 		CbLookAhead.Checked = True
 		'TbAlookahead.Text = "-0.5"
 		TbOverspeed.Text = DeclarationData.Driver.OverSpeedEcoRoll.OverSpeed.AsKmph.ToGUIFormat()
diff --git a/VECTO/Input Files/Gearbox.vb b/VECTO/Input Files/Gearbox.vb
index 4849eba590ffb2b27050f5aafbbf51b1a7165500..27d7c2eb797056d195173d955533e0415f81433a 100644
--- a/VECTO/Input Files/Gearbox.vb	
+++ b/VECTO/Input Files/Gearbox.vb	
@@ -22,6 +22,7 @@ Imports TUGraz.VectoCore.InputData.FileIO.JSON
 Imports TUGraz.VectoCore.InputData.Impl
 Imports TUGraz.VectoCore.InputData.Reader
 Imports TUGraz.VectoCore.InputData.Reader.DataObjectAdapter
+Imports TUGraz.VectoCore.Models.Declaration
 Imports TUGraz.VectoCore.Models.SimulationComponent.Data
 Imports TUGraz.VectoCore.Models.SimulationComponent.Data.Engine
 Imports TUGraz.VectoCore.Utils
@@ -204,7 +205,13 @@ Public Class Gearbox
 							IEngineeringInputDataProvider)
 			'Dim vehicle As IVehicleEngineeringInputData = inputData.VehicleInputData
 			Dim engine As CombustionEngineData
+			Dim vehiclecategory As VehicleCategory
 			Dim rdyn As Meter = 0.5.SI(Of Meter)()
+			Try
+				vehiclecategory = inputData.VehicleInputData.VehicleCategory
+			Catch ex As Exception
+				vehiclecategory = vehiclecategory.RigidTruck
+			End Try
 			If mode = ExecutionMode.Declaration Then
 				Dim doa As DeclarationDataAdapter = New DeclarationDataAdapter()
 
@@ -214,9 +221,9 @@ Public Class Gearbox
 				Catch
 					engine = GetDefaultEngine(gearbox.Gears)
 				End Try
-
+				
 				axlegearData = doa.CreateAxleGearData(gearbox, False)
-				gearboxData = doa.CreateGearboxData(gearbox, engine, axlegearData.AxleGear.Ratio, rdyn, False)
+				gearboxData = doa.CreateGearboxData(gearbox, engine, axlegearData.AxleGear.Ratio, rdyn, vehiclecategory, False)
 			Else
 				Dim doa As EngineeringDataAdapter = New EngineeringDataAdapter()
 				Try
@@ -226,7 +233,7 @@ Public Class Gearbox
 				End Try
 
 				axlegearData = doa.CreateAxleGearData(gearbox, True)
-				gearboxData = doa.CreateGearboxData(gearbox, engine, axlegearData.AxleGear.Ratio, rdyn, True)
+				gearboxData = doa.CreateGearboxData(gearbox, engine, axlegearData.AxleGear.Ratio, rdyn, vehiclecategory, True)
 			End If
 
 			Dim result As IList(Of ValidationResult) =
diff --git a/VectoCommon/VectoCommon/InputData/IInputDataProvider.cs b/VectoCommon/VectoCommon/InputData/IInputDataProvider.cs
index 16cd627535b02621b2ef2a626409cdbcf3b095fa..836135d05d95e69cacff2f26dde7ec2169d3743a 100644
--- a/VectoCommon/VectoCommon/InputData/IInputDataProvider.cs
+++ b/VectoCommon/VectoCommon/InputData/IInputDataProvider.cs
@@ -29,65 +29,65 @@
 *   Martin Rexeis, rexeis@ivt.tugraz.at, IVT, Graz University of Technology
 */
 
-using System.Xml.Linq;
-
-namespace TUGraz.VectoCommon.InputData
-{
-	public interface IInputDataProvider {}
-
-	public interface IDeclarationInputDataProvider : IInputDataProvider
-	{
-		IDeclarationJobInputData JobInputData();
-
-		IVehicleDeclarationInputData VehicleInputData { get; }
-
-		IAirdragDeclarationInputData AirdragInputData { get; }
-
-		IGearboxDeclarationInputData GearboxInputData { get; }
-
-		ITorqueConverterDeclarationInputData TorqueConverterInputData { get; }
-
-		IAxleGearInputData AxleGearInputData { get; }
-
-		IAngledriveInputData AngledriveInputData { get; }
-
-		IEngineDeclarationInputData EngineInputData { get; }
-
-		IAuxiliariesDeclarationInputData AuxiliaryInputData();
-
-		IRetarderInputData RetarderInputData { get; }
-
-		IDriverDeclarationInputData DriverInputData { get; }
-
-		IPTOTransmissionInputData PTOTransmissionInputData { get; }
-
-		XElement XMLHash { get; }
-	}
-
-	public interface IEngineeringInputDataProvider : IInputDataProvider
-	{
-		IEngineeringJobInputData JobInputData();
-
-		IVehicleEngineeringInputData VehicleInputData { get; }
-
-		IAirdragEngineeringInputData AirdragInputData { get; }
-
-		IGearboxEngineeringInputData GearboxInputData { get; }
-
-		ITorqueConverterEngineeringInputData TorqueConverterInputData { get; }
-
-		IAxleGearInputData AxleGearInputData { get; }
-
-		IAngledriveInputData AngledriveInputData { get; }
-
-		IEngineEngineeringInputData EngineInputData { get; }
-
-		IAuxiliariesEngineeringInputData AuxiliaryInputData();
-
-		IRetarderInputData RetarderInputData { get; }
-
-		IDriverEngineeringInputData DriverInputData { get; }
-
-		IPTOTransmissionInputData PTOTransmissionInputData { get; }
-	}
+using System.Xml.Linq;
+
+namespace TUGraz.VectoCommon.InputData
+{
+	public interface IInputDataProvider {}
+
+	public interface IDeclarationInputDataProvider : IInputDataProvider
+	{
+		IDeclarationJobInputData JobInputData();
+
+		IVehicleDeclarationInputData VehicleInputData { get; }
+
+		IAirdragDeclarationInputData AirdragInputData { get; }
+
+		IGearboxDeclarationInputData GearboxInputData { get; }
+
+		ITorqueConverterDeclarationInputData TorqueConverterInputData { get; }
+
+		IAxleGearInputData AxleGearInputData { get; }
+
+		IAngledriveInputData AngledriveInputData { get; }
+
+		IEngineDeclarationInputData EngineInputData { get; }
+
+		IAuxiliariesDeclarationInputData AuxiliaryInputData();
+
+		IRetarderInputData RetarderInputData { get; }
+
+		IDriverDeclarationInputData DriverInputData { get; }
+
+		IPTOTransmissionInputData PTOTransmissionInputData { get; }
+
+		XElement XMLHash { get; }
+	}
+
+	public interface IEngineeringInputDataProvider : IInputDataProvider
+	{
+		IEngineeringJobInputData JobInputData();
+
+		IVehicleEngineeringInputData VehicleInputData { get; }
+
+		IAirdragEngineeringInputData AirdragInputData { get; }
+
+		IGearboxEngineeringInputData GearboxInputData { get; }
+
+		ITorqueConverterEngineeringInputData TorqueConverterInputData { get; }
+
+		IAxleGearInputData AxleGearInputData { get; }
+
+		IAngledriveInputData AngledriveInputData { get; }
+
+		IEngineEngineeringInputData EngineInputData { get; }
+
+		IAuxiliariesEngineeringInputData AuxiliaryInputData();
+
+		IRetarderInputData RetarderInputData { get; }
+
+		IDriverEngineeringInputData DriverInputData { get; }
+
+		IPTOTransmissionInputData PTOTransmissionInputData { get; }
+	}
 }
\ No newline at end of file
diff --git a/VectoCommon/VectoCommon/Models/VehicleCategory.cs b/VectoCommon/VectoCommon/Models/VehicleCategory.cs
index af6baf04d0637013b03aae01d733db3a9bf0817f..8c59130ffc0d0278926eca1996c539f866c14062 100644
--- a/VectoCommon/VectoCommon/Models/VehicleCategory.cs
+++ b/VectoCommon/VectoCommon/Models/VehicleCategory.cs
@@ -29,72 +29,87 @@
 *   Martin Rexeis, rexeis@ivt.tugraz.at, IVT, Graz University of Technology
 */
 
-using System;
-
-namespace TUGraz.VectoCommon.Models
-{
-	public enum VehicleCategory
-	{
-		RigidTruck,
-		Tractor,
-		CityBus,
-		InterurbanBus,
-		Coach
-	}
-
-	public static class VehicleCategoryHelper
-	{
-		public static string GetLabel(this VehicleCategory category)
-		{
-			switch (category)
-			{
-				case VehicleCategory.RigidTruck:
-					return "Rigid Truck";
-				case VehicleCategory.Tractor:
-					return "Tractor";
-				case VehicleCategory.CityBus:
-					return "City Bus";
-				case VehicleCategory.InterurbanBus:
-					return "Interurban Bus";
-				case VehicleCategory.Coach:
-					return "Coach";
-				default:
-					return category.ToString();
-			}
-		}
-		public static string GetCategoryName(this VehicleCategory category)
-		{
-			switch (category) {
-				case VehicleCategory.RigidTruck:
-					return "Rigid Truck";
-				case VehicleCategory.Tractor:
-					return "Semitrailer Truck";
-				case VehicleCategory.CityBus:
-					return "Citybus";
-				case VehicleCategory.InterurbanBus:
-					return "Interurban Bus";
-				case VehicleCategory.Coach:
-					return "Coach";
-				default:
-					return category.ToString();
-			}
-		}
-
-		public static string ToXMLFormat(this VehicleCategory vehicleCategory)
-		{
-			switch (vehicleCategory) {
-				case VehicleCategory.Coach:
-				case VehicleCategory.Tractor:
-					return vehicleCategory.ToString();
-				case VehicleCategory.CityBus:
-					return "City Bus";
-				case VehicleCategory.InterurbanBus:
-					return "Interurban Bus";
-				case VehicleCategory.RigidTruck:
-					return "Rigid Truck";
-				default:
-					throw new ArgumentOutOfRangeException("vehicleCategory", vehicleCategory, null);
-			}
-		}
-	}
+using System;
+
+namespace TUGraz.VectoCommon.Models
+{
+	public enum VehicleCategory
+	{
+		RigidTruck,
+		Tractor,
+		CityBus,
+		InterurbanBus,
+		Coach
+	}
+
+	public static class VehicleCategoryHelper
+	{
+		public static string GetLabel(this VehicleCategory category)
+		{
+			switch (category) {
+				case VehicleCategory.RigidTruck:
+					return "Rigid Truck";
+				case VehicleCategory.Tractor:
+					return "Tractor";
+				case VehicleCategory.CityBus:
+					return "City Bus";
+				case VehicleCategory.InterurbanBus:
+					return "Interurban Bus";
+				case VehicleCategory.Coach:
+					return "Coach";
+				default:
+					return category.ToString();
+			}
+		}
+
+		public static string GetCategoryName(this VehicleCategory category)
+		{
+			switch (category) {
+				case VehicleCategory.RigidTruck:
+					return "Rigid Truck";
+				case VehicleCategory.Tractor:
+					return "Semitrailer Truck";
+				case VehicleCategory.CityBus:
+					return "Citybus";
+				case VehicleCategory.InterurbanBus:
+					return "Interurban Bus";
+				case VehicleCategory.Coach:
+					return "Coach";
+				default:
+					return category.ToString();
+			}
+		}
+
+		public static string ToXMLFormat(this VehicleCategory vehicleCategory)
+		{
+			switch (vehicleCategory) {
+				case VehicleCategory.Coach:
+				case VehicleCategory.Tractor:
+					return vehicleCategory.ToString();
+				case VehicleCategory.CityBus:
+					return "City Bus";
+				case VehicleCategory.InterurbanBus:
+					return "Interurban Bus";
+				case VehicleCategory.RigidTruck:
+					return "Rigid Truck";
+				default:
+					throw new ArgumentOutOfRangeException("vehicleCategory", vehicleCategory, null);
+			}
+		}
+
+		public static bool IsTruck(this VehicleCategory category)
+		{
+			switch (category) {
+				case VehicleCategory.RigidTruck:
+				case VehicleCategory.Tractor:
+					return true;
+				case VehicleCategory.CityBus:
+				case VehicleCategory.InterurbanBus:
+				case VehicleCategory.Coach:
+					return false;
+				default:
+					throw new ArgumentOutOfRangeException("VehicleCategory", category, null);
+			}
+		}
+	}
 }
\ No newline at end of file
diff --git a/VectoCore/VectoCore/InputData/FileIO/JSON/JSONComponentInputData.cs b/VectoCore/VectoCore/InputData/FileIO/JSON/JSONComponentInputData.cs
index c31323bed471769f058132d46d28ceb7114923e3..53f64fc8c4ea957001a627be8194ec63a575b602 100644
--- a/VectoCore/VectoCore/InputData/FileIO/JSON/JSONComponentInputData.cs
+++ b/VectoCore/VectoCore/InputData/FileIO/JSON/JSONComponentInputData.cs
@@ -29,160 +29,160 @@
 *   Martin Rexeis, rexeis@ivt.tugraz.at, IVT, Graz University of Technology
 */
 
-using System;
-using System.IO;
-using System.Xml.Linq;
-using TUGraz.VectoCommon.InputData;
-using TUGraz.VectoCore.Configuration;
-using TUGraz.VectoCore.Utils;
-
-namespace TUGraz.VectoCore.InputData.FileIO.JSON
-{
-	public class JSONComponentInputData : IEngineeringInputDataProvider, IDeclarationInputDataProvider
-	{
-		protected IGearboxEngineeringInputData Gearbox;
-		protected IAxleGearInputData AxleGear;
-		protected ITorqueConverterEngineeringInputData TorqueConverter;
-		protected IAngledriveInputData Angledrive;
-		protected IEngineEngineeringInputData Engine;
-		protected IVehicleEngineeringInputData VehicleData;
-		protected IRetarderInputData Retarder;
-		protected IPTOTransmissionInputData PTOTransmission;
-		private IAirdragEngineeringInputData AirdragData;
-
-
-		public JSONComponentInputData(string filename, bool tolerateMissing = false)
-		{
-			var extension = Path.GetExtension(filename);
-			object tmp = null;
-			switch (extension) {
-				case Constants.FileExtensions.VehicleDataFile:
-					tmp = JSONInputDataFactory.ReadJsonVehicle(filename, tolerateMissing);
-					break;
-				case Constants.FileExtensions.EngineDataFile:
-					tmp = JSONInputDataFactory.ReadEngine(filename, tolerateMissing);
-					break;
-				case Constants.FileExtensions.GearboxDataFile:
-					tmp = JSONInputDataFactory.ReadGearbox(filename, tolerateMissing);
-					break;
-			}
-			tmp.Switch()
-				.If<IVehicleEngineeringInputData>(c => VehicleData = c)
-				.If<IAirdragEngineeringInputData>(c => AirdragData = c)
-				.If<IEngineEngineeringInputData>(c => Engine = c)
-				.If<IGearboxEngineeringInputData>(c => Gearbox = c)
-				.If<IAxleGearInputData>(c => AxleGear = c)
-				.If<IRetarderInputData>(c => Retarder = c)
-				.If<ITorqueConverterEngineeringInputData>(c => TorqueConverter = c)
-				.If<IAngledriveInputData>(c => Angledrive = c)
-				.If<IPTOTransmissionInputData>(c => PTOTransmission = c);
-		}
-
-
-		public IEngineeringJobInputData JobInputData()
-		{
-			throw new NotImplementedException();
-		}
-
-
-		IVehicleDeclarationInputData IDeclarationInputDataProvider.VehicleInputData
-		{
-			get { return VehicleData; }
-		}
-
-		IAirdragDeclarationInputData IDeclarationInputDataProvider.AirdragInputData
-		{
-			get { return AirdragInputData; }
-		}
-
-		public IAirdragEngineeringInputData AirdragInputData
-		{
-			get { return AirdragData; }
-		}
-
-		IGearboxDeclarationInputData IDeclarationInputDataProvider.GearboxInputData
-		{
-			get { return GearboxInputData; }
-		}
-
-		ITorqueConverterDeclarationInputData IDeclarationInputDataProvider.TorqueConverterInputData
-		{
-			get { return TorqueConverterInputData; }
-		}
-
-		IDeclarationJobInputData IDeclarationInputDataProvider.JobInputData()
-		{
-			throw new NotImplementedException();
-		}
-
-		public IVehicleEngineeringInputData VehicleInputData
-		{
-			get { return VehicleData; }
-		}
-
-		public IGearboxEngineeringInputData GearboxInputData
-		{
-			get { return Gearbox; }
-		}
-
-		public ITorqueConverterEngineeringInputData TorqueConverterInputData
-		{
-			get { return TorqueConverter; }
-		}
-
-		public IAxleGearInputData AxleGearInputData
-		{
-			get { return AxleGear; }
-		}
-
-		public IAngledriveInputData AngledriveInputData
-		{
-			get { return Angledrive; }
-		}
-
-		IEngineDeclarationInputData IDeclarationInputDataProvider.EngineInputData
-		{
-			get { return EngineInputData; }
-		}
-
-		public IEngineEngineeringInputData EngineInputData
-		{
-			get { return Engine; }
-		}
-
-		public IAuxiliariesEngineeringInputData AuxiliaryInputData()
-		{
-			throw new NotImplementedException();
-		}
-
-		IAuxiliariesDeclarationInputData IDeclarationInputDataProvider.AuxiliaryInputData()
-		{
-			throw new NotImplementedException();
-		}
-
-		public IRetarderInputData RetarderInputData
-		{
-			get { return Retarder; }
-		}
-
-		IDriverDeclarationInputData IDeclarationInputDataProvider.DriverInputData
-		{
-			get { throw new NotImplementedException(); }
-		}
-
-		public IDriverEngineeringInputData DriverInputData
-		{
-			get { throw new NotImplementedException(); }
-		}
-
-		public IPTOTransmissionInputData PTOTransmissionInputData
-		{
-			get { return PTOTransmission; }
-		}
-
-		public XElement XMLHash
-		{
-			get { return null; }
-		}
-	}
+using System;
+using System.IO;
+using System.Xml.Linq;
+using TUGraz.VectoCommon.InputData;
+using TUGraz.VectoCore.Configuration;
+using TUGraz.VectoCore.Utils;
+
+namespace TUGraz.VectoCore.InputData.FileIO.JSON
+{
+	public class JSONComponentInputData : IEngineeringInputDataProvider, IDeclarationInputDataProvider
+	{
+		protected IGearboxEngineeringInputData Gearbox;
+		protected IAxleGearInputData AxleGear;
+		protected ITorqueConverterEngineeringInputData TorqueConverter;
+		protected IAngledriveInputData Angledrive;
+		protected IEngineEngineeringInputData Engine;
+		protected IVehicleEngineeringInputData VehicleData;
+		protected IRetarderInputData Retarder;
+		protected IPTOTransmissionInputData PTOTransmission;
+		private IAirdragEngineeringInputData AirdragData;
+
+
+		public JSONComponentInputData(string filename, bool tolerateMissing = false)
+		{
+			var extension = Path.GetExtension(filename);
+			object tmp = null;
+			switch (extension) {
+				case Constants.FileExtensions.VehicleDataFile:
+					tmp = JSONInputDataFactory.ReadJsonVehicle(filename, tolerateMissing);
+					break;
+				case Constants.FileExtensions.EngineDataFile:
+					tmp = JSONInputDataFactory.ReadEngine(filename, tolerateMissing);
+					break;
+				case Constants.FileExtensions.GearboxDataFile:
+					tmp = JSONInputDataFactory.ReadGearbox(filename, tolerateMissing);
+					break;
+			}
+			tmp.Switch()
+				.If<IVehicleEngineeringInputData>(c => VehicleData = c)
+				.If<IAirdragEngineeringInputData>(c => AirdragData = c)
+				.If<IEngineEngineeringInputData>(c => Engine = c)
+				.If<IGearboxEngineeringInputData>(c => Gearbox = c)
+				.If<IAxleGearInputData>(c => AxleGear = c)
+				.If<IRetarderInputData>(c => Retarder = c)
+				.If<ITorqueConverterEngineeringInputData>(c => TorqueConverter = c)
+				.If<IAngledriveInputData>(c => Angledrive = c)
+				.If<IPTOTransmissionInputData>(c => PTOTransmission = c);
+		}
+
+
+		public IEngineeringJobInputData JobInputData()
+		{
+			throw new NotImplementedException();
+		}
+
+
+		IVehicleDeclarationInputData IDeclarationInputDataProvider.VehicleInputData
+		{
+			get { return VehicleData; }
+		}
+
+		IAirdragDeclarationInputData IDeclarationInputDataProvider.AirdragInputData
+		{
+			get { return AirdragInputData; }
+		}
+
+		public IAirdragEngineeringInputData AirdragInputData
+		{
+			get { return AirdragData; }
+		}
+
+		IGearboxDeclarationInputData IDeclarationInputDataProvider.GearboxInputData
+		{
+			get { return GearboxInputData; }
+		}
+
+		ITorqueConverterDeclarationInputData IDeclarationInputDataProvider.TorqueConverterInputData
+		{
+			get { return TorqueConverterInputData; }
+		}
+
+		IDeclarationJobInputData IDeclarationInputDataProvider.JobInputData()
+		{
+			throw new NotImplementedException();
+		}
+
+		public IVehicleEngineeringInputData VehicleInputData
+		{
+			get { return VehicleData; }
+		}
+
+		public IGearboxEngineeringInputData GearboxInputData
+		{
+			get { return Gearbox; }
+		}
+
+		public ITorqueConverterEngineeringInputData TorqueConverterInputData
+		{
+			get { return TorqueConverter; }
+		}
+
+		public IAxleGearInputData AxleGearInputData
+		{
+			get { return AxleGear; }
+		}
+
+		public IAngledriveInputData AngledriveInputData
+		{
+			get { return Angledrive; }
+		}
+
+		IEngineDeclarationInputData IDeclarationInputDataProvider.EngineInputData
+		{
+			get { return EngineInputData; }
+		}
+
+		public IEngineEngineeringInputData EngineInputData
+		{
+			get { return Engine; }
+		}
+
+		public IAuxiliariesEngineeringInputData AuxiliaryInputData()
+		{
+			throw new NotImplementedException();
+		}
+
+		IAuxiliariesDeclarationInputData IDeclarationInputDataProvider.AuxiliaryInputData()
+		{
+			throw new NotImplementedException();
+		}
+
+		public IRetarderInputData RetarderInputData
+		{
+			get { return Retarder; }
+		}
+
+		IDriverDeclarationInputData IDeclarationInputDataProvider.DriverInputData
+		{
+			get { throw new NotImplementedException(); }
+		}
+
+		public IDriverEngineeringInputData DriverInputData
+		{
+			get { throw new NotImplementedException(); }
+		}
+
+		public IPTOTransmissionInputData PTOTransmissionInputData
+		{
+			get { return PTOTransmission; }
+		}
+
+		public XElement XMLHash
+		{
+			get { return null; }
+		}
+	}
 }
\ No newline at end of file
diff --git a/VectoCore/VectoCore/InputData/FileIO/JSON/JSONEngineData.cs b/VectoCore/VectoCore/InputData/FileIO/JSON/JSONEngineData.cs
index bf8d8e57a5c19e2e4b8aaed3ac557377677a299c..d1cb4311b329be30216f3717c71a7d936d68dbfe 100644
--- a/VectoCore/VectoCore/InputData/FileIO/JSON/JSONEngineData.cs
+++ b/VectoCore/VectoCore/InputData/FileIO/JSON/JSONEngineData.cs
@@ -29,231 +29,231 @@
 *   Martin Rexeis, rexeis@ivt.tugraz.at, IVT, Graz University of Technology
 */
 
-using System;
-using System.IO;
-using Newtonsoft.Json.Linq;
-using TUGraz.VectoCommon.InputData;
-using TUGraz.VectoCommon.Models;
-using TUGraz.VectoCommon.Utils;
-
-namespace TUGraz.VectoCore.InputData.FileIO.JSON
-{
-	/// <summary>
-	///     Represents the CombustionEngineData. Fileformat: .veng
-	/// </summary>
-	/// <code>
-	/// {
-	///  "Header": {
-	///    "CreatedBy": " ()",
-	///    "Date": "3/4/2015 12:26:24 PM",
-	///    "AppVersion": "2.0.4-beta3",
-	///    "FileVersion": 2
-	///  },
-	///  "Body": {
-	///    "SavedInDeclMode": false,
-	///    "ModelName": "Generic 24t Coach",
-	///    "Displacement": 12730.0,
-	///    "IdlingSpeed": 560.0,
-	///    "Inertia": 3.8,
-	///    "FullLoadCurves": [
-	///      {
-	///        "Path": "24t Coach.vfld",
-	///        "Gears": "0 - 99"
-	///      }
-	///    ],
-	///    "FuelMap": "24t Coach.vmap",
-	///    "WHTC-Urban": 0.0,
-	///    "WHTC-Rural": 0.0,
-	///    "WHTC-Motorway": 0.0
-	///  }
-	/// }
-	/// </code>
-	public class JSONEngineDataV4 : JSONEngineDataV3
-	{
-		public JSONEngineDataV4(JObject data, string fileName, bool tolerateMissing = false)
-			: base(data, fileName, tolerateMissing) {}
-
-		public override Watt RatedPowerDeclared
-		{
-			get { return Body.GetEx<double>("RatedPower").SI<Watt>(); }
-		}
-
-		public override PerSecond RatedSpeedDeclared
-		{
-			get { return Body.GetEx<double>("RatedSpeed").RPMtoRad(); }
-		}
-
-		public override NewtonMeter MaxTorqueDeclared
-		{
-			get { return Body.GetEx<double>("MaxTorque").SI<NewtonMeter>(); }
-		}
-
-		public override double CorrectionFactorRegPer
-		{
-			get { return Body.GetEx<double>("CFRegPer"); }
-		}
-
-
-		public override double CorrectionFactorNCV
-		{
-			get { return Body.GetEx<double>("CFNCV"); }
-		}
-
-		public override FuelType FuelType
-		{
-			get { return Body.GetEx<string>("FuelType").ParseEnum<FuelType>(); }
-		}
-	}
-
-
-	public class JSONEngineDataV3 : JSONFile, IEngineEngineeringInputData
-	{
-		public JSONEngineDataV3(JObject data, string fileName, bool tolerateMissing = false)
-			: base(data, fileName, tolerateMissing) {}
-
-		public virtual CubicMeter Displacement
-		{
-			get { return Body.GetEx<double>(JsonKeys.Engine_Displacement).SI().Cubic.Centi.Meter.Cast<CubicMeter>(); }
-			// convert vom ccm to m^3}
-		}
-
-		public virtual PerSecond IdleSpeed
-		{
-			get { return Body.GetEx<double>(JsonKeys.Engine_IdleSpeed).RPMtoRad(); }
-		}
-
-
-		public virtual FuelType FuelType
-		{
-			get { return FuelType.DieselCI; }
-		}
-
-		public virtual TableData FuelConsumptionMap
-		{
-			get {
-				try {
-					return ReadTableData(Body.GetEx<string>(JsonKeys.Engine_FuelConsumptionMap), "FuelConsumptionMap");
-				} catch (Exception) {
-					if (!TolerateMissing) {
-						throw;
-					}
-					return
-						new TableData(Path.Combine(BasePath, Body[JsonKeys.Engine_FuelConsumptionMap].ToString()) + MissingFileSuffix,
-							DataSourceType.Missing);
-				}
-			}
-		}
-
-		public virtual TableData FullLoadCurve
-		{
-			get {
-				try {
-					return ReadTableData(Body.GetEx<string>(JsonKeys.Engine_FullLoadCurveFile), "FullLoadCurve");
-				} catch (Exception) {
-					if (!TolerateMissing) {
-						throw;
-					}
-					return new TableData(
-						Path.Combine(BasePath, Body[JsonKeys.Engine_FullLoadCurveFile].ToString()) + MissingFileSuffix,
-						DataSourceType.Missing);
-				}
-			}
-		}
-
-		public virtual Watt RatedPowerDeclared
-		{
-			get { return 0.SI<Watt>(); }
-		}
-
-		public virtual PerSecond RatedSpeedDeclared
-		{
-			get { return 0.RPMtoRad(); }
-		}
-
-		public virtual NewtonMeter MaxTorqueDeclared
-		{
-			get { return 0.SI<NewtonMeter>(); }
-		}
-
-		public virtual KilogramSquareMeter Inertia
-		{
-			get { return Body.GetEx<double>(JsonKeys.Engine_Inertia).SI<KilogramSquareMeter>(); }
-		}
-
-		public virtual double WHTCEngineering
-		{
-			get {
-				if (Body["WHTC-Engineering"] == null) {
-					return 1;
-				}
-				return Body.GetEx<double>("WHTC-Engineering");
-			}
-		}
-
-		public virtual double WHTCMotorway
-		{
-			get { return Body.GetEx<double>(JsonKeys.Engine_WHTC_Motorway); }
-		}
-
-		public virtual double WHTCRural
-		{
-			get { return Body.GetEx<double>(JsonKeys.Engine_WHTC_Rural); }
-		}
-
-		public virtual double WHTCUrban
-		{
-			get { return Body.GetEx<double>(JsonKeys.Engine_WHTC_Urban); }
-		}
-
-		public double ColdHotBalancingFactor
-		{
-			get {
-				if (Body["ColdHotBalancingFactor"] == null) {
-					return 1.0;
-				}
-				return Body.GetEx<double>("ColdHotBalancingFactor");
-			}
-		}
-
-		public virtual double CorrectionFactorRegPer
-		{
-			get { return 1; }
-		}
-
-		public virtual double CorrectionFactorNCV
-		{
-			get { return 1; }
-		}
-
-		public string Manufacturer
-		{
-			get { return "N/A"; }
-		}
-
-		public string Model
-		{
-			get { return Body.GetEx<string>(JsonKeys.Engine_ModelName); }
-		}
-
-
-		public string Date
-		{
-			get { return "N/A"; }
-		}
-
-		public CertificationMethod CertificationMethod
-		{
-			get { return CertificationMethod.NotCertified; }
-		}
-
-		public string CertificationNumber
-		{
-			get { return "N/A"; }
-		}
-
-		public string DigestValue
-		{
-			get { return "N/A"; }
-		}
-	}
+using System;
+using System.IO;
+using Newtonsoft.Json.Linq;
+using TUGraz.VectoCommon.InputData;
+using TUGraz.VectoCommon.Models;
+using TUGraz.VectoCommon.Utils;
+
+namespace TUGraz.VectoCore.InputData.FileIO.JSON
+{
+	/// <summary>
+	///     Represents the CombustionEngineData. Fileformat: .veng
+	/// </summary>
+	/// <code>
+	/// {
+	///  "Header": {
+	///    "CreatedBy": " ()",
+	///    "Date": "3/4/2015 12:26:24 PM",
+	///    "AppVersion": "2.0.4-beta3",
+	///    "FileVersion": 2
+	///  },
+	///  "Body": {
+	///    "SavedInDeclMode": false,
+	///    "ModelName": "Generic 24t Coach",
+	///    "Displacement": 12730.0,
+	///    "IdlingSpeed": 560.0,
+	///    "Inertia": 3.8,
+	///    "FullLoadCurves": [
+	///      {
+	///        "Path": "24t Coach.vfld",
+	///        "Gears": "0 - 99"
+	///      }
+	///    ],
+	///    "FuelMap": "24t Coach.vmap",
+	///    "WHTC-Urban": 0.0,
+	///    "WHTC-Rural": 0.0,
+	///    "WHTC-Motorway": 0.0
+	///  }
+	/// }
+	/// </code>
+	public class JSONEngineDataV4 : JSONEngineDataV3
+	{
+		public JSONEngineDataV4(JObject data, string fileName, bool tolerateMissing = false)
+			: base(data, fileName, tolerateMissing) {}
+
+		public override Watt RatedPowerDeclared
+		{
+			get { return Body.GetEx<double>("RatedPower").SI<Watt>(); }
+		}
+
+		public override PerSecond RatedSpeedDeclared
+		{
+			get { return Body.GetEx<double>("RatedSpeed").RPMtoRad(); }
+		}
+
+		public override NewtonMeter MaxTorqueDeclared
+		{
+			get { return Body.GetEx<double>("MaxTorque").SI<NewtonMeter>(); }
+		}
+
+		public override double CorrectionFactorRegPer
+		{
+			get { return Body.GetEx<double>("CFRegPer"); }
+		}
+
+
+		public override double CorrectionFactorNCV
+		{
+			get { return Body.GetEx<double>("CFNCV"); }
+		}
+
+		public override FuelType FuelType
+		{
+			get { return Body.GetEx<string>("FuelType").ParseEnum<FuelType>(); }
+		}
+	}
+
+
+	public class JSONEngineDataV3 : JSONFile, IEngineEngineeringInputData
+	{
+		public JSONEngineDataV3(JObject data, string fileName, bool tolerateMissing = false)
+			: base(data, fileName, tolerateMissing) {}
+
+		public virtual CubicMeter Displacement
+		{
+			get { return Body.GetEx<double>(JsonKeys.Engine_Displacement).SI().Cubic.Centi.Meter.Cast<CubicMeter>(); }
+			// convert vom ccm to m^3}
+		}
+
+		public virtual PerSecond IdleSpeed
+		{
+			get { return Body.GetEx<double>(JsonKeys.Engine_IdleSpeed).RPMtoRad(); }
+		}
+
+
+		public virtual FuelType FuelType
+		{
+			get { return FuelType.DieselCI; }
+		}
+
+		public virtual TableData FuelConsumptionMap
+		{
+			get {
+				try {
+					return ReadTableData(Body.GetEx<string>(JsonKeys.Engine_FuelConsumptionMap), "FuelConsumptionMap");
+				} catch (Exception) {
+					if (!TolerateMissing) {
+						throw;
+					}
+					return
+						new TableData(Path.Combine(BasePath, Body[JsonKeys.Engine_FuelConsumptionMap].ToString()) + MissingFileSuffix,
+							DataSourceType.Missing);
+				}
+			}
+		}
+
+		public virtual TableData FullLoadCurve
+		{
+			get {
+				try {
+					return ReadTableData(Body.GetEx<string>(JsonKeys.Engine_FullLoadCurveFile), "FullLoadCurve");
+				} catch (Exception) {
+					if (!TolerateMissing) {
+						throw;
+					}
+					return new TableData(
+						Path.Combine(BasePath, Body[JsonKeys.Engine_FullLoadCurveFile].ToString()) + MissingFileSuffix,
+						DataSourceType.Missing);
+				}
+			}
+		}
+
+		public virtual Watt RatedPowerDeclared
+		{
+			get { return 0.SI<Watt>(); }
+		}
+
+		public virtual PerSecond RatedSpeedDeclared
+		{
+			get { return 0.RPMtoRad(); }
+		}
+
+		public virtual NewtonMeter MaxTorqueDeclared
+		{
+			get { return 0.SI<NewtonMeter>(); }
+		}
+
+		public virtual KilogramSquareMeter Inertia
+		{
+			get { return Body.GetEx<double>(JsonKeys.Engine_Inertia).SI<KilogramSquareMeter>(); }
+		}
+
+		public virtual double WHTCEngineering
+		{
+			get {
+				if (Body["WHTC-Engineering"] == null) {
+					return 1;
+				}
+				return Body.GetEx<double>("WHTC-Engineering");
+			}
+		}
+
+		public virtual double WHTCMotorway
+		{
+			get { return Body.GetEx<double>(JsonKeys.Engine_WHTC_Motorway); }
+		}
+
+		public virtual double WHTCRural
+		{
+			get { return Body.GetEx<double>(JsonKeys.Engine_WHTC_Rural); }
+		}
+
+		public virtual double WHTCUrban
+		{
+			get { return Body.GetEx<double>(JsonKeys.Engine_WHTC_Urban); }
+		}
+
+		public double ColdHotBalancingFactor
+		{
+			get {
+				if (Body["ColdHotBalancingFactor"] == null) {
+					return 1.0;
+				}
+				return Body.GetEx<double>("ColdHotBalancingFactor");
+			}
+		}
+
+		public virtual double CorrectionFactorRegPer
+		{
+			get { return 1; }
+		}
+
+		public virtual double CorrectionFactorNCV
+		{
+			get { return 1; }
+		}
+
+		public string Manufacturer
+		{
+			get { return "N/A"; }
+		}
+
+		public string Model
+		{
+			get { return Body.GetEx<string>(JsonKeys.Engine_ModelName); }
+		}
+
+
+		public string Date
+		{
+			get { return "N/A"; }
+		}
+
+		public CertificationMethod CertificationMethod
+		{
+			get { return CertificationMethod.NotCertified; }
+		}
+
+		public string CertificationNumber
+		{
+			get { return "N/A"; }
+		}
+
+		public string DigestValue
+		{
+			get { return "N/A"; }
+		}
+	}
 }
\ No newline at end of file
diff --git a/VectoCore/VectoCore/InputData/FileIO/JSON/JSONInputDataFactory.cs b/VectoCore/VectoCore/InputData/FileIO/JSON/JSONInputDataFactory.cs
index c406af6f577cce116208b59668c8b6012643e388..84520f0a606ea9de508fb2a5a096b860c97d0320 100644
--- a/VectoCore/VectoCore/InputData/FileIO/JSON/JSONInputDataFactory.cs
+++ b/VectoCore/VectoCore/InputData/FileIO/JSON/JSONInputDataFactory.cs
@@ -29,96 +29,96 @@
 *   Martin Rexeis, rexeis@ivt.tugraz.at, IVT, Graz University of Technology
 */
 
-using System;
-using Newtonsoft.Json;
-using Newtonsoft.Json.Linq;
-using System.IO;
-using TUGraz.VectoCommon.Exceptions;
-using TUGraz.VectoCommon.InputData;
-using TUGraz.VectoCore.Configuration;
-
-namespace TUGraz.VectoCore.InputData.FileIO.JSON
-{
-	// ReSharper disable once InconsistentNaming
-	public static class JSONInputDataFactory
-	{
-		internal static JObject ReadFile(string fileName)
-		{
-			if (!File.Exists(fileName)) {
-				throw new FileNotFoundException("failed to load file: " + fileName, fileName);
-			}
-			using (var reader = File.OpenText(fileName)) {
-				return (JObject)JToken.ReadFrom(new JsonTextReader(reader));
-			}
-		}
-
-		public static IInputDataProvider ReadComponentData(string filename)
-		{
-			if (Constants.FileExtensions.VectoJobFile.Equals(Path.GetExtension(filename), StringComparison.OrdinalIgnoreCase)) {
-				return ReadJsonJob(filename, true);
-			}
-			return new JSONComponentInputData(filename, true);
-		}
-
-		public static IInputDataProvider ReadJsonJob(string filename, bool tolerateMissing = false)
-		{
-			var json = ReadFile(filename);
-			var version = ReadVersion(json);
-
-			switch (version) {
-				case 2:
-					return new JSONInputDataV2(json, filename, tolerateMissing);
-				case 3:
-					return new JSONInputDataV3(json, filename, tolerateMissing);
-				default:
-					throw new VectoException("Job-File: Unsupported FileVersion. Got: {0} ", version);
-			}
-		}
-
-		public static IVehicleEngineeringInputData ReadJsonVehicle(string filename, bool tolerateMissing = false)
-		{
-			var json = ReadFile(filename);
-			var version = ReadVersion(json);
-			switch (version) {
-				case 7:
-					return new JSONVehicleDataV7(json, filename, tolerateMissing);
-				default:
-					throw new VectoException("Vehicle-File: Unsupported FileVersion. Got {0}", version);
-			}
-		}
-
-		public static IGearboxEngineeringInputData ReadGearbox(string filename, bool tolerateMissing = false)
-		{
-			var json = ReadFile(filename);
-			var version = ReadVersion(json);
-			switch (version) {
-				case 5:
-					return new JSONGearboxDataV5(json, filename, tolerateMissing);
-				case 6:
-					return new JSONGearboxDataV6(json, filename, tolerateMissing);
-				default:
-					throw new VectoException("Gearbox-File: Unsupported FileVersion. Got {0}", version);
-			}
-		}
-
-		public static IEngineEngineeringInputData ReadEngine(string filename, bool tolerateMissing = false)
-		{
-			var json = ReadFile(filename);
-			var version = ReadVersion(json);
-			switch (version) {
-				case 3:
-					return new JSONEngineDataV3(json, filename, tolerateMissing);
-				case 4:
-					return new JSONEngineDataV4(json, filename, tolerateMissing);
-				default:
-					throw new VectoException("Engine-File: Unsupported FileVersion. Got {0}", version);
-			}
-		}
-
-		private static int ReadVersion(JObject json)
-		{
-			var value = json.GetEx(JsonKeys.JsonHeader).GetEx<string>(JsonKeys.JsonHeader_FileVersion);
-			return (int)double.Parse(value.Trim('"'));
-		}
-	}
+using System;
+using Newtonsoft.Json;
+using Newtonsoft.Json.Linq;
+using System.IO;
+using TUGraz.VectoCommon.Exceptions;
+using TUGraz.VectoCommon.InputData;
+using TUGraz.VectoCore.Configuration;
+
+namespace TUGraz.VectoCore.InputData.FileIO.JSON
+{
+	// ReSharper disable once InconsistentNaming
+	public static class JSONInputDataFactory
+	{
+		internal static JObject ReadFile(string fileName)
+		{
+			if (!File.Exists(fileName)) {
+				throw new FileNotFoundException("failed to load file: " + fileName, fileName);
+			}
+			using (var reader = File.OpenText(fileName)) {
+				return (JObject)JToken.ReadFrom(new JsonTextReader(reader));
+			}
+		}
+
+		public static IInputDataProvider ReadComponentData(string filename)
+		{
+			if (Constants.FileExtensions.VectoJobFile.Equals(Path.GetExtension(filename), StringComparison.OrdinalIgnoreCase)) {
+				return ReadJsonJob(filename, true);
+			}
+			return new JSONComponentInputData(filename, true);
+		}
+
+		public static IInputDataProvider ReadJsonJob(string filename, bool tolerateMissing = false)
+		{
+			var json = ReadFile(filename);
+			var version = ReadVersion(json);
+
+			switch (version) {
+				case 2:
+					return new JSONInputDataV2(json, filename, tolerateMissing);
+				case 3:
+					return new JSONInputDataV3(json, filename, tolerateMissing);
+				default:
+					throw new VectoException("Job-File: Unsupported FileVersion. Got: {0} ", version);
+			}
+		}
+
+		public static IVehicleEngineeringInputData ReadJsonVehicle(string filename, bool tolerateMissing = false)
+		{
+			var json = ReadFile(filename);
+			var version = ReadVersion(json);
+			switch (version) {
+				case 7:
+					return new JSONVehicleDataV7(json, filename, tolerateMissing);
+				default:
+					throw new VectoException("Vehicle-File: Unsupported FileVersion. Got {0}", version);
+			}
+		}
+
+		public static IGearboxEngineeringInputData ReadGearbox(string filename, bool tolerateMissing = false)
+		{
+			var json = ReadFile(filename);
+			var version = ReadVersion(json);
+			switch (version) {
+				case 5:
+					return new JSONGearboxDataV5(json, filename, tolerateMissing);
+				case 6:
+					return new JSONGearboxDataV6(json, filename, tolerateMissing);
+				default:
+					throw new VectoException("Gearbox-File: Unsupported FileVersion. Got {0}", version);
+			}
+		}
+
+		public static IEngineEngineeringInputData ReadEngine(string filename, bool tolerateMissing = false)
+		{
+			var json = ReadFile(filename);
+			var version = ReadVersion(json);
+			switch (version) {
+				case 3:
+					return new JSONEngineDataV3(json, filename, tolerateMissing);
+				case 4:
+					return new JSONEngineDataV4(json, filename, tolerateMissing);
+				default:
+					throw new VectoException("Engine-File: Unsupported FileVersion. Got {0}", version);
+			}
+		}
+
+		private static int ReadVersion(JObject json)
+		{
+			var value = json.GetEx(JsonKeys.JsonHeader).GetEx<string>(JsonKeys.JsonHeader_FileVersion);
+			return (int)double.Parse(value.Trim('"'));
+		}
+	}
 }
\ No newline at end of file
diff --git a/VectoCore/VectoCore/InputData/Impl/InputData.cs b/VectoCore/VectoCore/InputData/Impl/InputData.cs
index 5e882eedeff0805e80451c0e8bd9d5026be3f9f0..d14a8312dcf3eacad9808e9ec4442c431932db9d 100644
--- a/VectoCore/VectoCore/InputData/Impl/InputData.cs
+++ b/VectoCore/VectoCore/InputData/Impl/InputData.cs
@@ -29,123 +29,118 @@
 *   Martin Rexeis, rexeis@ivt.tugraz.at, IVT, Graz University of Technology
 */
 
-using System.Collections.Generic;
-using TUGraz.VectoCommon.InputData;
-using TUGraz.VectoCommon.Models;
-using TUGraz.VectoCommon.Utils;
-
-namespace TUGraz.VectoCore.InputData.Impl
-{
-	public class CycleInputData : ICycleData
-	{
-		public string Name { get; internal set; }
-
-		public TableData CycleData { get; internal set; }
-	}
-
-	public class LookAheadCoastingInputData : ILookaheadCoastingInputData
-	{
-		public bool Enabled { get; internal set; }
-
-		//public MeterPerSquareSecond Deceleration { get; internal set; }
-
-		public MeterPerSecond MinSpeed { get; internal set; }
-
-		public double CoastingDecisionFactorOffset { get; internal set; }
-		public double CoastingDecisionFactorScaling { get; internal set; }
-		public double LookaheadDistanceFactor { get; internal set; }
-		public TableData CoastingDecisionFactorTargetSpeedLookup { get; internal set; }
-		public TableData CoastingDecisionFactorVelocityDropLookup { get; internal set; }
-	}
-
-	public class OverSpeedEcoRollInputData : IOverSpeedEcoRollEngineeringInputData
-	{
-		public DriverMode Mode { get; internal set; }
-
-		public MeterPerSecond MinSpeed { get; internal set; }
-
-		public MeterPerSecond OverSpeed { get; internal set; }
-
-		public MeterPerSecond UnderSpeed { get; internal set; }
-	}
-
-	public class TransmissionInputData : ITransmissionInputData
-	{
-		public int Gear { get; internal set; }
-
-		public double Ratio { get; internal set; }
-
-		public TableData LossMap { get; internal set; }
-
-		public double Efficiency { get; internal set; }
-
-		public NewtonMeter MaxTorque { get; internal set; }
-
-		public PerSecond MaxInputSpeed { get; internal set; }
-
-		public TableData ShiftPolygon { get; internal set; }
-	}
-
-	public class AxleInputData : IAxleEngineeringInputData
-	{
-		[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design",
-			"CA1065:DoNotRaiseExceptionsInUnexpectedLocations")]
-		public bool SavedInDeclarationMode
-		{
-			get { throw new System.NotImplementedException(); }
-		}
-
-		public DataSourceType SourceType { get; internal set; }
-
-		public string Source { get; internal set; }
-
-		public string Wheels { get; internal set; }
-
-		public bool TwinTyres { get; internal set; }
-
-		public bool Steered { get; internal set; }
-
-		public AxleType AxleType { get; internal set; }
-
-		public double RollResistanceCoefficient { get; internal set; }
-
-		public Newton TyreTestLoad { get; internal set; }
-
-		public double AxleWeightShare { get; internal set; }
-
-		public KilogramSquareMeter Inertia { get; internal set; }
-	}
-
-	public class AuxiliaryDataInputData : IAuxiliaryEngineeringInputData, IAuxiliaryDeclarationInputData
-	{
-		public AuxiliaryDataInputData()
-		{
-			AuxiliaryType = AuxiliaryDemandType.Mapping;
-			ConstantPowerDemand = 0.SI<Watt>();
-		}
-
-		public AuxiliaryDemandType AuxiliaryType { get; internal set; }
-
-		public string ID { get; internal set; }
-
-		public AuxiliaryType Type { get; internal set; }
-
-		public IList<string> Technology { get; internal set; }
-
-		public double TransmissionRatio { get; internal set; }
-
-		public double EfficiencyToEngine { get; internal set; }
-
-		public double EfficiencyToSupply { get; internal set; }
-
-		public TableData DemandMap { get; internal set; }
-
-		public Watt ConstantPowerDemand { get; internal set; }
-	}
-
-	public class TorqueLimitInputData : ITorqueLimitInputData
-	{
-		public int Gear { get; internal set; }
-		public NewtonMeter MaxTorque { get; internal set; }
-	}
+using System.Collections.Generic;
+using TUGraz.VectoCommon.InputData;
+using TUGraz.VectoCommon.Models;
+using TUGraz.VectoCommon.Utils;
+
+namespace TUGraz.VectoCore.InputData.Impl
+{
+	public class CycleInputData : ICycleData
+	{
+		public string Name { get; internal set; }
+
+		public TableData CycleData { get; internal set; }
+	}
+
+	public class LookAheadCoastingInputData : ILookaheadCoastingInputData
+	{
+		public bool Enabled { get; internal set; }
+
+		//public MeterPerSquareSecond Deceleration { get; internal set; }
+
+		public MeterPerSecond MinSpeed { get; internal set; }
+
+		public double CoastingDecisionFactorOffset { get; internal set; }
+		public double CoastingDecisionFactorScaling { get; internal set; }
+		public double LookaheadDistanceFactor { get; internal set; }
+		public TableData CoastingDecisionFactorTargetSpeedLookup { get; internal set; }
+		public TableData CoastingDecisionFactorVelocityDropLookup { get; internal set; }
+	}
+
+	public class OverSpeedEcoRollInputData : IOverSpeedEcoRollEngineeringInputData
+	{
+		public DriverMode Mode { get; internal set; }
+
+		public MeterPerSecond MinSpeed { get; internal set; }
+
+		public MeterPerSecond OverSpeed { get; internal set; }
+
+		public MeterPerSecond UnderSpeed { get; internal set; }
+	}
+
+	public class TransmissionInputData : ITransmissionInputData
+	{
+		public int Gear { get; internal set; }
+
+		public double Ratio { get; internal set; }
+
+		public TableData LossMap { get; internal set; }
+
+		public double Efficiency { get; internal set; }
+
+		public NewtonMeter MaxTorque { get; internal set; }
+
+		public PerSecond MaxInputSpeed { get; internal set; }
+
+		public TableData ShiftPolygon { get; internal set; }
+	}
+
+	public class AxleInputData : IAxleEngineeringInputData
+	{
+		[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design",
+			"CA1065:DoNotRaiseExceptionsInUnexpectedLocations")]
+		public DataSourceType SourceType { get; internal set; }
+
+		public string Source { get; internal set; }
+
+		public string Wheels { get; internal set; }
+
+		public bool TwinTyres { get; internal set; }
+
+		public bool Steered { get; internal set; }
+
+		public AxleType AxleType { get; internal set; }
+
+		public double RollResistanceCoefficient { get; internal set; }
+
+		public Newton TyreTestLoad { get; internal set; }
+
+		public double AxleWeightShare { get; internal set; }
+
+		public KilogramSquareMeter Inertia { get; internal set; }
+	}
+
+	public class AuxiliaryDataInputData : IAuxiliaryEngineeringInputData, IAuxiliaryDeclarationInputData
+	{
+		public AuxiliaryDataInputData()
+		{
+			AuxiliaryType = AuxiliaryDemandType.Mapping;
+			ConstantPowerDemand = 0.SI<Watt>();
+		}
+
+		public AuxiliaryDemandType AuxiliaryType { get; internal set; }
+
+		public string ID { get; internal set; }
+
+		public AuxiliaryType Type { get; internal set; }
+
+		public IList<string> Technology { get; internal set; }
+
+		public double TransmissionRatio { get; internal set; }
+
+		public double EfficiencyToEngine { get; internal set; }
+
+		public double EfficiencyToSupply { get; internal set; }
+
+		public TableData DemandMap { get; internal set; }
+
+		public Watt ConstantPowerDemand { get; internal set; }
+	}
+
+	public class TorqueLimitInputData : ITorqueLimitInputData
+	{
+		public int Gear { get; internal set; }
+		public NewtonMeter MaxTorque { get; internal set; }
+	}
 }
\ No newline at end of file
diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapter.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapter.cs
index df3cc851b0f88cd2f4cdf8f25c335d2f749a7280..fb3702ba23ee5b202ef6ddbbf0bfbf8bc5d45f19 100644
--- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapter.cs
+++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapter.cs
@@ -29,450 +29,450 @@
 *   Martin Rexeis, rexeis@ivt.tugraz.at, IVT, Graz University of Technology
 */
 
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using TUGraz.VectoCommon.Exceptions;
-using TUGraz.VectoCommon.InputData;
-using TUGraz.VectoCommon.Models;
-using TUGraz.VectoCommon.Utils;
-using TUGraz.VectoCore.Configuration;
-using TUGraz.VectoCore.InputData.Reader.ComponentData;
-using TUGraz.VectoCore.Models.Declaration;
-using TUGraz.VectoCore.Models.Simulation.Data;
-using TUGraz.VectoCore.Models.SimulationComponent.Data;
-using TUGraz.VectoCore.Models.SimulationComponent.Data.Engine;
-using TUGraz.VectoCore.Models.SimulationComponent.Data.Gearbox;
-using TUGraz.VectoCore.OutputData;
-using TUGraz.VectoCore.Utils;
-
-namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter
-{
-	public class DeclarationDataAdapter : AbstractSimulationDataAdapter
-	{
-		public DriverData CreateDriverData(IDriverDeclarationInputData data)
-		{
-			if (!data.SavedInDeclarationMode) {
-				WarnDeclarationMode("DriverData");
-			}
-			var lookAheadData = new DriverData.LACData {
-				Enabled = DeclarationData.Driver.LookAhead.Enabled,
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using TUGraz.VectoCommon.Exceptions;
+using TUGraz.VectoCommon.InputData;
+using TUGraz.VectoCommon.Models;
+using TUGraz.VectoCommon.Utils;
+using TUGraz.VectoCore.Configuration;
+using TUGraz.VectoCore.InputData.Reader.ComponentData;
+using TUGraz.VectoCore.Models.Declaration;
+using TUGraz.VectoCore.Models.Simulation.Data;
+using TUGraz.VectoCore.Models.SimulationComponent.Data;
+using TUGraz.VectoCore.Models.SimulationComponent.Data.Engine;
+using TUGraz.VectoCore.Models.SimulationComponent.Data.Gearbox;
+using TUGraz.VectoCore.OutputData;
+using TUGraz.VectoCore.Utils;
+
+namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter
+{
+	public class DeclarationDataAdapter : AbstractSimulationDataAdapter
+	{
+		public DriverData CreateDriverData(IDriverDeclarationInputData data)
+		{
+			if (!data.SavedInDeclarationMode) {
+				WarnDeclarationMode("DriverData");
+			}
+			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.OverSpeedEcoRollData {
-				Mode = data.OverSpeedEcoRoll.Mode,
-				MinSpeed = DeclarationData.Driver.OverSpeedEcoRoll.MinSpeed,
-				OverSpeed = DeclarationData.Driver.OverSpeedEcoRoll.OverSpeed,
-				UnderSpeed = DeclarationData.Driver.OverSpeedEcoRoll.UnderSpeed
-			};
-			if (!DeclarationData.Driver.OverSpeedEcoRoll.AllowedModes.Contains(overspeedData.Mode)) {
-				throw new VectoSimulationException(
-					"Specified Overspeed/EcoRoll Mode not allowed in declaration mode! {0}",
-					overspeedData.Mode);
-			}
-			var retVal = new DriverData {
-				LookAheadCoasting = lookAheadData,
-				OverSpeedEcoRoll = overspeedData,
-			};
-			return retVal;
-		}
-
-		internal VehicleData CreateVehicleData(IVehicleDeclarationInputData data, Mission mission, Kilogram loading,
-			Kilogram municipalBodyWeight)
-		{
-			if (!data.SavedInDeclarationMode) {
-				WarnDeclarationMode("VehicleData");
-			}
-
-			var retVal = SetCommonVehicleData(data);
-			retVal.VIN = data.VIN;
-			retVal.ManufacturerAddress = data.ManufacturerAddress;
-			retVal.LegislativeClass = data.LegislativeClass;
-			retVal.TrailerGrossVehicleWeight = mission.Trailer.Sum(t => t.TrailerGrossVehicleWeight).DefaultIfNull(0);
-
-			retVal.BodyAndTrailerWeight = (mission.MissionType == MissionType.MunicipalUtility
-				? municipalBodyWeight
-				: mission.BodyCurbWeight) + mission.Trailer.Sum(t => t.TrailerCurbWeight).DefaultIfNull(0);
-			//retVal.CurbWeight += retVal.BodyAndTrailerWeight;
-
-			retVal.Loading = loading;
-			var drivenIndex = DrivenAxleIndex(data.Axles);
-			retVal.DynamicTyreRadius =
-				DeclarationData.Wheels.Lookup(data.Axles[drivenIndex].Wheels).DynamicTyreRadius;
-			retVal.CargoVolume = mission.MissionType != MissionType.Construction ? mission.TotalCargoVolume : 0.SI<CubicMeter>();
-
-
-			var axles = data.Axles;
-			if (axles.Count < mission.AxleWeightDistribution.Length) {
-				throw new VectoException("Vehicle does not contain sufficient axles. {0} axles defined, {1} axles required",
-					data.Axles.Count, mission.AxleWeightDistribution.Length);
-			}
-			var axleData = new List<Axle>();
-			for (var i = 0; i < mission.AxleWeightDistribution.Length; i++) {
-				var axleInput = axles[i];
-				var axle = new Axle {
-					WheelsDimension = axleInput.Wheels,
-					AxleType = axleInput.AxleType,
-					AxleWeightShare = mission.AxleWeightDistribution[i],
-					TwinTyres = axleInput.TwinTyres,
-					RollResistanceCoefficient = axleInput.RollResistanceCoefficient,
-					TyreTestLoad = axleInput.TyreTestLoad,
-					Inertia = DeclarationData.Wheels.Lookup(axleInput.Wheels.RemoveWhitespace()).Inertia,
-				};
-				axleData.Add(axle);
-			}
-
-			foreach (var trailer in mission.Trailer) {
-				axleData.AddRange(trailer.TrailerWheels.Select(trailerWheel => new Axle {
-					AxleType = AxleType.Trailer,
-					AxleWeightShare = trailer.TrailerAxleWeightShare / trailer.TrailerWheels.Count,
-					TwinTyres = DeclarationData.Trailer.TwinTyres,
-					RollResistanceCoefficient = DeclarationData.Trailer.RollResistanceCoefficient,
-					TyreTestLoad = DeclarationData.Trailer.TyreTestLoad.SI<Newton>(),
-					Inertia = trailerWheel.Inertia
-				}));
-			}
-			retVal.AxleData = axleData;
-			return retVal;
-		}
-
-		private static int DrivenAxleIndex(IList<IAxleDeclarationInputData> axles)
-		{
-			for (var i = 0; i < axles.Count; i++) {
-				if (axles[i].AxleType != AxleType.VehicleDriven) {
-					continue;
-				}
-				return i;
-			}
-			return DeclarationData.PoweredAxle();
-		}
-
-		internal CombustionEngineData CreateEngineData(IEngineDeclarationInputData engine, PerSecond vehicleEngineIdleSpeed,
-			IGearboxDeclarationInputData gearbox, IEnumerable<ITorqueLimitInputData> torqueLimits)
-		{
-			if (!engine.SavedInDeclarationMode) {
-				WarnDeclarationMode("EngineData");
-			}
-
-			var retVal = SetCommonCombustionEngineData(engine);
-			retVal.IdleSpeed = VectoMath.Max(engine.IdleSpeed, vehicleEngineIdleSpeed);
-			retVal.WHTCUrban = engine.WHTCUrban;
-			retVal.WHTCMotorway = engine.WHTCMotorway;
-			retVal.WHTCRural = engine.WHTCRural;
-			retVal.ColdHotCorrectionFactor = engine.ColdHotBalancingFactor;
-			retVal.Inertia = DeclarationData.Engine.EngineInertia(retVal.Displacement, gearbox.Type);
-			var limits = torqueLimits.ToDictionary(e => e.Gear);
-			var numGears = gearbox.Gears.Count;
-			var fullLoadCurves = new Dictionary<uint, EngineFullLoadCurve>(numGears + 1);
-			fullLoadCurves[0] = FullLoadCurveReader.Create(engine.FullLoadCurve, true);
-			fullLoadCurves[0].EngineData = retVal;
-			foreach (var gear in gearbox.Gears) {
-				var maxTorque = VectoMath.Min(
-					GbxMaxTorque(gear, numGears, fullLoadCurves[0].MaxTorque),
-					VehMaxTorque(gear, numGears, limits, fullLoadCurves[0].MaxTorque));
-				fullLoadCurves[(uint)gear.Gear] = IntersectFullLoadCurves(fullLoadCurves[0], maxTorque);
-			}
-			retVal.FullLoadCurves = fullLoadCurves;
-			return retVal;
-		}
-
-		private static NewtonMeter VehMaxTorque(ITransmissionInputData gear, int numGears,
-			Dictionary<int, ITorqueLimitInputData> limits,
-			NewtonMeter maxEngineTorque)
-		{
-			if (gear.Gear - 1 >= numGears / 2) {
-				// only upper half of gears can limit if max-torque <= 0.95 of engine max torque
-				if (limits.ContainsKey(gear.Gear) &&
-					limits[gear.Gear].MaxTorque <= DeclarationData.Engine.TorqueLimitVehicleFactor * maxEngineTorque) {
-					return limits[gear.Gear].MaxTorque;
-				}
-			}
-			return null;
-		}
-
-		private static NewtonMeter GbxMaxTorque(ITransmissionInputData gear, int numGears, NewtonMeter maxEngineTorque
-			)
-		{
-			if (gear.Gear - 1 < numGears / 2) {
-				// gears count from 1 to n, -> n entries, lower half can always limit
-				if (gear.MaxTorque != null) {
-					return gear.MaxTorque;
-				}
-			} else {
-				// upper half can only limit if max-torque <= 90% of engine max torque
-				if (gear.MaxTorque != null && gear.MaxTorque <= DeclarationData.Engine.TorqueLimitGearboxFactor * maxEngineTorque) {
-					return gear.MaxTorque;
-				}
-			}
-			return null;
-		}
-
-		internal GearboxData CreateGearboxData(IGearboxDeclarationInputData gearbox, CombustionEngineData engine,
-			double axlegearRatio, Meter dynamicTyreRadius, bool useEfficiencyFallback)
-		{
-			if (!gearbox.SavedInDeclarationMode) {
-				WarnDeclarationMode("GearboxData");
-			}
-			var retVal = SetCommonGearboxData(gearbox);
-			switch (gearbox.Type) {
-				case GearboxType.DrivingCycle:
-				case GearboxType.ATPowerSplit:
-					throw new VectoSimulationException(
-						"Unsupported gearbox type: {0}!", retVal.Type);
-				//case GearboxType.Custom:
-				//	throw new VectoSimulationException("Custom Transmission not supported in DeclarationMode!");
-			}
-			var gearsInput = gearbox.Gears;
-			if (gearsInput.Count < 1) {
-				throw new VectoSimulationException(
-					"At least one Gear-Entry must be defined in Gearbox!");
-			}
-
-			SetDeclarationData(retVal);
-
-			var gearDifferenceRatio = gearbox.Type.AutomaticTransmission() && gearbox.Gears.Count > 2
-				? gearbox.Gears[0].Ratio / gearbox.Gears[1].Ratio
-				: 1.0;
-
-			var gears = new Dictionary<uint, GearData>();
-			var tcShiftPolygon = DeclarationData.TorqueConverter.ComputeShiftPolygon(engine.FullLoadCurves[0]);
-			for (uint i = 0; i < gearsInput.Count; i++) {
-				var gear = gearsInput[(int)i];
-				var lossMap = CreateGearLossMap(gear, i, useEfficiencyFallback, true);
-
-				var shiftPolygon = DeclarationData.Gearbox.ComputeShiftPolygon(gearbox.Type, (int)i, engine.FullLoadCurves[i + 1],
-					gearsInput, engine,
-					axlegearRatio, dynamicTyreRadius);
-
-				var gearData = new GearData {
-					ShiftPolygon = shiftPolygon,
-					MaxSpeed = gear.MaxInputSpeed,
-					Ratio = gear.Ratio,
-					LossMap = lossMap,
-				};
-
-				if (gearbox.Type == GearboxType.ATPowerSplit && i == 0) {
-					// powersplit transmission: torque converter already contains ratio and losses
-					CretateTCFirstGearATPowerSplit(gearData, i, tcShiftPolygon);
-				}
-				if (gearbox.Type == GearboxType.ATSerial) {
-					if (i == 0) {
-						// torqueconverter is active in first gear - duplicate ratio and lossmap for torque converter mode
-						CreateTCFirstGearATSerial(gearData, tcShiftPolygon);
-					}
-					if (i == 1 && gearDifferenceRatio >= DeclarationData.Gearbox.TorqueConverterSecondGearThreshold) {
-						// ratio between first and second gear is above threshold, torqueconverter is active in second gear as well
-						// -> duplicate ratio and lossmap for torque converter mode, remove locked transmission for previous gear
-						CreateTCSecondGearATSerial(gearData, tcShiftPolygon);
-						// NOTE: the lower gear in 'gears' dictionary has index i !!
-						gears[i].Ratio = double.NaN;
-						gears[i].LossMap = null;
-					}
-				}
-				gears.Add(i + 1, gearData);
-			}
-			retVal.Gears = gears;
-			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;
-				retVal.TorqueConverterData = TorqueConverterDataReader.Create(gearbox.TorqueConverter.TCData,
-					DeclarationData.TorqueConverter.ReferenceRPM, DeclarationData.TorqueConverter.MaxInputSpeed,
-					ExecutionMode.Declaration, ratio,
-					DeclarationData.TorqueConverter.CLUpshiftMinAcceleration, DeclarationData.TorqueConverter.CCUpshiftMinAcceleration);
-			}
-
-			return retVal;
-		}
-
-		private static void SetDeclarationData(GearboxData retVal)
-		{
-			retVal.Inertia = DeclarationData.Gearbox.Inertia;
-			retVal.TractionInterruption = retVal.Type.TractionInterruption();
-			retVal.TorqueReserve = DeclarationData.Gearbox.TorqueReserve;
-			retVal.StartTorqueReserve = DeclarationData.Gearbox.TorqueReserveStart;
-			retVal.ShiftTime = DeclarationData.Gearbox.MinTimeBetweenGearshifts;
-			retVal.StartSpeed = DeclarationData.Gearbox.StartSpeed;
-			retVal.StartAcceleration = DeclarationData.Gearbox.StartAcceleration;
-			retVal.DownshiftAfterUpshiftDelay = DeclarationData.Gearbox.DownshiftAfterUpshiftDelay;
-			retVal.UpshiftAfterDownshiftDelay = DeclarationData.Gearbox.UpshiftAfterDownshiftDelay;
-			retVal.UpshiftMinAcceleration = DeclarationData.Gearbox.UpshiftMinAcceleration;
-		}
-
-		public IList<VectoRunData.AuxData> CreateAuxiliaryData(IAuxiliariesDeclarationInputData auxInputData,
-			MissionType mission, VehicleClass hvdClass)
-		{
-			if (!auxInputData.SavedInDeclarationMode) {
-				WarnDeclarationMode("AuxiliariesData");
-			}
-			var retVal = new List<VectoRunData.AuxData>();
-
-			if (auxInputData.Auxiliaries.Count != 5) {
-				Log.Error(
-					"In Declaration Mode exactly 5 Auxiliaries must be defined: Fan, Steering pump, HVAC, Electric System, Pneumatic System.");
-				throw new VectoException(
-					"In Declaration Mode exactly 5 Auxiliaries must be defined: Fan, Steering pump, HVAC, Electric System, Pneumatic System.");
-			}
-
-			foreach (var auxType in EnumHelper.GetValues<AuxiliaryType>()) {
-				var auxData = auxInputData.Auxiliaries.FirstOrDefault(a => a.Type == auxType);
-				if (auxData == null) {
-					throw new VectoException("Auxiliary {0} not found.", auxType);
-				}
-				var aux = new VectoRunData.AuxData {
-					DemandType = AuxiliaryDemandType.Constant,
-					Technology = auxData.Technology
-				};
-
-				mission = mission.GetNonEMSMissionType();
-				switch (auxType) {
-					case AuxiliaryType.Fan:
-						aux.PowerDemand = DeclarationData.Fan.Lookup(mission, auxData.Technology.FirstOrDefault());
-						aux.ID = Constants.Auxiliaries.IDs.Fan;
-						break;
-					case AuxiliaryType.SteeringPump:
-						aux.PowerDemand = DeclarationData.SteeringPump.Lookup(mission, hvdClass, auxData.Technology);
-						aux.ID = Constants.Auxiliaries.IDs.SteeringPump;
-						break;
-					case AuxiliaryType.HVAC:
-						aux.PowerDemand = DeclarationData.HeatingVentilationAirConditioning.Lookup(mission,
-							auxData.Technology.FirstOrDefault(), hvdClass);
-						aux.ID = Constants.Auxiliaries.IDs.HeatingVentilationAirCondition;
-						break;
-					case AuxiliaryType.PneumaticSystem:
-						aux.PowerDemand = DeclarationData.PneumaticSystem.Lookup(mission, auxData.Technology.FirstOrDefault());
-						aux.ID = Constants.Auxiliaries.IDs.PneumaticSystem;
-						break;
-					case AuxiliaryType.ElectricSystem:
-						aux.PowerDemand = DeclarationData.ElectricSystem.Lookup(mission, auxData.Technology.FirstOrDefault());
-						aux.ID = Constants.Auxiliaries.IDs.ElectricSystem;
-						break;
-					default:
-						continue;
-				}
-				retVal.Add(aux);
-			}
-			return retVal;
-		}
-
-		private void WarnDeclarationMode(string inputData)
-		{
-			Log.Warn("{0} not in Declaration Mode!", inputData);
-		}
-
-		public RetarderData CreateRetarderData(IRetarderInputData retarder)
-		{
-			return SetCommonRetarderData(retarder);
-		}
-
-		public static List<CrossWindCorrectionCurveReader.CrossWindCorrectionEntry> GetDeclarationAirResistanceCurve(
-			string crosswindCorrectionParameters, SquareMeter aerodynamicDragAera, Meter vehicleHeight)
-		{
-			const int startSpeed = 60;
-			const int maxSpeed = 130;
-			const int speedStep = 5;
-
-			const int maxAlpha = 180;
-			const int alphaStep = 10;
-
-			const int startHeightPercent = 5;
-			const int maxHeightPercent = 100;
-			const int heightPercentStep = 10;
-			const double heightShare = (double)heightPercentStep / maxHeightPercent;
-
-			var values = DeclarationData.AirDrag.Lookup(crosswindCorrectionParameters);
-
-			// first entry (0m/s) will get CdxA of second entry.
-			var points = new List<CrossWindCorrectionCurveReader.CrossWindCorrectionEntry> {
-				new CrossWindCorrectionCurveReader.CrossWindCorrectionEntry {
-					Velocity = 0.SI<MeterPerSecond>(),
-					EffectiveCrossSectionArea = 0.SI<SquareMeter>()
-				}
-			};
-
-			for (var speed = startSpeed; speed <= maxSpeed; speed += speedStep) {
-				var vVeh = speed.KMPHtoMeterPerSecond();
-
-				var cdASum = 0.SI<SquareMeter>();
-
-				for (var heightPercent = startHeightPercent; heightPercent < maxHeightPercent; heightPercent += heightPercentStep) {
-					var height = heightPercent / 100.0 * vehicleHeight;
-					var vWind = Physics.BaseWindSpeed * Math.Pow(height / Physics.BaseWindHeight, Physics.HellmannExponent);
-
-					for (var alpha = 0; alpha <= maxAlpha; alpha += alphaStep) {
-						var vAirX = vVeh + vWind * Math.Cos(alpha.ToRadian());
-						var vAirY = vWind * Math.Sin(alpha.ToRadian());
-
-						var beta = Math.Atan(vAirY / vAirX).ToDegree();
-
-						// ΔCdxA = A1β + A2β² + A3β³
-						var deltaCdA = values.A1 * beta + values.A2 * beta * beta + values.A3 * beta * beta * beta;
-
-						// CdxA(β) = CdxA(0) + ΔCdxA(β)
-						var cdA = aerodynamicDragAera + deltaCdA;
-
-						var share = (alpha == 0 || alpha == maxAlpha ? alphaStep / 2.0 : alphaStep) / maxAlpha;
-
-						// v_air = sqrt(v_airX²+vAirY²)
-						// cdASum = CdxA(β) * v_air²/v_veh²
-						cdASum += heightShare * share * cdA * (vAirX * vAirX + vAirY * vAirY) / (vVeh * vVeh);
-					}
-				}
-				points.Add(new CrossWindCorrectionCurveReader.CrossWindCorrectionEntry {
-					Velocity = vVeh,
-					EffectiveCrossSectionArea = cdASum
-				});
-			}
-
-			points[0].EffectiveCrossSectionArea = points[1].EffectiveCrossSectionArea;
-			return points;
-		}
-
-		public PTOData CreatePTOTransmissionData(IPTOTransmissionInputData pto)
-		{
-			if (pto.PTOTransmissionType != "None") {
-				return new PTOData {
-					TransmissionType = pto.PTOTransmissionType,
-					LossMap = PTOIdleLossMapReader.GetZeroLossMap(),
-				};
-			}
-
-			return null;
-		}
-
-		public AirdragData CreateAirdragData(IAirdragDeclarationInputData airdragInputData, Mission mission,
-			Segment segment)
-		{
-			if (airdragInputData == null || airdragInputData.AirDragArea == null) {
-				return DefaultAirdragData(mission, segment);
-			}
-
-			var retVal = SetCommonAirdragData(airdragInputData);
-			var aerodynamicDragArea = airdragInputData.AirDragArea + mission.Trailer.Sum(t => t.DeltaCdA).DefaultIfNull(0);
-
-			retVal.DeclaredAirdragArea = airdragInputData.AirDragArea;
-			retVal.CrossWindCorrectionCurve =
-				new CrosswindCorrectionCdxALookup(aerodynamicDragArea,
-					GetDeclarationAirResistanceCurve(mission.CrossWindCorrectionParameters, aerodynamicDragArea, segment.VehicleHeight),
-					CrossWindCorrectionMode.DeclarationModeCorrection);
-			return retVal;
-		}
-
-		private AirdragData DefaultAirdragData(Mission mission, Segment segment)
-		{
-			var aerodynamicDragArea = mission.MissionType == MissionType.Construction
-				? segment.CdAConstruction
-				: segment.CdADefault + mission.Trailer.Sum(t => t.DeltaCdA).DefaultIfNull(0);
-
-			return new AirdragData() {
-				CertificationMethod = CertificationMethod.StandardValues,
-				DeclaredAirdragArea = mission.MissionType == MissionType.Construction ? segment.CdAConstruction : segment.CdADefault,
-				CrossWindCorrectionCurve = new CrosswindCorrectionCdxALookup(aerodynamicDragArea,
-					GetDeclarationAirResistanceCurve(mission.CrossWindCorrectionParameters, aerodynamicDragArea, segment.VehicleHeight),
-					CrossWindCorrectionMode.DeclarationModeCorrection)
-			};
-		}
-	}
+				MinSpeed = DeclarationData.Driver.LookAhead.MinimumSpeed,
+				LookAheadDecisionFactor = new LACDecisionFactor(),
+				LookAheadDistanceFactor = DeclarationData.Driver.LookAhead.LookAheadDistanceFactor,
+			};
+			var overspeedData = new DriverData.OverSpeedEcoRollData {
+				Mode = data.OverSpeedEcoRoll.Mode,
+				MinSpeed = DeclarationData.Driver.OverSpeedEcoRoll.MinSpeed,
+				OverSpeed = DeclarationData.Driver.OverSpeedEcoRoll.OverSpeed,
+				UnderSpeed = DeclarationData.Driver.OverSpeedEcoRoll.UnderSpeed
+			};
+			if (!DeclarationData.Driver.OverSpeedEcoRoll.AllowedModes.Contains(overspeedData.Mode)) {
+				throw new VectoSimulationException(
+					"Specified Overspeed/EcoRoll Mode not allowed in declaration mode! {0}",
+					overspeedData.Mode);
+			}
+			var retVal = new DriverData {
+				LookAheadCoasting = lookAheadData,
+				OverSpeedEcoRoll = overspeedData,
+			};
+			return retVal;
+		}
+
+		internal VehicleData CreateVehicleData(IVehicleDeclarationInputData data, Mission mission, Kilogram loading,
+			Kilogram municipalBodyWeight)
+		{
+			if (!data.SavedInDeclarationMode) {
+				WarnDeclarationMode("VehicleData");
+			}
+
+			var retVal = SetCommonVehicleData(data);
+			retVal.VIN = data.VIN;
+			retVal.ManufacturerAddress = data.ManufacturerAddress;
+			retVal.LegislativeClass = data.LegislativeClass;
+			retVal.TrailerGrossVehicleWeight = mission.Trailer.Sum(t => t.TrailerGrossVehicleWeight).DefaultIfNull(0);
+
+			retVal.BodyAndTrailerWeight = (mission.MissionType == MissionType.MunicipalUtility
+				? municipalBodyWeight
+				: mission.BodyCurbWeight) + mission.Trailer.Sum(t => t.TrailerCurbWeight).DefaultIfNull(0);
+			//retVal.CurbWeight += retVal.BodyAndTrailerWeight;
+
+			retVal.Loading = loading;
+			var drivenIndex = DrivenAxleIndex(data.Axles);
+			retVal.DynamicTyreRadius =
+				DeclarationData.Wheels.Lookup(data.Axles[drivenIndex].Wheels).DynamicTyreRadius;
+			retVal.CargoVolume = mission.MissionType != MissionType.Construction ? mission.TotalCargoVolume : 0.SI<CubicMeter>();
+
+
+			var axles = data.Axles;
+			if (axles.Count < mission.AxleWeightDistribution.Length) {
+				throw new VectoException("Vehicle does not contain sufficient axles. {0} axles defined, {1} axles required",
+					data.Axles.Count, mission.AxleWeightDistribution.Length);
+			}
+			var axleData = new List<Axle>();
+			for (var i = 0; i < mission.AxleWeightDistribution.Length; i++) {
+				var axleInput = axles[i];
+				var axle = new Axle {
+					WheelsDimension = axleInput.Wheels,
+					AxleType = axleInput.AxleType,
+					AxleWeightShare = mission.AxleWeightDistribution[i],
+					TwinTyres = axleInput.TwinTyres,
+					RollResistanceCoefficient = axleInput.RollResistanceCoefficient,
+					TyreTestLoad = axleInput.TyreTestLoad,
+					Inertia = DeclarationData.Wheels.Lookup(axleInput.Wheels.RemoveWhitespace()).Inertia,
+				};
+				axleData.Add(axle);
+			}
+
+			foreach (var trailer in mission.Trailer) {
+				axleData.AddRange(trailer.TrailerWheels.Select(trailerWheel => new Axle {
+					AxleType = AxleType.Trailer,
+					AxleWeightShare = trailer.TrailerAxleWeightShare / trailer.TrailerWheels.Count,
+					TwinTyres = DeclarationData.Trailer.TwinTyres,
+					RollResistanceCoefficient = DeclarationData.Trailer.RollResistanceCoefficient,
+					TyreTestLoad = DeclarationData.Trailer.TyreTestLoad.SI<Newton>(),
+					Inertia = trailerWheel.Inertia
+				}));
+			}
+			retVal.AxleData = axleData;
+			return retVal;
+		}
+
+		private static int DrivenAxleIndex(IList<IAxleDeclarationInputData> axles)
+		{
+			for (var i = 0; i < axles.Count; i++) {
+				if (axles[i].AxleType != AxleType.VehicleDriven) {
+					continue;
+				}
+				return i;
+			}
+			return DeclarationData.PoweredAxle();
+		}
+
+		internal CombustionEngineData CreateEngineData(IEngineDeclarationInputData engine, PerSecond vehicleEngineIdleSpeed,
+			IGearboxDeclarationInputData gearbox, IEnumerable<ITorqueLimitInputData> torqueLimits)
+		{
+			if (!engine.SavedInDeclarationMode) {
+				WarnDeclarationMode("EngineData");
+			}
+
+			var retVal = SetCommonCombustionEngineData(engine);
+			retVal.IdleSpeed = VectoMath.Max(engine.IdleSpeed, vehicleEngineIdleSpeed);
+			retVal.WHTCUrban = engine.WHTCUrban;
+			retVal.WHTCMotorway = engine.WHTCMotorway;
+			retVal.WHTCRural = engine.WHTCRural;
+			retVal.ColdHotCorrectionFactor = engine.ColdHotBalancingFactor;
+			retVal.Inertia = DeclarationData.Engine.EngineInertia(retVal.Displacement, gearbox.Type);
+			var limits = torqueLimits.ToDictionary(e => e.Gear);
+			var numGears = gearbox.Gears.Count;
+			var fullLoadCurves = new Dictionary<uint, EngineFullLoadCurve>(numGears + 1);
+			fullLoadCurves[0] = FullLoadCurveReader.Create(engine.FullLoadCurve, true);
+			fullLoadCurves[0].EngineData = retVal;
+			foreach (var gear in gearbox.Gears) {
+				var maxTorque = VectoMath.Min(
+					GbxMaxTorque(gear, numGears, fullLoadCurves[0].MaxTorque),
+					VehMaxTorque(gear, numGears, limits, fullLoadCurves[0].MaxTorque));
+				fullLoadCurves[(uint)gear.Gear] = IntersectFullLoadCurves(fullLoadCurves[0], maxTorque);
+			}
+			retVal.FullLoadCurves = fullLoadCurves;
+			return retVal;
+		}
+
+		private static NewtonMeter VehMaxTorque(ITransmissionInputData gear, int numGears,
+			Dictionary<int, ITorqueLimitInputData> limits,
+			NewtonMeter maxEngineTorque)
+		{
+			if (gear.Gear - 1 >= numGears / 2) {
+				// only upper half of gears can limit if max-torque <= 0.95 of engine max torque
+				if (limits.ContainsKey(gear.Gear) &&
+					limits[gear.Gear].MaxTorque <= DeclarationData.Engine.TorqueLimitVehicleFactor * maxEngineTorque) {
+					return limits[gear.Gear].MaxTorque;
+				}
+			}
+			return null;
+		}
+
+		private static NewtonMeter GbxMaxTorque(ITransmissionInputData gear, int numGears, NewtonMeter maxEngineTorque
+			)
+		{
+			if (gear.Gear - 1 < numGears / 2) {
+				// gears count from 1 to n, -> n entries, lower half can always limit
+				if (gear.MaxTorque != null) {
+					return gear.MaxTorque;
+				}
+			} else {
+				// upper half can only limit if max-torque <= 90% of engine max torque
+				if (gear.MaxTorque != null && gear.MaxTorque <= DeclarationData.Engine.TorqueLimitGearboxFactor * maxEngineTorque) {
+					return gear.MaxTorque;
+				}
+			}
+			return null;
+		}
+
+		internal GearboxData CreateGearboxData(IGearboxDeclarationInputData gearbox, CombustionEngineData engine,
+			double axlegearRatio, Meter dynamicTyreRadius, VehicleCategory vehicleCategory, bool useEfficiencyFallback)
+		{
+			if (!gearbox.SavedInDeclarationMode) {
+				WarnDeclarationMode("GearboxData");
+			}
+			var retVal = SetCommonGearboxData(gearbox);
+			switch (gearbox.Type) {
+				case GearboxType.DrivingCycle:
+				case GearboxType.ATPowerSplit:
+					throw new VectoSimulationException(
+						"Unsupported gearbox type: {0}!", retVal.Type);
+				//case GearboxType.Custom:
+				//	throw new VectoSimulationException("Custom Transmission not supported in DeclarationMode!");
+			}
+			var gearsInput = gearbox.Gears;
+			if (gearsInput.Count < 1) {
+				throw new VectoSimulationException(
+					"At least one Gear-Entry must be defined in Gearbox!");
+			}
+
+			SetDeclarationData(retVal);
+
+			var gearDifferenceRatio = gearbox.Type.AutomaticTransmission() && gearbox.Gears.Count > 2
+				? gearbox.Gears[0].Ratio / gearbox.Gears[1].Ratio
+				: 1.0;
+
+			var gears = new Dictionary<uint, GearData>();
+			var tcShiftPolygon = DeclarationData.TorqueConverter.ComputeShiftPolygon(engine.FullLoadCurves[0]);
+			for (uint i = 0; i < gearsInput.Count; i++) {
+				var gear = gearsInput[(int)i];
+				var lossMap = CreateGearLossMap(gear, i, useEfficiencyFallback, true);
+
+				var shiftPolygon = DeclarationData.Gearbox.ComputeShiftPolygon(gearbox.Type, (int)i, engine.FullLoadCurves[i + 1],
+					gearsInput, engine,
+					axlegearRatio, dynamicTyreRadius);
+
+				var gearData = new GearData {
+					ShiftPolygon = shiftPolygon,
+					MaxSpeed = gear.MaxInputSpeed,
+					Ratio = gear.Ratio,
+					LossMap = lossMap,
+				};
+
+				if (gearbox.Type == GearboxType.ATPowerSplit && i == 0) {
+					// powersplit transmission: torque converter already contains ratio and losses
+					CretateTCFirstGearATPowerSplit(gearData, i, tcShiftPolygon);
+				}
+				if (gearbox.Type == GearboxType.ATSerial) {
+					if (i == 0) {
+						// torqueconverter is active in first gear - duplicate ratio and lossmap for torque converter mode
+						CreateTCFirstGearATSerial(gearData, tcShiftPolygon);
+					}
+					if (i == 1 && gearDifferenceRatio >= DeclarationData.Gearbox.TorqueConverterSecondGearThreshold(vehicleCategory)) {
+						// ratio between first and second gear is above threshold, torqueconverter is active in second gear as well
+						// -> duplicate ratio and lossmap for torque converter mode, remove locked transmission for previous gear
+						CreateTCSecondGearATSerial(gearData, tcShiftPolygon);
+						// NOTE: the lower gear in 'gears' dictionary has index i !!
+						gears[i].Ratio = double.NaN;
+						gears[i].LossMap = null;
+					}
+				}
+				gears.Add(i + 1, gearData);
+			}
+			retVal.Gears = gears;
+			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;
+				retVal.TorqueConverterData = TorqueConverterDataReader.Create(gearbox.TorqueConverter.TCData,
+					DeclarationData.TorqueConverter.ReferenceRPM, DeclarationData.TorqueConverter.MaxInputSpeed,
+					ExecutionMode.Declaration, ratio,
+					DeclarationData.TorqueConverter.CLUpshiftMinAcceleration, DeclarationData.TorqueConverter.CCUpshiftMinAcceleration);
+			}
+
+			return retVal;
+		}
+
+		private static void SetDeclarationData(GearboxData retVal)
+		{
+			retVal.Inertia = DeclarationData.Gearbox.Inertia;
+			retVal.TractionInterruption = retVal.Type.TractionInterruption();
+			retVal.TorqueReserve = DeclarationData.Gearbox.TorqueReserve;
+			retVal.StartTorqueReserve = DeclarationData.Gearbox.TorqueReserveStart;
+			retVal.ShiftTime = DeclarationData.Gearbox.MinTimeBetweenGearshifts;
+			retVal.StartSpeed = DeclarationData.Gearbox.StartSpeed;
+			retVal.StartAcceleration = DeclarationData.Gearbox.StartAcceleration;
+			retVal.DownshiftAfterUpshiftDelay = DeclarationData.Gearbox.DownshiftAfterUpshiftDelay;
+			retVal.UpshiftAfterDownshiftDelay = DeclarationData.Gearbox.UpshiftAfterDownshiftDelay;
+			retVal.UpshiftMinAcceleration = DeclarationData.Gearbox.UpshiftMinAcceleration;
+		}
+
+		public IList<VectoRunData.AuxData> CreateAuxiliaryData(IAuxiliariesDeclarationInputData auxInputData,
+			MissionType mission, VehicleClass hvdClass)
+		{
+			if (!auxInputData.SavedInDeclarationMode) {
+				WarnDeclarationMode("AuxiliariesData");
+			}
+			var retVal = new List<VectoRunData.AuxData>();
+
+			if (auxInputData.Auxiliaries.Count != 5) {
+				Log.Error(
+					"In Declaration Mode exactly 5 Auxiliaries must be defined: Fan, Steering pump, HVAC, Electric System, Pneumatic System.");
+				throw new VectoException(
+					"In Declaration Mode exactly 5 Auxiliaries must be defined: Fan, Steering pump, HVAC, Electric System, Pneumatic System.");
+			}
+
+			foreach (var auxType in EnumHelper.GetValues<AuxiliaryType>()) {
+				var auxData = auxInputData.Auxiliaries.FirstOrDefault(a => a.Type == auxType);
+				if (auxData == null) {
+					throw new VectoException("Auxiliary {0} not found.", auxType);
+				}
+				var aux = new VectoRunData.AuxData {
+					DemandType = AuxiliaryDemandType.Constant,
+					Technology = auxData.Technology
+				};
+
+				mission = mission.GetNonEMSMissionType();
+				switch (auxType) {
+					case AuxiliaryType.Fan:
+						aux.PowerDemand = DeclarationData.Fan.Lookup(mission, auxData.Technology.FirstOrDefault());
+						aux.ID = Constants.Auxiliaries.IDs.Fan;
+						break;
+					case AuxiliaryType.SteeringPump:
+						aux.PowerDemand = DeclarationData.SteeringPump.Lookup(mission, hvdClass, auxData.Technology);
+						aux.ID = Constants.Auxiliaries.IDs.SteeringPump;
+						break;
+					case AuxiliaryType.HVAC:
+						aux.PowerDemand = DeclarationData.HeatingVentilationAirConditioning.Lookup(mission,
+							auxData.Technology.FirstOrDefault(), hvdClass);
+						aux.ID = Constants.Auxiliaries.IDs.HeatingVentilationAirCondition;
+						break;
+					case AuxiliaryType.PneumaticSystem:
+						aux.PowerDemand = DeclarationData.PneumaticSystem.Lookup(mission, auxData.Technology.FirstOrDefault());
+						aux.ID = Constants.Auxiliaries.IDs.PneumaticSystem;
+						break;
+					case AuxiliaryType.ElectricSystem:
+						aux.PowerDemand = DeclarationData.ElectricSystem.Lookup(mission, auxData.Technology.FirstOrDefault());
+						aux.ID = Constants.Auxiliaries.IDs.ElectricSystem;
+						break;
+					default:
+						continue;
+				}
+				retVal.Add(aux);
+			}
+			return retVal;
+		}
+
+		private void WarnDeclarationMode(string inputData)
+		{
+			Log.Warn("{0} not in Declaration Mode!", inputData);
+		}
+
+		public RetarderData CreateRetarderData(IRetarderInputData retarder)
+		{
+			return SetCommonRetarderData(retarder);
+		}
+
+		public static List<CrossWindCorrectionCurveReader.CrossWindCorrectionEntry> GetDeclarationAirResistanceCurve(
+			string crosswindCorrectionParameters, SquareMeter aerodynamicDragAera, Meter vehicleHeight)
+		{
+			const int startSpeed = 60;
+			const int maxSpeed = 130;
+			const int speedStep = 5;
+
+			const int maxAlpha = 180;
+			const int alphaStep = 10;
+
+			const int startHeightPercent = 5;
+			const int maxHeightPercent = 100;
+			const int heightPercentStep = 10;
+			const double heightShare = (double)heightPercentStep / maxHeightPercent;
+
+			var values = DeclarationData.AirDrag.Lookup(crosswindCorrectionParameters);
+
+			// first entry (0m/s) will get CdxA of second entry.
+			var points = new List<CrossWindCorrectionCurveReader.CrossWindCorrectionEntry> {
+				new CrossWindCorrectionCurveReader.CrossWindCorrectionEntry {
+					Velocity = 0.SI<MeterPerSecond>(),
+					EffectiveCrossSectionArea = 0.SI<SquareMeter>()
+				}
+			};
+
+			for (var speed = startSpeed; speed <= maxSpeed; speed += speedStep) {
+				var vVeh = speed.KMPHtoMeterPerSecond();
+
+				var cdASum = 0.SI<SquareMeter>();
+
+				for (var heightPercent = startHeightPercent; heightPercent < maxHeightPercent; heightPercent += heightPercentStep) {
+					var height = heightPercent / 100.0 * vehicleHeight;
+					var vWind = Physics.BaseWindSpeed * Math.Pow(height / Physics.BaseWindHeight, Physics.HellmannExponent);
+
+					for (var alpha = 0; alpha <= maxAlpha; alpha += alphaStep) {
+						var vAirX = vVeh + vWind * Math.Cos(alpha.ToRadian());
+						var vAirY = vWind * Math.Sin(alpha.ToRadian());
+
+						var beta = Math.Atan(vAirY / vAirX).ToDegree();
+
+						// ΔCdxA = A1β + A2β² + A3β³
+						var deltaCdA = values.A1 * beta + values.A2 * beta * beta + values.A3 * beta * beta * beta;
+
+						// CdxA(β) = CdxA(0) + ΔCdxA(β)
+						var cdA = aerodynamicDragAera + deltaCdA;
+
+						var share = (alpha == 0 || alpha == maxAlpha ? alphaStep / 2.0 : alphaStep) / maxAlpha;
+
+						// v_air = sqrt(v_airX²+vAirY²)
+						// cdASum = CdxA(β) * v_air²/v_veh²
+						cdASum += heightShare * share * cdA * (vAirX * vAirX + vAirY * vAirY) / (vVeh * vVeh);
+					}
+				}
+				points.Add(new CrossWindCorrectionCurveReader.CrossWindCorrectionEntry {
+					Velocity = vVeh,
+					EffectiveCrossSectionArea = cdASum
+				});
+			}
+
+			points[0].EffectiveCrossSectionArea = points[1].EffectiveCrossSectionArea;
+			return points;
+		}
+
+		public PTOData CreatePTOTransmissionData(IPTOTransmissionInputData pto)
+		{
+			if (pto.PTOTransmissionType != "None") {
+				return new PTOData {
+					TransmissionType = pto.PTOTransmissionType,
+					LossMap = PTOIdleLossMapReader.GetZeroLossMap(),
+				};
+			}
+
+			return null;
+		}
+
+		public AirdragData CreateAirdragData(IAirdragDeclarationInputData airdragInputData, Mission mission,
+			Segment segment)
+		{
+			if (airdragInputData == null || airdragInputData.AirDragArea == null) {
+				return DefaultAirdragData(mission, segment);
+			}
+
+			var retVal = SetCommonAirdragData(airdragInputData);
+			var aerodynamicDragArea = airdragInputData.AirDragArea + mission.Trailer.Sum(t => t.DeltaCdA).DefaultIfNull(0);
+
+			retVal.DeclaredAirdragArea = airdragInputData.AirDragArea;
+			retVal.CrossWindCorrectionCurve =
+				new CrosswindCorrectionCdxALookup(aerodynamicDragArea,
+					GetDeclarationAirResistanceCurve(mission.CrossWindCorrectionParameters, aerodynamicDragArea, segment.VehicleHeight),
+					CrossWindCorrectionMode.DeclarationModeCorrection);
+			return retVal;
+		}
+
+		private AirdragData DefaultAirdragData(Mission mission, Segment segment)
+		{
+			var aerodynamicDragArea = mission.MissionType == MissionType.Construction
+				? segment.CdAConstruction
+				: segment.CdADefault + mission.Trailer.Sum(t => t.DeltaCdA).DefaultIfNull(0);
+
+			return new AirdragData() {
+				CertificationMethod = CertificationMethod.StandardValues,
+				DeclaredAirdragArea = mission.MissionType == MissionType.Construction ? segment.CdAConstruction : segment.CdADefault,
+				CrossWindCorrectionCurve = new CrosswindCorrectionCdxALookup(aerodynamicDragArea,
+					GetDeclarationAirResistanceCurve(mission.CrossWindCorrectionParameters, aerodynamicDragArea, segment.VehicleHeight),
+					CrossWindCorrectionMode.DeclarationModeCorrection)
+			};
+		}
+	}
 }
\ No newline at end of file
diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/EngineeringDataAdapter.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/EngineeringDataAdapter.cs
index 50c771198b3326f4d8956c1f7f706ec0dc98b286..8ce7e9175f58652ba8e8788ddb441a43bee6e7b9 100644
--- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/EngineeringDataAdapter.cs
+++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/EngineeringDataAdapter.cs
@@ -29,340 +29,340 @@
 *   Martin Rexeis, rexeis@ivt.tugraz.at, IVT, Graz University of Technology
 */
 
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using TUGraz.VectoCommon.Exceptions;
-using TUGraz.VectoCommon.InputData;
-using TUGraz.VectoCommon.Models;
-using TUGraz.VectoCommon.Utils;
-using TUGraz.VectoCore.Configuration;
-using TUGraz.VectoCore.InputData.Reader.ComponentData;
-using TUGraz.VectoCore.Models.Declaration;
-using TUGraz.VectoCore.Models.Simulation.Data;
-using TUGraz.VectoCore.Models.SimulationComponent.Data;
-using TUGraz.VectoCore.Models.SimulationComponent.Data.Engine;
-using TUGraz.VectoCore.Models.SimulationComponent.Data.Gearbox;
-
-namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter
-{
-	public class EngineeringDataAdapter : AbstractSimulationDataAdapter
-	{
-		internal VehicleData CreateVehicleData(IVehicleEngineeringInputData data)
-		{
-			if (data.SavedInDeclarationMode) {
-				WarnEngineeringMode("VehicleData");
-			}
-
-			var retVal = SetCommonVehicleData(data);
-			retVal.BodyAndTrailerWeight = data.CurbMassExtra;
-			//retVal.CurbWeight += data.CurbMassExtra;
-			retVal.TrailerGrossVehicleWeight = 0.SI<Kilogram>();
-			retVal.Loading = data.Loading;
-			retVal.DynamicTyreRadius = data.DynamicTyreRadius;
-			var axles = data.Axles;
-
-
-			retVal.AxleData = axles.Select(axle => new Axle {
-				WheelsDimension = axle.Wheels,
-				Inertia = axle.Inertia,
-				TwinTyres = axle.TwinTyres,
-				RollResistanceCoefficient = axle.RollResistanceCoefficient,
-				AxleWeightShare = axle.AxleWeightShare,
-				TyreTestLoad = axle.TyreTestLoad,
-				//Wheels = axle.WheelsStr
-			}).ToList();
-			return retVal;
-		}
-
-		public AirdragData CreateAirdragData(IAirdragEngineeringInputData airdragData, IVehicleEngineeringInputData data)
-		{
-			var retVal = SetCommonAirdragData(airdragData);
-			retVal.CrossWindCorrectionMode = airdragData.CrossWindCorrectionMode;
-
-			switch (airdragData.CrossWindCorrectionMode) {
-				case CrossWindCorrectionMode.NoCorrection:
-					retVal.CrossWindCorrectionCurve =
-						new CrosswindCorrectionCdxALookup(airdragData.AirDragArea,
-							CrossWindCorrectionCurveReader.GetNoCorrectionCurve(airdragData.AirDragArea),
-							CrossWindCorrectionMode.NoCorrection);
-					break;
-				case CrossWindCorrectionMode.SpeedDependentCorrectionFactor:
-					retVal.CrossWindCorrectionCurve = new CrosswindCorrectionCdxALookup(airdragData.AirDragArea,
-						CrossWindCorrectionCurveReader.ReadSpeedDependentCorrectionCurve(airdragData.CrosswindCorrectionMap,
-							airdragData.AirDragArea), CrossWindCorrectionMode.SpeedDependentCorrectionFactor);
-					break;
-				case CrossWindCorrectionMode.VAirBetaLookupTable:
-					retVal.CrossWindCorrectionCurve = new CrosswindCorrectionVAirBeta(airdragData.AirDragArea,
-						CrossWindCorrectionCurveReader.ReadCdxABetaTable(airdragData.CrosswindCorrectionMap));
-					break;
-				case CrossWindCorrectionMode.DeclarationModeCorrection:
-					var height = DeclarationData.Segments.LookupHeight(data.VehicleCategory, data.AxleConfiguration,
-						data.GrossVehicleMassRating);
-					retVal.CrossWindCorrectionCurve =
-						new CrosswindCorrectionCdxALookup(airdragData.AirDragArea,
-							DeclarationDataAdapter.GetDeclarationAirResistanceCurve(
-								GetAirdragParameterSet(data.VehicleCategory, data.AxleConfiguration, data.Axles.Count),
-								airdragData.AirDragArea, height), CrossWindCorrectionMode.DeclarationModeCorrection);
-					break;
-				default:
-					throw new ArgumentOutOfRangeException("CrosswindCorrection", airdragData.CrossWindCorrectionMode.ToString());
-			}
-			return retVal;
-		}
-
-		private string GetAirdragParameterSet(VehicleCategory vehicleCategory, AxleConfiguration axles, int numAxles)
-		{
-			switch (vehicleCategory) {
-				case VehicleCategory.RigidTruck:
-					return numAxles > axles.NumAxles() ? "RigidTrailer" : "RigidSolo";
-				case VehicleCategory.Tractor:
-					return "TractorSemitrailer";
-				case VehicleCategory.CityBus:
-				case VehicleCategory.InterurbanBus:
-				case VehicleCategory.Coach:
-					return "CoachBus";
-				default:
-					throw new ArgumentOutOfRangeException("vehicleCategory", vehicleCategory, null);
-			}
-		}
-
-		private void WarnEngineeringMode(string msg)
-		{
-			Log.Error("{0} is in Declaration Mode but is used for Engineering Mode!", msg);
-		}
-
-		internal CombustionEngineData CreateEngineData(IEngineEngineeringInputData engine, IGearboxEngineeringInputData gbx,
-			IEnumerable<ITorqueLimitInputData> torqueLimits)
-		{
-			if (engine.SavedInDeclarationMode) {
-				WarnEngineeringMode("EngineData");
-			}
-
-			var retVal = SetCommonCombustionEngineData(engine);
-			retVal.Inertia = engine.Inertia +
-							(gbx != null && gbx.Type.AutomaticTransmission() ? gbx.TorqueConverter.Inertia : 0.SI<KilogramSquareMeter>());
-			var limits = torqueLimits.ToDictionary(e => e.Gear);
-			var numGears = gbx == null ? 0 : gbx.Gears.Count;
-			var fullLoadCurves = new Dictionary<uint, EngineFullLoadCurve>(numGears + 1);
-			fullLoadCurves[0] = FullLoadCurveReader.Create(engine.FullLoadCurve);
-			fullLoadCurves[0].EngineData = retVal;
-			if (gbx != null) {
-				foreach (var gear in gbx.Gears) {
-					var maxTorque = VectoMath.Min(gear.MaxTorque, limits.ContainsKey(gear.Gear) ? limits[gear.Gear].MaxTorque : null);
-					fullLoadCurves[(uint)gear.Gear] = IntersectFullLoadCurves(fullLoadCurves[0], maxTorque);
-				}
-			}
-			retVal.FullLoadCurves = fullLoadCurves;
-			retVal.FuelConsumptionCorrectionFactor = engine.WHTCEngineering;
-			return retVal;
-		}
-
-		internal GearboxData CreateGearboxData(IGearboxEngineeringInputData gearbox, CombustionEngineData engineData,
-			double axlegearRatio, Meter dynamicTyreRadius, bool useEfficiencyFallback)
-		{
-			if (gearbox.SavedInDeclarationMode) {
-				WarnEngineeringMode("GearboxData");
-			}
-
-			var retVal = SetCommonGearboxData(gearbox);
-
-			//var gears = gearbox.Gears;
-			if (gearbox.Gears.Count < 2) {
-				throw new VectoSimulationException("At least two Gear-Entries must be defined in Gearbox!");
-			}
-
-			SetEngineeringData(gearbox, retVal);
-
-			var gearDifferenceRatio = gearbox.Type.AutomaticTransmission() && gearbox.Gears.Count > 2
-				? gearbox.Gears[0].Ratio / gearbox.Gears[1].Ratio
-				: 1.0;
-
-			var gears = new Dictionary<uint, GearData>();
-			ShiftPolygon tcShiftPolygon = null;
-			if (gearbox.Type.AutomaticTransmission()) {
-				tcShiftPolygon = gearbox.TorqueConverter.ShiftPolygon != null
-					? ShiftPolygonReader.Create(gearbox.TorqueConverter.ShiftPolygon)
-					: DeclarationData.TorqueConverter.ComputeShiftPolygon(engineData.FullLoadCurves[0]);
-			}
-			for (uint i = 0; i < gearbox.Gears.Count; i++) {
-				var gear = gearbox.Gears[(int)i];
-				var lossMap = CreateGearLossMap(gear, i, useEfficiencyFallback, false);
-
-				var shiftPolygon = gear.ShiftPolygon != null && gear.ShiftPolygon.SourceType != DataSourceType.Missing
-					? ShiftPolygonReader.Create(gear.ShiftPolygon)
-					: DeclarationData.Gearbox.ComputeShiftPolygon(gearbox.Type, (int)i, engineData.FullLoadCurves[i + 1], gearbox.Gears,
-						engineData,
-						axlegearRatio, dynamicTyreRadius);
-				var gearData = new GearData {
-					ShiftPolygon = shiftPolygon,
-					MaxSpeed = gear.MaxInputSpeed,
-					Ratio = gear.Ratio,
-					LossMap = lossMap,
-				};
-
-				if (gearbox.Type == GearboxType.ATPowerSplit && i == 0) {
-					// powersplit transmission: torque converter already contains ratio and losses
-					CretateTCFirstGearATPowerSplit(gearData, i, tcShiftPolygon);
-				}
-				if (gearbox.Type == GearboxType.ATSerial) {
-					if (i == 0) {
-						// torqueconverter is active in first gear - duplicate ratio and lossmap for torque converter mode
-						CreateTCFirstGearATSerial(gearData, tcShiftPolygon);
-					}
-					if (i == 1 && gearDifferenceRatio >= DeclarationData.Gearbox.TorqueConverterSecondGearThreshold) {
-						// ratio between first and second gear is above threshold, torqueconverter is active in second gear as well
-						// -> duplicate ratio and lossmap for torque converter mode, remove locked transmission for previous gear
-						CreateTCSecondGearATSerial(gearData, tcShiftPolygon);
-						// NOTE: the lower gear in 'gears' dictionary has index i !!
-						gears[i].Ratio = double.NaN;
-						gears[i].LossMap = null;
-					}
-				}
-				gears.Add(i + 1, gearData);
-			}
-			retVal.Gears = gears;
-
-			if (retVal.Type.AutomaticTransmission()) {
-				var ratio = double.IsNaN(retVal.Gears[1].Ratio) ? 1 : retVal.Gears[1].TorqueConverterRatio / retVal.Gears[1].Ratio;
-				retVal.PowershiftShiftTime = gearbox.PowershiftShiftTime;
-				retVal.TorqueConverterData = TorqueConverterDataReader.Create(gearbox.TorqueConverter.TCData,
-					gearbox.TorqueConverter.ReferenceRPM, gearbox.TorqueConverter.MaxInputSpeed, ExecutionMode.Engineering, ratio,
-					gearbox.TorqueConverter.CLUpshiftMinAcceleration, gearbox.TorqueConverter.CCUpshiftMinAcceleration);
-			}
-
-
-			return retVal;
-		}
-
-		private static void SetEngineeringData(IGearboxEngineeringInputData gearbox, GearboxData retVal)
-		{
-			retVal.Inertia = gearbox.Type.ManualTransmission() ? gearbox.Inertia : 0.SI<KilogramSquareMeter>();
-			retVal.TractionInterruption = gearbox.TractionInterruption;
-			retVal.TorqueReserve = gearbox.TorqueReserve;
-			retVal.StartTorqueReserve = gearbox.StartTorqueReserve;
-			retVal.ShiftTime = gearbox.MinTimeBetweenGearshift;
-			retVal.StartSpeed = gearbox.StartSpeed;
-			retVal.StartAcceleration = gearbox.StartAcceleration;
-			retVal.DownshiftAfterUpshiftDelay = gearbox.DownshiftAfterUpshiftDelay;
-			retVal.UpshiftAfterDownshiftDelay = gearbox.UpshiftAfterDownshiftDelay;
-			retVal.UpshiftMinAcceleration = gearbox.UpshiftMinAcceleration;
-		}
-
-
-		public IList<VectoRunData.AuxData> CreateAuxiliaryData(IAuxiliariesEngineeringInputData auxInputData)
-		{
-			var auxList = new List<VectoRunData.AuxData>(auxInputData.Auxiliaries.Count + 1) {
-				new VectoRunData.AuxData { ID = Constants.Auxiliaries.Cycle, DemandType = AuxiliaryDemandType.Direct }
-			};
-
-			foreach (var a in auxInputData.Auxiliaries) {
-				switch (a.AuxiliaryType) {
-					case AuxiliaryDemandType.Mapping:
-						auxList.Add(CreateMappingAuxiliary(a));
-						break;
-					case AuxiliaryDemandType.Constant:
-						auxList.Add(CreateConstantAuxiliary(a));
-						break;
-					default:
-						throw new VectoException("Auxiliary type {0} not supported!", a.AuxiliaryType);
-				}
-			}
-			return auxList;
-		}
-
-		private static VectoRunData.AuxData CreateMappingAuxiliary(IAuxiliaryEngineeringInputData a)
-		{
-			if (a.DemandMap == null) {
-				throw new VectoSimulationException("Demand Map for auxiliary {0} required", a.ID);
-			}
-			if (a.DemandMap.Columns.Count != 3 || a.DemandMap.Rows.Count < 4) {
-				throw new VectoSimulationException(
-					"Demand Map for auxiliary {0} has to contain exactly 3 columns and at least 4 rows", a.ID);
-			}
-			return new VectoRunData.AuxData {
-				ID = a.ID,
-				DemandType = AuxiliaryDemandType.Mapping,
-				Data = AuxiliaryDataReader.Create(a)
-			};
-		}
-
-		private static VectoRunData.AuxData CreateConstantAuxiliary(IAuxiliaryEngineeringInputData a)
-		{
-			return new VectoRunData.AuxData {
-				ID = a.ID,
-				DemandType = AuxiliaryDemandType.Constant,
-				PowerDemand = a.ConstantPowerDemand
-			};
-		}
-
-		internal DriverData CreateDriverData(IDriverEngineeringInputData driver)
-		{
-			if (driver.SavedInDeclarationMode) {
-				WarnEngineeringMode("DriverData");
-			}
-
-			AccelerationCurveData accelerationData = null;
-			if (driver.AccelerationCurve != null) {
-				accelerationData = AccelerationCurveReader.Create(driver.AccelerationCurve);
-			}
-
-			if (driver.Lookahead == null) {
-				throw new VectoSimulationException("Error: Lookahead Data is missing.");
-			}
-			var lookAheadData = new DriverData.LACData {
-				Enabled = driver.Lookahead.Enabled,
-				//Deceleration = driver.Lookahead.Deceleration,
-				MinSpeed = driver.Lookahead.MinSpeed,
-				LookAheadDecisionFactor =
-					new LACDecisionFactor(driver.Lookahead.CoastingDecisionFactorOffset, driver.Lookahead.CoastingDecisionFactorScaling,
-						driver.Lookahead.CoastingDecisionFactorTargetSpeedLookup,
-						driver.Lookahead.CoastingDecisionFactorVelocityDropLookup),
-				LookAheadDistanceFactor = driver.Lookahead.LookaheadDistanceFactor
-			};
-			var overspeedData = new DriverData.OverSpeedEcoRollData {
-				Mode = driver.OverSpeedEcoRoll.Mode,
-				MinSpeed = driver.OverSpeedEcoRoll.MinSpeed,
-				OverSpeed = driver.OverSpeedEcoRoll.OverSpeed,
-				UnderSpeed = driver.OverSpeedEcoRoll.UnderSpeed,
-			};
-			var retVal = new DriverData {
-				AccelerationCurve = accelerationData,
-				LookAheadCoasting = lookAheadData,
-				OverSpeedEcoRoll = overspeedData,
-			};
-			return retVal;
-		}
-
-		//=================================
-		public RetarderData CreateRetarderData(IRetarderInputData retarder)
-		{
-			return SetCommonRetarderData(retarder);
-		}
-
-		public PTOData CreatePTOTransmissionData(IPTOTransmissionInputData pto)
-		{
-			if (pto.PTOTransmissionType != "None") {
-				var ptoData = new PTOData {
-					TransmissionType = pto.PTOTransmissionType,
-					LossMap = PTOIdleLossMapReader.Create(pto.PTOLossMap),
-				};
-				if (pto.PTOCycle != null) {
-					ptoData.PTOCycle = DrivingCycleDataReader.ReadFromDataTable(pto.PTOCycle, CycleType.PTO, "PTO", false);
-				}
-				return ptoData;
-			}
-
-			return null;
-		}
-
-		public AdvancedAuxData CreateAdvancedAuxData(IAuxiliariesEngineeringInputData auxInputData)
-		{
-			return new AdvancedAuxData() {
-				AdvancedAuxiliaryFilePath = auxInputData.AdvancedAuxiliaryFilePath,
-				AuxiliaryAssembly = auxInputData.AuxiliaryAssembly,
-				AuxiliaryVersion = auxInputData.AuxiliaryVersion
-			};
-		}
-	}
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using TUGraz.VectoCommon.Exceptions;
+using TUGraz.VectoCommon.InputData;
+using TUGraz.VectoCommon.Models;
+using TUGraz.VectoCommon.Utils;
+using TUGraz.VectoCore.Configuration;
+using TUGraz.VectoCore.InputData.Reader.ComponentData;
+using TUGraz.VectoCore.Models.Declaration;
+using TUGraz.VectoCore.Models.Simulation.Data;
+using TUGraz.VectoCore.Models.SimulationComponent.Data;
+using TUGraz.VectoCore.Models.SimulationComponent.Data.Engine;
+using TUGraz.VectoCore.Models.SimulationComponent.Data.Gearbox;
+
+namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter
+{
+	public class EngineeringDataAdapter : AbstractSimulationDataAdapter
+	{
+		internal VehicleData CreateVehicleData(IVehicleEngineeringInputData data)
+		{
+			if (data.SavedInDeclarationMode) {
+				WarnEngineeringMode("VehicleData");
+			}
+
+			var retVal = SetCommonVehicleData(data);
+			retVal.BodyAndTrailerWeight = data.CurbMassExtra;
+			//retVal.CurbWeight += data.CurbMassExtra;
+			retVal.TrailerGrossVehicleWeight = 0.SI<Kilogram>();
+			retVal.Loading = data.Loading;
+			retVal.DynamicTyreRadius = data.DynamicTyreRadius;
+			var axles = data.Axles;
+
+
+			retVal.AxleData = axles.Select(axle => new Axle {
+				WheelsDimension = axle.Wheels,
+				Inertia = axle.Inertia,
+				TwinTyres = axle.TwinTyres,
+				RollResistanceCoefficient = axle.RollResistanceCoefficient,
+				AxleWeightShare = axle.AxleWeightShare,
+				TyreTestLoad = axle.TyreTestLoad,
+				//Wheels = axle.WheelsStr
+			}).ToList();
+			return retVal;
+		}
+
+		public AirdragData CreateAirdragData(IAirdragEngineeringInputData airdragData, IVehicleEngineeringInputData data)
+		{
+			var retVal = SetCommonAirdragData(airdragData);
+			retVal.CrossWindCorrectionMode = airdragData.CrossWindCorrectionMode;
+
+			switch (airdragData.CrossWindCorrectionMode) {
+				case CrossWindCorrectionMode.NoCorrection:
+					retVal.CrossWindCorrectionCurve =
+						new CrosswindCorrectionCdxALookup(airdragData.AirDragArea,
+							CrossWindCorrectionCurveReader.GetNoCorrectionCurve(airdragData.AirDragArea),
+							CrossWindCorrectionMode.NoCorrection);
+					break;
+				case CrossWindCorrectionMode.SpeedDependentCorrectionFactor:
+					retVal.CrossWindCorrectionCurve = new CrosswindCorrectionCdxALookup(airdragData.AirDragArea,
+						CrossWindCorrectionCurveReader.ReadSpeedDependentCorrectionCurve(airdragData.CrosswindCorrectionMap,
+							airdragData.AirDragArea), CrossWindCorrectionMode.SpeedDependentCorrectionFactor);
+					break;
+				case CrossWindCorrectionMode.VAirBetaLookupTable:
+					retVal.CrossWindCorrectionCurve = new CrosswindCorrectionVAirBeta(airdragData.AirDragArea,
+						CrossWindCorrectionCurveReader.ReadCdxABetaTable(airdragData.CrosswindCorrectionMap));
+					break;
+				case CrossWindCorrectionMode.DeclarationModeCorrection:
+					var height = DeclarationData.Segments.LookupHeight(data.VehicleCategory, data.AxleConfiguration,
+						data.GrossVehicleMassRating);
+					retVal.CrossWindCorrectionCurve =
+						new CrosswindCorrectionCdxALookup(airdragData.AirDragArea,
+							DeclarationDataAdapter.GetDeclarationAirResistanceCurve(
+								GetAirdragParameterSet(data.VehicleCategory, data.AxleConfiguration, data.Axles.Count),
+								airdragData.AirDragArea, height), CrossWindCorrectionMode.DeclarationModeCorrection);
+					break;
+				default:
+					throw new ArgumentOutOfRangeException("CrosswindCorrection", airdragData.CrossWindCorrectionMode.ToString());
+			}
+			return retVal;
+		}
+
+		private string GetAirdragParameterSet(VehicleCategory vehicleCategory, AxleConfiguration axles, int numAxles)
+		{
+			switch (vehicleCategory) {
+				case VehicleCategory.RigidTruck:
+					return numAxles > axles.NumAxles() ? "RigidTrailer" : "RigidSolo";
+				case VehicleCategory.Tractor:
+					return "TractorSemitrailer";
+				case VehicleCategory.CityBus:
+				case VehicleCategory.InterurbanBus:
+				case VehicleCategory.Coach:
+					return "CoachBus";
+				default:
+					throw new ArgumentOutOfRangeException("vehicleCategory", vehicleCategory, null);
+			}
+		}
+
+		private void WarnEngineeringMode(string msg)
+		{
+			Log.Error("{0} is in Declaration Mode but is used for Engineering Mode!", msg);
+		}
+
+		internal CombustionEngineData CreateEngineData(IEngineEngineeringInputData engine, IGearboxEngineeringInputData gbx,
+			IEnumerable<ITorqueLimitInputData> torqueLimits)
+		{
+			if (engine.SavedInDeclarationMode) {
+				WarnEngineeringMode("EngineData");
+			}
+
+			var retVal = SetCommonCombustionEngineData(engine);
+			retVal.Inertia = engine.Inertia +
+							(gbx != null && gbx.Type.AutomaticTransmission() ? gbx.TorqueConverter.Inertia : 0.SI<KilogramSquareMeter>());
+			var limits = torqueLimits.ToDictionary(e => e.Gear);
+			var numGears = gbx == null ? 0 : gbx.Gears.Count;
+			var fullLoadCurves = new Dictionary<uint, EngineFullLoadCurve>(numGears + 1);
+			fullLoadCurves[0] = FullLoadCurveReader.Create(engine.FullLoadCurve);
+			fullLoadCurves[0].EngineData = retVal;
+			if (gbx != null) {
+				foreach (var gear in gbx.Gears) {
+					var maxTorque = VectoMath.Min(gear.MaxTorque, limits.ContainsKey(gear.Gear) ? limits[gear.Gear].MaxTorque : null);
+					fullLoadCurves[(uint)gear.Gear] = IntersectFullLoadCurves(fullLoadCurves[0], maxTorque);
+				}
+			}
+			retVal.FullLoadCurves = fullLoadCurves;
+			retVal.FuelConsumptionCorrectionFactor = engine.WHTCEngineering;
+			return retVal;
+		}
+
+		internal GearboxData CreateGearboxData(IGearboxEngineeringInputData gearbox, CombustionEngineData engineData,
+			double axlegearRatio, Meter dynamicTyreRadius, VehicleCategory vehicleCategory, bool useEfficiencyFallback)
+		{
+			if (gearbox.SavedInDeclarationMode) {
+				WarnEngineeringMode("GearboxData");
+			}
+
+			var retVal = SetCommonGearboxData(gearbox);
+
+			//var gears = gearbox.Gears;
+			if (gearbox.Gears.Count < 2) {
+				throw new VectoSimulationException("At least two Gear-Entries must be defined in Gearbox!");
+			}
+
+			SetEngineeringData(gearbox, retVal);
+
+			var gearDifferenceRatio = gearbox.Type.AutomaticTransmission() && gearbox.Gears.Count > 2
+				? gearbox.Gears[0].Ratio / gearbox.Gears[1].Ratio
+				: 1.0;
+
+			var gears = new Dictionary<uint, GearData>();
+			ShiftPolygon tcShiftPolygon = null;
+			if (gearbox.Type.AutomaticTransmission()) {
+				tcShiftPolygon = gearbox.TorqueConverter.ShiftPolygon != null
+					? ShiftPolygonReader.Create(gearbox.TorqueConverter.ShiftPolygon)
+					: DeclarationData.TorqueConverter.ComputeShiftPolygon(engineData.FullLoadCurves[0]);
+			}
+			for (uint i = 0; i < gearbox.Gears.Count; i++) {
+				var gear = gearbox.Gears[(int)i];
+				var lossMap = CreateGearLossMap(gear, i, useEfficiencyFallback, false);
+
+				var shiftPolygon = gear.ShiftPolygon != null && gear.ShiftPolygon.SourceType != DataSourceType.Missing
+					? ShiftPolygonReader.Create(gear.ShiftPolygon)
+					: DeclarationData.Gearbox.ComputeShiftPolygon(gearbox.Type, (int)i, engineData.FullLoadCurves[i + 1], gearbox.Gears,
+						engineData,
+						axlegearRatio, dynamicTyreRadius);
+				var gearData = new GearData {
+					ShiftPolygon = shiftPolygon,
+					MaxSpeed = gear.MaxInputSpeed,
+					Ratio = gear.Ratio,
+					LossMap = lossMap,
+				};
+
+				if (gearbox.Type == GearboxType.ATPowerSplit && i == 0) {
+					// powersplit transmission: torque converter already contains ratio and losses
+					CretateTCFirstGearATPowerSplit(gearData, i, tcShiftPolygon);
+				}
+				if (gearbox.Type == GearboxType.ATSerial) {
+					if (i == 0) {
+						// torqueconverter is active in first gear - duplicate ratio and lossmap for torque converter mode
+						CreateTCFirstGearATSerial(gearData, tcShiftPolygon);
+					}
+					if (i == 1 && gearDifferenceRatio >= DeclarationData.Gearbox.TorqueConverterSecondGearThreshold(vehicleCategory)) {
+						// ratio between first and second gear is above threshold, torqueconverter is active in second gear as well
+						// -> duplicate ratio and lossmap for torque converter mode, remove locked transmission for previous gear
+						CreateTCSecondGearATSerial(gearData, tcShiftPolygon);
+						// NOTE: the lower gear in 'gears' dictionary has index i !!
+						gears[i].Ratio = double.NaN;
+						gears[i].LossMap = null;
+					}
+				}
+				gears.Add(i + 1, gearData);
+			}
+			retVal.Gears = gears;
+
+			if (retVal.Type.AutomaticTransmission()) {
+				var ratio = double.IsNaN(retVal.Gears[1].Ratio) ? 1 : retVal.Gears[1].TorqueConverterRatio / retVal.Gears[1].Ratio;
+				retVal.PowershiftShiftTime = gearbox.PowershiftShiftTime;
+				retVal.TorqueConverterData = TorqueConverterDataReader.Create(gearbox.TorqueConverter.TCData,
+					gearbox.TorqueConverter.ReferenceRPM, gearbox.TorqueConverter.MaxInputSpeed, ExecutionMode.Engineering, ratio,
+					gearbox.TorqueConverter.CLUpshiftMinAcceleration, gearbox.TorqueConverter.CCUpshiftMinAcceleration);
+			}
+
+
+			return retVal;
+		}
+
+		private static void SetEngineeringData(IGearboxEngineeringInputData gearbox, GearboxData retVal)
+		{
+			retVal.Inertia = gearbox.Type.ManualTransmission() ? gearbox.Inertia : 0.SI<KilogramSquareMeter>();
+			retVal.TractionInterruption = gearbox.TractionInterruption;
+			retVal.TorqueReserve = gearbox.TorqueReserve;
+			retVal.StartTorqueReserve = gearbox.StartTorqueReserve;
+			retVal.ShiftTime = gearbox.MinTimeBetweenGearshift;
+			retVal.StartSpeed = gearbox.StartSpeed;
+			retVal.StartAcceleration = gearbox.StartAcceleration;
+			retVal.DownshiftAfterUpshiftDelay = gearbox.DownshiftAfterUpshiftDelay;
+			retVal.UpshiftAfterDownshiftDelay = gearbox.UpshiftAfterDownshiftDelay;
+			retVal.UpshiftMinAcceleration = gearbox.UpshiftMinAcceleration;
+		}
+
+
+		public IList<VectoRunData.AuxData> CreateAuxiliaryData(IAuxiliariesEngineeringInputData auxInputData)
+		{
+			var auxList = new List<VectoRunData.AuxData>(auxInputData.Auxiliaries.Count + 1) {
+				new VectoRunData.AuxData { ID = Constants.Auxiliaries.Cycle, DemandType = AuxiliaryDemandType.Direct }
+			};
+
+			foreach (var a in auxInputData.Auxiliaries) {
+				switch (a.AuxiliaryType) {
+					case AuxiliaryDemandType.Mapping:
+						auxList.Add(CreateMappingAuxiliary(a));
+						break;
+					case AuxiliaryDemandType.Constant:
+						auxList.Add(CreateConstantAuxiliary(a));
+						break;
+					default:
+						throw new VectoException("Auxiliary type {0} not supported!", a.AuxiliaryType);
+				}
+			}
+			return auxList;
+		}
+
+		private static VectoRunData.AuxData CreateMappingAuxiliary(IAuxiliaryEngineeringInputData a)
+		{
+			if (a.DemandMap == null) {
+				throw new VectoSimulationException("Demand Map for auxiliary {0} required", a.ID);
+			}
+			if (a.DemandMap.Columns.Count != 3 || a.DemandMap.Rows.Count < 4) {
+				throw new VectoSimulationException(
+					"Demand Map for auxiliary {0} has to contain exactly 3 columns and at least 4 rows", a.ID);
+			}
+			return new VectoRunData.AuxData {
+				ID = a.ID,
+				DemandType = AuxiliaryDemandType.Mapping,
+				Data = AuxiliaryDataReader.Create(a)
+			};
+		}
+
+		private static VectoRunData.AuxData CreateConstantAuxiliary(IAuxiliaryEngineeringInputData a)
+		{
+			return new VectoRunData.AuxData {
+				ID = a.ID,
+				DemandType = AuxiliaryDemandType.Constant,
+				PowerDemand = a.ConstantPowerDemand
+			};
+		}
+
+		internal DriverData CreateDriverData(IDriverEngineeringInputData driver)
+		{
+			if (driver.SavedInDeclarationMode) {
+				WarnEngineeringMode("DriverData");
+			}
+
+			AccelerationCurveData accelerationData = null;
+			if (driver.AccelerationCurve != null) {
+				accelerationData = AccelerationCurveReader.Create(driver.AccelerationCurve);
+			}
+
+			if (driver.Lookahead == null) {
+				throw new VectoSimulationException("Error: Lookahead Data is missing.");
+			}
+			var lookAheadData = new DriverData.LACData {
+				Enabled = driver.Lookahead.Enabled,
+				//Deceleration = driver.Lookahead.Deceleration,
+				MinSpeed = driver.Lookahead.MinSpeed,
+				LookAheadDecisionFactor =
+					new LACDecisionFactor(driver.Lookahead.CoastingDecisionFactorOffset, driver.Lookahead.CoastingDecisionFactorScaling,
+						driver.Lookahead.CoastingDecisionFactorTargetSpeedLookup,
+						driver.Lookahead.CoastingDecisionFactorVelocityDropLookup),
+				LookAheadDistanceFactor = driver.Lookahead.LookaheadDistanceFactor
+			};
+			var overspeedData = new DriverData.OverSpeedEcoRollData {
+				Mode = driver.OverSpeedEcoRoll.Mode,
+				MinSpeed = driver.OverSpeedEcoRoll.MinSpeed,
+				OverSpeed = driver.OverSpeedEcoRoll.OverSpeed,
+				UnderSpeed = driver.OverSpeedEcoRoll.UnderSpeed,
+			};
+			var retVal = new DriverData {
+				AccelerationCurve = accelerationData,
+				LookAheadCoasting = lookAheadData,
+				OverSpeedEcoRoll = overspeedData,
+			};
+			return retVal;
+		}
+
+		//=================================
+		public RetarderData CreateRetarderData(IRetarderInputData retarder)
+		{
+			return SetCommonRetarderData(retarder);
+		}
+
+		public PTOData CreatePTOTransmissionData(IPTOTransmissionInputData pto)
+		{
+			if (pto.PTOTransmissionType != "None") {
+				var ptoData = new PTOData {
+					TransmissionType = pto.PTOTransmissionType,
+					LossMap = PTOIdleLossMapReader.Create(pto.PTOLossMap),
+				};
+				if (pto.PTOCycle != null) {
+					ptoData.PTOCycle = DrivingCycleDataReader.ReadFromDataTable(pto.PTOCycle, CycleType.PTO, "PTO", false);
+				}
+				return ptoData;
+			}
+
+			return null;
+		}
+
+		public AdvancedAuxData CreateAdvancedAuxData(IAuxiliariesEngineeringInputData auxInputData)
+		{
+			return new AdvancedAuxData() {
+				AdvancedAuxiliaryFilePath = auxInputData.AdvancedAuxiliaryFilePath,
+				AuxiliaryAssembly = auxInputData.AuxiliaryAssembly,
+				AuxiliaryVersion = auxInputData.AuxiliaryVersion
+			};
+		}
+	}
 }
\ No newline at end of file
diff --git a/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationModeVectoRunDataFactory.cs b/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationModeVectoRunDataFactory.cs
index 99b9a05a567f7fdae998099264f16f84e5a7ae94..8a61d30f9378869da8e4711a1e544f2c475383d3 100644
--- a/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationModeVectoRunDataFactory.cs
+++ b/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationModeVectoRunDataFactory.cs
@@ -29,174 +29,174 @@
 *   Martin Rexeis, rexeis@ivt.tugraz.at, IVT, Graz University of Technology
 */
 
-using System;
-using System.Collections.Generic;
-using System.Linq;
-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.Declaration;
-using TUGraz.VectoCore.Models.Simulation.Data;
-using TUGraz.VectoCore.Models.SimulationComponent.Data;
-using TUGraz.VectoCore.OutputData;
-using TUGraz.VectoCore.Utils;
-
-
-namespace TUGraz.VectoCore.InputData.Reader.Impl
-{
-	public class DeclarationModeVectoRunDataFactory : LoggingObject, IVectoRunDataFactory
-	{
-		private static readonly object CyclesCacheLock = new object();
-
-		private static readonly Dictionary<MissionType, DrivingCycleData> CyclesCache =
-			new Dictionary<MissionType, DrivingCycleData>();
-
-		protected readonly IDeclarationInputDataProvider InputDataProvider;
-
-		protected IDeclarationReport Report;
-		private DeclarationDataAdapter _dao;
-		private Segment _segment;
-		private DriverData _driverdata;
-		private AirdragData _airdragData;
-		private CombustionEngineData _engineData;
-		private AxleGearData _axlegearData;
-		private AngledriveData _angledriveData;
-		private GearboxData _gearboxData;
-		private RetarderData _retarderData;
-		private PTOData _ptoTransmissionData;
-		private PTOData _municipalPtoTransmissionData;
-		private Exception InitException;
-
-		internal DeclarationModeVectoRunDataFactory(IDeclarationInputDataProvider dataProvider, IDeclarationReport report)
-		{
-			InputDataProvider = dataProvider;
-			Report = report;
-
-			try {
-				Initialize();
-				if (Report != null) {
-					InitializeReport();
-				}
-			} catch (Exception e) {
-				InitException = e;
-			}
-		}
-
-		private void Initialize()
-		{
-			_dao = new DeclarationDataAdapter();
-			_segment = GetVehicleClassification(InputDataProvider.VehicleInputData.VehicleCategory,
-				InputDataProvider.VehicleInputData.AxleConfiguration,
-				InputDataProvider.VehicleInputData.GrossVehicleMassRating, InputDataProvider.VehicleInputData.CurbMassChassis);
-			_driverdata = _dao.CreateDriverData(InputDataProvider.DriverInputData);
-			_driverdata.AccelerationCurve = AccelerationCurveReader.ReadFromStream(_segment.AccelerationFile);
-
-			var tempVehicle = _dao.CreateVehicleData(InputDataProvider.VehicleInputData, _segment.Missions.First(),
-				_segment.Missions.First().Loadings.First().Value, _segment.MunicipalBodyWeight);
-			_airdragData = _dao.CreateAirdragData(InputDataProvider.AirdragInputData, _segment.Missions.First(), _segment);
-			_engineData = _dao.CreateEngineData(InputDataProvider.EngineInputData,
-				InputDataProvider.VehicleInputData.EngineIdleSpeed,
-				InputDataProvider.GearboxInputData, InputDataProvider.VehicleInputData.TorqueLimits);
-			_axlegearData = _dao.CreateAxleGearData(InputDataProvider.AxleGearInputData, false);
-			_angledriveData = _dao.CreateAngledriveData(InputDataProvider.AngledriveInputData, false);
-			_gearboxData = _dao.CreateGearboxData(InputDataProvider.GearboxInputData, _engineData, _axlegearData.AxleGear.Ratio,
-				tempVehicle.DynamicTyreRadius, false);
-			_retarderData = _dao.CreateRetarderData(InputDataProvider.RetarderInputData);
-
-			_ptoTransmissionData = _dao.CreatePTOTransmissionData(InputDataProvider.PTOTransmissionInputData);
-
-			_municipalPtoTransmissionData = CreateDefaultPTOData();
-		}
-
-		private void InitializeReport()
-		{
-			var powertrainConfig = new VectoRunData() {
-				VehicleData =
-					_dao.CreateVehicleData(InputDataProvider.VehicleInputData, _segment.Missions.First(),
-						_segment.Missions.First().Loadings.First().Value, _segment.MunicipalBodyWeight),
-				AirdragData = _airdragData,
-				EngineData = _engineData,
-				GearboxData = _gearboxData,
-				AxleGearData = _axlegearData,
-				Retarder = _retarderData,
-				Aux = _dao.CreateAuxiliaryData(InputDataProvider.AuxiliaryInputData(), _segment.Missions.First().MissionType,
-					_segment.VehicleClass),
-				InputDataHash = InputDataProvider.XMLHash
-			};
-			Report.InitializeReport(powertrainConfig, _segment);
-		}
-
-		public IEnumerable<VectoRunData> NextRun()
-		{
-			if (InitException != null) {
-				throw InitException;
-			}
-
-			foreach (var mission in _segment.Missions) {
-				if (mission.MissionType.IsEMS() &&
-					_engineData.RatedPowerDeclared.IsSmaller(DeclarationData.MinEnginePowerForEMS)) {
-					continue;
-				}
-				DrivingCycleData cycle;
-				lock (CyclesCacheLock) {
-					if (CyclesCache.ContainsKey(mission.MissionType)) {
-						cycle = CyclesCache[mission.MissionType];
-					} else {
-						cycle = DrivingCycleDataReader.ReadFromStream(mission.CycleFile, CycleType.DistanceBased, "", false);
-						CyclesCache.Add(mission.MissionType, cycle);
-					}
-				}
-				foreach (var loading in mission.Loadings) {
-					var simulationRunData = new VectoRunData {
-						Loading = loading.Key,
-						VehicleData =
-							_dao.CreateVehicleData(InputDataProvider.VehicleInputData, mission, loading.Value, _segment.MunicipalBodyWeight),
-						AirdragData = _dao.CreateAirdragData(InputDataProvider.AirdragInputData, mission, _segment),
-						EngineData = _engineData.Copy(),
-						GearboxData = _gearboxData,
-						AxleGearData = _axlegearData,
-						AngledriveData = _angledriveData,
-						Aux = _dao.CreateAuxiliaryData(InputDataProvider.AuxiliaryInputData(), mission.MissionType,
-							_segment.VehicleClass),
-						Cycle = new DrivingCycleProxy(cycle, mission.MissionType.ToString()),
-						Retarder = _retarderData,
-						DriverData = _driverdata,
-						ExecutionMode = ExecutionMode.Declaration,
-						JobName = InputDataProvider.JobInputData().JobName,
-						ModFileSuffix = loading.Key.ToString(),
-						Report = Report,
-						Mission = mission,
-						PTO = mission.MissionType == MissionType.MunicipalUtility
-							? _municipalPtoTransmissionData
-							: _ptoTransmissionData,
-						InputDataHash = InputDataProvider.XMLHash
-					};
-					simulationRunData.EngineData.FuelConsumptionCorrectionFactor = DeclarationData.WHTCCorrection.Lookup(
-						mission.MissionType.GetNonEMSMissionType(), _engineData.WHTCRural, _engineData.WHTCUrban, _engineData.WHTCMotorway) *
-																					_engineData.ColdHotCorrectionFactor;
-					simulationRunData.VehicleData.VehicleClass = _segment.VehicleClass;
-					yield return simulationRunData;
-				}
-			}
-		}
-
-		private PTOData CreateDefaultPTOData()
-		{
-			return new PTOData() {
-				TransmissionType = DeclarationData.PTO.DefaultPTOTechnology,
-				LossMap = PTOIdleLossMapReader.ReadFromStream(RessourceHelper.ReadStream(DeclarationData.PTO.DefaultPTOIdleLosses)),
-				PTOCycle =
-					DrivingCycleDataReader.ReadFromStream(RessourceHelper.ReadStream(DeclarationData.PTO.DefaultPTOActivationCycle),
-						CycleType.PTO, "PTO", false)
-			};
-		}
-
-		internal Segment GetVehicleClassification(VehicleCategory category, AxleConfiguration axles, Kilogram grossMassRating,
-			Kilogram curbWeight)
-		{
-			return DeclarationData.Segments.Lookup(category, axles, grossMassRating, curbWeight);
-		}
-	}
+using System;
+using System.Collections.Generic;
+using System.Linq;
+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.Declaration;
+using TUGraz.VectoCore.Models.Simulation.Data;
+using TUGraz.VectoCore.Models.SimulationComponent.Data;
+using TUGraz.VectoCore.OutputData;
+using TUGraz.VectoCore.Utils;
+
+
+namespace TUGraz.VectoCore.InputData.Reader.Impl
+{
+	public class DeclarationModeVectoRunDataFactory : LoggingObject, IVectoRunDataFactory
+	{
+		private static readonly object CyclesCacheLock = new object();
+
+		private static readonly Dictionary<MissionType, DrivingCycleData> CyclesCache =
+			new Dictionary<MissionType, DrivingCycleData>();
+
+		protected readonly IDeclarationInputDataProvider InputDataProvider;
+
+		protected IDeclarationReport Report;
+		private DeclarationDataAdapter _dao;
+		private Segment _segment;
+		private DriverData _driverdata;
+		private AirdragData _airdragData;
+		private CombustionEngineData _engineData;
+		private AxleGearData _axlegearData;
+		private AngledriveData _angledriveData;
+		private GearboxData _gearboxData;
+		private RetarderData _retarderData;
+		private PTOData _ptoTransmissionData;
+		private PTOData _municipalPtoTransmissionData;
+		private Exception InitException;
+
+		internal DeclarationModeVectoRunDataFactory(IDeclarationInputDataProvider dataProvider, IDeclarationReport report)
+		{
+			InputDataProvider = dataProvider;
+			Report = report;
+
+			try {
+				Initialize();
+				if (Report != null) {
+					InitializeReport();
+				}
+			} catch (Exception e) {
+				InitException = e;
+			}
+		}
+
+		private void Initialize()
+		{
+			_dao = new DeclarationDataAdapter();
+			_segment = GetVehicleClassification(InputDataProvider.VehicleInputData.VehicleCategory,
+				InputDataProvider.VehicleInputData.AxleConfiguration,
+				InputDataProvider.VehicleInputData.GrossVehicleMassRating, InputDataProvider.VehicleInputData.CurbMassChassis);
+			_driverdata = _dao.CreateDriverData(InputDataProvider.DriverInputData);
+			_driverdata.AccelerationCurve = AccelerationCurveReader.ReadFromStream(_segment.AccelerationFile);
+
+			var tempVehicle = _dao.CreateVehicleData(InputDataProvider.VehicleInputData, _segment.Missions.First(),
+				_segment.Missions.First().Loadings.First().Value, _segment.MunicipalBodyWeight);
+			_airdragData = _dao.CreateAirdragData(InputDataProvider.AirdragInputData, _segment.Missions.First(), _segment);
+			_engineData = _dao.CreateEngineData(InputDataProvider.EngineInputData,
+				InputDataProvider.VehicleInputData.EngineIdleSpeed,
+				InputDataProvider.GearboxInputData, InputDataProvider.VehicleInputData.TorqueLimits);
+			_axlegearData = _dao.CreateAxleGearData(InputDataProvider.AxleGearInputData, false);
+			_angledriveData = _dao.CreateAngledriveData(InputDataProvider.AngledriveInputData, false);
+			_gearboxData = _dao.CreateGearboxData(InputDataProvider.GearboxInputData, _engineData, _axlegearData.AxleGear.Ratio,
+				tempVehicle.DynamicTyreRadius, tempVehicle.VehicleCategory, false);
+			_retarderData = _dao.CreateRetarderData(InputDataProvider.RetarderInputData);
+
+			_ptoTransmissionData = _dao.CreatePTOTransmissionData(InputDataProvider.PTOTransmissionInputData);
+
+			_municipalPtoTransmissionData = CreateDefaultPTOData();
+		}
+
+		private void InitializeReport()
+		{
+			var powertrainConfig = new VectoRunData() {
+				VehicleData =
+					_dao.CreateVehicleData(InputDataProvider.VehicleInputData, _segment.Missions.First(),
+						_segment.Missions.First().Loadings.First().Value, _segment.MunicipalBodyWeight),
+				AirdragData = _airdragData,
+				EngineData = _engineData,
+				GearboxData = _gearboxData,
+				AxleGearData = _axlegearData,
+				Retarder = _retarderData,
+				Aux = _dao.CreateAuxiliaryData(InputDataProvider.AuxiliaryInputData(), _segment.Missions.First().MissionType,
+					_segment.VehicleClass),
+				InputDataHash = InputDataProvider.XMLHash
+			};
+			Report.InitializeReport(powertrainConfig, _segment);
+		}
+
+		public IEnumerable<VectoRunData> NextRun()
+		{
+			if (InitException != null) {
+				throw InitException;
+			}
+
+			foreach (var mission in _segment.Missions) {
+				if (mission.MissionType.IsEMS() &&
+					_engineData.RatedPowerDeclared.IsSmaller(DeclarationData.MinEnginePowerForEMS)) {
+					continue;
+				}
+				DrivingCycleData cycle;
+				lock (CyclesCacheLock) {
+					if (CyclesCache.ContainsKey(mission.MissionType)) {
+						cycle = CyclesCache[mission.MissionType];
+					} else {
+						cycle = DrivingCycleDataReader.ReadFromStream(mission.CycleFile, CycleType.DistanceBased, "", false);
+						CyclesCache.Add(mission.MissionType, cycle);
+					}
+				}
+				foreach (var loading in mission.Loadings) {
+					var simulationRunData = new VectoRunData {
+						Loading = loading.Key,
+						VehicleData =
+							_dao.CreateVehicleData(InputDataProvider.VehicleInputData, mission, loading.Value, _segment.MunicipalBodyWeight),
+						AirdragData = _dao.CreateAirdragData(InputDataProvider.AirdragInputData, mission, _segment),
+						EngineData = _engineData.Copy(),
+						GearboxData = _gearboxData,
+						AxleGearData = _axlegearData,
+						AngledriveData = _angledriveData,
+						Aux = _dao.CreateAuxiliaryData(InputDataProvider.AuxiliaryInputData(), mission.MissionType,
+							_segment.VehicleClass),
+						Cycle = new DrivingCycleProxy(cycle, mission.MissionType.ToString()),
+						Retarder = _retarderData,
+						DriverData = _driverdata,
+						ExecutionMode = ExecutionMode.Declaration,
+						JobName = InputDataProvider.JobInputData().JobName,
+						ModFileSuffix = loading.Key.ToString(),
+						Report = Report,
+						Mission = mission,
+						PTO = mission.MissionType == MissionType.MunicipalUtility
+							? _municipalPtoTransmissionData
+							: _ptoTransmissionData,
+						InputDataHash = InputDataProvider.XMLHash
+					};
+					simulationRunData.EngineData.FuelConsumptionCorrectionFactor = DeclarationData.WHTCCorrection.Lookup(
+						mission.MissionType.GetNonEMSMissionType(), _engineData.WHTCRural, _engineData.WHTCUrban, _engineData.WHTCMotorway) *
+																					_engineData.ColdHotCorrectionFactor;
+					simulationRunData.VehicleData.VehicleClass = _segment.VehicleClass;
+					yield return simulationRunData;
+				}
+			}
+		}
+
+		private PTOData CreateDefaultPTOData()
+		{
+			return new PTOData() {
+				TransmissionType = DeclarationData.PTO.DefaultPTOTechnology,
+				LossMap = PTOIdleLossMapReader.ReadFromStream(RessourceHelper.ReadStream(DeclarationData.PTO.DefaultPTOIdleLosses)),
+				PTOCycle =
+					DrivingCycleDataReader.ReadFromStream(RessourceHelper.ReadStream(DeclarationData.PTO.DefaultPTOActivationCycle),
+						CycleType.PTO, "PTO", false)
+			};
+		}
+
+		internal Segment GetVehicleClassification(VehicleCategory category, AxleConfiguration axles, Kilogram grossMassRating,
+			Kilogram curbWeight)
+		{
+			return DeclarationData.Segments.Lookup(category, axles, grossMassRating, curbWeight);
+		}
+	}
 }
\ No newline at end of file
diff --git a/VectoCore/VectoCore/InputData/Reader/Impl/EngineeringModeVectoRunDataFactory.cs b/VectoCore/VectoCore/InputData/Reader/Impl/EngineeringModeVectoRunDataFactory.cs
index 9a1a7935dbb04f8c4b24252b2334b0d3601559bb..dfcd0c3c747e29c04e293b8c6fff25400f979587 100644
--- a/VectoCore/VectoCore/InputData/Reader/Impl/EngineeringModeVectoRunDataFactory.cs
+++ b/VectoCore/VectoCore/InputData/Reader/Impl/EngineeringModeVectoRunDataFactory.cs
@@ -29,72 +29,72 @@
 *   Martin Rexeis, rexeis@ivt.tugraz.at, IVT, Graz University of Technology
 */
 
-using System.Collections.Generic;
-using System.Linq;
-using System.Runtime.CompilerServices;
-using TUGraz.VectoCommon.InputData;
-using TUGraz.VectoCommon.Models;
-using TUGraz.VectoCore.InputData.Reader.DataObjectAdapter;
-using TUGraz.VectoCore.Models.Simulation.Data;
-using TUGraz.VectoCore.Models.SimulationComponent.Data;
-
-[assembly: InternalsVisibleTo("VectoCoreTest")]
-
-namespace TUGraz.VectoCore.InputData.Reader.Impl
-{
-	public class EngineeringModeVectoRunDataFactory : LoggingObject, IVectoRunDataFactory
-	{
-		private static readonly Dictionary<string, DrivingCycleData> CyclesCache = new Dictionary<string, DrivingCycleData>();
-
-		protected readonly IEngineeringInputDataProvider InputDataProvider;
-
-		internal EngineeringModeVectoRunDataFactory(IEngineeringInputDataProvider dataProvider)
-		{
-			InputDataProvider = dataProvider;
-		}
-
-		/// <summary>
-		/// Iterate over all cycles defined in the JobFile and create a container with all data required for creating a simulation run
-		/// </summary>
-		/// <returns>VectoRunData instance for initializing the powertrain.</returns>
-		public virtual IEnumerable<VectoRunData> NextRun()
-		{
-			var dao = new EngineeringDataAdapter();
-			var driver = dao.CreateDriverData(InputDataProvider.DriverInputData);
-			var engineData = dao.CreateEngineData(InputDataProvider.EngineInputData, InputDataProvider.GearboxInputData,
-				InputDataProvider.VehicleInputData.TorqueLimits);
-
-			var tempVehicle = dao.CreateVehicleData(InputDataProvider.VehicleInputData);
-
-			var axlegearData = dao.CreateAxleGearData(InputDataProvider.AxleGearInputData, useEfficiencyFallback: true);
-			var gearboxData = dao.CreateGearboxData(InputDataProvider.GearboxInputData, engineData, axlegearData.AxleGear.Ratio,
-				tempVehicle.DynamicTyreRadius, useEfficiencyFallback: true);
-			var crossWindRequired = InputDataProvider.AirdragInputData.CrossWindCorrectionMode ==
-									CrossWindCorrectionMode.VAirBetaLookupTable;
-			var angledriveData = dao.CreateAngledriveData(InputDataProvider.AngledriveInputData, useEfficiencyFallback: true);
-			var ptoTransmissionData = dao.CreatePTOTransmissionData(InputDataProvider.PTOTransmissionInputData);
-
-			return InputDataProvider.JobInputData().Cycles.Select(cycle => {
-				var drivingCycle = CyclesCache.ContainsKey(cycle.CycleData.Source)
-					? CyclesCache[cycle.CycleData.Source]
-					: DrivingCycleDataReader.ReadFromDataTable(cycle.CycleData, cycle.Name, crossWindRequired);
-				return new VectoRunData {
-					JobName = InputDataProvider.JobInputData().JobName,
-					EngineData = engineData,
-					GearboxData = gearboxData,
-					AxleGearData = axlegearData,
-					AngledriveData = angledriveData,
-					VehicleData = dao.CreateVehicleData(InputDataProvider.VehicleInputData),
-					AirdragData = dao.CreateAirdragData(InputDataProvider.AirdragInputData, InputDataProvider.VehicleInputData),
-					DriverData = driver,
-					Aux = dao.CreateAuxiliaryData(InputDataProvider.AuxiliaryInputData()),
-					AdvancedAux = dao.CreateAdvancedAuxData(InputDataProvider.AuxiliaryInputData()),
-					Retarder = dao.CreateRetarderData(InputDataProvider.RetarderInputData),
-					PTO = ptoTransmissionData,
-					Cycle = new DrivingCycleProxy(drivingCycle, cycle.Name),
-					ExecutionMode = ExecutionMode.Engineering
-				};
-			});
-		}
-	}
+using System.Collections.Generic;
+using System.Linq;
+using System.Runtime.CompilerServices;
+using TUGraz.VectoCommon.InputData;
+using TUGraz.VectoCommon.Models;
+using TUGraz.VectoCore.InputData.Reader.DataObjectAdapter;
+using TUGraz.VectoCore.Models.Simulation.Data;
+using TUGraz.VectoCore.Models.SimulationComponent.Data;
+
+[assembly: InternalsVisibleTo("VectoCoreTest")]
+
+namespace TUGraz.VectoCore.InputData.Reader.Impl
+{
+	public class EngineeringModeVectoRunDataFactory : LoggingObject, IVectoRunDataFactory
+	{
+		private static readonly Dictionary<string, DrivingCycleData> CyclesCache = new Dictionary<string, DrivingCycleData>();
+
+		protected readonly IEngineeringInputDataProvider InputDataProvider;
+
+		internal EngineeringModeVectoRunDataFactory(IEngineeringInputDataProvider dataProvider)
+		{
+			InputDataProvider = dataProvider;
+		}
+
+		/// <summary>
+		/// Iterate over all cycles defined in the JobFile and create a container with all data required for creating a simulation run
+		/// </summary>
+		/// <returns>VectoRunData instance for initializing the powertrain.</returns>
+		public virtual IEnumerable<VectoRunData> NextRun()
+		{
+			var dao = new EngineeringDataAdapter();
+			var driver = dao.CreateDriverData(InputDataProvider.DriverInputData);
+			var engineData = dao.CreateEngineData(InputDataProvider.EngineInputData, InputDataProvider.GearboxInputData,
+				InputDataProvider.VehicleInputData.TorqueLimits);
+
+			var tempVehicle = dao.CreateVehicleData(InputDataProvider.VehicleInputData);
+
+			var axlegearData = dao.CreateAxleGearData(InputDataProvider.AxleGearInputData, useEfficiencyFallback: true);
+			var gearboxData = dao.CreateGearboxData(InputDataProvider.GearboxInputData, engineData, axlegearData.AxleGear.Ratio,
+				tempVehicle.DynamicTyreRadius,tempVehicle.VehicleCategory, useEfficiencyFallback: true);
+			var crossWindRequired = InputDataProvider.AirdragInputData.CrossWindCorrectionMode ==
+									CrossWindCorrectionMode.VAirBetaLookupTable;
+			var angledriveData = dao.CreateAngledriveData(InputDataProvider.AngledriveInputData, useEfficiencyFallback: true);
+			var ptoTransmissionData = dao.CreatePTOTransmissionData(InputDataProvider.PTOTransmissionInputData);
+
+			return InputDataProvider.JobInputData().Cycles.Select(cycle => {
+				var drivingCycle = CyclesCache.ContainsKey(cycle.CycleData.Source)
+					? CyclesCache[cycle.CycleData.Source]
+					: DrivingCycleDataReader.ReadFromDataTable(cycle.CycleData, cycle.Name, crossWindRequired);
+				return new VectoRunData {
+					JobName = InputDataProvider.JobInputData().JobName,
+					EngineData = engineData,
+					GearboxData = gearboxData,
+					AxleGearData = axlegearData,
+					AngledriveData = angledriveData,
+					VehicleData = dao.CreateVehicleData(InputDataProvider.VehicleInputData),
+					AirdragData = dao.CreateAirdragData(InputDataProvider.AirdragInputData, InputDataProvider.VehicleInputData),
+					DriverData = driver,
+					Aux = dao.CreateAuxiliaryData(InputDataProvider.AuxiliaryInputData()),
+					AdvancedAux = dao.CreateAdvancedAuxData(InputDataProvider.AuxiliaryInputData()),
+					Retarder = dao.CreateRetarderData(InputDataProvider.RetarderInputData),
+					PTO = ptoTransmissionData,
+					Cycle = new DrivingCycleProxy(drivingCycle, cycle.Name),
+					ExecutionMode = ExecutionMode.Engineering
+				};
+			});
+		}
+	}
 }
\ No newline at end of file
diff --git a/VectoCore/VectoCore/Models/Declaration/DeclarationData.cs b/VectoCore/VectoCore/Models/Declaration/DeclarationData.cs
index 25b74b9bef713ecce1e6622284c721da5e8a4819..ea3022adb098538243405eca1eef263087ba8440 100644
--- a/VectoCore/VectoCore/Models/Declaration/DeclarationData.cs
+++ b/VectoCore/VectoCore/Models/Declaration/DeclarationData.cs
@@ -175,7 +175,10 @@ namespace TUGraz.VectoCore.Models.Declaration
 			public static readonly MeterPerSquareSecond UpshiftMinAcceleration = 0.1.SI<MeterPerSquareSecond>();
 
 			//public static readonly PerSecond TorqueConverterSpeedLimit = 1600.RPMtoRad();
-			public static readonly double TorqueConverterSecondGearThreshold = 1.8;
+			public static double TorqueConverterSecondGearThreshold(VehicleCategory category)
+			{
+				return category.IsTruck() ? 1.8 : 1.9;
+			}
 
 			public static readonly Second PowershiftShiftTime = 0.8.SI<Second>();
 
diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/ATShiftStrategy.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/ATShiftStrategy.cs
index d70578e50ffec17b881e327011aab48b359559a8..af2e454f5b6bd98c43436456f99bd9e805dae830 100644
--- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/ATShiftStrategy.cs
+++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/ATShiftStrategy.cs
@@ -29,326 +29,326 @@
 *   Martin Rexeis, rexeis@ivt.tugraz.at, IVT, Graz University of Technology
 */
 
-using System.Diagnostics.CodeAnalysis;
-using System.Linq;
-using TUGraz.VectoCommon.Exceptions;
-using TUGraz.VectoCommon.Utils;
-using TUGraz.VectoCore.Configuration;
-using TUGraz.VectoCore.Models.Simulation.DataBus;
-using TUGraz.VectoCore.Models.SimulationComponent.Data;
-
-namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
-{
-	public class ATShiftStrategy : BaseShiftStrategy
-	{
-		private ATGearbox _gearbox;
-		private readonly NextGearState _nextGear = new NextGearState();
-
-		public override IGearbox Gearbox
-		{
-			get { return _gearbox; }
-			set {
-				_gearbox = value as ATGearbox;
-				if (_gearbox == null) {
-					throw new VectoException("AT Shift strategy can only handle AT gearboxes, given: {0}", value.GetType());
-				}
-			}
-		}
-
-		public override GearInfo NextGear
-		{
-			get { return new GearInfo(_nextGear.Gear, _nextGear.TorqueConverterLocked); }
-		}
-
-		public ATShiftStrategy(GearboxData data, IDataBus dataBus) : base(data, dataBus) {}
-
-		public override uint InitGear(Second absTime, Second dt, NewtonMeter torque, PerSecond outAngularVelocity)
-		{
-			if (DataBus.VehicleSpeed.IsEqual(0)) {
-				// AT always starts in first gear and TC active!
-				_gearbox.TorqueConverterLocked = false;
-				_gearbox.Disengaged = true;
-				return 1;
-			}
-			var torqueConverterLocked = true;
-			for (var gear = ModelData.Gears.Keys.Max(); gear > 1; gear--) {
-				if (_gearbox.ModelData.Gears[gear].HasTorqueConverter) {
-					torqueConverterLocked = false;
-				}
-				var response = _gearbox.Initialize(gear, torqueConverterLocked, torque, outAngularVelocity);
-
-				if (response.EngineSpeed > DataBus.EngineRatedSpeed || response.EngineSpeed < DataBus.EngineIdleSpeed) {
-					continue;
-				}
-
-				if (!IsBelowDownShiftCurve(gear, response.EnginePowerRequest / response.EngineSpeed, response.EngineSpeed)) {
-					_gearbox.TorqueConverterLocked = torqueConverterLocked;
-					_gearbox.Disengaged = false;
-					return gear;
-				}
-			}
-			// fallback: start with first gear;
-			_gearbox.TorqueConverterLocked = false;
-			_gearbox.Disengaged = false;
-			return 1;
-		}
-
-		public override uint Engage(Second absTime, Second dt, NewtonMeter outTorque, PerSecond outAngularVelocity)
-		{
-			if (_nextGear.AbsTime != null && _nextGear.AbsTime.IsEqual(absTime)) {
-				_gearbox.TorqueConverterLocked = _nextGear.TorqueConverterLocked;
-				_gearbox.Disengaged = _nextGear.Disengaged;
-				_nextGear.AbsTime = null;
-				return _nextGear.Gear;
-			}
-			_nextGear.AbsTime = null;
-			return _gearbox.Gear;
-		}
-
-		public override void Disengage(Second absTime, Second dt, NewtonMeter outTorque, PerSecond outEngineSpeed)
-		{
-			throw new System.NotImplementedException("AT Shift Strategy does not support disengaging.");
-		}
-
-		public override bool ShiftRequired(Second absTime, Second dt, NewtonMeter outTorque, PerSecond outAngularVelocity,
-			NewtonMeter inTorque, PerSecond inAngularVelocity, uint gear, Second lastShiftTime)
-		{
-			// ENGAGE ---------------------------------------------------------
-			// 0 -> 1C: drive off after disengaged - engage first gear
-			if (_gearbox.Disengaged && outAngularVelocity.IsGreater(0.SI<PerSecond>())) {
-				Log.Debug("shift required: drive off after vehicle stopped");
-				_nextGear.SetState(absTime, disengaged: false, gear: 1, tcLocked: false);
-				return true;
-			}
-
-			// DISENGAGE ------------------------------------------------------
-			// 1) _ -> 0: disengage before halting
-			var braking = DataBus.DriverBehavior == DrivingBehavior.Braking;
-			var torqueNegative = outTorque.IsSmaller(0);
-			var slowerThanDisengageSpeed =
-				DataBus.VehicleSpeed.IsSmaller(Constants.SimulationSettings.ATGearboxDisengageWhenHaltingSpeed);
-			var disengageBeforeHalting = braking && torqueNegative && slowerThanDisengageSpeed;
-
-			// 2) L -> 0: disengage if inAngularVelocity == 0
-			var disengageAngularVelocityZero = _gearbox.TorqueConverterLocked && inAngularVelocity.IsEqual(0.SI<PerSecond>());
-
-			// 3) 1C -> 0: disengange when negative T_out and positive T_in
-			var gear1C = gear == 1 && !_gearbox.TorqueConverterLocked;
-			var disengageTOutNegativeAndTInPositive = DataBus.DriverAcceleration <= 0 && gear1C && outTorque.IsSmaller(0) &&
-													inTorque.IsGreater(0);
-
-			var disengageTCEngineSpeedLowerIdle = braking && torqueNegative && gear1C &&
-												inAngularVelocity.IsSmallerOrEqual(DataBus.EngineIdleSpeed);
-
-			if (disengageBeforeHalting || disengageTCEngineSpeedLowerIdle || disengageAngularVelocityZero ||
-				disengageTOutNegativeAndTInPositive) {
-				_nextGear.SetState(absTime, disengaged: true, gear: 1, tcLocked: false);
-				return true;
-			}
-
-			// EMERGENCY SHIFTS ---------------------------------------
-			// Emergency Downshift: if lower than engine idle speed
-			if (inAngularVelocity.IsSmaller(DataBus.EngineIdleSpeed)) {
-				Log.Debug("engine speed would fall below idle speed - shift down");
-				Downshift(absTime, gear);
-				return true;
-			}
-			// Emergency Upshift: if higher than engine rated speed
-			if (inAngularVelocity.IsGreaterOrEqual(ModelData.Gears[gear].MaxSpeed ?? DataBus.EngineRatedSpeed)) {
-				// check if upshift is possible
-				if (!ModelData.Gears.ContainsKey(gear + 1)) {
-					return false;
-				}
-				Log.Debug("engine speed would be above max speed / rated speed - shift up");
-				Upshift(absTime, gear);
-				return true;
-			}
-
-			// UPSHIFT --------------------------------------------------------
-			if (CheckUpshift(absTime, dt, outTorque, outAngularVelocity, inTorque, inAngularVelocity, gear,
-				lastShiftTime)) {
-				return true;
-			}
-
-			// DOWNSHIFT ------------------------------------------------------
-			if (CheckDownshift(absTime, dt, outTorque, outAngularVelocity, inTorque, inAngularVelocity, gear,
-				lastShiftTime)) {
-				return true;
-			}
-
-			return false;
-		}
-
-		[SuppressMessage("ReSharper", "UnusedParameter.Local")]
-		private bool CheckUpshift(Second absTime, Second dt, NewtonMeter outTorque, PerSecond outAngularVelocity,
-			NewtonMeter inTorque, PerSecond inAngularVelocity, uint gear, Second lastShiftTime)
-		{
-			var shiftTimeReached = (absTime - lastShiftTime).IsGreaterOrEqual(ModelData.ShiftTime);
-			if (!shiftTimeReached) {
-				return false;
-			}
-
-			var currentGear = ModelData.Gears[gear];
-
-			if (_gearbox.TorqueConverterLocked || currentGear.HasLockedGear) {
-				// UPSHIFT - General Rule
-				// L -> L+1 
-				// C -> L
-				var nextGear = _gearbox.TorqueConverterLocked ? gear + 1 : gear;
-				if (!ModelData.Gears.ContainsKey(nextGear)) {
-					return false;
-				}
-
-				var nextEngineSpeed = outAngularVelocity * ModelData.Gears[nextGear].Ratio;
-				if (nextEngineSpeed.IsEqual(0)) {
-					return false;
-				}
-
-				var currentEnginePower = inTorque * inAngularVelocity;
-				var nextEngineTorque = currentEnginePower / nextEngineSpeed;
-				var isAboveUpShift = IsAboveUpShiftCurve(gear, nextEngineTorque, nextEngineSpeed, _gearbox.TorqueConverterLocked);
-
-				var minAccelerationReachable = true;
-				if (!DataBus.VehicleSpeed.IsEqual(0)) {
-					var reachableAcceleration = EstimateAccelerationForGear(nextGear, outAngularVelocity);
-					var minAcceleration = _gearbox.TorqueConverterLocked
-						? ModelData.UpshiftMinAcceleration
-						: ModelData.TorqueConverterData.CLUpshiftMinAcceleration;
-					minAcceleration = VectoMath.Min(minAcceleration, DataBus.DriverAcceleration);
-					minAccelerationReachable = reachableAcceleration.IsGreaterOrEqual(minAcceleration);
-				}
-
-				if (isAboveUpShift && minAccelerationReachable) {
-					Upshift(absTime, gear);
-					return true;
-				}
-			}
-
-			// UPSHIFT - Special rule for 1C -> 2C
-			if (!_gearbox.TorqueConverterLocked && ModelData.Gears.ContainsKey(gear + 1) &&
-				ModelData.Gears[gear + 1].HasTorqueConverter && outAngularVelocity.IsGreater(0)) {
-				// C -> C+1
-				var nextGear = ModelData.Gears[gear + 1];
-				var gearRatio = nextGear.TorqueConverterRatio / currentGear.TorqueConverterRatio;
-				var minEngineSpeed = VectoMath.Min(700.RPMtoRad(), gearRatio * (DataBus.EngineN80hSpeed - 150.RPMtoRad()));
-
-				var nextGearboxInSpeed = outAngularVelocity * nextGear.TorqueConverterRatio;
-				var nextGearboxInTorque = outTorque / nextGear.TorqueConverterRatio;
-				var tcOperatingPoint = _gearbox.TorqueConverter.FindOperatingPoint(nextGearboxInTorque, nextGearboxInSpeed);
-
-				var engineSpeedOverMin = tcOperatingPoint.InAngularVelocity.IsGreater(minEngineSpeed);
-
-				var reachableAcceleration = EstimateAccelerationForGear(gear + 1, outAngularVelocity);
-				var minAcceleration = VectoMath.Min(ModelData.TorqueConverterData.CCUpshiftMinAcceleration,
-					DataBus.DriverAcceleration);
-				var minAccelerationReachable = reachableAcceleration.IsGreaterOrEqual(minAcceleration);
-
-				if (engineSpeedOverMin && minAccelerationReachable) {
-					Upshift(absTime, gear);
-					return true;
-				}
-			}
-			return false;
-		}
-
-		/// <summary>
-		/// Tests if the operating point is above (right of) the up-shift curve.
-		/// </summary>
-		/// <param name="gear">The gear.</param>
-		/// <param name="inTorque">The in torque.</param>
-		/// <param name="inEngineSpeed">The in engine speed.</param>
-		/// <param name="torqueConverterLocked">if true, the regular shift polygon is used, otherwise the shift polygon for the torque converter is used</param>
-		/// <returns><c>true</c> if the operating point is above the up-shift curve; otherwise, <c>false</c>.</returns>
-		private bool IsAboveUpShiftCurve(uint gear, NewtonMeter inTorque, PerSecond inEngineSpeed,
-			bool torqueConverterLocked)
-		{
-			var shiftPolygon = torqueConverterLocked
-				? ModelData.Gears[gear].ShiftPolygon
-				: ModelData.Gears[gear].TorqueConverterShiftPolygon;
-
-			return gear < ModelData.Gears.Keys.Max() && shiftPolygon.IsAboveUpshiftCurve(inTorque, inEngineSpeed);
-		}
-
-		private void Upshift(Second absTime, uint gear)
-		{
-			// C -> L: switch from torque converter to locked gear
-			if (!_gearbox.TorqueConverterLocked && ModelData.Gears[gear].HasLockedGear) {
-				_nextGear.SetState(absTime, disengaged: false, gear: gear, tcLocked: true);
-				return;
-			}
-
-			// L -> L+1
-			// C -> C+1
-			if (ModelData.Gears.ContainsKey(gear + 1)) {
-				_nextGear.SetState(absTime, disengaged: false, gear: gear + 1, tcLocked: _gearbox.TorqueConverterLocked);
-				return;
-			}
-
-			// C -> L+1 -- not allowed!!
-			throw new VectoSimulationException(
-				"ShiftStrategy wanted to shift up, but current gear has active torque converter (C) but no locked gear (no L) and shifting directly to (L) is not allowed.");
-		}
-
-		[SuppressMessage("ReSharper", "UnusedParameter.Local")]
-		private bool CheckDownshift(Second absTime, Second dt, NewtonMeter outTorque, PerSecond outAngularVelocity,
-			NewtonMeter inTorque, PerSecond inAngularVelocity, uint gear, Second lastShiftTime)
-		{
-			var shiftTimeReached = (absTime - lastShiftTime).IsGreaterOrEqual(ModelData.ShiftTime);
-
-			if (shiftTimeReached && IsBelowDownShiftCurve(gear, inTorque, inAngularVelocity)) {
-				Downshift(absTime, gear);
-				return true;
-			}
-
-			return false;
-		}
-
-		/// <summary>
-		/// Tests if the operating point is below (left of) the down-shift curve.
-		/// </summary>
-		/// <param name="gear">The gear.</param>
-		/// <param name="inTorque">The in torque.</param>
-		/// <param name="inEngineSpeed">The in engine speed.</param>
-		/// <returns><c>true</c> if the operating point is below the down-shift curv; otherwise, <c>false</c>.</returns>
-		private bool IsBelowDownShiftCurve(uint gear, NewtonMeter inTorque, PerSecond inEngineSpeed)
-		{
-			return gear > 1 && ModelData.Gears[gear].ShiftPolygon.IsBelowDownshiftCurve(inTorque, inEngineSpeed);
-		}
-
-		private void Downshift(Second absTime, uint gear)
-		{
-			// L -> C
-			if (_gearbox.TorqueConverterLocked && ModelData.Gears[gear].HasTorqueConverter) {
-				_nextGear.SetState(absTime, disengaged: false, gear: gear, tcLocked: false);
-				return;
-			}
-
-			// L -> L-1
-			// C -> C-1
-			if (ModelData.Gears.ContainsKey(gear - 1)) {
-				_nextGear.SetState(absTime, disengaged: false, gear: gear - 1, tcLocked: _gearbox.TorqueConverterLocked);
-				return;
-			}
-
-			// L -> 0 -- not allowed!!
-			throw new VectoSimulationException(
-				"ShiftStrategy wanted to shift down but current gear is locked (L) and has no torque converter (C) and disenganging directly from (L) is not allowed.");
-		}
-
-		private class NextGearState
-		{
-			public Second AbsTime;
-			public bool Disengaged;
-			public uint Gear;
-			public bool TorqueConverterLocked;
-
-			public void SetState(Second absTime, bool disengaged, uint gear, bool tcLocked)
-			{
-				AbsTime = absTime;
-				Disengaged = disengaged;
-				Gear = gear;
-				TorqueConverterLocked = tcLocked;
-			}
-		}
-	}
+using System.Diagnostics.CodeAnalysis;
+using System.Linq;
+using TUGraz.VectoCommon.Exceptions;
+using TUGraz.VectoCommon.Utils;
+using TUGraz.VectoCore.Configuration;
+using TUGraz.VectoCore.Models.Simulation.DataBus;
+using TUGraz.VectoCore.Models.SimulationComponent.Data;
+
+namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
+{
+	public class ATShiftStrategy : BaseShiftStrategy
+	{
+		private ATGearbox _gearbox;
+		private readonly NextGearState _nextGear = new NextGearState();
+
+		public override IGearbox Gearbox
+		{
+			get { return _gearbox; }
+			set {
+				_gearbox = value as ATGearbox;
+				if (_gearbox == null) {
+					throw new VectoException("AT Shift strategy can only handle AT gearboxes, given: {0}", value.GetType());
+				}
+			}
+		}
+
+		public override GearInfo NextGear
+		{
+			get { return new GearInfo(_nextGear.Gear, _nextGear.TorqueConverterLocked); }
+		}
+
+		public ATShiftStrategy(GearboxData data, IDataBus dataBus) : base(data, dataBus) {}
+
+		public override uint InitGear(Second absTime, Second dt, NewtonMeter torque, PerSecond outAngularVelocity)
+		{
+			if (DataBus.VehicleSpeed.IsEqual(0)) {
+				// AT always starts in first gear and TC active!
+				_gearbox.TorqueConverterLocked = false;
+				_gearbox.Disengaged = true;
+				return 1;
+			}
+			var torqueConverterLocked = true;
+			for (var gear = ModelData.Gears.Keys.Max(); gear > 1; gear--) {
+				if (_gearbox.ModelData.Gears[gear].HasTorqueConverter) {
+					torqueConverterLocked = false;
+				}
+				var response = _gearbox.Initialize(gear, torqueConverterLocked, torque, outAngularVelocity);
+
+				if (response.EngineSpeed > DataBus.EngineRatedSpeed || response.EngineSpeed < DataBus.EngineIdleSpeed) {
+					continue;
+				}
+
+				if (!IsBelowDownShiftCurve(gear, response.EnginePowerRequest / response.EngineSpeed, response.EngineSpeed)) {
+					_gearbox.TorqueConverterLocked = torqueConverterLocked;
+					_gearbox.Disengaged = false;
+					return gear;
+				}
+			}
+			// fallback: start with first gear;
+			_gearbox.TorqueConverterLocked = false;
+			_gearbox.Disengaged = false;
+			return 1;
+		}
+
+		public override uint Engage(Second absTime, Second dt, NewtonMeter outTorque, PerSecond outAngularVelocity)
+		{
+			if (_nextGear.AbsTime != null && _nextGear.AbsTime.IsEqual(absTime)) {
+				_gearbox.TorqueConverterLocked = _nextGear.TorqueConverterLocked;
+				_gearbox.Disengaged = _nextGear.Disengaged;
+				_nextGear.AbsTime = null;
+				return _nextGear.Gear;
+			}
+			_nextGear.AbsTime = null;
+			return _gearbox.Gear;
+		}
+
+		public override void Disengage(Second absTime, Second dt, NewtonMeter outTorque, PerSecond outEngineSpeed)
+		{
+			throw new System.NotImplementedException("AT Shift Strategy does not support disengaging.");
+		}
+
+		public override bool ShiftRequired(Second absTime, Second dt, NewtonMeter outTorque, PerSecond outAngularVelocity,
+			NewtonMeter inTorque, PerSecond inAngularVelocity, uint gear, Second lastShiftTime)
+		{
+			// ENGAGE ---------------------------------------------------------
+			// 0 -> 1C: drive off after disengaged - engage first gear
+			if (_gearbox.Disengaged && outAngularVelocity.IsGreater(0.SI<PerSecond>())) {
+				Log.Debug("shift required: drive off after vehicle stopped");
+				_nextGear.SetState(absTime, disengaged: false, gear: 1, tcLocked: false);
+				return true;
+			}
+
+			// DISENGAGE ------------------------------------------------------
+			// 1) _ -> 0: disengage before halting
+			var braking = DataBus.DriverBehavior == DrivingBehavior.Braking;
+			var torqueNegative = outTorque.IsSmaller(0);
+			var slowerThanDisengageSpeed =
+				DataBus.VehicleSpeed.IsSmaller(Constants.SimulationSettings.ATGearboxDisengageWhenHaltingSpeed);
+			var disengageBeforeHalting = braking && torqueNegative && slowerThanDisengageSpeed;
+
+			// 2) L -> 0: disengage if inAngularVelocity == 0
+			var disengageAngularVelocityZero = _gearbox.TorqueConverterLocked && inAngularVelocity.IsEqual(0.SI<PerSecond>());
+
+			// 3) 1C -> 0: disengange when negative T_out and positive T_in
+			var gear1C = gear == 1 && !_gearbox.TorqueConverterLocked;
+			var disengageTOutNegativeAndTInPositive = DataBus.DriverAcceleration <= 0 && gear1C && outTorque.IsSmaller(0) &&
+													inTorque.IsGreater(0);
+
+			var disengageTCEngineSpeedLowerIdle = braking && torqueNegative && gear1C &&
+												inAngularVelocity.IsSmallerOrEqual(DataBus.EngineIdleSpeed);
+
+			if (disengageBeforeHalting || disengageTCEngineSpeedLowerIdle || disengageAngularVelocityZero ||
+				disengageTOutNegativeAndTInPositive) {
+				_nextGear.SetState(absTime, disengaged: true, gear: 1, tcLocked: false);
+				return true;
+			}
+
+			// EMERGENCY SHIFTS ---------------------------------------
+			// Emergency Downshift: if lower than engine idle speed
+			if (inAngularVelocity.IsSmaller(DataBus.EngineIdleSpeed)) {
+				Log.Debug("engine speed would fall below idle speed - shift down");
+				Downshift(absTime, gear);
+				return true;
+			}
+			// Emergency Upshift: if higher than engine rated speed
+			if (inAngularVelocity.IsGreaterOrEqual(ModelData.Gears[gear].MaxSpeed ?? DataBus.EngineRatedSpeed)) {
+				// check if upshift is possible
+				if (!ModelData.Gears.ContainsKey(gear + 1)) {
+					return false;
+				}
+				Log.Debug("engine speed would be above max speed / rated speed - shift up");
+				Upshift(absTime, gear);
+				return true;
+			}
+
+			// UPSHIFT --------------------------------------------------------
+			if (CheckUpshift(absTime, dt, outTorque, outAngularVelocity, inTorque, inAngularVelocity, gear,
+				lastShiftTime)) {
+				return true;
+			}
+
+			// DOWNSHIFT ------------------------------------------------------
+			if (CheckDownshift(absTime, dt, outTorque, outAngularVelocity, inTorque, inAngularVelocity, gear,
+				lastShiftTime)) {
+				return true;
+			}
+
+			return false;
+		}
+
+		[SuppressMessage("ReSharper", "UnusedParameter.Local")]
+		private bool CheckUpshift(Second absTime, Second dt, NewtonMeter outTorque, PerSecond outAngularVelocity,
+			NewtonMeter inTorque, PerSecond inAngularVelocity, uint gear, Second lastShiftTime)
+		{
+			var shiftTimeReached = (absTime - lastShiftTime).IsGreaterOrEqual(ModelData.ShiftTime);
+			if (!shiftTimeReached) {
+				return false;
+			}
+
+			var currentGear = ModelData.Gears[gear];
+
+			if (_gearbox.TorqueConverterLocked || currentGear.HasLockedGear) {
+				// UPSHIFT - General Rule
+				// L -> L+1 
+				// C -> L
+				var nextGear = _gearbox.TorqueConverterLocked ? gear + 1 : gear;
+				if (!ModelData.Gears.ContainsKey(nextGear)) {
+					return false;
+				}
+
+				var nextEngineSpeed = outAngularVelocity * ModelData.Gears[nextGear].Ratio;
+				if (nextEngineSpeed.IsEqual(0)) {
+					return false;
+				}
+
+				var currentEnginePower = inTorque * inAngularVelocity;
+				var nextEngineTorque = currentEnginePower / nextEngineSpeed;
+				var isAboveUpShift = IsAboveUpShiftCurve(gear, nextEngineTorque, nextEngineSpeed, _gearbox.TorqueConverterLocked);
+
+				var minAccelerationReachable = true;
+				if (!DataBus.VehicleSpeed.IsEqual(0)) {
+					var reachableAcceleration = EstimateAccelerationForGear(nextGear, outAngularVelocity);
+					var minAcceleration = _gearbox.TorqueConverterLocked
+						? ModelData.UpshiftMinAcceleration
+						: ModelData.TorqueConverterData.CLUpshiftMinAcceleration;
+					minAcceleration = VectoMath.Min(minAcceleration, DataBus.DriverAcceleration);
+					minAccelerationReachable = reachableAcceleration.IsGreaterOrEqual(minAcceleration);
+				}
+
+				if (isAboveUpShift && minAccelerationReachable) {
+					Upshift(absTime, gear);
+					return true;
+				}
+			}
+
+			// UPSHIFT - Special rule for 1C -> 2C
+			if (!_gearbox.TorqueConverterLocked && ModelData.Gears.ContainsKey(gear + 1) &&
+				ModelData.Gears[gear + 1].HasTorqueConverter && outAngularVelocity.IsGreater(0)) {
+				// C -> C+1
+				var nextGear = ModelData.Gears[gear + 1];
+				var gearRatio = nextGear.TorqueConverterRatio / currentGear.TorqueConverterRatio;
+				var minEngineSpeed = VectoMath.Min(700.RPMtoRad(), gearRatio * (DataBus.EngineN80hSpeed - 150.RPMtoRad()));
+
+				var nextGearboxInSpeed = outAngularVelocity * nextGear.TorqueConverterRatio;
+				var nextGearboxInTorque = outTorque / nextGear.TorqueConverterRatio;
+				var tcOperatingPoint = _gearbox.TorqueConverter.FindOperatingPoint(nextGearboxInTorque, nextGearboxInSpeed);
+
+				var engineSpeedOverMin = tcOperatingPoint.InAngularVelocity.IsGreater(minEngineSpeed);
+
+				var reachableAcceleration = EstimateAccelerationForGear(gear + 1, outAngularVelocity);
+				var minAcceleration = VectoMath.Min(ModelData.TorqueConverterData.CCUpshiftMinAcceleration,
+					DataBus.DriverAcceleration);
+				var minAccelerationReachable = reachableAcceleration.IsGreaterOrEqual(minAcceleration);
+
+				if (engineSpeedOverMin && minAccelerationReachable) {
+					Upshift(absTime, gear);
+					return true;
+				}
+			}
+			return false;
+		}
+
+		/// <summary>
+		/// Tests if the operating point is above (right of) the up-shift curve.
+		/// </summary>
+		/// <param name="gear">The gear.</param>
+		/// <param name="inTorque">The in torque.</param>
+		/// <param name="inEngineSpeed">The in engine speed.</param>
+		/// <param name="torqueConverterLocked">if true, the regular shift polygon is used, otherwise the shift polygon for the torque converter is used</param>
+		/// <returns><c>true</c> if the operating point is above the up-shift curve; otherwise, <c>false</c>.</returns>
+		private bool IsAboveUpShiftCurve(uint gear, NewtonMeter inTorque, PerSecond inEngineSpeed,
+			bool torqueConverterLocked)
+		{
+			var shiftPolygon = torqueConverterLocked
+				? ModelData.Gears[gear].ShiftPolygon
+				: ModelData.Gears[gear].TorqueConverterShiftPolygon;
+
+			return gear < ModelData.Gears.Keys.Max() && shiftPolygon.IsAboveUpshiftCurve(inTorque, inEngineSpeed);
+		}
+
+		private void Upshift(Second absTime, uint gear)
+		{
+			// C -> L: switch from torque converter to locked gear
+			if (!_gearbox.TorqueConverterLocked && ModelData.Gears[gear].HasLockedGear) {
+				_nextGear.SetState(absTime, disengaged: false, gear: gear, tcLocked: true);
+				return;
+			}
+
+			// L -> L+1
+			// C -> C+1
+			if (ModelData.Gears.ContainsKey(gear + 1)) {
+				_nextGear.SetState(absTime, disengaged: false, gear: gear + 1, tcLocked: _gearbox.TorqueConverterLocked);
+				return;
+			}
+
+			// C -> L+1 -- not allowed!!
+			throw new VectoSimulationException(
+				"ShiftStrategy wanted to shift up, but current gear has active torque converter (C) but no locked gear (no L) and shifting directly to (L) is not allowed.");
+		}
+
+		[SuppressMessage("ReSharper", "UnusedParameter.Local")]
+		private bool CheckDownshift(Second absTime, Second dt, NewtonMeter outTorque, PerSecond outAngularVelocity,
+			NewtonMeter inTorque, PerSecond inAngularVelocity, uint gear, Second lastShiftTime)
+		{
+			var shiftTimeReached = (absTime - lastShiftTime).IsGreaterOrEqual(ModelData.ShiftTime);
+
+			if (shiftTimeReached && IsBelowDownShiftCurve(gear, inTorque, inAngularVelocity)) {
+				Downshift(absTime, gear);
+				return true;
+			}
+
+			return false;
+		}
+
+		/// <summary>
+		/// Tests if the operating point is below (left of) the down-shift curve.
+		/// </summary>
+		/// <param name="gear">The gear.</param>
+		/// <param name="inTorque">The in torque.</param>
+		/// <param name="inEngineSpeed">The in engine speed.</param>
+		/// <returns><c>true</c> if the operating point is below the down-shift curv; otherwise, <c>false</c>.</returns>
+		private bool IsBelowDownShiftCurve(uint gear, NewtonMeter inTorque, PerSecond inEngineSpeed)
+		{
+			return gear > 1 && ModelData.Gears[gear].ShiftPolygon.IsBelowDownshiftCurve(inTorque, inEngineSpeed);
+		}
+
+		private void Downshift(Second absTime, uint gear)
+		{
+			// L -> C
+			if (_gearbox.TorqueConverterLocked && ModelData.Gears[gear].HasTorqueConverter) {
+				_nextGear.SetState(absTime, disengaged: false, gear: gear, tcLocked: false);
+				return;
+			}
+
+			// L -> L-1
+			// C -> C-1
+			if (ModelData.Gears.ContainsKey(gear - 1)) {
+				_nextGear.SetState(absTime, disengaged: false, gear: gear - 1, tcLocked: _gearbox.TorqueConverterLocked);
+				return;
+			}
+
+			// L -> 0 -- not allowed!!
+			throw new VectoSimulationException(
+				"ShiftStrategy wanted to shift down but current gear is locked (L) and has no torque converter (C) and disenganging directly from (L) is not allowed.");
+		}
+
+		private class NextGearState
+		{
+			public Second AbsTime;
+			public bool Disengaged;
+			public uint Gear;
+			public bool TorqueConverterLocked;
+
+			public void SetState(Second absTime, bool disengaged, uint gear, bool tcLocked)
+			{
+				AbsTime = absTime;
+				Disengaged = disengaged;
+				Gear = gear;
+				TorqueConverterLocked = tcLocked;
+			}
+		}
+	}
 }
\ No newline at end of file
diff --git a/VectoCore/VectoCore/OutputData/XML/XMLFullReport.cs b/VectoCore/VectoCore/OutputData/XML/XMLFullReport.cs
index 2dc022a0de6aefedd23278404165c24ac7b09dd1..e1706b0b50ec110af1abc5b57d8538d22dfb80bf 100644
--- a/VectoCore/VectoCore/OutputData/XML/XMLFullReport.cs
+++ b/VectoCore/VectoCore/OutputData/XML/XMLFullReport.cs
@@ -90,8 +90,8 @@ namespace TUGraz.VectoCore.OutputData.XML
 					GetAirDragDescription(modelData.AirdragData),
 					GetAxleWheelsDescription(modelData.VehicleData),
 					GetAuxiliariesDescription(modelData.Aux)
-				)
-			);
+					)
+				);
 			InputDataIntegrity = new XElement(tns + "InputDataSignature",
 				modelData.InputDataHash == null ? CreateDummySig() : new XElement(modelData.InputDataHash));
 		}
@@ -102,7 +102,7 @@ namespace TUGraz.VectoCore.OutputData.XML
 				new XElement(di + XMLNames.DI_Signature_Reference_DigestMethod,
 					new XAttribute(XMLNames.DI_Signature_Algorithm_Attr, "null")),
 				new XElement(di + XMLNames.DI_Signature_Reference_DigestValue, "NOT AVAILABLE")
-			);
+				);
 		}
 
 		private XElement GetTorqueLimits(CombustionEngineData modelData)
@@ -133,7 +133,7 @@ namespace TUGraz.VectoCore.OutputData.XML
 				new XElement(tns + XMLNames.Engine_Displacement,
 					engineData.Displacement.ConvertTo().Cubic.Centi.Meter.ToXMLFormat(0)),
 				new XElement(tns + XMLNames.Engine_FuelType, engineData.FuelType.ToXMLFormat())
-			);
+				);
 		}
 
 		private XElement GetGearboxDescription(GearboxData gearboxData)
@@ -143,7 +143,7 @@ namespace TUGraz.VectoCore.OutputData.XML
 				new XElement(tns + XMLNames.Gearbox_TransmissionType, gearboxData.Type.ToXMLFormat()),
 				new XElement(tns + "GearsCount", gearboxData.Gears.Count),
 				new XElement(tns + "TransmissionRatioFinalGear", gearboxData.Gears.Last().Value.Ratio.ToXMLFormat(3))
-			);
+				);
 		}
 
 		private XElement GetTorqueConverterDescription(TorqueConverterData torqueConverterData)
@@ -186,7 +186,7 @@ namespace TUGraz.VectoCore.OutputData.XML
 				return new XElement(tns + XMLNames.Component_AirDrag,
 					new XElement(tns + "CertificationMethod", airdragData.CertificationMethod.ToXMLFormat()),
 					new XElement(tns + "CdxA", airdragData.DeclaredAirdragArea.ToXMLFormat(2))
-				);
+					);
 			}
 			return new XElement(tns + XMLNames.Component_AirDrag,
 				new XElement(tns + XMLNames.Component_Model, airdragData.ModelName),
@@ -194,7 +194,7 @@ namespace TUGraz.VectoCore.OutputData.XML
 				new XElement(tns + "CertificationNumber", airdragData.CertificationNumber),
 				new XElement(tns + XMLNames.DI_Signature_Reference_DigestValue, airdragData.DigestValueInput),
 				new XElement(tns + "CdxA", airdragData.DeclaredAirdragArea.ToXMLFormat(2))
-			);
+				);
 		}
 
 		private XElement GetAxleWheelsDescription(VehicleData vehicleData)
@@ -302,16 +302,16 @@ namespace TUGraz.VectoCore.OutputData.XML
 					new XElement(tns + "TotalVehicleMass", new XAttribute("unit", "kg"), result.TotalVehicleWeight.ToXMLFormat(0)),
 					new XElement(tns + "Payload", new XAttribute("unit", "kg"), result.Payload.ToXMLFormat(0)),
 					new XElement(tns + "FuelType", result.FuelType.ToXMLFormat())
-				),
+					),
 				new XElement(tns + "VehiclePerformance",
 					new XElement(tns + "AverageSpeed", new XAttribute("unit", "km/h"), result.AverageSpeed.AsKmph.ToXMLFormat(1)),
 					new XElement(tns + "MinSpeed", new XAttribute("unit", "km/h"), result.MinSpeed.AsKmph.ToXMLFormat(1)),
 					new XElement(tns + "MaxSpeed", new XAttribute("unit", "km/h"), result.MaxSpeed.AsKmph.ToXMLFormat(1)),
 					new XElement(tns + "MaxDeceleration", new XAttribute("unit", "m/s²"), result.MaxDeceleration.ToXMLFormat(2)),
 					new XElement(tns + "MaxAcceleration", new XAttribute("unit", "m/s²"), result.MaxAcceleration.ToXMLFormat(2)),
-					new XElement(tns + "FullLoadDrivingtimePercentage", result.FullLoadPercentage.ToXMLFormat(0)),
+					new XElement(tns + "FullLoadDrivingtimePercentage", result.FullLoadPercentage.ToXMLFormat(2)),
 					new XElement(tns + "GearshiftCount", result.GearshiftCount.ToXMLFormat(0))
-				),
+					),
 				//FC
 				XMLDeclarationReport.GetResults(result, tns, true).Cast<object>().ToArray()
 			};
@@ -334,18 +334,18 @@ namespace TUGraz.VectoCore.OutputData.XML
 			var vehicle = new XElement(VehiclePart);
 			vehicle.Add(InputDataIntegrity);
 			retVal.Add(new XElement(tns + "VectoOutput",
-					new XAttribute("schemaVersion", "0.4"),
-					new XAttribute(XNamespace.Xmlns + "xsi", xsi.NamespaceName),
-					new XAttribute("xmlns", tns),
-					new XAttribute(XNamespace.Xmlns + "di", di),
-					new XAttribute(xsi + "schemaLocation",
-						string.Format("{0} {1}VectoOutput.xsd", tns, AbstractXMLWriter.SchemaLocationBaseUrl)),
-					new XElement(tns + "Data",
-						vehicle,
-						results,
-						GetApplicationInfo())
+				new XAttribute("schemaVersion", "0.4"),
+				new XAttribute(XNamespace.Xmlns + "xsi", xsi.NamespaceName),
+				new XAttribute("xmlns", tns),
+				new XAttribute(XNamespace.Xmlns + "di", di),
+				new XAttribute(xsi + "schemaLocation",
+					string.Format("{0} {1}VectoOutput.xsd", tns, AbstractXMLWriter.SchemaLocationBaseUrl)),
+				new XElement(tns + "Data",
+					vehicle,
+					results,
+					GetApplicationInfo())
 				)
-			);
+				);
 			var stream = new MemoryStream();
 			var writer = new StreamWriter(stream);
 			writer.Write(retVal);
diff --git a/VectoCore/VectoCoreTest/FileIO/JsonTest.cs b/VectoCore/VectoCoreTest/FileIO/JsonTest.cs
index 25bd9dda532352fcec1dd26b0776a82f9fb0d67c..c33efbd250ff758d48976aeeab3d394d1e937870 100644
--- a/VectoCore/VectoCoreTest/FileIO/JsonTest.cs
+++ b/VectoCore/VectoCoreTest/FileIO/JsonTest.cs
@@ -29,420 +29,476 @@
 *   Martin Rexeis, rexeis@ivt.tugraz.at, IVT, Graz University of Technology
 */
 
-using Microsoft.VisualStudio.TestTools.UnitTesting;
-using Newtonsoft.Json;
-using Newtonsoft.Json.Linq;
-using System.IO;
-using TUGraz.VectoCommon.Exceptions;
-using TUGraz.VectoCommon.InputData;
-using TUGraz.VectoCommon.Models;
-using TUGraz.VectoCommon.Utils;
-using TUGraz.VectoCore.InputData.FileIO.JSON;
-using TUGraz.VectoCore.InputData.Reader.DataObjectAdapter;
-using TUGraz.VectoCore.Tests.Utils;
-
-namespace TUGraz.VectoCore.Tests.FileIO
-{
-	[TestClass]
-	public class JsonTest
-	{
-		private const string TestJobFile = @"Testdata\Jobs\40t_Long_Haul_Truck.vecto";
-		private const string TestVehicleFile = @"Testdata\Components\24t Coach.vveh";
-
-		[TestMethod]
-		public void ReadJobTest()
-		{
-			var job = JSONInputDataFactory.ReadJsonJob(TestJobFile);
-
-			Assert.IsNotNull(job);
-			//			AssertHelper.Exception<InvalidFileFormatException>(() => );
-		}
-
-		[TestMethod]
-		public void NoEngineFileTest()
-		{
-			var json = (JObject)JToken.ReadFrom(new JsonTextReader(File.OpenText(TestJobFile)));
-			((JObject)json["Body"]).Property("EngineFile").Remove();
-
-			AssertHelper.Exception<VectoException>(() => new JSONInputDataV2(json, TestJobFile),
-				"JobFile: Failed to read Engine file '': Key EngineFile not found");
-		}
-
-		[TestMethod]
-		public void NoGearboxFileTest()
-		{
-			var json = (JObject)JToken.ReadFrom(new JsonTextReader(File.OpenText(TestJobFile)));
-			((JObject)json["Body"]).Property("GearboxFile").Remove();
-
-			AssertHelper.Exception<VectoException>(() => new JSONInputDataV2(json, TestJobFile),
-				"JobFile: Failed to read Gearbox file '': Key GearboxFile not found");
-		}
-
-		[TestMethod]
-		public void NoVehicleFileTest()
-		{
-			var json = (JObject)JToken.ReadFrom(new JsonTextReader(File.OpenText(TestJobFile)));
-			((JObject)json["Body"]).Property("VehicleFile").Remove();
-
-			AssertHelper.Exception<VectoException>(() => new JSONInputDataV2(json, TestJobFile),
-				"JobFile: Failed to read Vehicle file '': Key VehicleFile not found");
-		}
-
-		[TestMethod]
-		public void NoCyclesTest()
-		{
-			var json = (JObject)JToken.ReadFrom(new JsonTextReader(File.OpenText(TestJobFile)));
-			((JObject)json["Body"]).Property("Cycles").Remove();
-
-			var tmp = new JSONInputDataV2(json, TestJobFile).Cycles;
-			Assert.AreEqual(0, tmp.Count);
-		}
-
-		[TestMethod]
-		public void NoAuxTest()
-		{
-			var json = (JObject)JToken.ReadFrom(new JsonTextReader(File.OpenText(TestJobFile)));
-			((JObject)json["Body"]).Property("Aux").Remove();
-
-			// MK,2016-01-20: Changed for PWheel: aux entry may be missing, and that is ok.
-			var tmp = new JSONInputDataV2(json, TestJobFile).AuxiliaryInputData().Auxiliaries;
-			Assert.IsTrue(tmp.Count == 0);
-		}
-
-		[TestMethod]
-		public void NoDriverAccCurveTest()
-		{
-			var json = (JObject)JToken.ReadFrom(new JsonTextReader(File.OpenText(TestJobFile)));
-			((JObject)json["Body"]).Property("VACC").Remove();
-
-			IEngineeringInputDataProvider input = new JSONInputDataV2(json, TestJobFile);
-			var tmp = input.DriverInputData.AccelerationCurve;
-			Assert.IsNull(tmp);
-		}
-
-		[TestMethod]
-		public void UseDeclarationDriverAccCurveTest()
-		{
-			var json = (JObject)JToken.ReadFrom(new JsonTextReader(File.OpenText(TestJobFile)));
-			json["Body"]["VACC"] = "Truck";
-
-			IEngineeringInputDataProvider input = new JSONInputDataV2(json, TestJobFile);
-			var tmp = input.DriverInputData.AccelerationCurve;
-			Assert.IsNotNull(tmp);
-		}
-
-		[TestMethod]
-		public void NoLookaheadCoastingTest()
-		{
-			var json = (JObject)JToken.ReadFrom(new JsonTextReader(File.OpenText(TestJobFile)));
-			((JObject)json["Body"]).Property("LAC").Remove();
-
-			IEngineeringInputDataProvider input = new JSONInputDataV2(json, TestJobFile);
-			var tmp = input.DriverInputData.Lookahead;
-			Assert.IsNull(tmp);
-		}
-
-		[TestMethod]
-		public void NoOverspeedEcoRollTest()
-		{
-			var json = (JObject)JToken.ReadFrom(new JsonTextReader(File.OpenText(TestJobFile)));
-			((JObject)json["Body"]).Property("OverSpeedEcoRoll").Remove();
-
-			AssertHelper.Exception<VectoException>(
-				() => { var tmp = new JSONInputDataV2(json, TestJobFile).DriverInputData.OverSpeedEcoRoll; },
-				"Key OverSpeedEcoRoll not found");
-		}
-
-		[TestMethod]
-		public void ReadGearboxV5()
-		{
-			var inputProvider = JSONInputDataFactory.ReadGearbox(@"TestData\Components\AT_GBX\Gearbox_v5.vgbx");
-
-			var ratios = new[] { 3.0, 1.0, 0.8 };
-			Assert.AreEqual(ratios.Length, inputProvider.Gears.Count);
-			for (int i = 0; i < ratios.Length; i++) {
-				Assert.AreEqual(ratios[i], inputProvider.Gears[i].Ratio);
-			}
-			var gbxData = new EngineeringDataAdapter().CreateGearboxData(inputProvider,
-				MockSimulationDataFactory.CreateEngineDataFromFile(@"TestData\Components\AT_GBX\Engine.veng", 0), 2.1,
-				0.5.SI<Meter>(),
-				true);
-			Assert.AreEqual(ratios.Length, gbxData.Gears.Count);
-
-			// interpreted as gearbox with first and second gear using TC (due to gear ratios)
-			Assert.IsFalse(gbxData.Gears[1].HasLockedGear);
-			Assert.IsTrue(gbxData.Gears[1].HasTorqueConverter);
-			Assert.IsTrue(gbxData.Gears[2].HasLockedGear);
-			Assert.IsTrue(gbxData.Gears[2].HasTorqueConverter);
-			Assert.IsTrue(gbxData.Gears[3].HasLockedGear);
-			Assert.IsFalse(gbxData.Gears[3].HasTorqueConverter);
-		}
-
-		[TestMethod]
-		public void ReadGearboxSerialTC()
-		{
-			var inputProvider = JSONInputDataFactory.ReadGearbox(@"TestData\Components\AT_GBX\GearboxSerial.vgbx");
-
-			var ratios = new[] { 3.4, 1.9, 1.42, 1.0, 0.7, 0.62 };
-			Assert.AreEqual(ratios.Length, inputProvider.Gears.Count);
-			for (int i = 0; i < ratios.Length; i++) {
-				Assert.AreEqual(ratios[i], inputProvider.Gears[i].Ratio);
-			}
-			var gbxData = new EngineeringDataAdapter().CreateGearboxData(inputProvider,
-				MockSimulationDataFactory.CreateEngineDataFromFile(@"TestData\Components\AT_GBX\Engine.veng", 0), 2.1,
-				0.5.SI<Meter>(),
-				true);
-			Assert.AreEqual(ratios.Length, gbxData.Gears.Count);
-
-			Assert.IsTrue(gbxData.Gears[1].HasLockedGear);
-			Assert.IsTrue(gbxData.Gears[1].HasTorqueConverter);
-			Assert.IsTrue(gbxData.Gears[2].HasLockedGear);
-			Assert.IsFalse(gbxData.Gears[2].HasTorqueConverter);
-			Assert.IsTrue(gbxData.Gears[3].HasLockedGear);
-			Assert.IsFalse(gbxData.Gears[3].HasTorqueConverter);
-
-			var gear = gbxData.Gears[1];
-			Assert.AreEqual(gear.Ratio, gear.TorqueConverterRatio);
-		}
-
-		[TestMethod]
-		public void ReadGearboxPowersplitTC()
-		{
-			var inputProvider = JSONInputDataFactory.ReadGearbox(@"TestData\Components\AT_GBX\GearboxPowerSplit.vgbx");
-
-			var ratios = new[] { 1.35, 1.0, 0.73 };
-			Assert.AreEqual(ratios.Length, inputProvider.Gears.Count);
-			for (int i = 0; i < ratios.Length; i++) {
-				Assert.AreEqual(ratios[i], inputProvider.Gears[i].Ratio);
-			}
-			var gbxData = new EngineeringDataAdapter().CreateGearboxData(inputProvider,
-				MockSimulationDataFactory.CreateEngineDataFromFile(@"TestData\Components\AT_GBX\Engine.veng", 0), 2.1,
-				0.5.SI<Meter>(),
-				true);
-			Assert.AreEqual(ratios.Length, gbxData.Gears.Count);
-
-			Assert.IsTrue(gbxData.Gears[1].HasLockedGear);
-			Assert.IsTrue(gbxData.Gears[1].HasTorqueConverter);
-			Assert.IsTrue(gbxData.Gears[2].HasLockedGear);
-			Assert.IsFalse(gbxData.Gears[2].HasTorqueConverter);
-			Assert.IsTrue(gbxData.Gears[3].HasLockedGear);
-			Assert.IsFalse(gbxData.Gears[3].HasTorqueConverter);
-
-			Assert.AreEqual(1, gbxData.Gears[1].TorqueConverterRatio);
-		}
-
-		[TestMethod]
-		public void ReadGearboxDualTC()
-		{
-			var inputProvider = JSONInputDataFactory.ReadGearbox(@"TestData\Components\AT_GBX\GearboxSerialDualTC.vgbx");
-
-			var ratios = new[] { 4.35, 2.4, 1.8, 1.3, 1.0 };
-			Assert.AreEqual(ratios.Length, inputProvider.Gears.Count);
-			for (int i = 0; i < ratios.Length; i++) {
-				Assert.AreEqual(ratios[i], inputProvider.Gears[i].Ratio);
-			}
-			var gbxData = new EngineeringDataAdapter().CreateGearboxData(inputProvider,
-				MockSimulationDataFactory.CreateEngineDataFromFile(@"TestData\Components\AT_GBX\Engine.veng", 0), 2.1,
-				0.5.SI<Meter>(),
-				true);
-			Assert.AreEqual(ratios.Length, gbxData.Gears.Count);
-
-			Assert.IsFalse(gbxData.Gears[1].HasLockedGear);
-			Assert.IsTrue(gbxData.Gears[1].HasTorqueConverter);
-			Assert.IsTrue(gbxData.Gears[2].HasLockedGear);
-			Assert.IsTrue(gbxData.Gears[2].HasTorqueConverter);
-			Assert.IsTrue(gbxData.Gears[3].HasLockedGear);
-			Assert.IsFalse(gbxData.Gears[3].HasTorqueConverter);
-
-
-			var gear = gbxData.Gears[2];
-			Assert.AreEqual(gear.Ratio, gear.TorqueConverterRatio);
-		}
-
-		//[TestMethod]
-		//public void TestReadingElectricTechlist()
-		//{
-		//	var json = (JObject)JToken.ReadFrom(new JsonTextReader(File.OpenText(TestJobFile)));
-		//	((JArray)json["Body"]["Aux"][3]["TechList"]).Add("LED lights");
-
-		//	var job = new JSONInputDataV2(json, TestJobFile);
-		//	foreach (var aux in job.Auxiliaries) {
-		//		if (aux.ID == "ES") {
-		//			Assert.AreEqual(1, aux.TechList.Count);
-		//			Assert.AreEqual("LED lights", aux.TechList.First());
-		//		}
-		//	}
-		//}
-
-		[TestMethod]
-		public void JSON_Read_AngleGear()
-		{
-			var json = (JObject)JToken.ReadFrom(new JsonTextReader(File.OpenText(TestVehicleFile)));
-			var angleGear = json["Body"]["Angledrive"];
-
-			Assert.AreEqual(AngledriveType.SeparateAngledrive,
-				angleGear["Type"].Value<string>().ParseEnum<AngledriveType>());
-			Assert.AreEqual(3.5, angleGear["Ratio"].Value<double>());
-			Assert.AreEqual("AngleGear.vtlm", angleGear["LossMap"].Value<string>());
-		}
-	}
-
-	//	[TestClass]
-	//	public class JsonTest
-	//	{
-	//		private const string jsonExpected = @"{
-	//  ""CreatedBy"": ""Michael Krisper"",
-	//  ""Date"": ""2015-11-17T11:49:03Z"",
-	//  ""AppVersion"": ""3.0.1.320"",
-	//  ""FileVersion"": 7
-	//}";
-
-	//		private const string jsonExpected2 = @"{
-	//  ""CreatedBy"": ""Michael Krisper"",
-	//  ""Date"": ""2015-01-07T11:49:03Z"",
-	//  ""AppVersion"": ""3.0.1.320"",
-	//  ""FileVersion"": 7
-	//}";
-
-	//		[TestMethod]
-	//		public void TestJsonHeaderEquality()
-	//		{
-	//			var h1 = new JsonDataHeader {
-	//				AppVersion = "MyVecto3",
-	//				CreatedBy = "UnitTest",
-	//				Date = new DateTime(1970, 1, 1),
-	//				FileVersion = 3
-	//			};
-	//			var h2 = new JsonDataHeader {
-	//				AppVersion = "MyVecto3",
-	//				CreatedBy = "UnitTest",
-	//				Date = new DateTime(1970, 1, 1),
-	//				FileVersion = 3
-	//			};
-	//			Assert.AreEqual(h1, h1);
-	//			Assert.AreEqual(h1, h2);
-	//			Assert.AreNotEqual(h1, null);
-	//			Assert.AreNotEqual(h1, "hello world");
-	//		}
-
-	//		[TestMethod]
-	//		public void Test_Json_DateFormat_German()
-	//		{
-	//			var json = @"{
-	//  ""CreatedBy"": ""Michael Krisper"",
-	//  ""Date"": ""17.11.2015 11:49:03"",
-	//  ""AppVersion"": ""3.0.1.320"",
-	//  ""FileVersion"": 7
-	//}";
-	//			var header = JsonConvert.DeserializeObject<JsonDataHeader>(json);
-
-	//			Assert.AreEqual("3.0.1.320", header.AppVersion);
-	//			Assert.AreEqual(7u, header.FileVersion);
-	//			Assert.AreEqual("Michael Krisper", header.CreatedBy);
-	//			Assert.AreEqual(new DateTime(2015, 11, 17, 11, 49, 3, DateTimeKind.Utc), header.Date);
-
-	//			var jsonCompare = JsonConvert.SerializeObject(header, Formatting.Indented);
-	//			Assert.AreEqual(jsonExpected, jsonCompare);
-	//		}
-
-	//		[TestMethod]
-	//		public void Test_Json_DateFormat_German2()
-	//		{
-	//			var json = @"{
-	//  ""CreatedBy"": ""Michael Krisper"",
-	//  ""Date"": ""7.1.2015 11:49:03"",
-	//  ""AppVersion"": ""3.0.1.320"",
-	//  ""FileVersion"": 7
-	//}";
-	//			var header = JsonConvert.DeserializeObject<JsonDataHeader>(json);
-
-	//			Assert.AreEqual("3.0.1.320", header.AppVersion);
-	//			Assert.AreEqual(7u, header.FileVersion);
-	//			Assert.AreEqual("Michael Krisper", header.CreatedBy);
-	//			Assert.AreEqual(new DateTime(2015, 1, 7, 11, 49, 3, DateTimeKind.Utc), header.Date);
-
-	//			var jsonCompare = JsonConvert.SerializeObject(header, Formatting.Indented);
-	//			Assert.AreEqual(jsonExpected2, jsonCompare);
-	//		}
-
-	//		[TestMethod]
-	//		public void Test_Json_DateFormat_English()
-	//		{
-	//			var json = @"{
-	//  ""CreatedBy"": ""Michael Krisper"",
-	//  ""Date"": ""11/17/2015 11:49:03 AM"",
-	//  ""AppVersion"": ""3.0.1.320"",
-	//  ""FileVersion"": 7
-	//}";
-	//			var header = JsonConvert.DeserializeObject<JsonDataHeader>(json);
-
-	//			Assert.AreEqual("3.0.1.320", header.AppVersion);
-	//			Assert.AreEqual(7u, header.FileVersion);
-	//			Assert.AreEqual("Michael Krisper", header.CreatedBy);
-	//			Assert.AreEqual(new DateTime(2015, 11, 17, 11, 49, 3, DateTimeKind.Utc), header.Date);
-
-	//			var jsonCompare = JsonConvert.SerializeObject(header, Formatting.Indented);
-	//			Assert.AreEqual(jsonExpected, jsonCompare);
-	//		}
-
-	//		[TestMethod]
-	//		public void Test_Json_DateFormat_English2()
-	//		{
-	//			var json = @"{
-	//  ""CreatedBy"": ""Michael Krisper"",
-	//  ""Date"": ""1/7/2015 11:49:03 AM"",
-	//  ""AppVersion"": ""3.0.1.320"",
-	//  ""FileVersion"": 7
-	//}";
-	//			var header = JsonConvert.DeserializeObject<JsonDataHeader>(json);
-
-	//			Assert.AreEqual("3.0.1.320", header.AppVersion);
-	//			Assert.AreEqual(7u, header.FileVersion);
-	//			Assert.AreEqual("Michael Krisper", header.CreatedBy);
-	//			Assert.AreEqual(new DateTime(2015, 1, 7, 11, 49, 3, DateTimeKind.Utc), header.Date);
-
-	//			var jsonCompare = JsonConvert.SerializeObject(header, Formatting.Indented);
-	//			Assert.AreEqual(jsonExpected2, jsonCompare);
-	//		}
-
-	//		[TestMethod]
-	//		public void Test_Json_DateFormat_ISO8601()
-	//		{
-	//			var json = @"{
-	//  ""CreatedBy"": ""Michael Krisper"",
-	//  ""Date"": ""2015-11-17T11:49:03Z"",
-	//  ""AppVersion"": ""3.0.1.320"",
-	//  ""FileVersion"": 7
-	//}";
-	//			var header = JsonConvert.DeserializeObject<JsonDataHeader>(json);
-
-	//			Assert.AreEqual("3.0.1.320", header.AppVersion);
-	//			Assert.AreEqual(7u, header.FileVersion);
-	//			Assert.AreEqual("Michael Krisper", header.CreatedBy);
-	//			Assert.AreEqual(new DateTime(2015, 11, 17, 11, 49, 3, DateTimeKind.Utc), header.Date);
-
-	//			var jsonCompare = JsonConvert.SerializeObject(header, Formatting.Indented);
-	//			Assert.AreEqual(json, jsonCompare);
-	//		}
-
-	//		[TestMethod]
-	//		public void Test_Json_DateFormat_ISO8601_CET()
-	//		{
-	//			var json = @"{
-	//  ""CreatedBy"": ""Michael Krisper"",
-	//  ""Date"": ""2015-11-17T11:49:03+01:00"",
-	//  ""AppVersion"": ""3.0.1.320"",
-	//  ""FileVersion"": 7
-	//}";
-	//			var header = JsonConvert.DeserializeObject<JsonDataHeader>(json);
-
-	//			Assert.AreEqual("3.0.1.320", header.AppVersion);
-	//			Assert.AreEqual(7u, header.FileVersion);
-	//			Assert.AreEqual("Michael Krisper", header.CreatedBy);
-	//			Assert.AreEqual(new DateTime(2015, 11, 17, 11, 49, 3, DateTimeKind.Utc), header.Date);
-
-	//			var jsonCompare = JsonConvert.SerializeObject(header, Formatting.Indented);
-	//			Assert.AreEqual(json, jsonCompare);
-	//		}
-	//	}
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+using Newtonsoft.Json;
+using Newtonsoft.Json.Linq;
+using System.IO;
+using TUGraz.VectoCommon.Exceptions;
+using TUGraz.VectoCommon.InputData;
+using TUGraz.VectoCommon.Models;
+using TUGraz.VectoCommon.Utils;
+using TUGraz.VectoCore.InputData.FileIO.JSON;
+using TUGraz.VectoCore.InputData.Reader.DataObjectAdapter;
+using TUGraz.VectoCore.Tests.Utils;
+
+namespace TUGraz.VectoCore.Tests.FileIO
+{
+	[TestClass]
+	public class JsonTest
+	{
+		private const string TestJobFile = @"Testdata\Jobs\40t_Long_Haul_Truck.vecto";
+		private const string TestVehicleFile = @"Testdata\Components\24t Coach.vveh";
+
+		[TestMethod]
+		public void ReadJobTest()
+		{
+			var job = JSONInputDataFactory.ReadJsonJob(TestJobFile);
+
+			Assert.IsNotNull(job);
+			//			AssertHelper.Exception<InvalidFileFormatException>(() => );
+		}
+
+		[TestMethod]
+		public void NoEngineFileTest()
+		{
+			var json = (JObject)JToken.ReadFrom(new JsonTextReader(File.OpenText(TestJobFile)));
+			((JObject)json["Body"]).Property("EngineFile").Remove();
+
+			AssertHelper.Exception<VectoException>(() => new JSONInputDataV2(json, TestJobFile),
+				"JobFile: Failed to read Engine file '': Key EngineFile not found");
+		}
+
+		[TestMethod]
+		public void NoGearboxFileTest()
+		{
+			var json = (JObject)JToken.ReadFrom(new JsonTextReader(File.OpenText(TestJobFile)));
+			((JObject)json["Body"]).Property("GearboxFile").Remove();
+
+			AssertHelper.Exception<VectoException>(() => new JSONInputDataV2(json, TestJobFile),
+				"JobFile: Failed to read Gearbox file '': Key GearboxFile not found");
+		}
+
+		[TestMethod]
+		public void NoVehicleFileTest()
+		{
+			var json = (JObject)JToken.ReadFrom(new JsonTextReader(File.OpenText(TestJobFile)));
+			((JObject)json["Body"]).Property("VehicleFile").Remove();
+
+			AssertHelper.Exception<VectoException>(() => new JSONInputDataV2(json, TestJobFile),
+				"JobFile: Failed to read Vehicle file '': Key VehicleFile not found");
+		}
+
+		[TestMethod]
+		public void NoCyclesTest()
+		{
+			var json = (JObject)JToken.ReadFrom(new JsonTextReader(File.OpenText(TestJobFile)));
+			((JObject)json["Body"]).Property("Cycles").Remove();
+
+			var tmp = new JSONInputDataV2(json, TestJobFile).Cycles;
+			Assert.AreEqual(0, tmp.Count);
+		}
+
+		[TestMethod]
+		public void NoAuxTest()
+		{
+			var json = (JObject)JToken.ReadFrom(new JsonTextReader(File.OpenText(TestJobFile)));
+			((JObject)json["Body"]).Property("Aux").Remove();
+
+			// MK,2016-01-20: Changed for PWheel: aux entry may be missing, and that is ok.
+			var tmp = new JSONInputDataV2(json, TestJobFile).AuxiliaryInputData().Auxiliaries;
+			Assert.IsTrue(tmp.Count == 0);
+		}
+
+		[TestMethod]
+		public void NoDriverAccCurveTest()
+		{
+			var json = (JObject)JToken.ReadFrom(new JsonTextReader(File.OpenText(TestJobFile)));
+			((JObject)json["Body"]).Property("VACC").Remove();
+
+			IEngineeringInputDataProvider input = new JSONInputDataV2(json, TestJobFile);
+			var tmp = input.DriverInputData.AccelerationCurve;
+			Assert.IsNull(tmp);
+		}
+
+		[TestMethod]
+		public void UseDeclarationDriverAccCurveTest()
+		{
+			var json = (JObject)JToken.ReadFrom(new JsonTextReader(File.OpenText(TestJobFile)));
+			json["Body"]["VACC"] = "Truck";
+
+			IEngineeringInputDataProvider input = new JSONInputDataV2(json, TestJobFile);
+			var tmp = input.DriverInputData.AccelerationCurve;
+			Assert.IsNotNull(tmp);
+		}
+
+		[TestMethod]
+		public void NoLookaheadCoastingTest()
+		{
+			var json = (JObject)JToken.ReadFrom(new JsonTextReader(File.OpenText(TestJobFile)));
+			((JObject)json["Body"]).Property("LAC").Remove();
+
+			IEngineeringInputDataProvider input = new JSONInputDataV2(json, TestJobFile);
+			var tmp = input.DriverInputData.Lookahead;
+			Assert.IsNull(tmp);
+		}
+
+		[TestMethod]
+		public void NoOverspeedEcoRollTest()
+		{
+			var json = (JObject)JToken.ReadFrom(new JsonTextReader(File.OpenText(TestJobFile)));
+			((JObject)json["Body"]).Property("OverSpeedEcoRoll").Remove();
+
+			AssertHelper.Exception<VectoException>(
+				() => { var tmp = new JSONInputDataV2(json, TestJobFile).DriverInputData.OverSpeedEcoRoll; },
+				"Key OverSpeedEcoRoll not found");
+		}
+
+		[TestMethod]
+		public void ReadGearboxV5()
+		{
+			var inputProvider = JSONInputDataFactory.ReadGearbox(@"TestData\Components\AT_GBX\Gearbox_v5.vgbx");
+
+			var ratios = new[] { 3.0, 1.0, 0.8 };
+			Assert.AreEqual(ratios.Length, inputProvider.Gears.Count);
+			for (int i = 0; i < ratios.Length; i++) {
+				Assert.AreEqual(ratios[i], inputProvider.Gears[i].Ratio);
+			}
+			var gbxData = new EngineeringDataAdapter().CreateGearboxData(inputProvider,
+				MockSimulationDataFactory.CreateEngineDataFromFile(@"TestData\Components\AT_GBX\Engine.veng", 0), 2.1,
+				0.5.SI<Meter>(), VehicleCategory.RigidTruck,
+				true);
+			Assert.AreEqual(ratios.Length, gbxData.Gears.Count);
+
+			// interpreted as gearbox with first and second gear using TC (due to gear ratios)
+			Assert.IsFalse(gbxData.Gears[1].HasLockedGear);
+			Assert.IsTrue(gbxData.Gears[1].HasTorqueConverter);
+			Assert.IsTrue(gbxData.Gears[2].HasLockedGear);
+			Assert.IsTrue(gbxData.Gears[2].HasTorqueConverter);
+			Assert.IsTrue(gbxData.Gears[3].HasLockedGear);
+			Assert.IsFalse(gbxData.Gears[3].HasTorqueConverter);
+		}
+
+		[TestMethod]
+		public void ReadGearboxSerialTC()
+		{
+			var inputProvider = JSONInputDataFactory.ReadGearbox(@"TestData\Components\AT_GBX\GearboxSerial.vgbx");
+
+			var ratios = new[] { 3.4, 1.9, 1.42, 1.0, 0.7, 0.62 };
+			Assert.AreEqual(ratios.Length, inputProvider.Gears.Count);
+			for (int i = 0; i < ratios.Length; i++) {
+				Assert.AreEqual(ratios[i], inputProvider.Gears[i].Ratio);
+			}
+			var gbxData = new EngineeringDataAdapter().CreateGearboxData(inputProvider,
+				MockSimulationDataFactory.CreateEngineDataFromFile(@"TestData\Components\AT_GBX\Engine.veng", 0), 2.1,
+				0.5.SI<Meter>(), VehicleCategory.RigidTruck,
+				true);
+			Assert.AreEqual(ratios.Length, gbxData.Gears.Count);
+
+			Assert.IsTrue(gbxData.Gears[1].HasLockedGear);
+			Assert.IsTrue(gbxData.Gears[1].HasTorqueConverter);
+			Assert.IsTrue(gbxData.Gears[2].HasLockedGear);
+			Assert.IsFalse(gbxData.Gears[2].HasTorqueConverter);
+			Assert.IsTrue(gbxData.Gears[3].HasLockedGear);
+			Assert.IsFalse(gbxData.Gears[3].HasTorqueConverter);
+
+			var gear = gbxData.Gears[1];
+			Assert.AreEqual(gear.Ratio, gear.TorqueConverterRatio);
+		}
+
+		[TestMethod]
+		public void ReadGearboxPowersplitTC()
+		{
+			var inputProvider = JSONInputDataFactory.ReadGearbox(@"TestData\Components\AT_GBX\GearboxPowerSplit.vgbx");
+
+			var ratios = new[] { 1.35, 1.0, 0.73 };
+			Assert.AreEqual(ratios.Length, inputProvider.Gears.Count);
+			for (int i = 0; i < ratios.Length; i++) {
+				Assert.AreEqual(ratios[i], inputProvider.Gears[i].Ratio);
+			}
+			var gbxData = new EngineeringDataAdapter().CreateGearboxData(inputProvider,
+				MockSimulationDataFactory.CreateEngineDataFromFile(@"TestData\Components\AT_GBX\Engine.veng", 0), 2.1,
+				0.5.SI<Meter>(), VehicleCategory.RigidTruck,
+				true);
+			Assert.AreEqual(ratios.Length, gbxData.Gears.Count);
+
+			Assert.IsTrue(gbxData.Gears[1].HasLockedGear);
+			Assert.IsTrue(gbxData.Gears[1].HasTorqueConverter);
+			Assert.IsTrue(gbxData.Gears[2].HasLockedGear);
+			Assert.IsFalse(gbxData.Gears[2].HasTorqueConverter);
+			Assert.IsTrue(gbxData.Gears[3].HasLockedGear);
+			Assert.IsFalse(gbxData.Gears[3].HasTorqueConverter);
+
+			Assert.AreEqual(1, gbxData.Gears[1].TorqueConverterRatio);
+		}
+
+		[TestMethod]
+		public void ReadGearboxDualTCTruck()
+		{
+			var inputProvider = JSONInputDataFactory.ReadGearbox(@"TestData\Components\AT_GBX\GearboxSerialDualTC.vgbx");
+
+			var ratios = new[] { 4.35, 2.4, 1.8, 1.3, 1.0 };
+			Assert.AreEqual(ratios.Length, inputProvider.Gears.Count);
+			for (int i = 0; i < ratios.Length; i++) {
+				Assert.AreEqual(ratios[i], inputProvider.Gears[i].Ratio);
+			}
+			var gbxData = new EngineeringDataAdapter().CreateGearboxData(inputProvider,
+				MockSimulationDataFactory.CreateEngineDataFromFile(@"TestData\Components\AT_GBX\Engine.veng", 0), 2.1,
+				0.5.SI<Meter>(), VehicleCategory.RigidTruck,
+				true);
+			Assert.AreEqual(ratios.Length, gbxData.Gears.Count);
+
+			Assert.IsFalse(gbxData.Gears[1].HasLockedGear);
+			Assert.IsTrue(gbxData.Gears[1].HasTorqueConverter);
+			Assert.IsTrue(gbxData.Gears[2].HasLockedGear);
+			Assert.IsTrue(gbxData.Gears[2].HasTorqueConverter);
+			Assert.IsTrue(gbxData.Gears[3].HasLockedGear);
+			Assert.IsFalse(gbxData.Gears[3].HasTorqueConverter);
+
+
+			var gear = gbxData.Gears[2];
+			Assert.AreEqual(gear.Ratio, gear.TorqueConverterRatio);
+		}
+
+		[TestMethod]
+		public void ReadGearboxSingleTCBus()
+		{
+			var inputProvider = JSONInputDataFactory.ReadGearbox(@"TestData\Components\AT_GBX\GearboxSerialDualTC.vgbx");
+
+			var ratios = new[] { 4.35, 2.4, 1.8, 1.3, 1.0 };
+			Assert.AreEqual(ratios.Length, inputProvider.Gears.Count);
+			for (int i = 0; i < ratios.Length; i++) {
+				Assert.AreEqual(ratios[i], inputProvider.Gears[i].Ratio);
+			}
+			var gbxData = new EngineeringDataAdapter().CreateGearboxData(inputProvider,
+				MockSimulationDataFactory.CreateEngineDataFromFile(@"TestData\Components\AT_GBX\Engine.veng", 0), 2.1,
+				0.5.SI<Meter>(), VehicleCategory.InterurbanBus,
+				true);
+			Assert.AreEqual(ratios.Length, gbxData.Gears.Count);
+
+			Assert.IsTrue(gbxData.Gears[1].HasLockedGear);
+			Assert.IsTrue(gbxData.Gears[1].HasTorqueConverter);
+			Assert.IsTrue(gbxData.Gears[2].HasLockedGear);
+			Assert.IsFalse(gbxData.Gears[2].HasTorqueConverter);
+			Assert.IsTrue(gbxData.Gears[3].HasLockedGear);
+			Assert.IsFalse(gbxData.Gears[3].HasTorqueConverter);
+
+
+			var gear = gbxData.Gears[1];
+			Assert.AreEqual(gear.Ratio, gear.TorqueConverterRatio);
+		}
+
+		[TestMethod]
+		public void ReadGearboxDualTCBus()
+		{
+			var inputProvider = JSONInputDataFactory.ReadGearbox(@"TestData\Components\AT_GBX\GearboxSerialDualTCBus.vgbx");
+
+			var ratios = new[] { 4.58, 2.4, 1.8, 1.3, 1.0 };
+			Assert.AreEqual(ratios.Length, inputProvider.Gears.Count);
+			for (int i = 0; i < ratios.Length; i++) {
+				Assert.AreEqual(ratios[i], inputProvider.Gears[i].Ratio);
+			}
+			var gbxData = new EngineeringDataAdapter().CreateGearboxData(inputProvider,
+				MockSimulationDataFactory.CreateEngineDataFromFile(@"TestData\Components\AT_GBX\Engine.veng", 0), 2.1,
+				0.5.SI<Meter>(), VehicleCategory.InterurbanBus,
+				true);
+			Assert.AreEqual(ratios.Length, gbxData.Gears.Count);
+
+			Assert.IsFalse(gbxData.Gears[1].HasLockedGear);
+			Assert.IsTrue(gbxData.Gears[1].HasTorqueConverter);
+			Assert.IsTrue(gbxData.Gears[2].HasLockedGear);
+			Assert.IsTrue(gbxData.Gears[2].HasTorqueConverter);
+			Assert.IsTrue(gbxData.Gears[3].HasLockedGear);
+			Assert.IsFalse(gbxData.Gears[3].HasTorqueConverter);
+
+
+			var gear = gbxData.Gears[2];
+			Assert.AreEqual(gear.Ratio, gear.TorqueConverterRatio);
+		}
+
+		//[TestMethod]
+		//public void TestReadingElectricTechlist()
+		//{
+		//	var json = (JObject)JToken.ReadFrom(new JsonTextReader(File.OpenText(TestJobFile)));
+		//	((JArray)json["Body"]["Aux"][3]["TechList"]).Add("LED lights");
+
+		//	var job = new JSONInputDataV2(json, TestJobFile);
+		//	foreach (var aux in job.Auxiliaries) {
+		//		if (aux.ID == "ES") {
+		//			Assert.AreEqual(1, aux.TechList.Count);
+		//			Assert.AreEqual("LED lights", aux.TechList.First());
+		//		}
+		//	}
+		//}
+
+		[TestMethod]
+		public void JSON_Read_AngleGear()
+		{
+			var json = (JObject)JToken.ReadFrom(new JsonTextReader(File.OpenText(TestVehicleFile)));
+			var angleGear = json["Body"]["Angledrive"];
+
+			Assert.AreEqual(AngledriveType.SeparateAngledrive,
+				angleGear["Type"].Value<string>().ParseEnum<AngledriveType>());
+			Assert.AreEqual(3.5, angleGear["Ratio"].Value<double>());
+			Assert.AreEqual("AngleGear.vtlm", angleGear["LossMap"].Value<string>());
+		}
+	}
+
+	//	[TestClass]
+	//	public class JsonTest
+	//	{
+	//		private const string jsonExpected = @"{
+	//  ""CreatedBy"": ""Michael Krisper"",
+	//  ""Date"": ""2015-11-17T11:49:03Z"",
+	//  ""AppVersion"": ""3.0.1.320"",
+	//  ""FileVersion"": 7
+	//}";
+
+	//		private const string jsonExpected2 = @"{
+	//  ""CreatedBy"": ""Michael Krisper"",
+	//  ""Date"": ""2015-01-07T11:49:03Z"",
+	//  ""AppVersion"": ""3.0.1.320"",
+	//  ""FileVersion"": 7
+	//}";
+
+	//		[TestMethod]
+	//		public void TestJsonHeaderEquality()
+	//		{
+	//			var h1 = new JsonDataHeader {
+	//				AppVersion = "MyVecto3",
+	//				CreatedBy = "UnitTest",
+	//				Date = new DateTime(1970, 1, 1),
+	//				FileVersion = 3
+	//			};
+	//			var h2 = new JsonDataHeader {
+	//				AppVersion = "MyVecto3",
+	//				CreatedBy = "UnitTest",
+	//				Date = new DateTime(1970, 1, 1),
+	//				FileVersion = 3
+	//			};
+	//			Assert.AreEqual(h1, h1);
+	//			Assert.AreEqual(h1, h2);
+	//			Assert.AreNotEqual(h1, null);
+	//			Assert.AreNotEqual(h1, "hello world");
+	//		}
+
+	//		[TestMethod]
+	//		public void Test_Json_DateFormat_German()
+	//		{
+	//			var json = @"{
+	//  ""CreatedBy"": ""Michael Krisper"",
+	//  ""Date"": ""17.11.2015 11:49:03"",
+	//  ""AppVersion"": ""3.0.1.320"",
+	//  ""FileVersion"": 7
+	//}";
+	//			var header = JsonConvert.DeserializeObject<JsonDataHeader>(json);
+
+	//			Assert.AreEqual("3.0.1.320", header.AppVersion);
+	//			Assert.AreEqual(7u, header.FileVersion);
+	//			Assert.AreEqual("Michael Krisper", header.CreatedBy);
+	//			Assert.AreEqual(new DateTime(2015, 11, 17, 11, 49, 3, DateTimeKind.Utc), header.Date);
+
+	//			var jsonCompare = JsonConvert.SerializeObject(header, Formatting.Indented);
+	//			Assert.AreEqual(jsonExpected, jsonCompare);
+	//		}
+
+	//		[TestMethod]
+	//		public void Test_Json_DateFormat_German2()
+	//		{
+	//			var json = @"{
+	//  ""CreatedBy"": ""Michael Krisper"",
+	//  ""Date"": ""7.1.2015 11:49:03"",
+	//  ""AppVersion"": ""3.0.1.320"",
+	//  ""FileVersion"": 7
+	//}";
+	//			var header = JsonConvert.DeserializeObject<JsonDataHeader>(json);
+
+	//			Assert.AreEqual("3.0.1.320", header.AppVersion);
+	//			Assert.AreEqual(7u, header.FileVersion);
+	//			Assert.AreEqual("Michael Krisper", header.CreatedBy);
+	//			Assert.AreEqual(new DateTime(2015, 1, 7, 11, 49, 3, DateTimeKind.Utc), header.Date);
+
+	//			var jsonCompare = JsonConvert.SerializeObject(header, Formatting.Indented);
+	//			Assert.AreEqual(jsonExpected2, jsonCompare);
+	//		}
+
+	//		[TestMethod]
+	//		public void Test_Json_DateFormat_English()
+	//		{
+	//			var json = @"{
+	//  ""CreatedBy"": ""Michael Krisper"",
+	//  ""Date"": ""11/17/2015 11:49:03 AM"",
+	//  ""AppVersion"": ""3.0.1.320"",
+	//  ""FileVersion"": 7
+	//}";
+	//			var header = JsonConvert.DeserializeObject<JsonDataHeader>(json);
+
+	//			Assert.AreEqual("3.0.1.320", header.AppVersion);
+	//			Assert.AreEqual(7u, header.FileVersion);
+	//			Assert.AreEqual("Michael Krisper", header.CreatedBy);
+	//			Assert.AreEqual(new DateTime(2015, 11, 17, 11, 49, 3, DateTimeKind.Utc), header.Date);
+
+	//			var jsonCompare = JsonConvert.SerializeObject(header, Formatting.Indented);
+	//			Assert.AreEqual(jsonExpected, jsonCompare);
+	//		}
+
+	//		[TestMethod]
+	//		public void Test_Json_DateFormat_English2()
+	//		{
+	//			var json = @"{
+	//  ""CreatedBy"": ""Michael Krisper"",
+	//  ""Date"": ""1/7/2015 11:49:03 AM"",
+	//  ""AppVersion"": ""3.0.1.320"",
+	//  ""FileVersion"": 7
+	//}";
+	//			var header = JsonConvert.DeserializeObject<JsonDataHeader>(json);
+
+	//			Assert.AreEqual("3.0.1.320", header.AppVersion);
+	//			Assert.AreEqual(7u, header.FileVersion);
+	//			Assert.AreEqual("Michael Krisper", header.CreatedBy);
+	//			Assert.AreEqual(new DateTime(2015, 1, 7, 11, 49, 3, DateTimeKind.Utc), header.Date);
+
+	//			var jsonCompare = JsonConvert.SerializeObject(header, Formatting.Indented);
+	//			Assert.AreEqual(jsonExpected2, jsonCompare);
+	//		}
+
+	//		[TestMethod]
+	//		public void Test_Json_DateFormat_ISO8601()
+	//		{
+	//			var json = @"{
+	//  ""CreatedBy"": ""Michael Krisper"",
+	//  ""Date"": ""2015-11-17T11:49:03Z"",
+	//  ""AppVersion"": ""3.0.1.320"",
+	//  ""FileVersion"": 7
+	//}";
+	//			var header = JsonConvert.DeserializeObject<JsonDataHeader>(json);
+
+	//			Assert.AreEqual("3.0.1.320", header.AppVersion);
+	//			Assert.AreEqual(7u, header.FileVersion);
+	//			Assert.AreEqual("Michael Krisper", header.CreatedBy);
+	//			Assert.AreEqual(new DateTime(2015, 11, 17, 11, 49, 3, DateTimeKind.Utc), header.Date);
+
+	//			var jsonCompare = JsonConvert.SerializeObject(header, Formatting.Indented);
+	//			Assert.AreEqual(json, jsonCompare);
+	//		}
+
+	//		[TestMethod]
+	//		public void Test_Json_DateFormat_ISO8601_CET()
+	//		{
+	//			var json = @"{
+	//  ""CreatedBy"": ""Michael Krisper"",
+	//  ""Date"": ""2015-11-17T11:49:03+01:00"",
+	//  ""AppVersion"": ""3.0.1.320"",
+	//  ""FileVersion"": 7
+	//}";
+	//			var header = JsonConvert.DeserializeObject<JsonDataHeader>(json);
+
+	//			Assert.AreEqual("3.0.1.320", header.AppVersion);
+	//			Assert.AreEqual(7u, header.FileVersion);
+	//			Assert.AreEqual("Michael Krisper", header.CreatedBy);
+	//			Assert.AreEqual(new DateTime(2015, 11, 17, 11, 49, 3, DateTimeKind.Utc), header.Date);
+
+	//			var jsonCompare = JsonConvert.SerializeObject(header, Formatting.Indented);
+	//			Assert.AreEqual(json, jsonCompare);
+	//		}
+	//	}
 }
\ No newline at end of file
diff --git a/VectoCore/VectoCoreTest/Models/SimulationComponent/ATGearboxTest.cs b/VectoCore/VectoCoreTest/Models/SimulationComponent/ATGearboxTest.cs
index f0c12bd791d2c05813804a0ec23572c6f94fed24..a93409ff24f34a6922b33b23fa94139e533f9b6a 100644
--- a/VectoCore/VectoCoreTest/Models/SimulationComponent/ATGearboxTest.cs
+++ b/VectoCore/VectoCoreTest/Models/SimulationComponent/ATGearboxTest.cs
@@ -29,140 +29,140 @@
 *   Martin Rexeis, rexeis@ivt.tugraz.at, IVT, Graz University of Technology
 */
 
-using NUnit.Framework;
-using TUGraz.VectoCommon.Models;
-using TUGraz.VectoCommon.Utils;
-using TUGraz.VectoCore.Configuration;
-using TUGraz.VectoCore.Models.Connector.Ports.Impl;
-using TUGraz.VectoCore.Models.Simulation.Data;
-using TUGraz.VectoCore.Models.Simulation.Impl;
-using TUGraz.VectoCore.Models.SimulationComponent.Data;
-using TUGraz.VectoCore.Models.SimulationComponent.Impl;
-using TUGraz.VectoCore.OutputData;
-using TUGraz.VectoCore.OutputData.FileIO;
-using TUGraz.VectoCore.Tests.Integration;
-using TUGraz.VectoCore.Tests.Utils;
-
-namespace TUGraz.VectoCore.Tests.Models.SimulationComponent
-{
-	[TestFixture]
-	public class ATGearboxTest
-	{
-		public const string EngineDataFile = @"TestData\Components\AT_GBX\Engine.veng";
-		public const string GearboxDataFile = @"TestData\Components\AT_GBX\GearboxSerial.vgbx";
-
-		[Test,
-		TestCase(0, 100, 1),
-		TestCase(0, 200, 1),
-		TestCase(5, 100, 1),
-		TestCase(5, 300, 1),
-		TestCase(5, 600, 1),
-		TestCase(15, 100, 3),
-		TestCase(15, 300, 3),
-		TestCase(15, 600, 3),
-		TestCase(40, 100, 6),
-		TestCase(40, 300, 6),
-		TestCase(40, 600, 6),
-		TestCase(70, 100, 6),
-		TestCase(70, 300, 6),
-		TestCase(70, 600, 6),
-		]
-		public void TestATGearInitialize(double vehicleSpeed, double torque, int expectedGear)
-		{
-			var gearboxData = MockSimulationDataFactory.CreateGearboxDataFromFile(GearboxDataFile, EngineDataFile, false);
-			var vehicleContainer = new MockVehicleContainer(); //(ExecutionMode.Engineering);
-			var engineData = MockSimulationDataFactory.CreateEngineDataFromFile(EngineDataFile, gearboxData.Gears.Count);
-			vehicleContainer.Engine = new CombustionEngine(vehicleContainer, engineData);
-			var runData = new VectoRunData() { GearboxData = gearboxData };
-			var gearbox = new ATGearbox(vehicleContainer, new ATShiftStrategy(gearboxData, vehicleContainer), runData);
-
-			vehicleContainer.VehicleSpeed = vehicleSpeed.KMPHtoMeterPerSecond();
-
-			var tnPort = new MockTnOutPort();
-			gearbox.Connect(tnPort);
-
-			// r_dyn = 0.465m, i_axle = 6.2
-			var angularVelocity = vehicleSpeed.KMPHtoMeterPerSecond() / 0.465.SI<Meter>() * 6.2;
-			var response = gearbox.Initialize(torque.SI<NewtonMeter>(), angularVelocity);
-
-			Assert.IsInstanceOf(typeof(ResponseSuccess), response);
-			Assert.AreEqual(expectedGear, gearbox.Gear);
-			Assert.AreEqual(vehicleSpeed.IsEqual(0), gearbox.Disengaged);
-		}
-
-		[Test,
-		TestCase(GearboxType.ATSerial, TestName = "Drive TorqueConverter - Serial"),
-		TestCase(GearboxType.ATPowerSplit, TestName = "Drive TorqueConverter - PowerSplit")]
-		public void TestATGearboxDriveTorqueConverter(GearboxType gbxType)
-		{
-			var cycleData = @"   0,  0, 0,    2
-								20,  8, 0,    0
-							   200,  0, 0,    2";
-			var cycle = SimpleDrivingCycles.CreateCycleData(cycleData);
-			var run = ATPowerTrain.CreateEngineeringRun(cycle, gbxType,
-				string.Format("AT_Vehicle_Drive-TC-{0}.vmod", gbxType == GearboxType.ATSerial ? "ser" : "ps"));
-
-			run.Run();
-			Assert.IsTrue(run.FinishedWithoutErrors);
-		}
-
-		[Test,
-		TestCase(GearboxType.ATSerial, TestName = "ShiftUp TorqueConverter - Serial"),
-		TestCase(GearboxType.ATPowerSplit, TestName = "ShiftUp TorqueConverter - PowerSplit")]
-		public void TestATGearboxShiftUp(GearboxType gbxType)
-		{
-			var cycleData = @"  0,  0, 0,    2
-							  500, 40, 0,    0";
-			var cycle = SimpleDrivingCycles.CreateCycleData(cycleData);
-			var run = ATPowerTrain.CreateEngineeringRun(cycle, gbxType,
-				string.Format("AT_Vehicle_Drive-TC_shiftup-{0}.vmod", gbxType == GearboxType.ATSerial ? "ser" : "ps"));
-
-			run.Run();
-			Assert.IsTrue(run.FinishedWithoutErrors);
-		}
-
-		[Test,
-		TestCase(GearboxType.ATSerial, TestName = "ShiftDown TorqueConverter - Serial"),
-		TestCase(GearboxType.ATPowerSplit, TestName = "ShiftDown TorqueConverter - PowerSplit")]
-		public void TestATGearboxShiftDown(GearboxType gbxType)
-		{
-			var cycleData = @"  0, 70, 0,    0
-							  500,  0, 0,    2";
-			var cycle = SimpleDrivingCycles.CreateCycleData(cycleData);
-			var run = ATPowerTrain.CreateEngineeringRun(cycle, gbxType,
-				string.Format("AT_Vehicle_Drive-TC_shiftdown-{0}.vmod", gbxType == GearboxType.ATSerial ? "ser" : "ps"));
-
-			run.Run();
-			Assert.IsTrue(run.FinishedWithoutErrors);
-		}
-
-
-		[Test,
-		TestCase("Urban", GearboxType.ATSerial),
-		TestCase("Suburban", GearboxType.ATSerial),
-		TestCase("Interurban", GearboxType.ATSerial),
-		TestCase("HeavyUrban", GearboxType.ATSerial),
-		TestCase("Urban", GearboxType.ATPowerSplit),
-		TestCase("Suburban", GearboxType.ATPowerSplit),
-		TestCase("Interurban", GearboxType.ATPowerSplit),
-		TestCase("HeavyUrban", GearboxType.ATPowerSplit)
-		]
-		public void TestATGearboxDriveCycle(string cycleName, GearboxType gbxType)
-		{
-			Assert.IsTrue(gbxType.AutomaticTransmission());
-			var cycle = SimpleDrivingCycles.ReadDeclarationCycle(cycleName);
-			var run = ATPowerTrain.CreateEngineeringRun(cycle, gbxType,
-				string.Format("AT_Vehicle_Drive-TC_{0}-{1}.vmod", cycleName, gbxType == GearboxType.ATSerial ? "ser" : "ps"));
-
-			var sumWriter =
-				new SummaryDataContainer(
-					new FileOutputWriter(string.Format("AT_Vehicle_Drive-TC_{0}-{1}", cycleName,
-						gbxType == GearboxType.ATSerial ? "ser" : "ps")));
-			((VehicleContainer)run.GetContainer()).WriteSumData = (modData) =>
-				sumWriter.Write(run.GetContainer().ModalData, 0, 0, run.GetContainer().RunData);
-			run.Run();
-			sumWriter.Finish();
-			Assert.IsTrue(run.FinishedWithoutErrors);
-		}
-	}
+using NUnit.Framework;
+using TUGraz.VectoCommon.Models;
+using TUGraz.VectoCommon.Utils;
+using TUGraz.VectoCore.Configuration;
+using TUGraz.VectoCore.Models.Connector.Ports.Impl;
+using TUGraz.VectoCore.Models.Simulation.Data;
+using TUGraz.VectoCore.Models.Simulation.Impl;
+using TUGraz.VectoCore.Models.SimulationComponent.Data;
+using TUGraz.VectoCore.Models.SimulationComponent.Impl;
+using TUGraz.VectoCore.OutputData;
+using TUGraz.VectoCore.OutputData.FileIO;
+using TUGraz.VectoCore.Tests.Integration;
+using TUGraz.VectoCore.Tests.Utils;
+
+namespace TUGraz.VectoCore.Tests.Models.SimulationComponent
+{
+	[TestFixture]
+	public class ATGearboxTest
+	{
+		public const string EngineDataFile = @"TestData\Components\AT_GBX\Engine.veng";
+		public const string GearboxDataFile = @"TestData\Components\AT_GBX\GearboxSerial.vgbx";
+
+		[Test,
+		TestCase(0, 100, 1),
+		TestCase(0, 200, 1),
+		TestCase(5, 100, 1),
+		TestCase(5, 300, 1),
+		TestCase(5, 600, 1),
+		TestCase(15, 100, 3),
+		TestCase(15, 300, 3),
+		TestCase(15, 600, 3),
+		TestCase(40, 100, 6),
+		TestCase(40, 300, 6),
+		TestCase(40, 600, 6),
+		TestCase(70, 100, 6),
+		TestCase(70, 300, 6),
+		TestCase(70, 600, 6),
+		]
+		public void TestATGearInitialize(double vehicleSpeed, double torque, int expectedGear)
+		{
+			var gearboxData = MockSimulationDataFactory.CreateGearboxDataFromFile(GearboxDataFile, EngineDataFile, false);
+			var vehicleContainer = new MockVehicleContainer(); //(ExecutionMode.Engineering);
+			var engineData = MockSimulationDataFactory.CreateEngineDataFromFile(EngineDataFile, gearboxData.Gears.Count);
+			vehicleContainer.Engine = new CombustionEngine(vehicleContainer, engineData);
+			var runData = new VectoRunData() { GearboxData = gearboxData };
+			var gearbox = new ATGearbox(vehicleContainer, new ATShiftStrategy(gearboxData, vehicleContainer), runData);
+
+			vehicleContainer.VehicleSpeed = vehicleSpeed.KMPHtoMeterPerSecond();
+
+			var tnPort = new MockTnOutPort();
+			gearbox.Connect(tnPort);
+
+			// r_dyn = 0.465m, i_axle = 6.2
+			var angularVelocity = vehicleSpeed.KMPHtoMeterPerSecond() / 0.465.SI<Meter>() * 6.2;
+			var response = gearbox.Initialize(torque.SI<NewtonMeter>(), angularVelocity);
+
+			Assert.IsInstanceOf(typeof(ResponseSuccess), response);
+			Assert.AreEqual(expectedGear, gearbox.Gear);
+			Assert.AreEqual(vehicleSpeed.IsEqual(0), gearbox.Disengaged);
+		}
+
+		[Test,
+		TestCase(GearboxType.ATSerial, TestName = "Drive TorqueConverter - Serial"),
+		TestCase(GearboxType.ATPowerSplit, TestName = "Drive TorqueConverter - PowerSplit")]
+		public void TestATGearboxDriveTorqueConverter(GearboxType gbxType)
+		{
+			var cycleData = @"   0,  0, 0,    2
+								20,  8, 0,    0
+							   200,  0, 0,    2";
+			var cycle = SimpleDrivingCycles.CreateCycleData(cycleData);
+			var run = ATPowerTrain.CreateEngineeringRun(cycle, gbxType,
+				string.Format("AT_Vehicle_Drive-TC-{0}.vmod", gbxType == GearboxType.ATSerial ? "ser" : "ps"));
+
+			run.Run();
+			Assert.IsTrue(run.FinishedWithoutErrors);
+		}
+
+		[Test,
+		TestCase(GearboxType.ATSerial, TestName = "ShiftUp TorqueConverter - Serial"),
+		TestCase(GearboxType.ATPowerSplit, TestName = "ShiftUp TorqueConverter - PowerSplit")]
+		public void TestATGearboxShiftUp(GearboxType gbxType)
+		{
+			var cycleData = @"  0,  0, 0,    2
+							  500, 40, 0,    0";
+			var cycle = SimpleDrivingCycles.CreateCycleData(cycleData);
+			var run = ATPowerTrain.CreateEngineeringRun(cycle, gbxType,
+				string.Format("AT_Vehicle_Drive-TC_shiftup-{0}.vmod", gbxType == GearboxType.ATSerial ? "ser" : "ps"));
+
+			run.Run();
+			Assert.IsTrue(run.FinishedWithoutErrors);
+		}
+
+		[Test,
+		TestCase(GearboxType.ATSerial, TestName = "ShiftDown TorqueConverter - Serial"),
+		TestCase(GearboxType.ATPowerSplit, TestName = "ShiftDown TorqueConverter - PowerSplit")]
+		public void TestATGearboxShiftDown(GearboxType gbxType)
+		{
+			var cycleData = @"  0, 70, 0,    0
+							  500,  0, 0,    2";
+			var cycle = SimpleDrivingCycles.CreateCycleData(cycleData);
+			var run = ATPowerTrain.CreateEngineeringRun(cycle, gbxType,
+				string.Format("AT_Vehicle_Drive-TC_shiftdown-{0}.vmod", gbxType == GearboxType.ATSerial ? "ser" : "ps"));
+
+			run.Run();
+			Assert.IsTrue(run.FinishedWithoutErrors);
+		}
+
+
+		[Test,
+		TestCase("Urban", GearboxType.ATSerial),
+		TestCase("Suburban", GearboxType.ATSerial),
+		TestCase("Interurban", GearboxType.ATSerial),
+		TestCase("HeavyUrban", GearboxType.ATSerial),
+		TestCase("Urban", GearboxType.ATPowerSplit),
+		TestCase("Suburban", GearboxType.ATPowerSplit),
+		TestCase("Interurban", GearboxType.ATPowerSplit),
+		TestCase("HeavyUrban", GearboxType.ATPowerSplit)
+		]
+		public void TestATGearboxDriveCycle(string cycleName, GearboxType gbxType)
+		{
+			Assert.IsTrue(gbxType.AutomaticTransmission());
+			var cycle = SimpleDrivingCycles.ReadDeclarationCycle(cycleName);
+			var run = ATPowerTrain.CreateEngineeringRun(cycle, gbxType,
+				string.Format("AT_Vehicle_Drive-TC_{0}-{1}.vmod", cycleName, gbxType == GearboxType.ATSerial ? "ser" : "ps"));
+
+			var sumWriter =
+				new SummaryDataContainer(
+					new FileOutputWriter(string.Format("AT_Vehicle_Drive-TC_{0}-{1}", cycleName,
+						gbxType == GearboxType.ATSerial ? "ser" : "ps")));
+			((VehicleContainer)run.GetContainer()).WriteSumData = (modData) =>
+				sumWriter.Write(run.GetContainer().ModalData, 0, 0, run.GetContainer().RunData);
+			run.Run();
+			sumWriter.Finish();
+			Assert.IsTrue(run.FinishedWithoutErrors);
+		}
+	}
 }
\ No newline at end of file
diff --git a/VectoCore/VectoCoreTest/TestData/Components/AT_GBX/GearboxSerialDualTCBus.vgbx b/VectoCore/VectoCoreTest/TestData/Components/AT_GBX/GearboxSerialDualTCBus.vgbx
new file mode 100644
index 0000000000000000000000000000000000000000..cf00163cc28aa4f96ce9e8e2f8c5e96c2f41a9d7
--- /dev/null
+++ b/VectoCore/VectoCoreTest/TestData/Components/AT_GBX/GearboxSerialDualTCBus.vgbx
@@ -0,0 +1,68 @@
+{
+  "Header": {
+    "CreatedBy": " ()",
+    "Date": "03.08.2016 14:22:48",
+    "AppVersion": "2.2",
+    "FileVersion": 6
+  },
+  "Body": {
+    "SavedInDeclMode": false,
+    "ModelName": "AT Serial",
+    "Inertia": 0.0,
+    "TracInt": 0.0,
+    "Gears": [
+      {
+        "Ratio": 2.1,
+        "Efficiency": "0.98"
+      },
+      {
+        "Ratio": 4.58,
+        "Efficiency": "0.98",
+        "ShiftPolygon": "AT-Shift.vgbs",
+        "FullLoadCurve": "<NOFILE>"
+      },
+      {
+        "Ratio": 2.4,
+        "Efficiency": "0.98",
+        "ShiftPolygon": "AT-Shift.vgbs",
+        "FullLoadCurve": "<NOFILE>"
+      },
+      {
+        "Ratio": 1.8,
+        "Efficiency": "0.98",
+        "ShiftPolygon": "AT-Shift.vgbs",
+        "FullLoadCurve": "<NOFILE>"
+      },
+      {
+        "Ratio": 1.3,
+        "Efficiency": "0.98",
+        "ShiftPolygon": "AT-Shift.vgbs",
+        "FullLoadCurve": "<NOFILE>"
+      },
+      {
+        "Ratio": 1.0,
+        "Efficiency": "0.98",
+        "ShiftPolygon": "AT-Shift.vgbs",
+        "FullLoadCurve": "<NOFILE>"
+      }
+    ],
+    "TqReserve": 0.0,
+    "SkipGears": false,
+    "ShiftTime": 0,
+    "EaryShiftUp": false,
+    "StartTqReserve": 0.0,
+    "StartSpeed": 0.0,
+    "StartAcc": 0.0,
+    "GearboxType": "ATSerial",
+    "TorqueConverter": {
+      "Enabled": true,
+      "File": "TorqueConverter.vtcc",
+	  "ShiftPolygon": "AT-Shift.vgbs",
+      "RefRPM": 1000.0,
+      "Inertia": 0.0
+    },
+    "DownshiftAferUpshiftDelay": 0.0,
+    "UpshiftAfterDownshiftDelay": 0.0,
+    "UpshiftMinAcceleration": 0.0
+  }
+}
\ No newline at end of file
diff --git a/VectoCore/VectoCoreTest/Utils/MockSimulationDataFactory.cs b/VectoCore/VectoCoreTest/Utils/MockSimulationDataFactory.cs
index 0531a6625ca38aa9f5da975d5bcec5b9b2a2f68e..675a82b958dfce5b28dde0ecebee4a215dafdce5 100644
--- a/VectoCore/VectoCoreTest/Utils/MockSimulationDataFactory.cs
+++ b/VectoCore/VectoCoreTest/Utils/MockSimulationDataFactory.cs
@@ -29,85 +29,88 @@
 *   Martin Rexeis, rexeis@ivt.tugraz.at, IVT, Graz University of Technology
 */
 
-using System.Collections.Generic;
-using TUGraz.VectoCommon.Exceptions;
-using TUGraz.VectoCommon.InputData;
-using TUGraz.VectoCommon.Utils;
-using TUGraz.VectoCore.InputData.FileIO.JSON;
-using TUGraz.VectoCore.InputData.Reader.DataObjectAdapter;
-using TUGraz.VectoCore.Models.SimulationComponent.Data;
-
-namespace TUGraz.VectoCore.Tests.Utils
-{
-	public class MockSimulationDataFactory
-	{
-		/// <summary>
-		/// Create gearboxdata instance directly from a file
-		/// </summary>
-		/// <param name="gearBoxFile"></param>
-		/// <param name="engineFile"></param>
-		/// <param name="declarationMode"></param>
-		/// <returns>GearboxData instance</returns>
-		public static GearboxData CreateGearboxDataFromFile(string gearBoxFile, string engineFile, bool declarationMode = true)
-		{
-			var gearboxInput = JSONInputDataFactory.ReadGearbox(gearBoxFile);
-			var engineInput = JSONInputDataFactory.ReadEngine(engineFile);
-			if (declarationMode) {
-				var dao = new DeclarationDataAdapter();
-				var engineData = dao.CreateEngineData(engineInput, null, gearboxInput, new List<ITorqueLimitInputData>());
-				return dao.CreateGearboxData(gearboxInput, engineData, ((IAxleGearInputData)gearboxInput).Ratio, 0.5.SI<Meter>(),
-					false);
-			} else {
-				var dao = new EngineeringDataAdapter();
-				var engineData = dao.CreateEngineData(engineInput, gearboxInput, new List<ITorqueLimitInputData>());
-				return dao.CreateGearboxData(gearboxInput, engineData, ((IAxleGearInputData)gearboxInput).Ratio, 0.5.SI<Meter>(),
-					true);
-			}
-		}
-
-		public static AxleGearData CreateAxleGearDataFromFile(string axleGearFile)
-		{
-			var dao = new DeclarationDataAdapter();
-			var axleGearInput = JSONInputDataFactory.ReadGearbox(axleGearFile);
-			return dao.CreateAxleGearData((IAxleGearInputData)axleGearInput, false);
-		}
-
-		public static CombustionEngineData CreateEngineDataFromFile(string engineFile, int numGears)
-		{
-			var dao = new EngineeringDataAdapter();
-			var engineInput = JSONInputDataFactory.ReadEngine(engineFile);
-			var engineData = dao.CreateEngineData(engineInput, null, new List<ITorqueLimitInputData>());
-			for (uint i = 1; i <= numGears; i++) {
-				engineData.FullLoadCurves[i] = engineData.FullLoadCurves[0];
-			}
-			return engineData;
-		}
-
-		public static VehicleData CreateVehicleDataFromFile(string vehicleDataFile)
-		{
-			var dao = new EngineeringDataAdapter();
-			var vehicleInput = JSONInputDataFactory.ReadJsonVehicle(vehicleDataFile);
-			var airdragData = vehicleInput as IAirdragEngineeringInputData;
-			return dao.CreateVehicleData(vehicleInput);
-		}
-
-		public static AirdragData CreateAirdragDataFromFile(string vehicleDataFile)
-		{
-			var dao = new EngineeringDataAdapter();
-			var vehicleInput = JSONInputDataFactory.ReadJsonVehicle(vehicleDataFile);
-			var airdragData = vehicleInput as IAirdragEngineeringInputData;
-			return dao.CreateAirdragData(airdragData, vehicleInput);
-		}
-
-		public static DriverData CreateDriverDataFromFile(string driverDataFile)
-		{
-			var jobInput = JSONInputDataFactory.ReadJsonJob(driverDataFile);
-			var engineeringJob = jobInput as IEngineeringInputDataProvider;
-			if (engineeringJob == null) {
-				throw new VectoException("Failed to cas to Engineering InputDataProvider");
-			}
-			var dao = new EngineeringDataAdapter();
-			return dao.CreateDriverData(engineeringJob.DriverInputData);
-		}
-	}
+using System.Collections.Generic;
+using TUGraz.VectoCommon.Exceptions;
+using TUGraz.VectoCommon.InputData;
+using TUGraz.VectoCommon.Models;
+using TUGraz.VectoCommon.Utils;
+using TUGraz.VectoCore.InputData.FileIO.JSON;
+using TUGraz.VectoCore.InputData.Reader.DataObjectAdapter;
+using TUGraz.VectoCore.Models.SimulationComponent.Data;
+
+namespace TUGraz.VectoCore.Tests.Utils
+{
+	public class MockSimulationDataFactory
+	{
+		/// <summary>
+		/// Create gearboxdata instance directly from a file
+		/// </summary>
+		/// <param name="gearBoxFile"></param>
+		/// <param name="engineFile"></param>
+		/// <param name="declarationMode"></param>
+		/// <returns>GearboxData instance</returns>
+		public static GearboxData CreateGearboxDataFromFile(string gearBoxFile, string engineFile, bool declarationMode = true)
+		{
+			var gearboxInput = JSONInputDataFactory.ReadGearbox(gearBoxFile);
+			var engineInput = JSONInputDataFactory.ReadEngine(engineFile);
+			if (declarationMode) {
+				var dao = new DeclarationDataAdapter();
+				var engineData = dao.CreateEngineData(engineInput, null, gearboxInput, new List<ITorqueLimitInputData>());
+				return dao.CreateGearboxData(gearboxInput, engineData, ((IAxleGearInputData)gearboxInput).Ratio, 0.5.SI<Meter>(),
+					VehicleCategory.RigidTruck,
+					false);
+			} else {
+				var dao = new EngineeringDataAdapter();
+				var engineData = dao.CreateEngineData(engineInput, gearboxInput, new List<ITorqueLimitInputData>());
+				return dao.CreateGearboxData(gearboxInput, engineData, ((IAxleGearInputData)gearboxInput).Ratio, 0.5.SI<Meter>(),
+					VehicleCategory.RigidTruck,
+					true);
+			}
+		}
+
+		public static AxleGearData CreateAxleGearDataFromFile(string axleGearFile)
+		{
+			var dao = new DeclarationDataAdapter();
+			var axleGearInput = JSONInputDataFactory.ReadGearbox(axleGearFile);
+			return dao.CreateAxleGearData((IAxleGearInputData)axleGearInput, false);
+		}
+
+		public static CombustionEngineData CreateEngineDataFromFile(string engineFile, int numGears)
+		{
+			var dao = new EngineeringDataAdapter();
+			var engineInput = JSONInputDataFactory.ReadEngine(engineFile);
+			var engineData = dao.CreateEngineData(engineInput, null, new List<ITorqueLimitInputData>());
+			for (uint i = 1; i <= numGears; i++) {
+				engineData.FullLoadCurves[i] = engineData.FullLoadCurves[0];
+			}
+			return engineData;
+		}
+
+		public static VehicleData CreateVehicleDataFromFile(string vehicleDataFile)
+		{
+			var dao = new EngineeringDataAdapter();
+			var vehicleInput = JSONInputDataFactory.ReadJsonVehicle(vehicleDataFile);
+			var airdragData = vehicleInput as IAirdragEngineeringInputData;
+			return dao.CreateVehicleData(vehicleInput);
+		}
+
+		public static AirdragData CreateAirdragDataFromFile(string vehicleDataFile)
+		{
+			var dao = new EngineeringDataAdapter();
+			var vehicleInput = JSONInputDataFactory.ReadJsonVehicle(vehicleDataFile);
+			var airdragData = vehicleInput as IAirdragEngineeringInputData;
+			return dao.CreateAirdragData(airdragData, vehicleInput);
+		}
+
+		public static DriverData CreateDriverDataFromFile(string driverDataFile)
+		{
+			var jobInput = JSONInputDataFactory.ReadJsonJob(driverDataFile);
+			var engineeringJob = jobInput as IEngineeringInputDataProvider;
+			if (engineeringJob == null) {
+				throw new VectoException("Failed to cas to Engineering InputDataProvider");
+			}
+			var dao = new EngineeringDataAdapter();
+			return dao.CreateDriverData(engineeringJob.DriverInputData);
+		}
+	}
 }
\ No newline at end of file
diff --git a/VectoCore/VectoCoreTest/VectoCoreTest.csproj b/VectoCore/VectoCoreTest/VectoCoreTest.csproj
index 11a4c5a1abdaf69bdc8a960b7bf3c5e063e42dab..fcf0b2932db38f99aa99b37f27fa1852fb44d309 100644
--- a/VectoCore/VectoCoreTest/VectoCoreTest.csproj
+++ b/VectoCore/VectoCoreTest/VectoCoreTest.csproj
@@ -261,6 +261,9 @@
     <None Include="TestData\Components\AT_GBX\GearboxSerial.vgbx">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </None>
+    <None Include="TestData\Components\AT_GBX\GearboxSerialDualTCBus.vgbx">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
     <None Include="TestData\Components\AT_GBX\GearboxSerialDualTC.vgbx">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </None>