diff --git a/VECTO/GUI/GearboxForm.vb b/VECTO/GUI/GearboxForm.vb
index fe16fdd197cf634f2cb77dd62f7f5830115d3f88..d2e992bdec8dd65118bf8bfd028db0993fcf1885 100644
--- a/VECTO/GUI/GearboxForm.vb
+++ b/VECTO/GUI/GearboxForm.vb
@@ -73,11 +73,17 @@ Public Class GearboxForm
 		CbGStype.ValueMember = "Value"
 		CbGStype.DisplayMember = "Label"
 
-		CbGStype.DataSource = [Enum].GetValues(GetType(GearboxType)) _
-			.Cast(Of GearboxType)() _
-			.Where(Function(type) type.ManualTransmission() OrElse type.AutomaticTransmission()) _
-			.Select(Function(type) New With {Key .Value = type, .Label = type.GetLabel()}).ToList()
-
+		If (Cfg.DeclMode) Then
+			CbGStype.DataSource = [Enum].GetValues(GetType(GearboxType)) _
+				.Cast(Of GearboxType)() _
+				.Where(Function(type) type.ManualTransmission() OrElse type = GearboxType.ATSerial) _
+				.Select(Function(type) New With {Key .Value = type, .Label = type.GetLabel()}).ToList()
+		Else
+			CbGStype.DataSource = [Enum].GetValues(GetType(GearboxType)) _
+				.Cast(Of GearboxType)() _
+				.Where(Function(type) type.ManualTransmission() OrElse type.AutomaticTransmission()) _
+				.Select(Function(type) New With {Key .Value = type, .Label = type.GetLabel()}).ToList()
+		End If
 		DeclInit()
 
 		_changed = False
@@ -99,7 +105,7 @@ Public Class GearboxForm
 		TbMinTimeBetweenShifts.Text = DeclarationData.Gearbox.MinTimeBetweenGearshifts.ToGUIFormat()
 		'cDeclaration.MinTimeBetweenGearshift(GStype)
 
-		TbTqResv.Text = (DeclarationData.Gearbox.TorqueReserve * 100).ToGUIFormat()									' cDeclaration.TqResv
+		TbTqResv.Text = (DeclarationData.Gearbox.TorqueReserve * 100).ToGUIFormat()									  ' cDeclaration.TqResv
 		TbTqResvStart.Text = (DeclarationData.Gearbox.TorqueReserveStart * 100).ToGUIFormat() 'cDeclaration.TqResvStart
 		TbStartSpeed.Text = DeclarationData.Gearbox.StartSpeed.ToGUIFormat()	'cDeclaration.StartSpeed
 		TbStartAcc.Text = DeclarationData.Gearbox.StartAcceleration.ToGUIFormat()	' cDeclaration.StartAcc
@@ -820,7 +826,7 @@ Public Class GearboxForm
 				'Dim fullLoadCurve As FullLoadCurve = ConvertToFullLoadCurve(FLD0.LnU, FLD0.LTq)
 				Dim gears As IList(Of ITransmissionInputData) = ConvertToGears(LvGears.Items)
 				Dim shiftLines As ShiftPolygon = GetShiftLines(engine.IdleSpeed, engineFld, vehicle, gears, gear)
-				If (CType(CbGStype.SelectedValue, GearboxType).ManualTransmission() AndAlso Not IsNothing(shiftLines)) Then
+				If (Not IsNothing(shiftLines)) Then
 
 
 					s = New Series
@@ -891,8 +897,9 @@ 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 maxTqStr As String = LvGears.Items(gear).SubItems(GearboxTbl.MaxTorque).Text
 		Dim engine As CombustionEngineData = ConvertToEngineData(engineFullLoadCurve, idleSpeed, gear,
-																LvGears.Items(gear).SubItems(GearboxTbl.MaxTorque).Text.ToDouble(0).SI(Of NewtonMeter))
+																If(String.IsNullOrWhiteSpace(maxTqStr), Nothing, maxTqStr.ToDouble(0).SI(Of NewtonMeter)))
 		If gears.Count <= 1 Then
 			Return Nothing
 		End If
@@ -906,7 +913,7 @@ Public Class GearboxForm
 		If (rDyn.IsEqual(0)) Then
 			Return Nothing
 		End If
-		Dim shiftLines As ShiftPolygon = DeclarationData.Gearbox.ComputeShiftPolygon(gear - 1,
+		Dim shiftLines As ShiftPolygon = DeclarationData.Gearbox.ComputeShiftPolygon(CType(CbGStype.SelectedValue, GearboxType), gear - 1,
 																					engine.FullLoadCurves(CType(gear, UInteger)), gears, engine,
 																					Double.Parse(LvGears.Items(0).SubItems(GearboxTbl.Ratio).Text, CultureInfo.InvariantCulture),
 																					(rDyn))
diff --git a/VECTO/Input Files/Gearbox.vb b/VECTO/Input Files/Gearbox.vb
index 91f5efc722648579e64eb23481158f704f04cc49..c25999ffe0b93fd107e43a7574b56f535e8ec515 100644
--- a/VECTO/Input Files/Gearbox.vb	
+++ b/VECTO/Input Files/Gearbox.vb	
@@ -368,6 +368,13 @@ Public Class Gearbox
 		End Get
 	End Property
 
+	Public ReadOnly Property IGearboxDeclarationInputData_TorqueConverter As ITorqueConverterDeclarationInputData _
+		Implements IGearboxDeclarationInputData.TorqueConverter
+		Get
+			Return Me
+		End Get
+	End Property
+
 	Public ReadOnly Property ReferenceRPM As PerSecond Implements ITorqueConverterEngineeringInputData.ReferenceRPM
 		Get
 			Return TorqueConverterReferenceRpm.RPMtoRad()
diff --git a/VectoCommon/VectoCommon/InputData/DeclarationInputData.cs b/VectoCommon/VectoCommon/InputData/DeclarationInputData.cs
index f73c2afac6677a2f348d7ee25faa550f79f26b5d..862f5604db5742afa7dfad1d028f9578b3b76eca 100644
--- a/VectoCommon/VectoCommon/InputData/DeclarationInputData.cs
+++ b/VectoCommon/VectoCommon/InputData/DeclarationInputData.cs
@@ -211,6 +211,12 @@ namespace TUGraz.VectoCommon.InputData
 		/// cf. VECTO Input Parameters.xlsx
 		/// </summary>
 		IList<ITransmissionInputData> Gears { get; }
+
+		/// <summary>
+		/// P090, P091, P092, P127
+		/// cf. VECTO Input Parameters.xlsx
+		/// </summary>
+		ITorqueConverterDeclarationInputData TorqueConverter { get; }
 	}
 
 
