diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/ATShiftStrategyOptimized.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/ATShiftStrategyOptimized.cs
index 96884608e17442d0982883b24fe338df5f0d2c91..778079280ad998a1f2134c383c45c0a13801ff72 100644
--- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/ATShiftStrategyOptimized.cs
+++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/ATShiftStrategyOptimized.cs
@@ -91,6 +91,10 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 			Second absTime, Second dt, NewtonMeter outTorque, PerSecond outAngularVelocity, NewtonMeter origInTorque,
 			PerSecond origInAngularVelocity, uint currentGear, Second lastShiftTime)
 		{
+			if (outAngularVelocity.IsEqual(0)) {
+				return null;
+			}
+
 			var minFcGear = new GearshiftPosition(currentGear, _gearbox.TorqueConverterLocked);
 			var minFc = double.MaxValue;
 			KilogramPerSecond fcCurrent = null;
diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/ATShiftStrategyVoith.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/ATShiftStrategyVoith.cs
index f33906ee6696c2a173d1d826832257ed3321aa02..8058f7b1ef5c17c6e79dd8be29114b05afacc51e 100644
--- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/ATShiftStrategyVoith.cs
+++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/ATShiftStrategyVoith.cs
@@ -34,6 +34,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 		private List<SchmittTrigger> LoadStageSteps;
 		private Radian roadGradient;
 		private MeterPerSquareSecond driverAcceleration;
+		private bool dualTCTransmission;
 
 		public ATShiftStrategyVoith(VectoRunData data, IDataBus dataBus) : base(data, dataBus)
 		{
@@ -50,6 +51,8 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 			MinMass = data.VehicleData.MinimumVehicleMass;
 			MaxMass = data.VehicleData.MaximumVehicleMass;
 			FullLoadCurve = data.EngineData.FullLoadCurves[0];
+
+			dualTCTransmission = ModelData.Gears[1].HasTorqueConverter && ModelData.Gears[2].HasTorqueConverter;
 		}
 
 		private void InitializeShiftLines(TableData lines)
@@ -199,18 +202,31 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 			}
 
 			var currentGear = ModelData.Gears[gear];
-			if (gear >= ModelData.Gears.Keys.Max()) {
-				return false;
-			}
+			if (dualTCTransmission && gear == 1) {
+				// UPSHIFT - Special rule for 1C -> 2C
+				if (!_gearbox.TorqueConverterLocked && ModelData.Gears.ContainsKey(gear + 1) &&
+					ModelData.Gears[gear + 1].HasTorqueConverter && outAngularVelocity.IsGreater(0)) {
+					var result = CheckUpshiftTcTc(absTime, dt, outTorque, outAngularVelocity, gear, currentGear);
+					if (result.HasValue) {
+						return result.Value;
+					}
+				}
+			} else {
 
-			var nextGear = _gearbox.TorqueConverterLocked ? gear + 1 : gear;
 
-			var shiftSpeed = UpshiftLines[(int)gear].LookupShiftSpeed(
-				_loadStage, DataBus.RoadGradient, DataBus.DriverAcceleration, _accMin, _accMax);
-			var shiftSpeedGbxOut = shiftSpeed / ModelData.Gears[nextGear].Ratio;
-			if (outAngularVelocity > shiftSpeedGbxOut) {
-				Upshift(absTime, gear);
-				return true;
+				if (gear >= ModelData.Gears.Keys.Max()) {
+					return false;
+				}
+
+				var nextGear = _gearbox.TorqueConverterLocked ? gear + 1 : gear;
+
+				var shiftSpeed = UpshiftLines[(int)gear].LookupShiftSpeed(
+					_loadStage, DataBus.RoadGradient, DataBus.DriverAcceleration, _accMin, _accMax);
+				var shiftSpeedGbxOut = shiftSpeed / ModelData.Gears[nextGear].Ratio;
+				if (outAngularVelocity > shiftSpeedGbxOut) {
+					Upshift(absTime, gear);
+					return true;
+				}
 			}
 
 			return false;