diff --git a/VectoCore/VectoCoreTest/Models/Declaration/ShiftPolygonTest.cs b/VectoCore/VectoCoreTest/Models/Declaration/ShiftPolygonTest.cs
index f4c161688f994605634d4df5469362fc60578ca2..8665e626c28e1a996df5b816f18811e4068c759b 100644
--- a/VectoCore/VectoCoreTest/Models/Declaration/ShiftPolygonTest.cs
+++ b/VectoCore/VectoCoreTest/Models/Declaration/ShiftPolygonTest.cs
@@ -6,6 +6,7 @@ using System.IO;
 using System.Linq;
 using Microsoft.VisualStudio.TestTools.UnitTesting;
 using NUnit.Framework;
+using TUGraz.VectoCommon.InputData;
 using TUGraz.VectoCommon.Utils;
 using TUGraz.VectoCore.InputData.FileIO.JSON;
 using TUGraz.VectoCore.InputData.Reader.DataObjectAdaper;
@@ -295,21 +296,21 @@ namespace TUGraz.VectoCore.Tests.Models.Declaration
 				// Gear 1
 				new[] {
 					new Point(136.9338946, -352),
-					new Point(136.9338946, 1492.7289),
-					new Point(203.9530637, 2530),
+					new Point(136.9338946, 1281.30911),
+					new Point(201.7326, 2427.6748),
 				},
 				// Gear 2
 				new[] {
 					new Point(136.9338946, -352),
-					new Point(136.9338946, 1518.81917),
-					new Point(201.3375424, 2530),
+					new Point(136.9338946, 1281.30911),
+					new Point(203.9530, 2466.9558),
 				},
 				// Gear 3
 				new[] {
 					new Point(136.9338946, -352),
-					new Point(136.9338946, 1538.9278),
-					new Point(153.606666, 1893.19273),
-					new Point(192.102071, 2530),
+					new Point(136.9338946, 1281.30911),
+					//new Point(153.606666, 1893.19273),
+					new Point(201.3375, 2420.6842),
 				},
 			};
 
@@ -340,28 +341,41 @@ namespace TUGraz.VectoCore.Tests.Models.Declaration
 		}
 
 
-		//[TestMethod]
-		//public void CompueShiftPolygonDeclarationTestConfidentialEngine()
-		//{
-		//	var engineFldFile = @"E:\QUAM\Downloads\EngineFLD\Map_375c_BB1390_modTUG_R49_375c_BB1386.vfld";
-		//	var gearboxFile = @"TestData\Components\40t_Long_Haul_Truck.vgbx";
+		[TestMethod]
+		public void CompueShiftPolygonDeclarationTestConfidentialEngine()
+		{
+			var engineFldFile = @"E:\QUAM\Downloads\EngineFLD\Map_375c_BB1390_modTUG_R49_375c_BB1386.vfld";
+			var gearboxFile = @"TestData\Components\40t_Long_Haul_Truck.vgbx";
+
+			var rdyn = 0.4882675.SI<Meter>();
+			var axlegearRatio = 2.59;
 
-		//	var rdyn = 0.4882675.SI<Meter>();
-		//	var axlegearRatio = 2.59;
+			var engineData = new CombustionEngineData() {
+				IdleSpeed = 509.RPMtoRad(),
+				FullLoadCurve = EngineFullLoadCurve.ReadFromFile(engineFldFile, true)
+			};
+			engineData.FullLoadCurve.EngineData = engineData;
 
-		//	var engineData = new CombustionEngineData() {
-		//		IdleSpeed = 509.RPMtoRad(),
-		//		FullLoadCurve = EngineFullLoadCurve.ReadFromFile(engineFldFile, true)
-		//	};
+			var gearboxData = new JSONGearboxDataV5(JSONInputDataFactory.ReadFile(gearboxFile), gearboxFile);
 
-		//	var gearboxData = new JSONGearboxDataV5(JSONInputDataFactory.ReadFile(gearboxFile), gearboxFile);
+			var shiftPolygons = new List<ShiftPolygon>();
+			var downshiftTransformed = 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, engineData.FullLoadCurve, gearboxData.Gears,
+					engineData, axlegearRatio, rdyn));
+				List<Point> tmp1, tmp2;
+				ShiftPolygonComparison.ComputShiftPolygonPoints(i, engineData.FullLoadCurve, gearboxData.Gears,
+					engineData, axlegearRatio, rdyn, out tmp1, out tmp2);
+				upshiftOrig.Add(tmp1);
+				downshiftTransformed.Add(tmp2);
+			}
 