diff --git a/VectoCommon/VectoCommon/InputData/EngineeringInputData.cs b/VectoCommon/VectoCommon/InputData/EngineeringInputData.cs
index c8db80a6d093c4986f7d6c8cc6ccea64c03b47c5..6ef698ff641aa6892519363d3c418a906b5a7d59 100644
--- a/VectoCommon/VectoCommon/InputData/EngineeringInputData.cs
+++ b/VectoCommon/VectoCommon/InputData/EngineeringInputData.cs
@@ -183,12 +183,6 @@ namespace TUGraz.VectoCommon.InputData
 		///// </summary>
 		//bool SkipGears { get; }
 
-		/// <summary>
-		/// P090, P091, P092, P127
-		/// cf. VECTO Input Parameters.xlsx
-		/// </summary>
-		ITorqueConverterEngineeringInputData TorqueConverter { get; }
-
 		Second DownshiftAfterUpshiftDelay { get; }
 
 		Second UpshiftAfterDownshiftDelay { get; }
@@ -196,6 +190,8 @@ namespace TUGraz.VectoCommon.InputData
 		MeterPerSquareSecond UpshiftMinAcceleration { get; }
 
 		Second PowershiftShiftTime { get; }
+
+		new ITorqueConverterEngineeringInputData TorqueConverter { get; }
 	}
 
 	public interface ITorqueConverterEngineeringInputData : ITorqueConverterDeclarationInputData
diff --git a/VectoCore/VectoCore/InputData/FileIO/JSON/JSONGearboxData.cs b/VectoCore/VectoCore/InputData/FileIO/JSON/JSONGearboxData.cs
index c3bc053dba707c141392f961aceb4b742bba76f4..cefd8c1086532aba7b75c9a672fc5a92e90d0b24 100644
--- a/VectoCore/VectoCore/InputData/FileIO/JSON/JSONGearboxData.cs
+++ b/VectoCore/VectoCore/InputData/FileIO/JSON/JSONGearboxData.cs
@@ -348,6 +348,11 @@ namespace TUGraz.VectoCore.InputData.FileIO.JSON
 			get { return Body.GetEx<double>(JsonKeys.Gearbox_StartTorqueReserve) / 100.0; }
 		}
 
+		ITorqueConverterDeclarationInputData IGearboxDeclarationInputData.TorqueConverter
+		{
+			get { return TorqueConverter; }
+		}
+
 		public virtual ITorqueConverterEngineeringInputData TorqueConverter
 		{
 			get { return this; }
@@ -494,7 +499,10 @@ namespace TUGraz.VectoCore.InputData.FileIO.JSON
 			get { return "N/A"; }
 		}
 
-		public CertificationMethod CertificationMethod { get { return CertificationMethod.NotCertified; } }
+		public CertificationMethod CertificationMethod
+		{
+			get { return CertificationMethod.NotCertified; }
+		}
 
 		public string CertificationNumber
 		{
diff --git a/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/XMLDeclarationGearboxDataProvider.cs b/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/XMLDeclarationGearboxDataProvider.cs
index 5ed7d6a5dda28f0f25956c207aadf1f0d599dda9..a620842e1e2f73b09a44cc6f1cc83fa41ca57703 100644
--- a/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/XMLDeclarationGearboxDataProvider.cs
+++ b/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/XMLDeclarationGearboxDataProvider.cs
@@ -63,6 +63,13 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration
 			}
 		}
 
+		public ITorqueConverterDeclarationInputData TorqueConverter
+		{
+			get {
+				return new XMLDeclarationTorqueConverterDataProvider(InputData);
+			}
+		}
+
 		protected ITransmissionInputData ReadGear(string gearNr)
 		{
 			var retVal = new TransmissionInputData();
diff --git a/VectoCore/VectoCore/InputData/FileIO/XML/Engineering/XMLEngineeringGearboxDataProvider.cs b/VectoCore/VectoCore/InputData/FileIO/XML/Engineering/XMLEngineeringGearboxDataProvider.cs
index f0554c6be31fcc26661e97c25798220ff1755837..f756df129aa2ea700aac69fb50a135e83fdbc391 100644
--- a/VectoCore/VectoCore/InputData/FileIO/XML/Engineering/XMLEngineeringGearboxDataProvider.cs
+++ b/VectoCore/VectoCore/InputData/FileIO/XML/Engineering/XMLEngineeringGearboxDataProvider.cs
@@ -104,6 +104,12 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Engineering
 			get { return InputData.XMLEngineeringJobData.StartTorqueReserve; }
 		}
 
