diff --git a/VECTO/Input Files/Gearbox.vb b/VECTO/Input Files/Gearbox.vb
index 05470421bb3688a4ee7bdab9dd7ac2bdd51c8ac2..18f0d3e0291d14b3ea735c49323bf80e9913da54 100644
--- a/VECTO/Input Files/Gearbox.vb	
+++ b/VECTO/Input Files/Gearbox.vb	
@@ -55,55 +55,55 @@ Public Class Gearbox
 
 	Public Type As GearboxType
 
-    'Torque Converter Input
-    Public TorqueConverterReferenceRpm As Double
-    Private ReadOnly _torqueConverterFile As New SubPath
-    Public TorqueConverterInertia As Double
-    Public TorqueConverterShiftPolygonFile As String
+	'Torque Converter Input
+	Public TorqueConverterReferenceRpm As Double
+	Private ReadOnly _torqueConverterFile As New SubPath
+	Public TorqueConverterInertia As Double
+	Public TorqueConverterShiftPolygonFile As String
 
 
-    Public UpshiftMinAcceleration As Double
-    Public DownshiftAfterUpshift As Double
-    Public UpshiftAfterDownshift As Double
-    Public TorqueConverterMaxSpeed As Double
+	Public UpshiftMinAcceleration As Double
+	Public DownshiftAfterUpshift As Double
+	Public UpshiftAfterDownshift As Double
+	Public TorqueConverterMaxSpeed As Double
 
-    Public PSInertiaFactor As Double
+	Public PSInertiaFactor As Double
 
-    Public PSShiftTime As Double
+	Public PSShiftTime As Double
 
 
-    Public Sub New()
-        _myPath = ""
-        _filePath = ""
-        SetDefault()
-    End Sub
+	Public Sub New()
+		_myPath = ""
+		_filePath = ""
+		SetDefault()
+	End Sub
 
-    Private Sub SetDefault()
+	Private Sub SetDefault()
 
-        ModelName = ""
-        GbxInertia = 0
-        TracIntrSi = 0
+		ModelName = ""
+		GbxInertia = 0
+		TracIntrSi = 0
 
-        GearRatios = New List(Of Double)
-        GearLossmaps = New List(Of SubPath)
-        GearshiftFiles = New List(Of SubPath)
-        MaxTorque = New List(Of String)
+		GearRatios = New List(Of Double)
+		GearLossmaps = New List(Of SubPath)
+		GearshiftFiles = New List(Of SubPath)
+		MaxTorque = New List(Of String)
 
-        TorqueResv = 0
-        'SkipGears = False
-        ShiftTime = 0
-        TorqueResvStart = 0
-        StartSpeed = 0
-        StartAcc = 0
-        'ShiftInside = False
+		TorqueResv = 0
+		'SkipGears = False
+		ShiftTime = 0
+		TorqueResvStart = 0
+		StartSpeed = 0
+		StartAcc = 0
+		'ShiftInside = False
 
-        Type = GearboxType.MT
+		Type = GearboxType.MT
 
-        TorqueConverterReferenceRpm = 0
-        _torqueConverterFile.Clear()
+		TorqueConverterReferenceRpm = 0
+		_torqueConverterFile.Clear()
 
-        TorqueConverterInertia = 0
-    End Sub
+		TorqueConverterInertia = 0
+	End Sub
 
 	Public Function SaveFile() As Boolean
 
@@ -432,66 +432,68 @@ Public Class Gearbox
 		Get
 			Return UpshiftAfterDownshift.SI (Of Second)()
 		End Get
-    End Property
-
-    Public ReadOnly Property PowershiftShiftTime As Second Implements IGearboxEngineeringInputData.PowershiftShiftTime
-        Get
-            Return PSShiftTime.SI(Of Second)()
-        End Get
-    End Property
-    Public ReadOnly Property PowerShiftInertiaFactor As Double Implements IGearboxEngineeringInputData.PowerShiftInertiaFactor
-        Get
-            Return PSInertiaFactor
-        End Get
-    End Property
-
-    Public ReadOnly Property IGearboxEngineeringInputData_UpshiftMinAcceleration As MeterPerSquareSecond _
-        Implements IGearboxEngineeringInputData.UpshiftMinAcceleration
-        Get
-            Return UpshiftMinAcceleration.SI(Of MeterPerSquareSecond)()
-        End Get
-    End Property
-
-
-    Public ReadOnly Property IGearboxEngineeringInputData_StartSpeed As MeterPerSecond _
-        Implements IGearboxEngineeringInputData.StartSpeed
-        Get
-            Return StartSpeed.SI(Of MeterPerSecond)()
-        End Get
-    End Property
-
-    Public ReadOnly Property MinTimeBetweenGearshift As Second _
-        Implements IGearboxEngineeringInputData.MinTimeBetweenGearshift
-        Get
-            Return ShiftTime.SI(Of Second)()
-        End Get
-    End Property
-
-    Public ReadOnly Property TCData As TableData Implements ITorqueConverterDeclarationInputData.TCData
-        Get
-            If Not File.Exists(_torqueConverterFile.FullPath) Then Return Nothing
-            Return VectoCSVFile.Read(_torqueConverterFile.FullPath)
-        End Get
-    End Property
-
-
-    Public ReadOnly Property Ratio As Double Implements IAxleGearInputData.Ratio
-        Get
-            Return GearRatios(0)
-        End Get
-    End Property
-
-    Public ReadOnly Property LossMap As TableData Implements IAxleGearInputData.LossMap
-        Get
-            If Not File.Exists(GearLossmaps(0).FullPath) Then Return Nothing
-            Return VectoCSVFile.Read(GearLossmaps(0).FullPath)
-        End Get
-    End Property
-
-    Public ReadOnly Property Efficiency As Double Implements IAxleGearInputData.Efficiency
-        Get
-            Return GearLossMap(0, True).ToDouble(0)
-        End Get
-    End Property
+	End Property
+
+	Public ReadOnly Property PowershiftShiftTime As Second Implements IGearboxEngineeringInputData.PowershiftShiftTime
+		Get
+			Return PSShiftTime.SI (Of Second)()
+		End Get
+	End Property
+
+	Public ReadOnly Property PowerShiftInertiaFactor As Double _
+		Implements IGearboxEngineeringInputData.PowerShiftInertiaFactor
+		Get
+			Return PSInertiaFactor
+		End Get
+	End Property
+
+	Public ReadOnly Property IGearboxEngineeringInputData_UpshiftMinAcceleration As MeterPerSquareSecond _
+		Implements IGearboxEngineeringInputData.UpshiftMinAcceleration
+		Get
+			Return UpshiftMinAcceleration.SI (Of MeterPerSquareSecond)()
+		End Get
+	End Property
+
+
+	Public ReadOnly Property IGearboxEngineeringInputData_StartSpeed As MeterPerSecond _
+		Implements IGearboxEngineeringInputData.StartSpeed
+		Get
+			Return StartSpeed.SI (Of MeterPerSecond)()
+		End Get
+	End Property
+
+	Public ReadOnly Property MinTimeBetweenGearshift As Second _
+		Implements IGearboxEngineeringInputData.MinTimeBetweenGearshift
+		Get
+			Return ShiftTime.SI (Of Second)()
+		End Get
+	End Property
+
+	Public ReadOnly Property TCData As TableData Implements ITorqueConverterDeclarationInputData.TCData
+		Get
+			If Not File.Exists(_torqueConverterFile.FullPath) Then Return Nothing
+			Return VectoCSVFile.Read(_torqueConverterFile.FullPath)
+		End Get
+	End Property
+
+
+	Public ReadOnly Property Ratio As Double Implements IAxleGearInputData.Ratio
+		Get
+			Return GearRatios(0)
+		End Get
+	End Property
+
+	Public ReadOnly Property LossMap As TableData Implements IAxleGearInputData.LossMap
+		Get
+			If Not File.Exists(GearLossmaps(0).FullPath) Then Return Nothing
+			Return VectoCSVFile.Read(GearLossmaps(0).FullPath)
+		End Get
+	End Property
+
+	Public ReadOnly Property Efficiency As Double Implements IAxleGearInputData.Efficiency
+		Get
+			Return GearLossMap(0, True).ToDouble(0)
+		End Get
+	End Property
 End Class
 
diff --git a/VECTO/Input Files/VectoJob.vb b/VECTO/Input Files/VectoJob.vb
index cd5afa53abc5ba6f55d1af7eeb9551d0765063b4..69c8d1520097d1390d39db9985b7f0ca46aea8ef 100644
--- a/VECTO/Input Files/VectoJob.vb	
+++ b/VECTO/Input Files/VectoJob.vb	
@@ -253,7 +253,10 @@ Public Class VectoJob
 							RessourceHelper.ReadStream(
 								DeclarationData.DeclarationDataResourcePrefix + ".VACC." + _driverAccelerationFile.OriginalPath +
 								VectoCore.Configuration.Constants.FileExtensions.DriverAccelerationCurve)
-					Return VectoCSVFile.ReadStream(cycleDataRes)
+					Return _
+						VectoCSVFile.ReadStream(cycleDataRes,
+												source:=DeclarationData.DeclarationDataResourcePrefix + ".VACC." + _driverAccelerationFile.OriginalPath +
+														VectoCore.Configuration.Constants.FileExtensions.DriverAccelerationCurve)
 				Catch ex As Exception
 					Return Nothing
 				End Try
@@ -305,7 +308,7 @@ Public Class VectoJob
 
 	' ReSharper disable once UnusedMember.Global -- used by Validation
 	Public Shared Function ValidateJob(vectoJob As VectoJob, validationContext As ValidationContext) As ValidationResult
