diff --git a/VectoCommon/VectoCommon/Models/HybridStrategyResponse.cs b/VectoCommon/VectoCommon/Models/HybridStrategyResponse.cs
index 7c9d02ca5523a72f1cb5db35220e6faf3707c971..38698c42ff9b3f55588a869e924ac8030763f736 100644
--- a/VectoCommon/VectoCommon/Models/HybridStrategyResponse.cs
+++ b/VectoCommon/VectoCommon/Models/HybridStrategyResponse.cs
@@ -1,6 +1,7 @@
 using System;
 using System.Collections.Generic;
 using System.Diagnostics;
+using System.Linq;
 using TUGraz.VectoCommon.InputData;
 using TUGraz.VectoCommon.Utils;
 
@@ -46,6 +47,17 @@ namespace TUGraz.VectoCommon.Models {
 		public bool ICEOff { get; set; }
 
 		public HybridConfigurationIgnoreReason IgnoreReason { get; set; }
+
+		public bool IsEqual(HybridResultEntry other)
+		{
+			return ToString().Equals(other.ToString(), StringComparison.InvariantCultureIgnoreCase);
+		}
+
+		public string ToString()
+		{
+			var setting = string.Join(", ", Setting.MechanicalAssistPower.Select(x => $"{x.Key}, {x.Value}"));
+			return $"{U}: {setting} {Score} G{Gear}";
+		}
 	}
 
 	[Flags]
@@ -64,4 +76,100 @@ namespace TUGraz.VectoCommon.Models {
 		NoResponseAvailable = 1 << 11,
 		Evaluated = 1 << 12,
 	}
+
+	public static class HybridConfigurationIgnoreReasonHelper
+	{
+		public static string HumanReadable(this HybridConfigurationIgnoreReason x)
+		{
+			var retVal = new List<string>();
+			foreach (var entry in EnumHelper.GetValues<HybridConfigurationIgnoreReason>()) {
+
+				var tmp = x & entry;
+				switch (tmp) {
+
+					case HybridConfigurationIgnoreReason.Evaluated:
+						retVal.Add("OK");
+						break;
+					case HybridConfigurationIgnoreReason.NotEvaluated:
+						//retVal.Add("not evaluated");
+						break;
+					case HybridConfigurationIgnoreReason.EngineSpeedTooLow:
+						retVal.Add("engine speed too low");
+						break;
+					case HybridConfigurationIgnoreReason.EngineSpeedTooHigh:
+						retVal.Add("engine speed too high");
+						break;
+					case HybridConfigurationIgnoreReason.EngineTorqueDemandTooHigh:
+						retVal.Add("engine torque demand too high");
+						break;
+					case HybridConfigurationIgnoreReason.EngineTorqueDemandTooLow:
+						retVal.Add("engine torque demand too low");
+						break;
+					case HybridConfigurationIgnoreReason.EngineSpeedAboveUpshift: retVal.Add("engine speed above upshift"); break;
+					case HybridConfigurationIgnoreReason.EngineSpeedBelowDownshift:
+						retVal.Add("engine speed below downshift");
+						break;
+					case HybridConfigurationIgnoreReason.NoResponseAvailable: return "no response available";
+					default: throw new ArgumentOutOfRangeException(nameof(x), x, null);
+				}
+			}
+
+			return string.Join("/", retVal);
+		}
+
+		public static bool InvalidEngineSpeed(this HybridConfigurationIgnoreReason x)
+		{
+			return (x & (HybridConfigurationIgnoreReason.EngineSpeedTooLow |
+					HybridConfigurationIgnoreReason.EngineSpeedTooHigh |
+					HybridConfigurationIgnoreReason.EngineSpeedBelowDownshift |
+					 HybridConfigurationIgnoreReason.EngineSpeedAboveUpshift)) != 0;
+		}
+
+		public static bool BatteryDemandExceeded(this HybridConfigurationIgnoreReason x)
+		{
+			return (x & (HybridConfigurationIgnoreReason.BatteryAboveMaxSoc |
+						HybridConfigurationIgnoreReason.BatteryBelowMinSoC)) != 0;
+		}
+
+		public static bool EngineSpeedTooHigh(this HybridConfigurationIgnoreReason x)
+		{
+			return (x & HybridConfigurationIgnoreReason.EngineSpeedTooHigh) != 0;
+		}
+
+		public static bool EngineSpeedTooLow(this HybridConfigurationIgnoreReason x)
+		{
+			return (x & HybridConfigurationIgnoreReason.EngineSpeedTooLow) != 0;
+		}
+
+		public static bool EngineSpeedBelowDownshift(this HybridConfigurationIgnoreReason x)
+		{
+			return (x & HybridConfigurationIgnoreReason.EngineSpeedBelowDownshift) != 0;
+		}
+
+		public static bool EngineSpeedAboveUpshift(this HybridConfigurationIgnoreReason x)
+		{
+			return (x & HybridConfigurationIgnoreReason.EngineSpeedAboveUpshift) != 0;
+		}
+
+		public static bool EngineTorqueDemandTooHigh(this HybridConfigurationIgnoreReason x)
+		{
+			return (x & HybridConfigurationIgnoreReason.EngineTorqueDemandTooHigh) != 0;
+		}
+
+		public static bool EngineTorqueDemandTooLow(this HybridConfigurationIgnoreReason x)
+		{
+			return (x & HybridConfigurationIgnoreReason.EngineTorqueDemandTooLow) != 0;
+		}
+
+		public static bool BatterySoCTooLow(this HybridConfigurationIgnoreReason x)
+		{
+			return (x & HybridConfigurationIgnoreReason.BatterySoCTooLow) != 0;
+		}
+
+		public static bool AllOK(this HybridConfigurationIgnoreReason x)
+		{
+			return (x & HybridConfigurationIgnoreReason.Evaluated) == HybridConfigurationIgnoreReason.Evaluated;
+		}
+	}
+
 }