+
+		ITorqueConverterDeclarationInputData IGearboxDeclarationInputData.TorqueConverter
+		{
+			get { return TorqueConverter; }
+		}
+
 		public ITorqueConverterEngineeringInputData TorqueConverter
 		{
 			get
diff --git a/VectoCore/VectoCore/InputData/Reader/ComponentData/TorqueConverterDataReader.cs b/VectoCore/VectoCore/InputData/Reader/ComponentData/TorqueConverterDataReader.cs
index 136400b61ca88e633423c5b28311dd8021e67d34..b9c20ed06c1330ea9010f540a3d2f013ac69634a 100644
--- a/VectoCore/VectoCore/InputData/Reader/ComponentData/TorqueConverterDataReader.cs
+++ b/VectoCore/VectoCore/InputData/Reader/ComponentData/TorqueConverterDataReader.cs
@@ -60,8 +60,9 @@ namespace TUGraz.VectoCore.InputData.Reader.ComponentData
 		public static TorqueConverterData Create(DataTable data, PerSecond referenceRpm, PerSecond maxRpm, ExecutionMode mode,
 			double ratio, MeterPerSquareSecond lcMinAcceleration, MeterPerSquareSecond ccMinAcceleration)
 		{
-			if (data == null)
+			if (data == null) {
 				throw new VectoException("TorqueConverter Characteristics data is missing.");
+			}
 
 			if (data.Columns.Count != 3) {
 				throw new VectoException("TorqueConverter Characteristics data must consist of 3 columns");
@@ -74,30 +75,31 @@ namespace TUGraz.VectoCore.InputData.Reader.ComponentData
 			if (HeaderIsValid(data.Columns)) {
 				characteristicTorque = (from DataRow row in data.Rows
 					select
-					new TorqueConverterEntry() {
-						SpeedRatio = row.ParseDouble(Fields.SpeedRatio),
-						Torque = row.ParseDouble(Fields.CharacteristicTorque).SI<NewtonMeter>(),
-						TorqueRatio = row.ParseDouble(Fields.TorqueRatio)
-					}).ToArray();
+						new TorqueConverterEntry() {
+							SpeedRatio = row.ParseDouble(Fields.SpeedRatio),
+							Torque = row.ParseDouble(Fields.CharacteristicTorque).SI<NewtonMeter>(),
+							TorqueRatio = row.ParseDouble(Fields.TorqueRatio)
+						}).ToArray();
 			} else {
 				characteristicTorque = (from DataRow row in data.Rows
 					select
-					new TorqueConverterEntry() {
-						SpeedRatio = row.ParseDouble(0),
-						Torque = row.ParseDouble(2).SI<NewtonMeter>(),
-						TorqueRatio = row.ParseDouble(1)
-					}).ToArray();
+						new TorqueConverterEntry() {
+							SpeedRatio = row.ParseDouble(0),
+							Torque = row.ParseDouble(2).SI<NewtonMeter>(),
+							TorqueRatio = row.ParseDouble(1)
+						}).ToArray();
 			}
 			if (mode == ExecutionMode.Declaration) {
+				var tcDrag = DeclarationData.TorqueConverter.GetTorqueConverterDragCurve(ratio).Last();
 				characteristicTorque =
 					characteristicTorque.Where(x => x.SpeedRatio < ratio)
-						.Concat(DeclarationData.Gearbox.GetTorqueConverterDragCurve(ratio))
+						.Concat(DeclarationData.TorqueConverter.GetTorqueConverterDragCurve(ratio))
 						.ToArray();
 			} else {
 				if (!characteristicTorque.Any(x => x.SpeedRatio > ratio)) {
 					characteristicTorque =
 						characteristicTorque.Where(x => x.SpeedRatio < ratio)
-							.Concat(DeclarationData.Gearbox.GetTorqueConverterDragCurve(ratio))
+							.Concat(DeclarationData.TorqueConverter.GetTorqueConverterDragCurve(ratio))
 							.ToArray();
 				}
 			}
diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/AbstractSimulationDataAdapter.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/AbstractSimulationDataAdapter.cs
index 035586c46647f9d78cd25156af95c515a85239f7..4bd060470e0c18a4d2bb33434fca5171c0b6e0d9 100644
--- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/AbstractSimulationDataAdapter.cs
+++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/AbstractSimulationDataAdapter.cs
@@ -153,6 +153,41 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter
 			};
 		}
 
+		protected TransmissionLossMap CreateGearLossMap(ITransmissionInputData gear, uint i, bool useEfficiencyFallback, bool extendLossMap)
+		{
+			if (gear.LossMap != null) {
+				return TransmissionLossMapReader.Create(gear.LossMap, gear.Ratio, string.Format("Gear {0}", i + 1), extendLossMap);
+			}
+			if (useEfficiencyFallback) {
+				return TransmissionLossMapReader.Create(gear.Efficiency, gear.Ratio, string.Format("Gear {0}", i + 1));
+			}
+			throw new InvalidFileFormatException("Gear {0} LossMap missing.", i + 1);
+		}
+
+		protected static void CreateTCSecondGearATSerial(IGearboxDeclarationInputData gearbox, GearData gearData,
+			ShiftPolygon shiftPolygon)
+		{
+			gearData.TorqueConverterRatio = gearData.Ratio;
+			gearData.TorqueConverterGearLossMap = gearData.LossMap;
+			gearData.TorqueConverterShiftPolygon = shiftPolygon;
+		}
+
+		protected static void CreateTCFirstGearATSerial(IGearboxDeclarationInputData gearbox, GearData gearData,
+			ShiftPolygon shiftPolygon)
+		{
+			gearData.TorqueConverterRatio = gearData.Ratio;
+			gearData.TorqueConverterGearLossMap = gearData.LossMap;
+			gearData.TorqueConverterShiftPolygon = shiftPolygon;
+		}
+
+		protected static void CretateTCFirstGearATPowerSplit(IGearboxDeclarationInputData gearbox, GearData gearData, uint i,
+			ShiftPolygon shiftPolygon)
+		{
+			gearData.TorqueConverterRatio = 1;
+			gearData.TorqueConverterGearLossMap = TransmissionLossMapReader.Create(1, 1, string.Format("TCGear {0}", i + 1));
+			gearData.TorqueConverterShiftPolygon = shiftPolygon;
+		}
+
 		public AxleGearData CreateAxleGearData(IAxleGearInputData data, bool useEfficiencyFallback)
 		{
 			var retVal = SetCommonAxleGearData(data);
diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapter.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapter.cs
index b0eae3f194b31f4bdd94ee3ed9032736bc51ea61..d89d57385921b2dad75aac7040118b97083b2b2b 100644
--- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapter.cs
+++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapter.cs
@@ -217,61 +217,86 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter
 				WarnDeclarationMode("GearboxData");
 			}
 			var retVal = SetCommonGearboxData(gearbox);
-			switch (retVal.Type) {
+			switch (gearbox.Type) {
+				case GearboxType.DrivingCycle:
 				case GearboxType.ATPowerSplit:
-				case GearboxType.ATSerial:
 					throw new VectoSimulationException(
-						"Automatic Transmission currently not supported in DeclarationMode!");
+						"Unsupported gearbox type: {0}!", retVal.Type);
 				//case GearboxType.Custom:
 				//	throw new VectoSimulationException("Custom Transmission not supported in DeclarationMode!");
 			}
