diff --git a/VectoCore/VectoCore/Models/Declaration/DeclarationData.cs b/VectoCore/VectoCore/Models/Declaration/DeclarationData.cs
index 5bc9dcdff9613d2640751f2ac46b16eaa83271a6..6944fad5cf8b921816506a2f5e670bf9f0150fe4 100644
--- a/VectoCore/VectoCore/Models/Declaration/DeclarationData.cs
+++ b/VectoCore/VectoCore/Models/Declaration/DeclarationData.cs
@@ -194,7 +194,8 @@ namespace TUGraz.VectoCore.Models.Declaration
 				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...
+					? TorqueConverter.ComputeShiftPolygon(fullLoadCurve, gearIdx == 0, gearIdx >= gears.Count - 1)
+					// That's the same for all gears, so call the same method...
 					: ComputeManualTransmissionShiftPolygon(gearIdx, fullLoadCurve, gears, engine, axlegearRatio, dynamicTyreRadius);
 			}
 
@@ -385,7 +386,7 @@ namespace TUGraz.VectoCore.Models.Declaration
 			private static PerSecond UpshiftLowRPM = 900.RPMtoRad();
 			private static PerSecond UpshiftHighRPM = 1150.RPMtoRad();
 
-			public static ShiftPolygon ComputeShiftPolygon(EngineFullLoadCurve fullLoadCurve)
+			public static ShiftPolygon ComputeShiftPolygon(EngineFullLoadCurve fullLoadCurve, bool first = false, bool last = false)
 			{
 				var maxDragTorque = fullLoadCurve.MaxDragTorque * 1.1;
 				var maxTorque = fullLoadCurve.MaxTorque * 1.1;
@@ -395,15 +396,16 @@ namespace TUGraz.VectoCore.Models.Declaration
 				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());
+				var downshift = new[] {
+					new ShiftPolygon.ShiftPolygonEntry { AngularSpeed = DownshiftPRM, Torque = maxDragTorque },
+					new ShiftPolygon.ShiftPolygonEntry { AngularSpeed = DownshiftPRM, Torque = maxTorque }
+				};
+				var upshift = new[] { p0, p1, p2corr }.Select(
+					pt =>
+						new ShiftPolygon.ShiftPolygonEntry { AngularSpeed = pt.X.SI<PerSecond>(), Torque = pt.Y.SI<NewtonMeter>() });
+
+				return new ShiftPolygon(first ? new List<ShiftPolygon.ShiftPolygonEntry>() : downshift.ToList(),
+					last ? new List<ShiftPolygon.ShiftPolygonEntry>() : upshift.ToList());
 			}
 
 			public static IEnumerable<TorqueConverterEntry> GetTorqueConverterDragCurve(double ratio)
diff --git a/VectoCore/VectoCoreTest/Models/Declaration/ShiftPolygonTest.cs b/VectoCore/VectoCoreTest/Models/Declaration/ShiftPolygonTest.cs
index 450a3e386296b2554615100a5a7637b89d17800c..c2249114939f526752c2d284fa49f26c25363f3f 100644
--- a/VectoCore/VectoCoreTest/Models/Declaration/ShiftPolygonTest.cs
+++ b/VectoCore/VectoCoreTest/Models/Declaration/ShiftPolygonTest.cs
@@ -343,28 +343,81 @@ namespace TUGraz.VectoCore.Tests.Models.Declaration
 
 			var dao = new DeclarationDataAdapter();
 			var gearboxData = new JSONGearboxDataV5(JSONInputDataFactory.ReadFile(gearboxFile), gearboxFile);
