diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapter.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapter.cs
index 71d4a9dae72ccc1f06223893c4544e0874e60ebc..1b9354f611e4619f0a63cfa0f799f249ce5e0452 100644
--- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapter.cs
+++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapter.cs
@@ -398,7 +398,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter
 			string crosswindCorrectionParameters, SquareMeter aerodynamicDragAera, Meter vehicleHeight)
 		{
 			const int startSpeed = 60;
-			const int maxSpeed = 130;
+			const int maxSpeed = 200;
 			const int speedStep = 5;
 
 			const int maxAlpha = 180;
diff --git a/VectoCore/VectoCore/Models/Declaration/DeclarationData.cs b/VectoCore/VectoCore/Models/Declaration/DeclarationData.cs
index cb06e513d75efd4d1d4d1247446fc9a605d56be5..e7ef87c095b62dea168c0ec2cfa7cd52ea64b25e 100644
--- a/VectoCore/VectoCore/Models/Declaration/DeclarationData.cs
+++ b/VectoCore/VectoCore/Models/Declaration/DeclarationData.cs
@@ -199,9 +199,9 @@ namespace TUGraz.VectoCore.Models.Declaration
 			public const double ShiftPolygonRPMMargin = 7; // %
 			private const double ShiftPolygonEngineFldMargin = 0.98;
 
-			public static readonly Second MinTimeBetweenGearshifts = 1.5.SI<Second>();
-			public static readonly Second DownshiftAfterUpshiftDelay = 10.SI<Second>();
-			public static readonly Second UpshiftAfterDownshiftDelay = 10.SI<Second>();
+			public static readonly Second MinTimeBetweenGearshifts = 2.SI<Second>();
+			public static readonly Second DownshiftAfterUpshiftDelay = 6.SI<Second>();
+			public static readonly Second UpshiftAfterDownshiftDelay = 6.SI<Second>();
 
 			public static readonly MeterPerSquareSecond UpshiftMinAcceleration = 0.1.SI<MeterPerSquareSecond>();
 
diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/AMTShiftStrategyV2.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/AMTShiftStrategyV2.cs
index b4e5e879f033b7f7aefd65652aac2118f38f1935..f5a08a14ee02cc301a68a5b4c6e6715d54cd3711 100644
--- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/AMTShiftStrategyV2.cs
+++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/AMTShiftStrategyV2.cs
@@ -32,6 +32,8 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 		protected MaxCardanTorqueLookup MaxCardanTorqueLookup;
 
 		protected DebugData DebugData = new DebugData();
+		private Dictionary<uint, GearRating> GearRatings = new Dictionary<uint, GearRating>();
+		private MeterPerSquareSecond accRsv;
 
 		public struct HistoryEntry
 		{
@@ -63,12 +65,27 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 			dataBus.AddPreprocessor(new EngineSpeedDriveOffPreprocessor(EngineSpeedAtDriveOff, data, TestContainer));
 
 			AverageAccelerationTorqueLookup = new AverageAccelerationTorqueLookup();
-			dataBus.AddPreprocessor(new AverageAccelerationTorquePreprocessor(AverageAccelerationTorqueLookup, data, GetEngineSpeedLimitHighMin()));
+			dataBus.AddPreprocessor(
+				new AverageAccelerationTorquePreprocessor(AverageAccelerationTorqueLookup, data, GetEngineSpeedLimitHighMin()));
 
 			MaxCardanTorqueLookup = new MaxCardanTorqueLookup();
 			dataBus.AddPreprocessor(new MaxCardanTorquePreprocessor(MaxCardanTorqueLookup, data, TestContainer));
 		}
 
+		private bool SpeedTooLowForEngine(uint gear, PerSecond outAngularSpeed)
+		{
+			return (outAngularSpeed * ModelData.Gears[gear].Ratio).IsSmaller(DataBus.EngineIdleSpeed);
+		}
+
+		private bool SpeedTooHighForEngine(uint gear, PerSecond outAngularSpeed)
+		{
+			return
+				(outAngularSpeed * ModelData.Gears[gear].Ratio).IsGreaterOrEqual(
+					VectoMath.Min(
+						ModelData.Gears[gear].MaxSpeed,
+						DataBus.EngineN95hSpeed));
+		}
+
 		#region Overrides of BaseShiftStrategy
 
 		public override bool ShiftRequired(
@@ -82,7 +99,29 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 
 			UpdateHistoryBuffer(absTime, dt, currentCardanPower, velocity);
 
-			// normal shift when all requirements are fullfilled ------------------
+			// no shift when vehicle stands
+			if (DataBus.VehicleStopped) {
+				return false;
+			}
+
+			// emergency shift to not stall the engine ------------------------
+			if (gear == 1 && SpeedTooLowForEngine(_nextGear, inAngularVelocity / ModelData.Gears[gear].Ratio)) {
+				return true;
+			}
+
+			_nextGear = gear;
+			while (_nextGear > 1 && SpeedTooLowForEngine(_nextGear, inAngularVelocity / ModelData.Gears[gear].Ratio)) {
+				_nextGear--;
+			}
+			while (_nextGear < ModelData.Gears.Count &&
+					SpeedTooHighForEngine(_nextGear, inAngularVelocity / ModelData.Gears[gear].Ratio)) {
+				_nextGear++;
+			}
+
+			if (_nextGear != gear) {
+				return true;
+			}
+
 			var minimumShiftTimePassed = (lastShiftTime + ModelData.ShiftTime).IsSmallerOrEqual(absTime);
 			if (!minimumShiftTimePassed) {
 				return false;
@@ -117,33 +156,46 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 			Second absTime, Second dt, NewtonMeter outTorque, PerSecond outAngularVelocity, NewtonMeter inTorque,
 			PerSecond inAngularVelocity, uint gear, Second lastShiftTime)
 		{
-			var lookAheadDistance = DataBus.VehicleSpeed * ShiftStrategyParameters.GearResidenceTime;
+			var lookAheadDistance = DataBus.VehicleSpeed * ModelData.TractionInterruption;//ShiftStrategyParameters.GearResidenceTime;
 			var roadGradient = DataBus.CycleLookAhead(lookAheadDistance).RoadGradient;
-			var minRating = new GearRating(GearRatingCase.D, double.MaxValue, 0.RPMtoRad());
+			var minRating = new GearRating(GearRatingCase.E, double.MaxValue, 0.RPMtoRad());
 			var selectedGear = gear;
 			var debugData = new DebugData();
-			for (var i = Math.Max(0, gear - ShiftStrategyParameters.AllowedGearRangeDown);
+
+			var currentVelocity = DataBus.VehicleSpeed;
+			var gradient = CalcGradientDuringGearshift(false, dt, currentVelocity);
+			var estimatedVelocityPostShift = VelocityDropData.Interpolate(currentVelocity, gradient);
+			var predictionVelocity = CalcPredictionVelocity(currentVelocity, estimatedVelocityPostShift);
+
+			accRsv = CalcAccelerationReserve(currentVelocity);
+
+			GearRatings.Clear();
+			for (var i = Math.Max(1, gear - ShiftStrategyParameters.AllowedGearRangeDown);
 				i <= Math.Min(ModelData.Gears.Count, gear + ShiftStrategyParameters.AllowedGearRangeUp);
 				i++) {
 				var nextGear = (uint)i;
 
 				var gradientBelowMaxGrad = roadGradient < MaxGradability.GradabilityLimitedTorque(nextGear);
-				var engineSpeedAboveMin = outAngularVelocity * ModelData.Gears[nextGear].Ratio > GetEngineSpeedLimitLow(false);
+				var engineSpeedAboveMin =
+					outAngularVelocity * ModelData.Gears[nextGear].Ratio > PowertrainConfig.EngineData.IdleSpeed;
 
 				var engineSpeedBelowMax = outAngularVelocity * ModelData.Gears[nextGear].Ratio <
 										PowertrainConfig.EngineData.FullLoadCurves[0].N95hSpeed;
-				if (nextGear > gear && !(gradientBelowMaxGrad && engineSpeedAboveMin && engineSpeedBelowMax)) {
+
+				if (!(gradientBelowMaxGrad && engineSpeedAboveMin && engineSpeedBelowMax)) {
 					debugData.Add(
 						string.Format(
 							"{0} - gear {1} exceeds speed limits / gradability {2}", absTime, nextGear,
 							outAngularVelocity * ModelData.Gears[nextGear].Ratio));
+					GearRatings[nextGear] = new GearRating(GearRatingCase.E, 0, null);
 					continue;
 				}
 
-				var rating = RatingGear(false, nextGear, dt);
+				var rating = RatingGear(false, nextGear, gear, gradient, predictionVelocity, estimatedVelocityPostShift, accRsv);
 				if (nextGear == gear) {
 					if (rating.RatingCase == GearRatingCase.A) {
-						rating = new GearRating(GearRatingCase.A, rating.Rating * ShiftStrategyParameters.RatingFactorCurrentGear, rating.MaxEngineSpeed);
+						rating = new GearRating(
+							GearRatingCase.A, rating.Rating * ShiftStrategyParameters.RatingFactorCurrentGear, rating.MaxEngineSpeed);
 					}
 				}
 				debugData.Add(string.Format("{0} - gear {1}: rating {2}", absTime, nextGear, rating));
@@ -151,7 +203,9 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 					minRating = rating;
 					selectedGear = nextGear;
 				}
+				GearRatings[nextGear] = rating;
 			}
+
 			debugData.Add(string.Format("selected gear: {0} - {1}", selectedGear, minRating));
 
 			if (selectedGear < gear && (DownshiftAllowed(absTime) || inAngularVelocity < GetEngineSpeedLimitLow(false))) {
@@ -160,34 +214,25 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 			if (selectedGear > gear && (UpshiftAllowed(absTime) || inAngularVelocity > minRating.MaxEngineSpeed)) {
 				_nextGear = selectedGear;
 			}
-			
+
 			DebugData.Add(debugData);
 			return _nextGear != gear;
 		}
 
 		private bool UpshiftAllowed(Second absTime)
 		{
-			return (absTime - _gearbox.LastDownshift).IsSmaller(_gearbox.ModelData.UpshiftAfterDownshiftDelay);
+			return (absTime - _gearbox.LastDownshift).IsGreaterOrEqual(_gearbox.ModelData.UpshiftAfterDownshiftDelay);
 		}
 
 		private bool DownshiftAllowed(Second absTime)
 		{
-			return (absTime - _gearbox.LastUpshift).IsSmaller(_gearbox.ModelData.DownshiftAfterUpshiftDelay);
+			return (absTime - _gearbox.LastUpshift).IsGreaterOrEqual(_gearbox.ModelData.DownshiftAfterUpshiftDelay);
 		}
 
-		private GearRating RatingGear(bool driveOff, uint gear, Second dt)
+		private GearRating RatingGear(
+			bool driveOff, uint gear, uint currentGear, Radian gradient, MeterPerSecond predictionVelocity,
+			MeterPerSecond velocityAfterGearshift, MeterPerSquareSecond accRsv)
 		{
-			var currentVelocity = DataBus.VehicleSpeed;
-			var gradient = CalcGradientDuringGearshift(driveOff, dt, currentVelocity);
-
-			var predictionVelocity = ShiftStrategyParameters.StartVelocity;
-			var accRsv = ShiftStrategyParameters.StartAcceleration;
-			if (!driveOff) {
-				predictionVelocity = CalcPredictionVelocity(currentVelocity, gradient);
-
-				accRsv = CalcAccelerationReserve(currentVelocity);
-			}
-
 			TestContainer.GearboxCtl.Gear = gear;
 			TestContainer.VehiclePort.Initialize(predictionVelocity, gradient);
 			var respAccRsv = (ResponseDryRun)TestContainer.VehiclePort.Request(
@@ -196,38 +241,55 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 			var respConstVel = (ResponseDryRun)TestContainer.VehiclePort.Request(
 				0.SI<Second>(), Constants.SimulationSettings.TargetTimeInterval,
 				0.SI<MeterPerSquareSecond>(), gradient, true);
+			var respDriverDemand = (ResponseDryRun)TestContainer.VehiclePort.Request(
+				0.SI<Second>(), Constants.SimulationSettings.TargetTimeInterval, DataBus.DriverAcceleration, gradient,
+				true);
 
 			if (respAccRsv.EngineSpeed < PowertrainConfig.EngineData.IdleSpeed ||
 				respAccRsv.EngineSpeed > PowertrainConfig.EngineData.FullLoadCurves[0].N95hSpeed) {
 				return new GearRating(GearRatingCase.E, 0, 0.RPMtoRad());
 			}
 
-
 			GearRating? retVal;
 			var engineSpeedLowThreshold = GetEngineSpeedLimitLow(driveOff);
-			var engineSpeedHighThreshold = GetEngineSpeedLimitHigh(driveOff, gear, respAccRsv.EngineSpeed, respConstVel.CardanTorque);
+			var engineSpeedHighThreshold = GetEngineSpeedLimitHigh(
+				driveOff, gear, respAccRsv.EngineSpeed, respConstVel.CardanTorque);
 			if (respAccRsv.EngineSpeed < engineSpeedLowThreshold) {
-				return new GearRating(GearRatingCase.D, (engineSpeedLowThreshold - respAccRsv.EngineSpeed).Value(), engineSpeedHighThreshold);
+				return new GearRating(
+					GearRatingCase.D, (engineSpeedLowThreshold - respAccRsv.EngineSpeed).Value(), engineSpeedHighThreshold);
 			}
 
 			if (respAccRsv.EngineSpeed > engineSpeedHighThreshold) {
-				return new GearRating(GearRatingCase.D, (respAccRsv.EngineSpeed - engineSpeedHighThreshold).Value(), engineSpeedHighThreshold);
+				return new GearRating(
+					GearRatingCase.D, (respAccRsv.EngineSpeed - engineSpeedHighThreshold).Value(), engineSpeedHighThreshold);
 			}
 
 			if (respAccRsv.EngineTorqueDemandTotal <= respAccRsv.EngineDynamicFullLoadTorque) {
 				var fc = PowertrainConfig.EngineData.ConsumptionMap.GetFuelConsumption(
-					VectoMath.Max(respAccRsv.EngineTorqueDemandTotal, PowertrainConfig.EngineData.FullLoadCurves[0].DragLoadStationaryTorque(respAccRsv.EngineSpeed)), respAccRsv.EngineSpeed);
-				retVal = new GearRating(GearRatingCase.A, (fc.Value / respAccRsv.AxlegearPowerRequest).Value(), engineSpeedHighThreshold);
+					VectoMath.Max(
+						respAccRsv.EngineTorqueDemandTotal,
+						PowertrainConfig.EngineData.FullLoadCurves[0].DragLoadStationaryTorque(respAccRsv.EngineSpeed)),
+					respAccRsv.EngineSpeed);
+				retVal = new GearRating(
+					GearRatingCase.A,
+					(fc.Value.ConvertToGrammPerHour().Value / VectoMath.Max(respAccRsv.AxlegearPowerRequest, 1.SI<Watt>())).Value(),
+					engineSpeedHighThreshold);
 			} else {
-				retVal = new GearRating(GearRatingCase.B, (respAccRsv.EnginePowerRequest - respAccRsv.DynamicFullLoadPower).Value(), engineSpeedHighThreshold);
-			}
-
-			var estimatedResidenceTime = EstimateResidenceTimeInGear(gear, respAccRsv, engineSpeedHighThreshold, gradient);
-			if (estimatedResidenceTime < ShiftStrategyParameters.GearResidenceTime) {
 				retVal = new GearRating(
-					GearRatingCase.C, (ShiftStrategyParameters.GearResidenceTime - estimatedResidenceTime).Value(), engineSpeedHighThreshold);
+					GearRatingCase.B, (respAccRsv.EnginePowerRequest - respAccRsv.DynamicFullLoadPower).Value(),
+					engineSpeedHighThreshold);
 			}
 
+			if (gear > currentGear) {
+				var estimatedResidenceTime =
+					EstimateResidenceTimeInGear(
+						gear, respDriverDemand, engineSpeedHighThreshold, velocityAfterGearshift, gradient, engineSpeedLowThreshold);
+				if (estimatedResidenceTime != null && estimatedResidenceTime < ShiftStrategyParameters.GearResidenceTime) {
+					retVal = new GearRating(
+						GearRatingCase.C, (ShiftStrategyParameters.GearResidenceTime - estimatedResidenceTime).Value(),
+						engineSpeedHighThreshold);
+				}
+			}
 			return retVal.Value;
 		}
 
@@ -258,9 +320,9 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 			return accRsv;
 		}
 
-		private MeterPerSecond CalcPredictionVelocity(MeterPerSecond currentVelocity, Radian gradient)
+		private MeterPerSecond CalcPredictionVelocity(
+			MeterPerSecond currentVelocity, MeterPerSecond estimatedVelocityPostShift)
 		{
-			var estimatedVelocityPostShift = VelocityDropData.Interpolate(currentVelocity, gradient);
 			var ratioSpeedDrop = estimatedVelocityPostShift / VectoMath.Max(currentVelocity, 0.1.SI<MeterPerSecond>());
 			var predictionIntervalRatio = ShiftStrategyParameters.PredictionDurationLookup.Lookup(ratioSpeedDrop.Value());
 			var speedChange = estimatedVelocityPostShift - currentVelocity;
@@ -288,13 +350,24 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 		{
 			var upperEngineSpeedLimit = (PowertrainConfig.EngineData.FullLoadCurves[0].NTq99lSpeed +
 										PowertrainConfig.EngineData.FullLoadCurves[0].NTq99hSpeed) / 2.0;
+
+			var currentVelocity = DataBus.VehicleSpeed;
+			var gradient = CalcGradientDuringGearshift(false, dt, currentVelocity);
+			var estimatedVelocityPostShift = VelocityDropData.Interpolate(currentVelocity, gradient);
+			var predictedVelocity = DataBus.DriverBehavior == DrivingBehavior.Braking
+				? currentVelocity + PowertrainConfig.DriverData.AccelerationCurve.Lookup(currentVelocity).Deceleration *
+				ModelData.TractionInterruption
+				: CalcPredictionVelocity(currentVelocity, estimatedVelocityPostShift);
+
 			if (inAngularVelocity < GetEngineSpeedLimitLow(false)) {
 				for (var i = Math.Max(0, gear - ShiftStrategyParameters.AllowedGearRangeDown);
 					i <= Math.Min(ModelData.Gears.Count, gear + ShiftStrategyParameters.AllowedGearRangeUp);
 					i++) {
 					var nextGear = (uint)i;
-					if (outAngularVelocity * ModelData.Gears[nextGear].Ratio > GetEngineSpeedLimitLow(false) &&
-						outAngularVelocity * ModelData.Gears[nextGear].Ratio < upperEngineSpeedLimit) {
+					TestContainer.GearboxCtl.Gear = nextGear;
+					var init = TestContainer.VehiclePort.Initialize(predictedVelocity, gradient);
+					if (init.EngineSpeed > GetEngineSpeedLimitLow(false) &&
+						init.EngineSpeed < upperEngineSpeedLimit) {
 						_nextGear = nextGear;
 						return true;
 					}
@@ -306,8 +379,10 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 					i >= Math.Max(0, gear + ShiftStrategyParameters.AllowedGearRangeDown);
 					i--) {
 					var nextGear = (uint)i;
-					if (outAngularVelocity * ModelData.Gears[nextGear].Ratio > GetEngineSpeedLimitLow(false) &&
-						outAngularVelocity * ModelData.Gears[nextGear].Ratio < upperEngineSpeedLimit) {
+					TestContainer.GearboxCtl.Gear = nextGear;
+					var init = TestContainer.VehiclePort.Initialize(predictedVelocity, gradient);
+					if (init.EngineSpeed > GetEngineSpeedLimitLow(false) &&
+						init.EngineSpeed < upperEngineSpeedLimit) {
 						_nextGear = nextGear;
 						return true;
 					}
@@ -352,9 +427,16 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 		{
 			var maxStartGear = (int)Math.Round(ModelData.Gears.Count / 2.0, MidpointRounding.AwayFromZero);
 
+			var currentVelocity = DataBus.VehicleSpeed;
+			var gradient = CalcGradientDuringGearshift(true, null, null);
+			var estimatedVelocityPostShift = VelocityDropData.Interpolate(currentVelocity, gradient);
+			var predictionVelocity = ShiftStrategyParameters.StartVelocity;
+			accRsv = ShiftStrategyParameters.StartAcceleration;
+
 			var startGear = 1u;
-			var minRating = new GearRating(GearRatingCase.D, double.MaxValue, 0.RPMtoRad());
+			var minRating = new GearRating(GearRatingCase.E, double.MaxValue, 0.RPMtoRad());
 			var roadGradient = DataBus.CycleData.LeftSample.RoadGradient; //CycleLookAhead(0.SI<Meter>()).RoadGradient;
+			GearRatings.Clear();
 			for (uint i = (uint)maxStartGear; i > 0; i--) {
 				var gradientBelowMaxGrad = roadGradient < MaxGradability.GradabilityLimitedTorque(i);
 				var engineSpeedLimitLow = GetEngineSpeedLimitLow(true);
@@ -362,7 +444,8 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 				var engineSpeedAboveMin = engineSpeed > engineSpeedLimitLow;
 				var engineSpeedBelowN95h = engineSpeed < PowertrainConfig.EngineData.FullLoadCurves[0].N95hSpeed;
 				if (gradientBelowMaxGrad && engineSpeedAboveMin && engineSpeedBelowN95h) {
-					var rating = RatingGear(true, i, null);
+					var rating = RatingGear(true, i, 0, roadGradient, predictionVelocity, estimatedVelocityPostShift, accRsv);
+					GearRatings[i] = rating;
 					if (rating < minRating) {
 						minRating = rating;
 						startGear = i;
@@ -389,40 +472,43 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 		}
 
 
-		private Second EstimateResidenceTimeInGear(uint gear, ResponseDryRun responseDriverDemand, PerSecond engineSpeedHighThreshold, Radian estimatedGradient)
+		private Second EstimateResidenceTimeInGear(
+			uint gear, ResponseDryRun responseDriverDemand, PerSecond engineSpeedHighThreshold,
+			MeterPerSecond velocityAfterGearshift, Radian estimatedGradient, PerSecond engineSpeedLowThreshold)
 		{
 			// get total 'transmission ratio' of powertrain
 			var engineSpeed = responseDriverDemand.EngineSpeed;
 			var vehicleSpeed = responseDriverDemand.VehicleSpeed;
 			var ratio = (vehicleSpeed / engineSpeed).Cast<Meter>();
 
+			var estimatedEngineSpeed = velocityAfterGearshift / ratio;
+			if (estimatedEngineSpeed < engineSpeedLowThreshold || estimatedEngineSpeed > engineSpeedHighThreshold) {
+				return null;
+			}
+
 			var averageAccelerationTorque = AverageAccelerationTorqueLookup.Interpolate(
 				responseDriverDemand.EngineSpeed, responseDriverDemand.EngineTorqueDemand);
 
+			TestContainer.GearboxCtl.Gear = gear;
 			var initResponse = TestContainer.VehiclePort.Initialize(vehicleSpeed, estimatedGradient);
 			var delta = initResponse.EngineTorqueDemand - averageAccelerationTorque;
 			var acceleration = SearchAlgorithm.Search(
 				0.SI<MeterPerSquareSecond>(), delta, 0.1.SI<MeterPerSquareSecond>(),
-				getYValue: r => {
-					return (r as AbstractResponse).EngineTorqueDemand - averageAccelerationTorque;
-				},
+				getYValue: r => { return (r as AbstractResponse).EngineTorqueDemand - averageAccelerationTorque; },
 				evaluateFunction: a => {
 					return TestContainer.VehiclePort.Request(
 						0.SI<Second>(), Constants.SimulationSettings.TargetTimeInterval, a, estimatedGradient, true);
 				},
-				criterion: r => {
-					return ((r as AbstractResponse).EngineTorqueDemand - averageAccelerationTorque).Value();
-				}
+				criterion: r => { return ((r as AbstractResponse).EngineTorqueDemand - averageAccelerationTorque).Value(); }
 			);
-			
+
 			var engineAcceleration = (acceleration / ratio).Cast<PerSquareSecond>();
 			var deltaEngineSpeed = engineSpeedHighThreshold - engineSpeed;
 			if (engineAcceleration > 0 && deltaEngineSpeed > 0) {
 				return (deltaEngineSpeed / engineAcceleration).Cast<Second>();
 			}
 
-			// TODO: make similar to matlab implementtion
-			return 0.SI<Second>();
+			return null;
 		}
 
 		private PerSecond GetEngineSpeedLimitHighDriveOff(uint gear)
@@ -457,44 +543,20 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 		}
 
 		#endregion
-	}
 
-	internal struct GearRating
-	{
-		public GearRating(GearRatingCase ratingCase, double rating, PerSecond maxEngineSpeed)
+		public void WriteModalResults(IModalDataContainer container)
 		{
-			RatingCase = ratingCase;
-			Rating = rating;
-			MaxEngineSpeed = maxEngineSpeed;
-		}
-
-		public double Rating { get; }
-
-		public GearRatingCase RatingCase { get; }
-		public PerSecond MaxEngineSpeed { get; set; }
-
-		public static bool operator <(GearRating first, GearRating second)
-		{
-			return first.RatingCase < second.RatingCase && first.Rating < second.Rating;
-		}
-
-		public static bool operator >(GearRating first, GearRating second)
-		{
-			return first.RatingCase > second.RatingCase && first.Rating > second.Rating;
-		}
+			foreach (var gear in ModelData.Gears.Keys) {
+				container.SetDataValue(
+					string.Format("Gear{0}-Rating", gear),
+					GearRatings.ContainsKey(gear)
+						? GearRatings[gear].NumericValue
+						: new GearRating(GearRatingCase.E, 0, null).NumericValue);
+			}
 
-		public override string ToString()
-		{
-			return string.Format("{0} / {1}", RatingCase, Rating);
+			container.SetDataValue("acc_rsv", accRsv?.Value() ?? 0);
+			GearRatings.Clear();
+			accRsv = null;
 		}
 	}
-
-	internal enum GearRatingCase
-	{
-		A = 1,	// inside preferred speed range and inside torque range
-		B,		// inside engine speed limits, torque demand too high
-		C,		// valid gear, gear residience time below threshold
-		D,		// inside engine speed limits, outside preferred speed range
-		E		// outside engine speed limits
-	}
 }
diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/GearRating.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/GearRating.cs
new file mode 100644
index 0000000000000000000000000000000000000000..25a8bfe40e23b860daa9629f5565da8c707a34ca
--- /dev/null
+++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/GearRating.cs
@@ -0,0 +1,49 @@
+using TUGraz.VectoCommon.Utils;
+
+namespace TUGraz.VectoCore.Models.SimulationComponent.Impl {
+
+	internal enum GearRatingCase
+	{
+		A = 1, // inside preferred speed range and inside torque range
+		B, // inside engine speed limits, torque demand too high
+		C, // valid gear, gear residience time below threshold
+		D, // inside engine speed limits, outside preferred speed range
+		E // outside engine speed limits
+	}
+
+
+	internal struct GearRating
+	{
+		public GearRating(GearRatingCase ratingCase, double rating, PerSecond maxEngineSpeed)
+		{
+			RatingCase = ratingCase;
+			Rating = rating;
+			MaxEngineSpeed = maxEngineSpeed;
+		}
+
+		public double Rating { get; }
+
+		public GearRatingCase RatingCase { get; }
+		public PerSecond MaxEngineSpeed { get; set; }
+
+		public double NumericValue
+		{
+			get { return ((int)RatingCase - 1) * 1e3 + (Rating * 100).LimitTo(0, 1e3-10); }
+		}
+
+		public static bool operator <(GearRating first, GearRating second)
+		{
+			return first.RatingCase < second.RatingCase || (first.RatingCase == second.RatingCase && first.Rating < second.Rating);
+		}
+
+		public static bool operator >(GearRating first, GearRating second)
+		{
+			return first.RatingCase > second.RatingCase || (first.RatingCase == second.RatingCase && first.Rating > second.Rating);
+		}
+
+		public override string ToString()
+		{
+			return string.Format("{0} / {1} ({2})", RatingCase, Rating, NumericValue);
+		}
+	}
+}
\ No newline at end of file
diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/Gearbox.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/Gearbox.cs
index bb191e376671ed05caa6c45fa9873be69f41f908..9f4a69383a9de4b55369ccfa33d9ae37cef889d8 100644
--- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/Gearbox.cs
+++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/Gearbox.cs
@@ -82,8 +82,8 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 				_strategy.Gearbox = this;
 			}
 
-			LastDownshift = -double.MaxValue.SI<Second>();
-			LastUpshift = -double.MaxValue.SI<Second>();
+			LastDownshift = double.MaxValue.SI<Second>();
+			LastUpshift = double.MaxValue.SI<Second>();
 		}
 
 		public override IResponse Initialize(NewtonMeter outTorque, PerSecond outAngularVelocity)
@@ -175,8 +175,8 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 			Log.Debug("Gearbox Power Request: torque: {0}, angularVelocity: {1}", outTorque, outAngularVelocity);
 			if (DataBus.VehicleStopped) {
 				EngageTime = absTime;
-				LastDownshift = -double.MaxValue.SI<Second>();
-				LastUpshift = -double.MaxValue.SI<Second>();
+				LastDownshift = double.MaxValue.SI<Second>();
+				LastUpshift = double.MaxValue.SI<Second>();
 			}
 			if (DataBus.DriverBehavior == DrivingBehavior.Halted) {
 				EngageTime = absTime + dt;
@@ -410,6 +410,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 			container[ModalResultField.n_gbx_out_avg] = (PreviousState.OutAngularVelocity +
 														CurrentState.OutAngularVelocity) / 2.0;
 			container[ModalResultField.T_gbx_out] = CurrentState.OutTorque;
+			(_strategy as AMTShiftStrategyV2)?.WriteModalResults(container);
 		}
 
 		protected override void DoCommitSimulationStep()
diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/MaxCardanTorquePreprocessor.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/MaxCardanTorquePreprocessor.cs
index 3f87881ddea3b598bf45f84aabc40d13f905c07e..f7973e6889fb02c754cf1dea115d7cad16b1ac61 100644
--- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/MaxCardanTorquePreprocessor.cs
+++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/MaxCardanTorquePreprocessor.cs
@@ -27,7 +27,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl {
 
 			TestContainer.GearboxCtl.Gear = 1;
 			var init = TestContainer.VehiclePort.Initialize(Data.GearshiftParameters.StartVelocity, 0.SI<Radian>());
-			var powertrainRatioWOGearbox = (Data.GearshiftParameters.StartVelocity / init.EngineSpeed / Data.GearboxData.Gears[1].Ratio).Cast<Meter>();
+			var powertrainRatioWOGearbox = (Data.GearshiftParameters.StartVelocity / init.EngineSpeed * Data.GearboxData.Gears[1].Ratio).Cast<Meter>();
 
 			var engineSpeedSteps = (Data.EngineData.FullLoadCurves[0].N95hSpeed - Data.EngineData.IdleSpeed) / 250;
 
@@ -38,7 +38,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl {
 					engineSpeed < Data.EngineData.FullLoadCurves[0].N95hSpeed;
 					engineSpeed += engineSpeedSteps) {
 					var maxTorque = Data.EngineData.FullLoadCurves[gearData.Key].FullLoadStationaryTorque(engineSpeed);
-					var vehicleSpeed = engineSpeed * powertrainRatioWOGearbox * gearData.Value.Ratio;
+					var vehicleSpeed = engineSpeed * powertrainRatioWOGearbox / gearData.Value.Ratio;
 					var first = TestContainer.VehiclePort.Initialize(vehicleSpeed, 0.SI<Radian>());
 					var delta = first.EngineTorqueDemandTotal - maxTorque;
 					var grad = SearchAlgorithm.Search(
diff --git a/VectoCore/VectoCore/OutputData/ModalDataContainer.cs b/VectoCore/VectoCore/OutputData/ModalDataContainer.cs
index 52e8001005b810438ec826091f85499cf3389f2f..3a8373979bd54f704e47abcff38f87af00e0ce6d 100644
--- a/VectoCore/VectoCore/OutputData/ModalDataContainer.cs
+++ b/VectoCore/VectoCore/OutputData/ModalDataContainer.cs
@@ -247,9 +247,9 @@ namespace TUGraz.VectoCore.OutputData
 						ModalResultField.FCMap, ModalResultField.FCAUXc, ModalResultField.FCWHTCc,
 						ModalResultField.FCAAUX, ModalResultField.FCFinal
 					}.Select(x => x.GetName()));
-#if TRACE
+//#if TRACE
 			strCols = strCols.Concat(_additionalColumns);
-#endif
+//#endif
 			if (WriteModalResults) {
 				var filteredData = Data;
 				foreach (var filter in _filters) {
diff --git a/VectoCore/VectoCore/VectoCore.csproj b/VectoCore/VectoCore/VectoCore.csproj
index e272c85b0a0197ed211f374e47939936274e51ba..2bd6a04f391af6f88154eb37cfed9260af06cf41 100644
--- a/VectoCore/VectoCore/VectoCore.csproj
+++ b/VectoCore/VectoCore/VectoCore.csproj
@@ -199,6 +199,7 @@
     <Compile Include="Models\SimulationComponent\Impl\DrivingCycleEnumerator.cs" />
     <Compile Include="Models\SimulationComponent\Impl\EngineFanAuxiliary.cs" />
     <Compile Include="Models\SimulationComponent\Impl\EngineSpeedDriveOffPreprocessor.cs" />
+    <Compile Include="Models\SimulationComponent\Impl\GearRating.cs" />
     <Compile Include="Models\SimulationComponent\Impl\MaxCardanTorqueLookup.cs" />
     <Compile Include="Models\SimulationComponent\Impl\MaxCardanTorquePreprocessor.cs" />
     <Compile Include="Models\SimulationComponent\Impl\MaxGradabilityLookup.cs" />
diff --git a/VectoCore/VectoCoreTest/Models/Simulation/ShiftStrategyV2Test.cs b/VectoCore/VectoCoreTest/Models/Simulation/ShiftStrategyV2Test.cs
index 6a1a259304529bc432642340595172a4aa2ef698..95b3bbba793947753d70b2762fea18800527db3a 100644
--- a/VectoCore/VectoCoreTest/Models/Simulation/ShiftStrategyV2Test.cs
+++ b/VectoCore/VectoCoreTest/Models/Simulation/ShiftStrategyV2Test.cs
@@ -1,9 +1,13 @@
 using System;
+using System.Collections.Generic;
 using System.IO;
+using System.Linq;
 using NUnit.Framework;
 using NUnit.Framework.Internal;
 using TUGraz.VectoCommon.Models;
+using TUGraz.VectoCommon.Utils;
 using TUGraz.VectoCore.InputData.FileIO.JSON;
+using TUGraz.VectoCore.InputData.FileIO.XML.Declaration;
 using TUGraz.VectoCore.Models.Simulation.Impl;
 using TUGraz.VectoCore.OutputData;
 using TUGraz.VectoCore.OutputData.FileIO;
@@ -24,27 +28,37 @@ namespace TUGraz.VectoCore.Tests.Models.Simulation
 		}
 
 
-		[TestCase(Class9Decl),
+		[TestCase(Class9Decl, 0),
+		TestCase(@"E:\QUAM\Downloads\2018-07-13_Prototype-TCU-VECTO_R2016a\a_input_Data\Cl-5_tractor_directdr_axle_2p53.xml", 0),
+		TestCase(@"E:\QUAM\Downloads\2018-07-13_Prototype-TCU-VECTO_R2016a\a_input_Data\Cl-5_tractor_directdr_axle_2p53.xml", 1),
+		TestCase(@"E:\QUAM\Downloads\2018-07-13_Prototype-TCU-VECTO_R2016a\a_input_Data\Cl-5_tractor_directdr_axle_2p53.xml", 4)
 		]
-		public void TestSShiftStrategyV2(string jobFile)
+		public void TestSShiftStrategyV2(string jobFile, int i)
 		{
 			var fileWriter = new FileOutputWriter(jobFile);
 			var sumWriter = new SummaryDataContainer(fileWriter);
 			var jobContainer = new JobContainer(sumWriter);
-			var dataProvider = JSONInputDataFactory.ReadJsonJob(jobFile);
+			var dataProvider = Path.GetExtension(jobFile) == ".vecto"
+				? JSONInputDataFactory.ReadJsonJob(jobFile)
+				: new XMLDeclarationInputDataProvider(jobFile, true);
 			var runsFactory = new SimulatorFactory(ExecutionMode.Declaration, dataProvider, fileWriter) {
 				ModalResults1Hz = false,
 				WriteModalResults = true,
 				ActualModalData = false,
 				Validate = false,
+				SumData = sumWriter,
 			};
 
-			jobContainer.AddRuns(runsFactory);
+			var runs = runsFactory.SimulationRuns().ToArray();
 
+			jobContainer.AddRun(runs[i]);
 
-			var i = 0;
+			jobContainer.Runs[0].Run.Run();
 
-			jobContainer.Runs[i].Run.Run();
+			Assert.IsTrue(jobContainer.Runs[0].Run.FinishedWithoutErrors);
+			jobContainer.Execute();
+			jobContainer.WaitFinished();
 		}
 	}
+
 }