-			var gears = gearbox.Gears;
-			if (gears.Count < 1) {
+			var gearsInput = gearbox.Gears;
+			if (gearsInput.Count < 1) {
 				throw new VectoSimulationException(
 					"At least one Gear-Entry must be defined in Gearbox!");
 			}
 
-			retVal.Inertia = DeclarationData.Gearbox.Inertia;
-			retVal.TractionInterruption = retVal.Type.TractionInterruption();
+			SetDeclarationData(retVal);
 
-			retVal.TorqueReserve = DeclarationData.Gearbox.TorqueReserve;
-			retVal.StartTorqueReserve = DeclarationData.Gearbox.TorqueReserveStart;
-			retVal.ShiftTime = DeclarationData.Gearbox.MinTimeBetweenGearshifts;
-			retVal.StartSpeed = DeclarationData.Gearbox.StartSpeed;
-			retVal.StartAcceleration = DeclarationData.Gearbox.StartAcceleration;
+			var gearDifferenceRatio = gearbox.Type.AutomaticTransmission() && gearbox.Gears.Count > 2
+				? gearbox.Gears[0].Ratio / gearbox.Gears[1].Ratio
+				: 1.0;
 
-			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));
+			var gears = new Dictionary<uint, GearData>();
+			var tcShiftPolygon = DeclarationData.TorqueConverter.ComputeShiftPolygon(engine.FullLoadCurves[0]);
+			for (uint i = 0; i < gearsInput.Count; i++) {
+				var gear = gearsInput[(int)i];
+				var lossMap = CreateGearLossMap(gear, i, useEfficiencyFallback, true);
+
+				var shiftPolygon = DeclarationData.Gearbox.ComputeShiftPolygon(gearbox.Type, (int)i, engine.FullLoadCurves[i+1], gearsInput, engine,
+					axlegearRatio, dynamicTyreRadius);
+
+				var gearData = new GearData {
+					ShiftPolygon = shiftPolygon,
+					MaxSpeed = gear.MaxInputSpeed,
+					Ratio = gear.Ratio,
+					LossMap = lossMap,
+				};
+
+				if (gearbox.Type == GearboxType.ATPowerSplit && i == 0) {
+					// powersplit transmission: torque converter already contains ratio and losses
+					CretateTCFirstGearATPowerSplit(gearbox, gearData, i, tcShiftPolygon);
+				}
+				if (gearbox.Type == GearboxType.ATSerial) {
+					if (i == 0) {
+						// torqueconverter is active in first gear - duplicate ratio and lossmap for torque converter mode
+						CreateTCFirstGearATSerial(gearbox, gearData, tcShiftPolygon);
 					}
-					gearLossMap = TransmissionLossMapReader.Create(gear.LossMap, gear.Ratio, string.Format("Gear {0}", i + 1), true);
-				} catch (InvalidFileFormatException) {
-					if (useEfficiencyFallback) {
-						gearLossMap = TransmissionLossMapReader.Create(gear.Efficiency, gear.Ratio, string.Format("Gear {0}", i + 1));
-					} else {
-						throw;
+					if (i == 1 && gearDifferenceRatio >= DeclarationData.Gearbox.TorqueConverterSecondGearThreshold) {
+						// ratio between first and second gear is above threshold, torqueconverter is active in second gear as well
+						// -> duplicate ratio and lossmap for torque converter mode, remove locked transmission for previous gear
+						CreateTCSecondGearATSerial(gearbox, gearData, tcShiftPolygon);
+						// NOTE: the lower gear in 'gears' dictionary has index i !!
+						gears[i].Ratio = double.NaN;
+						gears[i].LossMap = null;
 					}
 				}
+				gears.Add(i + 1, gearData);
+			}
+			retVal.Gears = gears;
+			if (retVal.Type.AutomaticTransmission()) {
+				var ratio = double.IsNaN(retVal.Gears[1].Ratio) ? 1 : retVal.Gears[1].TorqueConverterRatio / retVal.Gears[1].Ratio;
+				retVal.PowershiftShiftTime = DeclarationData.Gearbox.PowershiftShiftTime;
+				retVal.TorqueConverterData = TorqueConverterDataReader.Create(gearbox.TorqueConverter.TCData,
+					DeclarationData.TorqueConverter.ReferenceRPM, DeclarationData.TorqueConverter.MaxInputSpeed, ExecutionMode.Declaration, ratio,
+					DeclarationData.TorqueConverter.CLUpshiftMinAcceleration, DeclarationData.TorqueConverter.CCUpshiftMinAcceleration);
+			}
 
-				var shiftPolygon = DeclarationData.Gearbox.ComputeShiftPolygon(i, engine.FullLoadCurves[gearNbr], gears, engine,
-					axlegearRatio, dynamicTyreRadius);
-
-				return new KeyValuePair<uint, GearData>(gearNbr,
-					new GearData {
-						LossMap = gearLossMap,
-						ShiftPolygon = shiftPolygon,
-						MaxSpeed = gear.MaxInputSpeed,
-						Ratio = gear.Ratio,
-					});
-			}).ToDictionary(kv => kv.Key, kv => kv.Value);
+			return retVal;
+		}
 
+		private static void SetDeclarationData(GearboxData retVal)
+		{
+			retVal.Inertia = DeclarationData.Gearbox.Inertia;
+			retVal.TractionInterruption = retVal.Type.TractionInterruption();
+			retVal.TorqueReserve = DeclarationData.Gearbox.TorqueReserve;
+			retVal.StartTorqueReserve = DeclarationData.Gearbox.TorqueReserveStart;
+			retVal.ShiftTime = DeclarationData.Gearbox.MinTimeBetweenGearshifts;
+			retVal.StartSpeed = DeclarationData.Gearbox.StartSpeed;
+			retVal.StartAcceleration = DeclarationData.Gearbox.StartAcceleration;
 			retVal.DownshiftAfterUpshiftDelay = DeclarationData.Gearbox.DownshiftAfterUpshiftDelay;
 			retVal.UpshiftAfterDownshiftDelay = DeclarationData.Gearbox.UpshiftAfterDownshiftDelay;
 			retVal.UpshiftMinAcceleration = DeclarationData.Gearbox.UpshiftMinAcceleration;
-			return retVal;
 		}
 
 		public IList<VectoRunData.AuxData> CreateAuxiliaryData(IAuxiliariesDeclarationInputData auxInputData,
diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/EngineeringDataAdapter.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/EngineeringDataAdapter.cs
index c5c5727ba905e0148f7b86f14987e925395c7f74..8a0aceacc4728a9d68a0b15079a5e1093ef21cdf 100644
--- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/EngineeringDataAdapter.cs
+++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/EngineeringDataAdapter.cs
@@ -172,40 +172,28 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter
 				throw new VectoSimulationException("At least two Gear-Entries must be defined in Gearbox!");
 			}
 
-			retVal.Inertia = gearbox.Type.ManualTransmission() ? gearbox.Inertia : 0.SI<KilogramSquareMeter>();
-			retVal.TractionInterruption = gearbox.TractionInterruption;
-			retVal.TorqueReserve = gearbox.TorqueReserve;
-			retVal.StartTorqueReserve = gearbox.StartTorqueReserve;
-			retVal.ShiftTime = gearbox.MinTimeBetweenGearshift;
-			retVal.StartSpeed = gearbox.StartSpeed;
-			retVal.StartAcceleration = gearbox.StartAcceleration;
+			SetEngineeringData(gearbox, retVal);
 
 			var gearDifferenceRatio = gearbox.Type.AutomaticTransmission() && gearbox.Gears.Count > 2
 				? gearbox.Gears[0].Ratio / gearbox.Gears[1].Ratio
 				: 1.0;
 
 			var gears = new Dictionary<uint, GearData>();