-		//	var shiftPolygons = new List<ShiftPolygon>();
-		//	for (var i = 1; i <= gearboxData.Gears.Count; i++) {
-		//		shiftPolygons.Add(DeclarationData.Gearbox.ComputeShiftPolygon(i, engineData.FullLoadCurve, gearboxData.Gears,
-		//			engineData, axlegearRatio, rdyn));
-		//	}
-		//}
+			ShiftPolygonDrawer.DrawShiftPolygons(Path.GetDirectoryName(gearboxFile), engineData.FullLoadCurve, shiftPolygons,
+				"R49_375c_BB1386.png",
+				DeclarationData.Gearbox.TruckMaxAllowedSpeed / rdyn * axlegearRatio * gearboxData.Gears.Last().Ratio, upshiftOrig,
+				downshiftTransformed);
+		}
 	}
 
 	[TestFixture]
@@ -403,11 +417,18 @@ namespace TUGraz.VectoCore.Tests.Models.Declaration
 				Path.Combine(BasePath, gearboxFile));
 
 			var shiftPolygons = new List<ShiftPolygon>();
+			var downshiftTransformed = 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, engineData.FullLoadCurve, gearboxData.Gears,
 						engineData, axlegearRatio, rdyn.SI<Meter>())
 					);
+				List<Point> tmp1, tmp2;
+				ComputShiftPolygonPoints(i, engineData.FullLoadCurve, gearboxData.Gears,
+					engineData, axlegearRatio, rdyn.SI<Meter>(), out tmp1, out tmp2);
+				upshiftOrig.Add(tmp1);
+				downshiftTransformed.Add(tmp2);
 			}
 
 			var imageFile = Path.GetDirectoryName(gearboxFile) + "_" + Path.GetFileNameWithoutExtension(gearboxFile) + "_" +
@@ -415,7 +436,56 @@ namespace TUGraz.VectoCore.Tests.Models.Declaration
 							".png";
 			ShiftPolygonDrawer.DrawShiftPolygons(Path.GetDirectoryName(gearboxFile), engineData.FullLoadCurve, shiftPolygons,
 				imageFile,
-				DeclarationData.Gearbox.TruckMaxAllowedSpeed / rdyn.SI<Meter>() * axlegearRatio * gearboxData.Gears.Last().Ratio);
+				DeclarationData.Gearbox.TruckMaxAllowedSpeed / rdyn.SI<Meter>() * axlegearRatio * gearboxData.Gears.Last().Ratio,
+				upshiftOrig, downshiftTransformed);
+		}
+
+
+		public static void ComputShiftPolygonPoints(int gear, FullLoadCurve fullLoadCurve,
+			IList<ITransmissionInputData> gears, CombustionEngineData engine, double axlegearRatio, Meter dynamicTyreRadius,
+			out List<Point> upshiftOrig, out List<Point> downshiftTransformed)
+		{
+			var engineSpeed85kmhLastGear = DeclarationData.Gearbox.TruckMaxAllowedSpeed / dynamicTyreRadius * axlegearRatio *
+											gears[gears.Count - 1].Ratio;
+			//var engineSpeed85kmhSecondToLastGear = ComputeEngineSpeed85kmh(gears[gears.Count - 2], axlegearRatio,
+			//	dynamicTyreRadius, engine);
+
+			var nVHigh = VectoMath.Min(engineSpeed85kmhLastGear, engine.FullLoadCurve.RatedSpeed);
+
+			var diffRatio = gears[gears.Count - 2].Ratio / gears[gears.Count - 1].Ratio - 1;
+
+			var maxDragTorque = engine.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());
+
+			var p4 =
+				new Point((nVHigh * (1 + diffRatio / 3)).Value(), 0);
+			var p5 = new Point(engine.FullLoadCurve.N95hSpeed.Value(), engine.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));
+
+			//var fldMargin = ShiftPolygonFldMargin(fullLoadCurve.FullLoadEntries, nVHigh * 0.95);
+			//var downshiftCorr = MoveDownshiftBelowFld(Edge.Create(p6, p3), fldMargin, 1.1 * fullLoadCurve.MaxTorque);
+			upshiftOrig = new[] { p4, p7, p5 }.ToList();
+			downshiftTransformed = new List<Point>();
+
+			if (gear >= gears.Count - 1) {
+				return;
+			}
+			var gearRatio = gears[gear].Ratio / gears[gear + 1].Ratio;
+			var rpmMarginFactor = 1 + DeclarationData.Gearbox.ShiftPolygonRPMMargin / 100.0;
+
+			var p2p = new Point(p2.X * gearRatio * rpmMarginFactor, p2.Y / gearRatio);
+			var p3p = new Point(p3.X * gearRatio * rpmMarginFactor, p3.Y / gearRatio);
+			var p6p = new Point(p6.X * gearRatio * rpmMarginFactor, p6.Y / gearRatio);
+			var edgeP6pP3p = new Edge(p6p, p3p);
+			var p3pExt = new Point((1.1 * p5.Y - edgeP6pP3p.OffsetXY) / edgeP6pP3p.SlopeXY, 1.1 * p5.Y);
+
+			downshiftTransformed = new[] { p2p, p6p, p3pExt }.ToList();
 		}
 	}
 }
