diff --git a/VectoCore/VectoCore/InputData/FileIO/JSON/JSONGearboxData.cs b/VectoCore/VectoCore/InputData/FileIO/JSON/JSONGearboxData.cs
index cefd8c1086532aba7b75c9a672fc5a92e90d0b24..53f8f9d710f044357290eb380309baf20e6b95de 100644
--- a/VectoCore/VectoCore/InputData/FileIO/JSON/JSONGearboxData.cs
+++ b/VectoCore/VectoCore/InputData/FileIO/JSON/JSONGearboxData.cs
@@ -484,21 +484,11 @@ namespace TUGraz.VectoCore.InputData.FileIO.JSON
 			get { return Body.GetEx<string>(JsonKeys.Gearbox_ModelName); }
 		}
 
-		public string Creator
-		{
-			get { return "N/A"; }
-		}
-
 		public string Date
 		{
 			get { return "N/A"; }
 		}
 
-		public string TechnicalReportId
-		{
-			get { return "N/A"; }
-		}
-
 		public CertificationMethod CertificationMethod
 		{
 			get { return CertificationMethod.NotCertified; }
diff --git a/VectoCore/VectoCore/InputData/Reader/FullLoadCurveReader.cs b/VectoCore/VectoCore/InputData/Reader/FullLoadCurveReader.cs
index ee415044494be15d9f2bb2df4a809e693f4a2db0..666f4c68a4dae77a0b738f0b245fdd4d922bad92 100644
--- a/VectoCore/VectoCore/InputData/Reader/FullLoadCurveReader.cs
+++ b/VectoCore/VectoCore/InputData/Reader/FullLoadCurveReader.cs
@@ -45,26 +45,20 @@ namespace TUGraz.VectoCore.InputData.Reader
 {
 	public class FullLoadCurveReader : LoggingObject
 	{
-		public static FullLoadCurve ReadFromFile(string fileName, bool declarationMode = false, bool engineFld = false)
+		public static EngineFullLoadCurve ReadFromFile(string fileName, bool declarationMode = false)
 		{
 			try {
 				var data = VectoCSVFile.Read(fileName);
-				return Create(data, declarationMode, engineFld);
+				return Create(data, declarationMode);
 			} catch (Exception ex) {
 				throw new VectoException("ERROR while reading FullLoadCurve File: " + ex.Message, ex);
 			}
 		}
 
-		public static FullLoadCurve Create(DataTable data, bool declarationMode = false, bool engineFld = false)
+		public static EngineFullLoadCurve Create(DataTable data, bool declarationMode = false)
 		{
-			if (engineFld) {
-				if (data.Columns.Count < 3) {
-					throw new VectoException("Engine FullLoadCurve Data File must consist of at least 3 columns.");
-				}
-			} else {
-				if (data.Columns.Count < 2) {
-					throw new VectoException("Gearbox FullLoadCurve Data File must consist of at least 2 columns.");
-				}
+			if (data.Columns.Count < 3) {
+				throw new VectoException("Engine FullLoadCurve Data File must consist of at least 3 columns.");
 			}
 
 			if (data.Rows.Count < 2) {
@@ -72,16 +66,16 @@ namespace TUGraz.VectoCore.InputData.Reader
 					"FullLoadCurve must consist of at least two lines with numeric values (below file header)");
 			}
 
-			List<FullLoadCurve.FullLoadCurveEntry> entriesFld;
-			if (HeaderIsValid(data.Columns, engineFld)) {
-				entriesFld = CreateFromColumnNames(data, engineFld);
+			List<EngineFullLoadCurve.FullLoadCurveEntry> entriesFld;
+			if (HeaderIsValid(data.Columns)) {
+				entriesFld = CreateFromColumnNames(data);
 			} else {
-				Logger<FullLoadCurve>().Warn(
+				Logger<EngineFullLoadCurve>().Warn(
 					"FullLoadCurve: Header Line is not valid. Expected: '{0}, {1}, {2}', Got: '{3}'. Falling back to column index.",
 					Fields.EngineSpeed, Fields.TorqueFullLoad,
 					Fields.TorqueDrag, string.Join(", ", data.Columns.Cast<DataColumn>().Select(c => c.ColumnName)));
 
-				entriesFld = CreateFromColumnIndizes(data, engineFld);
+				entriesFld = CreateFromColumnIndizes(data);
 			}
 
 			LookupData<PerSecond, PT1.PT1Result> tmp;
@@ -95,33 +89,33 @@ namespace TUGraz.VectoCore.InputData.Reader
 				}
 			}
 			entriesFld.Sort((entry1, entry2) => entry1.EngineSpeed.Value().CompareTo(entry2.EngineSpeed.Value()));
-			return new FullLoadCurve { FullLoadEntries = entriesFld, PT1Data = tmp };
+			return new EngineFullLoadCurve { FullLoadEntries = entriesFld, PT1Data = tmp };
 		}
 
-		private static bool HeaderIsValid(DataColumnCollection columns, bool engineFld)
+		private static bool HeaderIsValid(DataColumnCollection columns)
 		{
 			return columns.Contains(Fields.EngineSpeed)
 					&& columns.Contains(Fields.TorqueFullLoad)
-					&& (!engineFld || columns.Contains(Fields.TorqueDrag));
+					&& columns.Contains(Fields.TorqueDrag);
 		}
 
-		private static List<FullLoadCurve.FullLoadCurveEntry> CreateFromColumnNames(DataTable data, bool engineFld)
+		private static List<EngineFullLoadCurve.FullLoadCurveEntry> CreateFromColumnNames(DataTable data)
 		{
 			return (from DataRow row in data.Rows
-				select new FullLoadCurve.FullLoadCurveEntry {
+				select new EngineFullLoadCurve.FullLoadCurveEntry {
 					EngineSpeed = row.ParseDouble(Fields.EngineSpeed).RPMtoRad(),
 					TorqueFullLoad = row.ParseDouble(Fields.TorqueFullLoad).SI<NewtonMeter>(),
-					TorqueDrag = engineFld ? row.ParseDouble(Fields.TorqueDrag).SI<NewtonMeter>() : null
+					TorqueDrag = row.ParseDouble(Fields.TorqueDrag).SI<NewtonMeter>()
 				}).ToList();
 		}
 
-		private static List<FullLoadCurve.FullLoadCurveEntry> CreateFromColumnIndizes(DataTable data, bool engineFld)
+		private static List<EngineFullLoadCurve.FullLoadCurveEntry> CreateFromColumnIndizes(DataTable data)
 		{
 			return (from DataRow row in data.Rows
-				select new FullLoadCurve.FullLoadCurveEntry {
+				select new EngineFullLoadCurve.FullLoadCurveEntry {
 					EngineSpeed = row.ParseDouble(0).RPMtoRad(),
 					TorqueFullLoad = row.ParseDouble(1).SI<NewtonMeter>(),
-					TorqueDrag = engineFld ? row.ParseDouble(2).SI<NewtonMeter>() : null
+					TorqueDrag = row.ParseDouble(2).SI<NewtonMeter>()
 				}).ToList();
 		}
 
diff --git a/VectoCore/VectoCore/Models/Declaration/DeclarationData.cs b/VectoCore/VectoCore/Models/Declaration/DeclarationData.cs
index 6944fad5cf8b921816506a2f5e670bf9f0150fe4..694195235ba6c57bf46fca43fc37803ae1953bee 100644
--- a/VectoCore/VectoCore/Models/Declaration/DeclarationData.cs
+++ b/VectoCore/VectoCore/Models/Declaration/DeclarationData.cs
@@ -291,7 +291,7 @@ namespace TUGraz.VectoCore.Models.Declaration
 			/// <param name="fullLoadCurve"></param>
 			/// <param name="rpmLimit"></param>
 			/// <returns></returns>
-			internal static IEnumerable<Point> ShiftPolygonFldMargin(List<FullLoadCurve.FullLoadCurveEntry> fullLoadCurve,
+			internal static IEnumerable<Point> ShiftPolygonFldMargin(List<EngineFullLoadCurve.FullLoadCurveEntry> fullLoadCurve,
 				PerSecond rpmLimit)
 			{
 				return fullLoadCurve.TakeWhile(fldEntry => fldEntry.EngineSpeed < rpmLimit)
@@ -386,7 +386,8 @@ namespace TUGraz.VectoCore.Models.Declaration
 			private static PerSecond UpshiftLowRPM = 900.RPMtoRad();
 			private static PerSecond UpshiftHighRPM = 1150.RPMtoRad();
 
-			public static ShiftPolygon ComputeShiftPolygon(EngineFullLoadCurve fullLoadCurve, bool first = false, bool last = false)
+			public static ShiftPolygon ComputeShiftPolygon(EngineFullLoadCurve fullLoadCurve, bool first = false,
+				bool last = false)
 			{
 				var maxDragTorque = fullLoadCurve.MaxDragTorque * 1.1;
 				var maxTorque = fullLoadCurve.MaxTorque * 1.1;
diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Data/Engine/EngineFullLoadCurve.cs b/VectoCore/VectoCore/Models/SimulationComponent/Data/Engine/EngineFullLoadCurve.cs
index fa6b684bf5f16f5e5b02309e467162c705952bbe..aaedc3db532b5a9a77e7c371d3b15dbce89a8991 100644
--- a/VectoCore/VectoCore/Models/SimulationComponent/Data/Engine/EngineFullLoadCurve.cs
+++ b/VectoCore/VectoCore/Models/SimulationComponent/Data/Engine/EngineFullLoadCurve.cs
@@ -29,11 +29,15 @@
 *   Martin Rexeis, rexeis@ivt.tugraz.at, IVT, Graz University of Technology
 */
 
+using System;
 using System.Collections.Generic;
+using System.ComponentModel.DataAnnotations;
 using System.Data;
+using System.Diagnostics;
 using System.Linq;
 using TUGraz.VectoCommon.Exceptions;
 using TUGraz.VectoCommon.Utils;
+using TUGraz.VectoCore.Configuration;
 using TUGraz.VectoCore.InputData.Reader;
 using TUGraz.VectoCore.Models.Declaration;
 using TUGraz.VectoCore.Utils;
@@ -43,25 +47,26 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data.Engine
 	/// <summary>
 	/// Represents the Full load curve.
 	/// </summary>
-	public class EngineFullLoadCurve : FullLoadCurve
+	public class EngineFullLoadCurve : SimulationComponentData
 	{
+		private Watt _maxPower;
+		private PerSecond _ratedSpeed;
+		private NewtonMeter _maxTorque;
+		private NewtonMeter _maxDragTorque;
+
 		private PerSecond _preferredSpeed;
 		private PerSecond _engineSpeedLo; // 55% of Pmax
 		private PerSecond _engineSpeedHi; // 70% of Pmax
 		private PerSecond _n95hSpeed; // 95% of Pmax
 		private PerSecond _n80hSpeed; // 80% of Pmax
 
-		public static EngineFullLoadCurve ReadFromFile(string fileName, bool declarationMode = false)
-		{
-			var curve = FullLoadCurveReader.ReadFromFile(fileName, declarationMode, true);
-			return new EngineFullLoadCurve { FullLoadEntries = curve.FullLoadEntries, PT1Data = curve.PT1Data };
-		}
+		[Required, ValidateObject] internal List<FullLoadCurveEntry> FullLoadEntries;
 
-		public static EngineFullLoadCurve Create(DataTable data, bool declarationMode = false, NewtonMeter maxTorque = null)
-		{
-			var curve = FullLoadCurveReader.Create(data, declarationMode, true);
-			return new EngineFullLoadCurve() { FullLoadEntries = curve.FullLoadEntries, PT1Data = curve.PT1Data };
-		}
+		private SortedList<PerSecond, int> _quickLookup;
+
+		[Required] internal LookupData<PerSecond, PT1.PT1Result> PT1Data;
+
+		internal EngineFullLoadCurve() {}
 
 		public Watt FullLoadStationaryPower(PerSecond angularVelocity)
 		{
@@ -80,6 +85,147 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data.Engine
 			return PT1Data.Lookup(angularVelocity);
 		}
 
+		/// <summary>
+		/// Get the rated speed from the given full-load curve (i.e. speed with max. power)
+		/// </summary>
+		[Required, SIRange(0, 5000 * Constants.RPMToRad)]
+		public PerSecond RatedSpeed
+		{
+			get { return _ratedSpeed ?? ComputeRatedSpeed().Item1; }
+		}
+
+		/// <summary>
+		/// Gets the maximum power.
+		/// </summary>
+		[Required, SIRange(0, 10000 * 5000 * Constants.RPMToRad)]
+		public Watt MaxPower
+		{
+			get { return _maxPower ?? ComputeRatedSpeed().Item2; }
+		}
+
+		public NewtonMeter MaxTorque
+		{
+			get { return _maxTorque ?? FindMaxTorque(); }
+		}
+
+		public NewtonMeter MaxDragTorque
+		{
+			get { return _maxDragTorque ?? FindMaxDragTorque(); }
+		}
+
+		public virtual NewtonMeter FullLoadStationaryTorque(PerSecond angularVelocity)
+		{
+			var idx = FindIndex(angularVelocity);
+			return VectoMath.Interpolate(FullLoadEntries[idx - 1].EngineSpeed, FullLoadEntries[idx].EngineSpeed,
+				FullLoadEntries[idx - 1].TorqueFullLoad, FullLoadEntries[idx].TorqueFullLoad,
+				angularVelocity);
+		}
+
+		public virtual NewtonMeter DragLoadStationaryTorque(PerSecond angularVelocity)
+		{
+			var idx = FindIndex(angularVelocity);
+			return VectoMath.Interpolate(FullLoadEntries[idx - 1].EngineSpeed, FullLoadEntries[idx].EngineSpeed,
+				FullLoadEntries[idx - 1].TorqueDrag, FullLoadEntries[idx].TorqueDrag,
+				angularVelocity);
+		}
+
+		private NewtonMeter FindMaxTorque()
+		{
+			_maxTorque = FullLoadEntries.Max(x => x.TorqueFullLoad);
+			return _maxTorque;
+		}
+
+		private NewtonMeter FindMaxDragTorque()
+		{
+			_maxDragTorque = FullLoadEntries.Min(x => x.TorqueDrag);
+			return _maxDragTorque;
+		}
+
+		/// <summary>
+		/// Compute the engine's rated speed from the given full-load curve (i.e. engine speed with max. power)
+		/// </summary>
+		protected Tuple<PerSecond, Watt> ComputeRatedSpeed()
+		{
+			var max = new Tuple<PerSecond, Watt>(0.SI<PerSecond>(), 0.SI<Watt>());
+			for (var idx = 1; idx < FullLoadEntries.Count; idx++) {
+				var currentMax = FindMaxPower(FullLoadEntries[idx - 1], FullLoadEntries[idx]);
+				if (currentMax.Item2 > max.Item2) {
+					max = currentMax;
+				}
+			}
+
+			_ratedSpeed = max.Item1;
+			_maxPower = max.Item2;
+
+			return max;
+		}
+
+		private Tuple<PerSecond, Watt> FindMaxPower(FullLoadCurveEntry p1, FullLoadCurveEntry p2)
+		{
+			if (p1.EngineSpeed.IsEqual(p2.EngineSpeed)) {
+				return Tuple.Create(p1.EngineSpeed, p1.TorqueFullLoad * p1.EngineSpeed);
+			}
+
+			if (p2.EngineSpeed < p1.EngineSpeed) {
+				var tmp = p1;
+				p1 = p2;
+				p2 = tmp;
+			}
+
+			// y = kx + d
+			var k = (p2.TorqueFullLoad - p1.TorqueFullLoad) / (p2.EngineSpeed - p1.EngineSpeed);
+			var d = p2.TorqueFullLoad - k * p2.EngineSpeed;
+			if (k.IsEqual(0)) {
+				return Tuple.Create(p2.EngineSpeed, p2.TorqueFullLoad * p2.EngineSpeed);
+			}
+			var engineSpeedMaxPower = -d / (2 * k);
+			if (engineSpeedMaxPower.IsSmaller(p1.EngineSpeed) || engineSpeedMaxPower.IsGreater(p2.EngineSpeed)) {
+				if (p2.TorqueFullLoad * p2.EngineSpeed > p1.TorqueFullLoad * p1.EngineSpeed) {
+					return Tuple.Create(p2.EngineSpeed, p2.TorqueFullLoad * p2.EngineSpeed);
+				}
+				return Tuple.Create(p1.EngineSpeed, p1.TorqueFullLoad * p1.EngineSpeed);
+			}
+			var engineTorqueMaxPower = FullLoadStationaryTorque(engineSpeedMaxPower);
+			return Tuple.Create(engineSpeedMaxPower, engineTorqueMaxPower * engineSpeedMaxPower);
+		}
+
+
+		/// <summary>
+		/// Get item index for the segment of the full-load curve where the angularVelocity lies within.
+		/// </summary>
+		protected int FindIndex(PerSecond angularVelocity)
+		{
+			if (angularVelocity < FullLoadEntries.First().EngineSpeed) {
+				return 1;
+			}
+			if (angularVelocity > FullLoadEntries.Last().EngineSpeed) {
+				return FullLoadEntries.Count - 1;
+			}
+
+			if (_quickLookup == null) {
+				_quickLookup = new SortedList<PerSecond, int>();
+				var i = 10;
+				for (; i < FullLoadEntries.Count; i += 10) {
+					_quickLookup.Add(FullLoadEntries[i].EngineSpeed, Math.Max(1, i - 10));
+				}
+				_quickLookup.Add(FullLoadEntries.Last().EngineSpeed + 0.1.SI<PerSecond>(), Math.Max(1, i - 10));
+			}
+			var start = 1;
+			foreach (var lookup in _quickLookup.Where(lookup => angularVelocity < lookup.Key)) {
+				start = lookup.Value;
+				break;
+			}
+
+			for (var index = start; index < FullLoadEntries.Count; index++) {
+				if (angularVelocity >= FullLoadEntries[index - 1].EngineSpeed &&
+					angularVelocity <= FullLoadEntries[index].EngineSpeed) {
+					return index;
+				}
+			}
+			throw new VectoException("angular velocity {0} exceeds full load curve: min: {1}  max: {2}", angularVelocity,
+				FullLoadEntries.First().EngineSpeed, FullLoadEntries.Last().EngineSpeed);
+		}
+
 		/// <summary>
 		///	Get the engine's preferred speed from the given full-load curve (i.e. Speed at 51% torque/speed-integral between idling and N95h.)
 		/// </summary>
@@ -271,5 +417,52 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data.Engine
 		}
 
 		#endregion
+
+		[DebuggerDisplay("n: {EngineSpeed}, fullTorque: {TorqueFullLoad}, dragTorque: {TorqueDrag}")]
+		internal class FullLoadCurveEntry
+		{
+			[Required, SIRange(0, 5000 * Constants.RPMToRad)]
+			public PerSecond EngineSpeed { get; set; }
+
+			[Required, SIRange(0, 10000)]
+			public NewtonMeter TorqueFullLoad { get; set; }
+
+			[Required, SIRange(-10000, 0)]
+			public NewtonMeter TorqueDrag { get; set; }
+
+			#region Equality members
+
+			protected bool Equals(FullLoadCurveEntry other)
+			{
+				return Equals(EngineSpeed, other.EngineSpeed) && Equals(TorqueFullLoad, other.TorqueFullLoad) &&
+						Equals(TorqueDrag, other.TorqueDrag);
+			}
+
+			public override bool Equals(object obj)
+			{
+				if (ReferenceEquals(null, obj)) {
+					return false;
+				}
+				if (ReferenceEquals(this, obj)) {
+					return true;
+				}
+				if (obj.GetType() != GetType()) {
+					return false;
+				}
+				return Equals((FullLoadCurveEntry)obj);
+			}
+
+			public override int GetHashCode()
+			{
+				unchecked {
+					var hashCode = EngineSpeed != null ? EngineSpeed.GetHashCode() : 0;
+					hashCode = (hashCode * 397) ^ (TorqueFullLoad != null ? TorqueFullLoad.GetHashCode() : 0);
+					hashCode = (hashCode * 397) ^ (TorqueDrag != null ? TorqueDrag.GetHashCode() : 0);
+					return hashCode;
+				}
+			}
+
+			#endregion
+		}
 	}
 }
\ No newline at end of file
diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Data/FullLoadCurve.cs b/VectoCore/VectoCore/Models/SimulationComponent/Data/FullLoadCurve.cs
deleted file mode 100644
index b7bf245479af05eedde94ad0a815be27b23b0b4b..0000000000000000000000000000000000000000
--- a/VectoCore/VectoCore/Models/SimulationComponent/Data/FullLoadCurve.cs
+++ /dev/null
@@ -1,245 +0,0 @@
-/*
-* This file is part of VECTO.
-*
-* Copyright © 2012-2016 European Union
-*
-* Developed by Graz University of Technology,
-*              Institute of Internal Combustion Engines and Thermodynamics,
-*              Institute of Technical Informatics
-*
-* VECTO is licensed under the EUPL, Version 1.1 or - as soon they will be approved
-* by the European Commission - subsequent versions of the EUPL (the "Licence");
-* You may not use VECTO except in compliance with the Licence.
-* You may obtain a copy of the Licence at:
-*
-* https://joinup.ec.europa.eu/community/eupl/og_page/eupl
-*
-* Unless required by applicable law or agreed to in writing, VECTO
-* distributed under the Licence is distributed on an "AS IS" basis,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the Licence for the specific language governing permissions and
-* limitations under the Licence.
-*
-* Authors:
-*   Stefan Hausberger, hausberger@ivt.tugraz.at, IVT, Graz University of Technology
-*   Christian Kreiner, christian.kreiner@tugraz.at, ITI, Graz University of Technology
-*   Michael Krisper, michael.krisper@tugraz.at, ITI, Graz University of Technology
-*   Raphael Luz, luz@ivt.tugraz.at, IVT, Graz University of Technology
-*   Markus Quaritsch, markus.quaritsch@tugraz.at, IVT, Graz University of Technology
-*   Martin Rexeis, rexeis@ivt.tugraz.at, IVT, Graz University of Technology
-*/
-
-using System;
-using System.Collections.Generic;
-using System.ComponentModel.DataAnnotations;
-using System.Diagnostics;
-using System.Linq;
-using TUGraz.VectoCommon.Exceptions;
-using TUGraz.VectoCommon.Utils;
-using TUGraz.VectoCore.Configuration;
-using TUGraz.VectoCore.Models.Declaration;
-
-namespace TUGraz.VectoCore.Models.SimulationComponent.Data
-{
-	public class FullLoadCurve : SimulationComponentData
-	{
-		private Watt _maxPower;
-		private PerSecond _ratedSpeed;
-		private NewtonMeter _maxTorque;
-		private NewtonMeter _maxDragTorque;
-
-		[Required, ValidateObject] internal List<FullLoadCurveEntry> FullLoadEntries;
-
-		private SortedList<PerSecond, int> _quickLookup;
-
-		[Required] internal LookupData<PerSecond, PT1.PT1Result> PT1Data;
-
-		/// <summary>
-		/// Get the rated speed from the given full-load curve (i.e. speed with max. power)
-		/// </summary>
-		[Required, SIRange(0, 5000 * Constants.RPMToRad)]
-		public PerSecond RatedSpeed
-		{
-			get { return _ratedSpeed ?? ComputeRatedSpeed().Item1; }
-		}
-
-		/// <summary>
-		/// Gets the maximum power.
-		/// </summary>
-		[Required, SIRange(0, 10000 * 5000 * Constants.RPMToRad)]
-		public Watt MaxPower
-		{
-			get { return _maxPower ?? ComputeRatedSpeed().Item2; }
-		}
-
-		public NewtonMeter MaxTorque
-		{
-			get { return _maxTorque ?? FindMaxTorque(); }
-		}
-
-		public NewtonMeter MaxDragTorque
-		{
-			get { return _maxDragTorque ?? FindMaxDragTorque(); }
-		}
-
-		public virtual NewtonMeter FullLoadStationaryTorque(PerSecond angularVelocity)
-		{
-			var idx = FindIndex(angularVelocity);
-			return VectoMath.Interpolate(FullLoadEntries[idx - 1].EngineSpeed, FullLoadEntries[idx].EngineSpeed,
-				FullLoadEntries[idx - 1].TorqueFullLoad, FullLoadEntries[idx].TorqueFullLoad,
-				angularVelocity);
-		}
-
-		public virtual NewtonMeter DragLoadStationaryTorque(PerSecond angularVelocity)
-		{
-			var idx = FindIndex(angularVelocity);
-			return VectoMath.Interpolate(FullLoadEntries[idx - 1].EngineSpeed, FullLoadEntries[idx].EngineSpeed,
-				FullLoadEntries[idx - 1].TorqueDrag, FullLoadEntries[idx].TorqueDrag,
-				angularVelocity);
-		}
-
-		private NewtonMeter FindMaxTorque()
-		{
-			_maxTorque = FullLoadEntries.Max(x => x.TorqueFullLoad);
-			return _maxTorque;
-		}
-
-		private NewtonMeter FindMaxDragTorque()
-		{
-			_maxDragTorque = FullLoadEntries.Min(x => x.TorqueDrag);
-			return _maxDragTorque;
-		}
-
-		/// <summary>
-		/// Compute the engine's rated speed from the given full-load curve (i.e. engine speed with max. power)
-		/// </summary>
-		protected Tuple<PerSecond, Watt> ComputeRatedSpeed()
-		{
-			var max = new Tuple<PerSecond, Watt>(0.SI<PerSecond>(), 0.SI<Watt>());
-			for (var idx = 1; idx < FullLoadEntries.Count; idx++) {
-				var currentMax = FindMaxPower(FullLoadEntries[idx - 1], FullLoadEntries[idx]);
-				if (currentMax.Item2 > max.Item2) {
-					max = currentMax;
-				}
-			}
-
-			_ratedSpeed = max.Item1;
-			_maxPower = max.Item2;
-
-			return max;
-		}
-
-		private Tuple<PerSecond, Watt> FindMaxPower(FullLoadCurveEntry p1, FullLoadCurveEntry p2)
-		{
-			if (p1.EngineSpeed.IsEqual(p2.EngineSpeed)) {
-				return Tuple.Create(p1.EngineSpeed, p1.TorqueFullLoad * p1.EngineSpeed);
-			}
-
-			if (p2.EngineSpeed < p1.EngineSpeed) {
-				var tmp = p1;
-				p1 = p2;
-				p2 = tmp;
-			}
-
-			// y = kx + d
-			var k = (p2.TorqueFullLoad - p1.TorqueFullLoad) / (p2.EngineSpeed - p1.EngineSpeed);
-			var d = p2.TorqueFullLoad - k * p2.EngineSpeed;
-			if (k.IsEqual(0)) {
-				return Tuple.Create(p2.EngineSpeed, p2.TorqueFullLoad * p2.EngineSpeed);
-			}
-			var engineSpeedMaxPower = -d / (2 * k);
-			if (engineSpeedMaxPower.IsSmaller(p1.EngineSpeed) || engineSpeedMaxPower.IsGreater(p2.EngineSpeed)) {
-				if (p2.TorqueFullLoad * p2.EngineSpeed > p1.TorqueFullLoad * p1.EngineSpeed) {
-					return Tuple.Create(p2.EngineSpeed, p2.TorqueFullLoad * p2.EngineSpeed);
-				}
-				return Tuple.Create(p1.EngineSpeed, p1.TorqueFullLoad * p1.EngineSpeed);
-			}
-			var engineTorqueMaxPower = FullLoadStationaryTorque(engineSpeedMaxPower);
-			return Tuple.Create(engineSpeedMaxPower, engineTorqueMaxPower * engineSpeedMaxPower);
-		}
-
-
-		/// <summary>
-		/// Get item index for the segment of the full-load curve where the angularVelocity lies within.
-		/// </summary>
-		protected int FindIndex(PerSecond angularVelocity)
-		{
-			if (angularVelocity < FullLoadEntries.First().EngineSpeed) {
-				return 1;
-			}
-			if (angularVelocity > FullLoadEntries.Last().EngineSpeed) {
-				return FullLoadEntries.Count - 1;
-			}
-
-			if (_quickLookup == null) {
-				_quickLookup = new SortedList<PerSecond, int>();
-				var i = 10;
-				for (; i < FullLoadEntries.Count; i += 10) {
-					_quickLookup.Add(FullLoadEntries[i].EngineSpeed, Math.Max(1, i - 10));
-				}
-				_quickLookup.Add(FullLoadEntries.Last().EngineSpeed + 0.1.SI<PerSecond>(), Math.Max(1, i - 10));
-			}
-			var start = 1;
-			foreach (var lookup in _quickLookup.Where(lookup => angularVelocity < lookup.Key)) {
-				start = lookup.Value;
-				break;
-			}
-
-			for (var index = start; index < FullLoadEntries.Count; index++) {
-				if (angularVelocity >= FullLoadEntries[index - 1].EngineSpeed &&
-					angularVelocity <= FullLoadEntries[index].EngineSpeed) {
-					return index;
-				}
-			}
-			throw new VectoException("angular velocity {0} exceeds full load curve: min: {1}  max: {2}", angularVelocity,
-				FullLoadEntries.First().EngineSpeed, FullLoadEntries.Last().EngineSpeed);
-		}
-
-		[DebuggerDisplay("n: {EngineSpeed}, fullTorque: {TorqueFullLoad}, dragTorque: {TorqueDrag}")]
-		internal class FullLoadCurveEntry
-		{
-			[Required, SIRange(0, 5000 * Constants.RPMToRad)]
-			public PerSecond EngineSpeed { get; set; }
-
-			[Required, SIRange(0, 10000)]
-			public NewtonMeter TorqueFullLoad { get; set; }
-
-			[Required, SIRange(-10000, 0)]
-			public NewtonMeter TorqueDrag { get; set; }
-
-			#region Equality members
-
-			protected bool Equals(FullLoadCurveEntry other)
-			{
-				return Equals(EngineSpeed, other.EngineSpeed) && Equals(TorqueFullLoad, other.TorqueFullLoad) &&
-						Equals(TorqueDrag, other.TorqueDrag);
-			}
-
-			public override bool Equals(object obj)
-			{
-				if (ReferenceEquals(null, obj)) {
-					return false;
-				}
-				if (ReferenceEquals(this, obj)) {
-					return true;
-				}
-				if (obj.GetType() != GetType()) {
-					return false;
-				}
-				return Equals((FullLoadCurveEntry)obj);
-			}
-
-			public override int GetHashCode()
-			{
-				unchecked {
-					var hashCode = EngineSpeed != null ? EngineSpeed.GetHashCode() : 0;
-					hashCode = (hashCode * 397) ^ (TorqueFullLoad != null ? TorqueFullLoad.GetHashCode() : 0);
-					hashCode = (hashCode * 397) ^ (TorqueDrag != null ? TorqueDrag.GetHashCode() : 0);
-					return hashCode;
-				}
-			}
-
-			#endregion
-		}
-	}
-}
\ No newline at end of file
diff --git a/VectoCore/VectoCoreTest/Dummy/EngineFLDTest.cs b/VectoCore/VectoCoreTest/Dummy/EngineFLDTest.cs
index 6f3f6a355040f939f5362680d6c1852b65934b75..8d41f094b662da891c1ab8738950fc51a7dad529 100644
--- a/VectoCore/VectoCoreTest/Dummy/EngineFLDTest.cs
+++ b/VectoCore/VectoCoreTest/Dummy/EngineFLDTest.cs
@@ -34,6 +34,7 @@ using System.Diagnostics;
 using System.IO;
 using Microsoft.VisualStudio.TestTools.UnitTesting;
 using TUGraz.VectoCommon.Utils;
+using TUGraz.VectoCore.InputData.Reader;
 using TUGraz.VectoCore.Models.SimulationComponent.Data.Engine;
 
 namespace TUGraz.VectoCore.Tests.Dummy
@@ -47,11 +48,12 @@ namespace TUGraz.VectoCore.Tests.Dummy
 			var engineFile1 = @"TestData\Components\40t_Long_Haul_Truck.vfld";
 			var engineFile2 = @"E:\QUAM\Downloads\EngineFLD\Map_375c_BB1390_modTUG_R49_375c_BB1386.vfld";
 
-			if (!File.Exists(engineFile2))
+			if (!File.Exists(engineFile2)) {
 				Assert.Inconclusive("Confidential File not found. Test cannot run without file.");
+			}
 
-			var map1 = EngineFullLoadCurve.ReadFromFile(engineFile1, true);
-			var map2 = EngineFullLoadCurve.ReadFromFile(engineFile2, true);
+			var map1 = FullLoadCurveReader.ReadFromFile(engineFile1, true);
+			var map2 = FullLoadCurveReader.ReadFromFile(engineFile2, true);
 
 			map1.FullLoadStationaryTorque(1000.RPMtoRad());
 			map2.FullLoadStationaryTorque(1000.RPMtoRad());
@@ -77,10 +79,11 @@ namespace TUGraz.VectoCore.Tests.Dummy
 		{
 			var engineFile2 = @"E:\QUAM\Downloads\EngineFLD\Map_375c_BB1390_modTUG_R49_375c_BB1386.vfld";
 
-			if (!File.Exists(engineFile2))
+			if (!File.Exists(engineFile2)) {
 				Assert.Inconclusive("Confidential File not found. Test cannot run without file.");
+			}
 
-			var map = EngineFullLoadCurve.ReadFromFile(engineFile2, true);
+			var map = FullLoadCurveReader.ReadFromFile(engineFile2, true);
 
 			Assert.AreEqual(1208, map.FullLoadStationaryTorque(500.RPMtoRad()).Value(), 1e-3);
 
diff --git a/VectoCore/VectoCoreTest/Models/Declaration/ShiftPolygonTest.cs b/VectoCore/VectoCoreTest/Models/Declaration/ShiftPolygonTest.cs
index c2249114939f526752c2d284fa49f26c25363f3f..96344a77f16f41fe558d8abd6244295affd1c6f2 100644
--- a/VectoCore/VectoCoreTest/Models/Declaration/ShiftPolygonTest.cs
+++ b/VectoCore/VectoCoreTest/Models/Declaration/ShiftPolygonTest.cs
@@ -38,6 +38,7 @@ using TUGraz.VectoCommon.InputData;
 using TUGraz.VectoCommon.Models;
 using TUGraz.VectoCommon.Utils;
 using TUGraz.VectoCore.InputData.FileIO.JSON;
+using TUGraz.VectoCore.InputData.Reader;
 using TUGraz.VectoCore.InputData.Reader.DataObjectAdapter;
 using TUGraz.VectoCore.Models.Declaration;
 using TUGraz.VectoCore.Models.SimulationComponent.Data;
@@ -248,7 +249,7 @@ namespace TUGraz.VectoCore.Tests.Models.Declaration
 				DeclarationData.Gearbox.ShiftPolygonFldMargin(
 					engineFld.Select(
 						p =>
-							new FullLoadCurve.FullLoadCurveEntry() {
+							new EngineFullLoadCurve.FullLoadCurveEntry() {
 								EngineSpeed = p.X.SI<PerSecond>(),
 								TorqueFullLoad = p.Y.SI<NewtonMeter>()
 							}).ToList(),
@@ -444,7 +445,7 @@ namespace TUGraz.VectoCore.Tests.Models.Declaration
 			};
 
 			var fullLoadCurves = new Dictionary<uint, EngineFullLoadCurve>();
-			fullLoadCurves[0] = EngineFullLoadCurve.ReadFromFile(engineFldFile, true);
+			fullLoadCurves[0] = FullLoadCurveReader.ReadFromFile(engineFldFile, true);
 			fullLoadCurves[0].EngineData = engineData;
 			for (uint i = 1; i <= gearboxData.Gears.Count; i++) {
 				fullLoadCurves[i] = AbstractSimulationDataAdapter.IntersectFullLoadCurves(fullLoadCurves[0],
@@ -531,7 +532,7 @@ namespace TUGraz.VectoCore.Tests.Models.Declaration
 			};
 
 			var fullLoadCurves = new Dictionary<uint, EngineFullLoadCurve>();
-			fullLoadCurves[0] = EngineFullLoadCurve.ReadFromFile(Path.Combine(BasePath, engineFldFile), true);
+			fullLoadCurves[0] = FullLoadCurveReader.ReadFromFile(Path.Combine(BasePath, engineFldFile), true);
 			fullLoadCurves[0].EngineData = engineData;
 			for (uint i = 1; i <= gearboxData.Gears.Count; i++) {
 				fullLoadCurves[i] = AbstractSimulationDataAdapter.IntersectFullLoadCurves(fullLoadCurves[0],
diff --git a/VectoCore/VectoCoreTest/Models/Simulation/MeasuredSpeedModeTest.cs b/VectoCore/VectoCoreTest/Models/Simulation/MeasuredSpeedModeTest.cs
index 3e6abd469222220bc2e8a963282f1fafd771af2d..e0b70749528b1d5896d71a27f15bd9bd4d0ac2e9 100644
--- a/VectoCore/VectoCoreTest/Models/Simulation/MeasuredSpeedModeTest.cs
+++ b/VectoCore/VectoCoreTest/Models/Simulation/MeasuredSpeedModeTest.cs
@@ -224,7 +224,7 @@ namespace TUGraz.VectoCore.Tests.Models.Simulation
 			fullLoad.Rows.Add("0", "5000", "-5000", "0");
 			fullLoad.Rows.Add("3000", "5000", "-5000", "0");
 
-			var fullLoadCurve = EngineFullLoadCurve.Create(fullLoad);
+			var fullLoadCurve = FullLoadCurveReader.Create(fullLoad);
 			var data = new VectoRunData {
 				Cycle = drivingCycle,
 				VehicleData =
@@ -291,7 +291,7 @@ namespace TUGraz.VectoCore.Tests.Models.Simulation
 			fullLoad.Rows.Add("0", "5000", "-5000", "0");
 			fullLoad.Rows.Add("3000", "5000", "-5000", "0");
 
-			var fullLoadCurve = EngineFullLoadCurve.Create(fullLoad);
+			var fullLoadCurve = FullLoadCurveReader.Create(fullLoad);
 			var data = new VectoRunData {
 				Cycle = drivingCycle,
 				VehicleData =
diff --git a/VectoCore/VectoCoreTest/Models/Simulation/PwheelModeTests.cs b/VectoCore/VectoCoreTest/Models/Simulation/PwheelModeTests.cs
index fcb338353fe65a99c7901b4fb11cab963d117aae..49658a7215a0932f69479429ed12a8312c0ca307 100644
--- a/VectoCore/VectoCoreTest/Models/Simulation/PwheelModeTests.cs
+++ b/VectoCore/VectoCoreTest/Models/Simulation/PwheelModeTests.cs
@@ -128,7 +128,7 @@ namespace TUGraz.VectoCore.Tests.Models.Simulation
 			fullLoad.Rows.Add("0", "5000", "-5000", "0");
 			fullLoad.Rows.Add("3000", "5000", "-5000", "0");
 
-			var fullLoadCurve = EngineFullLoadCurve.Create(fullLoad);
+			var fullLoadCurve = FullLoadCurveReader.Create(fullLoad);
 			var data = new VectoRunData {
 				Cycle = drivingCycle,
 				AxleGearData = new AxleGearData { AxleGear = new GearData { Ratio = 2.3 } },
diff --git a/VectoCore/VectoCoreTest/Models/SimulationComponent/GearboxTest.cs b/VectoCore/VectoCoreTest/Models/SimulationComponent/GearboxTest.cs
index dc8277a9e0fc52db89b7bce5de6890f5015f7fc0..7343808a0915dfdff667ea7fd844ceefe5ebd461 100644
--- a/VectoCore/VectoCoreTest/Models/SimulationComponent/GearboxTest.cs
+++ b/VectoCore/VectoCoreTest/Models/SimulationComponent/GearboxTest.cs
@@ -250,7 +250,7 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponent
 				Inertia = 0.SI<KilogramSquareMeter>(),
 			};
 			var fullLoadCurves = new Dictionary<uint, EngineFullLoadCurve>();
-			fullLoadCurves[0] = EngineFullLoadCurve.Create(
+			fullLoadCurves[0] = FullLoadCurveReader.Create(
 				VectoCSVFile.ReadStream(
 					InputDataHelper.InputDataAsStream("engine speed [1/min],full load torque [Nm],motoring torque [Nm],PT1 [s]",
 						fld)));
diff --git a/VectoCore/VectoCoreTest/Models/SimulationComponentData/FullLoadCurveTest.cs b/VectoCore/VectoCoreTest/Models/SimulationComponentData/FullLoadCurveTest.cs
index 8a03c5cb6eb9f0f05686c75e259eb4a4c6a33f7a..a07591196884eaaa99f425e8077fef9511e3bc2c 100644
--- a/VectoCore/VectoCoreTest/Models/SimulationComponentData/FullLoadCurveTest.cs
+++ b/VectoCore/VectoCoreTest/Models/SimulationComponentData/FullLoadCurveTest.cs
@@ -36,6 +36,7 @@ using NLog.Config;
 using NLog.Targets;
 using TUGraz.VectoCommon.Exceptions;
 using TUGraz.VectoCommon.Utils;
+using TUGraz.VectoCore.InputData.Reader;
 using TUGraz.VectoCore.InputData.Reader.ComponentData;
 using TUGraz.VectoCore.Models.Simulation.Data;
 using TUGraz.VectoCore.Models.SimulationComponent.Data;
@@ -57,7 +58,7 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponentData
 		[TestMethod]
 		public void TestFullLoadStaticTorque()
 		{
-			var fldCurve = EngineFullLoadCurve.ReadFromFile(CoachEngineFLD);
+			var fldCurve = FullLoadCurveReader.ReadFromFile(CoachEngineFLD);
 
 			Assert.AreEqual(1180, fldCurve.FullLoadStationaryTorque(560.RPMtoRad()).Value(), Tolerance);
 			Assert.AreEqual(1352, fldCurve.FullLoadStationaryTorque(2000.RPMtoRad()).Value(), Tolerance);
@@ -67,14 +68,14 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponentData
 		[TestMethod]
 		public void TestFullLoadEngineSpeedRated()
 		{
-			var fldCurve = EngineFullLoadCurve.ReadFromFile(CoachEngineFLD);
+			var fldCurve = FullLoadCurveReader.ReadFromFile(CoachEngineFLD);
 			Assert.AreEqual(181.8444, fldCurve.RatedSpeed.Value(), Tolerance);
 		}
 
 		[TestMethod]
 		public void TestFullLoadStaticPower()
 		{
-			var fldCurve = EngineFullLoadCurve.ReadFromFile(CoachEngineFLD);
+			var fldCurve = FullLoadCurveReader.ReadFromFile(CoachEngineFLD);
 
 			Assert.AreEqual(69198.814183, fldCurve.FullLoadStationaryPower(560.RPMtoRad()).Value(), Tolerance);
 			Assert.AreEqual(283162.218372, fldCurve.FullLoadStationaryPower(2000.RPMtoRad()).Value(), Tolerance);
@@ -84,7 +85,7 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponentData
 		[TestMethod]
 		public void TestDragLoadStaticTorque()
 		{
-			var fldCurve = EngineFullLoadCurve.ReadFromFile(CoachEngineFLD);
+			var fldCurve = FullLoadCurveReader.ReadFromFile(CoachEngineFLD);
 
 			Assert.AreEqual(-149, fldCurve.DragLoadStationaryTorque(560.RPMtoRad()).Value(), Tolerance);
 			Assert.AreEqual(-301, fldCurve.DragLoadStationaryTorque(2000.RPMtoRad()).Value(), Tolerance);
@@ -96,7 +97,7 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponentData
 		[TestMethod]
 		public void TestDragLoadStaticPower()
 		{
-			var fldCurve = EngineFullLoadCurve.ReadFromFile(CoachEngineFLD);
+			var fldCurve = FullLoadCurveReader.ReadFromFile(CoachEngineFLD);
 
 			Assert.AreEqual(-8737.81636, fldCurve.DragLoadStationaryPower(560.RPMtoRad()).Value(), Tolerance);
 			Assert.AreEqual(-63041.29254, fldCurve.DragLoadStationaryPower(2000.RPMtoRad()).Value(), Tolerance);
@@ -106,7 +107,7 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponentData
 		[TestMethod]
 		public void TestPT1()
 		{
-			var fldCurve = EngineFullLoadCurve.ReadFromFile(CoachEngineFLD);
+			var fldCurve = FullLoadCurveReader.ReadFromFile(CoachEngineFLD);
 
 			Assert.AreEqual(0.6, fldCurve.PT1(560.RPMtoRad()).Value.Value(), Tolerance);
 			Assert.AreEqual(0.25, fldCurve.PT1(2000.RPMtoRad()).Value.Value(), Tolerance);
@@ -116,7 +117,7 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponentData
 		[TestMethod]
 		public void TestPreferredSpeed()
 		{
-			var fldCurve = EngineFullLoadCurve.ReadFromFile(CoachEngineFLD);
+			var fldCurve = FullLoadCurveReader.ReadFromFile(CoachEngineFLD);
 			fldCurve.EngineData = new CombustionEngineData { IdleSpeed = 560.RPMtoRad() };
 			AssertHelper.AreRelativeEqual(130.691151551712.SI<PerSecond>(), fldCurve.PreferredSpeed);
 			var totalArea = fldCurve.ComputeArea(fldCurve.EngineData.IdleSpeed, fldCurve.N95hSpeed);
@@ -145,7 +146,7 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponentData
 				"2100,1100,-320,0.25",
 			};
 			var fldEntries = InputDataHelper.InputDataAsStream("n [U/min],Mfull [Nm],Mdrag [Nm],<PT1> [s] ", fldData);
-			var fldCurve = EngineFullLoadCurve.Create(VectoCSVFile.ReadStream(fldEntries));
+			var fldCurve = FullLoadCurveReader.Create(VectoCSVFile.ReadStream(fldEntries));
 			fldCurve.EngineData = new CombustionEngineData { IdleSpeed = 560.RPMtoRad() };
 
 			var totalArea = fldCurve.ComputeArea(fldCurve.EngineData.IdleSpeed, fldCurve.N95hSpeed);
@@ -170,7 +171,7 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponentData
 				"4000,811.7189964,-138.7132, 1.0",
 			};
 			var fldEntries = InputDataHelper.InputDataAsStream("n [U/min],Mfull [Nm],Mdrag [Nm],<PT1> [s] ", fldData);
-			var fldCurve = EngineFullLoadCurve.Create(VectoCSVFile.ReadStream(fldEntries));
+			var fldCurve = FullLoadCurveReader.Create(VectoCSVFile.ReadStream(fldEntries));
 			fldCurve.EngineData = new CombustionEngineData { IdleSpeed = 560.RPMtoRad() };
 
 			AssertHelper.Exception<VectoException>(() => { var tmp = fldCurve.N95hSpeed; });
@@ -187,7 +188,7 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponentData
 		public void Test_FileRead_WrongFileFormat_InsufficientColumns()
 		{
 			AssertHelper.Exception<VectoException>(
-				() => EngineFullLoadCurve.ReadFromFile(@"TestData\Components\FullLoadCurve insufficient columns.vfld"),
+				() => FullLoadCurveReader.ReadFromFile(@"TestData\Components\FullLoadCurve insufficient columns.vfld"),
 				"ERROR while reading FullLoadCurve File: Engine FullLoadCurve Data File must consist of at least 3 columns.");
 		}
 
@@ -205,7 +206,7 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponentData
 			target.Parameters.Add(new MethodCallParameter("${level}"));
 			target.Parameters.Add(new MethodCallParameter("${message}"));
 			SimpleConfigurator.ConfigureForTargetLogging(target, LogLevel.Warn);
-			EngineFullLoadCurve.ReadFromFile(@"TestData\Components\FullLoadCurve wrong header.vfld");
+			FullLoadCurveReader.ReadFromFile(@"TestData\Components\FullLoadCurve wrong header.vfld");
 			Assert.IsTrue(
 				LogList.Contains(
 					"FullLoadCurve: Header Line is not valid. Expected: \'engine speed, full load torque, motoring torque\', Got: \'n, Mfull, Mdrag, PT1\'. Falling back to column index."),
@@ -224,7 +225,7 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponentData
 		[TestMethod]
 		public void Test_FileRead_NoHeader()
 		{
-			var curve = EngineFullLoadCurve.ReadFromFile(@"TestData\Components\FullLoadCurve no header.vfld");
+			var curve = FullLoadCurveReader.ReadFromFile(@"TestData\Components\FullLoadCurve no header.vfld");
 			var result = curve.FullLoadStationaryTorque(1.SI<PerSecond>());
 			Assert.AreNotEqual(result.Value(), 0.0);
 		}
@@ -236,7 +237,7 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponentData
 		public void Test_FileRead_InsufficientEntries()
 		{
 			AssertHelper.Exception<VectoException>(
-				() => EngineFullLoadCurve.ReadFromFile(@"TestData\Components\FullLoadCurve insufficient entries.vfld"),
+				() => FullLoadCurveReader.ReadFromFile(@"TestData\Components\FullLoadCurve insufficient entries.vfld"),
 				"ERROR while reading FullLoadCurve File: FullLoadCurve must consist of at least two lines with numeric values (below file header)");
 		}
 
@@ -246,8 +247,8 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponentData
 			var engineData = new CombustionEngineData {
 				FullLoadCurves =
 					new Dictionary<uint, EngineFullLoadCurve>() {
-						{ 0, EngineFullLoadCurve.ReadFromFile(@"TestData\Components\12t Delivery Truck.vfld") },
-						{ 1, EngineFullLoadCurve.ReadFromFile(@"TestData\Components\12t Delivery Truck.vfld") }
+						{ 0, FullLoadCurveReader.ReadFromFile(@"TestData\Components\12t Delivery Truck.vfld") },
+						{ 1, FullLoadCurveReader.ReadFromFile(@"TestData\Components\12t Delivery Truck.vfld") }
 					},
 				IdleSpeed = 560.RPMtoRad()
 			};
@@ -289,7 +290,7 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponentData
 			};
 
 			var fldCurve =
-				EngineFullLoadCurve.Create(
+				FullLoadCurveReader.Create(
 					VectoCSVFile.ReadStream(InputDataHelper.InputDataAsStream("n [U/min],Mfull [Nm],Mdrag [Nm],<PT1> [s]", fldEntries)));
 
 			Assert.AreEqual(1180, fldCurve.FullLoadStationaryTorque(560.RPMtoRad()).Value(), Tolerance);
diff --git a/VectoCore/VectoCoreTest/Models/SimulationComponentData/GearboxDataTest.cs b/VectoCore/VectoCoreTest/Models/SimulationComponentData/GearboxDataTest.cs
index 57eaeb48bf8c29c409289159b4d03ab132a43e01..6d817b5c0001aae8a81fefa0e64a6b8daeb8f081 100644
--- a/VectoCore/VectoCoreTest/Models/SimulationComponentData/GearboxDataTest.cs
+++ b/VectoCore/VectoCoreTest/Models/SimulationComponentData/GearboxDataTest.cs
@@ -304,7 +304,7 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponentData
 			};
 			var dataEng =
 				VectoCSVFile.ReadStream(InputDataHelper.InputDataAsStream("n [U/min],Mfull [Nm],Mdrag [Nm]", engineFldString));
-			var engineFld = EngineFullLoadCurve.Create(dataEng, true);
+			var engineFld = FullLoadCurveReader.Create(dataEng, true);
 
 
 			var fullLoadCurve = AbstractSimulationDataAdapter.IntersectFullLoadCurves(engineFld, 2500.SI<NewtonMeter>());
diff --git a/VectoCore/VectoCoreTest/Models/SimulationComponentData/ValidationTest.cs b/VectoCore/VectoCoreTest/Models/SimulationComponentData/ValidationTest.cs
index b1f96980a878cacd8159fb39efdcb28c4d2d4236..f35363407c47374493f73c8df38b800eca3f8830 100644
--- a/VectoCore/VectoCoreTest/Models/SimulationComponentData/ValidationTest.cs
+++ b/VectoCore/VectoCoreTest/Models/SimulationComponentData/ValidationTest.cs
@@ -89,7 +89,7 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponentData
 				WHTCUrban = 1,
 				WHTCRural = 1,
 				WHTCMotorway = 1,
-				FullLoadCurves = new Dictionary<uint, EngineFullLoadCurve>() { { 0, EngineFullLoadCurve.Create(fullLoad) } },
+				FullLoadCurves = new Dictionary<uint, EngineFullLoadCurve>() { { 0, FullLoadCurveReader.Create(fullLoad) } },
 				ConsumptionMap = FuelConsumptionMapReader.Create(fuelConsumption)
 			};
 			data.FullLoadCurves[0].EngineData = data;
@@ -224,8 +224,8 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponentData
 			var engineData = new CombustionEngineData {
 				FullLoadCurves =
 					new Dictionary<uint, EngineFullLoadCurve>() {
-						{ 0, EngineFullLoadCurve.ReadFromFile(@"TestData\Components\12t Delivery Truck.vfld") },
-						{ 1, EngineFullLoadCurve.ReadFromFile(@"TestData\Components\12t Delivery Truck.vfld") },
+						{ 0, FullLoadCurveReader.ReadFromFile(@"TestData\Components\12t Delivery Truck.vfld") },
+						{ 1, FullLoadCurveReader.ReadFromFile(@"TestData\Components\12t Delivery Truck.vfld") },
 					},
 				IdleSpeed = 560.RPMtoRad()
 			};
@@ -300,8 +300,8 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponentData
 			var engineData = new CombustionEngineData {
 				FullLoadCurves =
 					new Dictionary<uint, EngineFullLoadCurve>() {
-						{ 0, EngineFullLoadCurve.ReadFromFile(@"TestData\Components\12t Delivery Truck.vfld") },
-						{ 1, EngineFullLoadCurve.ReadFromFile(@"TestData\Components\12t Delivery Truck.vfld") }
+						{ 0, FullLoadCurveReader.ReadFromFile(@"TestData\Components\12t Delivery Truck.vfld") },
+						{ 1, FullLoadCurveReader.ReadFromFile(@"TestData\Components\12t Delivery Truck.vfld") }
 					},
 				IdleSpeed = 560.RPMtoRad()
 			};
@@ -622,12 +622,22 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponentData
 		public string Creator { get; set; }
 		public string Date { get; set; }
 		public string TechnicalReportId { get; set; }
-		public CertificationMethod CertificationMethod { get{return CertificationMethod.NotCertified;}}
+
+		public CertificationMethod CertificationMethod
+		{
+			get { return CertificationMethod.NotCertified; }
+		}
+
 		public string CertificationNumber { get; set; }
 		public string DigestValue { get; set; }
 		public GearboxType Type { get; set; }
 		public IList<ITransmissionInputData> Gears { get; set; }
-		ITorqueConverterDeclarationInputData IGearboxDeclarationInputData.TorqueConverter { get { return TorqueConverter; }  }
+
+		ITorqueConverterDeclarationInputData IGearboxDeclarationInputData.TorqueConverter
+		{
+			get { return TorqueConverter; }
+		}
+
 		public KilogramSquareMeter Inertia { get; set; }
 		public Second TractionInterruption { get; set; }
 		public Second MinTimeBetweenGearshift { get; set; }
diff --git a/VectoCore/VectoCoreTest/Utils/MockRunData.cs b/VectoCore/VectoCoreTest/Utils/MockRunData.cs
index 2da0eabb143cdb4a4c4bc9a641034888c9bd9b76..486e03dc0b972f7037ffdf330f60e07276e1efe5 100644
--- a/VectoCore/VectoCoreTest/Utils/MockRunData.cs
+++ b/VectoCore/VectoCoreTest/Utils/MockRunData.cs
@@ -53,7 +53,6 @@ namespace TUGraz.VectoCore.Tests.Utils
 				Loading = 0.SI<Kilogram>(),
 				TotalRollResistanceCoefficient = 0,
 				DynamicTyreRadius = 1.SI<Meter>(),
-				
 			};
 			AirdragData = new AirdragData() {
 				CrossWindCorrectionCurve =
@@ -69,18 +68,18 @@ namespace TUGraz.VectoCore.Tests.Utils
 				FullLoadCurves = new Dictionary<uint, EngineFullLoadCurve>() {
 					{
 						0, new EngineFullLoadCurve() {
-							FullLoadEntries = new List<FullLoadCurve.FullLoadCurveEntry>() {
-								new FullLoadCurve.FullLoadCurveEntry() {
+							FullLoadEntries = new List<EngineFullLoadCurve.FullLoadCurveEntry>() {
+								new EngineFullLoadCurve.FullLoadCurveEntry() {
 									EngineSpeed = 600.RPMtoRad(),
 									TorqueDrag = -100.SI<NewtonMeter>(),
 									TorqueFullLoad = 500.SI<NewtonMeter>()
 								},
-								new FullLoadCurve.FullLoadCurveEntry() {
+								new EngineFullLoadCurve.FullLoadCurveEntry() {
 									EngineSpeed = 1800.RPMtoRad(),
 									TorqueDrag = -120.SI<NewtonMeter>(),
 									TorqueFullLoad = 1200.SI<NewtonMeter>()
 								},
-								new FullLoadCurve.FullLoadCurveEntry() {
+								new EngineFullLoadCurve.FullLoadCurveEntry() {
 									EngineSpeed = 2500.RPMtoRad(),
 									TorqueDrag = -150.SI<NewtonMeter>(),
 									TorqueFullLoad = 400.SI<NewtonMeter>()
diff --git a/VectoCore/VectoCoreTest/XML/XMLDeclarationInputTest.cs b/VectoCore/VectoCoreTest/XML/XMLDeclarationInputTest.cs
index c640c011a754040b8720eb00a90052996dbe6209..68f6e3f6da4b45f63b434c786e1f15e807dbf734 100644
--- a/VectoCore/VectoCoreTest/XML/XMLDeclarationInputTest.cs
+++ b/VectoCore/VectoCoreTest/XML/XMLDeclarationInputTest.cs
@@ -42,6 +42,7 @@ using TUGraz.VectoCommon.Resources;
 using TUGraz.VectoCommon.Utils;
 using TUGraz.VectoCore.Configuration;
 using TUGraz.VectoCore.InputData.FileIO.XML.Declaration;
+using TUGraz.VectoCore.InputData.Reader;
 using TUGraz.VectoCore.InputData.Reader.ComponentData;
 using TUGraz.VectoCore.Models.Declaration;
 using TUGraz.VectoCore.Models.Simulation.Impl;
@@ -91,7 +92,7 @@ namespace TUGraz.VectoCore.Tests.XML
 			Assert.AreEqual("engine speed", fldTable.Columns[0].Caption);
 			Assert.AreEqual("full load torque", fldTable.Columns[1].Caption);
 			Assert.AreEqual("motoring torque", fldTable.Columns[2].Caption);
-			var fldMap = EngineFullLoadCurve.Create(fldTable, true);
+			var fldMap = FullLoadCurveReader.Create(fldTable, true);
 		}
 
 		[TestMethod]
diff --git a/VectoCore/VectoCoreTest/XML/XMLEngineeringInputRefTest.cs b/VectoCore/VectoCoreTest/XML/XMLEngineeringInputRefTest.cs
index e5a8a5338e8779d1427dd3b31691a98ab995e65a..f109dd7a551fa365ad20c514457f1ca0e5056b47 100644
--- a/VectoCore/VectoCoreTest/XML/XMLEngineeringInputRefTest.cs
+++ b/VectoCore/VectoCoreTest/XML/XMLEngineeringInputRefTest.cs
@@ -37,6 +37,7 @@ using TUGraz.VectoCommon.Exceptions;
 using TUGraz.VectoCommon.Models;
 using TUGraz.VectoCommon.Utils;
 using TUGraz.VectoCore.InputData.FileIO.XML.Engineering;
+using TUGraz.VectoCore.InputData.Reader;
 using TUGraz.VectoCore.InputData.Reader.ComponentData;
 using TUGraz.VectoCore.Models.Simulation.Impl;
 using TUGraz.VectoCore.Models.SimulationComponent.Data.Engine;
@@ -94,7 +95,7 @@ namespace TUGraz.VectoCore.Tests.XML
 			Assert.AreEqual("engine speed", fldTable.Columns[0].Caption);
 			Assert.AreEqual("full load torque", fldTable.Columns[1].Caption);
 			Assert.AreEqual("motoring torque", fldTable.Columns[2].Caption);
-			var fldMap = EngineFullLoadCurve.Create(fldTable, true);
+			var fldMap = FullLoadCurveReader.Create(fldTable, true);
 		}
 
 		[TestMethod]
diff --git a/VectoCore/VectoCoreTest/XML/XMLEngineeringInputSingleTest.cs b/VectoCore/VectoCoreTest/XML/XMLEngineeringInputSingleTest.cs
index f51bc8dcc2abcd463fe03b5c381463e9f1ef7488..230b5a3255e359b356d7b236b5c3ac7561676a54 100644
--- a/VectoCore/VectoCoreTest/XML/XMLEngineeringInputSingleTest.cs
+++ b/VectoCore/VectoCoreTest/XML/XMLEngineeringInputSingleTest.cs
@@ -41,6 +41,7 @@ using TUGraz.VectoCommon.Resources;
 using TUGraz.VectoCommon.Utils;
 using TUGraz.VectoCore.Configuration;
 using TUGraz.VectoCore.InputData.FileIO.XML.Engineering;
+using TUGraz.VectoCore.InputData.Reader;
 using TUGraz.VectoCore.InputData.Reader.ComponentData;
 using TUGraz.VectoCore.Models.Declaration;
 using TUGraz.VectoCore.Models.Simulation.Impl;
@@ -95,7 +96,7 @@ namespace TUGraz.VectoCore.Tests.XML
 			Assert.AreEqual("engine speed", fldTable.Columns[0].Caption);
 			Assert.AreEqual("full load torque", fldTable.Columns[1].Caption);
 			Assert.AreEqual("motoring torque", fldTable.Columns[2].Caption);
-			var fldMap = EngineFullLoadCurve.Create(fldTable, true);
+			var fldMap = FullLoadCurveReader.Create(fldTable, true);
 		}
 
 		[TestMethod]