-
+			ShiftPolygon tcShiftPolygon = null;
+			if (gearbox.Type.AutomaticTransmission()) {
+				tcShiftPolygon = gearbox.TorqueConverter.ShiftPolygon != null
+					? ShiftPolygonReader.Create(gearbox.TorqueConverter.ShiftPolygon)
+					: DeclarationData.TorqueConverter.ComputeShiftPolygon(engineData.FullLoadCurves[0]);
+			}
 			for (uint i = 0; i < gearbox.Gears.Count; i++) {
 				var gear = gearbox.Gears[(int)i];
-				TransmissionLossMap lossMap;
-				if (gear.LossMap != null) {
-					lossMap = TransmissionLossMapReader.Create(gear.LossMap, gear.Ratio, string.Format("Gear {0}", i + 1));
-				} else if (useEfficiencyFallback) {
-					lossMap = TransmissionLossMapReader.Create(gear.Efficiency, gear.Ratio, string.Format("Gear {0}", i + 1));
-				} else {
-					throw new InvalidFileFormatException("Gear {0} LossMap or Efficiency missing.", i + 1);
-				}
+				var lossMap = CreateGearLossMap(gear, i, useEfficiencyFallback, false);
 
-				//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, engineData.FullLoadCurves[i + 1], gearbox.Gears, engineData,
-						axlegearRatio,
-						dynamicTyreRadius);
+					: DeclarationData.Gearbox.ComputeShiftPolygon(gearbox.Type, (int)i, engineData.FullLoadCurves[i + 1], gearbox.Gears,
+						engineData,
+						axlegearRatio, dynamicTyreRadius);
 				var gearData = new GearData {
 					ShiftPolygon = shiftPolygon,
 					MaxSpeed = gear.MaxInputSpeed,
@@ -213,33 +201,19 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter
 					LossMap = lossMap,
 				};
 