\ No newline at end of file
diff --git a/VectoCore/VectoCoreTest/Utils/ShiftPolygonDrawer.cs b/VectoCore/VectoCoreTest/Utils/ShiftPolygonDrawer.cs
index 9905292d30558c6ae61db83f30de74d3f90c7a55..acf8d38e7c4653113ac662e759871815e1630d92 100644
--- a/VectoCore/VectoCoreTest/Utils/ShiftPolygonDrawer.cs
+++ b/VectoCore/VectoCoreTest/Utils/ShiftPolygonDrawer.cs
@@ -1,4 +1,5 @@
 using System;
+using System.Collections;
 using System.Collections.Generic;
 using System.Drawing;
 using System.Linq;
@@ -8,6 +9,7 @@ using TUGraz.VectoCommon.Utils;
 using TUGraz.VectoCore.Configuration;
 using TUGraz.VectoCore.Models.SimulationComponent.Data.Engine;
 using TUGraz.VectoCore.Models.SimulationComponent.Data.Gearbox;
+using Point = TUGraz.VectoCore.Utils.Point;
 
 namespace TUGraz.VectoCore.Tests.Utils
 {
@@ -17,10 +19,11 @@ namespace TUGraz.VectoCore.Tests.Utils
 		private static readonly Font AxisTitleFont = new Font("Verdana", 12);
 		private static readonly Font LegendFont = new Font("Verdana", 14);
 
-		private static Size _diagramSize = new Size(800, 800);
+		private static Size _diagramSize = new Size(1000, 800);
 
 		public static void DrawShiftPolygons(string title, EngineFullLoadCurve engineFld, List<ShiftPolygon> polygons,
-			string imageFileName, PerSecond speed85kmh)
+			string imageFileName, PerSecond speed85kmh, List<List<Point>> upshiftOrig = null,
+			List<List<Point>> downshiftTransformed = null)
 		{
 			var numRows = Math.Ceiling(polygons.Count / 4.0);
 			var numCols = Math.Ceiling(polygons.Count / numRows);
@@ -30,16 +33,28 @@ namespace TUGraz.VectoCore.Tests.Utils
 			};
 			var maxX = engineFld.FullLoadEntries.Last().EngineSpeed.Value() / Constants.RPMToRad * 1.1;
 
-			var i = 1;
+			var i = 0;
 			foreach (var shiftPolygon in polygons) {
 				var chartArea = AddChartArea(chart, "Gear " + (i + 1), "Engine Speed", "Torque", 0, maxX);
 
+				PlotPower(engineFld, chartArea, chart, "engine power " + i);
 				PlotFLD(engineFld, speed85kmh, chartArea, chart, "Engine Full Load " + i);
 
+				if (upshiftOrig != null && i < upshiftOrig.Count) {
+					PlotShiftLine("UpshiftOrig " + i, chartArea, chart, Color.Gray,
+						upshiftOrig[i].Select(pt => pt.X / Constants.RPMToRad).ToList(), upshiftOrig[i].Select(pt => pt.Y).ToList(), true);
+				}
+				if (downshiftTransformed != null && i < downshiftTransformed.Count) {
+					PlotShiftLine("DownTransformed " + i, chartArea, chart, Color.BlueViolet,
+						downshiftTransformed[i].Select(pt => pt.X / Constants.RPMToRad).ToList(),
+						downshiftTransformed[i].Select(pt => pt.Y).ToList(), true);
+				}
+
 				PlotShiftPolygon(i, shiftPolygon, chartArea, chart);
 
 				PositionChartArea(chartArea, 5, i, polygons.Count);
 
+
 				i++;
 			}
 
@@ -48,6 +63,34 @@ namespace TUGraz.VectoCore.Tests.Utils
 			chart.SaveImage(imageFileName, ChartImageFormat.Png);
 		}
 
