diff --git a/VECTO.sln b/VECTO.sln
index 698a2d252080f3d6aeba22ad86baada06fe04562..5f00660e5d09ac468df68b64be6517f324be2e56 100644
--- a/VECTO.sln
+++ b/VECTO.sln
@@ -682,6 +682,48 @@ Global
 		{33F9848E-9257-4BE2-915F-68E748AEB204}.ReleaseTUG|Any CPU.Build.0 = Release|Any CPU
 		{33F9848E-9257-4BE2-915F-68E748AEB204}.ReleaseTUG|x64.ActiveCfg = Release|Any CPU
 		{33F9848E-9257-4BE2-915F-68E748AEB204}.ReleaseTUG|x86.ActiveCfg = Release|Any CPU
+		{EF99431D-4227-44C3-B2BD-DE8AE3E672CA}.Debug PerformanceStats|Any CPU.ActiveCfg = Debug|Any CPU
+		{EF99431D-4227-44C3-B2BD-DE8AE3E672CA}.Debug PerformanceStats|Any CPU.Build.0 = Debug|Any CPU
+		{EF99431D-4227-44C3-B2BD-DE8AE3E672CA}.Debug PerformanceStats|x64.ActiveCfg = Debug|Any CPU
+		{EF99431D-4227-44C3-B2BD-DE8AE3E672CA}.Debug PerformanceStats|x64.Build.0 = Debug|Any CPU
+		{EF99431D-4227-44C3-B2BD-DE8AE3E672CA}.Debug PerformanceStats|x86.ActiveCfg = Debug|Any CPU
+		{EF99431D-4227-44C3-B2BD-DE8AE3E672CA}.Debug PerformanceStats|x86.Build.0 = Debug|Any CPU
+		{EF99431D-4227-44C3-B2BD-DE8AE3E672CA}.Debug PerformanceTrace|Any CPU.ActiveCfg = Debug|Any CPU
+		{EF99431D-4227-44C3-B2BD-DE8AE3E672CA}.Debug PerformanceTrace|Any CPU.Build.0 = Debug|Any CPU
+		{EF99431D-4227-44C3-B2BD-DE8AE3E672CA}.Debug PerformanceTrace|x64.ActiveCfg = Debug|Any CPU
+		{EF99431D-4227-44C3-B2BD-DE8AE3E672CA}.Debug PerformanceTrace|x64.Build.0 = Debug|Any CPU
+		{EF99431D-4227-44C3-B2BD-DE8AE3E672CA}.Debug PerformanceTrace|x86.ActiveCfg = Debug|Any CPU
+		{EF99431D-4227-44C3-B2BD-DE8AE3E672CA}.Debug PerformanceTrace|x86.Build.0 = Debug|Any CPU
+		{EF99431D-4227-44C3-B2BD-DE8AE3E672CA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{EF99431D-4227-44C3-B2BD-DE8AE3E672CA}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{EF99431D-4227-44C3-B2BD-DE8AE3E672CA}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{EF99431D-4227-44C3-B2BD-DE8AE3E672CA}.Debug|x64.Build.0 = Debug|Any CPU
+		{EF99431D-4227-44C3-B2BD-DE8AE3E672CA}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{EF99431D-4227-44C3-B2BD-DE8AE3E672CA}.Debug|x86.Build.0 = Debug|Any CPU
+		{EF99431D-4227-44C3-B2BD-DE8AE3E672CA}.DebugTUG|Any CPU.ActiveCfg = Debug|Any CPU
+		{EF99431D-4227-44C3-B2BD-DE8AE3E672CA}.DebugTUG|Any CPU.Build.0 = Debug|Any CPU
+		{EF99431D-4227-44C3-B2BD-DE8AE3E672CA}.DebugTUG|x64.ActiveCfg = Debug|Any CPU
+		{EF99431D-4227-44C3-B2BD-DE8AE3E672CA}.DebugTUG|x64.Build.0 = Debug|Any CPU
+		{EF99431D-4227-44C3-B2BD-DE8AE3E672CA}.DebugTUG|x86.ActiveCfg = Debug|Any CPU
+		{EF99431D-4227-44C3-B2BD-DE8AE3E672CA}.DebugTUG|x86.Build.0 = Debug|Any CPU
+		{EF99431D-4227-44C3-B2BD-DE8AE3E672CA}.Deploy|Any CPU.ActiveCfg = Debug|Any CPU
+		{EF99431D-4227-44C3-B2BD-DE8AE3E672CA}.Deploy|Any CPU.Build.0 = Debug|Any CPU
+		{EF99431D-4227-44C3-B2BD-DE8AE3E672CA}.Deploy|x64.ActiveCfg = Debug|Any CPU
+		{EF99431D-4227-44C3-B2BD-DE8AE3E672CA}.Deploy|x64.Build.0 = Debug|Any CPU
+		{EF99431D-4227-44C3-B2BD-DE8AE3E672CA}.Deploy|x86.ActiveCfg = Debug|Any CPU
+		{EF99431D-4227-44C3-B2BD-DE8AE3E672CA}.Deploy|x86.Build.0 = Debug|Any CPU
+		{EF99431D-4227-44C3-B2BD-DE8AE3E672CA}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{EF99431D-4227-44C3-B2BD-DE8AE3E672CA}.Release|Any CPU.Build.0 = Release|Any CPU
+		{EF99431D-4227-44C3-B2BD-DE8AE3E672CA}.Release|x64.ActiveCfg = Release|Any CPU
+		{EF99431D-4227-44C3-B2BD-DE8AE3E672CA}.Release|x64.Build.0 = Release|Any CPU
+		{EF99431D-4227-44C3-B2BD-DE8AE3E672CA}.Release|x86.ActiveCfg = Release|Any CPU
+		{EF99431D-4227-44C3-B2BD-DE8AE3E672CA}.Release|x86.Build.0 = Release|Any CPU
+		{EF99431D-4227-44C3-B2BD-DE8AE3E672CA}.ReleaseTUG|Any CPU.ActiveCfg = Release|Any CPU
+		{EF99431D-4227-44C3-B2BD-DE8AE3E672CA}.ReleaseTUG|Any CPU.Build.0 = Release|Any CPU
+		{EF99431D-4227-44C3-B2BD-DE8AE3E672CA}.ReleaseTUG|x64.ActiveCfg = Release|Any CPU
+		{EF99431D-4227-44C3-B2BD-DE8AE3E672CA}.ReleaseTUG|x64.Build.0 = Release|Any CPU
+		{EF99431D-4227-44C3-B2BD-DE8AE3E672CA}.ReleaseTUG|x86.ActiveCfg = Release|Any CPU
+		{EF99431D-4227-44C3-B2BD-DE8AE3E672CA}.ReleaseTUG|x86.Build.0 = Release|Any CPU
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE
@@ -705,5 +747,6 @@ Global
 		{7C364099-9B85-473A-8A42-BBEBE4798FF5} = {CC93EA68-F3FE-4BCB-9292-1101F94A4D09}
 		{B673E12F-D323-4C4C-8805-9915B2C72D3D} = {73A5BF70-6168-456F-95E5-A1402BFA488C}
 		{760C1C5B-A767-463E-BA85-F0BCFC23A550} = {73A5BF70-6168-456F-95E5-A1402BFA488C}
+		{EF99431D-4227-44C3-B2BD-DE8AE3E672CA} = {CC93EA68-F3FE-4BCB-9292-1101F94A4D09}
 	EndGlobalSection
 EndGlobal
diff --git a/VECTOAux/VectoAuxiliariesTests/VectoAuxiliariesTests.vbproj b/VECTOAux/VectoAuxiliariesTests/VectoAuxiliariesTests.vbproj
index 625ae6cc108fd7ba0f2c78a68f722c14d1bcf530..427e091eff69251b6acc3adcad1ce953ad357408 100644
--- a/VECTOAux/VectoAuxiliariesTests/VectoAuxiliariesTests.vbproj
+++ b/VECTOAux/VectoAuxiliariesTests/VectoAuxiliariesTests.vbproj
@@ -62,7 +62,6 @@
     <OptionInfer>On</OptionInfer>
   </PropertyGroup>
   <ItemGroup>
-    <Reference Include="DocumentFormat.OpenXml, Version=2.5.5631.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" />
     <Reference Include="Microsoft.VisualStudio.QualityTools.UnitTestFramework, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" />
     <Reference Include="Moq">
       <HintPath>..\..\packages\Moq.4.2.1510.2205\lib\net40\Moq.dll</HintPath>
diff --git a/VectoCommon/VectoHashingTest/VectoHashTest.cs b/VectoCommon/VectoHashingTest/VectoHashTest.cs
index aa08450c89b11cabec12b99d3a8ddcabd61b4f1a..67dc3fc197486c17a8207510d7e0e3789fe367a5 100644
--- a/VectoCommon/VectoHashingTest/VectoHashTest.cs
+++ b/VectoCommon/VectoHashingTest/VectoHashTest.cs
@@ -34,8 +34,6 @@ using System.IO;
 using System.Linq;
 using System.Text;
 using System.Xml;
-using System.Xml.Linq;
-using System.Xml.Schema;
 using System.Xml.XPath;
 using NUnit.Framework;
 using TUGraz.VectoCommon.Hashing;
@@ -332,13 +330,13 @@ namespace VectoHashingTest
 			var input = new XmlDocument();
 			input.Load(file);
 			var dateNode = input.SelectSingleNode("//*[local-name()='Date']");
-			var date = XmlConvert.ToDateTime(dateNode.FirstChild.Value);
+			var date = XmlConvert.ToDateTime(dateNode.FirstChild.Value, XmlDateTimeSerializationMode.Utc);
 
 			var h = VectoHash.Load(input);
 			var r = h.AddHash();
 
 			var newDateNode = r.XPathSelectElement("//*[local-name()='Date']");
-			var newDate = XmlConvert.ToDateTime(newDateNode.Value);
+			var newDate = XmlConvert.ToDateTime(newDateNode.Value, XmlDateTimeSerializationMode.Utc);
 
 			var now = DateTime.Now;
 
diff --git a/VectoCore/VectoCore/Models/Connector/Ports/Impl/Response.cs b/VectoCore/VectoCore/Models/Connector/Ports/Impl/Response.cs
index e9719ca52f0282002afac1a50256dfb0ef8ed7a9..8e5812da52eb2e227e37f8450c1466b346f07523 100644
--- a/VectoCore/VectoCore/Models/Connector/Ports/Impl/Response.cs
+++ b/VectoCore/VectoCore/Models/Connector/Ports/Impl/Response.cs
@@ -99,7 +99,10 @@ namespace TUGraz.VectoCore.Models.Connector.Ports.Impl
 	/// <summary>
 	/// Response when the Speed Limit was exceeded.
 	/// </summary>
-	public class ResponseSpeedLimitExceeded : AbstractResponse {}
+	public class ResponseSpeedLimitExceeded : AbstractResponse
+	{
+		public ResponseSpeedLimitExceeded() { }
+	}
 
 	/// <summary>
 	/// Response when the request should have another time interval.
diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Data/Gearbox/TorqueConverterData.cs b/VectoCore/VectoCore/Models/SimulationComponent/Data/Gearbox/TorqueConverterData.cs
index 1ae06d4292336e3d30adcad0f5106f83446e375b..8a64b72387c809f0c0e1120aba1e022e85601d8a 100644
--- a/VectoCore/VectoCore/Models/SimulationComponent/Data/Gearbox/TorqueConverterData.cs
+++ b/VectoCore/VectoCore/Models/SimulationComponent/Data/Gearbox/TorqueConverterData.cs
@@ -262,7 +262,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data.Gearbox
 				var mpEdge = Edge.Create(new Point(segment.Item1.SpeedRatio, segment.Item1.Torque.Value()),
 					new Point(segment.Item2.SpeedRatio, segment.Item2.Torque.Value()));
 
-				
+
 				// Torque Converter: M_P1000 = k * n_out / n_in + d
 				//                   T_out = M_P1000 * (n_in / 1000rpm)^2 = (k * n_out / n_in + d) * (n_in / c)^2
 				// P_eng_out = P_eng_inertia + P_TC_in_avg
@@ -277,7 +277,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data.Gearbox
 						previousPowerTC / 2;
 				var sol = VectoMath.CubicEquationSolver(a.Value(), b.Value(), c, d.Value());
 				//============================================================================
-				
+
 
 				/*
 				// Torque Converter: M_P1000 = k * n_out / n_in + d
@@ -287,16 +287,16 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data.Gearbox
 				// P_TC_in_avg = n_in_2 (T_in_1 * n_in_1 + T_in_2 * n_in_2) / (n_in_1 + n_in_2)
 				// (index _1: beginning of simulation interval, index _2: end of simulation interval)
 				// => solve for n_in
+				*/
+				//var a = 2 * mpEdge.OffsetXY.SI<NewtonMeter>() * dt / (mpNorm * mpNorm);
+				//var b = inertia + 2 * dt * nextOutputSpeed * mpEdge.SlopeXY.SI<NewtonMeter>() / (mpNorm * mpNorm);
+				//var c = prevInputSpeed * inertia;
+				//var d = 2 * dt * previousPowerTC - inertia * prevInputSpeed * prevInputSpeed - 2 * dt * enginePower;
+				//var e = - inertia * prevInputSpeed * prevInputSpeed * prevInputSpeed - 2 * dt * prevInputSpeed * enginePower;
 
-				var a = 2 * mpEdge.OffsetXY.SI<NewtonMeter>() * dt / (mpNorm * mpNorm);
-				var b = inertia + 2 * dt * nextOutputSpeed * mpEdge.SlopeXY.SI<NewtonMeter>() / (mpNorm * mpNorm);
-				var c = prevInputSpeed * inertia;
-				var d = 2 * dt * previousPowerTC - inertia * prevInputSpeed * prevInputSpeed - 2 * dt * enginePower;
-				var e = - inertia * prevInputSpeed * prevInputSpeed * prevInputSpeed - 2 * dt * prevInputSpeed * enginePower;
-
-				var sol = VectoMath.Polynom4Solver(a.Value(), b.Value(), c.Value(), d.Value(), e.Value());
+				//var sol = VectoMath.Polynom4Solver(a.Value(), b.Value(), c.Value(), d.Value(), e.Value());
 				//============================================================================
-				*/
+				
 
 				// T_eng_o_2 + T_eng_I + T_aux - T_max) (n_in_1 + n_in_2) / 2 = 0
 				//var a = dt * mpEdge.OffsetXY.SI<NewtonMeter>() / (mpNorm * mpNorm);
diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/DefaultDriverStrategy.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/DefaultDriverStrategy.cs
index d38d385e4af9aebdf76f2cbe98fdbafa6a80ae19..e4bd52449eb26fa652920110b99b5894f22ff5cd 100644
--- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/DefaultDriverStrategy.cs
+++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/DefaultDriverStrategy.cs
@@ -452,6 +452,9 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 			var second = first;
 			first.Switch().
 				Case<ResponseUnderload>(r => {
+					if (DataBus.GearboxType.AutomaticTransmission() && !DataBus.ClutchClosed(absTime)) {
+						second = Driver.DrivingActionRoll(absTime, ds, velocity, gradient);
+					}
 					if (DataBus.VehicleSpeed.IsGreater(0) && DriverStrategy.OverspeedAllowed(targetVelocity, prohibitOverspeed)) {
 						second = Driver.DrivingActionCoast(absTime, ds, velocity, gradient);
 						debug.Add(new { action = "first:(Underload & Overspeed)-> Coast", second });
diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/TorqueConverter.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/TorqueConverter.cs
index 932bf48a6c8a847bcb2fd070c3b768406686a2ec..f9ae4a14963bb5c3355563139bf1421d5ee189f0 100644
--- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/TorqueConverter.cs
+++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/TorqueConverter.cs
@@ -98,7 +98,11 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 		{
 			var operatingPoint = FindOperatingPoint(outTorque, outAngularVelocity);
 			var avgEngineSpeed = (PreviousState.InAngularVelocity + operatingPoint.InAngularVelocity) / 2;
-			var avgPower = (PreviousState.InAngularVelocity * PreviousState.InTorque +
+			//var prevInSpeed = PreviousState.OperatingPoint?.InAngularVelocity ?? PreviousState.InAngularVelocity;
+			//var prevInTorque = PreviousState.OperatingPoint?.InTorque ?? PreviousState.InTorque;
+			var prevInSpeed = PreviousState.InAngularVelocity;
+			var prevInTorque = PreviousState.InTorque;
+			var avgPower = (prevInSpeed * prevInTorque +
 							operatingPoint.InAngularVelocity * operatingPoint.InTorque) / 2;
 			var inTorque = avgPower / avgEngineSpeed;
 
@@ -127,7 +131,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 
 			// check if shift is required
 			var ratio = Gearbox.GetGearData(Gearbox.Gear).TorqueConverterRatio;
-			if (retVal is ResponseSuccess &&
+			if (absTime > DataBus.LastShift && retVal is ResponseSuccess &&
 				ShiftStrategy.ShiftRequired(absTime, dt, outTorque * ratio, outAngularVelocity / ratio, inTorque,
 					operatingPoint.InAngularVelocity, Gearbox.Gear, Gearbox.LastShift)) {
 				return new ResponseGearShift { Source = this };
@@ -164,10 +168,16 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 			var avgOutSpeedMin = (PreviousState.OutAngularVelocity + dryOperatingPointMin.OutAngularVelocity) / 2.0;
 			var deltaMin = (outTorque - dryOperatingPointMin.OutTorque) * avgOutSpeedMin;
 
+			var inTorqueMax =
+				(PreviousState.InAngularVelocity * PreviousState.InTorque +
+				dryOperatingPointMax.InAngularVelocity * dryOperatingPointMax.InTorque) /
+				(PreviousState.InAngularVelocity + dryOperatingPointMax.InAngularVelocity);
 			var inTorqueMin =
 				(PreviousState.InAngularVelocity * PreviousState.InTorque +
 				dryOperatingPointMin.InAngularVelocity * dryOperatingPointMin.InTorque) /
 				(PreviousState.InAngularVelocity + dryOperatingPointMin.InAngularVelocity);
+			var engRespMax = (ResponseDryRun)
+				NextComponent.Request(absTime, dt, inTorqueMax, dryOperatingPointMax.InAngularVelocity, true);
 			var engRespMin = (ResponseDryRun)
 				NextComponent.Request(absTime, dt, inTorqueMin, dryOperatingPointMin.InAngularVelocity, true);
 
diff --git a/VectoCore/VectoCoreTest/Models/SimulationComponentData/TorqueConverterDataTest.cs b/VectoCore/VectoCoreTest/Models/SimulationComponentData/TorqueConverterDataTest.cs
index 6798202de47f56dcd9a61106275c3bbfd2c14386..9e07f8dee4d34437c704b1142107b1ab1aef695b 100644
--- a/VectoCore/VectoCoreTest/Models/SimulationComponentData/TorqueConverterDataTest.cs
+++ b/VectoCore/VectoCoreTest/Models/SimulationComponentData/TorqueConverterDataTest.cs
@@ -29,448 +29,570 @@
 *   Martin Rexeis, rexeis@ivt.tugraz.at, IVT, Graz University of Technology
 */
 
-using System;
-using System.Collections.Generic;
-using System.Diagnostics;
-using System.Linq;
-using NLog.Targets;
-using NUnit.Framework;
-using TUGraz.VectoCommon.Models;
-using TUGraz.VectoCommon.Utils;
-using TUGraz.VectoCore.Configuration;
-using TUGraz.VectoCore.InputData.Reader.ComponentData;
-using TUGraz.VectoCore.Tests.Utils;
-
-namespace TUGraz.VectoCore.Tests.Models.SimulationComponentData
-{
-	[TestFixture]
-	public class TorqueConverterDataTest
-	{
-		[Test]
-		public void TestTorqueConverterDataDeclarationMode()
-		{
-			var tqInput = new[] {
-				"0.0,1.80,377.80		",
-				"0.1,1.71,365.21		",
-				"0.2,1.61,352.62		",
-				"0.3,1.52,340.02		",
-				"0.4,1.42,327.43		",
-				"0.5,1.33,314.84		",
-				"0.6,1.23,302.24		",
-				"0.7,1.14,264.46		",
-				"0.8,1.04,226.68		",
-				"0.9,0.95,188.90		",
-				"1.0,0.95,0.00			",
-				"1.100,0.99,-40.34		",
-				"1.222,0.98,-80.34		",
-				"1.375,0.97,-136.11	",
-				"1.571,0.96,-216.52	",
-				"1.833,0.95,-335.19	",
-				"2.200,0.94,-528.77	",
-				"2.750,0.93,-883.40	",
-				"4.400,0.92,-2462.17	",
-				"11.000,0.91,-16540.98	",
-			};
-			var tqData =
-				TorqueConverterDataReader.ReadFromStream(InputDataHelper.InputDataAsStream("Speed Ratio, Torque Ratio, MP1000",
-					tqInput), 1000.RPMtoRad(), 1600.RPMtoRad(), ExecutionMode.Declaration, 1, 0.1.SI<MeterPerSquareSecond>(),
-					0.1.SI<MeterPerSquareSecond>());
-
-			// check input data
-			Assert.AreEqual(1.8, tqData.TorqueConverterEntries[0].TorqueRatio, 1e-9);
-			Assert.AreEqual(377.8, tqData.TorqueConverterEntries[0].Torque.Value(), 1e-9);
-			Assert.AreEqual(0, tqData.TorqueConverterEntries[0].SpeedRatio, 1e-9);
-
-			Assert.AreEqual(0.95, tqData.TorqueConverterEntries[9].TorqueRatio, 1e-9);
-			Assert.AreEqual(188.90, tqData.TorqueConverterEntries[9].Torque.Value(), 1e-9);
-			Assert.AreEqual(0.9, tqData.TorqueConverterEntries[9].SpeedRatio, 1e-9);
-
-			// check appended data
-			
-			Assert.AreEqual(0.959, tqData.TorqueConverterEntries[19].TorqueRatio, 1e-9);
-			Assert.AreEqual(-2290, tqData.TorqueConverterEntries[19].Torque.Value(), 1e-9);
-			Assert.AreEqual(5, tqData.TorqueConverterEntries[19].SpeedRatio, 1e-9);
-		}
-
-		[Test]
-		public void TestTorqueConverterExtendPowersplit()
-		{
-			var tqInput = new[] {
-				"0.0,1.80,377.80		",
-				"0.1,1.71,365.21		",
-				"0.2,1.61,352.62		",
-				"0.3,1.52,340.02		",
-				"0.4,1.42,327.43		",
-				"0.5,1.33,314.84		",
-				"0.6,1.23,302.24		",
-				"0.7,1.14,264.46		",
-				"0.8,1.04,226.68		",
-				"0.9,0.95,188.90		",
-				"1.0,0.95,0.00			",
-				"1.100,0.99,-40.34		",
-				"1.222,0.98,-80.34		",
-				"1.375,0.97,-136.11	",
-				"1.571,0.96,-216.52	",
-				"1.833,0.95,-335.19	",
-				"2.200,0.94,-528.77	",
-				"2.750,0.93,-883.40	",
-				"4.400,0.92,-2462.17	",
-				"11.000,0.91,-16540.98	",
-			};
-
-			var ratio = 0.75;
-			var tqData =
-				TorqueConverterDataReader.ReadFromStream(InputDataHelper.InputDataAsStream("Speed Ratio, Torque Ratio, MP1000",
-					tqInput), 1000.RPMtoRad(), 1600.RPMtoRad(), ExecutionMode.Declaration, ratio, 0.1.SI<MeterPerSquareSecond>(),
-					0.1.SI<MeterPerSquareSecond>());
-
-			// check input data
-			Assert.AreEqual(1.8, tqData.TorqueConverterEntries[0].TorqueRatio, 1e-9);
-			Assert.AreEqual(377.8, tqData.TorqueConverterEntries[0].Torque.Value(), 1e-9);
-			Assert.AreEqual(0, tqData.TorqueConverterEntries[0].SpeedRatio, 1e-9);
-
-			Assert.AreEqual(1.14, tqData.TorqueConverterEntries[7].TorqueRatio, 1e-9);
-			Assert.AreEqual(264.46, tqData.TorqueConverterEntries[7].Torque.Value(), 1e-9);
-			Assert.AreEqual(0.7, tqData.TorqueConverterEntries[7].SpeedRatio, 1e-9);
-
-			// check appended data
-			
-			Assert.AreEqual(0.959 / ratio, tqData.TorqueConverterEntries[18].TorqueRatio, 1e-9);
-			Assert.AreEqual(-2290, tqData.TorqueConverterEntries[18].Torque.Value(), 1e-9);
-			Assert.AreEqual(5 * ratio, tqData.TorqueConverterEntries[18].SpeedRatio, 1e-9);
-		}
-
-		[Test]
-		public void TestTorqueConverterDataEngneeringMode_Append()
-		{
-			var tqInput = new[] {
-				"0.0,1.80,377.80		",
-				"0.1,1.71,365.21		",
-				"0.2,1.61,352.62		",
-				"0.3,1.52,340.02		",
-				"0.4,1.42,327.43		",
-				"0.5,1.33,314.84		",
-				"0.6,1.23,302.24		",
-				"0.7,1.14,264.46		",
-				"0.8,1.04,226.68		",
-				"0.9,0.95,188.90		",
-			};
-			var tqData =
-				TorqueConverterDataReader.ReadFromStream(InputDataHelper.InputDataAsStream("Speed Ratio, Torque Ratio, MP1000",
-					tqInput), 1000.RPMtoRad(), 1600.RPMtoRad(), ExecutionMode.Engineering, 1, 0.1.SI<MeterPerSquareSecond>(),
-					0.1.SI<MeterPerSquareSecond>());
-
-			// check input data
-			Assert.AreEqual(1.8, tqData.TorqueConverterEntries[0].TorqueRatio, 1e-9);
-			Assert.AreEqual(377.8, tqData.TorqueConverterEntries[0].Torque.Value(), 1e-9);
-			Assert.AreEqual(0, tqData.TorqueConverterEntries[0].SpeedRatio, 1e-9);
-
-			Assert.AreEqual(0.95, tqData.TorqueConverterEntries[9].TorqueRatio, 1e-9);
-			Assert.AreEqual(188.90, tqData.TorqueConverterEntries[9].Torque.Value(), 1e-9);
-			Assert.AreEqual(0.9, tqData.TorqueConverterEntries[9].SpeedRatio, 1e-9);
-
-			// check appended data
-			Assert.AreEqual(0.999, tqData.TorqueConverterEntries[10].TorqueRatio, 1e-9);
-			Assert.AreEqual(0, tqData.TorqueConverterEntries[10].Torque.Value(), 1e-9);
-			Assert.AreEqual(1, tqData.TorqueConverterEntries[10].SpeedRatio, 1e-9);
-
-			Assert.AreEqual(0.959, tqData.TorqueConverterEntries[50].TorqueRatio, 1e-9);
-			Assert.AreEqual(-2290, tqData.TorqueConverterEntries[50].Torque.Value(), 1e-9);
-			Assert.AreEqual(5, tqData.TorqueConverterEntries[50].SpeedRatio, 1e-9);
-		}
-
-		[Test]
-		public void TestTorqueConverterDataEngineeringMode_Unmodified()
-		{
-			var tqInput = new[] {
-				"0.0,1.80,377.80		",
-				"0.1,1.71,365.21		",
-				"0.2,1.61,352.62		",
-				"0.3,1.52,340.02		",
-				"0.4,1.42,327.43		",
-				"0.5,1.33,314.84		",
-				"0.6,1.23,302.24		",
-				"0.7,1.14,264.46		",
-				"0.8,1.04,226.68		",
-				"0.9,0.95,188.90		",
-				"1.0,0.95,0.00			",
-				"1.100,0.99,-40.34		",
-				"1.222,0.98,-80.34		",
-				"1.375,0.97,-136.11	",
-				"1.571,0.96,-216.52	",
-				"1.833,0.95,-335.19	",
-				"2.200,0.94,-528.77	",
-				"2.750,0.93,-883.40	",
-				"4.400,0.92,-2462.17	",
-				"11.000,0.91,-16540.98	",
-			};
-			var tqData =
-				TorqueConverterDataReader.ReadFromStream(InputDataHelper.InputDataAsStream("Speed Ratio, Torque Ratio, MP1000",
-					tqInput), 1000.RPMtoRad(), 1600.RPMtoRad(), ExecutionMode.Engineering, 1, 0.1.SI<MeterPerSquareSecond>(),
-					0.1.SI<MeterPerSquareSecond>());
-
-			// check input data
-			Assert.AreEqual(1.8, tqData.TorqueConverterEntries[0].TorqueRatio, 1e-9);
-			Assert.AreEqual(377.8, tqData.TorqueConverterEntries[0].Torque.Value(), 1e-9);
-			Assert.AreEqual(0, tqData.TorqueConverterEntries[0].SpeedRatio, 1e-9);
-
-			Assert.AreEqual(0.95, tqData.TorqueConverterEntries[9].TorqueRatio, 1e-9);
-			Assert.AreEqual(188.90, tqData.TorqueConverterEntries[9].Torque.Value(), 1e-9);
-			Assert.AreEqual(0.9, tqData.TorqueConverterEntries[9].SpeedRatio, 1e-9);
-
-			Assert.AreEqual(0.95, tqData.TorqueConverterEntries[10].TorqueRatio, 1e-9);
-			Assert.AreEqual(0, tqData.TorqueConverterEntries[10].Torque.Value(), 1e-9);
-			Assert.AreEqual(1, tqData.TorqueConverterEntries[10].SpeedRatio, 1e-9);
-
-			Assert.AreEqual(0.91, tqData.TorqueConverterEntries[19].TorqueRatio, 1e-9);
-			Assert.AreEqual(-16540.98, tqData.TorqueConverterEntries[19].Torque.Value(), 1e-9);
-			Assert.AreEqual(11, tqData.TorqueConverterEntries[19].SpeedRatio, 1e-9);
-		}
-
-		[Test,
-		TestCase(30, 10, 227.8707, 1780.6630),
-		TestCase(40, 10, 197.9536, 1340.4737),
-		TestCase(50, 10, 177.6759, 1076.9007),
-		TestCase(60, 10, 162.8219, 901.5900),
-		TestCase(70, 10, 151.3747, 776.6864),
-		TestCase(70, 30, 259.9515, 2306.1578),
-		TestCase(90, 10, 134.7344, 610.8267),
-		TestCase(90, 30, 230.4896, 1805.2978),
-		TestCase(170, 30, 172.2875, 987.4020),
-		TestCase(170, 50, 220.2397, 1626.0613),
-		TestCase(190, 30, 164.3260, 892.7507),
-		TestCase(190, 50, 209.6016, 1465.6611),
-		TestCase(190, 70, 246.4829, 2036.7399),
-		TestCase(530.517, 1.930, 59.0758, 35.8217),
-		]
-		public void TestTorqueConverterOperatingPoint(double nOut, double Pout, double nInExpected, double tqInExpected)
-		{
-			var tqLimit = 1600;
-			//Assert.IsTrue(nInExpected < tqLimit);
-			var tqInput = new[] {
-				"0.0,1.80,377.80",
-				"0.1,1.71,365.21",
-				"0.2,1.61,352.62",
-				"0.3,1.52,340.02",
-				"0.4,1.42,327.43",
-				"0.5,1.33,314.84",
-				"0.6,1.23,302.24",
-				"0.7,1.14,264.46",
-				"0.8,1.04,226.68",
-				"0.9,0.95,188.90",
-				"1.0,0.95,0.00",
-			};
-
-			var tqData =
-				TorqueConverterDataReader.ReadFromStream(InputDataHelper.InputDataAsStream("Speed Ratio, Torque Ratio,MP1000",
-					tqInput), 1000.RPMtoRad(), tqLimit.RPMtoRad(), ExecutionMode.Engineering, 1, 0.1.SI<MeterPerSquareSecond>(),
-					0.1.SI<MeterPerSquareSecond>());
-
-			var outAngularSpeed = nOut.RPMtoRad();
-			var outTorque = (Pout * 1000).SI<Watt>() / outAngularSpeed;
-			var resultList = tqData.FindOperatingPoint(outTorque, outAngularSpeed, 0.SI<PerSecond>());
-			Assert.AreEqual(1, resultList.Count);
-			var result = resultList[0];
-
-			Assert.AreEqual(outAngularSpeed.Value(), result.OutAngularVelocity.Value(), 1e-3);
-			Assert.AreEqual(outTorque.Value(), result.OutTorque.Value(), 1e-3);
-
-			//Debug.WriteLine("n_in: {0}, tq_in: {1}", result.InAngularVelocity.AsRPM, result.InTorque.Value());
-			//Assert.IsTrue(result.InAngularVelocity.Value() < 1600.RPMtoRad().Value());
-			Assert.AreEqual(nInExpected, result.InAngularVelocity.Value(), 1e-3);
-			Assert.AreEqual(tqInExpected, result.InTorque.Value(), 1e-3);
-		}
-
-		[Test,
-		TestCase(898, 463)]
-		public void TestTorqueConverterOperatingPointForward(double nIn, double tqIn)
-		{
-			var tqLimit = 1600;
-
-			var tqInput = new[] {
-				"0.0,  4.5, 700",
-				"0.1,  3.5, 640	",
-				"0.2,  2.7, 560	",
-				"0.3,  2.2, 460	",
-				"0.4,  1.6, 350	",
-				"0.5,  1.2, 250	",
-				"0.6,  0.9, 160	",
-				"0.74, 0.9,   1",
-			};
-
-			var tqData =
-				TorqueConverterDataReader.ReadFromStream(InputDataHelper.InputDataAsStream("Speed Ratio, Torque Ratio,MP1000",
-					tqInput), 1000.RPMtoRad(), tqLimit.RPMtoRad(), ExecutionMode.Engineering, 1, 0.1.SI<MeterPerSquareSecond>(),
-					0.1.SI<MeterPerSquareSecond>());
-
-			var operatingPoint = tqData.FindOperatingPointForward(tqIn.SI<NewtonMeter>(), nIn.RPMtoRad(), null);
-
-			Assert.AreEqual(operatingPoint.InTorque.Value(), tqIn, 1e-6);
-			Assert.AreEqual(operatingPoint.InAngularVelocity.Value(), nIn.RPMtoRad().Value(), 1e-6);
-
-			var resultList = tqData.FindOperatingPoint(operatingPoint.OutTorque, operatingPoint.OutAngularVelocity,
-				0.SI<PerSecond>());
-			Assert.AreEqual(1, resultList.Count);
-			var reverseOP = resultList[0];
-
-			Assert.AreEqual(operatingPoint.InTorque.Value(), reverseOP.InTorque.Value(), 1e-6);
-			Assert.AreEqual(operatingPoint.OutTorque.Value(), reverseOP.OutTorque.Value(), 1e-6);
-			Assert.AreEqual(operatingPoint.InAngularVelocity.Value(), reverseOP.InAngularVelocity.Value(), 1e-6);
-			Assert.AreEqual(operatingPoint.OutAngularVelocity.Value(), reverseOP.OutAngularVelocity.Value(), 1e-6);
-		}
-
-		[Test]
-		public void TestTorqueConverterComparisonV2()
-		{
-			var tqLimit = 1600;
-
-			var tqInput = new[] {
-				"0.0,1.80,377.80",
-				"0.1,1.71,365.21",
-				"0.2,1.61,352.62",
-				"0.3,1.52,340.02",
-				"0.4,1.42,327.43",
-				"0.5,1.33,314.84",
-				"0.6,1.23,302.24",
-				"0.7,1.14,264.46",
-				"0.8,1.04,226.68",
-				"0.9,0.95,188.90",
-				"1.0,0.95,0.00",
-			};
-			var testData = new List<Tuple<double, double>>() {
-				Tuple.Create(139.4087374, 72.74847642),
-				Tuple.Create(2275.286998, 453.9413043),
-				Tuple.Create(1507.256216, 1012.44118),
-				Tuple.Create(26.58522419, 29.25312925),
-				Tuple.Create(1752.83589, 328.6386397),
-			};
-			var tqData =
-				TorqueConverterDataReader.ReadFromStream(InputDataHelper.InputDataAsStream("Speed Ratio, Torque Ratio,MP1000",
-					tqInput), 1000.RPMtoRad(), tqLimit.RPMtoRad(), ExecutionMode.Engineering, 1, 0.1.SI<MeterPerSquareSecond>(),
-					0.1.SI<MeterPerSquareSecond>());
-
-			foreach (var entry in testData) {
-				var torqueTCOut = entry.Item1.SI<NewtonMeter>();
-				var angularSpeedOut = entry.Item2.RPMtoRad();
-				var result = tqData.FindOperatingPoint(torqueTCOut, angularSpeedOut, 0.SI<PerSecond>()).First();
-				//Debug.WriteLine("n_out: {0}, tq_out: {1}, n_in: {2}, Tq_in: {3}", angularSpeedOut.Value() / Constants.RPMToRad,
-				//	torqueTCOut.Value(), result.InAngularVelocity.Value() / Constants.RPMToRad, result.InTorque.Value());
-			}
-		}
-
-		[Test,
-		TestCase(10, 110),
-		TestCase(20, 130),
-		TestCase(50, 90),
-		TestCase(50, 190),
-		TestCase(60, 150),
-		TestCase(70, 70),
-		TestCase(70, 90),
-		TestCase(70, 190),
-		TestCase(80, 50),
-		TestCase(80, 130),
-		TestCase(90, 70),
-		TestCase(100, 150),
-		TestCase(130, 70),
-		TestCase(150, 80),
-		TestCase(170, 80),
-		]
-		public void TestTorqueConverterInvalidOperatingPoint(double nOut, double Pout)
-		{
-			var tqLimit = 1600.RPMtoRad();
-
-			var tqInput = new[] {
-				"0,3.935741,563.6598  ",
-				"0.1,3.296827,534.1364",
-				"0.2,2.701476,504.6129",
-				"0.3,2.265852,472.1372",
-				"0.4,1.931875,421.9474",
-				"0.5,1.554335,354.0435",
-				"0.6,1.249399,268.4255",
-				"0.7,1.075149,114.9037",
-			};
-
-			var tqData =
-				TorqueConverterDataReader.ReadFromStream(InputDataHelper.InputDataAsStream("Speed Ratio, Torque Ratio,MP1000",
-					tqInput), 1000.RPMtoRad(), tqLimit, ExecutionMode.Engineering, 1, 0.1.SI<MeterPerSquareSecond>(),
-					0.1.SI<MeterPerSquareSecond>());
-
-			var outAngularSpeed = nOut.RPMtoRad();
-			var outTorque = (Pout * 1000).SI<Watt>() / outAngularSpeed;
-			var resultList = tqData.FindOperatingPoint(outTorque, outAngularSpeed, 0.SI<PerSecond>());
-			Assert.AreEqual(1, resultList.Count);
-			var result = resultList[0];
-
-			Assert.IsTrue(result.InAngularVelocity.Value() > tqLimit.Value());
-		}
-
-		[TestCase()]
-		public void TestForwardBackward()
-		{
-			var tqLimit = 1600.RPMtoRad();
-
-			var tqInput = new[] {
-				"0,4.6,708		  ",
-				"0.1,3.7,641	  ",
-				"0.2,2.9,560	  ",
-				"0.3,2.4,465	  ",
-				"0.4,1.8,356	  ",
-				"0.5,1.4,251	  ",
-				"0.6,0.9,166	  ",
-				"0.735,0.9,1	  ",
-				"0.738,1.361,0	  ",
-				"0.808,1.351,-40  ",
-				"0.898,1.349,-80  ",
-				"1.01,1.338,-136  ",
-				"1.154,1.327,-217 ",
-				"1.347,1.316,-335 ",
-				"1.616,1.305,-529 ",
-				"3    ,1.294,-729 ",
-			};
-
-			var tqInput_1 = new[] {
-				"0.0,1.80,377.80		",
-				"0.1,1.71,365.21		",
-				"0.2,1.61,352.62		",
-				"0.3,1.52,340.02		",
-				"0.4,1.42,327.43		",
-				"0.5,1.33,314.84		",
-				"0.6,1.23,302.24		",
-				"0.7,1.14,264.46		",
-				"0.8,1.04,226.68		",
-				"0.9,0.95,188.90		",
-				"1.0,0.95,0.00			",
-				"1.100,0.99,-40.34		",
-				"1.222,0.98,-80.34		",
-				"1.375,0.97,-136.11	",
-				"1.571,0.96,-216.52	",
-				"1.833,0.95,-335.19	",
-				"2.200,0.94,-528.77	",
-				"2.750,0.93,-883.40	",
-				"4.400,0.92,-2462.17	",
-				"11.000,0.91,-16540.98	",
-			};
-			var tqData =
-				TorqueConverterDataReader.ReadFromStream(InputDataHelper.InputDataAsStream("Speed Ratio, Torque Ratio,MP1000",
-					tqInput), 1000.RPMtoRad(), tqLimit, ExecutionMode.Engineering, 1, 0.1.SI<MeterPerSquareSecond>(),
-					0.1.SI<MeterPerSquareSecond>());
-
-			var operatingPoint = tqData.FindOperatingPointForPowerDemand(20000.SI<Watt>(), 113.5.SI<PerSecond>(),
-				1200.RPMtoRad(), 4.SI<KilogramSquareMeter>(), 0.5.SI<Second>(), 20000.SI<Watt>());
-
-			var tmp = tqData.FindOperatingPoint(operatingPoint.OutTorque, operatingPoint.OutAngularVelocity, 0.RPMtoRad());
-			var backward = tmp.First();
-
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.Linq;
+using NLog.Targets;
+using NUnit.Framework;
+using TUGraz.VectoCommon.InputData;
+using TUGraz.VectoCommon.Models;
+using TUGraz.VectoCommon.Utils;
+using TUGraz.VectoCore.Configuration;
+using TUGraz.VectoCore.InputData.FileIO.JSON;
+using TUGraz.VectoCore.InputData.Reader.ComponentData;
+using TUGraz.VectoCore.InputData.Reader.DataObjectAdapter;
+using TUGraz.VectoCore.Models.Connector.Ports.Impl;
+using TUGraz.VectoCore.Models.Simulation.Data;
+using TUGraz.VectoCore.Models.SimulationComponent.Data.Gearbox;
+using TUGraz.VectoCore.Models.SimulationComponent.Impl;
+using TUGraz.VectoCore.Tests.Utils;
+using TUGraz.VectoCore.Utils;
+
+namespace TUGraz.VectoCore.Tests.Models.SimulationComponentData
+{
+	[TestFixture]
+	public class TorqueConverterDataTest
+	{
+		[Test]
+		public void TestTorqueConverterDataDeclarationMode()
+		{
+			var tqInput = new[] {
+				"0.0,1.80,377.80		",
+				"0.1,1.71,365.21		",
+				"0.2,1.61,352.62		",
+				"0.3,1.52,340.02		",
+				"0.4,1.42,327.43		",
+				"0.5,1.33,314.84		",
+				"0.6,1.23,302.24		",
+				"0.7,1.14,264.46		",
+				"0.8,1.04,226.68		",
+				"0.9,0.95,188.90		",
+				"1.0,0.95,0.00			",
+				"1.100,0.99,-40.34		",
+				"1.222,0.98,-80.34		",
+				"1.375,0.97,-136.11	",
+				"1.571,0.96,-216.52	",
+				"1.833,0.95,-335.19	",
+				"2.200,0.94,-528.77	",
+				"2.750,0.93,-883.40	",
+				"4.400,0.92,-2462.17	",
+				"11.000,0.91,-16540.98	",
+			};
+			var tqData =
+				TorqueConverterDataReader.ReadFromStream(InputDataHelper.InputDataAsStream("Speed Ratio, Torque Ratio, MP1000",
+					tqInput), 1000.RPMtoRad(), 1600.RPMtoRad(), ExecutionMode.Declaration, 1, 0.1.SI<MeterPerSquareSecond>(),
+					0.1.SI<MeterPerSquareSecond>());
+
+			// check input data
+			Assert.AreEqual(1.8, tqData.TorqueConverterEntries[0].TorqueRatio, 1e-9);
+			Assert.AreEqual(377.8, tqData.TorqueConverterEntries[0].Torque.Value(), 1e-9);
+			Assert.AreEqual(0, tqData.TorqueConverterEntries[0].SpeedRatio, 1e-9);
+
+			Assert.AreEqual(0.95, tqData.TorqueConverterEntries[9].TorqueRatio, 1e-9);
+			Assert.AreEqual(188.90, tqData.TorqueConverterEntries[9].Torque.Value(), 1e-9);
+			Assert.AreEqual(0.9, tqData.TorqueConverterEntries[9].SpeedRatio, 1e-9);
+
+			// check appended data
+			
+			Assert.AreEqual(0.959, tqData.TorqueConverterEntries[19].TorqueRatio, 1e-9);
+			Assert.AreEqual(-2290, tqData.TorqueConverterEntries[19].Torque.Value(), 1e-9);
+			Assert.AreEqual(5, tqData.TorqueConverterEntries[19].SpeedRatio, 1e-9);
+		}
+
+		[Test]
+		public void TestTorqueConverterExtendPowersplit()
+		{
+			var tqInput = new[] {
+				"0.0,1.80,377.80		",
+				"0.1,1.71,365.21		",
+				"0.2,1.61,352.62		",
+				"0.3,1.52,340.02		",
+				"0.4,1.42,327.43		",
+				"0.5,1.33,314.84		",
+				"0.6,1.23,302.24		",
+				"0.7,1.14,264.46		",
+				"0.8,1.04,226.68		",
+				"0.9,0.95,188.90		",
+				"1.0,0.95,0.00			",
+				"1.100,0.99,-40.34		",
+				"1.222,0.98,-80.34		",
+				"1.375,0.97,-136.11	",
+				"1.571,0.96,-216.52	",
+				"1.833,0.95,-335.19	",
+				"2.200,0.94,-528.77	",
+				"2.750,0.93,-883.40	",
+				"4.400,0.92,-2462.17	",
+				"11.000,0.91,-16540.98	",
+			};
+
+			var ratio = 0.75;
+			var tqData =
+				TorqueConverterDataReader.ReadFromStream(InputDataHelper.InputDataAsStream("Speed Ratio, Torque Ratio, MP1000",
+					tqInput), 1000.RPMtoRad(), 1600.RPMtoRad(), ExecutionMode.Declaration, ratio, 0.1.SI<MeterPerSquareSecond>(),
+					0.1.SI<MeterPerSquareSecond>());
+
+			// check input data
+			Assert.AreEqual(1.8, tqData.TorqueConverterEntries[0].TorqueRatio, 1e-9);
+			Assert.AreEqual(377.8, tqData.TorqueConverterEntries[0].Torque.Value(), 1e-9);
+			Assert.AreEqual(0, tqData.TorqueConverterEntries[0].SpeedRatio, 1e-9);
+
+			Assert.AreEqual(1.14, tqData.TorqueConverterEntries[7].TorqueRatio, 1e-9);
+			Assert.AreEqual(264.46, tqData.TorqueConverterEntries[7].Torque.Value(), 1e-9);
+			Assert.AreEqual(0.7, tqData.TorqueConverterEntries[7].SpeedRatio, 1e-9);
+
+			// check appended data
+			
+			Assert.AreEqual(0.959 / ratio, tqData.TorqueConverterEntries[18].TorqueRatio, 1e-9);
+			Assert.AreEqual(-2290, tqData.TorqueConverterEntries[18].Torque.Value(), 1e-9);
+			Assert.AreEqual(5 * ratio, tqData.TorqueConverterEntries[18].SpeedRatio, 1e-9);
+		}
+
+		[Test]
+		public void TestTorqueConverterDataEngneeringMode_Append()
+		{
+			var tqInput = new[] {
+				"0.0,1.80,377.80		",
+				"0.1,1.71,365.21		",
+				"0.2,1.61,352.62		",
+				"0.3,1.52,340.02		",
+				"0.4,1.42,327.43		",
+				"0.5,1.33,314.84		",
+				"0.6,1.23,302.24		",
+				"0.7,1.14,264.46		",
+				"0.8,1.04,226.68		",
+				"0.9,0.95,188.90		",
+			};
+			var tqData =
+				TorqueConverterDataReader.ReadFromStream(InputDataHelper.InputDataAsStream("Speed Ratio, Torque Ratio, MP1000",
+					tqInput), 1000.RPMtoRad(), 1600.RPMtoRad(), ExecutionMode.Engineering, 1, 0.1.SI<MeterPerSquareSecond>(),
+					0.1.SI<MeterPerSquareSecond>());
+
+			// check input data
+			Assert.AreEqual(1.8, tqData.TorqueConverterEntries[0].TorqueRatio, 1e-9);
+			Assert.AreEqual(377.8, tqData.TorqueConverterEntries[0].Torque.Value(), 1e-9);
+			Assert.AreEqual(0, tqData.TorqueConverterEntries[0].SpeedRatio, 1e-9);
+
+			Assert.AreEqual(0.95, tqData.TorqueConverterEntries[9].TorqueRatio, 1e-9);
+			Assert.AreEqual(188.90, tqData.TorqueConverterEntries[9].Torque.Value(), 1e-9);
+			Assert.AreEqual(0.9, tqData.TorqueConverterEntries[9].SpeedRatio, 1e-9);
+
+			// check appended data
+			Assert.AreEqual(0.999, tqData.TorqueConverterEntries[10].TorqueRatio, 1e-9);
+			Assert.AreEqual(0, tqData.TorqueConverterEntries[10].Torque.Value(), 1e-9);
+			Assert.AreEqual(1, tqData.TorqueConverterEntries[10].SpeedRatio, 1e-9);
+
+			Assert.AreEqual(0.959, tqData.TorqueConverterEntries[50].TorqueRatio, 1e-9);
+			Assert.AreEqual(-2290, tqData.TorqueConverterEntries[50].Torque.Value(), 1e-9);
+			Assert.AreEqual(5, tqData.TorqueConverterEntries[50].SpeedRatio, 1e-9);
+		}
+
+		[Test]
+		public void TestTorqueConverterDataEngineeringMode_Unmodified()
+		{
+			var tqInput = new[] {
+				"0.0,1.80,377.80		",
+				"0.1,1.71,365.21		",
+				"0.2,1.61,352.62		",
+				"0.3,1.52,340.02		",
+				"0.4,1.42,327.43		",
+				"0.5,1.33,314.84		",
+				"0.6,1.23,302.24		",
+				"0.7,1.14,264.46		",
+				"0.8,1.04,226.68		",
+				"0.9,0.95,188.90		",
+				"1.0,0.95,0.00			",
+				"1.100,0.99,-40.34		",
+				"1.222,0.98,-80.34		",
+				"1.375,0.97,-136.11	",
+				"1.571,0.96,-216.52	",
+				"1.833,0.95,-335.19	",
+				"2.200,0.94,-528.77	",
+				"2.750,0.93,-883.40	",
+				"4.400,0.92,-2462.17	",
+				"11.000,0.91,-16540.98	",
+			};
+			var tqData =
+				TorqueConverterDataReader.ReadFromStream(InputDataHelper.InputDataAsStream("Speed Ratio, Torque Ratio, MP1000",
+					tqInput), 1000.RPMtoRad(), 1600.RPMtoRad(), ExecutionMode.Engineering, 1, 0.1.SI<MeterPerSquareSecond>(),
+					0.1.SI<MeterPerSquareSecond>());
+
+			// check input data
+			Assert.AreEqual(1.8, tqData.TorqueConverterEntries[0].TorqueRatio, 1e-9);
+			Assert.AreEqual(377.8, tqData.TorqueConverterEntries[0].Torque.Value(), 1e-9);
+			Assert.AreEqual(0, tqData.TorqueConverterEntries[0].SpeedRatio, 1e-9);
+
+			Assert.AreEqual(0.95, tqData.TorqueConverterEntries[9].TorqueRatio, 1e-9);
+			Assert.AreEqual(188.90, tqData.TorqueConverterEntries[9].Torque.Value(), 1e-9);
+			Assert.AreEqual(0.9, tqData.TorqueConverterEntries[9].SpeedRatio, 1e-9);
+
+			Assert.AreEqual(0.95, tqData.TorqueConverterEntries[10].TorqueRatio, 1e-9);
+			Assert.AreEqual(0, tqData.TorqueConverterEntries[10].Torque.Value(), 1e-9);
+			Assert.AreEqual(1, tqData.TorqueConverterEntries[10].SpeedRatio, 1e-9);
+
+			Assert.AreEqual(0.91, tqData.TorqueConverterEntries[19].TorqueRatio, 1e-9);
+			Assert.AreEqual(-16540.98, tqData.TorqueConverterEntries[19].Torque.Value(), 1e-9);
+			Assert.AreEqual(11, tqData.TorqueConverterEntries[19].SpeedRatio, 1e-9);
+		}
+
+		[Test,
+		TestCase(30, 10, 227.8707, 1780.6630),
+		TestCase(40, 10, 197.9536, 1340.4737),
+		TestCase(50, 10, 177.6759, 1076.9007),
+		TestCase(60, 10, 162.8219, 901.5900),
+		TestCase(70, 10, 151.3747, 776.6864),
+		TestCase(70, 30, 259.9515, 2306.1578),
+		TestCase(90, 10, 134.7344, 610.8267),
+		TestCase(90, 30, 230.4896, 1805.2978),
+		TestCase(170, 30, 172.2875, 987.4020),
+		TestCase(170, 50, 220.2397, 1626.0613),
+		TestCase(190, 30, 164.3260, 892.7507),
+		TestCase(190, 50, 209.6016, 1465.6611),
+		TestCase(190, 70, 246.4829, 2036.7399),
+		TestCase(530.517, 1.930, 59.0758, 35.8217),
+		]
+		public void TestTorqueConverterOperatingPoint(double nOut, double Pout, double nInExpected, double tqInExpected)
+		{
+			var tqLimit = 1600;
+			//Assert.IsTrue(nInExpected < tqLimit);
+			var tqInput = new[] {
+				"0.0,1.80,377.80",
+				"0.1,1.71,365.21",
+				"0.2,1.61,352.62",
+				"0.3,1.52,340.02",
+				"0.4,1.42,327.43",
+				"0.5,1.33,314.84",
+				"0.6,1.23,302.24",
+				"0.7,1.14,264.46",
+				"0.8,1.04,226.68",
+				"0.9,0.95,188.90",
+				"1.0,0.95,0.00",
+			};
+
+			var tqData =
+				TorqueConverterDataReader.ReadFromStream(InputDataHelper.InputDataAsStream("Speed Ratio, Torque Ratio,MP1000",
+					tqInput), 1000.RPMtoRad(), tqLimit.RPMtoRad(), ExecutionMode.Engineering, 1, 0.1.SI<MeterPerSquareSecond>(),
+					0.1.SI<MeterPerSquareSecond>());
+
+			var outAngularSpeed = nOut.RPMtoRad();
+			var outTorque = (Pout * 1000).SI<Watt>() / outAngularSpeed;
+			var resultList = tqData.FindOperatingPoint(outTorque, outAngularSpeed, 0.SI<PerSecond>());
+			Assert.AreEqual(1, resultList.Count);
+			var result = resultList[0];
+
+			Assert.AreEqual(outAngularSpeed.Value(), result.OutAngularVelocity.Value(), 1e-3);
+			Assert.AreEqual(outTorque.Value(), result.OutTorque.Value(), 1e-3);
+
+			//Debug.WriteLine("n_in: {0}, tq_in: {1}", result.InAngularVelocity.AsRPM, result.InTorque.Value());
+			//Assert.IsTrue(result.InAngularVelocity.Value() < 1600.RPMtoRad().Value());
+			Assert.AreEqual(nInExpected, result.InAngularVelocity.Value(), 1e-3);
+			Assert.AreEqual(tqInExpected, result.InTorque.Value(), 1e-3);
+		}
+
+		[Test,
+		TestCase(898, 463)]
+		public void TestTorqueConverterOperatingPointForward(double nIn, double tqIn)
+		{
+			var tqLimit = 1600;
+
+			var tqInput = new[] {
+				"0.0,  4.5, 700",
+				"0.1,  3.5, 640	",
+				"0.2,  2.7, 560	",
+				"0.3,  2.2, 460	",
+				"0.4,  1.6, 350	",
+				"0.5,  1.2, 250	",
+				"0.6,  0.9, 160	",
+				"0.74, 0.9,   1",
+			};
+
+			var tqData =
+				TorqueConverterDataReader.ReadFromStream(InputDataHelper.InputDataAsStream("Speed Ratio, Torque Ratio,MP1000",
+					tqInput), 1000.RPMtoRad(), tqLimit.RPMtoRad(), ExecutionMode.Engineering, 1, 0.1.SI<MeterPerSquareSecond>(),
+					0.1.SI<MeterPerSquareSecond>());
+
+			var operatingPoint = tqData.FindOperatingPointForward(tqIn.SI<NewtonMeter>(), nIn.RPMtoRad(), null);
+
+			Assert.AreEqual(operatingPoint.InTorque.Value(), tqIn, 1e-6);
+			Assert.AreEqual(operatingPoint.InAngularVelocity.Value(), nIn.RPMtoRad().Value(), 1e-6);
+
+			var resultList = tqData.FindOperatingPoint(operatingPoint.OutTorque, operatingPoint.OutAngularVelocity,
+				0.SI<PerSecond>());
+			Assert.AreEqual(1, resultList.Count);
+			var reverseOP = resultList[0];
+
+			Assert.AreEqual(operatingPoint.InTorque.Value(), reverseOP.InTorque.Value(), 1e-6);
+			Assert.AreEqual(operatingPoint.OutTorque.Value(), reverseOP.OutTorque.Value(), 1e-6);
+			Assert.AreEqual(operatingPoint.InAngularVelocity.Value(), reverseOP.InAngularVelocity.Value(), 1e-6);
+			Assert.AreEqual(operatingPoint.OutAngularVelocity.Value(), reverseOP.OutAngularVelocity.Value(), 1e-6);
+		}
+
+		[Test]
+		public void TestTorqueConverterComparisonV2()
+		{
+			var tqLimit = 1600;
+
+			var tqInput = new[] {
+				"0.0,1.80,377.80",
+				"0.1,1.71,365.21",
+				"0.2,1.61,352.62",
+				"0.3,1.52,340.02",
+				"0.4,1.42,327.43",
+				"0.5,1.33,314.84",
+				"0.6,1.23,302.24",
+				"0.7,1.14,264.46",
+				"0.8,1.04,226.68",
+				"0.9,0.95,188.90",
+				"1.0,0.95,0.00",
+			};
+			var testData = new List<Tuple<double, double>>() {
+				Tuple.Create(139.4087374, 72.74847642),
+				Tuple.Create(2275.286998, 453.9413043),
+				Tuple.Create(1507.256216, 1012.44118),
+				Tuple.Create(26.58522419, 29.25312925),
+				Tuple.Create(1752.83589, 328.6386397),
+			};
+			var tqData =
+				TorqueConverterDataReader.ReadFromStream(InputDataHelper.InputDataAsStream("Speed Ratio, Torque Ratio,MP1000",
+					tqInput), 1000.RPMtoRad(), tqLimit.RPMtoRad(), ExecutionMode.Engineering, 1, 0.1.SI<MeterPerSquareSecond>(),
+					0.1.SI<MeterPerSquareSecond>());
+
+			foreach (var entry in testData) {
+				var torqueTCOut = entry.Item1.SI<NewtonMeter>();
+				var angularSpeedOut = entry.Item2.RPMtoRad();
+				var result = tqData.FindOperatingPoint(torqueTCOut, angularSpeedOut, 0.SI<PerSecond>()).First();
+				//Debug.WriteLine("n_out: {0}, tq_out: {1}, n_in: {2}, Tq_in: {3}", angularSpeedOut.Value() / Constants.RPMToRad,
+				//	torqueTCOut.Value(), result.InAngularVelocity.Value() / Constants.RPMToRad, result.InTorque.Value());
+			}
+		}
+
+		[Test,
+		TestCase(10, 110),
+		TestCase(20, 130),
+		TestCase(50, 90),
+		TestCase(50, 190),
+		TestCase(60, 150),
+		TestCase(70, 70),
+		TestCase(70, 90),
+		TestCase(70, 190),
+		TestCase(80, 50),
+		TestCase(80, 130),
+		TestCase(90, 70),
+		TestCase(100, 150),
+		TestCase(130, 70),
+		TestCase(150, 80),
+		TestCase(170, 80),
+		]
+		public void TestTorqueConverterInvalidOperatingPoint(double nOut, double Pout)
+		{
+			var tqLimit = 1600.RPMtoRad();
+
+			var tqInput = new[] {
+				"0,3.935741,563.6598  ",
+				"0.1,3.296827,534.1364",
+				"0.2,2.701476,504.6129",
+				"0.3,2.265852,472.1372",
+				"0.4,1.931875,421.9474",
+				"0.5,1.554335,354.0435",
+				"0.6,1.249399,268.4255",
+				"0.7,1.075149,114.9037",
+			};
+
+			var tqData =
+				TorqueConverterDataReader.ReadFromStream(InputDataHelper.InputDataAsStream("Speed Ratio, Torque Ratio,MP1000",
+					tqInput), 1000.RPMtoRad(), tqLimit, ExecutionMode.Engineering, 1, 0.1.SI<MeterPerSquareSecond>(),
+					0.1.SI<MeterPerSquareSecond>());
+
+			var outAngularSpeed = nOut.RPMtoRad();
+			var outTorque = (Pout * 1000).SI<Watt>() / outAngularSpeed;
+			var resultList = tqData.FindOperatingPoint(outTorque, outAngularSpeed, 0.SI<PerSecond>());
+			Assert.AreEqual(1, resultList.Count);
+			var result = resultList[0];
+
+			Assert.IsTrue(result.InAngularVelocity.Value() > tqLimit.Value());
+		}
+
+		[TestCase()]
+		public void TestForwardBackward()
+		{
+			var tqLimit = 1600.RPMtoRad();
+
+			var tqInput = new[] {
+				"0,4.6,708		  ",
+				"0.1,3.7,641	  ",
+				"0.2,2.9,560	  ",
+				"0.3,2.4,465	  ",
+				"0.4,1.8,356	  ",
+				"0.5,1.4,251	  ",
+				"0.6,0.9,166	  ",
+				"0.735,0.9,1	  ",
+				"0.738,1.361,0	  ",
+				"0.808,1.351,-40  ",
+				"0.898,1.349,-80  ",
+				"1.01,1.338,-136  ",
+				"1.154,1.327,-217 ",
+				"1.347,1.316,-335 ",
+				"1.616,1.305,-529 ",
+				"3    ,1.294,-729 ",
+			};
+
+			var tqInput_1 = new[] {
+				"0.0,1.80,377.80		",
+				"0.1,1.71,365.21		",
+				"0.2,1.61,352.62		",
+				"0.3,1.52,340.02		",
+				"0.4,1.42,327.43		",
+				"0.5,1.33,314.84		",
+				"0.6,1.23,302.24		",
+				"0.7,1.14,264.46		",
+				"0.8,1.04,226.68		",
+				"0.9,0.95,188.90		",
+				"1.0,0.95,0.00			",
+				"1.100,0.99,-40.34		",
+				"1.222,0.98,-80.34		",
+				"1.375,0.97,-136.11	",
+				"1.571,0.96,-216.52	",
+				"1.833,0.95,-335.19	",
+				"2.200,0.94,-528.77	",
+				"2.750,0.93,-883.40	",
+				"4.400,0.92,-2462.17	",
+				"11.000,0.91,-16540.98	",
+			};
+			var tqData =
+				TorqueConverterDataReader.ReadFromStream(InputDataHelper.InputDataAsStream("Speed Ratio, Torque Ratio,MP1000",
+					tqInput), 1000.RPMtoRad(), tqLimit, ExecutionMode.Engineering, 1, 0.1.SI<MeterPerSquareSecond>(),
+					0.1.SI<MeterPerSquareSecond>());
+
+			var operatingPoint = tqData.FindOperatingPointForPowerDemand(20000.SI<Watt>(), 113.5.SI<PerSecond>(),
+				1200.RPMtoRad(), 4.SI<KilogramSquareMeter>(), 0.5.SI<Second>(), 20000.SI<Watt>());
+
+			var tmp = tqData.FindOperatingPoint(operatingPoint.OutTorque, operatingPoint.OutAngularVelocity, 0.RPMtoRad());
+			var backward = tmp.First();
+
 			Console.WriteLine(operatingPoint);
 			Console.WriteLine(operatingPoint.InAngularVelocity * operatingPoint.InTorque);
 
 			Console.WriteLine(backward);
-			Console.WriteLine(backward.InAngularVelocity * backward.InTorque);
-
-			Assert.AreEqual(backward.OutAngularVelocity.Value(), operatingPoint.OutAngularVelocity.Value(), 1e-9);
-			Assert.AreEqual(backward.OutTorque.Value(), operatingPoint.OutTorque.Value(), 1e-9);
-			Assert.AreEqual(backward.InAngularVelocity.Value(), operatingPoint.InAngularVelocity.Value(), 1e-9);
-			Assert.AreEqual(backward.InTorque.Value(), operatingPoint.InTorque.Value(), 1e-9);
-		}
-	}
+			Console.WriteLine(backward.InAngularVelocity * backward.InTorque);
+
+			Assert.AreEqual(backward.OutAngularVelocity.Value(), operatingPoint.OutAngularVelocity.Value(), 1e-9);
+			Assert.AreEqual(backward.OutTorque.Value(), operatingPoint.OutTorque.Value(), 1e-9);
+			Assert.AreEqual(backward.InAngularVelocity.Value(), operatingPoint.InAngularVelocity.Value(), 1e-9);
+			Assert.AreEqual(backward.InTorque.Value(), operatingPoint.InTorque.Value(), 1e-9);
+		}
+
+
+		[Test]
+		public void TestTorqueConverterBehavior()
+		{
+			var tqLimit = 1600;
+
+			var tqInput = new[] {
+				"0.0,1.80,377.80",
+				"0.1,1.71,365.21",
+				"0.2,1.61,352.62",
+				"0.3,1.52,340.02",
+				"0.4,1.42,327.43",
+				"0.5,1.33,314.84",
+				"0.6,1.23,302.24",
+				"0.7,1.14,264.46",
+				"0.8,1.04,226.68",
+				"0.9,0.95,188.90",
+				"1.0,0.95,0.00",
+			};
+
+			var tqInput2 = new[] {
+				"0.0000,1.80,554.30",
+				"0.6000,1.23,443.44",
+				"0.9000,0.95,277.15",
+				"1.0000,0.95,0.00",
+				"5,0.959,-2290"
+			};
+			
+			var tqData =
+				TorqueConverterDataReader.ReadFromStream(InputDataHelper.InputDataAsStream("Speed Ratio, Torque Ratio,MP1000",
+																							tqInput), 1000.RPMtoRad(), tqLimit.RPMtoRad(), ExecutionMode.Engineering, 1, 0.1.SI<MeterPerSquareSecond>(),
+														0.1.SI<MeterPerSquareSecond>());
+
+			var outSpeed = 1200.RPMtoRad();
+			var results = new Dictionary<NewtonMeter, IList<TorqueConverterOperatingPoint>>();
+			for (var t = -2000; t < 2000; t += 10) {
+				var op = tqData.FindOperatingPoint(t.SI<NewtonMeter>(), outSpeed, 0.RPMtoRad());
+				results[t.SI<NewtonMeter>()] = op;
+			}
+
+			foreach (var result in results) {
+				var tmp = result.Value.FirstOrDefault();
+				Console.WriteLine("speed_out: {0},  torque_out: {1}, speed_in: {2},  torque_in: {3}", outSpeed.AsRPM, result.Key, tmp?.InAngularVelocity.AsRPM, tmp?.InTorque);
+			}
+		}
+
+		[TestCase]
+		public void TestOperatingPointSearch()
+		{
+			var dao = new DeclarationDataAdapter();
+			var gbxInputData = new JSONComponentInputData(@"E:\QUAM\Workspace\VECTO-Bugreports\BugReportTests\Bugreport Jobs\20181204_Daimler_VECTO-797_CTTWDB9560342V252797_DrivingAction\Allison_3000_P-6_3.49-0.65_6.824-A2G__CTTWDB9560342V252797.vgbx", null);
+			var engineInputData = new JSONComponentInputData(
+				@"E:\QUAM\Workspace\VECTO-Bugreports\BugReportTests\Bugreport Jobs\20181204_Daimler_VECTO-797_CTTWDB9560342V252797_DrivingAction\OM936LA200kW1100Nm-1.Gen-Euro6M5M-Euro6OBD-C_CTTWDB9560342V252797.veng", null);
+
+			var engineData = dao.CreateEngineData(engineInputData.EngineInputData, 600.RPMtoRad(), gbxInputData.GearboxInputData, new List<ITorqueLimitInputData>());
+			var tccData = dao.CreateGearboxData(
+				gbxInputData.GearboxInputData, engineData,
+				((IVehicleDeclarationInputData)gbxInputData.Vehicle).AxleGearInputData.Ratio, 0.5.SI<Meter>(),
+				VehicleCategory.Tractor);
+
+			var container = new MockVehicleContainer();
+
+			var runData = new VectoRunData() {
+				GearboxData = tccData,
+				EngineData = engineData
+			};
+			var shiftStrategy = new ATShiftStrategy(tccData, container);
+			var gearbox = new ATGearbox(container, shiftStrategy, runData); // new MockGearbox(container);
+			var tc = new TorqueConverter(
+				gearbox, shiftStrategy, container, tccData.TorqueConverterData, runData);
+			var engine = new CombustionEngine(container, engineData);
+			container.Engine = engine;
+
+			tc.Connect(engine);
+
+			gearbox.Gear = 2;
+			tc.Initialize(100.SI<NewtonMeter>(), 680.RPMtoRad());
+
+			container.EngineSpeed = engine.EngineSpeed;
+
+			var absTime = 0.SI<Second>();
+			var dt = 0.2.SI<Second>();
+
+			gearbox.Gear = 1;
+
+			var outTorque = 70.SI<NewtonMeter>();
+			var outSpeed = 1200.RPMtoRad();
+			tc.PreviousState.InTorque = 410.SI<NewtonMeter>();
+			var response = tc.Request(absTime, dt, outTorque, outSpeed);
+
+			Assert.IsInstanceOf<ResponseOverload>(response);
+
+			response = tc.Request(absTime, dt, outTorque, outSpeed, true);
+			Assert.IsInstanceOf<TorqueConverter>(response.Source);
+
+			var delta = ((ResponseDryRun)response).DeltaFullLoad;
+			outTorque = SearchAlgorithm.Search(
+				outTorque, delta, 20.SI<NewtonMeter>(),
+				getYValue: rsp => {
+					var r = (ResponseDryRun)rsp;
+					return r.DeltaFullLoad;
+				},
+				evaluateFunction: t => {
+					return tc.Request(absTime, dt, t, outSpeed, true);
+				},
+				criterion: rsp => {
+					var r = (ResponseDryRun)rsp;
+					return r.DeltaFullLoad.Value();
+				});
+
+			response = tc.Request(absTime, dt, outTorque, outSpeed);
+			Assert.IsInstanceOf<ResponseSuccess>(response);
+		}
+	}
 }
\ No newline at end of file