diff --git a/VectoCore/VectoCore/Models/Simulation/Impl/PowertrainBuilder.cs b/VectoCore/VectoCore/Models/Simulation/Impl/PowertrainBuilder.cs
index b60112e7517895015751d995971f00b42b08fb2f..22fda1ad32151ccf707e87fddc8e92b22134ea43 100644
--- a/VectoCore/VectoCore/Models/Simulation/Impl/PowertrainBuilder.cs
+++ b/VectoCore/VectoCore/Models/Simulation/Impl/PowertrainBuilder.cs
@@ -67,6 +67,7 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl
 			Tuple.Create<GbxTypeList, string, string, StrategyCreator>( new GbxTypeList {GearboxType.AMT}, typeof(AMTShiftStrategyV2).FullName, AMTShiftStrategyV2.Name, (r, c) => new AMTShiftStrategyV2(r, c)),
 			Tuple.Create<GbxTypeList, string, string, StrategyCreator>( new GbxTypeList {GearboxType.ATPowerSplit, GearboxType.ATSerial}, typeof(ATShiftStrategy).FullName, ATShiftStrategy.Name, (r, c) => new ATShiftStrategy(r, c)),
 			Tuple.Create<GbxTypeList, string, string, StrategyCreator>( new GbxTypeList {GearboxType.ATPowerSplit, GearboxType.ATSerial}, typeof(ATShiftStrategyVoith).FullName, ATShiftStrategyVoith.Name, (r, c) => new ATShiftStrategyVoith(r, c)),
+			Tuple.Create<GbxTypeList, string, string, StrategyCreator>( new GbxTypeList {GearboxType.ATPowerSplit, GearboxType.ATSerial}, typeof(ATShiftStrategyOptimized).FullName, ATShiftStrategyOptimized.Name, (r, c) => new ATShiftStrategyOptimized(r, c)),
 		};
 
 		
@@ -437,10 +438,7 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl
 
 		private static IGearbox GetSimpleGearbox(IVehicleContainer container, VectoRunData runData)
 		{
-			if (runData.GearboxData.Type != GearboxType.AMT) {
-				throw new VectoException("SimplePowertrain only supports AMT gearbox!");
-			}
-			return new Gearbox(container, null, runData);
+			return runData.GearboxData.Type.AutomaticTransmission() ? (IGearbox) new ATGearbox(container, null, runData)  : new Gearbox(container, null, runData);
 		}
 
 		public static IEnumerable<Tuple<string, string>> GetRegisteredShiftStrategies(GearboxType? type)
diff --git a/VectoCore/VectoCore/Models/Simulation/Impl/VehicleContainer.cs b/VectoCore/VectoCore/Models/Simulation/Impl/VehicleContainer.cs
index 368d5154ca3feca4c8affe9bda3799c64b4a3039..b7747fe208273584aceeb9b5660c636fb36aa7ee 100644
--- a/VectoCore/VectoCore/Models/Simulation/Impl/VehicleContainer.cs
+++ b/VectoCore/VectoCore/Models/Simulation/Impl/VehicleContainer.cs
@@ -286,7 +286,7 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl
 			get { return ModData.FuelData.FuelType; }
 		}
 