-		Dim modeService As ExecutionModeServiceContainer = TryCast(validationContext.GetService(GetType(ExecutionMode)),
+		Dim modeService As ExecutionModeServiceContainer = TryCast(validationContext.GetService(GetType(ExecutionMode)), 
 																	ExecutionModeServiceContainer)
 		Dim mode As ExecutionMode = If(modeService Is Nothing, ExecutionMode.Declaration, modeService.Mode)
 
@@ -617,10 +620,10 @@ Public Class VectoJob
 					cycleData = VectoCSVFile.Read(cycleFile.FullPath)
 				Else
 					Try
-						Dim cycleDataRes As Stream =
-								RessourceHelper.ReadStream(
-									DeclarationData.DeclarationDataResourcePrefix + ".MissionCycles." + cycleFile.OriginalPath + ".vdri")
-						cycleData = VectoCSVFile.ReadStream(cycleDataRes)
+						Dim resourceName As String = DeclarationData.DeclarationDataResourcePrefix + ".MissionCycles." +
+													cycleFile.OriginalPath + TUGraz.VectoCore.Configuration.Constants.FileExtensions.CycleFile
+						Dim cycleDataRes As Stream = RessourceHelper.ReadStream(resourceName)
+						cycleData = VectoCSVFile.ReadStream(cycleDataRes, source:=resourceName)
 					Catch ex As Exception
 						Throw New VectoException("Driving Cycle could not be read: " + cycleFile.OriginalPath)
 					End Try
@@ -659,7 +662,7 @@ Public Class VectoJob
 	Public ReadOnly Property Auxiliaries As IList(Of IAuxiliaryEngineeringInputData) _
 		Implements IAuxiliariesEngineeringInputData.Auxiliaries
 		Get
-			Return AuxData().Cast (Of IAuxiliaryEngineeringInputData).ToList()
+			Return AuxData().Cast(Of IAuxiliaryEngineeringInputData).ToList()
 		End Get
 	End Property
 
@@ -687,7 +690,7 @@ Public Class VectoJob
 	Public ReadOnly Property IAuxiliariesDeclarationInputData_Auxiliaries As IList(Of IAuxiliaryDeclarationInputData) _
 		Implements IAuxiliariesDeclarationInputData.Auxiliaries
 		Get
-			Return AuxData().Cast (Of IAuxiliaryDeclarationInputData).ToList()
+			Return AuxData().Cast(Of IAuxiliaryDeclarationInputData).ToList()
 		End Get
 	End Property
 
@@ -698,7 +701,7 @@ Public Class VectoJob
 			retVal.Add(New AuxiliaryDataInputData() With {
 						.ID = "ConstantAux",
 						.AuxiliaryType = AuxiliaryDemandType.Constant,
-						.ConstantPowerDemand = AuxPAdd.SI (Of Watt)()
+						.ConstantPowerDemand = AuxPAdd.SI(Of Watt)()
 						})
 		End If
 		For Each auxEntry As KeyValuePair(Of String, AuxEntry) In AuxPaths
@@ -718,7 +721,7 @@ Public Class VectoJob
 			stream.ReadLine() ' skip header "Efficiency auxiliary to supply [-]"
 			theAuxData.EfficiencyToSupply = stream.ReadLine().IndulgentParse()
 			theAuxData.DemandMap = VectoCSVFile.ReadStream(New MemoryStream(Encoding.UTF8.GetBytes(stream.ReadToEnd())),
-															source := auxEntry.Value.Path.FullPath)
+															source:=auxEntry.Value.Path.FullPath)
 		Next
 
 		Return retVal
diff --git a/VectoCommon/VectoCommon/InputData/TableData.cs b/VectoCommon/VectoCommon/InputData/TableData.cs
index dab06bf240029617e7ad756ff0f0fd94397aebcb..d39590a29b8ea78ad69dc816962f4a3796a8c9d9 100644
--- a/VectoCommon/VectoCommon/InputData/TableData.cs
+++ b/VectoCommon/VectoCommon/InputData/TableData.cs
@@ -35,9 +35,9 @@ namespace TUGraz.VectoCommon.InputData
 {
 	public class TableData : DataTable
 	{
-		public TableData(string fileName)
+		public TableData(string fileName, DataSourceType sourceType = DataSourceType.CSVFile)
 		{
-			SourceType = DataSourceType.CSVFile;
+			SourceType = sourceType;
 			Source = fileName;
 		}
 
diff --git a/VectoConsole/Program.cs b/VectoConsole/Program.cs
index c43997ec13c342d25fb95df27432b90e51832ec9..1b13c111ea95ecb4a84e449e621e10cf677053d2 100644
--- a/VectoConsole/Program.cs
+++ b/VectoConsole/Program.cs
@@ -277,10 +277,10 @@ Examples:
 				Environment.ExitCode = Environment.ExitCode != 0 ? Environment.ExitCode : 1;
 			}
 
-#if DEBUG
+//#if DEBUG
 			Console.WriteLine("done.");
 			Console.ReadKey();
-#endif
+//#endif
 			return Environment.ExitCode;
 		}
 
diff --git a/VectoConsole/Properties/Version.cs b/VectoConsole/Properties/Version.cs
index 461621495045f78e762413307cc730cf30f5e90a..07af2f56d19940c162c83c521439e5a74ed764f4 100644
--- a/VectoConsole/Properties/Version.cs
+++ b/VectoConsole/Properties/Version.cs
@@ -30,5 +30,5 @@
 */
 
 using System.Reflection;