+		private static void PlotPower(EngineFullLoadCurve engineFld, ChartArea chartArea, Chart chart, string name)
+		{
+			var series = new Series {
+				Name = name,
+				ChartType = SeriesChartType.Line,
+				Color = Color.DarkGoldenrod,
+				BorderWidth = 2,
+				//Legend = legend.Name,
+				IsVisibleInLegend = true,
+				ChartArea = chartArea.Name,
+				//YAxisType = AxisType.Secondary
+			};
+			series.BorderDashStyle = ChartDashStyle.Dash;
+			series.BorderWidth = 1;
+
+			var x = new List<double>();
+			var y = new List<double>();
+			for (var i = engineFld.FullLoadEntries.First().EngineSpeed;
+				i < engineFld.FullLoadEntries.Last().EngineSpeed;
+				i += 5.RPMtoRad()) {
+				x.Add(i.Value() / Constants.RPMToRad);
+				y.Add(engineFld.FullLoadStationaryPower(i).Value() / 1000);
+			}
+
+			chart.Series.Add(series);
+			chart.Series[series.Name].Points.DataBindXY(x, y);
+		}
+
 		private static void AddTitle(Chart chart, string titleText)
 		{
 			var title = new Title {
@@ -66,51 +109,54 @@ namespace TUGraz.VectoCore.Tests.Utils
 			chartArea.Position.Auto = false;
 			chartArea.Position.Width = (float)((100.0f) / numCols);
 			chartArea.Position.Height = (float)((100.0f - titleHeight) / numRows);
-			chartArea.Position.X = (float)(((i - 1) % numCols) * 100.0f / numCols);
-			chartArea.Position.Y = (float)(titleHeight + (int)((i - 1) / numCols) * (100 - titleHeight) / numRows);
+			chartArea.Position.X = (float)(((i) % numCols) * 100.0f / numCols);
+			chartArea.Position.Y = (float)(titleHeight + (int)((i) / numCols) * (100 - titleHeight) / numRows);
 		}
 
 		private static void PlotShiftPolygon(int gear, ShiftPolygon shiftPolygon, ChartArea chartArea, Chart chart)
 		{
-			var seriesDown = new Series {
-				Name = "DownShift " + gear,
-				ChartType = SeriesChartType.Line,
-				Color = Color.DarkRed,
-				BorderWidth = 2,
-				//Legend = legend.Name,
-				IsVisibleInLegend = true,
-				ChartArea = chartArea.Name,
-			};
-			chart.Series.Add(seriesDown);
 			var x = new List<double>();
 			var y = new List<double>();
 			foreach (var entry in shiftPolygon.Downshift) {
 				x.Add(entry.AngularSpeed.Value() / Constants.RPMToRad);
 				y.Add(entry.Torque.Value());
 			}
-			chart.Series[seriesDown.Name].Points.DataBindXY(x, y);
+			PlotShiftLine("DownShift " + gear, chartArea, chart, Color.DarkRed, x, y);
+
 
-			var seriesUp = new Series {
-				Name = "UpShift " + gear,
-				ChartType = SeriesChartType.Line,
-				Color = Color.DarkRed,
-				BorderWidth = 2,
-				//Legend = legend.Name,
-				IsVisibleInLegend = true,
-				ChartArea = chartArea.Name,
-			};
-			chart.Series.Add(seriesUp);
 			var xUp = new List<double>();
 			var yUp = new List<double>();
 			foreach (var entry in shiftPolygon.Upshift) {
 				xUp.Add(entry.AngularSpeed.Value() / Constants.RPMToRad);
 				yUp.Add(entry.Torque.Value());
 			}
-			chart.Series[seriesUp.Name].Points.DataBindXY(xUp, yUp);
+			PlotShiftLine("UpShift " + gear, chartArea, chart, Color.DarkRed, xUp, yUp);
+
 
 			//return series;
 		}
 
+		private static void PlotShiftLine(string name, ChartArea chartArea, Chart chart, Color color, List<double> x,
+			List<double> y, bool dashed = false)
+		{
+			var series = new Series {
+				Name = name,
+				ChartType = SeriesChartType.Line,
+				Color = color,
+				BorderWidth = 2,
+				//Legend = legend.Name,
+				IsVisibleInLegend = true,
+				ChartArea = chartArea.Name,
+			};
+			if (dashed) {
+				series.BorderDashStyle = ChartDashStyle.Dash;
+				series.BorderWidth = 1;
+			}
+
+			chart.Series.Add(series);
+			chart.Series[series.Name].Points.DataBindXY(x, y);
+		}
+
 		private static void PlotFLD(EngineFullLoadCurve engineFld, PerSecond speed85kmh, ChartArea chartArea, Chart chart,
 			string name)
 		{