diff --git a/VectoCore/VectoCoreTest/Models/Declaration/ShiftPolygonTest.cs b/VectoCore/VectoCoreTest/Models/Declaration/ShiftPolygonTest.cs
index 1686fe09d4467ae9610160df0941d4196950dcce..90551dc1bfec8b938895417f5447402afb90dc50 100644
--- a/VectoCore/VectoCoreTest/Models/Declaration/ShiftPolygonTest.cs
+++ b/VectoCore/VectoCoreTest/Models/Declaration/ShiftPolygonTest.cs
@@ -74,9 +74,9 @@ namespace TUGraz.VectoCore.Tests.Models.Declaration
 				new Point(20, 20),
 			};
 
-			var result = DeclarationData.Gearbox.IntersectShiftPolygon(upShift, transformed);
+			var result = DeclarationData.Gearbox.IntersectTakeHigherShiftLine(upShift, transformed);
 
-			Assert.AreEqual(expected.Length, result.Count);
+			Assert.AreEqual(expected.Length, result.Length);
 
 			foreach (var tuple in expected.Zip(result, Tuple.Create)) {
 				Assert.AreEqual(tuple.Item1.X, tuple.Item2.X);
@@ -105,18 +105,18 @@ namespace TUGraz.VectoCore.Tests.Models.Declaration
 				new Point(20, 15.6),
 			};
 
-			var result = DeclarationData.Gearbox.IntersectShiftPolygon(upShift, transformed);
+			var result = DeclarationData.Gearbox.IntersectTakeHigherShiftLine(upShift, transformed);
 
-			Assert.AreEqual(expected.Length, result.Count);
+			Assert.AreEqual(expected.Length, result.Length);
 
 			foreach (var tuple in expected.Zip(result, Tuple.Create)) {
 				Assert.AreEqual(tuple.Item1.X, tuple.Item2.X);
 				Assert.AreEqual(tuple.Item1.Y, tuple.Item2.Y);
 			}
 
-			result = DeclarationData.Gearbox.IntersectShiftPolygon(transformed, upShift);
+			result = DeclarationData.Gearbox.IntersectTakeHigherShiftLine(transformed, upShift);
 
-			Assert.AreEqual(expected.Length, result.Count);
+			Assert.AreEqual(expected.Length, result.Length);
 
 			foreach (var tuple in expected.Zip(result, Tuple.Create)) {
 				Assert.AreEqual(tuple.Item1.X, tuple.Item2.X);
@@ -146,18 +146,18 @@ namespace TUGraz.VectoCore.Tests.Models.Declaration
 				new Point(20, 20),
 			};
 
-			var result = DeclarationData.Gearbox.IntersectShiftPolygon(upShift, transformed);
+			var result = DeclarationData.Gearbox.IntersectTakeHigherShiftLine(upShift, transformed);
 
-			Assert.AreEqual(expected.Length, result.Count);
+			Assert.AreEqual(expected.Length, result.Length);
 
 			foreach (var tuple in expected.Zip(result, Tuple.Create)) {
 				Assert.AreEqual(tuple.Item1.X, tuple.Item2.X);
 				Assert.AreEqual(tuple.Item1.Y, tuple.Item2.Y);
 			}
 
-			result = DeclarationData.Gearbox.IntersectShiftPolygon(transformed, upShift);
+			result = DeclarationData.Gearbox.IntersectTakeHigherShiftLine(transformed, upShift);
 
-			Assert.AreEqual(expected.Length, result.Count);
+			Assert.AreEqual(expected.Length, result.Length);
 
 			foreach (var tuple in expected.Zip(result, Tuple.Create)) {
 				Assert.AreEqual(tuple.Item1.X, tuple.Item2.X);
@@ -187,18 +187,108 @@ namespace TUGraz.VectoCore.Tests.Models.Declaration
 				new Point(20, 16.8),
 			};
 
-			var result = DeclarationData.Gearbox.IntersectShiftPolygon(upShift, transformed);
+			var result = DeclarationData.Gearbox.IntersectTakeHigherShiftLine(upShift, transformed);
 
-			Assert.AreEqual(expected.Length, result.Count);
+			Assert.AreEqual(expected.Length, result.Length);
 
 			foreach (var tuple in expected.Zip(result, Tuple.Create)) {
 				Assert.AreEqual(tuple.Item1.X, tuple.Item2.X, 1e-3);
 				Assert.AreEqual(tuple.Item1.Y, tuple.Item2.Y, 1e-3);
 			}
 
-			result = DeclarationData.Gearbox.IntersectShiftPolygon(transformed, upShift);
+			result = DeclarationData.Gearbox.IntersectTakeHigherShiftLine(transformed, upShift);
 