-[assembly: AssemblyVersion("3.1.0.683")]
-[assembly: AssemblyFileVersion("3.1.0.683")]
+[assembly: AssemblyVersion("3.1.0.718")]
+[assembly: AssemblyFileVersion("3.1.0.718")]
diff --git a/VectoCore/VectoCore/InputData/FileIO/JSON/JSONInputData.cs b/VectoCore/VectoCore/InputData/FileIO/JSON/JSONInputData.cs
index 58e71ebfde573b2db5f0f09dc38600ea042496f6..f711212925ed0badb00bf78eaea61f52ea88df17 100644
--- a/VectoCore/VectoCore/InputData/FileIO/JSON/JSONInputData.cs
+++ b/VectoCore/VectoCore/InputData/FileIO/JSON/JSONInputData.cs
@@ -343,10 +343,9 @@ namespace TUGraz.VectoCore.InputData.FileIO.JSON
 						cycleData = VectoCSVFile.Read(cycleFile);
 					} else {
 						try {
-							var cycleDataRes =
-								RessourceHelper.ReadStream(DeclarationData.DeclarationDataResourcePrefix + ".MissionCycles." +
-															cycle.Value<string>() + ".vdri");
-							cycleData = VectoCSVFile.ReadStream(cycleDataRes);
+							var resourceName = DeclarationData.DeclarationDataResourcePrefix + ".MissionCycles." +
+												cycle.Value<string>() + Constants.FileExtensions.CycleFile;
+							cycleData = VectoCSVFile.ReadStream(RessourceHelper.ReadStream(resourceName), source: resourceName);
 						} catch {
 							Log.Debug("Driving Cycle could not be read: " + cycleFile);
 							throw new VectoException("Driving Cycle could not be read: " + cycleFile);
@@ -483,11 +482,10 @@ namespace TUGraz.VectoCore.InputData.FileIO.JSON
 				} catch (VectoException e) {
 					Log.Warn("Could not find file for acceleration curve. Trying lookup in declaration data.");
 					try {
-						var cycleDataRes =
-							RessourceHelper.ReadStream(DeclarationData.DeclarationDataResourcePrefix + ".VACC." +
-														acceleration.Value<string>() +
-														Constants.FileExtensions.DriverAccelerationCurve);
-						return VectoCSVFile.ReadStream(cycleDataRes);
+						var resourceName = DeclarationData.DeclarationDataResourcePrefix + ".VACC." +
+											acceleration.Value<string>() +
+											Constants.FileExtensions.DriverAccelerationCurve;
+						return VectoCSVFile.ReadStream(RessourceHelper.ReadStream(resourceName), source: resourceName);
 					} catch (Exception) {
 						throw new VectoException("Failed to read Driver Acceleration Curve: " + e.Message, e);
 					}
diff --git a/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationModeVectoRunDataFactory.cs b/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationModeVectoRunDataFactory.cs
index feaf5c113c3339164fccce36a56af61452e11686..09a63d5cbc9981403704f7d68597a8dea79c7278 100644
--- a/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationModeVectoRunDataFactory.cs
+++ b/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationModeVectoRunDataFactory.cs
@@ -52,9 +52,9 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl
 
 		protected IDeclarationInputDataProvider InputDataProvider;
 
-		protected DeclarationReport Report;
+		protected IDeclarationReport Report;
 
-		internal DeclarationModeVectoRunDataFactory(IDeclarationInputDataProvider dataProvider, DeclarationReport report)
+		internal DeclarationModeVectoRunDataFactory(IDeclarationInputDataProvider dataProvider, IDeclarationReport report)
 		{
 			InputDataProvider = dataProvider;
 			Report = report;
@@ -112,7 +112,7 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl
 						AngledriveData = angledriveData,
 						Aux = dao.CreateAuxiliaryData(InputDataProvider.AuxiliaryInputData(), mission.MissionType,
 							segment.VehicleClass),
-						Cycle = cycle,
+						Cycle = new DrivingCycleProxy(cycle, mission.MissionType.ToString()),
 						Retarder = retarderData,
 						DriverData = driverdata,
 						ExecutionMode = ExecutionMode.Declaration,
@@ -123,7 +123,7 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl
 					};
 					simulationRunData.EngineData.WHTCCorrectionFactor = DeclarationData.WHTCCorrection.Lookup(mission.MissionType,
 						engineData.WHTCRural, engineData.WHTCUrban, engineData.WHTCMotorway) * engineData.ColdHotCorrectionFactor;
-					simulationRunData.Cycle.Name = mission.MissionType.ToString();
+					//simulationRunData.Cycle.Name = mission.MissionType.ToString();
 					simulationRunData.VehicleData.VehicleClass = segment.VehicleClass;
 					yield return simulationRunData;
 				}
diff --git a/VectoCore/VectoCore/InputData/Reader/Impl/DrivingCycleProxy.cs b/VectoCore/VectoCore/InputData/Reader/Impl/DrivingCycleProxy.cs
new file mode 100644
index 0000000000000000000000000000000000000000..b96bf885f8413ee8898aace4f2124525c5ec22cd
--- /dev/null
+++ b/VectoCore/VectoCore/InputData/Reader/Impl/DrivingCycleProxy.cs
@@ -0,0 +1,30 @@
+using System.Collections.Generic;
+using System.Linq;
+using TUGraz.VectoCore.Models.SimulationComponent.Data;
+
+namespace TUGraz.VectoCore.InputData.Reader.Impl
+{
+	public class DrivingCycleProxy : IDrivingCycleData
+	{
+		public DrivingCycleProxy(DrivingCycleData cycle, string name)
+		{
+			Name = name;
+			CycleType = cycle.CycleType;
+			Entries = cycle.Entries;
+		}
+
+		public List<DrivingCycleData.DrivingCycleEntry> Entries { get; private set; }
+
+		public string Name { get; private set; }
+
+		public CycleType CycleType { get; private set; }
+
+		public void Finish()
+		{
+			Entries = new List<DrivingCycleData.DrivingCycleEntry>() {
+				Entries.First(),
+				Entries.Last()
+			};
+		}
+	}
+}
\ No newline at end of file
diff --git a/VectoCore/VectoCore/InputData/Reader/Impl/EngineOnlyVectoRunDataFactory.cs b/VectoCore/VectoCore/InputData/Reader/Impl/EngineOnlyVectoRunDataFactory.cs
index 2fdaf732bb9976c59219ad8bc9dbeb7252c4404d..7ffdd8c59a029e1c73004a092c498c308c1e904d 100644
--- a/VectoCore/VectoCore/InputData/Reader/Impl/EngineOnlyVectoRunDataFactory.cs
+++ b/VectoCore/VectoCore/InputData/Reader/Impl/EngineOnlyVectoRunDataFactory.cs
@@ -53,7 +53,9 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl
 				var simulationRunData = new VectoRunData {
 					JobName = InputDataProvider.JobInputData().JobName,
 					EngineData = dao.CreateEngineData(InputDataProvider.EngineInputData, null),
-					Cycle = DrivingCycleDataReader.ReadFromDataTable(cycle.CycleData, CycleType.EngineOnly, cycle.Name, false),
+					Cycle =
+						new DrivingCycleProxy(
+							DrivingCycleDataReader.ReadFromDataTable(cycle.CycleData, CycleType.EngineOnly, cycle.Name, false), cycle.Name),
 					ExecutionMode = ExecutionMode.Engineering
 				};
 				yield return simulationRunData;
diff --git a/VectoCore/VectoCore/InputData/Reader/Impl/EngineeringModeVectoRunDataFactory.cs b/VectoCore/VectoCore/InputData/Reader/Impl/EngineeringModeVectoRunDataFactory.cs
index 1a4ac156deb1a486926c030996564b09cf0a671c..821c566c140be8500abaec5d2843cc70118aad4b 100644
--- a/VectoCore/VectoCore/InputData/Reader/Impl/EngineeringModeVectoRunDataFactory.cs
+++ b/VectoCore/VectoCore/InputData/Reader/Impl/EngineeringModeVectoRunDataFactory.cs
@@ -44,8 +44,7 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl
 {
 	public class EngineeringModeVectoRunDataFactory : LoggingObject, IVectoRunDataFactory
 	{
-		// todo mk-2016-10-11: field is never used. Delete?
-		protected DriverData Driver;
+		private static readonly Dictionary<string, DrivingCycleData> CyclesCache = new Dictionary<string, DrivingCycleData>();
 
 		protected readonly IEngineeringInputDataProvider InputDataProvider;
 
@@ -74,20 +73,29 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl
 			var angledriveData = dao.CreateAngledriveData(InputDataProvider.AngledriveInputData, useEfficiencyFallback: true);
 			var ptoTransmissionData = dao.CreatePTOTransmissionData(InputDataProvider.PTOTransmissionInputData);
 
-			return InputDataProvider.JobInputData().Cycles.Select(cycle => new VectoRunData {
-				JobName = InputDataProvider.JobInputData().JobName,
-				EngineData = engineData,
-				GearboxData = gearboxData,
-				AxleGearData = axlegearData,
-				AngledriveData = angledriveData,
-				VehicleData = dao.CreateVehicleData(vehicleInputData),
-				DriverData = driver,
-				Aux = dao.CreateAuxiliaryData(InputDataProvider.AuxiliaryInputData()),
-				AdvancedAux = dao.CreateAdvancedAuxData(InputDataProvider.AuxiliaryInputData()),
-				Retarder = dao.CreateRetarderData(InputDataProvider.RetarderInputData),
-				PTO = ptoTransmissionData,
-				Cycle = DrivingCycleDataReader.ReadFromDataTable(cycle.CycleData, cycle.Name, crossWindRequired),
-				ExecutionMode = ExecutionMode.Engineering
+			return InputDataProvider.JobInputData().Cycles.Select(cycle => {
+				DrivingCycleData drivingCycle;
+				if (CyclesCache.ContainsKey(cycle.CycleData.Source)) {
+					drivingCycle = CyclesCache[cycle.CycleData.Source];
+				} else {
+					drivingCycle = DrivingCycleDataReader.ReadFromDataTable(cycle.CycleData, cycle.Name, crossWindRequired);
+					CyclesCache.Add(cycle.CycleData.Source, drivingCycle);
+				}
+				return new VectoRunData {
+					JobName = InputDataProvider.JobInputData().JobName,
+					EngineData = engineData,
+					GearboxData = gearboxData,
+					AxleGearData = axlegearData,
+					AngledriveData = angledriveData,
+					VehicleData = dao.CreateVehicleData(vehicleInputData),
+					DriverData = driver,
+					Aux = dao.CreateAuxiliaryData(InputDataProvider.AuxiliaryInputData()),
+					AdvancedAux = dao.CreateAdvancedAuxData(InputDataProvider.AuxiliaryInputData()),
+					Retarder = dao.CreateRetarderData(InputDataProvider.RetarderInputData),
+					PTO = ptoTransmissionData,
+					Cycle = new DrivingCycleProxy(drivingCycle, cycle.Name),
+					ExecutionMode = ExecutionMode.Engineering
+				};
 			});
 		}
 	}
diff --git a/VectoCore/VectoCore/Models/Declaration/DeclarationData.cs b/VectoCore/VectoCore/Models/Declaration/DeclarationData.cs
index 7f07aa894ef18c1b05d5e6be31fd227e0e9994b8..fab524d0b2b11e63baebfe5c0e9c0f76adf71f4a 100644
--- a/VectoCore/VectoCore/Models/Declaration/DeclarationData.cs
+++ b/VectoCore/VectoCore/Models/Declaration/DeclarationData.cs
@@ -449,7 +449,7 @@ namespace TUGraz.VectoCore.Models.Declaration
 			public static IEnumerable<TorqueConverterEntry> GetTorqueConverterDragCurve(double ratio)
 			{
 				var resourceId = DeclarationData.DeclarationDataResourcePrefix + ".TorqueConverter.csv";
-				var data = VectoCSVFile.ReadStream(RessourceHelper.ReadStream(resourceId));
+				var data = VectoCSVFile.ReadStream(RessourceHelper.ReadStream(resourceId), source: resourceId);
 				var characteristicTorque = (from DataRow row in data.Rows
 					select
 						new TorqueConverterEntry() {
diff --git a/VectoCore/VectoCore/Models/Declaration/LookupData.cs b/VectoCore/VectoCore/Models/Declaration/LookupData.cs
index ef4c938336fff7a134d783c03a2c82e7f4d43422..5a1543ca639ed759a1e56de19919d65141aa0497 100644
--- a/VectoCore/VectoCore/Models/Declaration/LookupData.cs
+++ b/VectoCore/VectoCore/Models/Declaration/LookupData.cs
@@ -56,7 +56,7 @@ namespace TUGraz.VectoCore.Models.Declaration
 
 		protected static DataTable ReadCsvResource(string resourceId)
 		{
-			return VectoCSVFile.ReadStream(RessourceHelper.ReadStream(resourceId));
+			return VectoCSVFile.ReadStream(RessourceHelper.ReadStream(resourceId), source: resourceId);
 		}
 
 		protected static void NormalizeTable(DataTable table)
diff --git a/VectoCore/VectoCore/Models/Declaration/Segments.cs b/VectoCore/VectoCore/Models/Declaration/Segments.cs
index 88fa836a691137a38eddd2c344ac572b556bd337..8606f7a12cf3cb44d7d4135c02e1731f12864dc3 100644
--- a/VectoCore/VectoCore/Models/Declaration/Segments.cs
+++ b/VectoCore/VectoCore/Models/Declaration/Segments.cs
@@ -48,7 +48,7 @@ namespace TUGraz.VectoCore.Models.Declaration
 
 		protected override string ResourceId
 		{
-			get { return DeclarationData.DeclarationDataResourcePrefix +".SegmentTable.csv"; }
+			get { return DeclarationData.DeclarationDataResourcePrefix + ".SegmentTable.csv"; }
 		}
 
 		protected override string ErrorMessage
@@ -105,7 +105,9 @@ namespace TUGraz.VectoCore.Models.Declaration
 				VehicleCategory = vehicleCategory,
 				AxleConfiguration = axleConfiguration,
 				VehicleClass = VehicleClassHelper.Parse(row.Field<string>("hdvclass")),
-				AccelerationFile = RessourceHelper.ReadStream(DeclarationData.DeclarationDataResourcePrefix + ".VACC." + row.Field<string>(".vaccfile")),
+				AccelerationFile =
+					RessourceHelper.ReadStream(DeclarationData.DeclarationDataResourcePrefix + ".VACC." +
+												row.Field<string>(".vaccfile")),
 				Missions = CreateMissions(ref grossVehicleMassRating, curbWeight, row),
 				GrossVehicleMassRating = grossVehicleMassRating
 			};
@@ -155,7 +157,9 @@ namespace TUGraz.VectoCore.Models.Declaration
 				var mission = new Mission {
 					MissionType = missionType,
 					CrossWindCorrection = row.Field<string>("crosswindcorrection" + GetMissionSuffix(missionType)),
-					CycleFile = RessourceHelper.ReadStream(DeclarationData.DeclarationDataResourcePrefix + ".MissionCycles." + missionType + ".vdri"),
+					CycleFile =
+						RessourceHelper.ReadStream(DeclarationData.DeclarationDataResourcePrefix + ".MissionCycles." + missionType +
+													Constants.FileExtensions.CycleFile),
 					AxleWeightDistribution = GetAxleWeightDistribution(row, missionType),
 					CurbWeight = curbWeight,
 					BodyCurbWeight = body.CurbWeight,
diff --git a/VectoCore/VectoCore/Models/Simulation/Data/VectoRunData.cs b/VectoCore/VectoCore/Models/Simulation/Data/VectoRunData.cs
index 13c9fb8d812011e89ee3ff9c268cbb8aedf015ec..30e82ec2cd589357bb53d4db7181f4d94c4b0cdb 100644
--- a/VectoCore/VectoCore/Models/Simulation/Data/VectoRunData.cs
+++ b/VectoCore/VectoCore/Models/Simulation/Data/VectoRunData.cs
@@ -62,17 +62,13 @@ namespace TUGraz.VectoCore.Models.Simulation.Data
 		public AngledriveData AngledriveData { get; internal set; }
 
 		[Required, ValidateObject]
-		public DrivingCycleData Cycle { get; internal set; }
+		public IDrivingCycleData Cycle { get; internal set; }
 
 		[ValidateObject]
 		public IEnumerable<AuxData> Aux { get; internal set; }
 
 		public AdvancedAuxData AdvancedAux { get; internal set; }
 
-		// todo mk 2016-08-30: property is never used. Delete?
-		[ValidateObject]
-		public string AccelerationLimitingFile { get; internal set; }
-
 		[ValidateObject]
 		public RetarderData Retarder { get; internal set; }
 
@@ -90,7 +86,7 @@ namespace TUGraz.VectoCore.Models.Simulation.Data
 		public string ModFileSuffix { get; set; }
 
 		[ValidateObject]
-		public DeclarationReport Report { get; set; }
+		public IDeclarationReport Report { get; set; }
 
 		[Required, ValidateObject]
 		public LoadingType Loading { get; set; }
@@ -141,8 +137,9 @@ namespace TUGraz.VectoCore.Models.Simulation.Data
 					for (var angularVelocity = engineData.IdleSpeed;
 						angularVelocity < engineData.FullLoadCurve.RatedSpeed;
 						angularVelocity += 2.0 / 3.0 * (engineData.FullLoadCurve.RatedSpeed - engineData.IdleSpeed) / 10.0) {
-						if (!gear.Value.HasLockedGear)
+						if (!gear.Value.HasLockedGear) {
 							continue;
+						}
 
 						var velocity = angularVelocity / gear.Value.Ratio / angledriveRatio / axlegearRatio * dynamicTyreRadius;
 
@@ -195,8 +192,9 @@ namespace TUGraz.VectoCore.Models.Simulation.Data
 			}
 
 			if (runData.Cycle != null && runData.Cycle.Entries.Any(e => e.PTOActive)) {
-				if (runData.PTO == null || runData.PTO.PTOCycle == null)
+				if (runData.PTO == null || runData.PTO.PTOCycle == null) {
 					return new ValidationResult("PTOCycle is used in DrivingCycle, but is not defined in Vehicle-Data.");
+				}
 			}
 
 			return ValidationResult.Success;
diff --git a/VectoCore/VectoCore/Models/Simulation/IVehicleContainer.cs b/VectoCore/VectoCore/Models/Simulation/IVehicleContainer.cs
index 7e6718f20c21b75659be6af6002af1bb7dae0202..2daff398d3236d13893b6cd391da4820d98549cd 100644
--- a/VectoCore/VectoCore/Models/Simulation/IVehicleContainer.cs
+++ b/VectoCore/VectoCore/Models/Simulation/IVehicleContainer.cs
@@ -71,6 +71,6 @@ namespace TUGraz.VectoCore.Models.Simulation
 		/// <summary>
 		/// Finishes the simulation.
 		/// </summary>
-		void FinishSimulation();
+		new void FinishSimulation();
 	}
 }
\ No newline at end of file
diff --git a/VectoCore/VectoCore/Models/Simulation/Impl/SimulatorFactory.cs b/VectoCore/VectoCore/Models/Simulation/Impl/SimulatorFactory.cs
index b6472931c07fc21d3d7d7447dcb643a574b4909e..998ae37ac35eb54fbbe18fcf24215026bba6a16a 100644
--- a/VectoCore/VectoCore/Models/Simulation/Impl/SimulatorFactory.cs
+++ b/VectoCore/VectoCore/Models/Simulation/Impl/SimulatorFactory.cs
@@ -57,7 +57,7 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl
 		private readonly bool _engineOnlyMode;
 
 		public SimulatorFactory(ExecutionMode mode, IInputDataProvider dataProvider, IOutputDataWriter writer,
-			DeclarationReport declarationReport = null)
+			IDeclarationReport declarationReport = null)
 		{
 			Log.Info("########## VectoCore Version {0} ##########", Assembly.GetExecutingAssembly().GetName().Version);
 			JobNumber = Interlocked.Increment(ref _jobNumberCounter);
@@ -125,6 +125,9 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl
 
 			foreach (var data in DataReader.NextRun()) {
 				var d = data;
+				if (d.Report != null) {
+					d.Report.PrepareResult(d.Loading, d.Mission);
+				}
 				Action<ModalDataContainer> addReportResult = writer => {
 					if (d.Report != null) {
 						d.Report.AddResult(d.Loading, d.Mission, writer);
@@ -174,7 +177,5 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl
 				yield return run;
 			}
 		}
-
-
 	}
 }
\ No newline at end of file
diff --git a/VectoCore/VectoCore/Models/Simulation/Impl/VehicleContainer.cs b/VectoCore/VectoCore/Models/Simulation/Impl/VehicleContainer.cs
index 52d9aee6dcbf948bc1bbf29a77e269140700c9cf..9f002eee046869203c60ae8d428f85d7428d3383 100644
--- a/VectoCore/VectoCore/Models/Simulation/Impl/VehicleContainer.cs
+++ b/VectoCore/VectoCore/Models/Simulation/Impl/VehicleContainer.cs
@@ -318,6 +318,9 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl
 			ModData.Finish(RunStatus);
 
 			WriteSumData(ModData, VehicleMass, VehicleLoading);
+
+			ModData.FinishSimulation();
+			DrivingCycle.FinishSimulation();
 		}
 
 		public VectoRun.Status RunStatus { get; set; }
diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Data/DrivingCycleData.cs b/VectoCore/VectoCore/Models/SimulationComponent/Data/DrivingCycleData.cs
index 6224c73025a1a90360f0d2196865b6f50800b44f..be235259e15e25899382ee675bd7ade159208603 100644
--- a/VectoCore/VectoCore/Models/SimulationComponent/Data/DrivingCycleData.cs
+++ b/VectoCore/VectoCore/Models/SimulationComponent/Data/DrivingCycleData.cs
@@ -58,8 +58,16 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data
 		}
 	}
 