\ No newline at end of file
diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/Clutch.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/Clutch.cs
index 4a42501fc4812d8dfb35e1d9bbfa8ac33e3c3585..f61e62f65ef1b7c898115c1e0639c9af7da5f872 100644
--- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/Clutch.cs
+++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/Clutch.cs
@@ -163,7 +163,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 			NewtonMeter torqueIn;
 			PerSecond angularVelocityIn;
 
-			var startClutch = DataBus.VehicleInfo.VehicleStopped || !PreviousState.ClutchLoss.IsEqual(0) || (outAngularVelocity.IsSmaller(DataBus.EngineInfo.EngineSpeed) && !DataBus.EngineInfo.EngineOn); // || (PreviousState.ClutchLoss.IsEqual(0) && outAngularVelocity.IsSmaller(DataBus.EngineInfo.EngineIdleSpeed));
+			var startClutch = DataBus.VehicleInfo.VehicleStopped || !PreviousState.ClutchLoss.IsEqual(0, 1e-3) || (outAngularVelocity.IsSmaller(DataBus.EngineInfo.EngineSpeed) && !DataBus.EngineInfo.EngineOn); // || (PreviousState.ClutchLoss.IsEqual(0) && outAngularVelocity.IsSmaller(DataBus.EngineInfo.EngineIdleSpeed));
 			var slippingClutchWhenDriving = (DataBus.GearboxInfo.Gear <= 2 && DataBus.DriverInfo.DriverBehavior != DrivingBehavior.Braking);
 			var slippingClutchDuringBraking = DataBus.GearboxInfo.Gear == 1 && DataBus.DriverInfo.DriverBehavior == DrivingBehavior.Braking && outTorque > 0 && DataBus.Brakes.BrakePower.IsEqual(0);
 			//var slippingClutchWhenDriving = (DataBus.Gear == 1 && outTorque > 0);
diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/Driver.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/Driver.cs
index 94ae6f8030c514d50bcaab9523be5adab473548b..65c2dc3d55a46804b2c727331ba0d9ba5e447801 100644
--- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/Driver.cs
+++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/Driver.cs
@@ -680,14 +680,14 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 
 			IResponse retVal = null;
 
-			var operatingPoint = ComputeAcceleration(ds, nextTargetSpeed);
+			var op1 = ComputeAcceleration(ds, nextTargetSpeed);
 
 			//if (operatingPoint.Acceleration.IsSmaller(0)) {
-			operatingPoint = IncreaseDecelerationToMaxWithinSpeedRange(operatingPoint);
+			var op2 = IncreaseDecelerationToMaxWithinSpeedRange(op1);
 