-			Assert.AreEqual(expected.Length, result.Count);
+			Assert.AreEqual(expected.Length, result.Length);
+
+			foreach (var tuple in expected.Zip(result, Tuple.Create)) {
+				Assert.AreEqual(tuple.Item1.X, tuple.Item2.X, 1e-3);
+				Assert.AreEqual(tuple.Item1.Y, tuple.Item2.Y, 1e-3);
+			}
+		}
+
+		[TestCase]
+		public void LimitShiftlines1()
+		{
+			var upShift = new[] {
+				new Point(10, 0),
+				new Point(10, 10),
+				new Point(20, 20),
+			};
+
+			var limit = new[] {
+				new Point(8, 0),
+				new Point(8, 20)
+			};
+
+			var expected = new[] {
+				new Point(8, 0),
+				new Point(8, 20)
+			};
+
+			var result = DeclarationData.Gearbox.IntersectTakeLowerShiftLine(upShift, limit);
+
+			Assert.AreEqual(expected.Length, result.Length);
+
+			foreach (var tuple in expected.Zip(result, Tuple.Create)) {
+				Assert.AreEqual(tuple.Item1.X, tuple.Item2.X, 1e-3);
+				Assert.AreEqual(tuple.Item1.Y, tuple.Item2.Y, 1e-3);
+			}
+		}
+
+		[TestCase]
+		public void LimitShiftlines2()
+		{
+			var upShift = new[] {
+				new Point(10, 0),
+				new Point(10, 10),
+				new Point(20, 20),
+			};
+
+			var limit = new[] {
+				new Point(15, 0),
+				new Point(15, 20)
+			};
+
+			var expected = new[] {
+				new Point(10, 0),
+				new Point(10, 10),
+				new Point(15, 15),
+				new Point(15, 20),
+			};
+
+			var result = DeclarationData.Gearbox.IntersectTakeLowerShiftLine(upShift, limit);
+
+			Assert.AreEqual(expected.Length, result.Length);
+
+			foreach (var tuple in expected.Zip(result, Tuple.Create)) {
+				Assert.AreEqual(tuple.Item1.X, tuple.Item2.X, 1e-3);
+				Assert.AreEqual(tuple.Item1.Y, tuple.Item2.Y, 1e-3);
+			}
+		}
+
+		[TestCase]
+		public void LimitShiftlines3()
+		{
+			var upShift = new[] {
+				new Point(10, 0),
+				new Point(10, 10),
+				new Point(20, 20),
+			};
+
+			var limit = new[] {
+				new Point(25, 0),
+				new Point(25, 20)
+			};
+
+			var expected = new[] {
+				new Point(10, 0),
+				new Point(10, 10),
+				new Point(20, 20),
+			};
+
+			var result = DeclarationData.Gearbox.IntersectTakeLowerShiftLine(upShift, limit);
+
+			Assert.AreEqual(expected.Length, result.Length);
 
 			foreach (var tuple in expected.Zip(result, Tuple.Create)) {
 				Assert.AreEqual(tuple.Item1.X, tuple.Item2.X, 1e-3);
@@ -546,7 +636,7 @@ namespace TUGraz.VectoCore.Tests.Models.Declaration
 				shiftPolygons.Add(
 					DeclarationData.Gearbox.ComputeShiftPolygon(gearboxData.Type, i, fullLoadCurves[(uint)(i + 1)], gearboxData.Gears,
 						engineData, axlegearRatio, rdyn.SI<Meter>())
-				);
+					);
 				List<Point> tmp1, tmp2, tmp3;
 				ComputShiftPolygonPoints(i, fullLoadCurves[(uint)(i + 1)], gearboxData.Gears,
 					engineData, axlegearRatio, rdyn.SI<Meter>(), out tmp1, out tmp2, out tmp3);
@@ -669,7 +759,7 @@ namespace TUGraz.VectoCore.Tests.Models.Declaration
 			var segment = Tuple.Create(
 				new ShiftPolygon.ShiftPolygonEntry(550.SI<NewtonMeter>(), 685.RPMtoRad()),
 				new ShiftPolygon.ShiftPolygonEntry(1200.SI<NewtonMeter>(), 1080.RPMtoRad())
-			);
+				);
 
 			Assert.AreEqual(result, ShiftPolygon.IsLeftOf(speed.RPMtoRad(), torque.SI<NewtonMeter>(), segment));
 		}
diff --git a/VectoCore/VectoCoreTest/Models/SimulationComponent/GearboxShiftLossesTest.cs b/VectoCore/VectoCoreTest/Models/SimulationComponent/GearboxShiftLossesTest.cs
index 1998a142a4104387dc3f78e2564199f5c3727c0e..ba504b73891449e08b2ac9a8a79f6591e0b1f0f8 100644
--- a/VectoCore/VectoCoreTest/Models/SimulationComponent/GearboxShiftLossesTest.cs
+++ b/VectoCore/VectoCoreTest/Models/SimulationComponent/GearboxShiftLossesTest.cs
@@ -93,6 +93,7 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponent
 			var wheels = new Wheels(container, 0.5.SI<Meter>(), 9.5.SI<KilogramSquareMeter>());
 
 			var vehicle = new MockVehicle(container);
+			container.AbsTime = 100.SI<Second>();
 			var driver = new MockDriver(container);
 			vehicle.MyVehicleSpeed = 10.KMPHtoMeterPerSecond();
 			driver.DriverBehavior = DrivingBehavior.Driving;