+	public interface IDrivingCycleData
+	{
+		List<DrivingCycleData.DrivingCycleEntry> Entries { get; }
+		string Name { get; }
+		CycleType CycleType { get; }
+		void Finish();
+	}
+
 	[CustomValidation(typeof(DrivingCycleData), "ValidateCycleData")]
-	public class DrivingCycleData : SimulationComponentData
+	public class DrivingCycleData : SimulationComponentData, IDrivingCycleData
 	{
 		internal DrivingCycleData() {}
 
@@ -69,6 +77,8 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data
 
 		public CycleType CycleType { get; internal set; }
 
+		public void Finish() {}
+
 		// ReSharper disable once UnusedMember.Global -- used by Validation
 		public static ValidationResult ValidateCycleData(DrivingCycleData cycleData, ValidationContext validationContext)
 		{
diff --git a/VectoCore/VectoCore/Models/SimulationComponent/IDrivingCycleInfo.cs b/VectoCore/VectoCore/Models/SimulationComponent/IDrivingCycleInfo.cs
index 412603402262683f035d0ab35d45b544751b1e38..5c5d33f124be1016bd3658cd861853252614d74f 100644
--- a/VectoCore/VectoCore/Models/SimulationComponent/IDrivingCycleInfo.cs
+++ b/VectoCore/VectoCore/Models/SimulationComponent/IDrivingCycleInfo.cs
@@ -61,5 +61,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent
 		IReadOnlyList<DrivingCycleData.DrivingCycleEntry> LookAhead(Meter lookaheadDistance);
 
 		IReadOnlyList<DrivingCycleData.DrivingCycleEntry> LookAhead(Second time);
+
+		void FinishSimulation();
 	}
 }
\ No newline at end of file
diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/DistanceBasedDrivingCycle.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/DistanceBasedDrivingCycle.cs
index 58c429fe8d74007c983b6905a6e738c01149193b..9b04cfa5a974e19cac13a16e0ecea31c22266147 100644
--- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/DistanceBasedDrivingCycle.cs
+++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/DistanceBasedDrivingCycle.cs
@@ -54,7 +54,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 		IDrivingCycle, ISimulationOutPort, IDrivingCycleInPort, IDisposable
 	{
 		private const double LookaheadTimeSafetyMargin = 1.5;
-		private readonly DrivingCycleData _data;
+		private readonly IDrivingCycleData _data;
 		internal readonly DrivingCycleEnumerator CycleIntervalIterator;
 		private bool _intervalProlonged;
 		internal IdleControllerSwitcher IdleController;
@@ -69,7 +69,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 			get { return CycleIntervalIterator.RightSample; }
 		}
 
-		public DistanceBasedDrivingCycle(IVehicleContainer container, DrivingCycleData cycle) : base(container)
+		public DistanceBasedDrivingCycle(IVehicleContainer container, IDrivingCycleData cycle) : base(container)
 		{
 			_data = cycle;
 			CycleIntervalIterator = new DrivingCycleEnumerator(_data);
@@ -282,8 +282,9 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 
 			if (!stopTime.IsEqual(0) && stopTime.IsEqual(PreviousState.WaitTime)) {
 				// we needed to stop at the current interval in the cycle and have already waited enough time, move on..
-				if (IdleController != null)
+				if (IdleController != null) {
 					IdleController.ActivateIdle();
+				}
 				CycleIntervalIterator.MoveNext();
 			}
 
@@ -303,8 +304,9 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 			} else {
 				if (stopTime.IsEqual(PreviousState.WaitTime)) {
 					// we needed to stop at the current interval in the cycle and have already waited enough time, move on..
-					if (IdleController != null)
+					if (IdleController != null) {
 						IdleController.ActivateIdle();
+					}
 					CycleIntervalIterator.MoveNext();
 				}
 			}
@@ -408,6 +410,11 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 			return LookAhead(LookaheadTimeSafetyMargin * DataBus.VehicleSpeed * time);
 		}
 