-		public Second AbsTime { get; set; }
+		public virtual Second AbsTime { get; set; }
 
 		public void AddComponent(VectoSimulationComponent component)
 		{
diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/AMTShiftStrategyOptimized.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/AMTShiftStrategyOptimized.cs
index 6a87a6893009fa0c54c54ec7d3bf277834e93295..b9fdad187ef71fc038215cd000f8bcdaef11176b 100644
--- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/AMTShiftStrategyOptimized.cs
+++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/AMTShiftStrategyOptimized.cs
@@ -17,6 +17,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 		private Dictionary<uint, EngineFullLoadCurve> fld;
 		private ShiftStrategyParameters shiftStrategyParameters;
 		private SimplePowertrainContainer TestContainer;
+		private Gearbox TestContainerGbx;
 
 		public AMTShiftStrategyOptimized(VectoRunData runData, IDataBus dataBus) : base(runData, dataBus)
 		{
@@ -31,6 +32,10 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 			var builder = new PowertrainBuilder(modData);
 			TestContainer = new SimplePowertrainContainer(runData);
 			builder.BuildSimplePowertrain(runData, TestContainer);
+			TestContainerGbx = TestContainer.GearboxCtl as Gearbox;
+			if (TestContainerGbx == null) {
+				throw new VectoException("Unknown gearboxtype: {0}", TestContainer.GearboxCtl.GetType().FullName);
+			}
 		}
 
 		#region Overrides of AMTShiftStrategy
@@ -136,8 +141,8 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 		protected override ResponseDryRun RequestDryRunWithGear(
 			Second absTime, Second dt, NewtonMeter outTorque, PerSecond outAngularVelocity, uint tryNextGear)
 		{
-			TestContainer.GearboxCtl.Disengaged = false;
-			TestContainer.GearboxCtl.Gear = tryNextGear;
+			TestContainerGbx.Disengaged = false;
+			TestContainerGbx.Gear = tryNextGear;
 
 			TestContainer.GearboxOutPort.Initialize(outTorque, outAngularVelocity);
 			var response = (ResponseDryRun)TestContainer.GearboxOutPort.Request(
diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/AMTShiftStrategyV2.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/AMTShiftStrategyV2.cs
index f97266dc4eb58c1872a88e8688daa28b5a849858..ce3250d6a8dad3d94afbce9718e8eea197dade3f 100644
--- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/AMTShiftStrategyV2.cs
+++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/AMTShiftStrategyV2.cs
@@ -40,6 +40,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 		private MeterPerSecond demandedSpeed = 0.SI<MeterPerSecond>();
 		private MeterPerSquareSecond driverAccelerationAvg;
 		private Radian gradient = 0.SI<Radian>();
+		private Gearbox TestContainerGbx;
 
 		public struct HistoryEntry
 		{
@@ -73,6 +74,10 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 			var builder = new PowertrainBuilder(modData);
 			TestContainer = new SimplePowertrainContainer(data);
 			builder.BuildSimplePowertrain(data, TestContainer);
+			TestContainerGbx = TestContainer.GearboxCtl as Gearbox;
+			if (TestContainerGbx == null) {
+				throw new VectoException("Unknown gearboxtype: {0}", TestContainer.GearboxCtl.GetType().FullName);
+			}
 
 			// register pre-processors
 			var maxG = data.Cycle.Entries.Max(x => Math.Abs(x.RoadGradientPercent.Value())) + 1;
@@ -317,7 +322,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 			bool driveOff, uint gear, uint currentGear, Radian gradient, MeterPerSecond predictionVelocity,
 			MeterPerSecond velocityAfterGearshift, MeterPerSquareSecond accRsv, MeterPerSquareSecond driverAccelerationAvg)
 		{
-			TestContainer.GearboxCtl.Gear = gear;
+			TestContainerGbx.Gear = gear;
 			TestContainer.VehiclePort.Initialize(predictionVelocity, gradient);
 			
 			var respAccRsv = (ResponseDryRun)TestContainer.VehiclePort.Request(
@@ -498,7 +503,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 					i <= Math.Min(ModelData.Gears.Count, gear + ShiftStrategyParameters.AllowedGearRangeUp);
 					i++) {
 					var nextGear = (uint)i;
-					TestContainer.GearboxCtl.Gear = nextGear;
+					TestContainerGbx.Gear = nextGear;
 					var init = TestContainer.VehiclePort.Initialize(predictedVelocity, gradient);
 					if (init.EngineSpeed > GetEngineSpeedLimitLow(false) &&
 						init.EngineSpeed < upperEngineSpeedLimit) {
@@ -513,7 +518,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 					i >= Math.Max(1, gear + ShiftStrategyParameters.AllowedGearRangeDown);
 					i--) {
 					var nextGear = (uint)i;
-					TestContainer.GearboxCtl.Gear = nextGear;
+					TestContainerGbx.Gear = nextGear;
 					var init = TestContainer.VehiclePort.Initialize(predictedVelocity, gradient);
 					if (init.EngineSpeed > GetEngineSpeedLimitLow(false) &&
 						init.EngineSpeed < upperEngineSpeedLimit) {
@@ -649,7 +654,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 			var averageAccelerationTorque = AverageAccelerationTorqueLookup.Interpolate(
 				responseDriverDemand.EngineSpeed, responseDriverDemand.EngineTorqueDemand);
 
-			TestContainer.GearboxCtl.Gear = gear;
+			TestContainerGbx.Gear = gear;
 			var initResponse = TestContainer.VehiclePort.Initialize(vehicleSpeed, estimatedGradient);
 			var delta = initResponse.EngineTorqueDemand - averageAccelerationTorque;
 			var acceleration = SearchAlgorithm.Search(
diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/ATGearbox.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/ATGearbox.cs
index 41aea191c52f1bb79c0d1e23fa9fed6e3cda123c..be2627fa695700f2da82c46cc58de29aadb3220b 100644
--- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/ATGearbox.cs
+++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/ATGearbox.cs
@@ -64,7 +64,9 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 			: base(container, runData)
 		{
 			_strategy = strategy;
-			_strategy.Gearbox = this;
+			if (_strategy != null) {
+				_strategy.Gearbox = this;
+			}
 			LastShift = -double.MaxValue.SI<Second>();
 			TorqueConverter = new TorqueConverter(this, _strategy, container, ModelData.TorqueConverterData,
 				runData);
@@ -330,7 +332,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 				return response;
 			}
 			var retVal = NextComponent.Request(absTime, dt, inTorque, inAngularVelocity, dryRun);
-			if (!dryRun && retVal is ResponseSuccess &&
+			if (!dryRun && retVal is ResponseSuccess && _strategy != null &&
 				_strategy.ShiftRequired(absTime, dt, outTorque, outAngularVelocity, inTorque, inAngularVelocity, Gear,
 					LastShift, retVal)) {
 				retVal = new ResponseGearShift { Source = this };
@@ -412,7 +414,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 			container[ModalResultField.n_gbx_out_avg] = avgOutAngularSpeed;
 			container[ModalResultField.T_gbx_out] = CurrentState.OutTorque;
 
-			_strategy.WriteModalResults(container);
+			_strategy?.WriteModalResults(container);
 		}
 
 		protected override void DoCommitSimulationStep()
diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/ATShiftStrategy.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/ATShiftStrategy.cs
index f36cdde819e7fb2ef707265b94814980fa9331c8..bd028588c3cc3b8f0a9c631defd8eaf065777cfd 100644
--- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/ATShiftStrategy.cs
+++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/ATShiftStrategy.cs
@@ -232,9 +232,23 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 					return result.Value;
 				}
 			}
+
+			if (gear < ModelData.Gears.Keys.Max()) {
+				var earlyUpshift = CheckEarlyUpshift(
+					absTime, dt, outTorque, outAngularVelocity, inTorque, inAngularVelocity, gear, lastShiftTime);
+				if (earlyUpshift.HasValue) {
+					return earlyUpshift.Value;
+				}
+			}
+
 			return false;
 		}
 
+		protected virtual bool? CheckEarlyUpshift(Second absTime, Second dt, NewtonMeter outTorque, PerSecond outAngularVelocity, NewtonMeter inTorque, PerSecond inAngularVelocity, uint gear, Second lastShiftTime)
+		{
+			return null;
+		}
+
 		protected virtual bool? CheckUpshiftTcTc(Second absTime, Second dt, NewtonMeter outTorque, PerSecond outAngularVelocity, uint gear,
 			GearData currentGear)
 		{
@@ -374,9 +388,22 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 				}
 			}
 
+			if (gear > 1 || (gear == 1 && _gearbox.TorqueConverterLocked)) {
+				var earlyDownshift = CheckEarlyDownshift(
+					absTime, dt, outTorque, outAngularVelocity, inTorque, inAngularVelocity, gear, lastShiftTime);
+				if (earlyDownshift.HasValue) {
+					return earlyDownshift.Value;
+				}
+			}
+
 			return false;
 		}
 
+		protected virtual bool? CheckEarlyDownshift(Second absTime, Second dt, NewtonMeter outTorque, PerSecond outAngularVelocity, NewtonMeter inTorque, PerSecond inAngularVelocity, uint gear, Second lastShiftTime)
+		{
+			return null;
+		}
+
 		protected virtual void SetGear(NextGearState gbxState)
 		{
 			_gearbox.Gear = gbxState.Gear;
diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/ATShiftStrategyOptimized.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/ATShiftStrategyOptimized.cs
new file mode 100644
index 0000000000000000000000000000000000000000..774bd197dd7314347527a4ed20ad98a7ddbb0b27
--- /dev/null
+++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/ATShiftStrategyOptimized.cs
@@ -0,0 +1,141 @@
+using System.Collections.Generic;
+using TUGraz.VectoCommon.Exceptions;
+using TUGraz.VectoCommon.Utils;
+using TUGraz.VectoCore.Models.Connector.Ports.Impl;
+using TUGraz.VectoCore.Models.Simulation.Data;
+using TUGraz.VectoCore.Models.Simulation.DataBus;
+using TUGraz.VectoCore.Models.Simulation.Impl;
+using TUGraz.VectoCore.Models.SimulationComponent.Data.Engine;
+using TUGraz.VectoCore.OutputData;
+
+namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
+{
+
+
+	public class ATShiftStrategyOptimized : ATShiftStrategy
+	{
+		private FuelConsumptionMap fcMap;
+		private Dictionary<uint, EngineFullLoadCurve> fld;
+		private ShiftStrategyParameters shiftStrategyParameters;
+		private SimplePowertrainContainer TestContainer;
+		private ATGearbox TestContainerGbx;
+
+
+		public new static string Name
+		{
+			get { return "AT shift strategy w early upshift (FC-based)"; }
+		}
+
+		public ATShiftStrategyOptimized(VectoRunData runData, IDataBus dataBus) : base(runData, dataBus)
+		{
+			fcMap = runData.EngineData.ConsumptionMap;
+			fld = runData.EngineData.FullLoadCurves;
+			shiftStrategyParameters = runData.GearshiftParameters;
+			if (shiftStrategyParameters == null) {
+				throw new VectoException("Parameters for shift strategy missing!");
+			}
+
+			var modData = new ModalDataContainer(runData, null, null, false);
+			var builder = new PowertrainBuilder(modData);
+			TestContainer = new SimplePowertrainContainer(runData);
+			builder.BuildSimplePowertrain(runData, TestContainer);
+			TestContainerGbx = TestContainer.GearboxCtl as ATGearbox;
+			if (TestContainerGbx == null) {
+				throw new VectoException("Unknown gearboxtype: {0}", TestContainer.GearboxCtl.GetType().FullName);
+			}
+
+			
+		}
+
+		#region Overrides of ATShiftStrategy
+
+		protected override bool? CheckEarlyUpshift(
+			Second absTime, Second dt, NewtonMeter outTorque, PerSecond outAngularVelocity, NewtonMeter origInTorque,
+			PerSecond origInAngularVelocity, uint currentGear, Second lastShiftTime)
+		{
+			var tryNextGear = _gearbox.TorqueConverterLocked ? currentGear + 1 : currentGear;
+			if (!(ModelData.Gears[tryNextGear].Ratio <= shiftStrategyParameters.RatioEarlyDownshiftFC)) {
+				return null;
+			}
+
+			var response = RequestDryRunWithGear(absTime, dt, outTorque, outAngularVelocity, tryNextGear, true);
+
+			var inAngularVelocity = ModelData.Gears[tryNextGear].Ratio * outAngularVelocity;
+			var inTorque = response.EnginePowerRequest / inAngularVelocity;
+
+			// if next gear supplied enough power reserve: take it
+			// otherwise take
+			if (!ModelData.Gears[tryNextGear].ShiftPolygon.IsBelowDownshiftCurve(inTorque, inAngularVelocity)) {
+				var fullLoadPower = response.EnginePowerRequest - response.DeltaFullLoad;
+				var reserve = 1 - response.EnginePowerRequest / fullLoadPower;
+
+				var responseCurrent = RequestDryRunWithGear(absTime, dt, outTorque, outAngularVelocity, currentGear, _gearbox.TorqueConverterLocked);
+				var fcCurrent = fcMap.GetFuelConsumption(
+					responseCurrent.EngineTorqueDemand.LimitTo(
+						fld[currentGear].DragLoadStationaryTorque(responseCurrent.EngineSpeed),
+						fld[currentGear].FullLoadStationaryTorque(responseCurrent.EngineSpeed))
+					, responseCurrent.EngineSpeed);
+				var fcNext = fcMap.GetFuelConsumption(
+					response.EngineTorqueDemand.LimitTo(
+						fld[tryNextGear].DragLoadStationaryTorque(response.EngineSpeed),
+						fld[tryNextGear].FullLoadStationaryTorque(response.EngineSpeed)), response.EngineSpeed);
+
+				if (reserve >= ModelData.TorqueReserve && fcNext.Value.IsSmaller(fcCurrent.Value * shiftStrategyParameters.RatingFactorCurrentGear)) {
+					Upshift(absTime, currentGear);
+					return true;
+				}
+			}
+			return null;
+		}
+
+		protected override bool? CheckEarlyDownshift(
+			Second absTime, Second dt, NewtonMeter outTorque, PerSecond outAngularVelocity, NewtonMeter origInTorque,
+			PerSecond origInAngularVelocity, uint currentGear, Second lastShiftTime)
+		{
+			var tryNextGear = _gearbox.TorqueConverterLocked && currentGear == 1 ? currentGear : currentGear - 1;
+			var tryNextTc = currentGear == 1 && _gearbox.TorqueConverterLocked ? false : true;
+			if (!(ModelData.Gears[tryNextGear].Ratio < shiftStrategyParameters.RatioEarlyUpshiftFC)) {
+				return null;
+			}
+
+			var response = RequestDryRunWithGear(absTime, dt, outTorque, outAngularVelocity, tryNextGear, tryNextTc);
+
+			var inAngularVelocity = ModelData.Gears[tryNextGear].Ratio * outAngularVelocity;
+			var inTorque = response.EnginePowerRequest / inAngularVelocity;
+
+			if (!IsAboveUpShiftCurve(tryNextGear, inTorque, inAngularVelocity, tryNextTc)) {
+				var responseCurrent = RequestDryRunWithGear(absTime, dt, outTorque, outAngularVelocity, currentGear, _gearbox.TorqueConverterLocked);
+				var fcCurrent = fcMap.GetFuelConsumption(
+					responseCurrent.EngineTorqueDemand.LimitTo(
+						fld[currentGear].DragLoadStationaryTorque(responseCurrent.EngineSpeed),
+						fld[currentGear].FullLoadStationaryTorque(responseCurrent.EngineSpeed))
+					, responseCurrent.EngineSpeed);
+				var fcNext = fcMap.GetFuelConsumption(
+					response.EngineTorqueDemand.LimitTo(
+						fld[tryNextGear].DragLoadStationaryTorque(response.EngineSpeed),
+						fld[tryNextGear].FullLoadStationaryTorque(response.EngineSpeed)), response.EngineSpeed);
+
+				if (fcNext.Value.IsSmaller(fcCurrent.Value * shiftStrategyParameters.RatingFactorCurrentGear)) {
+					Downshift(absTime, currentGear);
+					return true;
+				}
+			}
+
+			return null;
+		}
+
+		#endregion
+
+		protected ResponseDryRun RequestDryRunWithGear(Second absTime, Second dt, NewtonMeter outTorque, PerSecond outAngularVelocity, uint tryNextGear, bool tcLocked)
+		{
+			TestContainerGbx.Disengaged = false;
+			TestContainerGbx.Gear = tryNextGear;
+			TestContainerGbx.TorqueConverterLocked = tcLocked;
+
+			TestContainer.GearboxOutPort.Initialize(outTorque, outAngularVelocity);
+			var response = (ResponseDryRun)TestContainer.GearboxOutPort.Request(
+				0.SI<Second>(), dt, outTorque, outAngularVelocity, true);
+			return response;
+		}
+	}
+}
diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/MaxCardanTorquePreprocessor.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/MaxCardanTorquePreprocessor.cs
index bc9d2d0461149fc664eefef4657eeb7c6f3666a6..02eba65806f972d19c0c877e7731e672d9f9507a 100644
--- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/MaxCardanTorquePreprocessor.cs
+++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/MaxCardanTorquePreprocessor.cs
@@ -1,4 +1,5 @@
 using System.Collections.Generic;
+using TUGraz.VectoCommon.Exceptions;
 using TUGraz.VectoCommon.Utils;
 using TUGraz.VectoCore.Models.Connector.Ports.Impl;
 using TUGraz.VectoCore.Models.Simulation;
@@ -25,7 +26,12 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl {
 		{
 			var retVal = new Dictionary<uint, List<KeyValuePair<PerSecond, NewtonMeter>>>(Data.GearboxData.Gears.Count);
 
-			TestContainer.GearboxCtl.Gear = 1;
+			var testContainerGbx = TestContainer.GearboxCtl as Gearbox;
+			if (testContainerGbx == null) {
+				throw new VectoException("Unknown gearboxtype: {0}", TestContainer.GearboxCtl.GetType().FullName);
+			}
+
+			testContainerGbx.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>();
 
@@ -33,7 +39,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl {
 
 			foreach (var gearData in Data.GearboxData.Gears) {
 				retVal[gearData.Key] = new List<KeyValuePair<PerSecond, NewtonMeter>>();
-				TestContainer.GearboxCtl.Gear = gearData.Key;
+				testContainerGbx.Gear = gearData.Key;
 				for (var engineSpeed = Data.EngineData.IdleSpeed;
 					engineSpeed < Data.EngineData.FullLoadCurves[0].N95hSpeed;
 					engineSpeed += engineSpeedSteps) {
diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/SimplePowertrainContainer.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/SimplePowertrainContainer.cs
index 2817bc38befeecb48da848a470a5baa722524de6..178defe6e1b6f809a1437cd5c4afd829c4199174 100644
--- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/SimplePowertrainContainer.cs
+++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/SimplePowertrainContainer.cs
@@ -1,4 +1,5 @@
-using TUGraz.VectoCore.Models.Connector.Ports;
+using TUGraz.VectoCommon.Utils;
+using TUGraz.VectoCore.Models.Connector.Ports;
 using TUGraz.VectoCore.Models.Simulation.Data;
 using TUGraz.VectoCore.Models.Simulation.Impl;
 using TUGraz.VectoCore.OutputData;
@@ -18,12 +19,14 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl {
 
 		public ITnOutPort GearboxOutPort
 		{
-			get { return (Gearbox as Gearbox)?.OutPort(); }
+			get { return (Gearbox as IGearbox)?.OutPort(); }
 		}
 
-		public Gearbox GearboxCtl
+		public IGearbox GearboxCtl
 		{
-			get { return Gearbox as Gearbox; }
+			get { return Gearbox as IGearbox; }
 		}
+
+		public override Second AbsTime { get { return 0.SI<Second>(); } }
 	}
 }
\ No newline at end of file
diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/TorqueConverter.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/TorqueConverter.cs
index e4822cd61e7bb0e9b60b6a7255151459e19b03ab..290698ed65a011bbb699ab25c4a700f88eba82d5 100644
--- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/TorqueConverter.cs
+++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/TorqueConverter.cs
@@ -131,9 +131,9 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 			// check if shift is required
 			var ratio = Gearbox.GetGearData(Gearbox.Gear).TorqueConverterRatio;
 			if (absTime > DataBus.LastShift && retVal is ResponseSuccess) {
-				var shiftRequired = ShiftStrategy.ShiftRequired(
+				var shiftRequired = ShiftStrategy?.ShiftRequired(
 					absTime, dt, outTorque * ratio, outAngularVelocity / ratio, inTorque,
-					operatingPoint.InAngularVelocity, Gearbox.Gear, Gearbox.LastShift, retVal);
+					operatingPoint.InAngularVelocity, Gearbox.Gear, Gearbox.LastShift, retVal) ?? false;
 				return shiftRequired ? new ResponseGearShift { Source = this } : retVal;
 			}
 
@@ -170,7 +170,10 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 					Source = this,
 					DeltaFullLoad = delta,
 					DeltaDragLoad = delta,
-					TorqueConverterOperatingPoint = operatingPoint
+					TorqueConverterOperatingPoint = operatingPoint,
+					EngineTorqueDemand = inTorque,
+					EngineSpeed = engineResponse.EngineSpeed,
+					EnginePowerRequest = engineResponse.EnginePowerRequest
 				};
 			}
 
@@ -196,7 +199,10 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 				Source = this,
 				DeltaFullLoad = 10 * deltaMax,
 				DeltaDragLoad = 10 * deltaMin,
-				TorqueConverterOperatingPoint = dryOperatingPointMax
+				TorqueConverterOperatingPoint = dryOperatingPointMax,
+				EngineTorqueDemand = inTorque,
+				EngineSpeed = dryOperatingPointMax?.InAngularVelocity ?? dryOperatingPointMin?.InAngularVelocity ?? 0.RPMtoRad(),
+				EnginePowerRequest = engineResponse.EnginePowerRequest
 			};
 		}
 
diff --git a/VectoCore/VectoCore/VectoCore.csproj b/VectoCore/VectoCore/VectoCore.csproj
index 92cc4c1854192386d1744b8d215baeceee41e3b7..66c5df00504b2a3fea9284a0871356d17f4e9cd7 100644
--- a/VectoCore/VectoCore/VectoCore.csproj
+++ b/VectoCore/VectoCore/VectoCore.csproj
@@ -209,6 +209,7 @@
     <Compile Include="Models\SimulationComponent\Impl\ATGearbox.cs" />
     <Compile Include="Models\SimulationComponent\Impl\ATShiftStrategy.cs" />
     <Compile Include="Models\SimulationComponent\Data\ShiftStrategy\AverageAccelerationTorqueLookup.cs" />
+    <Compile Include="Models\SimulationComponent\Impl\ATShiftStrategyOptimized.cs" />
     <Compile Include="Models\SimulationComponent\Impl\ATShiftStrategyVoith.cs" />
     <Compile Include="Models\SimulationComponent\Impl\AverageAccelerationTorquePreprocessor.cs" />
     <Compile Include="Models\SimulationComponent\Impl\BaseShiftStrategy.cs" />
diff --git a/VectoCore/VectoCoreTest/Models/Simulation/ShiftStrategyV2Test.cs b/VectoCore/VectoCoreTest/Models/Simulation/ShiftStrategyV2Test.cs
index f3372bfea2173cb8a3f7fff70d989f4200f529ca..259ba83a81613032c0a33388c1bb7894cc5ec56f 100644
--- a/VectoCore/VectoCoreTest/Models/Simulation/ShiftStrategyV2Test.cs
+++ b/VectoCore/VectoCoreTest/Models/Simulation/ShiftStrategyV2Test.cs
@@ -296,13 +296,20 @@ namespace TUGraz.VectoCore.Tests.Models.Simulation
 		}
 
 
-		[TestCase(@"TestData\Integration\ShiftStrategyV2\CityBus_AT\CityBus_AT_PS.vecto"),
-		TestCase(@"TestData\Integration\ShiftStrategyV2\CityBus_AT\CityBus_AT_Ser.vecto")]
+		[TestCase(@"TestData\Integration\ShiftStrategyV2\CityBus_AT_GSVoith\CityBus_AT_PS.vecto"),
+		TestCase(@"TestData\Integration\ShiftStrategyV2\CityBus_AT_GSVoith\CityBus_AT_Ser.vecto")]
 		public void RunEngineeringVoith(string jobName)
 		{
 			RunJob_Engineering(jobName);
 		}
 
+		[TestCase(@"TestData\Integration\ShiftStrategyV2\CityBus_AT_FCOpt\CityBus_AT_PS.vecto"),
+		TestCase(@"TestData\Integration\ShiftStrategyV2\CityBus_AT_FCOpt\CityBus_AT_Ser.vecto")]
+		public void RunEngineeringFCoptimized(string jobName)
+		{
+			RunJob_Engineering(jobName);
+		}
+
 
 		[TestCase(@"J:\TE-Em\Projekte\I_2017_24_VECTO_Erweiterungen_2018ff\Arbeitsordner\GearshiftModel\AMT\Overdrive\Scania\FC based DECL\Scania w overdrive transm.vecto", 1)]
 		public void RunDeclaration(string jobName, int runIdx)
diff --git a/VectoCore/VectoCoreTest/VectoCoreTest.csproj b/VectoCore/VectoCoreTest/VectoCoreTest.csproj
index 1476d8af2fc230dd8e6753e45d82e45ba2bfb062..58c58e9cf95a70ecc0b58fcd19a9572291bd8057 100644
--- a/VectoCore/VectoCoreTest/VectoCoreTest.csproj
+++ b/VectoCore/VectoCoreTest/VectoCoreTest.csproj
@@ -222,76 +222,145 @@
     <None Include="TestData\Components\GearshiftLinesVoith.vgsv">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </None>
-    <None Include="TestData\Integration\ShiftStrategyV2\CityBus_AT\175kW.vfld">
+    <None Include="TestData\Integration\ShiftStrategyV2\CityBus_AT_FCOpt\175kW.vfld">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </None>
-    <None Include="TestData\Integration\ShiftStrategyV2\CityBus_AT\175kW.vmap">
+    <None Include="TestData\Integration\ShiftStrategyV2\CityBus_AT_FCOpt\175kW.vmap">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </None>
-    <None Include="TestData\Integration\ShiftStrategyV2\CityBus_AT\AccelerationReserveLookup.csv">
+    <None Include="TestData\Integration\ShiftStrategyV2\CityBus_AT_FCOpt\AccelerationReserveLookup.csv">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </None>
-    <None Include="TestData\Integration\ShiftStrategyV2\CityBus_AT\AT-Shift.vgbs">
+    <None Include="TestData\Integration\ShiftStrategyV2\CityBus_AT_FCOpt\AT-Shift.vgbs">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </None>
-    <None Include="TestData\Integration\ShiftStrategyV2\CityBus_AT\CityBus_AT_PS.vecto">
+    <None Include="TestData\Integration\ShiftStrategyV2\CityBus_AT_FCOpt\CityBus_AT_PS.vecto">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </None>
-    <None Include="TestData\Integration\ShiftStrategyV2\CityBus_AT\CityBus_AT_PS.vveh">
+    <None Include="TestData\Integration\ShiftStrategyV2\CityBus_AT_FCOpt\CityBus_AT_PS.vveh">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </None>
-    <None Include="TestData\Integration\ShiftStrategyV2\CityBus_AT\CityBus_AT_Ser.vecto">
+    <None Include="TestData\Integration\ShiftStrategyV2\CityBus_AT_FCOpt\CityBus_AT_Ser.vecto">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </None>
-    <None Include="TestData\Integration\ShiftStrategyV2\CityBus_AT\CityBus_AT_Ser.vveh">
+    <None Include="TestData\Integration\ShiftStrategyV2\CityBus_AT_FCOpt\CityBus_AT_Ser.vveh">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </None>
-    <None Include="TestData\Integration\ShiftStrategyV2\CityBus_AT\Driver.vacc">
+    <None Include="TestData\Integration\ShiftStrategyV2\CityBus_AT_FCOpt\Driver.vacc">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </None>
-    <None Include="TestData\Integration\ShiftStrategyV2\CityBus_AT\Engine_175kW_6.8l.veng">
+    <None Include="TestData\Integration\ShiftStrategyV2\CityBus_AT_FCOpt\Engine_175kW_6.8l.veng">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </None>
-    <None Include="TestData\Integration\ShiftStrategyV2\CityBus_AT\GearboxPowerSplit.vgbx">
+    <None Include="TestData\Integration\ShiftStrategyV2\CityBus_AT_FCOpt\GearboxPowerSplit.vgbx">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </None>
-    <None Include="TestData\Integration\ShiftStrategyV2\CityBus_AT\GearboxSerial.vgbx">
+    <None Include="TestData\Integration\ShiftStrategyV2\CityBus_AT_FCOpt\GearboxSerial.vgbx">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </None>
-    <None Include="TestData\Integration\ShiftStrategyV2\CityBus_AT\GearshiftLinesVoith.vgsv">
+    <None Include="TestData\Integration\ShiftStrategyV2\CityBus_AT_GSVoith\GearshiftLinesVoith.vgsv">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </None>
-    <None Include="TestData\Integration\ShiftStrategyV2\CityBus_AT\Interurban.vdri">
+    <None Include="TestData\Integration\ShiftStrategyV2\CityBus_AT_FCOpt\Interurban.vdri">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </None>
-    <None Include="TestData\Integration\ShiftStrategyV2\CityBus_AT\PredictionTimeLookup.csv">
+    <None Include="TestData\Integration\ShiftStrategyV2\CityBus_AT_FCOpt\PredictionTimeLookup.csv">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </None>
-    <None Include="TestData\Integration\ShiftStrategyV2\CityBus_AT\RegionalDelivery.vdri">
+    <None Include="TestData\Integration\ShiftStrategyV2\CityBus_AT_FCOpt\RegionalDelivery.vdri">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </None>
-    <None Include="TestData\Integration\ShiftStrategyV2\CityBus_AT\ShareEngineSpeedHigh.csv">
+    <None Include="TestData\Integration\ShiftStrategyV2\CityBus_AT_FCOpt\ShareEngineSpeedHigh.csv">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </None>
-    <None Include="TestData\Integration\ShiftStrategyV2\CityBus_AT\ShareIdleLow.csv">
+    <None Include="TestData\Integration\ShiftStrategyV2\CityBus_AT_FCOpt\ShareIdleLow.csv">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </None>
-    <None Include="TestData\Integration\ShiftStrategyV2\CityBus_AT\ShareTq99L.csv">
+    <None Include="TestData\Integration\ShiftStrategyV2\CityBus_AT_FCOpt\ShareTq99L.csv">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </None>
-    <None Include="TestData\Integration\ShiftStrategyV2\CityBus_AT\ShiftParameters.vtcu">
+    <None Include="TestData\Integration\ShiftStrategyV2\CityBus_AT_FCOpt\ShiftParameters.vtcu">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </None>
-    <None Include="TestData\Integration\ShiftStrategyV2\CityBus_AT\TorqueConverter.vtcc">
+    <None Include="TestData\Integration\ShiftStrategyV2\CityBus_AT_FCOpt\TorqueConverter.vtcc">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </None>
-    <None Include="TestData\Integration\ShiftStrategyV2\CityBus_AT\TorqueConverterPowerSplit.vtcc">
+    <None Include="TestData\Integration\ShiftStrategyV2\CityBus_AT_FCOpt\TorqueConverterPowerSplit.vtcc">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </None>
-    <None Include="TestData\Integration\ShiftStrategyV2\CityBus_AT\Urban.vdri">
+    <None Include="TestData\Integration\ShiftStrategyV2\CityBus_AT_FCOpt\Urban.vdri">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </None>
-    <None Include="TestData\Integration\ShiftStrategyV2\CityBus_AT\UrbanDelivery.vdri">
+    <None Include="TestData\Integration\ShiftStrategyV2\CityBus_AT_FCOpt\UrbanDelivery.vdri">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="TestData\Integration\ShiftStrategyV2\CityBus_AT_GSVoith\175kW.vfld">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="TestData\Integration\ShiftStrategyV2\CityBus_AT_GSVoith\175kW.vmap">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="TestData\Integration\ShiftStrategyV2\CityBus_AT_GSVoith\AccelerationReserveLookup.csv">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="TestData\Integration\ShiftStrategyV2\CityBus_AT_GSVoith\AT-Shift.vgbs">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="TestData\Integration\ShiftStrategyV2\CityBus_AT_GSVoith\CityBus_AT_PS.vecto">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="TestData\Integration\ShiftStrategyV2\CityBus_AT_GSVoith\CityBus_AT_PS.vveh">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="TestData\Integration\ShiftStrategyV2\CityBus_AT_GSVoith\CityBus_AT_Ser.vecto">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="TestData\Integration\ShiftStrategyV2\CityBus_AT_GSVoith\CityBus_AT_Ser.vveh">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="TestData\Integration\ShiftStrategyV2\CityBus_AT_GSVoith\Driver.vacc">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="TestData\Integration\ShiftStrategyV2\CityBus_AT_GSVoith\Engine_175kW_6.8l.veng">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="TestData\Integration\ShiftStrategyV2\CityBus_AT_GSVoith\GearboxPowerSplit.vgbx">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="TestData\Integration\ShiftStrategyV2\CityBus_AT_GSVoith\GearboxSerial.vgbx">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="TestData\Integration\ShiftStrategyV2\CityBus_AT_GSVoith\Interurban.vdri">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="TestData\Integration\ShiftStrategyV2\CityBus_AT_GSVoith\PredictionTimeLookup.csv">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="TestData\Integration\ShiftStrategyV2\CityBus_AT_GSVoith\RegionalDelivery.vdri">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="TestData\Integration\ShiftStrategyV2\CityBus_AT_GSVoith\ShareEngineSpeedHigh.csv">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="TestData\Integration\ShiftStrategyV2\CityBus_AT_GSVoith\ShareIdleLow.csv">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="TestData\Integration\ShiftStrategyV2\CityBus_AT_GSVoith\ShareTq99L.csv">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="TestData\Integration\ShiftStrategyV2\CityBus_AT_GSVoith\ShiftParameters.vtcu">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="TestData\Integration\ShiftStrategyV2\CityBus_AT_GSVoith\TorqueConverter.vtcc">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="TestData\Integration\ShiftStrategyV2\CityBus_AT_GSVoith\TorqueConverterPowerSplit.vtcc">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="TestData\Integration\ShiftStrategyV2\CityBus_AT_GSVoith\Urban.vdri">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="TestData\Integration\ShiftStrategyV2\CityBus_AT_GSVoith\UrbanDelivery.vdri">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </None>
     <None Include="TestData\Integration\ShiftStrategyV2\Class5_Tractor_4x2\325kW.vfld">