From 45c38b9fe4948da5937666ab48a61d5d09476452 Mon Sep 17 00:00:00 2001
From: Markus Quaritsch <markus.quaritsch@tugraz.at>
Date: Thu, 11 May 2017 14:04:28 +0200
Subject: [PATCH] major refactoring: use multiple full-load curves, one per
 gear. introduce vehicle-defined limits and gearbox-defined limits

all test-cases green.
---
 VECTO/GUI/GearboxForm.vb                      |  5 +-
 VECTO/Input Files/Engine.vb                   | 10 ++-
 VECTO/Input Files/Gearbox.vb                  | 28 +++++---
 VECTO/MainModule.vb                           | 11 ++--
 .../XMLEngineeringVehicleDataProvider.cs      |  4 +-
 .../DeclarationDataAdapter.cs                 | 58 ++++++++++++++---
 .../EngineeringDataAdapter.cs                 | 22 +++++--
 .../DeclarationModeVectoRunDataFactory.cs     |  4 +-
 .../Impl/EngineOnlyVectoRunDataFactory.cs     |  7 +-
 .../EngineeringModeVectoRunDataFactory.cs     |  3 +-
 .../Models/Declaration/DeclarationData.cs     | 40 ++++++------
 .../Models/Simulation/Data/VectoRunData.cs    | 17 +++--
 .../Simulation/Impl/VehicleContainer.cs       |  2 +-
 .../Data/CombustionEngineData.cs              |  5 +-
 .../Data/Engine/EngineFullLoadCurve.cs        | 12 +---
 .../SimulationComponent/Data/FullLoadCurve.cs | 12 ++++
 .../Impl/AMTShiftStrategy.cs                  |  5 +-
 .../Models/SimulationComponent/Impl/Clutch.cs |  2 +-
 .../Impl/CombustionEngine.cs                  | 27 ++++----
 .../Impl/EngineOnlyCombustionEngine.cs        |  2 +-
 .../SimulationComponent/Impl/Gearbox.cs       |  3 +
 .../VectoCore/OutputData/DeclarationReport.cs |  3 +-
 .../OutputData/PDF/PDFDeclarationReport.cs    |  6 +-
 .../OutputData/SummaryDataContainer.cs        |  4 +-
 .../OutputData/XML/XMLDeclarationWriter.cs    |  2 +-
 VectoCore/VectoCoreTest/FileIO/JsonTest.cs    | 12 ++--
 .../VectoCoreTest/Integration/ATPowerTrain.cs |  5 +-
 .../BusAuxiliaries/AuxDemandTest.cs           |  3 +-
 .../Integration/CoachAdvancedAuxPowertrain.cs |  8 ++-
 .../Integration/CoachPowerTrain.cs            |  4 +-
 .../EngineOnlyCycle/EngineOnlyCycleTest.cs    |  4 +-
 .../SimulationRuns/FullPowertrain.cs          | 12 ++--
 .../SimulationRuns/MinimalPowertrain.cs       |  6 +-
 .../Integration/Truck40tPowerTrain.cs         |  7 +-
 .../Models/Declaration/ShiftPolygonTest.cs    | 64 +++++++++++--------
 .../Simulation/LossMapRangeValidationTest.cs  | 10 +--
 .../Simulation/MeasuredSpeedModeTest.cs       | 16 ++++-
 .../Models/Simulation/PwheelModeTests.cs      |  6 +-
 .../Simulation/VechicleContainerTests.cs      |  2 +-
 .../SimulationComponent/ATGearboxTest.cs      |  4 +-
 .../Models/SimulationComponent/ClutchTest.cs  |  6 +-
 .../CombustionEngineTest.cs                   | 24 +++----
 .../Models/SimulationComponent/DriverTest.cs  |  9 +--
 .../GearboxShiftLossesTest.cs                 |  2 +-
 .../Models/SimulationComponent/GearboxTest.cs | 40 +++++++-----
 .../FullLoadCurveTest.cs                      |  8 ++-
 .../SimulationComponentData/ValidationTest.cs | 57 +++++++++++++++--
 .../VectoCoreTest/Reports/ModDataTest.cs      |  2 +-
 VectoCore/VectoCoreTest/Utils/MockRunData.cs  | 38 ++++++-----
 .../Utils/MockSimulationDataFactory.cs        | 13 ++--
 .../VectoCoreTest/Utils/ShiftPolygonDrawer.cs | 11 ++--
 51 files changed, 430 insertions(+), 237 deletions(-)

diff --git a/VECTO/GUI/GearboxForm.vb b/VECTO/GUI/GearboxForm.vb
index d07c54638e..83e598de7d 100644
--- a/VECTO/GUI/GearboxForm.vb
+++ b/VECTO/GUI/GearboxForm.vb
@@ -897,7 +897,7 @@ Public Class GearboxForm
 	Private Function GetShiftLines(ByVal idleSpeed As PerSecond, engineFullLoadCurve As EngineFullLoadCurve,
 									vehicle As IVehicleEngineeringInputData, gears As IList(Of ITransmissionInputData), ByVal gear As Integer) _
 		As ShiftPolygon
-		Dim engine As CombustionEngineData = ConvertToEngineData(engineFullLoadCurve, idleSpeed)
+		Dim engine As CombustionEngineData = ConvertToEngineData(engineFullLoadCurve, idleSpeed, gear, LvGears.Items(gear).SubItems(GearboxTbl.MaxTorque).Text.ToDouble(0).SI(Of NewtonMeter))
 		If gears.Count <= 1 Then
 			Return Nothing
 		End If
@@ -911,8 +911,7 @@ Public Class GearboxForm
 		If (rDyn.IsEqual(0)) Then
 			Return Nothing
 		End If