+		public void FinishSimulation()
+		{
+			_data.Finish();
+		}
+
 		public CycleData CycleData
 		{
 			get
@@ -480,9 +487,9 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 		public sealed class DrivingCycleEnumerator : IEnumerator<DrivingCycleData.DrivingCycleEntry>
 		{
 			private int _currentCycleIndex;
-			private readonly DrivingCycleData _data;
+			private readonly IDrivingCycleData _data;
 
-			public DrivingCycleEnumerator(DrivingCycleData data)
+			public DrivingCycleEnumerator(IDrivingCycleData data)
 			{
 				_currentCycleIndex = 0;
 				_data = data;
diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/MeasuredSpeedDrivingCycle.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/MeasuredSpeedDrivingCycle.cs
index 329e953bb8020bc771916911b548cfdcf632ef77..8b3b5726a89af2c39fbfd202a47396967482b790 100644
--- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/MeasuredSpeedDrivingCycle.cs
+++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/MeasuredSpeedDrivingCycle.cs
@@ -52,7 +52,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 	/// </summary>
 	public class MeasuredSpeedDrivingCycle :
 		StatefulProviderComponent
-		<MeasuredSpeedDrivingCycle.DrivingCycleState, ISimulationOutPort, IDriverDemandInPort, IDriverDemandOutPort>,
+			<MeasuredSpeedDrivingCycle.DrivingCycleState, ISimulationOutPort, IDriverDemandInPort, IDriverDemandOutPort>,
 		IDriverInfo, IDrivingCycleInfo, IMileageCounter, IDriverDemandInProvider, IDriverDemandInPort, ISimulationOutProvider,
 		ISimulationOutPort
 	{
@@ -70,7 +70,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 			public MeterPerSquareSecond Acceleration;
 		}
 
-		protected readonly DrivingCycleData Data;
+		protected readonly IDrivingCycleData Data;
 		private bool _isInitializing;
 		protected IEnumerator<DrivingCycleData.DrivingCycleEntry> RightSample { get; set; }
 		protected IEnumerator<DrivingCycleData.DrivingCycleEntry> LeftSample { get; set; }
@@ -82,7 +82,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 		/// </summary>
 		/// <param name="container">The container.</param>
 		/// <param name="cycle">The cycle.</param>
-		public MeasuredSpeedDrivingCycle(IVehicleContainer container, DrivingCycleData cycle)
+		public MeasuredSpeedDrivingCycle(IVehicleContainer container, IDrivingCycleData cycle)
 			: base(container)
 		{
 			Data = cycle;
@@ -207,7 +207,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 							getYValue: result => ((ResponseDryRun)result).DeltaFullLoad,
 							evaluateFunction: x => NextComponent.Request(absTime, dt, x, gradient, true),
 							criterion:
-							y => ((ResponseDryRun)y).DeltaFullLoad.Value());
+								y => ((ResponseDryRun)y).DeltaFullLoad.Value());
 						Log.Info(
 							"Found operating point for driver acceleration. absTime: {0}, dt: {1}, acceleration: {2}, gradient: {3}",
 							absTime,
@@ -227,9 +227,10 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 			debug.Add(response);
 
 			CurrentState.SimulationDistance = acceleration / 2 * dt * dt + DataBus.VehicleSpeed * dt;
-			if (CurrentState.SimulationDistance.IsSmaller(0))
+			if (CurrentState.SimulationDistance.IsSmaller(0)) {
 				throw new VectoSimulationException(
 					"MeasuredSpeed: Simulation Distance must not be negative. Driving Backward is not allowed.");
+			}
 
 			CurrentState.Distance = CurrentState.SimulationDistance + PreviousState.Distance;
 			CurrentState.Acceleration = acceleration;
@@ -307,6 +308,11 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 			throw new NotImplementedException();
 		}
 
+		public void FinishSimulation()
+		{
+			Data.Finish();
+		}
+
 		public bool VehicleStopped
 		{
 			get { return !_isInitializing && LeftSample.Current.VehicleTargetSpeed.IsEqual(0); }
diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/PWheelCycle.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/PWheelCycle.cs
index d453f58cf5249d85875841bd700bdbc1b665a8e3..1e81e876ab0d76371bdb613e4f50082f2a9af930 100644
--- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/PWheelCycle.cs
+++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/PWheelCycle.cs
@@ -53,7 +53,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 		/// <param name="cycle">The cycle.</param>
 		/// <param name="axleRatio">The axle ratio.</param>
 		/// <param name="gearRatios"></param>
-		public PWheelCycle(IVehicleContainer container, DrivingCycleData cycle, double axleRatio,
+		public PWheelCycle(IVehicleContainer container, IDrivingCycleData cycle, double axleRatio,
 			IDictionary<uint, double> gearRatios) : base(container, cycle)
 		{
 			// just to ensure that null-gear has ratio 1
diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/PowertrainDrivingCycle.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/PowertrainDrivingCycle.cs
index fb37c50311356d17fb09e8027ec407d248e5f64a..7b0cc4c5a2d7d96259c1f73c03070f4243703c6b 100644
--- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/PowertrainDrivingCycle.cs
+++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/PowertrainDrivingCycle.cs
@@ -51,7 +51,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 		StatefulProviderComponent<SimpleComponentState, ISimulationOutPort, ITnInPort, ITnOutPort>,
 		IDrivingCycleInfo, ISimulationOutPort, ITnInProvider, ITnInPort
 	{
-		protected readonly DrivingCycleData Data;
+		protected readonly IDrivingCycleData Data;
 		protected IEnumerator<DrivingCycleData.DrivingCycleEntry> RightSample { get; set; }
 		protected IEnumerator<DrivingCycleData.DrivingCycleEntry> LeftSample { get; set; }
 
@@ -62,7 +62,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 		/// </summary>
 		/// <param name="container">The container.</param>
 		/// <param name="cycle">The cycle.</param>
-		public PowertrainDrivingCycle(IVehicleContainer container, DrivingCycleData cycle) : base(container)
+		public PowertrainDrivingCycle(IVehicleContainer container, IDrivingCycleData cycle) : base(container)
 		{
 			Data = cycle;
 			LeftSample = Data.Entries.GetEnumerator();
@@ -218,5 +218,10 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 		{
 			throw new NotImplementedException();
 		}
+
+		public void FinishSimulation()
+		{
+			Data.Finish();
+		}
 	}
 }
\ No newline at end of file
diff --git a/VectoCore/VectoCore/OutputData/DeclarationReport.cs b/VectoCore/VectoCore/OutputData/DeclarationReport.cs
index 3154a87b4201a298efd3b52dbeb34c8035a9e426..afe1d98050f1db20b6d2115b930ef8740e0ae4c0 100644
--- a/VectoCore/VectoCore/OutputData/DeclarationReport.cs
+++ b/VectoCore/VectoCore/OutputData/DeclarationReport.cs
@@ -32,38 +32,75 @@
 using System.Collections.Generic;
 using System.Linq;
 using System.Runtime.CompilerServices;
+using TUGraz.VectoCommon.Exceptions;
+using TUGraz.VectoCommon.Utils;
 using TUGraz.VectoCore.Models.Declaration;
 using TUGraz.VectoCore.Models.Simulation.Data;
 using TUGraz.VectoCore.Models.Simulation.Impl;
 using TUGraz.VectoCore.Models.SimulationComponent.Data;
+using TUGraz.VectoCore.OutputData.PDF;
 
 namespace TUGraz.VectoCore.OutputData
 {
+	public interface IDeclarationReport
+	{
+		void PrepareResult(LoadingType loading, Mission mission);
+		void AddResult(LoadingType loadingType, Mission mission, IModalDataContainer modData);
+		void InitializeReport(VectoRunData modelData, Segment segment);
+		string Creator { get; set; }
+		string JobName { get; set; }
+	}
+
 	/// <summary>
 	/// Class for creating a declaration report.
 	/// </summary>
-	public abstract class DeclarationReport
+	public abstract class DeclarationReport<T> : IDeclarationReport where T : new()
 	{
-		/// <summary>
-		/// Container class for one mission and the modData for the different loadings.
-		/// </summary>
-		protected class ResultContainer
+		///// <summary>
+		///// Container class for one mission and the modData for the different loadings.
+		///// </summary>
+		//protected class ResultContainer<TResultEntry>
+		//{
+		//	/// <summary>
+		//	/// The mission
+		//	/// </summary>
+		//	public Mission Mission;
+
+		//	/// <summary>
+		//	/// Dictionary of LoadingTypes and DeclarationResults
+		//	/// </summary>
+		//	public Dictionary<LoadingType, TResultEntry> ModData;
+		//}
+		public class ResultContainer<TEntry>
 		{
-			/// <summary>
-			/// The mission
-			/// </summary>
+			//public Stream PDFPage;
 			public Mission Mission;
 
-			/// <summary>
-			/// Dictionary of LoadingTypes and their resulting Modal Data
-			/// </summary>
-			public Dictionary<LoadingType, IModalDataContainer> ModData;
+			public MissionProfile MissionProfile;
+
+			public Dictionary<LoadingType, TEntry> ModData;
+		}
+
+		public class MissionProfile
+		{
+			public readonly IList<double> DistanceKm;
+			public readonly IList<double> TargetSpeed;
+			public readonly IList<double> Altitude;
+
+			public MissionProfile(IModalDataContainer m)
+			{
+				DistanceKm = m.GetValues<Meter>(ModalResultField.dist).Select(v => v.ConvertTo().Kilo.Meter).ToDouble();
+				TargetSpeed =
+					m.GetValues<MeterPerSecond>(ModalResultField.v_targ).Select(v => v.ConvertTo().Kilo.Meter.Per.Hour).ToDouble();
+				Altitude = m.GetValues<Meter>(ModalResultField.altitude).ToDouble();
+			}
 		}
 
 		/// <summary>
 		/// Dictionary of MissionTypes and their corresponding results.
 		/// </summary>
-		protected readonly Dictionary<MissionType, ResultContainer> Missions = new Dictionary<MissionType, ResultContainer>();
+		protected readonly Dictionary<MissionType, ResultContainer<T>> Missions =
+			new Dictionary<MissionType, ResultContainer<T>>();
 
 		/// <summary>
 		/// The full load curve.
@@ -78,7 +115,7 @@ namespace TUGraz.VectoCore.OutputData
 		/// <summary>
 		/// The creator name for the report.
 		/// </summary>
-		public string Creator { get; internal set; }
+		public string Creator { get; set; }
 
 		/// <summary>
 		/// The name of the job file (report name will be the same)
@@ -88,44 +125,66 @@ namespace TUGraz.VectoCore.OutputData
 		/// <summary>
 		/// The result count determines how many results must be given before the report gets written.
 		/// </summary>
-		public int ResultCount { get; set; }
+		private int _resultCount;
+
+		[MethodImpl(MethodImplOptions.Synchronized)]
+		public void PrepareResult(LoadingType loading, Mission mission)
+		{
+			if (!Missions.ContainsKey(mission.MissionType)) {
+				Missions[mission.MissionType] = new ResultContainer<T>() {
+					Mission = mission,
+					ModData = new Dictionary<LoadingType, T>()
+				};
+			}
+			Missions[mission.MissionType].ModData[loading] = new T();
+		}
+
 
-		/// <summary>
-		/// Adds the result of one run for the specific mission and loading. If all runs finished (given by the resultCount) the report will be written.
-		/// </summary>
-		/// <param name="loadingType">Type of the loading.</param>
-		/// <param name="mission">The mission.</param>
-		/// <param name="modData">The mod data.</param>
 		[MethodImpl(MethodImplOptions.Synchronized)]
 		public void AddResult(LoadingType loadingType, Mission mission, IModalDataContainer modData)
 		{
 			if (modData.RunStatus != VectoRun.Status.Success) {
-				Missions.Clear();
+				//Missions.Clear();
 				return;
 			}
-
 			if (!Missions.ContainsKey(mission.MissionType)) {
-				Missions[mission.MissionType] = new ResultContainer {
-					Mission = mission,
-					ModData = new Dictionary<LoadingType, IModalDataContainer>()
-				};
+				throw new VectoException("Unknown mission type {0} for generating declaration report", mission.MissionType);
+			}
+			if (!Missions[mission.MissionType].ModData.ContainsKey(loadingType)) {
+				throw new VectoException("Unknown loading type {0} for mission {1}", loadingType, mission.MissionType);
 			}
-			Missions[mission.MissionType].ModData[loadingType] = modData;
+			if (Missions[mission.MissionType].MissionProfile == null) {
+				Missions[mission.MissionType].MissionProfile = new MissionProfile(modData);
+			}
+			_resultCount--;
+
+			DoAddResult(Missions[mission.MissionType].ModData[loadingType], loadingType, mission, modData);
 
-			if (ResultCount == Missions.Sum(v => v.Value.ModData.Count)) {
+			if (_resultCount == 0) {
 				DoWriteReport();
-				Missions.Clear();
 				Flc = null;
 				Segment = null;
 			}
 		}
 
+		/// <summary>
+		/// Adds the result of one run for the specific mission and loading. If all runs finished (given by the resultCount) the report will be written.
+		/// </summary>
+		/// <param name="entry"></param>
+		/// <param name="loadingType">Type of the loading.</param>
+		/// <param name="mission">The mission.</param>
+		/// <param name="modData">The mod data.</param>
+		[MethodImpl(MethodImplOptions.Synchronized)]
+		protected abstract void DoAddResult(T entry, LoadingType loadingType, Mission mission, IModalDataContainer modData);
+
+
 		protected internal abstract void DoWriteReport();
 
+
 		public void InitializeReport(VectoRunData modelData, Segment segment)
 		{
 			Segment = segment;
-			ResultCount = segment.Missions.Sum(m => m.Loadings.Count);
+			_resultCount = segment.Missions.Sum(m => m.Loadings.Count);
 
 			DoInitializeReport(modelData, segment);
 		}
diff --git a/VectoCore/VectoCore/OutputData/IModalDataContainer.cs b/VectoCore/VectoCore/OutputData/IModalDataContainer.cs
index 33ccd8bad6f259b4e513368c527ace75905ece1c..007bc7946ad3456f513b3e844e86f9c0e6be954e 100644
--- a/VectoCore/VectoCore/OutputData/IModalDataContainer.cs
+++ b/VectoCore/VectoCore/OutputData/IModalDataContainer.cs
@@ -111,6 +111,12 @@ namespace TUGraz.VectoCore.OutputData
 		void SetDataValue(string fieldName, object value);
 
 		void AddAuxiliary(string id, string columnName = null);
+
+		/// <summary>
+		/// clear the modal data after the simulation
+		/// called after the simulation is finished and the sum-entries have been written
+		/// </summary>
+		void FinishSimulation();
 	}
 
 	public static class ModalDataContainerExtensions
@@ -209,8 +215,8 @@ namespace TUGraz.VectoCore.OutputData
 		public static Scalar StopTimeShare(this IModalDataContainer data)
 		{
 			var stopTime = data.GetValues<MeterPerSecond>(ModalResultField.v_act)
-								.Zip(data.SimulationIntervals(), (v, dt) => new { v, dt })
-								.Where(x => x.v < 0.1).Sum(x => x.dt) ?? 0.SI<Second>();
+				.Zip(data.SimulationIntervals(), (v, dt) => new { v, dt })
+				.Where(x => x.v < 0.1).Sum(x => x.dt) ?? 0.SI<Second>();
 			return 100 * (stopTime / data.Duration()).Cast<Scalar>();
 		}
 
@@ -482,8 +488,9 @@ namespace TUGraz.VectoCore.OutputData
 			var auxValues = data.GetValues<Watt>(auxCol).ToArray();
 			var sum = 0.SI<WattSecond>();
 			for (var i = 0; i < simulationIntervals.Length; i++) {
-				if (auxValues[i] != null && simulationIntervals[i] != null)
+				if (auxValues[i] != null && simulationIntervals[i] != null) {
 					sum += auxValues[i] * simulationIntervals[i];
+				}
 			}
 			return sum;
 		}
diff --git a/VectoCore/VectoCore/OutputData/ModalDataContainer.cs b/VectoCore/VectoCore/OutputData/ModalDataContainer.cs
index dabdc513962729c1d36db1a4ca737b7f77bc0ac3..169c6a6d69083f0bd01209bff93ceb35d53102d1 100644
--- a/VectoCore/VectoCore/OutputData/ModalDataContainer.cs
+++ b/VectoCore/VectoCore/OutputData/ModalDataContainer.cs
@@ -46,7 +46,7 @@ namespace TUGraz.VectoCore.OutputData
 		private readonly bool _writeEngineOnly;
 		private readonly IModalDataFilter[] _filters;
 		private readonly Action<ModalDataContainer> _addReportResult;
-		internal ModalResults Data { get; set; }
+		protected internal ModalResults Data { get; set; }
 		private DataRow CurrentRow { get; set; }
 
 		private readonly IModalDataWriter _writer;
@@ -302,5 +302,13 @@ namespace TUGraz.VectoCore.OutputData
 				Auxiliaries[id] = col;
 			}
 		}
+
+		public void FinishSimulation()
+		{
+			Data.Clear(); //.Rows.Clear();
+			Data = null;
+			CurrentRow = null;
+			Auxiliaries.Clear();
+		}
 	}
 }
\ No newline at end of file
diff --git a/VectoCore/VectoCore/OutputData/PDF/PDFDeclarationReport.cs b/VectoCore/VectoCore/OutputData/PDF/PDFDeclarationReport.cs
index fde7538824f468e37dedbc76ee31be1fbf454b0d..7ec70b93e499ff48df8fd12b3c0462a333c634b2 100644
--- a/VectoCore/VectoCore/OutputData/PDF/PDFDeclarationReport.cs
+++ b/VectoCore/VectoCore/OutputData/PDF/PDFDeclarationReport.cs
@@ -36,10 +36,11 @@ using System.Drawing.Imaging;
 using System.Globalization;
 using System.IO;
 using System.Linq;
-using System.Threading.Tasks;
+using System.Runtime.CompilerServices;
 using System.Windows.Forms.DataVisualization.Charting;
 using iTextSharp.text;
 using iTextSharp.text.pdf;
+using TUGraz.VectoCommon.Exceptions;
 using TUGraz.VectoCommon.Models;
 using TUGraz.VectoCommon.Utils;
 using TUGraz.VectoCore.Models.Declaration;
@@ -55,8 +56,41 @@ namespace TUGraz.VectoCore.OutputData.PDF
 	/// <summary>
 	/// Class for writing a PDF Declaration report.
 	/// </summary>
-	public class PDFDeclarationReport : DeclarationReport
+	public class PDFDeclarationReport : DeclarationReport<PDFDeclarationReport.ResultEntry>
 	{
+		public class ResultEntry
+		{
+			public IList<double> DistanceKm;
+			public IList<double> Speed;
+
+			public IList<double> EngineSpeedAvg;
+			public IList<double> EngineTorqueAvg;
+
+			public MeterPerSecond AverageSpeed;
+			public SI FcLiterPer100Km;
+
+			public SI Co2GramPerKilometer;
+
+			public void SetResultData(IModalDataContainer data)
+			{
+				DistanceKm =
+					data.GetValues<Meter>(ModalResultField.dist).Select(v => v.ConvertTo().Kilo.Meter).ToDouble();
+				Speed =
+					data.GetValues<MeterPerSecond>(ModalResultField.v_act).Select(v => v.ConvertTo().Kilo.Meter.Per.Hour).ToDouble();
+
+				EngineSpeedAvg =
+					data.GetValues<PerSecond>(ModalResultField.n_eng_avg).Select(x => x.ConvertTo().Rounds.Per.Minute).ToDouble();
+				EngineTorqueAvg = data.GetValues<NewtonMeter>(ModalResultField.T_eng_fcmap).ToDouble();
+
+				AverageSpeed = data.Speed();
+				FcLiterPer100Km = data.FuelConsumptionFinalLiterPer100Kilometer() ?? 0.SI();
+
+
+				Co2GramPerKilometer = (data.CO2PerMeter() ?? 0.SI<KilogramPerMeter>()).ConvertTo().Gramm.Per.Kilo.Meter;
+			}
+		}
+
+
 		/// <summary>
 		/// the writer which actually persists the stream (either to file or somewhere else).
 		/// </summary>
@@ -92,6 +126,21 @@ namespace TUGraz.VectoCore.OutputData.PDF
 			_writer = writer;
 		}
 
+
+		/// <summary>
+		/// Adds the result of one run for the specific mission and loading. If all runs finished (given by the resultCount) the report will be written.
+		/// </summary>
+		/// <param name="entry"></param>
+		/// <param name="loadingType">Type of the loading.</param>
+		/// <param name="mission">The mission.</param>
+		/// <param name="modData">The mod data.</param>
+		[MethodImpl(MethodImplOptions.Synchronized)]
+		protected override void DoAddResult(ResultEntry entry, LoadingType loadingType, Mission mission,
+			IModalDataContainer modData)
+		{
+			entry.SetResultData(modData);
+		}
+
 		/// <summary>
 		/// Creates the report and writes it to a pdf file.
 		/// </summary>
@@ -99,13 +148,15 @@ namespace TUGraz.VectoCore.OutputData.PDF
 		{
 			ReportDate = DateTime.Now.ToUniversalTime().ToString(CultureInfo.InvariantCulture);
 
-			var tasks = new List<Task<Stream>> { Task.Run(() => CreateTitlePage(Missions)) };
-			tasks.AddRange(Missions
-				.OrderBy(m => m.Key)
-				.Select((m, i) => Task.Run(() => CreateCyclePage(m.Value, i + 2, Missions.Count + 1))));
+			var pages = new List<Stream>() {
+				CreateTitlePage(Missions)
+			};
+			//tasks.AddRange(
+			pages.AddRange(Missions.OrderBy(m => m.Key)
+				.Select((m, i) => CreateCyclePage(m.Value, i + 2, Missions.Count + 1)));
 
-			Task.WaitAll(tasks.Cast<Task>().ToArray());
-			var pages = tasks.Select(t => t.Result);
+			//Task.WaitAll(tasks.Cast<Task>().ToArray());
+			// = tasks.Select(t => t.Result);
 
 			MergeDocuments(pages, _writer.WriteStream(ReportType.DeclarationReportPdf));
 		}
@@ -131,7 +182,7 @@ namespace TUGraz.VectoCore.OutputData.PDF
 		/// </summary>
 		/// <param name="missions">The missions.</param>
 		/// <returns>the out stream of the pdf stamper with the title page.</returns>
-		private Stream CreateTitlePage(Dictionary<MissionType, ResultContainer> missions)
+		private Stream CreateTitlePage(Dictionary<MissionType, ResultContainer<ResultEntry>> missions)
 		{
 			var stream = new MemoryStream();
 			var resourceName = string.Format("{0}.Report.title{1}CyclesTemplate.pdf",
@@ -166,19 +217,17 @@ namespace TUGraz.VectoCore.OutputData.PDF
 				var data = results.ModData[LoadingType.ReferenceLoad];
 
 				pdfFields.SetField("Loading" + i, results.Mission.RefLoad.ConvertTo().Ton.ToOutputFormat(1) + " t");
-				pdfFields.SetField("Speed" + i, data.Speed().ConvertTo().Kilo.Meter.Per.Hour.ToOutputFormat(1) + " km/h");
+				pdfFields.SetField("Speed" + i, data.AverageSpeed.ConvertTo().Kilo.Meter.Per.Hour.ToOutputFormat(1) + " km/h");
 
-				var fcLiterPer100Km = data.FuelConsumptionFinalLiterPer100Kilometer() ?? 0.SI();
-				pdfFields.SetField("FC" + i, fcLiterPer100Km.ToOutputFormat(1));
+				pdfFields.SetField("FC" + i, data.FcLiterPer100Km.ToOutputFormat(1));
 
 				var loadingTon = results.Mission.RefLoad.ConvertTo().Ton;
-				var fcLiterPer100Tonkm = fcLiterPer100Km / loadingTon;
+				var fcLiterPer100Tonkm = data.FcLiterPer100Km / loadingTon;
 				pdfFields.SetField("FCt" + i, fcLiterPer100Tonkm.ToOutputFormat(1));
 
-				var co2GrammPerKm = (data.CO2PerMeter() ?? 0.SI<KilogramPerMeter>()).ConvertTo().Gramm.Per.Kilo.Meter;
-				var co2GrammPerTonKm = co2GrammPerKm / loadingTon;
+				var co2GrammPerTonKm = data.Co2GramPerKilometer / loadingTon;
 
-				pdfFields.SetField("CO2" + i, co2GrammPerKm.ToOutputFormat(1));
+				pdfFields.SetField("CO2" + i, data.Co2GramPerKilometer.ToOutputFormat(1));
 				pdfFields.SetField("CO2t" + i, co2GrammPerTonKm.ToOutputFormat(1));
 				i++;
 			}
@@ -215,7 +264,7 @@ namespace TUGraz.VectoCore.OutputData.PDF
 		/// <param name="currentPageNr">The current page nr.</param>
 		/// <param name="pageCount">The page count.</param>
 		/// <returns>the out stream of the pdfstamper for a single cycle page</returns>
-		private Stream CreateCyclePage(ResultContainer results, int currentPageNr, int pageCount)
+		private Stream CreateCyclePage(ResultContainer<ResultEntry> results, int currentPageNr, int pageCount)
 		{
 			var stream = new MemoryStream();
 
@@ -248,17 +297,15 @@ namespace TUGraz.VectoCore.OutputData.PDF
 				var loadAppendix = loadingType.GetShortName();
 
 				pdfFields.SetField("Load" + loadAppendix, loadingTon.ToOutputFormat(1) + " t");
-				pdfFields.SetField("Speed" + loadAppendix, data.Speed().ConvertTo().Kilo.Meter.Per.Hour.ToOutputFormat(1));
+				pdfFields.SetField("Speed" + loadAppendix, data.AverageSpeed.ConvertTo().Kilo.Meter.Per.Hour.ToOutputFormat(1));
 
-				var fcLiterPer100Km = data.FuelConsumptionFinalLiterPer100Kilometer() ?? 0.SI();
-				pdfFields.SetField("FCkm" + loadAppendix, fcLiterPer100Km.ToOutputFormat(1));
+				pdfFields.SetField("FCkm" + loadAppendix, data.FcLiterPer100Km.ToOutputFormat(1));
 				pdfFields.SetField("FCtkm" + loadAppendix,
-					loadingTon.IsEqual(0) ? "-" : (fcLiterPer100Km / loadingTon).ToOutputFormat(1));
+					loadingTon.IsEqual(0) ? "-" : (data.FcLiterPer100Km / loadingTon).ToOutputFormat(1));
 
-				var co2GrammPerKm = (data.CO2PerMeter() ?? 0.SI<KilogramPerMeter>()).ConvertTo().Gramm.Per.Kilo.Meter;
-				pdfFields.SetField("CO2km" + loadAppendix, co2GrammPerKm.ToOutputFormat(1));
+				pdfFields.SetField("CO2km" + loadAppendix, data.Co2GramPerKilometer.ToOutputFormat(1));
 				pdfFields.SetField("CO2tkm" + loadAppendix,
-					loadingTon.IsEqual(0) ? "-" : (co2GrammPerKm / loadingTon).ToOutputFormat(1));
+					loadingTon.IsEqual(0) ? "-" : (data.Co2GramPerKilometer / loadingTon).ToOutputFormat(1));
 			}
 
 			var content = stamper.GetOverContent(1);
@@ -268,7 +315,7 @@ namespace TUGraz.VectoCore.OutputData.PDF
 			img.SetAbsolutePosition(600, 475);
 			content.AddImage(img);
 
-			img = Image.GetInstance(DrawCycleChart(results), BaseColor.WHITE);
+			img = Image.GetInstance(DrawCycleChart(results.MissionProfile, results.ModData), BaseColor.WHITE);
 			img.ScaleAbsolute(780, 156);
 			img.SetAbsolutePosition(17, 270);
 			content.AddImage(img);
@@ -311,7 +358,7 @@ namespace TUGraz.VectoCore.OutputData.PDF
 		/// </summary>
 		/// <param name="missions">The missions.</param>
 		/// <returns></returns>
-		private static Bitmap DrawCo2MissionsChart(Dictionary<MissionType, ResultContainer> missions)
+		private static Bitmap DrawCo2MissionsChart(Dictionary<MissionType, ResultContainer<ResultEntry>> missions)
 		{
 			var co2Chart = new Chart { Width = 1500, Height = 700 };
 			co2Chart.Legends.Add(new Legend("main") {
@@ -340,8 +387,7 @@ namespace TUGraz.VectoCore.OutputData.PDF
 				var data = missionResult.Value.ModData[LoadingType.ReferenceLoad];
 
 				var loadingTon = missionResult.Value.Mission.Loadings[LoadingType.ReferenceLoad].ConvertTo().Ton;
-				var co2GrammPerTonKm = (data.CO2PerMeter() ?? 0.SI<KilogramPerMeter>()).ConvertTo().Gramm.Per.Kilo.Meter /
-										loadingTon;
+				var co2GrammPerTonKm = data.Co2GramPerKilometer / loadingTon;
 
 				var series = new Series(missionResult.Key + " (Ref. load.)");
 				var dataPoint = new DataPoint {
@@ -367,7 +413,7 @@ namespace TUGraz.VectoCore.OutputData.PDF
 		/// </summary>
 		/// <param name="missions">The missions.</param>
 		/// <returns></returns>
-		private static Bitmap DrawCo2SpeedChart(Dictionary<MissionType, ResultContainer> missions)
+		private static Bitmap DrawCo2SpeedChart(Dictionary<MissionType, ResultContainer<ResultEntry>> missions)
 		{
 			var co2SpeedChart = new Chart { Width = 1500, Height = 700 };
 			co2SpeedChart.Legends.Add(new Legend("main") {
@@ -404,14 +450,14 @@ namespace TUGraz.VectoCore.OutputData.PDF
 				foreach (var pair in missionResult.Value.ModData) {
 					var data = missionResult.Value.ModData[pair.Key];
 
-					var co2GramPerKilometer = (data.CO2PerMeter() ?? 0.SI<KilogramPerMeter>()).ConvertTo().Gramm.Per.Kilo.Meter;
 					var loadingTon = missionResult.Value.Mission.Loadings[pair.Key].ConvertTo().Ton;
 
-					var point = new DataPoint(data.Speed().ConvertTo().Kilo.Meter.Per.Hour.Value(), co2GramPerKilometer.Value()) {
-						Label = string.Format(CultureInfo.InvariantCulture, "{0:0.0} t", loadingTon.Value()),
-						Font = new Font("Helvetica", 16),
-						LabelBackColor = Color.White
-					};
+					var point = new DataPoint(data.AverageSpeed.ConvertTo().Kilo.Meter.Per.Hour.Value(),
+						data.Co2GramPerKilometer.Value()) {
+							Label = string.Format(CultureInfo.InvariantCulture, "{0:0.0} t", loadingTon.Value()),
+							Font = new Font("Helvetica", 16),
+							LabelBackColor = Color.White
+						};
 
 					if (pair.Key != LoadingType.ReferenceLoad) {
 						point.MarkerSize = 10;
@@ -432,9 +478,10 @@ namespace TUGraz.VectoCore.OutputData.PDF
 		/// <summary>
 		/// Draws the cycle chart for a cycle page.
 		/// </summary>
-		/// <param name="results">The results.</param>
+		/// <param name="profile">The speed/altitude profile of the mission</param>
+		/// <param name="results">results for different loadings</param>
 		/// <returns></returns>
-		private static Bitmap DrawCycleChart(ResultContainer results)
+		private static Bitmap DrawCycleChart(MissionProfile profile, Dictionary<LoadingType, ResultEntry> results)
 		{
 			var missionCycleChart = new Chart { Width = 2000, Height = 400 };
 			missionCycleChart.Legends.Add(new Legend("main") {
@@ -479,24 +526,17 @@ namespace TUGraz.VectoCore.OutputData.PDF
 				YAxisType = AxisType.Secondary
 			};
 
-			var m = results.ModData.First().Value;
-			var distanceKm = m.GetValues<Meter>(ModalResultField.dist).Select(v => v.ConvertTo().Kilo.Meter).ToDouble();
-
-			altitude.Points.DataBindXY(distanceKm, m.GetValues<Meter>(ModalResultField.altitude).ToDouble());
+			altitude.Points.DataBindXY(profile.DistanceKm, profile.Altitude);
 			missionCycleChart.Series.Add(altitude);
 
 			var targetSpeed = new Series { ChartType = SeriesChartType.FastLine, BorderWidth = 3, Name = "Target speed" };
-			targetSpeed.Points.DataBindXY(distanceKm,
-				m.GetValues<MeterPerSecond>(ModalResultField.v_targ).Select(v => v.ConvertTo().Kilo.Meter.Per.Hour).ToDouble());
+			targetSpeed.Points.DataBindXY(profile.DistanceKm, profile.TargetSpeed);
 			missionCycleChart.Series.Add(targetSpeed);
 
-			foreach (var result in results.ModData) {
+			foreach (var result in results) {
 				var name = result.Key.ToString();
-				var values = result.Value;
 				var series = new Series { ChartType = SeriesChartType.FastLine, Name = name };
-				series.Points.DataBindXY(
-					values.GetValues<Meter>(ModalResultField.dist).Select(v => v.ConvertTo().Kilo.Meter).ToDouble(),
-					values.GetValues<MeterPerSecond>(ModalResultField.v_act).Select(v => v.ConvertTo().Kilo.Meter.Per.Hour).ToDouble());
+				series.Points.DataBindXY(result.Value.DistanceKm, result.Value.Speed);
 				missionCycleChart.Series.Add(series);
 			}
 			missionCycleChart.Update();
@@ -512,7 +552,7 @@ namespace TUGraz.VectoCore.OutputData.PDF
 		/// <param name="modData">The mod data.</param>
 		/// <param name="flc">The FLC.</param>
 		/// <returns></returns>
-		private static Bitmap DrawOperatingPointsChart(IModalDataContainer modData, FullLoadCurve flc)
+		private static Bitmap DrawOperatingPointsChart(ResultEntry modData, FullLoadCurve flc)
 		{
 			var operatingPointsChart = new Chart { Width = 1000, Height = 427 };
 			operatingPointsChart.Legends.Add(new Legend("main") {
@@ -560,9 +600,7 @@ namespace TUGraz.VectoCore.OutputData.PDF
 			operatingPointsChart.Series.Add(dragLoadCurve);
 
 			var dataPoints = new Series("load points (Ref. load.)") { ChartType = SeriesChartType.Point, Color = Color.Red };
-			dataPoints.Points.DataBindXY(
-				modData.GetValues<PerSecond>(ModalResultField.n_eng_avg).Select(x => x.ConvertTo().Rounds.Per.Minute).ToDouble(),
-				modData.GetValues<NewtonMeter>(ModalResultField.T_eng_fcmap).ToDouble());
+			dataPoints.Points.DataBindXY(modData.EngineSpeedAvg, modData.EngineTorqueAvg);
 			operatingPointsChart.Series.Add(dataPoints);
 
 			operatingPointsChart.Update();
diff --git a/VectoCore/VectoCore/Properties/Version.cs b/VectoCore/VectoCore/Properties/Version.cs
index 73b9ecba332c38db4000cbdb0ad93c0c1c5dbd3b..0d26cb08f0a6b92225d3ee59442ea66c40918c13 100644
--- a/VectoCore/VectoCore/Properties/Version.cs
+++ b/VectoCore/VectoCore/Properties/Version.cs
@@ -30,5 +30,5 @@
 */
 
 using System.Reflection;
-[assembly: AssemblyVersion("3.1.0.683")]
-[assembly: AssemblyFileVersion("3.1.0.683")]
+[assembly: AssemblyVersion("3.1.0.718")]
+[assembly: AssemblyFileVersion("3.1.0.718")]
diff --git a/VectoCore/VectoCore/Utils/VectoCSVFile.cs b/VectoCore/VectoCore/Utils/VectoCSVFile.cs
index 0e5b17ff5e7225e775a86f9ad437baa15a682433..9fe3760be8d039ab2691ad241c3276641c561501 100644
--- a/VectoCore/VectoCore/Utils/VectoCSVFile.cs
+++ b/VectoCore/VectoCore/Utils/VectoCSVFile.cs
@@ -95,7 +95,7 @@ namespace TUGraz.VectoCore.Utils
 		public static TableData ReadStream(Stream stream, bool ignoreEmptyColumns = false, bool fullHeader = false,
 			string source = null)
 		{
-			var retVal = new TableData(source);
+			var retVal = new TableData(source, DataSourceType.Embedded);
 			ReadCSV(retVal, stream, ignoreEmptyColumns, fullHeader);
 			return retVal;
 		}
diff --git a/VectoCore/VectoCore/VectoCore.csproj b/VectoCore/VectoCore/VectoCore.csproj
index c0da5d8378cda7901d960fc45bac6e4f5dc46cd8..0f2e04640fc27c687a8bf4433a2c17eb3b6e9d76 100644
--- a/VectoCore/VectoCore/VectoCore.csproj
+++ b/VectoCore/VectoCore/VectoCore.csproj
@@ -127,6 +127,7 @@
     <Compile Include="InputData\Reader\FullLoadCurveReader.cs" />
     <Compile Include="InputData\Reader\Impl\AbstractVectoRunDataFactory.cs" />
     <Compile Include="InputData\Reader\Impl\DeclarationModeVectoRunDataFactory.cs" />
+    <Compile Include="InputData\Reader\Impl\DrivingCycleProxy.cs" />
     <Compile Include="InputData\Reader\Impl\EngineeringModeVectoRunDataFactory.cs" />
     <Compile Include="InputData\Reader\Impl\EngineOnlyVectoRunDataFactory.cs" />
     <Compile Include="InputData\Reader\ShiftPolygonReader.cs" />
diff --git a/VectoCore/VectoCoreTest/Integration/SimpleDrivingCycles.cs b/VectoCore/VectoCoreTest/Integration/SimpleDrivingCycles.cs
index 814541986a7086f15dc3d7e90627ee83c993efd8..145eb9cc26a81fae50a1947ae33853de301ffbb1 100644
--- a/VectoCore/VectoCoreTest/Integration/SimpleDrivingCycles.cs
+++ b/VectoCore/VectoCoreTest/Integration/SimpleDrivingCycles.cs
@@ -30,6 +30,7 @@
 */
 
 using System.Diagnostics.CodeAnalysis;
+using TUGraz.VectoCore.Configuration;
 using TUGraz.VectoCore.InputData.Reader;
 using TUGraz.VectoCore.Models.Declaration;
 using TUGraz.VectoCore.Models.SimulationComponent.Data;
@@ -279,7 +280,8 @@ namespace TUGraz.VectoCore.Tests.Integration
 		public static DrivingCycleData ReadDeclarationCycle(string missionType)
 		{
 			var cycleData =
-				RessourceHelper.ReadStream(DeclarationData.DeclarationDataResourcePrefix + ".MissionCycles." + missionType + ".vdri");
+				RessourceHelper.ReadStream(DeclarationData.DeclarationDataResourcePrefix + ".MissionCycles." + missionType +
+											Constants.FileExtensions.CycleFile);
 			var cycle = DrivingCycleDataReader.ReadFromStream(cycleData, CycleType.DistanceBased, "", false);
 			return cycle;
 		}
diff --git a/VectoCore/VectoCoreTest/Models/SimulationComponentData/DistanceCycleDataTest.cs b/VectoCore/VectoCoreTest/Models/SimulationComponentData/DistanceCycleDataTest.cs
index 8983bfcca8c8e8200f34283a7b7cdfad9b735566..894dfe71f6e959d891515fef56a1a5f52bf3be74 100644
--- a/VectoCore/VectoCoreTest/Models/SimulationComponentData/DistanceCycleDataTest.cs
+++ b/VectoCore/VectoCoreTest/Models/SimulationComponentData/DistanceCycleDataTest.cs
@@ -31,6 +31,7 @@
 
 using Microsoft.VisualStudio.TestTools.UnitTesting;
 using TUGraz.VectoCommon.Exceptions;
+using TUGraz.VectoCore.Configuration;
 using TUGraz.VectoCore.InputData.Reader;
 using TUGraz.VectoCore.Models.SimulationComponent.Data;
 using TUGraz.VectoCore.Tests.Integration;
@@ -125,7 +126,8 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponentData
 		public void CycleAltitudeTest()
 		{
 			var missionType = "LongHaul";
-			var stream = RessourceHelper.ReadStream(ResourceNamespace + "MissionCycles." + missionType + ".vdri");
+			var stream =
+				RessourceHelper.ReadStream(ResourceNamespace + "MissionCycles." + missionType + Constants.FileExtensions.CycleFile);
 
 			var cycleData = DrivingCycleDataReader.ReadFromStream(stream, CycleType.DistanceBased, "", false);
 			foreach (var entry in cycleData.Entries) {
diff --git a/VectoCore/VectoCoreTest/Utils/MockAuxiliaryDemand.cs b/VectoCore/VectoCoreTest/Utils/MockAuxiliaryDemand.cs
index 82476b41f076ad5e42dc97af31cdc472226ef65b..b74dd43c8624c43af046873cbdf7d2c1f12a0c17 100644
--- a/VectoCore/VectoCoreTest/Utils/MockAuxiliaryDemand.cs
+++ b/VectoCore/VectoCoreTest/Utils/MockAuxiliaryDemand.cs
@@ -115,5 +115,7 @@ namespace TUGraz.VectoCore.Tests.Utils
 		{
 			return new List<DrivingCycleData.DrivingCycleEntry>();
 		}
+
+		public void FinishSimulation() {}
 	}
 }
\ No newline at end of file
diff --git a/VectoCore/VectoCoreTest/Utils/MockModalDataContainer.cs b/VectoCore/VectoCoreTest/Utils/MockModalDataContainer.cs
index e88c6e1ed20236fa0dcf488ec5030a93866ebc91..f0a08e3fbeb543b0c1734f503aac1bd7266f4e99 100644
--- a/VectoCore/VectoCoreTest/Utils/MockModalDataContainer.cs
+++ b/VectoCore/VectoCoreTest/Utils/MockModalDataContainer.cs
@@ -114,6 +114,16 @@ namespace TUGraz.VectoCore.Tests.Utils
 			Auxiliaries[id] = Data.Columns[auxColName];
 		}
 
+		public void Dispose()
+		{
+			throw new NotImplementedException();
+		}
+
+		public void FinishSimulation()
+		{
+			Data.Rows.Clear();
+		}
+
 		public string RunName { get; set; }
 		public string CycleName { get; set; }
 		public string RunSuffix { get; set; }