-				if (gearbox.Type == GearboxType.ATPowerSplit) {
-					if (i == 0) {
-						// powersplit transmission: torque converter already contains ratio and losses
-						gearData.TorqueConverterRatio = 1;
-						gearData.TorqueConverterGearLossMap = TransmissionLossMapReader.Create(1, 1, string.Format("TCGear {0}", i + 1));
-						gearData.TorqueConverterShiftPolygon = gearbox.TorqueConverter.ShiftPolygon == null
-							? null
-							: ShiftPolygonReader.Create(gearbox.TorqueConverter.ShiftPolygon);
-					}
+				if (gearbox.Type == GearboxType.ATPowerSplit && i == 0) {
+					// powersplit transmission: torque converter already contains ratio and losses
+					CretateTCFirstGearATPowerSplit(gearbox, gearData, i, tcShiftPolygon);
 				}
 				if (gearbox.Type == GearboxType.ATSerial) {
 					if (i == 0) {
 						// torqueconverter is active in first gear - duplicate ratio and lossmap for torque converter mode
-						gearData.TorqueConverterRatio = gearData.Ratio;
-						gearData.TorqueConverterGearLossMap = gearData.LossMap;
-						gearData.TorqueConverterShiftPolygon = gearbox.TorqueConverter.ShiftPolygon == null
-							? null
-							: ShiftPolygonReader.Create(gearbox.TorqueConverter.ShiftPolygon);
+						CreateTCFirstGearATSerial(gearbox, gearData, tcShiftPolygon);
 					}
 					if (i == 1 && gearDifferenceRatio >= DeclarationData.Gearbox.TorqueConverterSecondGearThreshold) {
 						// ratio between first and second gear is above threshold, torqueconverter is active in second gear as well
 						// -> duplicate ratio and lossmap for torque converter mode, remove locked transmission for previous gear
-						gearData.TorqueConverterRatio = gearData.Ratio;
-						gearData.TorqueConverterGearLossMap = gearData.LossMap;
-						gearData.TorqueConverterShiftPolygon = gearbox.TorqueConverter.ShiftPolygon == null
-							? null
-							: ShiftPolygonReader.Create(gearbox.TorqueConverter.ShiftPolygon);
+						CreateTCSecondGearATSerial(gearbox, gearData, tcShiftPolygon);
 						// NOTE: the lower gear in 'gears' dictionary has index i !!
 						gears[i].Ratio = double.NaN;
 						gears[i].LossMap = null;
@@ -249,30 +223,33 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter
 			}
 			retVal.Gears = gears;
 
-			if (retVal.Gears.Any(g => g.Value.HasTorqueConverter)) {
-				if (!retVal.Type.AutomaticTransmission()) {
-					throw new VectoException("Torque Converter can only be used with AT gearbox model");
-				}
+			if (retVal.Type.AutomaticTransmission()) {
 				var ratio = double.IsNaN(retVal.Gears[1].Ratio) ? 1 : retVal.Gears[1].TorqueConverterRatio / retVal.Gears[1].Ratio;
+				retVal.PowershiftShiftTime = gearbox.PowershiftShiftTime;
 				retVal.TorqueConverterData = TorqueConverterDataReader.Create(gearbox.TorqueConverter.TCData,
 					gearbox.TorqueConverter.ReferenceRPM, gearbox.TorqueConverter.MaxInputSpeed, ExecutionMode.Engineering, ratio,
 					gearbox.TorqueConverter.CLUpshiftMinAcceleration, gearbox.TorqueConverter.CCUpshiftMinAcceleration);
-			} else {
-				if (retVal.Type.AutomaticTransmission()) {
-					throw new VectoException("AT gearbox model requires torque converter");
-				}
 			}
 
-			if (retVal.Type.AutomaticTransmission()) {
-				retVal.PowershiftShiftTime = gearbox.PowershiftShiftTime;
-			}
 
+			return retVal;
+		}
+
+		private static void SetEngineeringData(IGearboxEngineeringInputData gearbox, GearboxData retVal)
+		{
+			retVal.Inertia = gearbox.Type.ManualTransmission() ? gearbox.Inertia : 0.SI<KilogramSquareMeter>();
+			retVal.TractionInterruption = gearbox.TractionInterruption;
+			retVal.TorqueReserve = gearbox.TorqueReserve;
+			retVal.StartTorqueReserve = gearbox.StartTorqueReserve;
+			retVal.ShiftTime = gearbox.MinTimeBetweenGearshift;
+			retVal.StartSpeed = gearbox.StartSpeed;
+			retVal.StartAcceleration = gearbox.StartAcceleration;
 			retVal.DownshiftAfterUpshiftDelay = gearbox.DownshiftAfterUpshiftDelay;
 			retVal.UpshiftAfterDownshiftDelay = gearbox.UpshiftAfterDownshiftDelay;
 			retVal.UpshiftMinAcceleration = gearbox.UpshiftMinAcceleration;
-			return retVal;
 		}
 
+
 		public IList<VectoRunData.AuxData> CreateAuxiliaryData(IAuxiliariesEngineeringInputData auxInputData)
 		{
 			var auxList = new List<VectoRunData.AuxData>(auxInputData.Auxiliaries.Count + 1) {
diff --git a/VectoCore/VectoCore/Models/Declaration/DeclarationData.cs b/VectoCore/VectoCore/Models/Declaration/DeclarationData.cs
index c9cd23536a493c489e5512ab4562302639c0a21e..5bc9dcdff9613d2640751f2ac46b16eaa83271a6 100644
--- a/VectoCore/VectoCore/Models/Declaration/DeclarationData.cs
+++ b/VectoCore/VectoCore/Models/Declaration/DeclarationData.cs
@@ -177,10 +177,12 @@ namespace TUGraz.VectoCore.Models.Declaration
 
 			//public static readonly PerSecond TorqueConverterSpeedLimit = 1600.RPMtoRad();
 			public static readonly double TorqueConverterSecondGearThreshold = 1.8;
+			public static readonly Second PowershiftShiftTime = 0.8.SI<Second>();
 
 			/// <summary>
 			/// computes the shift polygons for a single gear according to the whitebook 2016
 			/// </summary>
+			/// <param name="type"></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>
@@ -188,7 +190,15 @@ namespace TUGraz.VectoCore.Models.Declaration
 			/// <param name="axlegearRatio"></param>
 			/// <param name="dynamicTyreRadius"></param>
 			/// <returns></returns>
-			public static ShiftPolygon ComputeShiftPolygon(int gearIdx, EngineFullLoadCurve fullLoadCurve,
+			public static ShiftPolygon ComputeShiftPolygon(GearboxType type, int gearIdx, EngineFullLoadCurve fullLoadCurve,
+				IList<ITransmissionInputData> gears, CombustionEngineData engine, double axlegearRatio, Meter dynamicTyreRadius)
+			{
+				return type.AutomaticTransmission()
+					? TorqueConverter.ComputeShiftPolygon(fullLoadCurve) // That's the same for all gears, so call the same method...
+					: ComputeManualTransmissionShiftPolygon(gearIdx, fullLoadCurve, gears, engine, axlegearRatio, dynamicTyreRadius);
+			}
+
+			public static ShiftPolygon ComputeManualTransmissionShiftPolygon(int gearIdx, EngineFullLoadCurve fullLoadCurve,
 				IList<ITransmissionInputData> gears, CombustionEngineData engine, double axlegearRatio, Meter dynamicTyreRadius)
 			{
 				if (gears.Count < 2) {
@@ -209,8 +219,7 @@ namespace TUGraz.VectoCore.Models.Declaration
 				var p3 = new Point(nVHigh.Value() * 0.9,
 					fullLoadCurve.FullLoadStationaryTorque(nVHigh * 0.9).Value());
 
-				var p4 =
-					new Point((nVHigh * (1 + diffRatio / 3)).Value(), 0);
+				var p4 = new Point((nVHigh * (1 + diffRatio / 3)).Value(), 0);
 				var p5 = new Point(fullLoadCurve.N95hSpeed.Value(), fullLoadCurve.MaxTorque.Value());
 
 				var p6 = new Point(p2.X, VectoMath.Interpolate(p1, p3, p2.X));
@@ -247,7 +256,7 @@ namespace TUGraz.VectoCore.Models.Declaration
 				var p3pExt = new Point((1.1 * p5.Y - edgeP6pP3p.OffsetXY) / edgeP6pP3p.SlopeXY, 1.1 * p5.Y);
 				// ReSharper restore InconsistentNaming
 
-				upShift = IntersectShiftPolygon(new[] { p4, p7, p5 }.ToList(), new[] { p2p, p6p, p3pExt }.ToList())
+				upShift = IntersectShiftPolygon(new[] { p4, p7, p5 }, new[] { p2p, p6p, p3pExt })
 					.Select(point => new ShiftPolygon.ShiftPolygonEntry() {
 						AngularSpeed = point.X.SI<PerSecond>(),
 						Torque = point.Y.SI<NewtonMeter>()
@@ -284,12 +293,10 @@ namespace TUGraz.VectoCore.Models.Declaration
 			internal static IEnumerable<Point> ShiftPolygonFldMargin(List<FullLoadCurve.FullLoadCurveEntry> fullLoadCurve,
 				PerSecond rpmLimit)
 			{
-				return
-					fullLoadCurve.TakeWhile(fldEntry => fldEntry.EngineSpeed < rpmLimit)
-						.Select(
-							fldEntry =>
-								new Point(fldEntry.EngineSpeed.Value(), fldEntry.TorqueFullLoad.Value() * ShiftPolygonEngineFldMargin))
-						.ToList();
+				return fullLoadCurve.TakeWhile(fldEntry => fldEntry.EngineSpeed < rpmLimit)
+					.Select(fldEntry =>
+						new Point(fldEntry.EngineSpeed.Value(), fldEntry.TorqueFullLoad.Value() * ShiftPolygonEngineFldMargin))
+					.ToList();
 			}
 
 			// ReSharper disable once InconsistentNaming
@@ -300,7 +307,7 @@ namespace TUGraz.VectoCore.Models.Declaration
 				return engineSpeed;
 			}
 
-			internal static List<Point> IntersectShiftPolygon(List<Point> orig, List<Point> transformedDownshift)
+			internal static List<Point> IntersectShiftPolygon(Point[] orig, Point[] transformedDownshift)
 			{
 				var intersections = new List<Point>();
 				// compute all intersection points between both line segments
@@ -352,7 +359,7 @@ namespace TUGraz.VectoCore.Models.Declaration
 				return shiftPolygon.OrderBy(pt => pt.X).ThenBy(pt => pt.Y).ToList();
 			}
 
-			private static List<Point> ProjectPointsToLineSegments(List<Point> lineSegments, List<Point> points)
+			private static IEnumerable<Point> ProjectPointsToLineSegments(IEnumerable<Point> lineSegments, Point[] points)
 			{
 				var pointSet = new List<Point>();
 				foreach (var segment in lineSegments.Pairwise(Edge.Create)) {
@@ -365,6 +372,39 @@ namespace TUGraz.VectoCore.Models.Declaration
 				}
 				return pointSet;
 			}
+		}
+
+		public static class TorqueConverter
+		{
+			public static readonly PerSecond ReferenceRPM = 1000.RPMtoRad();
+			public static readonly PerSecond MaxInputSpeed = 5000.RPMtoRad();
+			public static readonly MeterPerSquareSecond CLUpshiftMinAcceleration = 0.1.SI<MeterPerSquareSecond>();
+			public static readonly MeterPerSquareSecond CCUpshiftMinAcceleration = 0.1.SI<MeterPerSquareSecond>();
+
+			private static PerSecond DownshiftPRM = 700.RPMtoRad();
+			private static PerSecond UpshiftLowRPM = 900.RPMtoRad();
+			private static PerSecond UpshiftHighRPM = 1150.RPMtoRad();
+
+			public static ShiftPolygon ComputeShiftPolygon(EngineFullLoadCurve fullLoadCurve)
+			{
+				var maxDragTorque = fullLoadCurve.MaxDragTorque * 1.1;
+				var maxTorque = fullLoadCurve.MaxTorque * 1.1;
+				var p0 = new Point(UpshiftLowRPM.Value(), maxDragTorque.Value());
+				var p1 = new Point(UpshiftLowRPM.Value(), 0);
+				var p2 = new Point(UpshiftHighRPM.Value(), fullLoadCurve.FullLoadStationaryTorque(UpshiftHighRPM).Value());
+				var edge = new Edge(p1, p2);
+				var p2corr = new Point((maxTorque.Value() - edge.OffsetXY) / edge.SlopeXY, maxTorque.Value());
+
+				return new ShiftPolygon(
+					new[] {
+						new ShiftPolygon.ShiftPolygonEntry() { AngularSpeed = DownshiftPRM, Torque = maxDragTorque },
+						new ShiftPolygon.ShiftPolygonEntry() { AngularSpeed = DownshiftPRM, Torque = maxTorque }
+					}.ToList(),
+					new[] { p0, p1, p2corr }.Select(
+						pt =>
+							new ShiftPolygon.ShiftPolygonEntry() { AngularSpeed = pt.X.SI<PerSecond>(), Torque = pt.Y.SI<NewtonMeter>() })
+						.ToList());
+			}
 
 			public static IEnumerable<TorqueConverterEntry> GetTorqueConverterDragCurve(double ratio)
 			{
diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Data/GearboxData.cs b/VectoCore/VectoCore/Models/SimulationComponent/Data/GearboxData.cs
index 580bdab56eb932786bc7c60c3befcfa5e92de9e7..1d33219f7beee704a921d036f88849c3556ee61e 100644
--- a/VectoCore/VectoCore/Models/SimulationComponent/Data/GearboxData.cs
+++ b/VectoCore/VectoCore/Models/SimulationComponent/Data/GearboxData.cs
@@ -109,6 +109,16 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data
 			var emsMission = GetEmsMode(validationContext);
 
 			var result = new List<ValidationResult>();
+
+			if (gearboxData.Gears.Any(g => g.Value.HasTorqueConverter)) {
+				if (!gearboxData.Type.AutomaticTransmission()) {
+					return new ValidationResult("Torque Converter can only be used with AT gearbox model");
+				}
+			} else {
+				if (gearboxData.Type.AutomaticTransmission()) {
+					return new ValidationResult("AT gearbox model requires torque converter");
+				}
+			}
 			if (gearboxData.Type.AutomaticTransmission()) {
 				gearboxData.TorqueConverterData.RequiredSpeedRatio =
 					Math.Round(gearboxData.Gears[1].TorqueConverterRatio / gearboxData.Gears[1].Ratio, 4) * 0.95;
diff --git a/VectoCore/VectoCore/Resources/XSD/VectoDeclarationDefinitions.1.0.xsd b/VectoCore/VectoCore/Resources/XSD/VectoDeclarationDefinitions.1.0.xsd
index 7478f0cfcdfad2d4f0e46bf156ac73edc35bc57a..9871aac1d6a1f527a3b3e8713fa7df721c29702d 100644
--- a/VectoCore/VectoCore/Resources/XSD/VectoDeclarationDefinitions.1.0.xsd
+++ b/VectoCore/VectoCore/Resources/XSD/VectoDeclarationDefinitions.1.0.xsd
@@ -1511,27 +1511,27 @@ INVALID: 1.2345, .1234, 01.23
 ToDo: -0.00
 			</xs:documentation>
 		</xs:annotation>
-		<xs:restriction base="xs:double">
+		<xs:restriction base="xs:decimal">
 			<xs:pattern value="[-]?([1-9][0-9]*|0)\.[0-9]{2}"/>
 		</xs:restriction>
 	</xs:simpleType>
 	<xs:simpleType name="Double3">
-		<xs:restriction base="xs:double">
+		<xs:restriction base="xs:decimal">
 			<xs:pattern value="[-]?([1-9][0-9]*|0)\.[0-9]{3}"/>
 		</xs:restriction>
 	</xs:simpleType>
 	<xs:simpleType name="Double4">
-		<xs:restriction base="xs:double">
+		<xs:restriction base="xs:decimal">
 			<xs:pattern value="[-]?([1-9][0-9]*|0)\.[0-9]{4}"/>
 		</xs:restriction>
 	</xs:simpleType>
 	<xs:simpleType name="Double5">
-		<xs:restriction base="xs:double">
+		<xs:restriction base="xs:decimal">
 			<xs:pattern value="[-]?([1-9][0-9]*|0)\.[0-9]{5}"/>
 		</xs:restriction>
 	</xs:simpleType>
 	<xs:simpleType name="Double6">
-		<xs:restriction base="xs:double">
+		<xs:restriction base="xs:decimal">
 			<xs:pattern value="[-]?([1-9][0-9]*|0)\.[0-9]{6}"/>
 		</xs:restriction>
 	</xs:simpleType>
diff --git a/VectoCore/VectoCoreTest/Models/Declaration/ShiftPolygonTest.cs b/VectoCore/VectoCoreTest/Models/Declaration/ShiftPolygonTest.cs
index fb3ae089a1bcb9088b1a67017bad810e88cc5984..450a3e386296b2554615100a5a7637b89d17800c 100644
--- a/VectoCore/VectoCoreTest/Models/Declaration/ShiftPolygonTest.cs
+++ b/VectoCore/VectoCoreTest/Models/Declaration/ShiftPolygonTest.cs
@@ -73,7 +73,7 @@ namespace TUGraz.VectoCore.Tests.Models.Declaration
 				new Point(20, 20),
 			};
 
-			var result = DeclarationData.Gearbox.IntersectShiftPolygon(upShift.ToList(), transformed.ToList());
+			var result = DeclarationData.Gearbox.IntersectShiftPolygon(upShift, transformed);
 
 			Assert.AreEqual(expected.Length, result.Count);
 
@@ -104,7 +104,7 @@ namespace TUGraz.VectoCore.Tests.Models.Declaration
 				new Point(20, 15.6),
 			};
 
-			var result = DeclarationData.Gearbox.IntersectShiftPolygon(upShift.ToList(), transformed.ToList());
+			var result = DeclarationData.Gearbox.IntersectShiftPolygon(upShift, transformed);
 
 			Assert.AreEqual(expected.Length, result.Count);
 
@@ -113,7 +113,7 @@ namespace TUGraz.VectoCore.Tests.Models.Declaration
 				Assert.AreEqual(tuple.Item1.Y, tuple.Item2.Y);
 			}
 
-			result = DeclarationData.Gearbox.IntersectShiftPolygon(transformed.ToList(), upShift.ToList());
+			result = DeclarationData.Gearbox.IntersectShiftPolygon(transformed, upShift);
 
 			Assert.AreEqual(expected.Length, result.Count);
 
@@ -145,7 +145,7 @@ namespace TUGraz.VectoCore.Tests.Models.Declaration
 				new Point(20, 20),
 			};
 
-			var result = DeclarationData.Gearbox.IntersectShiftPolygon(upShift.ToList(), transformed.ToList());
+			var result = DeclarationData.Gearbox.IntersectShiftPolygon(upShift, transformed);
 
 			Assert.AreEqual(expected.Length, result.Count);
 
@@ -154,7 +154,7 @@ namespace TUGraz.VectoCore.Tests.Models.Declaration
 				Assert.AreEqual(tuple.Item1.Y, tuple.Item2.Y);
 			}
 
-			result = DeclarationData.Gearbox.IntersectShiftPolygon(transformed.ToList(), upShift.ToList());
+			result = DeclarationData.Gearbox.IntersectShiftPolygon(transformed, upShift);
 
 			Assert.AreEqual(expected.Length, result.Count);
 
@@ -186,7 +186,7 @@ namespace TUGraz.VectoCore.Tests.Models.Declaration
 				new Point(20, 16.8),
 			};
 
-			var result = DeclarationData.Gearbox.IntersectShiftPolygon(upShift.ToList(), transformed.ToList());
+			var result = DeclarationData.Gearbox.IntersectShiftPolygon(upShift, transformed);
 
 			Assert.AreEqual(expected.Length, result.Count);
 
@@ -195,7 +195,7 @@ namespace TUGraz.VectoCore.Tests.Models.Declaration
 				Assert.AreEqual(tuple.Item1.Y, tuple.Item2.Y, 1e-3);
 			}
 
-			result = DeclarationData.Gearbox.IntersectShiftPolygon(transformed.ToList(), upShift.ToList());
+			result = DeclarationData.Gearbox.IntersectShiftPolygon(transformed, upShift);
 
 			Assert.AreEqual(expected.Length, result.Count);
 
@@ -348,7 +348,7 @@ namespace TUGraz.VectoCore.Tests.Models.Declaration
 
 			var shiftPolygons = new List<ShiftPolygon>();
 			for (var i = 0; i < gearboxData.Gears.Count; i++) {
-				shiftPolygons.Add(DeclarationData.Gearbox.ComputeShiftPolygon(i, engineData.FullLoadCurves[(uint)(i + 1)],
+				shiftPolygons.Add(DeclarationData.Gearbox.ComputeShiftPolygon(GearboxType.AMT, i, engineData.FullLoadCurves[(uint)(i + 1)],
 					gearboxData.Gears,
 					engineData, axlegearRatio, rdyn));
 			}
@@ -405,7 +405,7 @@ namespace TUGraz.VectoCore.Tests.Models.Declaration
 			var downshiftOrig = new List<List<Point>>();
 			var upshiftOrig = new List<List<Point>>();
 			for (var i = 0; i < gearboxData.Gears.Count; i++) {
-				shiftPolygons.Add(DeclarationData.Gearbox.ComputeShiftPolygon(i, fullLoadCurves[(uint)(i + 1)], gearboxData.Gears,
+				shiftPolygons.Add(DeclarationData.Gearbox.ComputeShiftPolygon(GearboxType.AMT,i, fullLoadCurves[(uint)(i + 1)], gearboxData.Gears,
 					engineData, axlegearRatio, rdyn));
 				List<Point> tmp1, tmp2, tmp3;
 
@@ -491,7 +491,7 @@ namespace TUGraz.VectoCore.Tests.Models.Declaration
 			var upshiftOrig = new List<List<Point>>();
 			for (var i = 0; i < gearboxData.Gears.Count; i++) {
 				shiftPolygons.Add(
-					DeclarationData.Gearbox.ComputeShiftPolygon(i, fullLoadCurves[(uint)(i + 1)], gearboxData.Gears,
+					DeclarationData.Gearbox.ComputeShiftPolygon(gearboxData.Type, i, fullLoadCurves[(uint)(i + 1)], gearboxData.Gears,
 						engineData, axlegearRatio, rdyn.SI<Meter>())
 					);
 				List<Point> tmp1, tmp2, tmp3;
diff --git a/VectoCore/VectoCoreTest/Models/SimulationComponentData/ValidationTest.cs b/VectoCore/VectoCoreTest/Models/SimulationComponentData/ValidationTest.cs
index b45c8b4acb582a0081302961c02e19ddb9a67255..b1f96980a878cacd8159fb39efdcb28c4d2d4236 100644
--- a/VectoCore/VectoCoreTest/Models/SimulationComponentData/ValidationTest.cs
+++ b/VectoCore/VectoCoreTest/Models/SimulationComponentData/ValidationTest.cs
@@ -627,6 +627,7 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponentData
 		public string DigestValue { get; set; }
 		public GearboxType Type { get; set; }
 		public IList<ITransmissionInputData> Gears { get; set; }
+		ITorqueConverterDeclarationInputData IGearboxDeclarationInputData.TorqueConverter { get { return TorqueConverter; }  }
 		public KilogramSquareMeter Inertia { get; set; }
 		public Second TractionInterruption { get; set; }
 		public Second MinTimeBetweenGearshift { get; set; }