-			var engineData = dao.CreateEngineData(new JSONEngineDataV3(JSONInputDataFactory.ReadFile(engineFile), engineFile), null,
+			var engineData = dao.CreateEngineData(new JSONEngineDataV3(JSONInputDataFactory.ReadFile(engineFile), engineFile),
+				null,
 				gearboxData, new List<ITorqueLimitInputData>());
 
 			var shiftPolygons = new List<ShiftPolygon>();
 			for (var i = 0; i < gearboxData.Gears.Count; i++) {
-				shiftPolygons.Add(DeclarationData.Gearbox.ComputeShiftPolygon(GearboxType.AMT, i, engineData.FullLoadCurves[(uint)(i + 1)],
+				shiftPolygons.Add(DeclarationData.Gearbox.ComputeShiftPolygon(GearboxType.AMT, i,
+					engineData.FullLoadCurves[(uint)(i + 1)],
 					gearboxData.Gears,
 					engineData, axlegearRatio, rdyn));
 			}
 
 			for (var i = 0; i < Math.Min(gearboxData.Gears.Count, expectedDownshift.Length); i++) {
 				foreach (var tuple in expectedDownshift[i].Zip(shiftPolygons[i].Downshift, Tuple.Create)) {
-					Assert.AreEqual(tuple.Item1.X, tuple.Item2.AngularSpeed.Value(), 1e-3, "gear: {0} entry: {1}", i, tuple);
+					Assert.AreEqual(tuple.Item1.X, tuple.Item2.AngularSpeed.Value(), 1e-3, "gear: {0} entry: {1}", i + 1, tuple);
 					Assert.AreEqual(tuple.Item1.Y, tuple.Item2.Torque.Value(), 1e-3, "gear: {0} entry: {1}", i + 1, tuple);
 				}
 
 				foreach (var tuple in expectedUpshift[i].Zip(shiftPolygons[i].Upshift, Tuple.Create)) {
-					Assert.AreEqual(tuple.Item1.X, tuple.Item2.AngularSpeed.Value(), 1e-3, "gear: {0} entry: {1}", i, tuple);
+					Assert.AreEqual(tuple.Item1.X, tuple.Item2.AngularSpeed.Value(), 1e-3, "gear: {0} entry: {1}", i + 1, tuple);
 					Assert.AreEqual(tuple.Item1.Y, tuple.Item2.Torque.Value(), 1e-3, "gear: {0} entry: {1}", i + 1, tuple);
 				}
 			}
 
+			Assert.AreEqual(0, shiftPolygons.First().Downshift.Count);
+			Assert.AreEqual(0, shiftPolygons.Last().Upshift.Count);
+		}
+
+
+		[TestCase]
+		public void CompueShiftPolygonATDeclarationTest()
+		{
+			var engineFile = @"TestData\Components\40t_Long_Haul_Truck.veng";
+			var gearboxFile = @"TestData\Components\40t_Long_Haul_Truck.vgbx";
+
+			var rdyn = 0.4882675.SI<Meter>();
+			var axlegearRatio = 2.59;
+
+			var expectedDownshift = new[] {
+				new Point(73.3038, -352),
+				new Point(73.3038, 2530),
+			};
+			var expectedUpshift = new[] {
+				new Point(94.2478, -352),
+				new Point(94.2478, 0),
+				new Point(123.0457, 2530),
+			};
+
+			var dao = new DeclarationDataAdapter();
+			var gearboxData = new JSONGearboxDataV5(JSONInputDataFactory.ReadFile(gearboxFile), gearboxFile);
+			var engineData = dao.CreateEngineData(new JSONEngineDataV3(JSONInputDataFactory.ReadFile(engineFile), engineFile),
+				null,
+				gearboxData, new List<ITorqueLimitInputData>());
+
+			var shiftPolygons = new List<ShiftPolygon>();
+			for (var i = 0; i < gearboxData.Gears.Count; i++) {
+				shiftPolygons.Add(DeclarationData.Gearbox.ComputeShiftPolygon(GearboxType.ATSerial, i,
+					engineData.FullLoadCurves[(uint)(i + 1)],
+					gearboxData.Gears,
+					engineData, axlegearRatio, rdyn));
+			}
+
+			for (var i = 0; i < gearboxData.Gears.Count; i++) {
+				foreach (var tuple in expectedDownshift.Zip(shiftPolygons[i].Downshift, Tuple.Create)) {
+					Assert.AreEqual(tuple.Item1.X, tuple.Item2.AngularSpeed.Value(), 1e-3, "gear: {0} entry: {1}", i + 1, tuple);
+					Assert.AreEqual(tuple.Item1.Y, tuple.Item2.Torque.Value(), 1e-3, "gear: {0} entry: {1}", i + 1, tuple);
+				}
+
+				foreach (var tuple in expectedUpshift.Zip(shiftPolygons[i].Upshift, Tuple.Create)) {
+					Assert.AreEqual(tuple.Item1.X, tuple.Item2.AngularSpeed.Value(), 1e-3, "gear: {0} entry: {1}", i + 1, tuple);
+					Assert.AreEqual(tuple.Item1.Y, tuple.Item2.Torque.Value(), 1e-3, "gear: {0} entry: {1}", i + 1, tuple);
+				}
+			}
+
+			Assert.AreEqual(0, shiftPolygons.First().Downshift.Count);
 			Assert.AreEqual(0, shiftPolygons.Last().Upshift.Count);
 		}
 
@@ -405,7 +458,8 @@ 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(GearboxType.AMT,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;