-		Dim shiftLines As ShiftPolygon = DeclarationData.Gearbox.ComputeShiftPolygon(gear - 1, engine.FullLoadCurve, gears,
-																					engine,
+		Dim shiftLines As ShiftPolygon = DeclarationData.Gearbox.ComputeShiftPolygon(gear - 1, engine.FullLoadCurves(CType(gear, UInteger)), gears, engine,
 																					Double.Parse(LvGears.Items(0).SubItems(GearboxTbl.Ratio).Text, CultureInfo.InvariantCulture),
 																					(rDyn))
 		Return shiftLines
diff --git a/VECTO/Input Files/Engine.vb b/VECTO/Input Files/Engine.vb
index 286919a19b..ea41d4562b 100644
--- a/VECTO/Input Files/Engine.vb	
+++ b/VECTO/Input Files/Engine.vb	
@@ -241,11 +241,15 @@ Public Class Engine
 		Try
 			If mode = ExecutionMode.Declaration Then
 				Dim doa As DeclarationDataAdapter = New DeclarationDataAdapter()
-
-				engineData = doa.CreateEngineData(engine, GearboxType.AMT)
+				Dim dummyGearboxData As IGearboxDeclarationInputData = New Gearbox() With {
+					.Type = GearboxType.AMT,
+					.MaxTorque = New List(Of String),
+					.GearRatios = New List(Of Double)()
+				}
+				engineData = doa.CreateEngineData(engine, dummyGearboxData, New List(Of ITorqueLimitInputData))
 			Else
 				Dim doa As EngineeringDataAdapter = New EngineeringDataAdapter()
-				engineData = doa.CreateEngineData(engine, Nothing)
+				engineData = doa.CreateEngineData(engine, Nothing, New List(Of ITorqueLimitInputData))
 			End If
 
 			Dim result As IList(Of ValidationResult) =
diff --git a/VECTO/Input Files/Gearbox.vb b/VECTO/Input Files/Gearbox.vb
index 378a26b4b1..c6fc9e6589 100644
--- a/VECTO/Input Files/Gearbox.vb	
+++ b/VECTO/Input Files/Gearbox.vb	
@@ -208,9 +208,10 @@ Public Class Gearbox
 				Dim doa As DeclarationDataAdapter = New DeclarationDataAdapter()
 
 				Try
-					engine = doa.CreateEngineData(inputData.EngineInputData, gearbox.Type)
+
+					engine = doa.CreateEngineData(inputData.EngineInputData, gearbox, New List(Of ITorqueLimitInputData))
 				Catch
-					engine = GetDefaultEngine()
+					engine = GetDefaultEngine(gearbox.Gears)
 				End Try
 
 				axlegearData = doa.CreateAxleGearData(gearbox, False)
@@ -218,9 +219,9 @@ Public Class Gearbox
 			Else
 				Dim doa As EngineeringDataAdapter = New EngineeringDataAdapter()
 				Try
-					engine = doa.CreateEngineData(inputData.EngineInputData, gearbox)
+					engine = doa.CreateEngineData(inputData.EngineInputData, gearbox, New List(Of ITorqueLimitInputData))
 				Catch
-					engine = GetDefaultEngine()
+					engine = GetDefaultEngine(gearbox.Gears)
 				End Try
 
 				axlegearData = doa.CreateAxleGearData(gearbox, True)
@@ -250,7 +251,7 @@ Public Class Gearbox
 		End Try
 	End Function
 
-	Private Shared Function GetDefaultEngine() As CombustionEngineData
+	Private Shared Function GetDefaultEngine(gears As IList(Of ITransmissionInputData)) As CombustionEngineData
 		Dim fldData As MemoryStream = New MemoryStream()
 		Dim writer As StreamWriter = New StreamWriter(fldData)
 		writer.WriteLine("engine speed, full load torque, motoring torque")
@@ -258,12 +259,21 @@ Public Class Gearbox
 		writer.WriteLine("2500, 2000, -500")
 		writer.Flush()
 		fldData.Seek(0, SeekOrigin.Begin)
+		Dim retVal As CombustionEngineData = New CombustionEngineData() With {
+				.IdleSpeed = 600.RPMtoRad()
+				}
 
 		Dim fldCurve As EngineFullLoadCurve = EngineFullLoadCurve.Create(VectoCSVFile.ReadStream(fldData))
-		Return New CombustionEngineData() With {
-			.IdleSpeed = 600.RPMtoRad(),
-			.FullLoadCurve = fldCurve
-			}
+		Dim fullLoadCurves As Dictionary(Of UInteger, EngineFullLoadCurve) =
+				New Dictionary(Of UInteger, EngineFullLoadCurve)()
+		fullLoadCurves(0) = EngineFullLoadCurve.Create(VectoCSVFile.ReadStream(fldData))
+		fullLoadCurves(0).EngineData = retVal
+		For i As Integer = 0 To gears.Count - 1
+			fullLoadCurves(CType(i + 1, UInteger)) = AbstractSimulationDataAdapter.IntersectFullLoadCurves(fullLoadCurves(0),
+																										gears(i).MaxTorque)
+		Next
+		retVal.FullLoadCurves = fullLoadCurves
+		Return retVal
 	End Function
 
 
diff --git a/VECTO/MainModule.vb b/VECTO/MainModule.vb
index ed8d20ddd8..fa3baf3f87 100644
--- a/VECTO/MainModule.vb
+++ b/VECTO/MainModule.vb
@@ -16,6 +16,7 @@ Imports TUGraz.VectoCommon
 Imports TUGraz.VectoCommon.InputData
 Imports TUGraz.VectoCommon.OutputData
 Imports TUGraz.VectoCommon.Utils
+Imports TUGraz.VectoCore.InputData.Reader.DataObjectAdapter
 Imports TUGraz.VectoCore.Models.SimulationComponent.Data
 Imports TUGraz.VectoCore.Models.SimulationComponent.Data.Engine
 Imports VectoAuxiliaries
@@ -27,10 +28,14 @@ Imports VectoAuxiliaries
 Module MainModule
 	Public JobFileList As List(Of String)
 
-	Public Function ConvertToEngineData(fld As EngineFullLoadCurve, nIdle As PerSecond) As CombustionEngineData
+	Public Function ConvertToEngineData(ByVal fld As EngineFullLoadCurve, ByVal nIdle As PerSecond, ByVal gear As Integer,
+										ByVal maxTorque As NewtonMeter) As CombustionEngineData
 
 		Dim retVal As CombustionEngineData = New CombustionEngineData()
-		retVal.FullLoadCurve = fld
+		Dim fullLoadCurves As Dictionary(Of UInteger, EngineFullLoadCurve) = New Dictionary(Of UInteger, EngineFullLoadCurve)
+		fullLoadCurves(0) = fld
+		fullLoadCurves(CType(gear, UInteger)) = AbstractSimulationDataAdapter.IntersectFullLoadCurves(fld, maxTorque)
+		retVal.FullLoadCurves = fullLoadCurves
 		retVal.IdleSpeed = nIdle
 		Return retVal
 	End Function
@@ -63,6 +68,4 @@ Module MainModule
 		End If
 		Return filePath
 	End Function
-
-	
 End Module
diff --git a/VectoCore/VectoCore/InputData/FileIO/XML/Engineering/XMLEngineeringVehicleDataProvider.cs b/VectoCore/VectoCore/InputData/FileIO/XML/Engineering/XMLEngineeringVehicleDataProvider.cs
index 6c4eebd7fb..53ff07727f 100644
--- a/VectoCore/VectoCore/InputData/FileIO/XML/Engineering/XMLEngineeringVehicleDataProvider.cs
+++ b/VectoCore/VectoCore/InputData/FileIO/XML/Engineering/XMLEngineeringVehicleDataProvider.cs
@@ -54,7 +54,9 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Engineering
 		{
 			get {
 				var retVal = new List<ITorqueLimitInputData>();
-				var limits = Navigator.Select(Helper.Query(VehiclePath, XMLNames.Vehicle_TorqueLimits, "Entry"));
+				var limits =
+					Navigator.Select(Helper.Query(VehiclePath, XMLNames.Vehicle_TorqueLimits, XMLNames.Vehicle_TorqueLimits_Entry),
+						Manager);
 				while (limits.MoveNext()) {
 					retVal.Add(new TorqueLimitInputData() {
 						Gear = limits.Current.GetAttribute(XMLNames.Vehicle_TorqueLimits_Entry_Gear_Attr, "").ToInt(),
diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapter.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapter.cs
index 5ec459f13e..624be13dca 100644
--- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapter.cs
+++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapter.cs
@@ -150,7 +150,8 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter
 			return DeclarationData.PoweredAxle();
 		}
 
-		internal CombustionEngineData CreateEngineData(IEngineDeclarationInputData engine, GearboxType gearboxType)
+		internal CombustionEngineData CreateEngineData(IEngineDeclarationInputData engine,
+			IGearboxDeclarationInputData gearbox, IEnumerable<ITorqueLimitInputData> torqueLimits)
 		{
 			if (!engine.SavedInDeclarationMode) {
 				WarnDeclarationMode("EngineData");
@@ -161,12 +162,53 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter
 			retVal.WHTCMotorway = engine.WHTCMotorway;
 			retVal.WHTCRural = engine.WHTCRural;
 			retVal.ColdHotCorrectionFactor = engine.ColdHotBalancingFactor;
-			retVal.Inertia = DeclarationData.Engine.EngineInertia(retVal.Displacement, gearboxType);
-			retVal.FullLoadCurve = EngineFullLoadCurve.Create(engine.FullLoadCurve, true);
-			retVal.FullLoadCurve.EngineData = retVal;
+			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] = EngineFullLoadCurve.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)
 		{
@@ -199,6 +241,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter
 
 			TransmissionLossMap gearLossMap;
 			retVal.Gears = gears.Select((gear, i) => {
+				uint gearNbr = (uint)(i + 1);
 				try {
 					if (gear.LossMap == null) {
 						throw new InvalidFileFormatException(string.Format("LossMap for Gear {0} is missing.", i + 1));
@@ -212,11 +255,10 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter
 					}
 				}
 
-				var fullLoadCurve = IntersectFullLoadCurves(engine.FullLoadCurve, gear.MaxTorque);
-				var shiftPolygon = DeclarationData.Gearbox.ComputeShiftPolygon(i, fullLoadCurve, gears, engine, axlegearRatio,
-					dynamicTyreRadius);
+				var shiftPolygon = DeclarationData.Gearbox.ComputeShiftPolygon(i, engine.FullLoadCurves[gearNbr], gears, engine,
+					axlegearRatio, dynamicTyreRadius);
 
-				return new KeyValuePair<uint, GearData>((uint)i + 1,
+				return new KeyValuePair<uint, GearData>(gearNbr,
 					new GearData {
 						LossMap = gearLossMap,
 						ShiftPolygon = shiftPolygon,
diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/EngineeringDataAdapter.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/EngineeringDataAdapter.cs
index 9f6a5c08f2..e54a855fa2 100644
--- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/EngineeringDataAdapter.cs
+++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/EngineeringDataAdapter.cs
@@ -124,7 +124,8 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter
 			Log.Error("{0} is in Declaration Mode but is used for Engineering Mode!", msg);
 		}
 
-		internal CombustionEngineData CreateEngineData(IEngineEngineeringInputData engine, IGearboxEngineeringInputData gbx)
+		internal CombustionEngineData CreateEngineData(IEngineEngineeringInputData engine, IGearboxEngineeringInputData gbx,
+			IEnumerable<ITorqueLimitInputData> torqueLimits)
 		{
 			if (engine.SavedInDeclarationMode) {
 				WarnEngineeringMode("EngineData");
@@ -133,8 +134,18 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter
 			var retVal = SetCommonCombustionEngineData(engine);
 			retVal.Inertia = engine.Inertia +
 							(gbx != null && gbx.Type.AutomaticTransmission() ? gbx.TorqueConverter.Inertia : 0.SI<KilogramSquareMeter>());
-			retVal.FullLoadCurve = EngineFullLoadCurve.Create(engine.FullLoadCurve);
-			retVal.FullLoadCurve.EngineData = retVal;
+			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] = EngineFullLoadCurve.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.WHTCCorrectionFactor = engine.WHTCEngineering;
 			return retVal;
 		}
@@ -178,13 +189,14 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter
 					throw new InvalidFileFormatException("Gear {0} LossMap or Efficiency missing.", i + 1);
 				}
 
-				var fullLoadCurve = IntersectFullLoadCurves(engineData.FullLoadCurve, gear.MaxTorque);
+				//var fullLoadCurve = IntersectFullLoadCurves(engineData.FullLoadCurve, gear.MaxTorque);
 				if (gearbox.Type.AutomaticTransmission() && gear.ShiftPolygon == null) {
 					throw new VectoException("Shiftpolygons are required for AT Gearboxes!");
 				}
 				var shiftPolygon = gear.ShiftPolygon != null && gear.ShiftPolygon.SourceType != DataSourceType.Missing
 					? ShiftPolygonReader.Create(gear.ShiftPolygon)
-					: DeclarationData.Gearbox.ComputeShiftPolygon((int)i, fullLoadCurve, gearbox.Gears, engineData, axlegearRatio,
+					: DeclarationData.Gearbox.ComputeShiftPolygon((int)i, engineData.FullLoadCurves[i + 1], gearbox.Gears, engineData,
+						axlegearRatio,
 						dynamicTyreRadius);
 				var gearData = new GearData {
 					ShiftPolygon = shiftPolygon,
diff --git a/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationModeVectoRunDataFactory.cs b/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationModeVectoRunDataFactory.cs
index ca36a173d3..a20bddd1de 100644
--- a/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationModeVectoRunDataFactory.cs
+++ b/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationModeVectoRunDataFactory.cs
@@ -73,7 +73,7 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl
 			var tempVehicle = dao.CreateVehicleData(InputDataProvider.VehicleInputData, InputDataProvider.AirdragInputData,
 				segment.Missions.First(),
 				segment.Missions.First().Loadings.First().Value, segment.VehicleHeight);
-			var engineData = dao.CreateEngineData(InputDataProvider.EngineInputData, InputDataProvider.GearboxInputData.Type);
+			var engineData = dao.CreateEngineData(InputDataProvider.EngineInputData, InputDataProvider.GearboxInputData, InputDataProvider.VehicleInputData.TorqueLimits);
 			var axlegearData = dao.CreateAxleGearData(InputDataProvider.AxleGearInputData, false);
 			var angledriveData = dao.CreateAngledriveData(InputDataProvider.AngledriveInputData, false);
 			var gearboxData = dao.CreateGearboxData(InputDataProvider.GearboxInputData, engineData, axlegearData.AxleGear.Ratio,
@@ -95,7 +95,7 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl
 				};
 				Report.InitializeReport(powertrainConfig, segment);
 			}
-			var maxEnginePower = engineData.FullLoadCurve.FullLoadStationaryPower(engineData.FullLoadCurve.PreferredSpeed);
+			var maxEnginePower = engineData.FullLoadCurves[0].FullLoadStationaryPower(engineData.FullLoadCurves[0].PreferredSpeed);
 			foreach (var mission in segment.Missions) {
 				if (mission.MissionType.IsEMS() && maxEnginePower.IsSmaller(DeclarationData.MinEnginePowerForEMS)) {
 					continue;
diff --git a/VectoCore/VectoCore/InputData/Reader/Impl/EngineOnlyVectoRunDataFactory.cs b/VectoCore/VectoCore/InputData/Reader/Impl/EngineOnlyVectoRunDataFactory.cs
index 7ffdd8c59a..d5c91e579d 100644
--- a/VectoCore/VectoCore/InputData/Reader/Impl/EngineOnlyVectoRunDataFactory.cs
+++ b/VectoCore/VectoCore/InputData/Reader/Impl/EngineOnlyVectoRunDataFactory.cs
@@ -52,10 +52,9 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl
 			foreach (var cycle in InputDataProvider.JobInputData().Cycles) {
 				var simulationRunData = new VectoRunData {
 					JobName = InputDataProvider.JobInputData().JobName,
-					EngineData = dao.CreateEngineData(InputDataProvider.EngineInputData, null),
-					Cycle =
-						new DrivingCycleProxy(
-							DrivingCycleDataReader.ReadFromDataTable(cycle.CycleData, CycleType.EngineOnly, cycle.Name, false), cycle.Name),
+					EngineData = dao.CreateEngineData(InputDataProvider.EngineInputData, null, new List<ITorqueLimitInputData>()),
+					Cycle = new DrivingCycleProxy(
+						DrivingCycleDataReader.ReadFromDataTable(cycle.CycleData, CycleType.EngineOnly, cycle.Name, false), cycle.Name),
 					ExecutionMode = ExecutionMode.Engineering
 				};
 				yield return simulationRunData;
diff --git a/VectoCore/VectoCore/InputData/Reader/Impl/EngineeringModeVectoRunDataFactory.cs b/VectoCore/VectoCore/InputData/Reader/Impl/EngineeringModeVectoRunDataFactory.cs
index 75c8f302d9..737b325469 100644
--- a/VectoCore/VectoCore/InputData/Reader/Impl/EngineeringModeVectoRunDataFactory.cs
+++ b/VectoCore/VectoCore/InputData/Reader/Impl/EngineeringModeVectoRunDataFactory.cs
@@ -61,7 +61,8 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl
 		{
 			var dao = new EngineeringDataAdapter();
 			var driver = dao.CreateDriverData(InputDataProvider.DriverInputData);
-			var engineData = dao.CreateEngineData(InputDataProvider.EngineInputData, InputDataProvider.GearboxInputData);
+			var engineData = dao.CreateEngineData(InputDataProvider.EngineInputData, InputDataProvider.GearboxInputData,
+				InputDataProvider.VehicleInputData.TorqueLimits);
 
 			var tempVehicle = dao.CreateVehicleData(InputDataProvider.VehicleInputData, InputDataProvider.AirdragInputData);
 
diff --git a/VectoCore/VectoCore/Models/Declaration/DeclarationData.cs b/VectoCore/VectoCore/Models/Declaration/DeclarationData.cs
index d48e4cce70..a937b6c80b 100644
--- a/VectoCore/VectoCore/Models/Declaration/DeclarationData.cs
+++ b/VectoCore/VectoCore/Models/Declaration/DeclarationData.cs
@@ -39,6 +39,7 @@ using TUGraz.VectoCommon.Models;
 using TUGraz.VectoCommon.Utils;
 using TUGraz.VectoCore.InputData.Reader.ComponentData;
 using TUGraz.VectoCore.Models.SimulationComponent.Data;
+using TUGraz.VectoCore.Models.SimulationComponent.Data.Engine;
 using TUGraz.VectoCore.Models.SimulationComponent.Data.Gearbox;
 using TUGraz.VectoCore.Utils;
 
@@ -163,6 +164,9 @@ namespace TUGraz.VectoCore.Models.Declaration
 
 			public static readonly KilogramSquareMeter EngineBaseInertia = 0.41.SI<KilogramSquareMeter>();
 			public static readonly SI EngineDisplacementInertia = (0.27 * 1000).SI().Kilo.Gramm.Per.Meter; // [kg/m]
+			
+			public const double TorqueLimitGearboxFactor = 0.9;
+			public const double TorqueLimitVehicleFactor = 0.95;
 
 			public static KilogramSquareMeter EngineInertia(CubicMeter displacement, GearboxType gbxType)
 			{
@@ -196,14 +200,14 @@ namespace TUGraz.VectoCore.Models.Declaration
 			/// <summary>
 			/// computes the shift polygons for a single gear according to the whitebook 2016
 			/// </summary>
-			/// <param name="gear">index of the gear to compute the shift polygons for</param>
+			/// <param name="gearIdx">index of the gear to compute the shift polygons for  -- gear number - 1!</param>
 			/// <param name="fullLoadCurve">engine full load curve, potentially limited by the gearbox</param>
 			/// <param name="gears">list of gears</param>
 			/// <param name="engine">engine data</param>
 			/// <param name="axlegearRatio"></param>
 			/// <param name="dynamicTyreRadius"></param>
 			/// <returns></returns>
-			public static ShiftPolygon ComputeShiftPolygon(int gear, FullLoadCurve fullLoadCurve,
+			public static ShiftPolygon ComputeShiftPolygon(int gearIdx, EngineFullLoadCurve fullLoadCurve,
 				IList<ITransmissionInputData> gears, CombustionEngineData engine, double axlegearRatio, Meter dynamicTyreRadius)
 			{
 				if (gears.Count < 2) {
@@ -213,20 +217,20 @@ namespace TUGraz.VectoCore.Models.Declaration
 				// ReSharper disable once InconsistentNaming
 				var engineSpeed85kmhLastGear = ComputeEngineSpeed85kmh(gears[gears.Count - 1], axlegearRatio, dynamicTyreRadius);
 
-				var nVHigh = VectoMath.Min(engineSpeed85kmhLastGear, engine.FullLoadCurve.RatedSpeed);
+				var nVHigh = VectoMath.Min(engineSpeed85kmhLastGear, engine.FullLoadCurves[0].RatedSpeed);
 
 				var diffRatio = gears[gears.Count - 2].Ratio / gears[gears.Count - 1].Ratio - 1;
 
-				var maxDragTorque = engine.FullLoadCurve.MaxDragTorque * 1.1;
+				var maxDragTorque = fullLoadCurve.MaxDragTorque * 1.1;
 
 				var p1 = new Point(engine.IdleSpeed.Value() / 2, 0);
 				var p2 = new Point(engine.IdleSpeed.Value() * 1.1, 0);
 				var p3 = new Point(nVHigh.Value() * 0.9,
-					engine.FullLoadCurve.FullLoadStationaryTorque(nVHigh * 0.9).Value());
+					fullLoadCurve.FullLoadStationaryTorque(nVHigh * 0.9).Value());
 
 				var p4 =
 					new Point((nVHigh * (1 + diffRatio / 3)).Value(), 0);
-				var p5 = new Point(engine.FullLoadCurve.N95hSpeed.Value(), engine.FullLoadCurve.MaxTorque.Value());
+				var p5 = new Point(fullLoadCurve.N95hSpeed.Value(), fullLoadCurve.MaxTorque.Value());
 
 				var p6 = new Point(p2.X, VectoMath.Interpolate(p1, p3, p2.X));
 				var p7 = new Point(p4.X, VectoMath.Interpolate(p2, p5, p4.X));
@@ -235,23 +239,23 @@ namespace TUGraz.VectoCore.Models.Declaration
 				var downshiftCorr = MoveDownshiftBelowFld(Edge.Create(p6, p3), fldMargin, 1.1 * fullLoadCurve.MaxTorque);
 
 				var downShift = new List<ShiftPolygon.ShiftPolygonEntry>();
-				if (gear > 0) {
+				if (gearIdx > 0) {
 					downShift =
 						new[] { p2, downshiftCorr.P1, downshiftCorr.P2 }.Select(
-								point => new ShiftPolygon.ShiftPolygonEntry() {
-									AngularSpeed = point.X.SI<PerSecond>(),
-									Torque = point.Y.SI<NewtonMeter>()
-								})
+							point => new ShiftPolygon.ShiftPolygonEntry() {
+								AngularSpeed = point.X.SI<PerSecond>(),
+								Torque = point.Y.SI<NewtonMeter>()
+							})
 							.ToList();
 
 					downShift[0].Torque = maxDragTorque;
 				}
 				var upShift = new List<ShiftPolygon.ShiftPolygonEntry>();
-				if (gear >= gears.Count - 1) {
+				if (gearIdx >= gears.Count - 1) {
 					return new ShiftPolygon(downShift, upShift);
 				}
 
-				var gearRatio = gears[gear].Ratio / gears[gear + 1].Ratio;
+				var gearRatio = gears[gearIdx].Ratio / gears[gearIdx + 1].Ratio;
 				var rpmMarginFactor = 1 + ShiftPolygonRPMMargin / 100.0;
 
 				// ReSharper disable InconsistentNaming
@@ -387,11 +391,11 @@ namespace TUGraz.VectoCore.Models.Declaration
 				var data = VectoCSVFile.ReadStream(RessourceHelper.ReadStream(resourceId), source: resourceId);
 				var characteristicTorque = (from DataRow row in data.Rows
 					select
-					new TorqueConverterEntry() {
-						SpeedRatio = row.ParseDouble(TorqueConverterDataReader.Fields.SpeedRatio),
-						Torque = row.ParseDouble(TorqueConverterDataReader.Fields.CharacteristicTorque).SI<NewtonMeter>(),
-						TorqueRatio = row.ParseDouble(TorqueConverterDataReader.Fields.TorqueRatio)
-					}).ToArray();
+						new TorqueConverterEntry() {
+							SpeedRatio = row.ParseDouble(TorqueConverterDataReader.Fields.SpeedRatio),
+							Torque = row.ParseDouble(TorqueConverterDataReader.Fields.CharacteristicTorque).SI<NewtonMeter>(),
+							TorqueRatio = row.ParseDouble(TorqueConverterDataReader.Fields.TorqueRatio)
+						}).ToArray();
 				foreach (var torqueConverterEntry in characteristicTorque) {
 					torqueConverterEntry.SpeedRatio = torqueConverterEntry.SpeedRatio * ratio;
 					torqueConverterEntry.TorqueRatio = torqueConverterEntry.TorqueRatio / ratio;
diff --git a/VectoCore/VectoCore/Models/Simulation/Data/VectoRunData.cs b/VectoCore/VectoCore/Models/Simulation/Data/VectoRunData.cs
index b56c36fd50..bdb4ad19c1 100644
--- a/VectoCore/VectoCore/Models/Simulation/Data/VectoRunData.cs
+++ b/VectoCore/VectoCore/Models/Simulation/Data/VectoRunData.cs
@@ -133,10 +133,17 @@ namespace TUGraz.VectoCore.Models.Simulation.Data
 				var axlegearRatio = axleGearData != null ? axleGearData.AxleGear.Ratio : 1.0;
 				var dynamicTyreRadius = runData.VehicleData != null ? runData.VehicleData.DynamicTyreRadius : 0.0.SI<Meter>();
 
+				if (gearboxData.Gears.Count + 1 != engineData.FullLoadCurves.Count) {
+					return
+						new ValidationResult(
+							string.Format("number of full-load curves in engine does not match gear count. engine fld: {0}, gears: {1}",
+								engineData.FullLoadCurves.Count, gearboxData.Gears.Count));
+				}
+
 				foreach (var gear in gearboxData.Gears) {
 					for (var angularVelocity = engineData.IdleSpeed;
-						angularVelocity < engineData.FullLoadCurve.RatedSpeed;
-						angularVelocity += 2.0 / 3.0 * (engineData.FullLoadCurve.RatedSpeed - engineData.IdleSpeed) / 10.0) {
+						angularVelocity < engineData.FullLoadCurves[gear.Key].RatedSpeed;
+						angularVelocity += 2.0 / 3.0 * (engineData.FullLoadCurves[gear.Key].RatedSpeed - engineData.IdleSpeed) / 10.0) {
 						if (!gear.Value.HasLockedGear) {
 							continue;
 						}
@@ -147,9 +154,9 @@ namespace TUGraz.VectoCore.Models.Simulation.Data
 							continue;
 						}
 
-						for (var inTorque = engineData.FullLoadCurve.FullLoadStationaryTorque(angularVelocity) / 3;
-							inTorque < engineData.FullLoadCurve.FullLoadStationaryTorque(angularVelocity);
-							inTorque += 2.0 / 3.0 * engineData.FullLoadCurve.FullLoadStationaryTorque(angularVelocity) / 10.0) {
+						for (var inTorque = engineData.FullLoadCurves[gear.Key].FullLoadStationaryTorque(angularVelocity) / 3;
+							inTorque < engineData.FullLoadCurves[gear.Key].FullLoadStationaryTorque(angularVelocity);
+							inTorque += 2.0 / 3.0 * engineData.FullLoadCurves[gear.Key].FullLoadStationaryTorque(angularVelocity) / 10.0) {
 							NewtonMeter angledriveTorque;
 							try {
 								angledriveTorque = gear.Value.LossMap.GetOutTorque(angularVelocity, inTorque);
diff --git a/VectoCore/VectoCore/Models/Simulation/Impl/VehicleContainer.cs b/VectoCore/VectoCore/Models/Simulation/Impl/VehicleContainer.cs
index 17a34bbcf6..9be939e92d 100644
--- a/VectoCore/VectoCore/Models/Simulation/Impl/VehicleContainer.cs
+++ b/VectoCore/VectoCore/Models/Simulation/Impl/VehicleContainer.cs
@@ -86,7 +86,7 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl
 				"CA1065:DoNotRaiseExceptionsInUnexpectedLocations")]
 			get {
 				if (Gearbox == null) {
-					throw new VectoException("no gearbox available!");
+					return 0; // throw new VectoException("no gearbox available!");
 				}
 				return Gearbox.Gear;
 			}
diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Data/CombustionEngineData.cs b/VectoCore/VectoCore/Models/SimulationComponent/Data/CombustionEngineData.cs
index 238da75a9e..e5d591f6a0 100644
--- a/VectoCore/VectoCore/Models/SimulationComponent/Data/CombustionEngineData.cs
+++ b/VectoCore/VectoCore/Models/SimulationComponent/Data/CombustionEngineData.cs
@@ -30,6 +30,7 @@
 */
 
 using System;
+using System.Collections.Generic;
 using System.ComponentModel.DataAnnotations;
 using TUGraz.VectoCommon.Models;
 using TUGraz.VectoCommon.Utils;
@@ -63,7 +64,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data
 		public FuelConsumptionMap ConsumptionMap { get; internal set; }
 
 		[Required, ValidateObject]
-		public EngineFullLoadCurve FullLoadCurve { get; internal set; }
+		public Dictionary<uint, EngineFullLoadCurve> FullLoadCurves { get; internal set; }
 
 		[Required, Range(double.MinValue, double.MaxValue)]
 		public double ColdHotCorrectionFactor { get; internal set; }
@@ -87,7 +88,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data
 				WHTCRural = WHTCRural,
 				WHTCMotorway = WHTCMotorway,
 				ConsumptionMap = ConsumptionMap,
-				FullLoadCurve = FullLoadCurve,
+				FullLoadCurves = FullLoadCurves,
 				WHTCCorrectionFactor = WHTCCorrectionFactor,
 			};
 		}
diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Data/Engine/EngineFullLoadCurve.cs b/VectoCore/VectoCore/Models/SimulationComponent/Data/Engine/EngineFullLoadCurve.cs
index 74c86b524a..fa6b684bf5 100644
--- a/VectoCore/VectoCore/Models/SimulationComponent/Data/Engine/EngineFullLoadCurve.cs
+++ b/VectoCore/VectoCore/Models/SimulationComponent/Data/Engine/EngineFullLoadCurve.cs
@@ -57,7 +57,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data.Engine
 			return new EngineFullLoadCurve { FullLoadEntries = curve.FullLoadEntries, PT1Data = curve.PT1Data };
 		}
 
-		public static EngineFullLoadCurve Create(DataTable data, bool declarationMode = false)
+		public static EngineFullLoadCurve Create(DataTable data, bool declarationMode = false, NewtonMeter maxTorque = null)
 		{
 			var curve = FullLoadCurveReader.Create(data, declarationMode, true);
 			return new EngineFullLoadCurve() { FullLoadEntries = curve.FullLoadEntries, PT1Data = curve.PT1Data };
@@ -143,16 +143,6 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data.Engine
 			}
 		}
 
-		public NewtonMeter MaxLoadTorque
-		{
-			get { return FullLoadEntries.Max(x => x.TorqueFullLoad); }
-		}
-
-		public NewtonMeter MaxDragTorque
-		{
-			get { return FullLoadEntries.Min(x => x.TorqueDrag); }
-		}
-
 		private void ComputePreferredSpeed()
 		{
 			var maxArea = ComputeArea(EngineData.IdleSpeed, N95hSpeed);
diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Data/FullLoadCurve.cs b/VectoCore/VectoCore/Models/SimulationComponent/Data/FullLoadCurve.cs
index 670633b29d..b7bf245479 100644
--- a/VectoCore/VectoCore/Models/SimulationComponent/Data/FullLoadCurve.cs
+++ b/VectoCore/VectoCore/Models/SimulationComponent/Data/FullLoadCurve.cs
@@ -46,6 +46,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data
 		private Watt _maxPower;
 		private PerSecond _ratedSpeed;
 		private NewtonMeter _maxTorque;
+		private NewtonMeter _maxDragTorque;
 
 		[Required, ValidateObject] internal List<FullLoadCurveEntry> FullLoadEntries;
 
@@ -76,6 +77,11 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data
 			get { return _maxTorque ?? FindMaxTorque(); }
 		}
 
+		public NewtonMeter MaxDragTorque
+		{
+			get { return _maxDragTorque ?? FindMaxDragTorque(); }
+		}
+
 		public virtual NewtonMeter FullLoadStationaryTorque(PerSecond angularVelocity)
 		{
 			var idx = FindIndex(angularVelocity);
@@ -98,6 +104,12 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data
 			return _maxTorque;
 		}
 
+		private NewtonMeter FindMaxDragTorque()
+		{
+			_maxDragTorque = FullLoadEntries.Min(x => x.TorqueDrag);
+			return _maxDragTorque;
+		}
+
 		/// <summary>
 		/// Compute the engine's rated speed from the given full-load curve (i.e. engine speed with max. power)
 		/// </summary>
diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/AMTShiftStrategy.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/AMTShiftStrategy.cs
index 55e58e1d61..83fc6641c1 100644
--- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/AMTShiftStrategy.cs
+++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/AMTShiftStrategy.cs
@@ -55,7 +55,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 			var transmissionRatio = runData.AxleGearData.AxleGear.Ratio *
 									(runData.AngledriveData == null ? 1.0 : runData.AngledriveData.Angledrive.Ratio) /
 									runData.VehicleData.DynamicTyreRadius;
-			var minEngineSpeed = (runData.EngineData.FullLoadCurve.RatedSpeed - runData.EngineData.IdleSpeed) *
+			var minEngineSpeed = (runData.EngineData.FullLoadCurves[0].RatedSpeed - runData.EngineData.IdleSpeed) *
 								Constants.SimulationSettings.ClutchClosingSpeedNorm + runData.EngineData.IdleSpeed;
 			foreach (var gearData in ModelData.Gears.Reverse()) {
 				if (ModelData.StartSpeed * transmissionRatio * gearData.Value.Ratio > minEngineSpeed) {
@@ -73,7 +73,8 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 		private bool SpeedTooHighForEngine(uint gear, PerSecond outAngularSpeed)
 		{
 			return
-				(outAngularSpeed * ModelData.Gears[gear].Ratio).IsGreaterOrEqual(ModelData.Gears[gear].MaxSpeed ?? DataBus.EngineN95hSpeed);
+				(outAngularSpeed * ModelData.Gears[gear].Ratio).IsGreaterOrEqual(ModelData.Gears[gear].MaxSpeed ??
+																				DataBus.EngineN95hSpeed);
 		}
 
 		public override GearInfo NextGear
diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/Clutch.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/Clutch.cs
index a91230bd38..92f2cc3add 100644
--- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/Clutch.cs
+++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/Clutch.cs
@@ -63,7 +63,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 		public Clutch(IVehicleContainer container, CombustionEngineData engineData) : base(container)
 		{
 			_idleSpeed = engineData.IdleSpeed;
-			_ratedSpeed = engineData.FullLoadCurve.RatedSpeed;
+			_ratedSpeed = engineData.FullLoadCurves[0].RatedSpeed;
 			_clutchSpeedSlippingFactor = Constants.SimulationSettings.ClutchClosingSpeedNorm * (_ratedSpeed - _idleSpeed) /
 										(_idleSpeed + Constants.SimulationSettings.ClutchClosingSpeedNorm * (_ratedSpeed - _idleSpeed));
 		}
diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/CombustionEngine.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/CombustionEngine.cs
index 7d58da8dc8..05f307760e 100644
--- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/CombustionEngine.cs
+++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/CombustionEngine.cs
@@ -86,7 +86,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 			PreviousState.EngineSpeed = ModelData.IdleSpeed;
 			PreviousState.dt = 1.SI<Second>();
 
-			StationaryIdleFullLoadPower = ModelData.FullLoadCurve.FullLoadStationaryTorque(ModelData.IdleSpeed) *
+			StationaryIdleFullLoadPower = ModelData.FullLoadCurves[0].FullLoadStationaryTorque(ModelData.IdleSpeed) *
 										ModelData.IdleSpeed;
 		}
 
@@ -104,12 +104,12 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 
 		public Watt EngineStationaryFullPower(PerSecond angularSpeed)
 		{
-			return ModelData.FullLoadCurve.FullLoadStationaryTorque(angularSpeed) * angularSpeed;
+			return ModelData.FullLoadCurves[DataBus.Gear].FullLoadStationaryTorque(angularSpeed) * angularSpeed;
 		}
 
 		public Watt EngineDragPower(PerSecond angularSpeed)
 		{
-			return ModelData.FullLoadCurve.DragLoadStationaryPower(angularSpeed);
+			return ModelData.FullLoadCurves[DataBus.Gear].DragLoadStationaryPower(angularSpeed);
 		}
 
 		public PerSecond EngineIdleSpeed
@@ -119,18 +119,18 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 
 		public PerSecond EngineRatedSpeed
 		{
-			get { return ModelData.FullLoadCurve.RatedSpeed; }
+			get { return ModelData.FullLoadCurves[0].RatedSpeed; }
 		}
 
 		public PerSecond EngineN95hSpeed
 		{
-			get { return ModelData.FullLoadCurve.N95hSpeed; }
+			get { return ModelData.FullLoadCurves[0].N95hSpeed; }
 		}
 
 		public PerSecond EngineN80hSpeed
 
 		{
-			get { return ModelData.FullLoadCurve.N80hSpeed; }
+			get { return ModelData.FullLoadCurves[0].N80hSpeed; }
 		}
 
 		public IIdleController IdleController
@@ -181,7 +181,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 
 			var avgEngineSpeed = (PreviousState.EngineSpeed + angularVelocity) / 2.0;
 
-			var fullDragTorque = ModelData.FullLoadCurve.DragLoadStationaryTorque(avgEngineSpeed);
+			var fullDragTorque = ModelData.FullLoadCurves[DataBus.Gear].DragLoadStationaryTorque(avgEngineSpeed);
 			var dynamicFullLoadPower = ComputeFullLoadPower(avgEngineSpeed, dt, dryRun);
 			if (dynamicFullLoadPower < 0) {
 				dynamicFullLoadPower = 0.SI<Watt>();
@@ -303,8 +303,8 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 				EngineSpeed = outAngularVelocity,
 				dt = 1.SI<Second>(),
 				InertiaTorqueLoss = 0.SI<NewtonMeter>(),
-				StationaryFullLoadTorque = ModelData.FullLoadCurve.FullLoadStationaryTorque(outAngularVelocity),
-				FullDragTorque = ModelData.FullLoadCurve.DragLoadStationaryTorque(outAngularVelocity),
+				StationaryFullLoadTorque = ModelData.FullLoadCurves[DataBus.Gear].FullLoadStationaryTorque(outAngularVelocity),
+				FullDragTorque = ModelData.FullLoadCurves[DataBus.Gear].DragLoadStationaryTorque(outAngularVelocity),
 				EngineTorque = outTorque + auxDemand,
 				EnginePower = (outTorque + auxDemand) * outAngularVelocity,
 			};
@@ -368,7 +368,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 				Log.Warn("FuelConsumptionMap was extrapolated: range for FC-Map is not sufficient: n: {0}, torque: {1}",
 					avgEngineSpeed.Value(), CurrentState.EngineTorque.Value());
 			}
-			var pt1 = ModelData.FullLoadCurve.PT1(avgEngineSpeed);
+			var pt1 = ModelData.FullLoadCurves[DataBus.Gear].PT1(avgEngineSpeed);
 			if (DataBus.ExecutionMode == ExecutionMode.Declaration && pt1.Extrapolated) {
 				Log.Error("requested rpm below minimum rpm in pt1 - extrapolating. n_eng_avg: {0}",
 					avgEngineSpeed);
@@ -433,7 +433,8 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 				throw new VectoException("ComputeFullLoadPower cannot compute for simulation interval length 0.");
 			}
 
-			CurrentState.StationaryFullLoadTorque = ModelData.FullLoadCurve.FullLoadStationaryTorque(angularVelocity);
+			CurrentState.StationaryFullLoadTorque =
+				ModelData.FullLoadCurves[DataBus.Gear].FullLoadStationaryTorque(angularVelocity);
 			var stationaryFullLoadPower = CurrentState.StationaryFullLoadTorque * angularVelocity;
 			Watt dynFullPowerCalculated = 0.SI<Watt>();
 
@@ -442,7 +443,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 				dynFullPowerCalculated = stationaryFullLoadPower;
 			} else {
 				try {
-					var pt1 = ModelData.FullLoadCurve.PT1(angularVelocity).Value.Value();
+					var pt1 = ModelData.FullLoadCurves[DataBus.Gear].PT1(angularVelocity).Value.Value();
 					var powerRatio = (PreviousState.EnginePower / stationaryFullLoadPower).Value();
 					var tStarPrev = pt1 * Math.Log(1.0 / (1 - powerRatio), Math.E).SI<Second>();
 					var tStar = tStarPrev + PreviousState.dt;
@@ -625,7 +626,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 
 				var idleTime = absTime - _idleStart + dt;
 				var prevEngineSpeed = _engine.PreviousState.EngineSpeed;
-				var dragLoad = _engine.ModelData.FullLoadCurve.DragLoadStationaryPower(prevEngineSpeed);
+				var dragLoad = _engine.ModelData.FullLoadCurves[0].DragLoadStationaryPower(prevEngineSpeed);
 
 				var nextEnginePower = (_lastEnginePower - dragLoad) * Math.Max(0, idleTime.Value() * PeDropSlope + PeDropOffset) +
 									dragLoad;
diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/EngineOnlyCombustionEngine.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/EngineOnlyCombustionEngine.cs
index d699ad941d..dd481bd07e 100644
--- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/EngineOnlyCombustionEngine.cs
+++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/EngineOnlyCombustionEngine.cs
@@ -67,7 +67,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 			var totalTorqueDemand = CurrentState.EngineTorqueOut + auxTorqueDemand + CurrentState.InertiaTorqueLoss;
 			CurrentState.EngineTorque = totalTorqueDemand;
 
-			CurrentState.FullDragTorque = ModelData.FullLoadCurve.DragLoadStationaryTorque(avgEngineSpeed);
+			CurrentState.FullDragTorque = ModelData.FullLoadCurves[0].DragLoadStationaryTorque(avgEngineSpeed);
 			var dynamicFullLoadPower = ComputeFullLoadPower(avgEngineSpeed, dt, dryRun);
 			CurrentState.DynamicFullLoadTorque = dynamicFullLoadPower / avgEngineSpeed;
 
diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/Gearbox.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/Gearbox.cs
index e93fb37e67..9107816957 100644
--- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/Gearbox.cs
+++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/Gearbox.cs
@@ -112,6 +112,8 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 
 		internal ResponseDryRun Initialize(uint gear, NewtonMeter outTorque, PerSecond outAngularVelocity)
 		{
+			var oldGear = Gear;
+			Gear = gear;
 			var inAngularVelocity = outAngularVelocity * ModelData.Gears[gear].Ratio;
 			var torqueLossResult = ModelData.Gears[gear].LossMap.GetTorqueLoss(outAngularVelocity, outTorque);
 			CurrentState.TorqueLossResult = torqueLossResult;
@@ -139,6 +141,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 
 			var fullLoad = DataBus.EngineStationaryFullPower(inAngularVelocity);
 
+			Gear = oldGear;
 			return new ResponseDryRun {
 				Source = this,
 				EnginePowerRequest = response.EnginePowerRequest,
diff --git a/VectoCore/VectoCore/OutputData/DeclarationReport.cs b/VectoCore/VectoCore/OutputData/DeclarationReport.cs
index afe1d98050..d49000c659 100644
--- a/VectoCore/VectoCore/OutputData/DeclarationReport.cs
+++ b/VectoCore/VectoCore/OutputData/DeclarationReport.cs
@@ -38,6 +38,7 @@ using TUGraz.VectoCore.Models.Declaration;
 using TUGraz.VectoCore.Models.Simulation.Data;
 using TUGraz.VectoCore.Models.Simulation.Impl;
 using TUGraz.VectoCore.Models.SimulationComponent.Data;
+using TUGraz.VectoCore.Models.SimulationComponent.Data.Engine;
 using TUGraz.VectoCore.OutputData.PDF;
 
 namespace TUGraz.VectoCore.OutputData
@@ -105,7 +106,7 @@ namespace TUGraz.VectoCore.OutputData
 		/// <summary>
 		/// The full load curve.
 		/// </summary>
-		internal FullLoadCurve Flc { get; set; }
+		internal  Dictionary<uint, EngineFullLoadCurve> Flc { get; set; }
 
 		/// <summary>
 		/// The declaration segment from the segment table
diff --git a/VectoCore/VectoCore/OutputData/PDF/PDFDeclarationReport.cs b/VectoCore/VectoCore/OutputData/PDF/PDFDeclarationReport.cs
index 2c372d3fa6..6de5e8b194 100644
--- a/VectoCore/VectoCore/OutputData/PDF/PDFDeclarationReport.cs
+++ b/VectoCore/VectoCore/OutputData/PDF/PDFDeclarationReport.cs
@@ -171,8 +171,8 @@ namespace TUGraz.VectoCore.OutputData.PDF
 			EngineModel = modelData.EngineData.ModelName;
 			EngineStr = string.Format("{0} l, {1} kW",
 				modelData.EngineData.Displacement.ConvertTo().Cubic.Dezi.Meter.ToOutputFormat(1),
-				modelData.EngineData.FullLoadCurve.MaxPower.ConvertTo().Kilo.Watt.ToOutputFormat(0));
-			Flc = modelData.EngineData.FullLoadCurve;
+				modelData.EngineData.FullLoadCurves[0].MaxPower.ConvertTo().Kilo.Watt.ToOutputFormat(0));
+			Flc = modelData.EngineData.FullLoadCurves;
 			GearboxModel = modelData.GearboxData.ModelName;
 			GearboxStr = string.Format("{0}-Speed {1}", modelData.GearboxData.Gears.Count, modelData.GearboxData.Type);
 		}
@@ -322,7 +322,7 @@ namespace TUGraz.VectoCore.OutputData.PDF
 			img.SetAbsolutePosition(17, 270);
 			content.AddImage(img);
 
-			img = Image.GetInstance(DrawOperatingPointsChart(results.ModData[LoadingType.ReferenceLoad], Flc), BaseColor.WHITE);
+			img = Image.GetInstance(DrawOperatingPointsChart(results.ModData[LoadingType.ReferenceLoad], Flc[0]), BaseColor.WHITE);
 			img.ScaleAbsolute(420, 178);
 			img.SetAbsolutePosition(375, 75);
 			content.AddImage(img);
diff --git a/VectoCore/VectoCore/OutputData/SummaryDataContainer.cs b/VectoCore/VectoCore/OutputData/SummaryDataContainer.cs
index 8830dd9c95..f481ff32ce 100644
--- a/VectoCore/VectoCore/OutputData/SummaryDataContainer.cs
+++ b/VectoCore/VectoCore/OutputData/SummaryDataContainer.cs
@@ -228,10 +228,10 @@ namespace TUGraz.VectoCore.OutputData
 
 				row[TOTAL_VEHICLE_MASS] = runData.VehicleData.TotalVehicleWeight;
 				row[ENGINE_RATED_POWER] =
-					runData.EngineData.FullLoadCurve.FullLoadStationaryPower(runData.EngineData.FullLoadCurve.RatedSpeed)
+					runData.EngineData.FullLoadCurves[0].FullLoadStationaryPower(runData.EngineData.FullLoadCurves[0].RatedSpeed)
 						.ConvertTo().Kilo.Watt;
 				row[ENGINE_IDLING_SPEED] = runData.EngineData.IdleSpeed.AsRPM.SI<Scalar>();
-				row[ENGINE_RATED_SPEED] = runData.EngineData.FullLoadCurve.RatedSpeed.AsRPM.SI<Scalar>();
+				row[ENGINE_RATED_SPEED] = runData.EngineData.FullLoadCurves[0].RatedSpeed.AsRPM.SI<Scalar>();
 				row[ENGINE_DISPLACEMENT] = runData.EngineData.Displacement.ConvertTo().Cubic.Centi.Meter;
 				row[CD_x_A] = runData.VehicleData.CrossWindCorrectionCurve.AirDragArea;
 				row[ROLLING_RESISTANCE_COEFFICIENT] = runData.VehicleData.TotalRollResistanceCoefficient.SI<Scalar>();
diff --git a/VectoCore/VectoCore/OutputData/XML/XMLDeclarationWriter.cs b/VectoCore/VectoCore/OutputData/XML/XMLDeclarationWriter.cs
index 4c0d83cbf8..9e290eaadc 100644
--- a/VectoCore/VectoCore/OutputData/XML/XMLDeclarationWriter.cs
+++ b/VectoCore/VectoCore/OutputData/XML/XMLDeclarationWriter.cs
@@ -141,7 +141,7 @@ namespace TUGraz.VectoCore.OutputData.XML
 					new XElement(tns + XMLNames.Engine_IdlingSpeed, data.IdleSpeed.AsRPM.ToXMLFormat(0)),
 					new XElement(tns + XMLNames.Engine_RatedSpeed, fld.RatedSpeed.AsRPM.ToXMLFormat(0)),
 					new XElement(tns + XMLNames.Engine_RatedPower, fld.FullLoadStationaryPower(fld.RatedSpeed).ToXMLFormat(0)),
-					new XElement(tns + XMLNames.Engine_MaxTorque, fld.MaxLoadTorque.ToXMLFormat(0)),
+					new XElement(tns + XMLNames.Engine_MaxTorque, fld.MaxTorque.ToXMLFormat(0)),
 					new XElement(tns + XMLNames.Engine_WHTCUrban, data.WHTCUrban.ToXMLFormat(4)),
 					new XElement(tns + XMLNames.Engine_WHTCRural, data.WHTCRural.ToXMLFormat(4)),
 					new XElement(tns + XMLNames.Engine_WHTCMotorway, data.WHTCMotorway.ToXMLFormat(4)),
diff --git a/VectoCore/VectoCoreTest/FileIO/JsonTest.cs b/VectoCore/VectoCoreTest/FileIO/JsonTest.cs
index 2116574289..83813343c9 100644
--- a/VectoCore/VectoCoreTest/FileIO/JsonTest.cs
+++ b/VectoCore/VectoCoreTest/FileIO/JsonTest.cs
@@ -164,7 +164,8 @@ namespace TUGraz.VectoCore.Tests.FileIO
 				Assert.AreEqual(ratios[i], inputProvider.Gears[i].Ratio);
 			}
 			var gbxData = new EngineeringDataAdapter().CreateGearboxData(inputProvider,
-				MockSimulationDataFactory.CreateEngineDataFromFile(@"TestData\Components\AT_GBX\Engine.veng"), 2.1, 0.5.SI<Meter>(),
+				MockSimulationDataFactory.CreateEngineDataFromFile(@"TestData\Components\AT_GBX\Engine.veng", 0), 2.1,
+				0.5.SI<Meter>(),
 				true);
 			Assert.AreEqual(ratios.Length, gbxData.Gears.Count);
 
@@ -188,7 +189,8 @@ namespace TUGraz.VectoCore.Tests.FileIO
 				Assert.AreEqual(ratios[i], inputProvider.Gears[i].Ratio);
 			}
 			var gbxData = new EngineeringDataAdapter().CreateGearboxData(inputProvider,
-				MockSimulationDataFactory.CreateEngineDataFromFile(@"TestData\Components\AT_GBX\Engine.veng"), 2.1, 0.5.SI<Meter>(),
+				MockSimulationDataFactory.CreateEngineDataFromFile(@"TestData\Components\AT_GBX\Engine.veng", 0), 2.1,
+				0.5.SI<Meter>(),
 				true);
 			Assert.AreEqual(ratios.Length, gbxData.Gears.Count);
 
@@ -214,7 +216,8 @@ namespace TUGraz.VectoCore.Tests.FileIO
 				Assert.AreEqual(ratios[i], inputProvider.Gears[i].Ratio);
 			}
 			var gbxData = new EngineeringDataAdapter().CreateGearboxData(inputProvider,
-				MockSimulationDataFactory.CreateEngineDataFromFile(@"TestData\Components\AT_GBX\Engine.veng"), 2.1, 0.5.SI<Meter>(),
+				MockSimulationDataFactory.CreateEngineDataFromFile(@"TestData\Components\AT_GBX\Engine.veng", 0), 2.1,
+				0.5.SI<Meter>(),
 				true);
 			Assert.AreEqual(ratios.Length, gbxData.Gears.Count);
 
@@ -239,7 +242,8 @@ namespace TUGraz.VectoCore.Tests.FileIO
 				Assert.AreEqual(ratios[i], inputProvider.Gears[i].Ratio);
 			}
 			var gbxData = new EngineeringDataAdapter().CreateGearboxData(inputProvider,
-				MockSimulationDataFactory.CreateEngineDataFromFile(@"TestData\Components\AT_GBX\Engine.veng"), 2.1, 0.5.SI<Meter>(),
+				MockSimulationDataFactory.CreateEngineDataFromFile(@"TestData\Components\AT_GBX\Engine.veng", 0), 2.1,
+				0.5.SI<Meter>(),
 				true);
 			Assert.AreEqual(ratios.Length, gbxData.Gears.Count);
 
diff --git a/VectoCore/VectoCoreTest/Integration/ATPowerTrain.cs b/VectoCore/VectoCoreTest/Integration/ATPowerTrain.cs
index 22c107008b..a16361c577 100644
--- a/VectoCore/VectoCoreTest/Integration/ATPowerTrain.cs
+++ b/VectoCore/VectoCoreTest/Integration/ATPowerTrain.cs
@@ -82,9 +82,10 @@ namespace TUGraz.VectoCore.Tests.Integration
 				HasTorqueConverter = true
 			};
 
-			var engineData = MockSimulationDataFactory.CreateEngineDataFromFile(EngineFile);
+			var gearboxData = CreateGearboxData(gbxType); 
+			var engineData = MockSimulationDataFactory.CreateEngineDataFromFile(EngineFile, gearboxData.Gears.Count);
 			var axleGearData = CreateAxleGearData(gbxType);
-			var gearboxData = CreateGearboxData(gbxType);
+			
 			if (gearBoxInertia != null) {
 				gearboxData.Inertia = gearBoxInertia;
 			}
diff --git a/VectoCore/VectoCoreTest/Integration/BusAuxiliaries/AuxDemandTest.cs b/VectoCore/VectoCoreTest/Integration/BusAuxiliaries/AuxDemandTest.cs
index 3cf1cb4cf8..91912d7232 100644
--- a/VectoCore/VectoCoreTest/Integration/BusAuxiliaries/AuxDemandTest.cs
+++ b/VectoCore/VectoCoreTest/Integration/BusAuxiliaries/AuxDemandTest.cs
@@ -29,6 +29,7 @@
 *   Martin Rexeis, rexeis@ivt.tugraz.at, IVT, Graz University of Technology
 */
 
+using System.Collections.Generic;
 using NUnit.Framework;
 using TUGraz.VectoCommon.Models;
 using TUGraz.VectoCommon.Utils;
@@ -127,7 +128,7 @@ namespace TUGraz.VectoCore.Tests.Integration.BusAuxiliaries
 			var fld = EngineFullLoadCurve.ReadFromFile(engineFLDFilePath);
 			var modelData = new CombustionEngineData() {
 				ConsumptionMap = fcMap,
-				FullLoadCurve = fld,
+				FullLoadCurves = new Dictionary<uint, EngineFullLoadCurve>() { { 0, fld }, { 1, fld } },
 				IdleSpeed = 560.SI<PerSecond>()
 			};
 
diff --git a/VectoCore/VectoCoreTest/Integration/CoachAdvancedAuxPowertrain.cs b/VectoCore/VectoCoreTest/Integration/CoachAdvancedAuxPowertrain.cs
index 2ed4af76d5..79ce266962 100644
--- a/VectoCore/VectoCoreTest/Integration/CoachAdvancedAuxPowertrain.cs
+++ b/VectoCore/VectoCoreTest/Integration/CoachAdvancedAuxPowertrain.cs
@@ -80,9 +80,10 @@ namespace TUGraz.VectoCore.Tests.Integration
 				RunData = new VectoRunData { JobName = modFileName, Cycle = cycleData }
 			};
 
-			var engineData = MockSimulationDataFactory.CreateEngineDataFromFile(highEnginePower ? EngineFileHigh : EngineFile);
-			var axleGearData = CreateAxleGearData();
 			var gearboxData = CreateGearboxData();
+			var engineData = MockSimulationDataFactory.CreateEngineDataFromFile(highEnginePower ? EngineFileHigh : EngineFile,
+				gearboxData.Gears.Count);
+			var axleGearData = CreateAxleGearData();
 			var vehicleData = CreateVehicleData(3300.SI<Kilogram>());
 			var driverData = CreateDriverData(AccelerationFile, overspeed);
 
@@ -184,7 +185,8 @@ namespace TUGraz.VectoCore.Tests.Integration
 				//AerodynamicDragAera = 3.2634.SI<SquareMeter>(),
 				//CrossWindCorrectionMode = CrossWindCorrectionMode.NoCorrection,
 				CrossWindCorrectionCurve =
-					new CrosswindCorrectionCdxALookup(3.2634.SI<SquareMeter>(), CrossWindCorrectionCurveReader.GetNoCorrectionCurve(3.2634.SI<SquareMeter>()),
+					new CrosswindCorrectionCdxALookup(3.2634.SI<SquareMeter>(),
+						CrossWindCorrectionCurveReader.GetNoCorrectionCurve(3.2634.SI<SquareMeter>()),
 						CrossWindCorrectionMode.NoCorrection),
 				CurbWeight = 15700.SI<Kilogram>(),
 				Loading = loading,
diff --git a/VectoCore/VectoCoreTest/Integration/CoachPowerTrain.cs b/VectoCore/VectoCoreTest/Integration/CoachPowerTrain.cs
index aa100b2d60..fef70e6d68 100644
--- a/VectoCore/VectoCoreTest/Integration/CoachPowerTrain.cs
+++ b/VectoCore/VectoCoreTest/Integration/CoachPowerTrain.cs
@@ -80,9 +80,9 @@ namespace TUGraz.VectoCore.Tests.Integration
 				RunData = new VectoRunData { JobName = modFileName, Cycle = cycleData }
 			};
 
-			var engineData = MockSimulationDataFactory.CreateEngineDataFromFile(engineHighPower ? EngineFileHigh : EngineFile);
-			var axleGearData = CreateAxleGearData();
 			var gearboxData = CreateGearboxData();
+			var engineData = MockSimulationDataFactory.CreateEngineDataFromFile(engineHighPower ? EngineFileHigh : EngineFile, gearboxData.Gears.Count);
+			var axleGearData = CreateAxleGearData();
 			if (gearBoxInertia != null) {
 				gearboxData.Inertia = gearBoxInertia;
 			}
diff --git a/VectoCore/VectoCoreTest/Integration/EngineOnlyCycle/EngineOnlyCycleTest.cs b/VectoCore/VectoCoreTest/Integration/EngineOnlyCycle/EngineOnlyCycleTest.cs
index 16b80d77c4..526abde344 100644
--- a/VectoCore/VectoCoreTest/Integration/EngineOnlyCycle/EngineOnlyCycleTest.cs
+++ b/VectoCore/VectoCoreTest/Integration/EngineOnlyCycle/EngineOnlyCycleTest.cs
@@ -71,7 +71,7 @@ namespace TUGraz.VectoCore.Tests.Integration.EngineOnlyCycle
 			var vehicle = new VehicleContainer(ExecutionMode.Engineering);
 			// ReSharper disable once ObjectCreationAsStatement
 			new MockDrivingCycle(vehicle, data);
-			var engineData = MockSimulationDataFactory.CreateEngineDataFromFile(engineFile);
+			var engineData = MockSimulationDataFactory.CreateEngineDataFromFile(engineFile, 0);
 
 			var aux = new EngineAuxiliary(vehicle);
 			aux.AddCycle(Constants.Auxiliaries.Cycle);
@@ -114,7 +114,7 @@ namespace TUGraz.VectoCore.Tests.Integration.EngineOnlyCycle
 
 			var vehicleContainer = new VehicleContainer(ExecutionMode.Engineering);
 
-			var engine = new CombustionEngine(vehicleContainer, MockSimulationDataFactory.CreateEngineDataFromFile(EngineFile));
+			var engine = new CombustionEngine(vehicleContainer, MockSimulationDataFactory.CreateEngineDataFromFile(EngineFile, 0));
 
 			var absTime = 0.SI<Second>();
 			var dt = 1.SI<Second>();
diff --git a/VectoCore/VectoCoreTest/Integration/SimulationRuns/FullPowertrain.cs b/VectoCore/VectoCoreTest/Integration/SimulationRuns/FullPowertrain.cs
index 3e8fa4dce3..6f2f22579b 100644
--- a/VectoCore/VectoCoreTest/Integration/SimulationRuns/FullPowertrain.cs
+++ b/VectoCore/VectoCoreTest/Integration/SimulationRuns/FullPowertrain.cs
@@ -74,10 +74,10 @@ namespace TUGraz.VectoCore.Tests.Integration.SimulationRuns
 			var modData = new ModalDataContainer("Coach_FullPowertrain_SimpleGearbox", fileWriter);
 			var container = new VehicleContainer(ExecutionMode.Engineering, modData);
 
-			var engineData = MockSimulationDataFactory.CreateEngineDataFromFile(EngineFile);
+			var gearboxData = CreateSimpleGearboxData();
+			var engineData = MockSimulationDataFactory.CreateEngineDataFromFile(EngineFile, gearboxData.Gears.Count);
 			var cycleData = DrivingCycleDataReader.ReadFromFile(CycleFile, CycleType.DistanceBased, false);
 			var axleGearData = CreateAxleGearData();
-			var gearboxData = CreateSimpleGearboxData();
 			var vehicleData = CreateVehicleData(3300.SI<Kilogram>());
 			var driverData = CreateDriverData(AccelerationFile);
 
@@ -137,10 +137,10 @@ namespace TUGraz.VectoCore.Tests.Integration.SimulationRuns
 			var modData = new ModalDataContainer("Coach_FullPowertrain", fileWriter);
 			var container = new VehicleContainer(ExecutionMode.Engineering, modData);
 
-			var engineData = MockSimulationDataFactory.CreateEngineDataFromFile(EngineFile);
+			var gearboxData = CreateGearboxData();
+			var engineData = MockSimulationDataFactory.CreateEngineDataFromFile(EngineFile, gearboxData.Gears.Count);
 			var cycleData = DrivingCycleDataReader.ReadFromFile(CoachCycleFile, CycleType.DistanceBased, false);
 			var axleGearData = CreateAxleGearData();
-			var gearboxData = CreateGearboxData();
 			var vehicleData = CreateVehicleData(3300.SI<Kilogram>());
 			var driverData = CreateDriverData(AccelerationFile);
 
@@ -215,10 +215,10 @@ namespace TUGraz.VectoCore.Tests.Integration.SimulationRuns
 			var modData = new ModalDataContainer("Coach_FullPowertrain_LowSpeed", fileWriter);
 			var container = new VehicleContainer(ExecutionMode.Engineering, modData);
 
-			var engineData = MockSimulationDataFactory.CreateEngineDataFromFile(EngineFile);
+			var gearboxData = CreateGearboxData();
+			var engineData = MockSimulationDataFactory.CreateEngineDataFromFile(EngineFile, gearboxData.Gears.Count);
 			var cycleData = DrivingCycleDataReader.ReadFromFile(CycleFile, CycleType.DistanceBased, false);
 			var axleGearData = CreateAxleGearData();
-			var gearboxData = CreateGearboxData();
 			var vehicleData = CreateVehicleData(3300.SI<Kilogram>());
 			var driverData = CreateDriverData(AccelerationFile);
 
diff --git a/VectoCore/VectoCoreTest/Integration/SimulationRuns/MinimalPowertrain.cs b/VectoCore/VectoCoreTest/Integration/SimulationRuns/MinimalPowertrain.cs
index dfd2505c64..e01dbeb844 100644
--- a/VectoCore/VectoCoreTest/Integration/SimulationRuns/MinimalPowertrain.cs
+++ b/VectoCore/VectoCoreTest/Integration/SimulationRuns/MinimalPowertrain.cs
@@ -66,7 +66,7 @@ namespace TUGraz.VectoCore.Tests.Integration.SimulationRuns
 		[TestMethod]
 		public void TestWheelsAndEngineInitialize()
 		{
-			var engineData = MockSimulationDataFactory.CreateEngineDataFromFile(EngineFile);
+			var engineData = MockSimulationDataFactory.CreateEngineDataFromFile(EngineFile, 1);
 
 			var vehicleData = CreateVehicleData(3300.SI<Kilogram>());
 
@@ -111,7 +111,7 @@ namespace TUGraz.VectoCore.Tests.Integration.SimulationRuns
 		public void TestWheelsAndEngine()
 		{
 			NLog.LogManager.DisableLogging();
-			var engineData = MockSimulationDataFactory.CreateEngineDataFromFile(EngineFile);
+			var engineData = MockSimulationDataFactory.CreateEngineDataFromFile(EngineFile, 1);
 			var cycleData = DrivingCycleDataReader.ReadFromFile(CycleFile, CycleType.DistanceBased, false);
 
 			var axleGearData = CreateAxleGearData();
@@ -183,7 +183,7 @@ namespace TUGraz.VectoCore.Tests.Integration.SimulationRuns
 		[TestMethod]
 		public void TestWheelsAndEngineLookahead()
 		{
-			var engineData = MockSimulationDataFactory.CreateEngineDataFromFile(EngineFile);
+			var engineData = MockSimulationDataFactory.CreateEngineDataFromFile(EngineFile, 1);
 			var cycleData = DrivingCycleDataReader.ReadFromFile(CycleFileStop, CycleType.DistanceBased, false);
 
 			var axleGearData = CreateAxleGearData();
diff --git a/VectoCore/VectoCoreTest/Integration/Truck40tPowerTrain.cs b/VectoCore/VectoCoreTest/Integration/Truck40tPowerTrain.cs
index eda5f61483..428b90cdd6 100644
--- a/VectoCore/VectoCoreTest/Integration/Truck40tPowerTrain.cs
+++ b/VectoCore/VectoCoreTest/Integration/Truck40tPowerTrain.cs
@@ -90,9 +90,9 @@ namespace TUGraz.VectoCore.Tests.Integration
 				RunData = new VectoRunData { JobName = modFileName, Cycle = cycleData }
 			};
 
-			var engineData = MockSimulationDataFactory.CreateEngineDataFromFile(EngineFile);
-			var axleGearData = CreateAxleGearData();
 			var gearboxData = CreateGearboxData();
+			var engineData = MockSimulationDataFactory.CreateEngineDataFromFile(EngineFile, gearboxData.Gears.Count);
+			var axleGearData = CreateAxleGearData();
 			var vehicleData = CreateVehicleData(massExtra, loading);
 			var driverData = CreateDriverData(AccelerationFile, overspeed);
 
@@ -221,7 +221,8 @@ namespace TUGraz.VectoCore.Tests.Integration
 				//AerodynamicDragAera = 6.2985.SI<SquareMeter>(),
 				//CrossWindCorrectionMode = CrossWindCorrectionMode.NoCorrection,
 				CrossWindCorrectionCurve =
-					new CrosswindCorrectionCdxALookup(6.2985.SI<SquareMeter>(), CrossWindCorrectionCurveReader.GetNoCorrectionCurve(6.2985.SI<SquareMeter>()),
+					new CrosswindCorrectionCdxALookup(6.2985.SI<SquareMeter>(),
+						CrossWindCorrectionCurveReader.GetNoCorrectionCurve(6.2985.SI<SquareMeter>()),
 						CrossWindCorrectionMode.NoCorrection),
 				CurbWeight = 7100.SI<Kilogram>() + massExtra,
 				Loading = loading,
diff --git a/VectoCore/VectoCoreTest/Models/Declaration/ShiftPolygonTest.cs b/VectoCore/VectoCoreTest/Models/Declaration/ShiftPolygonTest.cs
index 8327aeb312..9c0c25cabf 100644
--- a/VectoCore/VectoCoreTest/Models/Declaration/ShiftPolygonTest.cs
+++ b/VectoCore/VectoCoreTest/Models/Declaration/ShiftPolygonTest.cs
@@ -342,14 +342,14 @@ namespace TUGraz.VectoCore.Tests.Models.Declaration
 			};
 
 			var dao = new DeclarationDataAdapter();
-			var engineData = dao.CreateEngineData(new JSONEngineDataV3(JSONInputDataFactory.ReadFile(engineFile), engineFile),
-				GearboxType.AMT);
-
 			var gearboxData = new JSONGearboxDataV5(JSONInputDataFactory.ReadFile(gearboxFile), gearboxFile);
+			var engineData = dao.CreateEngineData(new JSONEngineDataV3(JSONInputDataFactory.ReadFile(engineFile), engineFile),
+				gearboxData, new List<ITorqueLimitInputData>());
 
 			var shiftPolygons = new List<ShiftPolygon>();
 			for (var i = 0; i < gearboxData.Gears.Count; i++) {
-				shiftPolygons.Add(DeclarationData.Gearbox.ComputeShiftPolygon(i, engineData.FullLoadCurve, gearboxData.Gears,
+				shiftPolygons.Add(DeclarationData.Gearbox.ComputeShiftPolygon(i, engineData.FullLoadCurves[(uint)(i + 1)],
+					gearboxData.Gears,
 					engineData, axlegearRatio, rdyn));
 			}
 
@@ -383,32 +383,37 @@ namespace TUGraz.VectoCore.Tests.Models.Declaration
 			var rdyn = 0.4882675.SI<Meter>();
 			var axlegearRatio = 3.71; //2.31; // 3.71; //2.59;
 
+			var gearboxData = new JSONGearboxDataV6(JSONInputDataFactory.ReadFile(gearboxFile), gearboxFile);
+
+
 			var engineData = new CombustionEngineData() {
 				IdleSpeed = 509.RPMtoRad(),
-				FullLoadCurve = EngineFullLoadCurve.ReadFromFile(engineFldFile, true)
 			};
-			engineData.FullLoadCurve.EngineData = engineData;
 
-			var gearboxData = new JSONGearboxDataV6(JSONInputDataFactory.ReadFile(gearboxFile), gearboxFile);
+			var fullLoadCurves = new Dictionary<uint, EngineFullLoadCurve>();
+			fullLoadCurves[0] = EngineFullLoadCurve.ReadFromFile(engineFldFile, true);
+			fullLoadCurves[0].EngineData = engineData;
+			for (uint i = 1; i <= gearboxData.Gears.Count; i++) {
+				fullLoadCurves[i] = AbstractSimulationDataAdapter.IntersectFullLoadCurves(fullLoadCurves[0],
+					gearboxData.Gears[(int)(i - 1)].MaxTorque);
+			}
+			engineData.FullLoadCurves = fullLoadCurves;
+
 
 			var shiftPolygons = new List<ShiftPolygon>();
 			var downshiftTransformed = new List<List<Point>>();
 			var downshiftOrig = new List<List<Point>>();
 			var upshiftOrig = new List<List<Point>>();
-			var fullLoadCurves = new List<EngineFullLoadCurve>();
 			for (var i = 0; i < gearboxData.Gears.Count; i++) {
-				var fullLoadCurve = AbstractSimulationDataAdapter.IntersectFullLoadCurves(engineData.FullLoadCurve,
-					gearboxData.Gears[i].MaxTorque);
-				shiftPolygons.Add(DeclarationData.Gearbox.ComputeShiftPolygon(i, fullLoadCurve, gearboxData.Gears,
+				shiftPolygons.Add(DeclarationData.Gearbox.ComputeShiftPolygon(i, fullLoadCurves[(uint)(i + 1)], gearboxData.Gears,
 					engineData, axlegearRatio, rdyn));
 				List<Point> tmp1, tmp2, tmp3;
 
-				ShiftPolygonComparison.ComputShiftPolygonPoints(i, fullLoadCurve, gearboxData.Gears,
+				ShiftPolygonComparison.ComputShiftPolygonPoints(i, fullLoadCurves[(uint)(i + 1)], gearboxData.Gears,
 					engineData, axlegearRatio, rdyn, out tmp1, out tmp2, out tmp3);
 				upshiftOrig.Add(tmp1);
 				downshiftTransformed.Add(tmp2);
 				downshiftOrig.Add(tmp3);
-				fullLoadCurves.Add(fullLoadCurve);
 			}
 
 			ShiftPolygonDrawer.DrawShiftPolygons(Path.GetDirectoryName(gearboxFile), fullLoadCurves, shiftPolygons,
@@ -465,32 +470,35 @@ namespace TUGraz.VectoCore.Tests.Models.Declaration
 				Assert.Ignore("Confidential File not found. Test cannot run without file.");
 			}
 
+			var gearboxData = new JSONGearboxDataV6(JSONInputDataFactory.ReadFile(Path.Combine(BasePath, gearboxFile)),
+				Path.Combine(BasePath, gearboxFile));
 			var engineData = new CombustionEngineData() {
 				IdleSpeed = idlingSpeed.RPMtoRad(),
-				FullLoadCurve = EngineFullLoadCurve.ReadFromFile(Path.Combine(BasePath, engineFldFile), true)
 			};
-			engineData.FullLoadCurve.EngineData = engineData;
 
-			var gearboxData = new JSONGearboxDataV6(JSONInputDataFactory.ReadFile(Path.Combine(BasePath, gearboxFile)),
-				Path.Combine(BasePath, gearboxFile));
+			var fullLoadCurves = new Dictionary<uint, EngineFullLoadCurve>();
+			fullLoadCurves[0] = EngineFullLoadCurve.ReadFromFile(Path.Combine(BasePath, engineFldFile), true);
+			fullLoadCurves[0].EngineData = engineData;
+			for (uint i = 1; i <= gearboxData.Gears.Count; i++) {
+				fullLoadCurves[i] = AbstractSimulationDataAdapter.IntersectFullLoadCurves(fullLoadCurves[0],
+					gearboxData.Gears[(int)(i - 1)].MaxTorque);
+			}
+			engineData.FullLoadCurves = fullLoadCurves;
+
 
 			var shiftPolygons = new List<ShiftPolygon>();
 			var downshiftTransformed = new List<List<Point>>();
 			var upshiftOrig = new List<List<Point>>();
-			var fullLoadCurves = new List<EngineFullLoadCurve>();
 			for (var i = 0; i < gearboxData.Gears.Count; i++) {
-				var fullLoadCurve = AbstractSimulationDataAdapter.IntersectFullLoadCurves(engineData.FullLoadCurve,
-					gearboxData.Gears[i].MaxTorque);
 				shiftPolygons.Add(
-					DeclarationData.Gearbox.ComputeShiftPolygon(i, fullLoadCurve, gearboxData.Gears,
+					DeclarationData.Gearbox.ComputeShiftPolygon(i, fullLoadCurves[(uint)(i + 1)], gearboxData.Gears,
 						engineData, axlegearRatio, rdyn.SI<Meter>())
 					);
 				List<Point> tmp1, tmp2, tmp3;
-				ComputShiftPolygonPoints(i, fullLoadCurve, gearboxData.Gears,
+				ComputShiftPolygonPoints(i, fullLoadCurves[(uint)(i + 1)], gearboxData.Gears,
 					engineData, axlegearRatio, rdyn.SI<Meter>(), out tmp1, out tmp2, out tmp3);
 				upshiftOrig.Add(tmp1);
 				downshiftTransformed.Add(tmp2);
-				fullLoadCurves.Add(fullLoadCurve);
 			}
 
 			var imageFile = Path.GetDirectoryName(gearboxFile) + "_" + Path.GetFileNameWithoutExtension(gearboxFile) + "_" +
@@ -516,7 +524,7 @@ namespace TUGraz.VectoCore.Tests.Models.Declaration
 			}
 		}
 
-		public static void ComputShiftPolygonPoints(int gear, FullLoadCurve fullLoadCurve,
+		public static void ComputShiftPolygonPoints(int gear, EngineFullLoadCurve fullLoadCurve,
 			IList<ITransmissionInputData> gears, CombustionEngineData engine, double axlegearRatio, Meter dynamicTyreRadius,
 			out List<Point> upshiftOrig, out List<Point> downshiftTransformed, out List<Point> downshiftOrig)
 		{
@@ -525,20 +533,20 @@ namespace TUGraz.VectoCore.Tests.Models.Declaration
 			//var engineSpeed85kmhSecondToLastGear = ComputeEngineSpeed85kmh(gears[gears.Count - 2], axlegearRatio,
 			//	dynamicTyreRadius, engine);
 
-			var nVHigh = VectoMath.Min(engineSpeed85kmhLastGear, engine.FullLoadCurve.RatedSpeed);
+			var nVHigh = VectoMath.Min(engineSpeed85kmhLastGear, engine.FullLoadCurves[0].RatedSpeed);
 
 			var diffRatio = gears[gears.Count - 2].Ratio / gears[gears.Count - 1].Ratio - 1;
 
-			var maxDragTorque = engine.FullLoadCurve.MaxDragTorque * 1.1;
+			var maxDragTorque = fullLoadCurve.MaxDragTorque * 1.1;
 
 			var p1 = new Point(engine.IdleSpeed.Value() / 2, 0);
 			var p2 = new Point(engine.IdleSpeed.Value() * 1.1, 0);
 			var p3 = new Point(nVHigh.Value() * 0.9,
-				engine.FullLoadCurve.FullLoadStationaryTorque(nVHigh * 0.9).Value());
+				fullLoadCurve.FullLoadStationaryTorque(nVHigh * 0.9).Value());
 
 			var p4 =
 				new Point((nVHigh * (1 + diffRatio / 3)).Value(), 0);
-			var p5 = new Point(engine.FullLoadCurve.N95hSpeed.Value(), engine.FullLoadCurve.MaxTorque.Value());
+			var p5 = new Point(fullLoadCurve.N95hSpeed.Value(), fullLoadCurve.MaxTorque.Value());
 
 			var p6 = new Point(p2.X, VectoMath.Interpolate(p1, p3, p2.X));
 			var p7 = new Point(p4.X, VectoMath.Interpolate(p2, p5, p4.X));
diff --git a/VectoCore/VectoCoreTest/Models/Simulation/LossMapRangeValidationTest.cs b/VectoCore/VectoCoreTest/Models/Simulation/LossMapRangeValidationTest.cs
index 26dc14cd50..6de65c4b90 100644
--- a/VectoCore/VectoCoreTest/Models/Simulation/LossMapRangeValidationTest.cs
+++ b/VectoCore/VectoCoreTest/Models/Simulation/LossMapRangeValidationTest.cs
@@ -70,7 +70,7 @@ namespace TUGraz.VectoCore.Tests.Models.Simulation
 		public void LossMapValid()
 		{
 			var gearboxData = CreateGearboxData(GearboxDirectLoss, GearboxIndirectLoss);
-			var engineData = MockSimulationDataFactory.CreateEngineDataFromFile(EngineFile);
+			var engineData = MockSimulationDataFactory.CreateEngineDataFromFile(EngineFile, gearboxData.Gears.Count);
 			var axleGearData = CreateAxleGearData(AxleGearLossMap);
 			var vehicleData = new VehicleData {
 				DynamicTyreRadius = 0.85.SI<Meter>(),
@@ -107,7 +107,7 @@ namespace TUGraz.VectoCore.Tests.Models.Simulation
 		public void LossMapInvalidAxle()
 		{
 			var gearboxData = CreateGearboxData(GearboxDirectLoss, GearboxIndirectLoss);
-			var engineData = MockSimulationDataFactory.CreateEngineDataFromFile(EngineFile);
+			var engineData = MockSimulationDataFactory.CreateEngineDataFromFile(EngineFile, gearboxData.Gears.Count);
 			var axleGearData = CreateAxleGearData(GearboxLimited);
 
 			var runData = new VectoRunData { GearboxData = gearboxData, EngineData = engineData, AxleGearData = axleGearData };
@@ -121,7 +121,7 @@ namespace TUGraz.VectoCore.Tests.Models.Simulation
 		public void LossMapLimited()
 		{
 			var gearboxData = CreateGearboxData(GearboxLimited, GearboxLimited);
-			var engineData = MockSimulationDataFactory.CreateEngineDataFromFile(EngineFile);
+			var engineData = MockSimulationDataFactory.CreateEngineDataFromFile(EngineFile, gearboxData.Gears.Count);
 			var axleGearData = CreateAxleGearData(AxleGearLossMap);
 			var runData = new VectoRunData { GearboxData = gearboxData, EngineData = engineData, AxleGearData = axleGearData };
 			var result = VectoRunData.ValidateRunData(runData, new ValidationContext(runData));
@@ -135,7 +135,7 @@ namespace TUGraz.VectoCore.Tests.Models.Simulation
 		public void LossMapAxleLossMapMissing()
 		{
 			var gearboxData = CreateGearboxData(GearboxDirectLoss, GearboxIndirectLoss);
-			var engineData = MockSimulationDataFactory.CreateEngineDataFromFile(EngineFile);
+			var engineData = MockSimulationDataFactory.CreateEngineDataFromFile(EngineFile, gearboxData.Gears.Count);
 			var vehicleData = new VehicleData {
 				DynamicTyreRadius = 0.85.SI<Meter>(),
 				Loading = 0.SI<Kilogram>(),
@@ -167,7 +167,7 @@ namespace TUGraz.VectoCore.Tests.Models.Simulation
 		[TestMethod]
 		public void LossMapGearLossMapMissing()
 		{
-			var engineData = MockSimulationDataFactory.CreateEngineDataFromFile(EngineFile);
+			var engineData = MockSimulationDataFactory.CreateEngineDataFromFile(EngineFile, 0);
 			var axleGearData = CreateAxleGearData(AxleGearLossMap);
 
 			var runData = new VectoRunData {
diff --git a/VectoCore/VectoCoreTest/Models/Simulation/MeasuredSpeedModeTest.cs b/VectoCore/VectoCoreTest/Models/Simulation/MeasuredSpeedModeTest.cs
index 79128791d6..aaac9863c9 100644
--- a/VectoCore/VectoCoreTest/Models/Simulation/MeasuredSpeedModeTest.cs
+++ b/VectoCore/VectoCoreTest/Models/Simulation/MeasuredSpeedModeTest.cs
@@ -243,7 +243,11 @@ namespace TUGraz.VectoCore.Tests.Models.Simulation
 							}
 					},
 				AxleGearData = new AxleGearData { AxleGear = new GearData { Ratio = 2.3 } },
-				EngineData = new CombustionEngineData { IdleSpeed = 560.RPMtoRad(), FullLoadCurve = fullLoadCurve },
+				EngineData =
+					new CombustionEngineData {
+						IdleSpeed = 560.RPMtoRad(),
+						FullLoadCurves = new Dictionary<uint, EngineFullLoadCurve>() { { 0, fullLoadCurve }, { 1, fullLoadCurve } }
+					},
 				GearboxData = new GearboxData { Gears = new Dictionary<uint, GearData> { { 1, new GearData { Ratio = 6.2 } } } },
 				Retarder = new RetarderData()
 			};
@@ -299,7 +303,15 @@ namespace TUGraz.VectoCore.Tests.Models.Simulation
 								CrossWindCorrectionMode.NoCorrection)
 					},
 				AxleGearData = new AxleGearData { AxleGear = new GearData { Ratio = 2.3 } },
-				EngineData = new CombustionEngineData { IdleSpeed = 560.RPMtoRad(), FullLoadCurve = fullLoadCurve },
+				EngineData = new CombustionEngineData {
+					IdleSpeed = 560.RPMtoRad(),
+					FullLoadCurves = new Dictionary<uint, EngineFullLoadCurve> {
+						{ 0, fullLoadCurve },
+						{ 1, fullLoadCurve },
+						{ 2, fullLoadCurve },
+						{ 3, fullLoadCurve }
+					}
+				},
 				GearboxData = new GearboxData {
 					Gears = new Dictionary<uint, GearData> {
 						{ 1, new GearData { Ratio = 6.696 } },
diff --git a/VectoCore/VectoCoreTest/Models/Simulation/PwheelModeTests.cs b/VectoCore/VectoCoreTest/Models/Simulation/PwheelModeTests.cs
index c91e150469..fcb338353f 100644
--- a/VectoCore/VectoCoreTest/Models/Simulation/PwheelModeTests.cs
+++ b/VectoCore/VectoCoreTest/Models/Simulation/PwheelModeTests.cs
@@ -132,7 +132,11 @@ namespace TUGraz.VectoCore.Tests.Models.Simulation
 			var data = new VectoRunData {
 				Cycle = drivingCycle,
 				AxleGearData = new AxleGearData { AxleGear = new GearData { Ratio = 2.3 } },
-				EngineData = new CombustionEngineData { IdleSpeed = 560.RPMtoRad(), FullLoadCurve = fullLoadCurve },
+				EngineData =
+					new CombustionEngineData {
+						IdleSpeed = 560.RPMtoRad(),
+						FullLoadCurves = new Dictionary<uint, EngineFullLoadCurve>() { { 0, fullLoadCurve }, { 1, fullLoadCurve } }
+					},
 				GearboxData = new GearboxData { Gears = new Dictionary<uint, GearData> { { 2, new GearData { Ratio = 3.5 } } } },
 				Retarder = new RetarderData()
 			};
diff --git a/VectoCore/VectoCoreTest/Models/Simulation/VechicleContainerTests.cs b/VectoCore/VectoCoreTest/Models/Simulation/VechicleContainerTests.cs
index 581733901e..20f41fac1a 100644
--- a/VectoCore/VectoCoreTest/Models/Simulation/VechicleContainerTests.cs
+++ b/VectoCore/VectoCoreTest/Models/Simulation/VechicleContainerTests.cs
@@ -46,7 +46,7 @@ namespace TUGraz.VectoCore.Tests.Models.Simulation
 		public void VechicleContainerHasEngine()
 		{
 			var vehicle = new VehicleContainer(ExecutionMode.Engineering);
-			var engineData = MockSimulationDataFactory.CreateEngineDataFromFile(EngineFile);
+			var engineData = MockSimulationDataFactory.CreateEngineDataFromFile(EngineFile, 0);
 			var engine = new CombustionEngine(vehicle, engineData);
 
 			Assert.IsNotNull(vehicle.EngineSpeed);
diff --git a/VectoCore/VectoCoreTest/Models/SimulationComponent/ATGearboxTest.cs b/VectoCore/VectoCoreTest/Models/SimulationComponent/ATGearboxTest.cs
index 17874bf075..b5513a2eb9 100644
--- a/VectoCore/VectoCoreTest/Models/SimulationComponent/ATGearboxTest.cs
+++ b/VectoCore/VectoCoreTest/Models/SimulationComponent/ATGearboxTest.cs
@@ -69,10 +69,10 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponent
 		]
 		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);
+			var engineData = MockSimulationDataFactory.CreateEngineDataFromFile(EngineDataFile, gearboxData.Gears.Count);
 			vehicleContainer.Engine = new CombustionEngine(vehicleContainer, engineData);
-			var gearboxData = MockSimulationDataFactory.CreateGearboxDataFromFile(GearboxDataFile, EngineDataFile, false);
 			var runData = new VectoRunData() { GearboxData = gearboxData };
 			var gearbox = new ATGearbox(vehicleContainer, new ATShiftStrategy(gearboxData, vehicleContainer), runData);
 
diff --git a/VectoCore/VectoCoreTest/Models/SimulationComponent/ClutchTest.cs b/VectoCore/VectoCoreTest/Models/SimulationComponent/ClutchTest.cs
index 8b5ed46ee3..71e5b5dc58 100644
--- a/VectoCore/VectoCoreTest/Models/SimulationComponent/ClutchTest.cs
+++ b/VectoCore/VectoCoreTest/Models/SimulationComponent/ClutchTest.cs
@@ -69,8 +69,9 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponent
 			double expectedEngineSpeed)
 		{
 			var container = new VehicleContainer(ExecutionMode.Engineering);
-			var engineData = MockSimulationDataFactory.CreateEngineDataFromFile(CoachEngine);
+			var engineData = MockSimulationDataFactory.CreateEngineDataFromFile(CoachEngine, 1);
 			var gearbox = new MockGearbox(container);
+			gearbox.Gear = 0;
 			var clutch = new Clutch(container, engineData) { IdleController = new MockIdleController() };
 			var vehicle = new MockVehicle(container);
 			vehicle.MyVehicleSpeed = 50.KMPHtoMeterPerSecond();
@@ -96,8 +97,9 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponent
 		public void ClutchContinuityTest()
 		{
 			var container = new VehicleContainer(ExecutionMode.Engineering);
-			var engineData = MockSimulationDataFactory.CreateEngineDataFromFile(CoachEngine);
+			var engineData = MockSimulationDataFactory.CreateEngineDataFromFile(CoachEngine, 1);
 			var gearbox = new MockGearbox(container);
+			gearbox.Gear = 1;
 			var engine = new MockEngine(container);
 			var clutch = new Clutch(container, engineData) { IdleController = new MockIdleController() };
 
diff --git a/VectoCore/VectoCoreTest/Models/SimulationComponent/CombustionEngineTest.cs b/VectoCore/VectoCoreTest/Models/SimulationComponent/CombustionEngineTest.cs
index c15e0c7a63..2a146114e3 100644
--- a/VectoCore/VectoCoreTest/Models/SimulationComponent/CombustionEngineTest.cs
+++ b/VectoCore/VectoCoreTest/Models/SimulationComponent/CombustionEngineTest.cs
@@ -65,7 +65,7 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponent
 		public void TestEngineHasOutPort()
 		{
 			var vehicle = new VehicleContainer(ExecutionMode.Engineering);
-			var engineData = MockSimulationDataFactory.CreateEngineDataFromFile(CoachEngine);
+			var engineData = MockSimulationDataFactory.CreateEngineDataFromFile(CoachEngine, 0);
 			var engine = new CombustionEngine(vehicle, engineData);
 
 			var port = engine.OutPort();
@@ -76,7 +76,7 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponent
 		public void TestOutPortRequestNotFailing()
 		{
 			var vehicle = new VehicleContainer(ExecutionMode.Engineering);
-			var engineData = MockSimulationDataFactory.CreateEngineDataFromFile(CoachEngine);
+			var engineData = MockSimulationDataFactory.CreateEngineDataFromFile(CoachEngine, 0);
 			var engine = new CombustionEngine(vehicle, engineData);
 
 			var port = engine.OutPort();
@@ -94,7 +94,7 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponent
 		public void TestSimpleModalData()
 		{
 			var vehicle = new VehicleContainer(ExecutionMode.Engineering);
-			var engineData = MockSimulationDataFactory.CreateEngineDataFromFile(CoachEngine);
+			var engineData = MockSimulationDataFactory.CreateEngineDataFromFile(CoachEngine,0);
 			var engine = new CombustionEngine(vehicle, engineData);
 			var port = engine.OutPort();
 
@@ -162,7 +162,7 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponent
 			double finalIdleLoad, string resultFile)
 		{
 			var vehicleContainer = new VehicleContainer(ExecutionMode.Engineering);
-			var engineData = MockSimulationDataFactory.CreateEngineDataFromFile(engineFile);
+			var engineData = MockSimulationDataFactory.CreateEngineDataFromFile(engineFile, 0);
 			var engine = new EngineOnlyCombustionEngine(vehicleContainer, engineData);
 
 			var expectedResults = VectoCSVFile.Read(resultFile);
@@ -187,7 +187,7 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponent
 			var i = 0;
 			// dt = TimeSpan.FromSeconds(double.Parse(TestContext.DataRow["dt"].ToString(), CultureInfo.InvariantCulture));
 			// dt = TimeSpan.FromSeconds(expectedResults.Rows[i].ParseDouble(0)) - t;
-			var engineLoadPower = engineData.FullLoadCurve.FullLoadStationaryPower(angularSpeed);
+			var engineLoadPower = engineData.FullLoadCurves[0].FullLoadStationaryPower(angularSpeed);
 			idlePower = finalIdleLoad.SI<Watt>();
 			for (; t < 25; t += dt, i++) {
 				dt = (expectedResults.Rows[i + 1].ParseDouble(0) - expectedResults.Rows[i].ParseDouble(0)).SI<Second>();
@@ -218,7 +218,7 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponent
 			double finalIdleLoad, string resultFile)
 		{
 			var vehicleContainer = new VehicleContainer(ExecutionMode.Engineering);
-			var engineData = MockSimulationDataFactory.CreateEngineDataFromFile(engineFile);
+			var engineData = MockSimulationDataFactory.CreateEngineDataFromFile(engineFile, 0);
 			var engine = new CombustionEngine(vehicleContainer, engineData);
 
 			var expectedResults = VectoCSVFile.Read(resultFile);
@@ -243,7 +243,7 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponent
 			var i = 0;
 			// dt = TimeSpan.FromSeconds(double.Parse(TestContext.DataRow["dt"].ToString(), CultureInfo.InvariantCulture));
 			// dt = TimeSpan.FromSeconds(expectedResults.Rows[i].ParseDouble(0)) - t;
-			var engineLoadPower = engineData.FullLoadCurve.FullLoadStationaryPower(angularSpeed);
+			var engineLoadPower = engineData.FullLoadCurves[0].FullLoadStationaryPower(angularSpeed);
 			idlePower = finalIdleLoad.SI<Watt>();
 			for (; t < 25; t += dt, i++) {
 				dt = (expectedResults.Rows[i + 1].ParseDouble(0) - expectedResults.Rows[i].ParseDouble(0)).SI<Second>();
@@ -267,7 +267,7 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponent
 		{
 			var container = new VehicleContainer(ExecutionMode.Engineering);
 			var gearbox = new MockGearbox(container);
-			var engineData = MockSimulationDataFactory.CreateEngineDataFromFile(CoachEngine);
+			var engineData = MockSimulationDataFactory.CreateEngineDataFromFile(CoachEngine, 1);
 			var vehicle = new MockVehicle(container);
 			vehicle.MyVehicleSpeed = 0.SI<MeterPerSecond>();
 			var engine = new CombustionEngine(container, engineData);
@@ -422,7 +422,7 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponent
 				5000, 5000, 5000, 5000, 5000, 5000, 5000
 			};
 
-			var fld = engine.ModelData.FullLoadCurve;
+			var fld = engine.ModelData.FullLoadCurves;
 
 			gearbox.SetClutch(false);
 			var engSpeedResults = new List<dynamic>();
@@ -458,7 +458,7 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponent
 
 			var angularVelocity = 95.5596.SI<PerSecond>();
 
-			var torque = (engine.ModelData.FullLoadCurve.DragLoadStationaryPower(angularVelocity) - 5000.SI<Watt>()) /
+			var torque = (engine.ModelData.FullLoadCurves[0].DragLoadStationaryPower(angularVelocity) - 5000.SI<Watt>()) /
 						angularVelocity;
 
 			var response = (ResponseSuccess)requestPort.Initialize(torque, angularVelocity);
@@ -502,7 +502,7 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponent
 		[TestCase]
 		public void Test_EngineData()
 		{
-			var engineData = MockSimulationDataFactory.CreateEngineDataFromFile(CoachEngine);
+			var engineData = MockSimulationDataFactory.CreateEngineDataFromFile(CoachEngine, 0);
 			var motorway = engineData.WHTCMotorway;
 			Assert.AreEqual(motorway, 1);
 
@@ -530,7 +530,7 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponent
 		{
 			container = new VehicleContainer(ExecutionMode.Engineering);
 			gearbox = new MockGearbox(container);
-			var engineData = MockSimulationDataFactory.CreateEngineDataFromFile(engineFile);
+			var engineData = MockSimulationDataFactory.CreateEngineDataFromFile(engineFile, 1);
 
 			engine = new CombustionEngine(container, engineData);
 			var clutch = new Clutch(container, engineData);
diff --git a/VectoCore/VectoCoreTest/Models/SimulationComponent/DriverTest.cs b/VectoCore/VectoCoreTest/Models/SimulationComponent/DriverTest.cs
index efc16d5959..2c94ef86a3 100644
--- a/VectoCore/VectoCoreTest/Models/SimulationComponent/DriverTest.cs
+++ b/VectoCore/VectoCoreTest/Models/SimulationComponent/DriverTest.cs
@@ -64,8 +64,8 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponent
 		[TestMethod]
 		public void DriverCoastingTest()
 		{
-			var engineData = MockSimulationDataFactory.CreateEngineDataFromFile(EngineFile);
-
+			var engineData = MockSimulationDataFactory.CreateEngineDataFromFile(EngineFile, 1);
+			
 			var vehicleData = CreateVehicleData(33000.SI<Kilogram>());
 			vehicleData.DynamicTyreRadius = 0.026372213.SI<Meter>(); // take into account axle ratio, gear ratio
 
@@ -121,7 +121,7 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponent
 		[TestMethod]
 		public void DriverCoastingTest2()
 		{
-			var engineData = MockSimulationDataFactory.CreateEngineDataFromFile(EngineFile);
+			var engineData = MockSimulationDataFactory.CreateEngineDataFromFile(EngineFile, 1);
 
 			var vehicleData = CreateVehicleData(33000.SI<Kilogram>());
 			vehicleData.DynamicTyreRadius = 0.026372213.SI<Meter>(); // take into account axle ratio, gear ratio
@@ -180,7 +180,7 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponent
 		[TestMethod]
 		public void DriverOverloadTest()
 		{
-			var engineData = MockSimulationDataFactory.CreateEngineDataFromFile(EngineFileHigh);
+			var engineData = MockSimulationDataFactory.CreateEngineDataFromFile(EngineFileHigh, 1);
 
 			var vehicleData = CreateVehicleData(33000.SI<Kilogram>());
 
@@ -206,6 +206,7 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponent
 			AddComponent(tmp, engine);
 
 			var gbx = new MockGearbox(vehicleContainer);
+			gbx.Gear = 1;
 
 			var driverPort = driver.OutPort();
 
diff --git a/VectoCore/VectoCoreTest/Models/SimulationComponent/GearboxShiftLossesTest.cs b/VectoCore/VectoCoreTest/Models/SimulationComponent/GearboxShiftLossesTest.cs
index 336323a26a..c3cf7d1fb3 100644
--- a/VectoCore/VectoCoreTest/Models/SimulationComponent/GearboxShiftLossesTest.cs
+++ b/VectoCore/VectoCoreTest/Models/SimulationComponent/GearboxShiftLossesTest.cs
@@ -97,7 +97,7 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponent
 			vehicle.MyVehicleSpeed = 10.KMPHtoMeterPerSecond();
 			driver.DriverBehavior = DrivingBehavior.Driving;
 			var engine = new CombustionEngine(container,
-				MockSimulationDataFactory.CreateEngineDataFromFile(ATPowerTrain.EngineFile));
+				MockSimulationDataFactory.CreateEngineDataFromFile(ATPowerTrain.EngineFile, gearboxData.Gears.Count));
 			container.Engine = engine;
 			var runData = new VectoRunData() {
 				GearboxData = gearboxData,
diff --git a/VectoCore/VectoCoreTest/Models/SimulationComponent/GearboxTest.cs b/VectoCore/VectoCoreTest/Models/SimulationComponent/GearboxTest.cs
index 21edf9ef5d..d902ff6958 100644
--- a/VectoCore/VectoCoreTest/Models/SimulationComponent/GearboxTest.cs
+++ b/VectoCore/VectoCoreTest/Models/SimulationComponent/GearboxTest.cs
@@ -30,6 +30,7 @@
 */
 
 using System;
+using System.Collections.Generic;
 using System.Linq;
 using NUnit.Framework;
 using TUGraz.VectoCommon.Exceptions;
@@ -38,6 +39,7 @@ using TUGraz.VectoCommon.Utils;
 using TUGraz.VectoCore.Configuration;
 using TUGraz.VectoCore.InputData.Reader;
 using TUGraz.VectoCore.InputData.Reader.ComponentData;
+using TUGraz.VectoCore.InputData.Reader.DataObjectAdapter;
 using TUGraz.VectoCore.Models.Connector.Ports.Impl;
 using TUGraz.VectoCore.Models.Declaration;
 using TUGraz.VectoCore.Models.Simulation.Data;
@@ -85,14 +87,14 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponent
 
 			return new GearboxData {
 				Gears = ratios.Select((ratio, i) =>
-						Tuple.Create((uint)i,
-							new GearData {
+					Tuple.Create((uint)i,
+						new GearData {
 //								MaxTorque = 2300.SI<NewtonMeter>(),
-								LossMap = TransmissionLossMapReader.ReadFromFile(i != 6 ? IndirectLossMap : DirectLossMap, ratio,
-									string.Format("Gear {0}", i)),
-								Ratio = ratio,
-								ShiftPolygon = ShiftPolygonReader.ReadFromFile(GearboxShiftPolygonFile)
-							}))
+							LossMap = TransmissionLossMapReader.ReadFromFile(i != 6 ? IndirectLossMap : DirectLossMap, ratio,
+								string.Format("Gear {0}", i)),
+							Ratio = ratio,
+							ShiftPolygon = ShiftPolygonReader.ReadFromFile(GearboxShiftPolygonFile)
+						}))
 					.ToDictionary(k => k.Item1 + 1, v => v.Item2),
 				ShiftTime = 2.SI<Second>(),
 				Inertia = 0.SI<KilogramSquareMeter>(),
@@ -243,6 +245,20 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponent
 				"2000.000001,1352,-301,0.25",
 				"2100,1100,-320,0.25	   ",
 			};
+			var engineData = new CombustionEngineData() {
+				IdleSpeed = 600.RPMtoRad(),
+				Inertia = 0.SI<KilogramSquareMeter>(),
+			};
+			var fullLoadCurves = new Dictionary<uint, EngineFullLoadCurve>();
+			fullLoadCurves[0] = EngineFullLoadCurve.Create(
+				VectoCSVFile.ReadStream(
+					InputDataHelper.InputDataAsStream("engine speed [1/min],full load torque [Nm],motoring torque [Nm],PT1 [s]",
+						fld)));
+			fullLoadCurves[0].EngineData = engineData;
+			foreach (var gears in gearboxData.Gears) {
+				fullLoadCurves[gears.Key] = fullLoadCurves[0];
+			}
+			engineData.FullLoadCurves = fullLoadCurves;
 			return new VectoRunData() {
 				VehicleData = new VehicleData() {
 					DynamicTyreRadius = 0.492.SI<Meter>()
@@ -252,15 +268,7 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponent
 						Ratio = 2.64
 					}
 				},
-				EngineData = new CombustionEngineData() {
-					IdleSpeed = 600.RPMtoRad(),
-					Inertia = 0.SI<KilogramSquareMeter>(),
-					FullLoadCurve =
-						EngineFullLoadCurve.Create(
-							VectoCSVFile.ReadStream(
-								InputDataHelper.InputDataAsStream("engine speed [1/min],full load torque [Nm],motoring torque [Nm],PT1 [s]",
-									fld)))
-				},
+				EngineData = engineData,
 				GearboxData = gearboxData
 			};
 		}
diff --git a/VectoCore/VectoCoreTest/Models/SimulationComponentData/FullLoadCurveTest.cs b/VectoCore/VectoCoreTest/Models/SimulationComponentData/FullLoadCurveTest.cs
index 1521da0688..8a03c5cb6e 100644
--- a/VectoCore/VectoCoreTest/Models/SimulationComponentData/FullLoadCurveTest.cs
+++ b/VectoCore/VectoCoreTest/Models/SimulationComponentData/FullLoadCurveTest.cs
@@ -125,7 +125,7 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponentData
 			AssertHelper.AreRelativeEqual(194.515816596908.SI<PerSecond>(), fldCurve.N95hSpeed);
 			AssertHelper.AreRelativeEqual(83.81645.SI<PerSecond>(), fldCurve.LoSpeed);
 			AssertHelper.AreRelativeEqual(219.084329211505.SI<PerSecond>(), fldCurve.HiSpeed);
-			AssertHelper.AreRelativeEqual(2300.SI<NewtonMeter>(), fldCurve.MaxLoadTorque);
+			AssertHelper.AreRelativeEqual(2300.SI<NewtonMeter>(), fldCurve.MaxTorque);
 			AssertHelper.AreRelativeEqual(-320.SI<NewtonMeter>(), fldCurve.MaxDragTorque);
 		}
 
@@ -244,7 +244,11 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponentData
 		public void FullLoad_LossMap_Test()
 		{
 			var engineData = new CombustionEngineData {
-				FullLoadCurve = EngineFullLoadCurve.ReadFromFile(@"TestData\Components\12t Delivery Truck.vfld"),
+				FullLoadCurves =
+					new Dictionary<uint, EngineFullLoadCurve>() {
+						{ 0, EngineFullLoadCurve.ReadFromFile(@"TestData\Components\12t Delivery Truck.vfld") },
+						{ 1, EngineFullLoadCurve.ReadFromFile(@"TestData\Components\12t Delivery Truck.vfld") }
+					},
 				IdleSpeed = 560.RPMtoRad()
 			};
 
diff --git a/VectoCore/VectoCoreTest/Models/SimulationComponentData/ValidationTest.cs b/VectoCore/VectoCoreTest/Models/SimulationComponentData/ValidationTest.cs
index 89828edd24..8198eac486 100644
--- a/VectoCore/VectoCoreTest/Models/SimulationComponentData/ValidationTest.cs
+++ b/VectoCore/VectoCoreTest/Models/SimulationComponentData/ValidationTest.cs
@@ -89,10 +89,10 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponentData
 				WHTCUrban = 1,
 				WHTCRural = 1,
 				WHTCMotorway = 1,
-				FullLoadCurve = EngineFullLoadCurve.Create(fullLoad),
+				FullLoadCurves = new Dictionary<uint, EngineFullLoadCurve>() { { 0, EngineFullLoadCurve.Create(fullLoad) } },
 				ConsumptionMap = FuelConsumptionMapReader.Create(fuelConsumption)
 			};
-			data.FullLoadCurve.EngineData = data;
+			data.FullLoadCurves[0].EngineData = data;
 
 			var results = data.Validate(ExecutionMode.Declaration, null, false);
 			Assert.IsFalse(results.Any(), "Validation Failed: " + string.Join("; ", results.Select(r => r.ErrorMessage)));
@@ -127,7 +127,7 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponentData
 			};
 			var dao = new EngineeringDataAdapter();
 
-			var engineData = dao.CreateEngineData(data, null);
+			var engineData = dao.CreateEngineData(data, null, new List<ITorqueLimitInputData>());
 
 			var results = engineData.Validate(ExecutionMode.Declaration, null, false);
 			Assert.IsFalse(results.Any(), "Validation failed: " + string.Join("; ", results.Select(r => r.ErrorMessage)));
@@ -165,7 +165,12 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponentData
 			};
 			var dao = new DeclarationDataAdapter();
 
-			var engineData = dao.CreateEngineData(data, GearboxType.AMT);
+			var dummyGearbox = new DummyGearboxData() {
+				Type = GearboxType.AMT,
+				Gears = new List<ITransmissionInputData>()
+			};
+
+			var engineData = dao.CreateEngineData(data, dummyGearbox, new List<ITorqueLimitInputData>());
 
 			var results = engineData.Validate(ExecutionMode.Declaration, null, false);
 			Assert.IsFalse(results.Any(), "Validation failed: " + string.Join("; ", results.Select(r => r.ErrorMessage)));
@@ -223,7 +228,11 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponentData
 			var container = new VehicleContainer(ExecutionMode.Engineering);
 			var data = new DistanceRun(container);
 			var engineData = new CombustionEngineData {
-				FullLoadCurve = EngineFullLoadCurve.ReadFromFile(@"TestData\Components\12t Delivery Truck.vfld"),
+				FullLoadCurves =
+					new Dictionary<uint, EngineFullLoadCurve>() {
+						{ 0, EngineFullLoadCurve.ReadFromFile(@"TestData\Components\12t Delivery Truck.vfld") },
+						{ 1, EngineFullLoadCurve.ReadFromFile(@"TestData\Components\12t Delivery Truck.vfld") },
+					},
 				IdleSpeed = 560.RPMtoRad()
 			};
 
@@ -244,7 +253,8 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponentData
 				Creator = "Mr. Test",
 				CrossWindCorrectionMode = CrossWindCorrectionMode.NoCorrection,
 				CrossWindCorrectionCurve =
-					new CrosswindCorrectionCdxALookup(5.SI<SquareMeter>(),CrossWindCorrectionCurveReader.GetNoCorrectionCurve(5.SI<SquareMeter>()),
+					new CrosswindCorrectionCdxALookup(5.SI<SquareMeter>(),
+						CrossWindCorrectionCurveReader.GetNoCorrectionCurve(5.SI<SquareMeter>()),
 						CrossWindCorrectionMode.NoCorrection),
 				CurbWeight = 7500.SI<Kilogram>(),
 				DynamicTyreRadius = 0.5.SI<Meter>(),
@@ -293,7 +303,11 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponentData
 			var container = new VehicleContainer(ExecutionMode.Engineering);
 			var data = new DistanceRun(container);
 			var engineData = new CombustionEngineData {
-				FullLoadCurve = EngineFullLoadCurve.ReadFromFile(@"TestData\Components\12t Delivery Truck.vfld"),
+				FullLoadCurves =
+					new Dictionary<uint, EngineFullLoadCurve>() {
+						{ 0, EngineFullLoadCurve.ReadFromFile(@"TestData\Components\12t Delivery Truck.vfld") },
+						{ 1, EngineFullLoadCurve.ReadFromFile(@"TestData\Components\12t Delivery Truck.vfld") }
+					},
 				IdleSpeed = 560.RPMtoRad()
 			};
 
@@ -602,4 +616,33 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponentData
 			}
 		}
 	}
+
+	public class DummyGearboxData : IGearboxEngineeringInputData
+	{
+		public DataSourceType SourceType { get; set; }
+		public string Source { get; set; }
+		public bool SavedInDeclarationMode { get; set; }
+		public string Manufacturer { get; set; }
+		public string Model { get; set; }
+		public string Creator { get; set; }
+		public string Date { get; set; }
+		public string TechnicalReportId { get; set; }
+		public string CertificationNumber { get; set; }
+		public string DigestValue { get; set; }
+		public IntegrityStatus IntegrityStatus { get; set; }
+		public GearboxType Type { get; set; }
+		public IList<ITransmissionInputData> Gears { get; set; }
+		public KilogramSquareMeter Inertia { get; set; }
+		public Second TractionInterruption { get; set; }
+		public Second MinTimeBetweenGearshift { get; set; }
+		public double TorqueReserve { get; set; }
+		public MeterPerSecond StartSpeed { get; set; }
+		public MeterPerSquareSecond StartAcceleration { get; set; }
+		public double StartTorqueReserve { get; set; }
+		public ITorqueConverterEngineeringInputData TorqueConverter { get; set; }
+		public Second DownshiftAfterUpshiftDelay { get; set; }
+		public Second UpshiftAfterDownshiftDelay { get; set; }
+		public MeterPerSquareSecond UpshiftMinAcceleration { get; set; }
+		public Second PowershiftShiftTime { get; set; }
+	}
 }
\ No newline at end of file
diff --git a/VectoCore/VectoCoreTest/Reports/ModDataTest.cs b/VectoCore/VectoCoreTest/Reports/ModDataTest.cs
index 560d2e5699..2b311ee128 100644
--- a/VectoCore/VectoCoreTest/Reports/ModDataTest.cs
+++ b/VectoCore/VectoCoreTest/Reports/ModDataTest.cs
@@ -74,7 +74,7 @@ namespace TUGraz.VectoCore.Tests.Reports
 			var sumData = new SummaryDataContainer(null);
 			var run = Truck40tPowerTrain.CreateEngineeringRun(cycle, "Truck_ModDataIntegrity.vmod");
 
-			var engineData = MockSimulationDataFactory.CreateEngineDataFromFile(Truck40tPowerTrain.EngineFile);
+			var engineData = MockSimulationDataFactory.CreateEngineDataFromFile(Truck40tPowerTrain.EngineFile, 0);
 
 			// get a reference to the mod-data because the modaldata container clears it after simulation
 			var modData = ((ModalDataContainer)run.GetContainer().ModalData).Data;
diff --git a/VectoCore/VectoCoreTest/Utils/MockRunData.cs b/VectoCore/VectoCoreTest/Utils/MockRunData.cs
index 0a07672cb4..dcb7af96af 100644
--- a/VectoCore/VectoCoreTest/Utils/MockRunData.cs
+++ b/VectoCore/VectoCoreTest/Utils/MockRunData.cs
@@ -63,23 +63,27 @@ namespace TUGraz.VectoCore.Tests.Utils
 			EngineData = new CombustionEngineData() {
 				IdleSpeed = 600.RPMtoRad(),
 				Displacement = 0.SI<CubicMeter>(),
-				FullLoadCurve = new EngineFullLoadCurve() {
-					FullLoadEntries = new List<FullLoadCurve.FullLoadCurveEntry>() {
-						new FullLoadCurve.FullLoadCurveEntry() {
-							EngineSpeed = 600.RPMtoRad(),
-							TorqueDrag = -100.SI<NewtonMeter>(),
-							TorqueFullLoad = 500.SI<NewtonMeter>()
-						},
-						new FullLoadCurve.FullLoadCurveEntry() {
-							EngineSpeed = 1800.RPMtoRad(),
-							TorqueDrag = -120.SI<NewtonMeter>(),
-							TorqueFullLoad = 1200.SI<NewtonMeter>()
-						},
-						new FullLoadCurve.FullLoadCurveEntry() {
-							EngineSpeed = 2500.RPMtoRad(),
-							TorqueDrag = -150.SI<NewtonMeter>(),
-							TorqueFullLoad = 400.SI<NewtonMeter>()
-						},
+				FullLoadCurves = new Dictionary<uint, EngineFullLoadCurve>() {
+					{
+						0, new EngineFullLoadCurve() {
+							FullLoadEntries = new List<FullLoadCurve.FullLoadCurveEntry>() {
+								new FullLoadCurve.FullLoadCurveEntry() {
+									EngineSpeed = 600.RPMtoRad(),
+									TorqueDrag = -100.SI<NewtonMeter>(),
+									TorqueFullLoad = 500.SI<NewtonMeter>()
+								},
+								new FullLoadCurve.FullLoadCurveEntry() {
+									EngineSpeed = 1800.RPMtoRad(),
+									TorqueDrag = -120.SI<NewtonMeter>(),
+									TorqueFullLoad = 1200.SI<NewtonMeter>()
+								},
+								new FullLoadCurve.FullLoadCurveEntry() {
+									EngineSpeed = 2500.RPMtoRad(),
+									TorqueDrag = -150.SI<NewtonMeter>(),
+									TorqueFullLoad = 400.SI<NewtonMeter>()
+								},
+							}
+						}
 					}
 				}
 			};
diff --git a/VectoCore/VectoCoreTest/Utils/MockSimulationDataFactory.cs b/VectoCore/VectoCoreTest/Utils/MockSimulationDataFactory.cs
index 11c1a90055..d37a2d5f52 100644
--- a/VectoCore/VectoCoreTest/Utils/MockSimulationDataFactory.cs
+++ b/VectoCore/VectoCoreTest/Utils/MockSimulationDataFactory.cs
@@ -29,6 +29,7 @@
 *   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;
@@ -53,12 +54,12 @@ namespace TUGraz.VectoCore.Tests.Utils
 			var engineInput = JSONInputDataFactory.ReadEngine(engineFile);
 			if (declarationMode) {
 				var dao = new DeclarationDataAdapter();
-				var engineData = dao.CreateEngineData(engineInput, gearboxInput.Type);
+				var engineData = dao.CreateEngineData(engineInput, 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);
+				var engineData = dao.CreateEngineData(engineInput, gearboxInput, new List<ITorqueLimitInputData>());
 				return dao.CreateGearboxData(gearboxInput, engineData, ((IAxleGearInputData)gearboxInput).Ratio, 0.5.SI<Meter>(),
 					true);
 			}
@@ -71,11 +72,15 @@ namespace TUGraz.VectoCore.Tests.Utils
 			return dao.CreateAxleGearData((IAxleGearInputData)axleGearInput, false);
 		}
 
-		public static CombustionEngineData CreateEngineDataFromFile(string engineFile)
+		public static CombustionEngineData CreateEngineDataFromFile(string engineFile, int numGears)
 		{
 			var dao = new EngineeringDataAdapter();
 			var engineInput = JSONInputDataFactory.ReadEngine(engineFile);
-			return dao.CreateEngineData(engineInput, null);
+			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)
diff --git a/VectoCore/VectoCoreTest/Utils/ShiftPolygonDrawer.cs b/VectoCore/VectoCoreTest/Utils/ShiftPolygonDrawer.cs
index 3f20a218b2..82a27e4014 100644
--- a/VectoCore/VectoCoreTest/Utils/ShiftPolygonDrawer.cs
+++ b/VectoCore/VectoCoreTest/Utils/ShiftPolygonDrawer.cs
@@ -52,7 +52,8 @@ namespace TUGraz.VectoCore.Tests.Utils
 
 		private static Size _diagramSize = new Size(1000, 800);
 
-		public static void DrawShiftPolygons(string title, List<EngineFullLoadCurve> engineFld, List<ShiftPolygon> polygons,
+		public static void DrawShiftPolygons(string title, Dictionary<uint, EngineFullLoadCurve> engineFld,
+			List<ShiftPolygon> polygons,
 			string imageFileName, PerSecond speed85kmh, List<List<Point>> upshiftOrig = null,
 			List<List<Point>> downshiftTransformed = null, List<List<Point>> downshiftOrig = null)
 		{
@@ -62,7 +63,7 @@ namespace TUGraz.VectoCore.Tests.Utils
 			var chart = new Chart() {
 				Size = new Size((int)(_diagramSize.Width * numCols), (int)(_diagramSize.Height * numRows))
 			};
-			var maxX = engineFld.First().FullLoadEntries.Last().EngineSpeed.Value() / Constants.RPMToRad * 1.1;
+			var maxX = engineFld[0].FullLoadEntries.Last().EngineSpeed.Value() / Constants.RPMToRad * 1.1;
 
 			AddLegend(chart);
 
@@ -70,8 +71,8 @@ namespace TUGraz.VectoCore.Tests.Utils
 			foreach (var shiftPolygon in polygons) {
 				var chartArea = AddChartArea(chart, "Gear " + (i + 1), "Engine Speed", "Torque", 0, maxX);
 
-				PlotPower(engineFld[i], chartArea, chart, "engine power " + i);
-				PlotFLD(engineFld[i], speed85kmh, chartArea, chart, "Engine Full Load " + i);
+				PlotPower(engineFld[(uint)(i + 1)], chartArea, chart, "engine power " + i);
+				PlotFLD(engineFld[(uint)(i +1)], speed85kmh, chartArea, chart, "Engine Full Load " + i);
 
 				if (upshiftOrig != null && i < upshiftOrig.Count) {
 					PlotShiftLine("UpshiftOrig " + i, chartArea, chart, Color.Gray,
@@ -234,7 +235,7 @@ namespace TUGraz.VectoCore.Tests.Utils
 				new[]
 				{ n, n }
 					.ToList();
-			var ypref = new[] { engineFld.MaxDragTorque.Value(), engineFld.MaxLoadTorque.Value() }.ToList();
+			var ypref = new[] { engineFld.MaxDragTorque.Value(), engineFld.MaxTorque.Value() }.ToList();
 			chart.Series[seriesNpref.Name].Points.DataBindXY(xpref, ypref);
 		}
 
-- 
GitLab