-			operatingPoint =
-				AdaptDecelerationToTargetDistance(ds, nextTargetSpeed, targetDistance, operatingPoint.Acceleration) ??
-				operatingPoint;
+			var operatingPoint =
+				AdaptDecelerationToTargetDistance(ds, nextTargetSpeed, targetDistance, op2.Acceleration) ??
+				op2;
 
 			DriverAcceleration = operatingPoint.Acceleration;
 			var response = !smartBusAux && previousResponse != null
@@ -888,8 +888,9 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 			return null;
 		}
 
-		private OperatingPoint IncreaseDecelerationToMaxWithinSpeedRange(OperatingPoint operatingPoint)
+		private OperatingPoint IncreaseDecelerationToMaxWithinSpeedRange(OperatingPoint op)
 		{
+			var operatingPoint = new OperatingPoint(op);
 			// if we should brake with the max. deceleration and the deceleration changes within the current interval, take the larger deceleration...
 			if (
 				operatingPoint.Acceleration.IsEqual(
diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Strategies/HybridStrategy.cs b/VectoCore/VectoCore/Models/SimulationComponent/Strategies/HybridStrategy.cs
index db7a19ac0c73a13866b724766ce96ad713960a5d..66173f4f06870860daed33c862328dab6fe07582 100644
--- a/VectoCore/VectoCore/Models/SimulationComponent/Strategies/HybridStrategy.cs
+++ b/VectoCore/VectoCore/Models/SimulationComponent/Strategies/HybridStrategy.cs
@@ -160,6 +160,11 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Strategies
 			}
 			
 			var best = SelectBestOption(eval, absTime, dt, outTorque, outAngularVelocity, dryRun, currentGear);
+			var origBest = SelectBestOption_ORIG(eval, absTime, dt, outTorque, outAngularVelocity, dryRun, currentGear);
+
+			if (!best.IsEqual(origBest)) {
+				Log.Debug("best: {0}, origBest: {1}", best.ToString(), origBest.ToString());
+			}
 
 			var retVal = CreateResponse(best, currentGear);
 			if (!DataBus.EngineInfo.EngineOn && !best.ICEOff && retVal.ShiftRequired) {
@@ -387,13 +392,132 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Strategies
 		}
 
 		private HybridResultEntry SelectBestOption(
+			List<HybridResultEntry> eval, Second absTime, Second dt, NewtonMeter outTorque, PerSecond outAngularVelocity,
+			bool dryRun,
+			uint currentGear)
+		{
+			var best = DoSelectBestOption(eval, absTime, dt, outTorque, outAngularVelocity, dryRun, currentGear);
+			if (best == null || !best.IgnoreReason.InvalidEngineSpeed() || best.ICEOff ||
+				eval.Select(x => x.Gear).Distinct().Count() <= 1) {
+				return best;
+			}
+
+			// selected solution has invalid engine speed and engine is on and evaluation contains only one gear - allow emergency shift
+			if (best.IgnoreReason.EngineSpeedAboveUpshift()) {
+				//try upshift
+				var newEval = new List<HybridResultEntry>();
+				EvaluateConfigsForGear(
+					absTime, dt, outTorque, outAngularVelocity, best.Gear + 1, AllowICEOff(absTime), newEval,
+					best.Setting.MechanicalAssistPower.First().Key);
+				best = DoSelectBestOption(newEval, absTime, dt, outTorque, outAngularVelocity, dryRun, currentGear);
+			}
+			if (best.IgnoreReason.EngineSpeedBelowDownshift()) {
+				//try downshift
+				var newEval = new List<HybridResultEntry>();
+				EvaluateConfigsForGear(
+					absTime, dt, outTorque, outAngularVelocity, best.Gear - 1, AllowICEOff(absTime), newEval,
+					best.Setting.MechanicalAssistPower.First().Key);
+				best = DoSelectBestOption(newEval, absTime, dt, outTorque, outAngularVelocity, dryRun, currentGear);
+			}
+			return best;
+		}
+
+		private HybridResultEntry DoSelectBestOption(
+			List<HybridResultEntry> eval, Second absTime, Second dt, NewtonMeter outTorque, PerSecond outAngularVelocity,
+			bool dryRun,uint currentGear)
+		{
+			HybridResultEntry best = null;
+
+			if (DataBus.VehicleInfo.VehicleSpeed.IsSmallerOrEqual(ModelData.GearboxData.StartSpeed)) {
+				best = eval.Where(x => !double.IsNaN(x.Score)).Where(x => !x.IgnoreReason.EngineSpeedTooHigh())
+							.OrderBy(x => x.Score).FirstOrDefault();
+			} else {
+				best = eval.Where(x => !double.IsNaN(x.Score)).Where(x => x.IgnoreReason.AllOK()).OrderBy(x => x.Score)
+								.FirstOrDefault();
+			}
+			if (best != null) {
+				return best;
+			}
+
+			best = eval.Where(x => !double.IsNaN(x.Score) && !x.IgnoreReason.InvalidEngineSpeed()).OrderBy(x => x.Score)
+						.FirstOrDefault();
+			if (best != null) {
+				return best;
+			}
+
+			var emEngaged = (!ElectricMotorCanPropellDuringTractionInterruption ||
+							(DataBus.GearboxInfo.GearEngaged(absTime) && eval.First().Response.Gearbox.Gear != 0));
+			var allOverload = eval.Where(x => !(x.IgnoreReason.BatteryDemandExceeded() || x.IgnoreReason.BatterySoCTooLow()))
+								.All(x => x.IgnoreReason.EngineTorqueDemandTooHigh());
+			var allUnderload = eval.All(x => x.IgnoreReason.EngineTorqueDemandTooLow());
+			if (DataBus.DriverInfo.DrivingAction == DrivingAction.Accelerate && allOverload) {
+				if (ElectricMotorCanPropellDuringTractionInterruption || DataBus.GearboxInfo.GearEngaged(absTime)) {
+					// overload, EM can support - use solution with max EM power
+					var filtered = eval.Where(x => !x.IgnoreReason.BatteryDemandExceeded() && !x.IgnoreReason.BatterySoCTooLow())
+										.OrderBy(x => Math.Abs((int)currentGear - x.Gear)).ToArray();
+					if (filtered.Length > 0) {
+						best = filtered.OrderBy(x => Math.Abs((int)currentGear - x.Gear))
+							.ThenBy(x => x.Setting.MechanicalAssistPower.Sum(e => e.Value ?? 0.SI<NewtonMeter>()))
+										.FirstOrDefault();
+							//.MinBy(
+							//..x => x.Setting.MechanicalAssistPower.Sum(e => e.Value ?? 0.SI<NewtonMeter>()));
+						return best;
+					}
+					best = eval.Where(x => !x.IgnoreReason.BatteryDemandExceeded())
+								.OrderBy(x => Math.Abs((int)currentGear - x.Gear))
+								.ThenBy(x => -x.Response.ElectricSystem.BatteryPowerDemand.Value()).First();
+					return best;
+				}
+			}
+			if (DataBus.DriverInfo.DrivingAction == DrivingAction.Accelerate && allUnderload) {
+				if (ElectricMotorCanPropellDuringTractionInterruption || DataBus.GearboxInfo.GearEngaged(absTime)) {
+					var filtered = eval.Where(x => !x.IgnoreReason.InvalidEngineSpeed())
+										.OrderBy(x => Math.Abs((int)currentGear - x.Gear)).ToArray();
+					if (!filtered.Any()) {
+						filtered = eval.OrderBy(x => Math.Abs((int)currentGear - x.Gear)).ToArray();
+					}
+					best = filtered.MaxBy(x => x.Setting.MechanicalAssistPower.Sum(e => e.Value ?? 0.SI<NewtonMeter>()));
+					if (best != null) {
+						return best;
+					}
+				}
+			}
+
+			if (DataBus.DriverInfo.DrivingAction == DrivingAction.Accelerate && emEngaged) {
+				var filtered = eval.Where(x => !x.IgnoreReason.InvalidEngineSpeed()).ToArray();
+				if (filtered.Length == 0) {
+					filtered = eval
+						.Where(x => !x.IgnoreReason.EngineSpeedTooLow() && !x.IgnoreReason.EngineSpeedTooHigh()).ToArray();
+				}
+				if (filtered.Length == 0) {
+					filtered = eval.OrderBy(x => Math.Abs((int)currentGear - x.Gear)).ToArray();
+				}
+				var filtered2 = filtered.Where(x => !x.IgnoreReason.EngineTorqueDemandTooLow()).ToArray();
+				if (filtered2.Length == 0) {
+					filtered2 = filtered.OrderBy(x => Math.Abs((int)currentGear - x.Gear)).ToArray();
+				}
+				best = filtered2.MinBy(x => x.Setting.MechanicalAssistPower.Sum(e => e.Value ?? 0.SI<NewtonMeter>()));
+				if (best != null) {
+					return best;
+				}
+			}
+			if (DataBus.DriverInfo.DrivingAction == DrivingAction.Brake && emEngaged) {
+				best = eval.MaxBy(x => x.Setting.MechanicalAssistPower.Sum(e => e.Value ?? 0.SI<NewtonMeter>()));
+				if (best != null) {
+					return best;
+				}
+			}
+			return eval.FirstOrDefault(); 
+		}
+
+		private HybridResultEntry SelectBestOption_ORIG(
 			List<HybridResultEntry> eval, Second absTime, Second dt, NewtonMeter outTorque, PerSecond outAngularVelocity, bool dryRun,
 			uint currentGear)
 		{
-			var best = eval.Where(x => !double.IsNaN(x.Score) && (x.IgnoreReason & HybridConfigurationIgnoreReason.EngineSpeedTooHigh) == 0).OrderBy(x => x.Score).FirstOrDefault();
+			var best = eval.Where(x => !double.IsNaN(x.Score) && !x.IgnoreReason.EngineSpeedTooHigh()).OrderBy(x => x.Score).FirstOrDefault();
 			if (best == null) {
-				best = eval.OrderBy(x => Math.Abs((int)currentGear - x.Gear)).FirstOrDefault(
-					x => !(!x.ICEOff && x.IgnoreReason.InvalidEngineSpeed() && !(x.IgnoreReason.BatteryDemandExceeded() || (x.IgnoreReason & HybridConfigurationIgnoreReason.BatterySoCTooLow) != 0)));
+				best = eval.OrderBy(x => Math.Abs((int)currentGear - x.Gear))
+					.FirstOrDefault(x => !(!x.ICEOff && x.IgnoreReason.InvalidEngineSpeed()) && !(x.IgnoreReason.BatteryDemandExceeded() || x.IgnoreReason.BatterySoCTooLow()));
 				if (best == null /*&& dryRun*/) {
 					var emEngaged = (!ElectricMotorCanPropellDuringTractionInterruption ||
 									(DataBus.GearboxInfo.GearEngaged(absTime) && eval.First().Response.Gearbox.Gear != 0));
@@ -402,8 +526,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Strategies
 						if (filtered.Length == 0) {
 							filtered = eval.OrderBy(x => Math.Abs((int)currentGear - x.Gear)).ToArray();
 						}
-						filtered = filtered.Where(x => (x.IgnoreReason & HybridConfigurationIgnoreReason.EngineTorqueDemandTooLow) == 0)
-											.ToArray();
+						filtered = filtered.Where(x => !x.IgnoreReason.EngineTorqueDemandTooLow()).ToArray();
 						if (filtered.Length == 0) {
 							filtered = eval.OrderBy(x => Math.Abs((int)currentGear - x.Gear)).ToArray();
 						}
@@ -416,15 +539,13 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Strategies
 				if (best == null) {
 					best = eval.FirstOrDefault();
 				}
-				var allOverload = eval.Where(x => !(x.IgnoreReason.BatteryDemandExceeded() || (x.IgnoreReason & HybridConfigurationIgnoreReason.BatterySoCTooLow) != 0)).All(
-					x => (x.IgnoreReason & HybridConfigurationIgnoreReason.EngineTorqueDemandTooHigh) != 0);
-				var allUnderload = eval.All(
-					x => (x.IgnoreReason & HybridConfigurationIgnoreReason.EngineTorqueDemandTooLow) != 0);
+				var allOverload = eval.Where(x => !(x.IgnoreReason.BatteryDemandExceeded() || x.IgnoreReason.BatterySoCTooLow()))
+					.All(x => x.IgnoreReason.EngineTorqueDemandTooHigh());
+				var allUnderload = eval.All(x => x.IgnoreReason.EngineTorqueDemandTooLow());
 				if (DataBus.DriverInfo.DrivingAction == DrivingAction.Accelerate && allOverload) {
 					if (ElectricMotorCanPropellDuringTractionInterruption || DataBus.GearboxInfo.GearEngaged(absTime)) {
 						// overload, EM can support - use solution with max EM power
-						var filtered = eval.Where(x => !x.IgnoreReason.BatteryDemandExceeded() &&
-											(x.IgnoreReason & HybridConfigurationIgnoreReason.BatterySoCTooLow) == 0)
+						var filtered = eval.Where(x => !x.IgnoreReason.BatteryDemandExceeded() && !x.IgnoreReason.BatterySoCTooLow())
 									.OrderBy(x => Math.Abs((int)currentGear - x.Gear)).ToArray();
 						if (filtered.Length == 0) {
 							best = eval.Where(
@@ -453,7 +574,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Strategies
 				
 			}
 
-			if (best != null && best.IgnoreReason.InvalidEngineSpeed() && !best.ICEOff && eval.Select(x => x.Gear).Distinct().Count() >1) {
+			if (best != null && best.IgnoreReason.InvalidEngineSpeed() && !best.ICEOff && eval.Select(x => x.Gear).Distinct().Count() > 1) {
 				// selected solution has invalid engine speed and engine is on and evaluation contains only one gear - allow emergency shift
 				if ((best.IgnoreReason & HybridConfigurationIgnoreReason.EngineSpeedAboveUpshift) != 0) {
 					//try upshift
@@ -486,8 +607,12 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Strategies
 				NextGear = best.Gear, // gs?.Item2 ?? 0,
 				EvaluatedSolution = best,
 			};
-			if ((best.IgnoreReason & HybridConfigurationIgnoreReason.EngineSpeedTooHigh) != 0 && !DataBus.EngineInfo.EngineOn) {
-				// ICE is off, selected solution has a too high engine speed - keep ICE off
+			if (best.IgnoreReason.EngineSpeedTooHigh() && !DataBus.EngineInfo.EngineOn) {
+				// ICE is off, selected solution has a too low or too high engine speed - keep ICE off
+				retVal.CombustionEngineOn = false;
+			}
+			if (best.IgnoreReason.EngineSpeedTooLow() && !DataBus.EngineInfo.EngineOn && DataBus.VehicleInfo.VehicleSpeed.IsGreater(ModelData.GearboxData.StartSpeed)) {
+				// ICE is off, selected solution has a too low or too high engine speed - keep ICE off
 				retVal.CombustionEngineOn = false;
 			}
 			return retVal;
@@ -521,10 +646,12 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Strategies
 			var minimumShiftTimePassed = (DataBus.GearboxInfo.LastShift + ModelData.GearboxData.ShiftTime).IsSmallerOrEqual(absTime);
 			var gearRangeUpshift = ModelData.GearshiftParameters.AllowedGearRangeUp;
 			var gearRangeDownshift = ModelData.GearshiftParameters.AllowedGearRangeDown;
-			if (dryRun || !minimumShiftTimePassed || (absTime - DataBus.GearboxInfo.LastUpshift).IsSmaller(ModelData.GearboxData.DownshiftAfterUpshiftDelay)) {
+			if (dryRun || !minimumShiftTimePassed || (absTime - DataBus.GearboxInfo.LastUpshift).IsSmaller(ModelData.GearboxData.DownshiftAfterUpshiftDelay) 
+				|| (DataBus.DriverInfo.DrivingAction == DrivingAction.Accelerate && DataBus.VehicleInfo.VehicleSpeed.IsSmaller(5.KMPHtoMeterPerSecond()))) {
 				gearRangeDownshift = 0;
 			}
-			if (dryRun || !minimumShiftTimePassed || (absTime - DataBus.GearboxInfo.LastDownshift).IsSmaller(ModelData.GearboxData.UpshiftAfterDownshiftDelay)) {
+			if (dryRun || !minimumShiftTimePassed || (absTime - DataBus.GearboxInfo.LastDownshift).IsSmaller(ModelData.GearboxData.UpshiftAfterDownshiftDelay)
+				|| (DataBus.DriverInfo.DrivingAction == DrivingAction.Accelerate && DataBus.VehicleInfo.VehicleSpeed.IsSmaller(5.KMPHtoMeterPerSecond()))) {
 				gearRangeUpshift = 0;
 			}
 
@@ -648,7 +775,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Strategies
 				maxU = 0;
 			}
 			if (firstResponse.ElectricMotor.MaxDriveTorque != null && (ElectricMotorCanPropellDuringTractionInterruption || firstResponse.Gearbox.Gear != 0)) {
-				for (var u = 0.0; u >= maxU; u -= stepSize * (u < -4 ? 10 : (u < -2 ? 5 : 1))) {
+				for (var u = -stepSize; u >= maxU; u -= stepSize * (u < -10 ? 100 :(u < -4 ? 10 : (u < -2 ? 5 : 1)))) {
 					var emTorque = emTqReq.Abs() * u;
 					if (!emTorque.IsBetween(
 						0.SI<NewtonMeter>(), firstResponse.ElectricMotor.MaxDriveTorque)) {
@@ -1091,56 +1218,4 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Strategies
 
 	}
 
-	public static class HybridConfigurationIgnoreReasonHelper
-	{
-		public static string HumanReadable(this HybridConfigurationIgnoreReason x)
-		{
-			var retVal = new List<string>();
-			foreach (var entry in EnumHelper.GetValues<HybridConfigurationIgnoreReason>()) {
-
-				var tmp = x & entry;
-				switch (tmp) {
-					
-					case HybridConfigurationIgnoreReason.Evaluated:
-						retVal.Add("OK");
-						break;
-					case HybridConfigurationIgnoreReason.NotEvaluated:
-						//retVal.Add("not evaluated");
-						break;
-					case HybridConfigurationIgnoreReason.EngineSpeedTooLow: retVal.Add("engine speed too low");
-						break;
-					case HybridConfigurationIgnoreReason.EngineSpeedTooHigh: retVal.Add("engine speed too high");
-						break;
-					case HybridConfigurationIgnoreReason.EngineTorqueDemandTooHigh:
-						retVal.Add("engine torque demand too high");
-						break;
-					case HybridConfigurationIgnoreReason.EngineTorqueDemandTooLow:
-						retVal.Add("engine torque demand too low");
-						break;
-					case HybridConfigurationIgnoreReason.EngineSpeedAboveUpshift: retVal.Add("engine speed above upshift"); break;
-					case HybridConfigurationIgnoreReason.EngineSpeedBelowDownshift:
-						retVal.Add("engine speed below downshift");
-						break;
-					case HybridConfigurationIgnoreReason.NoResponseAvailable: return "no response available";
-					default: throw new ArgumentOutOfRangeException(nameof(x), x, null);
-				}
-			}
-
-			return string.Join("/", retVal);
-		}
-
-		public static bool InvalidEngineSpeed(this HybridConfigurationIgnoreReason x)
-		{
-			return (x & (HybridConfigurationIgnoreReason.EngineSpeedTooLow |
-					HybridConfigurationIgnoreReason.EngineSpeedTooHigh |
-					HybridConfigurationIgnoreReason.EngineSpeedBelowDownshift |
-					 HybridConfigurationIgnoreReason.EngineSpeedAboveUpshift)) != 0;
-		}
-
-		public static bool BatteryDemandExceeded(this HybridConfigurationIgnoreReason x)
-		{
-			return (x & (HybridConfigurationIgnoreReason.BatteryAboveMaxSoc |
-						HybridConfigurationIgnoreReason.BatteryBelowMinSoC)) != 0;
-		}
-	}
 }
\ No newline at end of file
diff --git a/VectoCore/VectoCoreTest/Integration/Hybrid/ParallelHybridTest.cs b/VectoCore/VectoCoreTest/Integration/Hybrid/ParallelHybridTest.cs
index 71417f2673a508e8a1ee2e65a0c9de5d3429b4de..0956b38ace6afb2539a9180e77e67c1cb4a63a0a 100644
--- a/VectoCore/VectoCoreTest/Integration/Hybrid/ParallelHybridTest.cs
+++ b/VectoCore/VectoCoreTest/Integration/Hybrid/ParallelHybridTest.cs
@@ -84,7 +84,7 @@ namespace TUGraz.VectoCore.Tests.Integration.Hybrid
 
 			const bool largeMotor = true;
 
-			var modFilename = string.Format("SimpleParallelHybrid-P2_acc_{0}-{1}_{2}", vmax, initialSoC, slope);
+			var modFilename = string.Format("SimpleParallelHybrid-P2_acc_{0}-{1}_{2}.vmod", vmax, initialSoC, slope);
 			const PowertrainPosition pos = PowertrainPosition.HybridP2;
 			var job = CreateEngineeringRun(
 				cycle, modFilename, initialSoC, pos, 1.0, largeMotor: true);
@@ -101,7 +101,7 @@ namespace TUGraz.VectoCore.Tests.Integration.Hybrid
 			Assert.IsTrue(run.FinishedWithoutErrors);
 
 			Assert.IsTrue(modData.Rows.Count > 0);
-			GraphWriter.Write(modFilename + ".vmod");
+			GraphWriter.Write(modFilename);
 		}
 
 		[