From 372ea5b25db34097218c8b23874c49d520a76ac2 Mon Sep 17 00:00:00 2001
From: Markus Quaritsch <markus.quaritsch@tugraz.at>
Date: Mon, 19 Sep 2016 17:32:31 +0200
Subject: [PATCH] adding source property to input data (json files), extending
 auxiliary helper to provide key and name (used in GUI) to have only one sorce
 for auxiliaries, adding validation to job (not working atm)

---
 VECTO/GUI/GearboxForm.vb                      | 109 +--
 VECTO/GUI/MainForm.vb                         |   2 +-
 VECTO/GUI/VectoJobForm.vb                     | 188 +++--
 VECTO/GUI/VehicleAuxiliariesDialog.vb         |  17 +-
 VECTO/Input Files/Engine.vb                   |  11 +
 VECTO/Input Files/Gearbox.vb                  |  13 +-
 VECTO/Input Files/VectoJob.vb                 | 769 ++++++++++++------
 VECTO/Input Files/Vehicle.vb                  | 117 ++-
 VECTO/VECTO_Global.vb                         |   8 +-
 .../InputData/DeclarationInputData.cs         |   4 +
 .../VectoCommon/InputData/TableData.cs        |   6 -
 VectoCommon/VectoCommon/VectoCommon.csproj    |   1 +
 VectoConsole/Properties/Version.cs            |   4 +-
 .../InputData/FileIO/JSON/JSONInputData.cs    |  17 +-
 .../InputData/FileIO/JSON/JSONVehicleData.cs  |   2 +
 .../VectoCore/InputData/Impl/InputData.cs     |   5 +
 .../EngineeringDataAdapter.cs                 |   2 +-
 .../EngineeringModeVectoRunDataFactory.cs     |   2 +-
 .../Models/Declaration/AuxiliaryTypeHelper.cs |  23 +
 VectoCore/VectoCore/Properties/Version.cs     |   4 +-
 .../Utils/MockEngineDataProvider.cs           |   4 +-
 21 files changed, 902 insertions(+), 406 deletions(-)

diff --git a/VECTO/GUI/GearboxForm.vb b/VECTO/GUI/GearboxForm.vb
index 8d1c05b909..b13735b818 100644
--- a/VECTO/GUI/GearboxForm.vb
+++ b/VECTO/GUI/GearboxForm.vb
@@ -755,67 +755,66 @@ Public Class GearboxForm
 			chart.Series.Add(s)
 		End If
 
-		Dim vectoJob As VectoJob = New VectoJob() With {.FilePath = VectoJobForm.VECTOfile}
-		Dim vectoOk As Boolean = vectoJob.ReadFile()
+		'Dim vectoJob As VectoJob = New VectoJob() With {.FilePath = VectoJobForm.VECTOfile}
+		'Dim vectoOk As Boolean = vectoJob.ReadFile()
 
-		Dim inputData As IEngineeringInputDataProvider = TryCast(JSONInputDataFactory.ReadComponentData(vectoJob.PathVeh(False)), 
+		Dim inputData As IEngineeringInputDataProvider = TryCast(JSONInputDataFactory.ReadJsonJob(VectoJobForm.VECTOfile), 
 																IEngineeringInputDataProvider)
+		If (inputData Is Nothing) Then
+			Exit Sub
+		End If
 		Dim vehicle As IVehicleEngineeringInputData = inputData.VehicleInputData
-		inputData = TryCast(JSONInputDataFactory.ReadComponentData(vectoJob.PathEng(False)), IEngineeringInputDataProvider)
+		'inputData = TryCast(JSONInputDataFactory.ReadComponentData(vectoJob.PathEng(False)), IEngineeringInputDataProvider)
 		Dim engine As IEngineEngineeringInputData = inputData.EngineInputData
 		Dim engineFld As EngineFullLoadCurve = EngineFullLoadCurve.Create(engine.FullLoadCurve)
 
-		'Fld
-		If vectoOk AndAlso Not vehicle Is Nothing Then
 
-			s = New Series
-			s.Points.DataBindXY(engineFld.FullLoadEntries.Select(Function(x) x.EngineSpeed.AsRPM).ToArray(),
-								engineFld.FullLoadEntries.Select(Function(x) x.TorqueFullLoad.Value()).ToArray())
-			s.ChartType = SeriesChartType.FastLine
-			s.BorderWidth = 2
-			s.Color = Color.DarkBlue
-			s.Name = "Full load"
-			chart.Series.Add(s)
-
-			If VectoJobForm.Visible AndAlso engine.IdleSpeed > 0 Then
-				'If FLD0.Init(VectoJobForm.n_idle) Then
-
-				'Dim fullLoadCurve As FullLoadCurve = ConvertToFullLoadCurve(FLD0.LnU, FLD0.LTq)
-				Dim gears As IList(Of ITransmissionInputData) = ConvertToGears(LvGears.Items)
-				Dim shiftLines As ShiftPolygon = GetShiftLines(engine.IdleSpeed, engineFld, vehicle, gears, gear)
-				If (CType(CbGStype.SelectedValue, GearboxType).ManualTransmission() AndAlso Not IsNothing(shiftLines)) Then
-
-
-					s = New Series
-
-					's.Points.DataBindXY(Shiftpoly.gs_nUup, Shiftpoly.gs_TqUp)
-					s.Points.DataBindXY(
-						shiftLines.Upshift.Select(Function(pt) pt.AngularSpeed.AsRPM).
-											ToArray(),
-						shiftLines.Upshift.Select(Function(pt) pt.Torque.Value()).ToArray())
-					s.ChartType = SeriesChartType.FastLine
-					s.BorderWidth = 2
-					s.Color = Color.DarkRed
-					s.BorderDashStyle = ChartDashStyle.Dash
-					s.Name = "Upshift curve (generic)"
-					chart.Series.Add(s)
-
-					s = New Series
-					's.Points.DataBindXY(Shiftpoly.gs_nUdown, Shiftpoly.gs_TqDown)
-					s.Points.DataBindXY(
-						shiftLines.Downshift.Select(Function(pt) pt.AngularSpeed.AsRPM) _
-											.ToArray(),
-						shiftLines.Downshift.Select(Function(pt) pt.Torque.Value()).ToArray())
-					s.ChartType = SeriesChartType.FastLine
-					s.BorderWidth = 2
-					s.Color = Color.DarkRed
-					s.BorderDashStyle = ChartDashStyle.Dash
-					s.Name = "Downshift curve (generic)"
-					chart.Series.Add(s)
-				End If
-				'End If
+		s = New Series
+		s.Points.DataBindXY(engineFld.FullLoadEntries.Select(Function(x) x.EngineSpeed.AsRPM).ToArray(),
+							engineFld.FullLoadEntries.Select(Function(x) x.TorqueFullLoad.Value()).ToArray())
+		s.ChartType = SeriesChartType.FastLine
+		s.BorderWidth = 2
+		s.Color = Color.DarkBlue
+		s.Name = "Full load"
+		chart.Series.Add(s)
+
+		If VectoJobForm.Visible AndAlso engine.IdleSpeed > 0 Then
+			'If FLD0.Init(VectoJobForm.n_idle) Then
+
+			'Dim fullLoadCurve As FullLoadCurve = ConvertToFullLoadCurve(FLD0.LnU, FLD0.LTq)
+			Dim gears As IList(Of ITransmissionInputData) = ConvertToGears(LvGears.Items)
+			Dim shiftLines As ShiftPolygon = GetShiftLines(engine.IdleSpeed, engineFld, vehicle, gears, gear)
+			If (CType(CbGStype.SelectedValue, GearboxType).ManualTransmission() AndAlso Not IsNothing(shiftLines)) Then
+
+
+				s = New Series
+
+				's.Points.DataBindXY(Shiftpoly.gs_nUup, Shiftpoly.gs_TqUp)
+				s.Points.DataBindXY(
+					shiftLines.Upshift.Select(Function(pt) pt.AngularSpeed.AsRPM).
+										ToArray(),
+					shiftLines.Upshift.Select(Function(pt) pt.Torque.Value()).ToArray())
+				s.ChartType = SeriesChartType.FastLine
+				s.BorderWidth = 2
+				s.Color = Color.DarkRed
+				s.BorderDashStyle = ChartDashStyle.Dash
+				s.Name = "Upshift curve (generic)"
+				chart.Series.Add(s)
+
+				s = New Series
+				's.Points.DataBindXY(Shiftpoly.gs_nUdown, Shiftpoly.gs_TqDown)
+				s.Points.DataBindXY(
+					shiftLines.Downshift.Select(Function(pt) pt.AngularSpeed.AsRPM) _
+										.ToArray(),
+					shiftLines.Downshift.Select(Function(pt) pt.Torque.Value()).ToArray())
+				s.ChartType = SeriesChartType.FastLine
+				s.BorderWidth = 2
+				s.Color = Color.DarkRed
+				s.BorderDashStyle = ChartDashStyle.Dash
+				s.Name = "Downshift curve (generic)"
+				chart.Series.Add(s)
 			End If
-
+			'End If
 		End If
 
 
@@ -853,7 +852,9 @@ Public Class GearboxForm
 	End Sub
 
 
-	Private Function GetShiftLines(ByVal idleSpeed As PerSecond, engineFullLoadCurve As EngineFullLoadCurve, vehicle As IVehicleEngineeringInputData, gears As IList(Of ITransmissionInputData), ByVal gear As Integer) As ShiftPolygon
+	Private Function GetShiftLines(ByVal idleSpeed As PerSecond, engineFullLoadCurve As EngineFullLoadCurve,
+									vehicle As IVehicleEngineeringInputData, gears As IList(Of ITransmissionInputData), ByVal gear As Integer) _
+		As ShiftPolygon
 		Dim engine As CombustionEngineData = ConvertToEngineData(engineFullLoadCurve, idleSpeed)
 		If gears.Count <= 1 Then
 			Return Nothing
diff --git a/VECTO/GUI/MainForm.vb b/VECTO/GUI/MainForm.vb
index 52f85878a5..cfaa32e959 100644
--- a/VECTO/GUI/MainForm.vb
+++ b/VECTO/GUI/MainForm.vb
@@ -1194,7 +1194,7 @@ lbFound:
 				If Not LoadedDefault Then Exit Sub
 				Path = FilePath
 			End If
-			Dim file As StreamWriter = My.Computer.FileSystem.OpenTextFileWriter(Path, True, Encoding.UTF8)
+			Dim file As StreamWriter = My.Computer.FileSystem.OpenTextFileWriter(Path, False, Encoding.UTF8)
 			For x = 1 To LVbox.Items.Count
 				file.WriteLine(String.Join("?", LVbox.Items(x - 1).SubItems(0).Text, Math.Abs(CInt(LVbox.Items(x - 1).Checked))))
 			Next
diff --git a/VECTO/GUI/VectoJobForm.vb b/VECTO/GUI/VectoJobForm.vb
index aa7f7a3ec8..1327b7cff2 100644
--- a/VECTO/GUI/VectoJobForm.vb
+++ b/VECTO/GUI/VectoJobForm.vb
@@ -128,33 +128,33 @@ Public Class VectoJobForm
 
 		If _
 			LvAux.Items.Count <> 5 OrElse
-			(LvAux.Items(0).Text <> Constants.AuxiliaryKey.Fan OrElse LvAux.Items(1).Text <> Constants.AuxiliaryKey.SteerPump OrElse
-			LvAux.Items(2).Text <> Constants.AuxiliaryKey.HVAC OrElse LvAux.Items(3).Text <> Constants.AuxiliaryKey.ElecSys OrElse
-			LvAux.Items(4).Text <> Constants.AuxiliaryKey.PneumSys) Then
+			(LvAux.Items(0).Text <> VectoCore.Configuration.Constants.Auxiliaries.IDs.Fan OrElse
+			LvAux.Items(1).Text <> VectoCore.Configuration.Constants.Auxiliaries.IDs.SteeringPump OrElse
+			LvAux.Items(2).Text <> VectoCore.Configuration.Constants.Auxiliaries.IDs.HeatingVentilationAirCondition OrElse
+			LvAux.Items(3).Text <> VectoCore.Configuration.Constants.Auxiliaries.IDs.ElectricSystem OrElse
+			LvAux.Items(4).Text <> VectoCore.Configuration.Constants.Auxiliaries.IDs.PneumaticSystem) Then
 			LvAux.Items.Clear()
 
 
-			LvAux.Items.Add(GetTechListForAux(Constants.AuxiliaryKey.Fan, "Fan", DeclarationData.Fan))
+			LvAux.Items.Add(GetTechListForAux(AuxiliaryType.Fan, DeclarationData.Fan))
 
-			LvAux.Items.Add(GetTechListForAux(Constants.AuxiliaryKey.SteerPump, "Steering pump", DeclarationData.SteeringPump))
+			LvAux.Items.Add(GetTechListForAux(AuxiliaryType.SteeringPump, DeclarationData.SteeringPump))
 
-			LvAux.Items.Add(GetTechListForAux(Constants.AuxiliaryKey.HVAC, "HVAC",
-											DeclarationData.HeatingVentilationAirConditioning))
+			LvAux.Items.Add(GetTechListForAux(AuxiliaryType.HVAC, DeclarationData.HeatingVentilationAirConditioning))
 
-			LvAux.Items.Add(GetTechListForAux(Constants.AuxiliaryKey.ElecSys, "Electric System", DeclarationData.ElectricSystem))
+			LvAux.Items.Add(GetTechListForAux(AuxiliaryType.ElectricSystem, DeclarationData.ElectricSystem))
 
-			LvAux.Items.Add(GetTechListForAux(Constants.AuxiliaryKey.PneumSys, "Pneumatic System",
-											DeclarationData.PneumaticSystem))
+			LvAux.Items.Add(GetTechListForAux(AuxiliaryType.PneumaticSystem, DeclarationData.PneumaticSystem))
 
 		End If
 	End Sub
 
-	Protected Function GetTechListForAux(key As String, nameStr As String, aux As IDeclarationAuxiliaryTable) _
+	Protected Function GetTechListForAux(type As AuxiliaryType, aux As IDeclarationAuxiliaryTable) _
 		As ListViewItem
 		Dim LV0 As ListViewItem
 
-		LV0 = New ListViewItem(key)
-		LV0.SubItems.Add(nameStr)
+		LV0 = New ListViewItem(type.Key())
+		LV0.SubItems.Add(type.Name())
 		Dim auxtech As String() = aux.GetTechnologies()
 		If auxtech.Count > 1 Then
 			LV0.SubItems.Add("")
@@ -364,24 +364,17 @@ Public Class VectoJobForm
 
 	'Open file
 	Public Sub VECTOload2Form(file As String)
+
 		If ChangeCheckCancel() Then Exit Sub
 
 		VECTOnew()
 
 		'Read GEN
-		Dim VEC0 As VectoJob = New VectoJob
-		VEC0.FilePath = file
-		Try
-			If Not VEC0.ReadFile() Then
-				MsgBox("Failed to load " & GetFilenameWithoutPath(file, True) & "!")
-				Exit Sub
-			End If
-		Catch ex As Exception
-			MsgBox("Failed to load " & GetFilenameWithoutPath(file, True) & "!")
-			Exit Sub
-		End Try
+		Dim inputData As IEngineeringInputDataProvider = TryCast(JSONInputDataFactory.ReadComponentData(file), 
+																IEngineeringInputDataProvider)
+		Dim vectoJob As IEngineeringJobInputData = inputData.JobInputData()
 
-		If Cfg.DeclMode <> VEC0.SavedInDeclMode Then
+		If Cfg.DeclMode <> vectoJob.SavedInDeclarationMode Then
 			Select Case WrongMode()
 				Case 1
 					Close()
@@ -394,79 +387,102 @@ Public Class VectoJobForm
 			End Select
 		End If
 
-
+		VECTOfile = file
+		_basePath = Path.GetDirectoryName(file)
 		'Update Form
 
 		'Files -----------------------------
-		TbVEH.Text = VEC0.PathVeh(True)
-		TbENG.Text = VEC0.PathEng(True)
-		TbGBX.Text = VEC0.PathGbx(True)
+		TbVEH.Text = GetRelativePath(inputData.VehicleInputData.Source, _basePath)
+		TbENG.Text = GetRelativePath(inputData.EngineInputData.Source, _basePath)
+		TbGBX.Text = GetRelativePath(inputData.GearboxInputData.Source, _basePath)
 
 		'Start/Stop
-		ChBStartStop.Checked = VEC0.StartStop
-		TbSSspeed.Text = VEC0.StStV.ToString()
-		TbSStime.Text = VEC0.StStT.ToString()
-		TbSSdelay.Text = VEC0.StartStopDelay.ToString()
+		Dim driver As IDriverEngineeringInputData = inputData.DriverInputData
+		ChBStartStop.Checked = driver.StartStop.Enabled
+		TbSSspeed.Text = driver.StartStop.MaxSpeed.ToGUIFormat()
+		TbSStime.Text = driver.StartStop.MinTime.ToGUIFormat()
+		TbSSdelay.Text = driver.StartStop.Delay.ToGUIFormat()
 
-		'VACC
-		TbDesMaxFile.Text = VEC0.DesMaxFile(True)
+		If (Cfg.DeclMode) Then
+			TbDesMaxFile.Text = ""
+			'AA-TB
+			'Try and Select any previously selected Auxiliary Type
+			Dim declarationInput As IDeclarationInputDataProvider = CType(inputData, IDeclarationInputDataProvider)
+			Dim auxInput As IAuxiliariesDeclarationInputData = declarationInput.AuxiliaryInputData()
 
+			cboAdvancedAuxiliaries.SelectedIndex = 0
 
-		'AA-TB
-		'Try and Select any previously selected Auxiliary Type
-		For Each item As AdvancedAuxiliary In cboAdvancedAuxiliaries.Items
-			If item.AssemblyName = VEC0.AuxiliaryAssembly AndAlso VEC0.AuxiliaryVersion = item.AuxiliaryVersion Then
-				cboAdvancedAuxiliaries.SelectedItem = item
-				Exit For
-			End If
-		Next
-		'AA-TB
-		'Assign any previously saved Axiliary FilePath
-		txtAdvancedAuxiliaryFile.Text = VEC0.AdvancedAuxiliaryFilePath
+			LvAux.Items.Clear()
+			Dim entry As IAuxiliaryDeclarationInputData
+			For Each entry In auxInput.Auxiliaries
+				Dim lv0 As ListViewItem = New ListViewItem
+				lv0.SubItems(0).Text = AuxiliaryTypeHelper.GetAuxKey(entry.Type)
+				lv0.SubItems.Add(AuxiliaryTypeHelper.ToString(entry.Type))
+				lv0.SubItems.Add(String.Join(", ", entry.Technology))
+				LvAux.Items.Add(lv0)
+			Next
+		Else
+			'VACC
+			Try
+				TbDesMaxFile.Text = GetRelativePath(driver.AccelerationCurve.Source, _basePath)
+			Catch
+				TbDesMaxFile.Text = ""
+			End Try
 
+			Dim auxInput As IAuxiliariesEngineeringInputData = inputData.AuxiliaryInputData()
+			For Each item As AdvancedAuxiliary In cboAdvancedAuxiliaries.Items
+				If _
+					item.AssemblyName = auxInput.AuxiliaryAssembly.ToString() AndAlso auxInput.AuxiliaryVersion = item.AuxiliaryVersion _
+					Then
+					cboAdvancedAuxiliaries.SelectedItem = item
+					Exit For
+				End If
+			Next
+			'AA-TB
+			'Assign any previously saved Axiliary FilePath
+			txtAdvancedAuxiliaryFile.Text = auxInput.AdvancedAuxiliaryFilePath
 
-		LvAux.Items.Clear()
-		Dim AuxEntryKV As KeyValuePair(Of String, VectoJob.AuxEntry)
-		For Each AuxEntryKV In VEC0.AuxPaths
-			Dim lv0 As ListViewItem = New ListViewItem
-			lv0.SubItems(0).Text = AuxEntryKV.Key
-			lv0.SubItems.Add(AuxEntryKV.Value.Type)
-			If Cfg.DeclMode Then
-				lv0.SubItems.Add(String.Join(", ", AuxEntryKV.Value.TechnologyList))
-			Else
-				lv0.SubItems.Add(AuxEntryKV.Value.Path.OriginalPath)
-			End If
-			LvAux.Items.Add(lv0)
-		Next
+			LvAux.Items.Clear()
+			For Each entry As IAuxiliaryEngineeringInputData In auxInput.Auxiliaries
+				Dim lv0 As ListViewItem = New ListViewItem
+				lv0.SubItems(0).Text = entry.ID
+				lv0.SubItems.Add(entry.AuxiliaryType.ToString())
+				lv0.SubItems.Add(If(entry.DemandMap Is Nothing, "", entry.DemandMap.Source))
+				LvAux.Items.Add(lv0)
+			Next
 
-		Dim sb As SubPath
-		For Each sb In VEC0.CycleFiles
+		End If
+
+		Dim sb As ICycleData
+		For Each sb In vectoJob.Cycles
 			Dim lv0 As ListViewItem = New ListViewItem
-			lv0.Text = sb.OriginalPath
+			lv0.Text = sb.Name
 			LvCycles.Items.Add(lv0)
 		Next
 
-		CbEngOnly.Checked = VEC0.EngineOnly
+		CbEngOnly.Checked = vectoJob.EngineOnlyMode
 
-		If VEC0.EcoRollOn Then
+		If driver.OverSpeedEcoRoll.Mode = DriverMode.EcoRoll Then
 			RdEcoRoll.Checked = True
-		ElseIf VEC0.OverSpeedOn Then
+		ElseIf driver.OverSpeedEcoRoll.Mode = DriverMode.Overspeed Then
 			RdOverspeed.Checked = True
 		Else
 			RdOff.Checked = True
 		End If
-		TbOverspeed.Text = CStr(VEC0.OverSpeed)
-		TbUnderSpeed.Text = CStr(VEC0.UnderSpeed)
-		TbVmin.Text = CStr(VEC0.VMin)
-		CbLookAhead.Checked = VEC0.LookAheadOn
+		TbOverspeed.Text = driver.OverSpeedEcoRoll.MinSpeed.ToGUIFormat()
+		TbUnderSpeed.Text = driver.OverSpeedEcoRoll.UnderSpeed.ToGUIFormat()
+		TbVmin.Text = driver.OverSpeedEcoRoll.MinSpeed.ToGUIFormat()
+		CbLookAhead.Checked = driver.Lookahead.Enabled
 		'TbAlookahead.Text = CStr(VEC0.ALookahead)
 		'TbVminLA.Text = CStr(VEC0.VMinLa)
-		tbLacPreviewFactor.Text = CStr(VEC0.LacPreviewFactor)
-		tbDfCoastingOffset.Text = CStr(VEC0.LacDfOffset)
-		tbDfCoastingScale.Text = CStr(VEC0.LacDfScale)
+		tbLacPreviewFactor.Text = driver.Lookahead.LookaheadDistanceFactor.ToGUIFormat()
+		tbDfCoastingOffset.Text = driver.Lookahead.CoastingDecisionFactorOffset.ToGUIFormat()
+		tbDfCoastingScale.Text = driver.Lookahead.CoastingDecisionFactorScaling.ToGUIFormat()
 
-		tbLacDfTargetSpeedFile.Text = VEC0.LacDfTargetSpeedFile
-		tbLacDfVelocityDropFile.Text = VEC0.LacDfVelocityDropFile
+		tbLacDfTargetSpeedFile.Text = GetRelativePath(driver.Lookahead.CoastingDecisionFactorTargetSpeedLookup.Source,
+													_basePath)
+		tbLacDfVelocityDropFile.Text = GetRelativePath(driver.Lookahead.CoastingDecisionFactorVelocityDropLookup.Source,
+														_basePath)
 
 		'-------------------------------------------------------------
 
@@ -478,8 +494,6 @@ Public Class VectoJobForm
 		VehicleForm.AutoSendTo = False
 
 
-		VECTOfile = file
-
 		Dim x As Integer = Len(file)
 		While Mid(file, x, 1) <> "\" And x > 0
 			x = x - 1
@@ -538,8 +552,8 @@ Public Class VectoJobForm
 
 		'Start/Stop
 		vec0.StartStop = ChBStartStop.Checked
-		vec0.StStV = TbSSspeed.Text.ToDouble()
-		vec0.StStT = TbSStime.Text.ToDouble()
+		vec0.StartStopMaxSpeed = TbSSspeed.Text.ToDouble()
+		vec0.StartStopTime = TbSStime.Text.ToDouble()
 		vec0.StartStopDelay = TbSSdelay.Text.ToDouble()
 
 		'a_DesMax
@@ -1014,7 +1028,7 @@ lbDlog:
 		PicVehicle.Image = Nothing
 		PicBox.Image = Nothing
 
-		Dim inputData As IEngineeringInputDataProvider = TryCast(JSONInputDataFactory.ReadComponentData(TbVEH.Text), 
+		Dim inputData As IEngineeringInputDataProvider = TryCast(JSONInputDataFactory.ReadComponentData(VECTOfile), 
 																IEngineeringInputDataProvider)
 		Dim vehicle As IVehicleEngineeringInputData = inputData.VehicleInputData
 
@@ -1071,11 +1085,11 @@ lbDlog:
 
 			EngineIdleSpeed = engine.IdleSpeed.Value()
 
-			Dim fullLoadCurve As FullLoadCurve = FullLoadCurveReader.Create(engine.FullLoadCurve)
+			Dim fullLoadCurve As FullLoadCurve = EngineFullLoadCurve.Create(engine.FullLoadCurve)
 
 			s = New Series
-			s.Points.DataBindXY(fullLoadCurve.FullLoadEntries.Select(Function(x) x.EngineSpeed.AsRPM),
-								fullLoadCurve.FullLoadEntries.Select(Function(x) x.TorqueFullLoad.Value()))
+			s.Points.DataBindXY(fullLoadCurve.FullLoadEntries.Select(Function(x) x.EngineSpeed.AsRPM).ToArray(),
+								fullLoadCurve.FullLoadEntries.Select(Function(x) x.TorqueFullLoad.Value()).ToArray())
 			s.ChartType = SeriesChartType.FastLine
 			s.BorderWidth = 2
 			s.Color = Color.DarkBlue
@@ -1083,8 +1097,8 @@ lbDlog:
 			MyChart.Series.Add(s)
 
 			s = New Series
-			s.Points.DataBindXY(fullLoadCurve.FullLoadEntries.Select(Function(x) x.EngineSpeed.AsRPM),
-								fullLoadCurve.FullLoadEntries.Select(Function(x) x.TorqueDrag.Value()))
+			s.Points.DataBindXY(fullLoadCurve.FullLoadEntries.Select(Function(x) x.EngineSpeed.AsRPM).ToArray(),
+								fullLoadCurve.FullLoadEntries.Select(Function(x) x.TorqueDrag.Value()).ToArray())
 			s.ChartType = SeriesChartType.FastLine
 			s.BorderWidth = 2
 			s.Color = Color.Blue
@@ -1093,10 +1107,10 @@ lbDlog:
 
 			OkCount += 1
 
-			pmax = fullLoadCurve.RatedSpeed.Value() / 1000 'FLD0.Pfull(FLD0.EngineRatedSpeed)
+			pmax = fullLoadCurve.MaxPower.Value() / 1000 'FLD0.Pfull(FLD0.EngineRatedSpeed)
 
 
-			TbEngTxt.Text = (engine.Displacement.Value() / 1000).ToString("0.0") & " l " & pmax.ToString("#") & " kW  " &
+			TbEngTxt.Text = (engine.Displacement.Value() * 1000).ToString("0.0") & " l " & pmax.ToString("#") & " kW  " &
 							engine.ModelName
 
 			Dim fuelConsumptionMap As FuelConsumptionMap = FuelConsumptionMapReader.Create(engine.FuelConsumptionMap)
@@ -1172,6 +1186,7 @@ lbDlog:
 			Else
 
 				For Each gear As ITransmissionInputData In gearbox.Gears
+					If gear.ShiftPolygon.Rows.Count = 0 Then Continue For
 					Dim shiftPolygon As ShiftPolygon = ShiftPolygonReader.Create(gear.ShiftPolygon)
 					s = New Series
 					s.Points.DataBindXY(shiftPolygon.Upshift.Select(Function(x) x.AngularSpeed),
@@ -1237,6 +1252,7 @@ lbDlog:
 #Region "Open File Context Menu"
 
 	Private CmFiles As String()
+	Private _basePath As String = ""
 
 	Private Sub OpenFiles(ParamArray files() As String)
 		If files.Length = 0 Then Exit Sub
diff --git a/VECTO/GUI/VehicleAuxiliariesDialog.vb b/VECTO/GUI/VehicleAuxiliariesDialog.vb
index aaa378ed30..d59afdd681 100644
--- a/VECTO/GUI/VehicleAuxiliariesDialog.vb
+++ b/VECTO/GUI/VehicleAuxiliariesDialog.vb
@@ -11,6 +11,7 @@
 Option Infer On
 
 Imports System.Windows.Forms
+Imports TUGraz.VectoCommon.Models
 Imports TUGraz.VectoCore.Models.Declaration
 
 
@@ -40,15 +41,15 @@ Public Class VehicleAuxiliariesDialog
 	Private Sub DeclInit()
 		CbTech.Items.Clear()
 		Select Case TbID.Text
-			Case Constants.AuxiliaryKey.Fan
+			Case VectoCore.Configuration.Constants.Auxiliaries.IDs.Fan
 				CbTech.Items.AddRange(DeclarationData.Fan.GetTechnologies())
-			Case Constants.AuxiliaryKey.SteerPump
+			Case VectoCore.Configuration.Constants.Auxiliaries.IDs.SteeringPump
 				CbTech.Items.AddRange(DeclarationData.SteeringPump.GetTechnologies())
-			Case Constants.AuxiliaryKey.HVAC
+			Case VectoCore.Configuration.Constants.Auxiliaries.IDs.HeatingVentilationAirCondition
 				CbTech.Items.AddRange(DeclarationData.HeatingVentilationAirConditioning.GetTechnologies())
-			Case Constants.AuxiliaryKey.ElecSys
+			Case VectoCore.Configuration.Constants.Auxiliaries.IDs.ElectricSystem
 				CbTech.Items.AddRange(DeclarationData.ElectricSystem.GetTechnologies())
-			Case Constants.AuxiliaryKey.PneumSys
+			Case VectoCore.Configuration.Constants.Auxiliaries.IDs.PneumaticSystem
 				CbTech.Items.AddRange(DeclarationData.PneumaticSystem.GetTechnologies())
 		End Select
 		If CbTech.Items.Count > 0 Then
@@ -107,12 +108,12 @@ Public Class VehicleAuxiliariesDialog
 			If Cfg.DeclMode Then
 				Select Case CbType.SelectedIndex
 					Case 0
-						TbID.Text = Constants.AuxiliaryKey.Fan
+						TbID.Text = VectoCore.Configuration.Constants.Auxiliaries.IDs.Fan
 					Case 1
-						TbID.Text = Constants.AuxiliaryKey.SteerPump
+						TbID.Text = VectoCore.Configuration.Constants.Auxiliaries.IDs.SteeringPump
 
 					Case Else '2
-						TbID.Text = Constants.AuxiliaryKey.HVAC
+						TbID.Text = VectoCore.Configuration.Constants.Auxiliaries.IDs.HeatingVentilationAirCondition
 
 				End Select
 			Else
diff --git a/VECTO/Input Files/Engine.vb b/VECTO/Input Files/Engine.vb
index b101bb1061..9d12402798 100644
--- a/VECTO/Input Files/Engine.vb	
+++ b/VECTO/Input Files/Engine.vb	
@@ -285,6 +285,17 @@ Public Class Engine
 
 #Region "IInputData"
 
+	Public ReadOnly Property SourceType As DataSourceType Implements IComponentInputData.SourceType
+		Get
+			Return DataSourceType.JSONFile
+		End Get
+	End Property
+	Public ReadOnly Property Source As String Implements IComponentInputData.Source
+		Get
+			Return FilePath
+		End Get
+	End Property
+
 	Public ReadOnly Property SavedInDeclarationMode As Boolean Implements IComponentInputData.SavedInDeclarationMode
 		Get
 			Return Cfg.DeclMode
diff --git a/VECTO/Input Files/Gearbox.vb b/VECTO/Input Files/Gearbox.vb
index a90115f9a9..874728be5b 100644
--- a/VECTO/Input Files/Gearbox.vb	
+++ b/VECTO/Input Files/Gearbox.vb	
@@ -283,7 +283,7 @@ Public Class Gearbox
 			result = axlegearData.Validate(If(Cfg.DeclMode, ExecutionMode.Declaration, ExecutionMode.Engineering))
 			If result.Any() Then
 				Return _
-					New ValidationResult("Gearbox Configuration is invalid. ", result.Select(Function(r) r.ErrorMessage).ToList())
+					New ValidationResult("Axlegear Configuration is invalid. ", result.Select(Function(r) r.ErrorMessage).ToList())
 			End If
 
 			Return ValidationResult.Success
@@ -294,6 +294,17 @@ Public Class Gearbox
 	End Function
 
 
+	Public ReadOnly Property SourceType As DataSourceType Implements IComponentInputData.SourceType
+		Get
+			Return DataSourceType.JSONFile
+		End Get
+	End Property
+	Public ReadOnly Property Source As String Implements IComponentInputData.Source
+		Get
+			Return FilePath
+		End Get
+	End Property
+
 	Public ReadOnly Property SavedInDeclarationMode As Boolean Implements IComponentInputData.SavedInDeclarationMode
 		Get
 			Return Cfg.DeclMode
diff --git a/VECTO/Input Files/VectoJob.vb b/VECTO/Input Files/VectoJob.vb
index d2b414b0e3..95d8e2c00b 100644
--- a/VECTO/Input Files/VectoJob.vb	
+++ b/VECTO/Input Files/VectoJob.vb	
@@ -8,17 +8,31 @@
 '   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 '
 ' See the LICENSE.txt for the specific language governing permissions and limitations.
-Option Infer On
-Option Explicit On
+'Option Infer On
+'Option Explicit On
 
 Imports System.Collections.Generic
+Imports System.ComponentModel.DataAnnotations
 Imports System.IO
 Imports System.Linq
 Imports Newtonsoft.Json.Linq
 Imports TUGraz.VECTO.Input_Files
+Imports TUGraz.VectoCommon.InputData
+Imports TUGraz.VectoCommon.Models
+Imports TUGraz.VectoCommon.Utils
 Imports TUGraz.VectoCore.InputData.FileIO.JSON
-
+Imports TUGraz.VectoCore.InputData.Impl
+Imports TUGraz.VectoCore.InputData.Reader.DataObjectAdapter
+Imports TUGraz.VectoCore.InputData.Reader.Impl
+Imports TUGraz.VectoCore.Models.Simulation.Data
+Imports TUGraz.VectoCore.Models.SimulationComponent.Data
+Imports TUGraz.VectoCore.Utils
+
+<CustomValidation(GetType(VectoJob), "ValidateJob")>
 Public Class VectoJob
+	Implements IEngineeringInputDataProvider, IDeclarationInputDataProvider, IEngineeringJobInputData, 
+				IDeclarationJobInputData, IDriverEngineeringInputData, IDriverDeclarationInputData
+
 	Private Const FormatVersion As Short = 3
 
 	'AA-TB
@@ -36,8 +50,6 @@ Public Class VectoJob
 	Private ReadOnly _gearboxFile As SubPath
 
 	Private _startStop As Boolean
-	Private _startStopMaxSpeed As Double
-	Private _startStopMinTime As Double
 	Public StartStopDelay As Double
 
 	Private ReadOnly _driverAccelerationFile As SubPath
@@ -57,6 +69,13 @@ Public Class VectoJob
 	Public EcoRollOn As Boolean
 
 	Public SavedInDeclMode As Boolean
+	Private _vehicleInputData As JSONComponentInputData
+	Private _engineInputData As JSONComponentInputData
+	Private _gearboxInputData As JSONComponentInputData
+
+	Public Property StartStopMaxSpeed As Double
+
+	Public Property StartStopTime As Double
 
 	Public Class AuxEntry
 		Public Type As String
@@ -88,6 +107,17 @@ Public Class VectoJob
 	Public Function SaveFile() As Boolean
 		Dim json As New JSONParser
 
+		Dim validationResults As IList(Of ValidationResult) =
+				Validate(If(Cfg.DeclMode, ExecutionMode.Declaration, ExecutionMode.Engineering))
+
+		If validationResults.Count > 0 Then
+			Dim messages As IEnumerable(Of String) =
+					validationResults.Select(Function(r) r.ErrorMessage + String.Join(", ", r.MemberNames.Distinct()))
+			MsgBox("Invalid input." + Environment.NewLine + String.Join("; ", messages), MsgBoxStyle.OkOnly,
+					"Failed to save Vecto Job")
+			Return False
+		End If
+
 		'Header
 		Dim header As Dictionary(Of String, Object) = New Dictionary(Of String, Object) From {
 				{"CreatedBy", Lic.LicString & " (" & Lic.GUID & ")"},
@@ -96,7 +126,7 @@ Public Class VectoJob
 				{"FileVersion", FormatVersion}}
 
 		'Body
-		Dim body = New Dictionary(Of String, Object)
+		Dim body As Dictionary(Of String, Object) = New Dictionary(Of String, Object)
 
 		body.Add("SavedInDeclMode", Cfg.DeclMode)
 		SavedInDeclMode = Cfg.DeclMode
@@ -130,8 +160,8 @@ Public Class VectoJob
 		body.Add("EngineOnlyMode", EngineOnly)
 		body.Add("StartStop", New Dictionary(Of String, Object) From {
 					{"Enabled", _startStop},
-					{"MaxSpeed", _startStopMaxSpeed},
-					{"MinTime", _startStopMinTime},
+					{"MaxSpeed", StartStopMaxSpeed},
+					{"MinTime", StartStopTime},
 					{"Delay", StartStopDelay}})
 		body.Add("LAC", New Dictionary(Of String, Object) From {
 					{"Enabled", LookAheadOn},
@@ -142,7 +172,7 @@ Public Class VectoJob
 					{"Df_velocityDropLookup", LacDfVelocityDropFile}})
 
 		'Overspeed / EcoRoll
-		Dim overspeedDic = New Dictionary(Of String, Object)
+		Dim overspeedDic As Dictionary(Of String, Object) = New Dictionary(Of String, Object)
 		If EcoRollOn Then
 			overspeedDic.Add("Mode", "EcoRoll")
 		ElseIf OverSpeedOn Then
@@ -159,215 +189,215 @@ Public Class VectoJob
 		Return json.WriteFile(_sFilePath)
 	End Function
 
-	Public Function ReadFile() As Boolean
-		Const msgSrc = "Main/ReadInp/GEN"
-
-		SetDefault()
-
-		Dim json As New JSONParser
-		If Not json.ReadFile(_sFilePath) Then Return False
-
-		Try
-
-			Dim fileVersion As Integer = json.Content.GetEx("Header").GetEx(Of Integer)("FileVersion")
-
-			Dim body As JToken = json.Content.GetEx("Body")
-
-			If fileVersion > 1 Then
-				SavedInDeclMode = body.GetEx(Of Boolean)("SavedInDeclMode")
-			Else
-				SavedInDeclMode = Cfg.DeclMode
-			End If
-
-			If Not body("VehicleFile") Is Nothing Then _
-				_vehicleFile.Init(_myPath, body.GetEx(Of String)("VehicleFile"))
-
-			_engineFile.Init(_myPath, body.GetEx(Of String)("EngineFile"))
-
-			If Not body("GearboxFile") Is Nothing Then _
-				_gearboxFile.Init(_myPath, body.GetEx(Of String)("GearboxFile"))
-
-			If Not body("Cycles") Is Nothing Then
-				For Each entry As JToken In body.GetEx("Cycles")
-					Dim subPath = New SubPath
-					subPath.Init(_myPath, entry.Value(Of String))
-					CycleFiles.Add(subPath)
-				Next
-			End If
-
-			'AA-TB
-			'ADVANCED AUXILIARIES 
-			If Not body("AuxiliaryAssembly") Is Nothing AndAlso
-				Not body("AuxiliaryVersion") Is Nothing Then
-
-				AuxiliaryAssembly = body("AuxiliaryAssembly").ToString()
-				AuxiliaryVersion = body("AuxiliaryVersion").ToString()
-
-			End If
-			If Not body("AdvancedAuxiliaryFilePath") Is Nothing Then
-				AdvancedAuxiliaryFilePath = body("AdvancedAuxiliaryFilePath").ToString()
-			End If
-
-
-			If Not body("Aux") Is Nothing Then
-				For Each dic As JToken In body.GetEx("Aux")
-
-					Dim auxId As String = UCase(Trim(dic.GetEx(Of String)("ID")))
-
-					If AuxPaths.ContainsKey(auxId) Then
-						WorkerMsg(MessageType.Err, "Multiple definitions of the same auxiliary type (" & auxId & ")!", msgSrc)
-						Return False
-					End If
-
-					Dim auxEntry = New AuxEntry
-
-					auxEntry.Type = dic.GetEx(Of String)("Type")
-					auxEntry.Path.Init(_myPath, dic.GetEx(Of String)("Path"))
-
-					If Not dic("Technology") Is Nothing Then
-						If fileVersion = 2 Then
-							auxEntry.TechnologyList.Add(dic.GetEx(Of String)("Technology"))
-						End If
-						If fileVersion = 3 Then
-							auxEntry.TechnologyList = dic.GetEx("Technology").ToObject(Of List(Of String))() '.FirstOrDefault()
-						End If
-					End If
-
-					If (auxId = Constants.AuxiliaryKey.HVAC) Then
-						If auxEntry.TechnologyList.Count > 0 Then ' Not String.IsNullOrWhiteSpace(auxEntry.TechStr) Then
-							auxEntry.TechnologyList.Clear()
-							WorkerMsg(MessageType.Normal, "Aux: Automatically Upgraded HVAC to new format.", msgSrc)
-						End If
-					End If
-
-					If auxId = Constants.AuxiliaryKey.ElecSys Then
-						If auxEntry.TechnologyList.Contains("Custom Technology List") OrElse auxEntry.TechnologyList.Count > 0 Then
-							Dim hasTech = False
-
-							If Not dic("TechList") Is Nothing Then
-								For Each t In dic("TechList")
-									hasTech = True
-								Next
-							End If
-
-							auxEntry.TechnologyList.Clear()
-							If Not hasTech Then
-								auxEntry.TechnologyList.Add("Standard technology")
-							Else
-								auxEntry.TechnologyList.Add("Standard technology - LED headlights, all")
-							End If
-							WorkerMsg(MessageType.Normal,
-									"Aux: Automatically Upgraded Electric System to new format: '" + auxEntry.TechnologyList.FirstOrDefault() + "'",
-									msgSrc)
-						End If
-					End If
-
-					If auxId = Constants.AuxiliaryKey.SteerPump Then
-						If _
-							auxEntry.TechnologyList.Contains("Variable displacement") OrElse
-							auxEntry.TechnologyList.Contains("Hydraulic supported by electric") Then
-							auxEntry.TechnologyList.Clear()
-							WorkerMsg(MessageType.Warn, "Aux: Steering Pump Technology not automatically convertible. Please set new value.",
-									msgSrc)
-						End If
-					End If
-
-					If auxId = Constants.AuxiliaryKey.Fan Then
-						If auxEntry.TechnologyList.Contains("Crankshaft mounted - Electronically controlled visco clutch (Default)") Then
-							auxEntry.TechnologyList.Clear()
-							auxEntry.TechnologyList.Add("Crankshaft mounted - Electronically controlled visco clutch")
-						End If
-						If auxEntry.TechnologyList.Contains("Crankshaft mounted - On/Off clutch") Then
-							auxEntry.TechnologyList.Clear()
-							auxEntry.TechnologyList.Add("Crankshaft mounted - On/off clutch")
-						End If
-						If auxEntry.TechnologyList.Contains("Belt driven or driven via transm. - On/Off clutch") Then
-							auxEntry.TechnologyList.Clear()
-							auxEntry.TechnologyList.Add("Belt driven or driven via transm. - On/off clutch")
-						End If
-					End If
-
-					If fileVersion = 2 AndAlso auxId = Constants.AuxiliaryKey.PneumSys Then
-						auxEntry.TechnologyList.Clear()
-						WorkerMsg(MessageType.Warn, "Aux: Pneumatic System must be updated. Please set new value.",
-								msgSrc)
-					End If
-
-					AuxPaths.Add(auxId, auxEntry)
-
-				Next
-			End If
-
-			If Not body("VACC") Is Nothing Then
-				_driverAccelerationFile.Init(_myPath, body.GetEx(Of String)("VACC"))
-			End If
-
-			EngineOnly = body.GetEx(Of Boolean)("EngineOnlyMode")
-
-			If Not body("StartStop") Is Nothing Then
-				Dim startStop As JToken = body.GetEx("StartStop")
-				_startStop = startStop.GetEx(Of Boolean)("Enabled")
-				_startStopMaxSpeed = startStop.GetEx(Of Double)("MaxSpeed")
-				_startStopMinTime = startStop.GetEx(Of Double)("MinTime")
-				StartStopDelay = startStop.GetEx(Of Double)("Delay")
-			Else
-				_startStop = False
-			End If
-
-			If Not body("LAC") Is Nothing Then
-				Dim lac = body.GetEx("LAC")
-				LookAheadOn = lac.GetEx(Of Boolean)("Enabled")
-				LacPreviewFactor = If(lac("PreviewDistanceFactor") Is Nothing, 10, lac.GetEx(Of Double)("PreviewDistanceFactor"))
-				LacDfOffset = If(lac("DF_offset") Is Nothing, 2.5, lac.GetEx(Of Double)("DF_offset"))
-				LacDfScale = If(lac("DF_scaling") Is Nothing, 1.5, lac.GetEx(Of Double)("DF_scaling"))
-				LacDfTargetSpeedFile =
-					If(Not lac("DF_targetSpeedLookup") Is Nothing, lac.GetEx(Of String)("DF_targetSpeedLookup"), "")
-				LacDfVelocityDropFile =
-					If(Not lac("Df_velocityDropLookup") Is Nothing, lac.GetEx(Of String)("Df_velocityDropLookup"), "")
-			Else
-				LookAheadOn = False
-			End If
-
-			If Not body("OverSpeedEcoRoll") Is Nothing Then
-				Dim dic = body("OverSpeedEcoRoll")
-
-				Select Case UCase(dic("Mode").ToString).Trim
-					Case "ECOROLL"
-						OverSpeedOn = False
-						EcoRollOn = True
-
-					Case "OVERSPEED"
-						OverSpeedOn = True
-						EcoRollOn = False
-
-					Case "OFF"
-						OverSpeedOn = False
-						EcoRollOn = False
-
-					Case Else
-						WorkerMsg(MessageType.Err, "Value '" & dic("Mode").ToString() & "' is not valid for OverSpeedEcoRoll/Mode!",
-								msgSrc)
-						Return False
-				End Select
-
-				VMin = dic.GetEx(Of Double)("MinSpeed")
-				OverSpeed = dic.GetEx(Of Double)("OverSpeed")
-				If Not dic("UnderSpeed") Is Nothing Then UnderSpeed = dic.GetEx(Of Double)("UnderSpeed")
-
-			Else
-				OverSpeedOn = False
-				EcoRollOn = False
-			End If
-
+	'Public Function ReadFile() As Boolean
+	'	Const msgSrc = "Main/ReadInp/GEN"
 
-		Catch ex As Exception
-			WorkerMsg(MessageType.Err, "Failed to read VECTO file! " & ex.Message, msgSrc)
-			Return False
-		End Try
+	'	SetDefault()
 
-
-		Return True
-	End Function
+	'	Dim json As New JSONParser
+	'	If Not json.ReadFile(_sFilePath) Then Return False
+
+	'	Try
+
+	'		Dim fileVersion As Integer = json.Content.GetEx("Header").GetEx(Of Integer)("FileVersion")
+
+	'		Dim body As JToken = json.Content.GetEx("Body")
+
+	'		If fileVersion > 1 Then
+	'			SavedInDeclMode = body.GetEx(Of Boolean)("SavedInDeclMode")
+	'		Else
+	'			SavedInDeclMode = Cfg.DeclMode
+	'		End If
+
+	'		If Not body("VehicleFile") Is Nothing Then _
+	'			_vehicleFile.Init(_myPath, body.GetEx(Of String)("VehicleFile"))
+
+	'		_engineFile.Init(_myPath, body.GetEx(Of String)("EngineFile"))
+
+	'		If Not body("GearboxFile") Is Nothing Then _
+	'			_gearboxFile.Init(_myPath, body.GetEx(Of String)("GearboxFile"))
+
+	'		If Not body("Cycles") Is Nothing Then
+	'			For Each entry As JToken In body.GetEx("Cycles")
+	'				Dim subPath = New SubPath
+	'				subPath.Init(_myPath, entry.Value(Of String))
+	'				CycleFiles.Add(subPath)
+	'			Next
+	'		End If
+
+	'		'AA-TB
+	'		'ADVANCED AUXILIARIES 
+	'		If Not body("AuxiliaryAssembly") Is Nothing AndAlso
+	'			Not body("AuxiliaryVersion") Is Nothing Then
+
+	'			AuxiliaryAssembly = body("AuxiliaryAssembly").ToString()
+	'			AuxiliaryVersion = body("AuxiliaryVersion").ToString()
+
+	'		End If
+	'		If Not body("AdvancedAuxiliaryFilePath") Is Nothing Then
+	'			AdvancedAuxiliaryFilePath = body("AdvancedAuxiliaryFilePath").ToString()
+	'		End If
+
+
+	'		If Not body("Aux") Is Nothing Then
+	'			For Each dic As JToken In body.GetEx("Aux")
+
+	'				Dim auxId As String = UCase(Trim(dic.GetEx(Of String)("ID")))
+
+	'				If AuxPaths.ContainsKey(auxId) Then
+	'					WorkerMsg(MessageType.Err, "Multiple definitions of the same auxiliary type (" & auxId & ")!", msgSrc)
+	'					Return False
+	'				End If
+
+	'				Dim auxEntry = New AuxEntry
+
+	'				auxEntry.Type = dic.GetEx(Of String)("Type")
+	'				auxEntry.Path.Init(_myPath, dic.GetEx(Of String)("Path"))
+
+	'				If Not dic("Technology") Is Nothing Then
+	'					If fileVersion = 2 Then
+	'						auxEntry.TechnologyList.Add(dic.GetEx(Of String)("Technology"))
+	'					End If
+	'					If fileVersion = 3 Then
+	'						auxEntry.TechnologyList = dic.GetEx("Technology").ToObject(Of List(Of String))() '.FirstOrDefault()
+	'					End If
+	'				End If
+
+	'				If (auxId = Constants.AuxiliaryKey.HVAC) Then
+	'					If auxEntry.TechnologyList.Count > 0 Then ' Not String.IsNullOrWhiteSpace(auxEntry.TechStr) Then
+	'						auxEntry.TechnologyList.Clear()
+	'						WorkerMsg(MessageType.Normal, "Aux: Automatically Upgraded HVAC to new format.", msgSrc)
+	'					End If
+	'				End If
+
+	'				If auxId = Constants.AuxiliaryKey.ElecSys Then
+	'					If auxEntry.TechnologyList.Contains("Custom Technology List") OrElse auxEntry.TechnologyList.Count > 0 Then
+	'						Dim hasTech = False
+
+	'						If Not dic("TechList") Is Nothing Then
+	'							For Each t In dic("TechList")
+	'								hasTech = True
+	'							Next
+	'						End If
+
+	'						auxEntry.TechnologyList.Clear()
+	'						If Not hasTech Then
+	'							auxEntry.TechnologyList.Add("Standard technology")
+	'						Else
+	'							auxEntry.TechnologyList.Add("Standard technology - LED headlights, all")
+	'						End If
+	'						WorkerMsg(MessageType.Normal,
+	'								"Aux: Automatically Upgraded Electric System to new format: '" + auxEntry.TechnologyList.FirstOrDefault() + "'",
+	'								msgSrc)
+	'					End If
+	'				End If
+
+	'				If auxId = Constants.AuxiliaryKey.SteerPump Then
+	'					If _
+	'						auxEntry.TechnologyList.Contains("Variable displacement") OrElse
+	'						auxEntry.TechnologyList.Contains("Hydraulic supported by electric") Then
+	'						auxEntry.TechnologyList.Clear()
+	'						WorkerMsg(MessageType.Warn, "Aux: Steering Pump Technology not automatically convertible. Please set new value.",
+	'								msgSrc)
+	'					End If
+	'				End If
+
+	'				If auxId = Constants.AuxiliaryKey.Fan Then
+	'					If auxEntry.TechnologyList.Contains("Crankshaft mounted - Electronically controlled visco clutch (Default)") Then
+	'						auxEntry.TechnologyList.Clear()
+	'						auxEntry.TechnologyList.Add("Crankshaft mounted - Electronically controlled visco clutch")
+	'					End If
+	'					If auxEntry.TechnologyList.Contains("Crankshaft mounted - On/Off clutch") Then
+	'						auxEntry.TechnologyList.Clear()
+	'						auxEntry.TechnologyList.Add("Crankshaft mounted - On/off clutch")
+	'					End If
+	'					If auxEntry.TechnologyList.Contains("Belt driven or driven via transm. - On/Off clutch") Then
+	'						auxEntry.TechnologyList.Clear()
+	'						auxEntry.TechnologyList.Add("Belt driven or driven via transm. - On/off clutch")
+	'					End If
+	'				End If
+
+	'				If fileVersion = 2 AndAlso auxId = Constants.AuxiliaryKey.PneumSys Then
+	'					auxEntry.TechnologyList.Clear()
+	'					WorkerMsg(MessageType.Warn, "Aux: Pneumatic System must be updated. Please set new value.",
+	'							msgSrc)
+	'				End If
+
+	'				AuxPaths.Add(auxId, auxEntry)
+
+	'			Next
+	'		End If
+
+	'		If Not body("VACC") Is Nothing Then
+	'			_driverAccelerationFile.Init(_myPath, body.GetEx(Of String)("VACC"))
+	'		End If
+
+	'		EngineOnly = body.GetEx(Of Boolean)("EngineOnlyMode")
+
+	'		If Not body("StartStop") Is Nothing Then
+	'			Dim startStop As JToken = body.GetEx("StartStop")
+	'			_startStop = startStop.GetEx(Of Boolean)("Enabled")
+	'			_startStopMaxSpeed = startStop.GetEx(Of Double)("MaxSpeed")
+	'			_startStopMinTime = startStop.GetEx(Of Double)("MinTime")
+	'			StartStopDelay = startStop.GetEx(Of Double)("Delay")
+	'		Else
+	'			_startStop = False
+	'		End If
+
+	'		If Not body("LAC") Is Nothing Then
+	'			Dim lac = body.GetEx("LAC")
+	'			LookAheadOn = lac.GetEx(Of Boolean)("Enabled")
+	'			LacPreviewFactor = If(lac("PreviewDistanceFactor") Is Nothing, 10, lac.GetEx(Of Double)("PreviewDistanceFactor"))
+	'			LacDfOffset = If(lac("DF_offset") Is Nothing, 2.5, lac.GetEx(Of Double)("DF_offset"))
+	'			LacDfScale = If(lac("DF_scaling") Is Nothing, 1.5, lac.GetEx(Of Double)("DF_scaling"))
+	'			LacDfTargetSpeedFile =
+	'				If(Not lac("DF_targetSpeedLookup") Is Nothing, lac.GetEx(Of String)("DF_targetSpeedLookup"), "")
+	'			LacDfVelocityDropFile =
+	'				If(Not lac("Df_velocityDropLookup") Is Nothing, lac.GetEx(Of String)("Df_velocityDropLookup"), "")
+	'		Else
+	'			LookAheadOn = False
+	'		End If
+
+	'		If Not body("OverSpeedEcoRoll") Is Nothing Then
+	'			Dim dic = body("OverSpeedEcoRoll")
+
+	'			Select Case UCase(dic("Mode").ToString).Trim
+	'				Case "ECOROLL"
+	'					OverSpeedOn = False
+	'					EcoRollOn = True
+
+	'				Case "OVERSPEED"
+	'					OverSpeedOn = True
+	'					EcoRollOn = False
+
+	'				Case "OFF"
+	'					OverSpeedOn = False
+	'					EcoRollOn = False
+
+	'				Case Else
+	'					WorkerMsg(MessageType.Err, "Value '" & dic("Mode").ToString() & "' is not valid for OverSpeedEcoRoll/Mode!",
+	'							msgSrc)
+	'					Return False
+	'			End Select
+
+	'			VMin = dic.GetEx(Of Double)("MinSpeed")
+	'			OverSpeed = dic.GetEx(Of Double)("OverSpeed")
+	'			If Not dic("UnderSpeed") Is Nothing Then UnderSpeed = dic.GetEx(Of Double)("UnderSpeed")
+
+	'		Else
+	'			OverSpeedOn = False
+	'			EcoRollOn = False
+	'		End If
+
+
+	'	Catch ex As Exception
+	'		WorkerMsg(MessageType.Err, "Failed to read VECTO file! " & ex.Message, msgSrc)
+	'		Return False
+	'	End Try
+
+
+	'	Return True
+	'End Function
 
 	Private Sub SetDefault()
 
@@ -377,8 +407,8 @@ Public Class VectoJob
 
 
 		_startStop = False
-		_startStopMaxSpeed = 5
-		_startStopMinTime = 5
+		StartStopMaxSpeed = 5
+		StartStopTime = 5
 		StartStopDelay = 0
 
 		_vehicleFile.Clear()
@@ -462,6 +492,12 @@ Public Class VectoJob
 	End Property
 
 
+	Public ReadOnly Property IDriverDeclarationInputData_SavedInDeclarationMode As Boolean _
+		Implements IDriverDeclarationInputData.SavedInDeclarationMode
+		Get
+		End Get
+	End Property
+
 	Public Property StartStop As Boolean
 		Get
 			Return _startStop
@@ -471,24 +507,64 @@ Public Class VectoJob
 		End Set
 	End Property
 
-	Public Property StStV As Double
+	Public ReadOnly Property IDriverEngineeringInputData_OverSpeedEcoRoll As IOverSpeedEcoRollEngineeringInputData _
+		Implements IDriverEngineeringInputData.OverSpeedEcoRoll
 		Get
-			Return _startStopMaxSpeed
+			Dim mode As DriverMode = DriverMode.Off
+			If EcoRollOn Then
+				mode = DriverMode.EcoRoll
+			ElseIf OverSpeedOn Then
+				mode = DriverMode.Overspeed
+			End If
+
+			Return New OverSpeedEcoRollInputData() With {
+				.Mode = mode,
+				.MinSpeed = VMin.KMPHtoMeterPerSecond(),
+				.OverSpeed = OverSpeed.KMPHtoMeterPerSecond(),
+				.UnderSpeed = UnderSpeed.KMPHtoMeterPerSecond()
+				}
 		End Get
-		Set(value As Double)
-			_startStopMaxSpeed = value
-		End Set
 	End Property
 
-	Public Property StStT As Double
+	Public ReadOnly Property IDriverEngineeringInputData_StartStop As IStartStopEngineeringInputData _
+		Implements IDriverEngineeringInputData.StartStop
 		Get
-			Return _startStopMinTime
+			Return New StartStopInputData With {
+				.Enabled = _startStop,
+				.MaxSpeed = StartStopMaxSpeed.KMPHtoMeterPerSecond(),
+				.MinTime = StartStopTime.SI(Of Second)(),
+				.Delay = StartStopDelay.SI(Of Second)()
+				}
+		End Get
+	End Property
+
+	Public ReadOnly Property OverSpeedEcoRoll As IOverSpeedEcoRollDeclarationInputData _
+		Implements IDriverDeclarationInputData.OverSpeedEcoRoll
+		Get
+			Return IDriverEngineeringInputData_OverSpeedEcoRoll
+		End Get
+	End Property
+
+	Public ReadOnly Property AccelerationCurve As TableData Implements IDriverEngineeringInputData.AccelerationCurve
+		Get
+			Return VectoCSVFile.Read(_driverAccelerationFile.FullPath)
+		End Get
+	End Property
+
+	Public ReadOnly Property Lookahead As ILookaheadCoastingInputData Implements IDriverEngineeringInputData.Lookahead
+		Get
+			Return New LookAheadCoastingInputData With {
+				.CoastingDecisionFactorScaling = LacDfScale,
+				.CoastingDecisionFactorOffset = LacDfOffset,
+				.Enabled = LookAheadOn,
+				.LookaheadDistanceFactor = LacPreviewFactor,
+				.CoastingDecisionFactorTargetSpeedLookup = VectoCSVFile.Read(LacDfTargetSpeedFile),
+				.CoastingDecisionFactorVelocityDropLookup = VectoCSVFile.Read(LacDfVelocityDropFile)
+				}
 		End Get
-		Set(value As Double)
-			_startStopMinTime = value
-		End Set
 	End Property
 
+
 	Public Property DesMaxFile(Optional ByVal original As Boolean = False) As String
 		Get
 			If original Then
@@ -509,6 +585,243 @@ Public Class VectoJob
 	Public Property LacDfVelocityDropFile As String
 
 
+#End Region
+
+	' 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)), 
+																	ExecutionModeServiceContainer)
+		Dim mode As ExecutionMode = If(modeService Is Nothing, ExecutionMode.Declaration, modeService.Mode)
+
+		Dim jobData As IEnumerable(Of VectoRunData)
+
+		vectoJob._vehicleInputData = New JSONComponentInputData(vectoJob._vehicleFile.FullPath)
+		vectoJob._engineInputData = New JSONComponentInputData(vectoJob._engineFile.FullPath)
+		vectoJob._gearboxInputData = New JSONComponentInputData(vectoJob._gearboxFile.FullPath)
+
+		Try
+			If mode = ExecutionMode.Declaration Then
+				Dim dataFactory As DeclarationModeVectoRunDataFactory = New DeclarationModeVectoRunDataFactory(vectoJob, Nothing)
+				jobData = dataFactory.NextRun()
+			Else
+				Dim dataFactory As EngineeringModeVectoRunDataFactory = New EngineeringModeVectoRunDataFactory(vectoJob)
+				jobData = dataFactory.NextRun()
+			End If
+
+			Dim result As IList(Of ValidationResult) =
+					jobData.Validate(If(Cfg.DeclMode, ExecutionMode.Declaration, ExecutionMode.Engineering))
+			If result.Any() Then
+				Return _
+					New ValidationResult("Vecto Job Configuration is invalid. ", result.Select(Function(r) r.ErrorMessage).ToList())
+			End If
+
+
+			Return ValidationResult.Success
+
+		Catch ex As Exception
+			Return New ValidationResult(ex.Message)
+		Finally
+			vectoJob._vehicleInputData = Nothing
+			vectoJob._engineInputData = Nothing
+			vectoJob._gearboxInputData = Nothing
+		End Try
+	End Function
+
+#Region "IInputData"
+
+	Public Function JobInputData() As IEngineeringJobInputData Implements IEngineeringInputDataProvider.JobInputData
+		Return Me
+	End Function
+
+	Public ReadOnly Property IDeclarationInputDataProvider_VehicleInputData As IVehicleDeclarationInputData _
+		Implements IDeclarationInputDataProvider.VehicleInputData
+		Get
+			Return _vehicleInputData.VehicleInputData
+		End Get
+	End Property
+
+	Public Function IDeclarationInputDataProvider_JobInputData() As IDeclarationJobInputData _
+		Implements IDeclarationInputDataProvider.JobInputData
+		Throw New NotImplementedException
+	End Function
+
+	Public ReadOnly Property VehicleInputData As IVehicleEngineeringInputData _
+		Implements IEngineeringInputDataProvider.VehicleInputData
+		Get
+			Return _vehicleInputData.VehicleInputData
+		End Get
+	End Property
+
+	Public ReadOnly Property IDeclarationInputDataProvider_GearboxInputData As IGearboxDeclarationInputData _
+		Implements IDeclarationInputDataProvider.GearboxInputData
+		Get
+			Return _gearboxInputData.GearboxInputData
+		End Get
+	End Property
+
+	Public ReadOnly Property GearboxInputData As IGearboxEngineeringInputData _
+		Implements IEngineeringInputDataProvider.GearboxInputData
+		Get
+			Return _gearboxInputData.GearboxInputData
+		End Get
+	End Property
+
+	Public ReadOnly Property IDeclarationInputDataProvider_TorqueConverterInputData As ITorqueConverterDeclarationInputData _
+		Implements IDeclarationInputDataProvider.TorqueConverterInputData
+		Get
+			Return _gearboxInputData.TorqueConverterInputData
+		End Get
+	End Property
+
+	Public ReadOnly Property TorqueConverterInputData As ITorqueConverterEngineeringInputData _
+		Implements IEngineeringInputDataProvider.TorqueConverterInputData
+		Get
+			Return _gearboxInputData.TorqueConverterInputData
+		End Get
+	End Property
+
+	Public ReadOnly Property IDeclarationInputDataProvider_AxleGearInputData As IAxleGearInputData _
+		Implements IDeclarationInputDataProvider.AxleGearInputData
+		Get
+			Return _gearboxInputData.AxleGearInputData
+		End Get
+	End Property
+
+	Public ReadOnly Property AxleGearInputData As IAxleGearInputData _
+		Implements IEngineeringInputDataProvider.AxleGearInputData
+		Get
+			Return _gearboxInputData.AxleGearInputData
+		End Get
+	End Property
+
+	Public ReadOnly Property IDeclarationInputDataProvider_AngularGearInputData As IAngularGearInputData _
+		Implements IDeclarationInputDataProvider.AngularGearInputData
+		Get
+			Return _vehicleInputData.AngularGearInputData
+		End Get
+	End Property
+
+	Public ReadOnly Property AngularGearInputData As IAngularGearInputData _
+		Implements IEngineeringInputDataProvider.AngularGearInputData
+		Get
+			Return _vehicleInputData.AngularGearInputData
+		End Get
+	End Property
+
+	Public ReadOnly Property IDeclarationInputDataProvider_EngineInputData As IEngineDeclarationInputData _
+		Implements IDeclarationInputDataProvider.EngineInputData
+		Get
+			Return _engineInputData.EngineInputData
+		End Get
+	End Property
+
+	Public ReadOnly Property EngineInputData As IEngineEngineeringInputData _
+		Implements IEngineeringInputDataProvider.EngineInputData
+		Get
+			Return _engineInputData.EngineInputData
+		End Get
+	End Property
+
+	Public Function AuxiliaryInputData() As IAuxiliariesEngineeringInputData _
+		Implements IEngineeringInputDataProvider.AuxiliaryInputData
+
+		Throw New NotImplementedException
+	End Function
+
+	Public ReadOnly Property IDeclarationInputDataProvider_RetarderInputData As IRetarderInputData _
+		Implements IDeclarationInputDataProvider.RetarderInputData
+		Get
+			Return _vehicleInputData.RetarderInputData
+		End Get
+	End Property
+
+	Public Function IDeclarationInputDataProvider_AuxiliaryInputData() As IAuxiliariesDeclarationInputData _
+		Implements IDeclarationInputDataProvider.AuxiliaryInputData
+		Throw New NotImplementedException
+	End Function
+
+	Public ReadOnly Property RetarderInputData As IRetarderInputData _
+		Implements IEngineeringInputDataProvider.RetarderInputData
+		Get
+			Return _vehicleInputData.RetarderInputData
+		End Get
+	End Property
+
+	Public ReadOnly Property IDeclarationInputDataProvider_DriverInputData As IDriverDeclarationInputData _
+		Implements IDeclarationInputDataProvider.DriverInputData
+		Get
+			Return Me
+		End Get
+	End Property
+
+	Public ReadOnly Property DriverInputData As IDriverEngineeringInputData _
+		Implements IEngineeringInputDataProvider.DriverInputData
+		Get
+			Return Me
+		End Get
+	End Property
+
+	Public ReadOnly Property PTOTransmissionInputData As IPTOTransmissionInputData _
+		Implements IEngineeringInputDataProvider.PTOTransmissionInputData
+		Get
+			Return _vehicleInputData.PTOTransmissionInputData
+		End Get
+	End Property
+
+
+	Public ReadOnly Property SavedInDeclarationMode As Boolean Implements IDeclarationJobInputData.SavedInDeclarationMode
+		Get
+			Return SavedInDeclMode
+		End Get
+	End Property
+
+	Public ReadOnly Property IDriverDeclarationInputData_StartStop As IStartStopDeclarationInputData _
+		Implements IDriverDeclarationInputData.StartStop
+		Get
+			Return IDriverEngineeringInputData_StartStop
+		End Get
+	End Property
+
+	Public ReadOnly Property IEngineeringJobInputData_Vehicle As IVehicleEngineeringInputData _
+		Implements IEngineeringJobInputData.Vehicle
+		Get
+			Return _vehicleInputData.VehicleInputData
+		End Get
+	End Property
+
+	Public ReadOnly Property Vehicle As IVehicleDeclarationInputData Implements IDeclarationJobInputData.Vehicle
+		Get
+			Return _vehicleInputData.VehicleInputData
+		End Get
+	End Property
+
+	Public ReadOnly Property Cycles As IList(Of ICycleData) Implements IEngineeringJobInputData.Cycles
+		Get
+			Dim retVal As ICycleData() = New ICycleData(CycleFiles.Count) {}
+			Dim i As Integer = 0
+			For Each cycleFile As SubPath In CycleFiles
+				retVal(i) = New CycleInputData With {
+					.Name = Path.GetFileNameWithoutExtension(cycleFile.FullPath),
+					.CycleData = VectoCSVFile.Read(cycleFile.FullPath)
+					}
+				i += 1
+			Next
+			Return retVal
+		End Get
+	End Property
+
+	Public ReadOnly Property EngineOnlyMode As Boolean Implements IEngineeringJobInputData.EngineOnlyMode
+		Get
+			Return EngineOnly
+		End Get
+	End Property
+
+	Public ReadOnly Property JobName As String Implements IDeclarationJobInputData.JobName
+		Get
+			Return Path.GetFileNameWithoutExtension(FilePath)
+		End Get
+	End Property
+
 #End Region
 End Class
 
diff --git a/VECTO/Input Files/Vehicle.vb b/VECTO/Input Files/Vehicle.vb
index eb8af084c9..7d88a89fc5 100644
--- a/VECTO/Input Files/Vehicle.vb	
+++ b/VECTO/Input Files/Vehicle.vb	
@@ -28,7 +28,8 @@ Imports TUGraz.VectoCore.Utils
 
 <CustomValidation(GetType(Vehicle), "ValidateVehicle")>
 Public Class Vehicle
-	Implements IVehicleEngineeringInputData, IVehicleDeclarationInputData
+	Implements IVehicleEngineeringInputData, IVehicleDeclarationInputData, IRetarderInputData, IPTOTransmissionInputData, 
+				IAngularGearInputData
 	'V2 MassMax is now saved in [t] instead of [kg]
 	Private Const FormatVersion As Short = 7
 	Private _fileVersion As Integer
@@ -95,6 +96,9 @@ Public Class Vehicle
 	Public Shared Function ValidateVehicle(vehicle As Vehicle, validationContext As ValidationContext) As ValidationResult
 
 		Dim vehicleData As VehicleData
+		Dim retarderData As RetarderData
+		Dim ptoData As PTOData = Nothing
+		Dim angledriveData As AngularGearData
 
 		Dim modeService As ExecutionModeServiceContainer = TryCast(validationContext.GetService(GetType(ExecutionMode)), 
 																	ExecutionModeServiceContainer)
@@ -107,17 +111,45 @@ Public Class Vehicle
 																		vehicle.GrossVehicleMassRating, vehicle.CurbWeightChassis)
 				vehicleData = doa.CreateVehicleData(vehicle, segment.Missions.First(),
 													segment.Missions.First().Loadings.First().Value)
+				retarderData = doa.CreateRetarderData(vehicle)
+				angledriveData = doa.CreateAngularGearData(vehicle, False)
 			Else
 				Dim doa As EngineeringDataAdapter = New EngineeringDataAdapter()
 				vehicleData = doa.CreateVehicleData(vehicle)
+				retarderData = doa.CreateRetarderData(vehicle)
+				angledriveData = doa.CreateAngularGearData(vehicle, True)
+				ptoData = doa.CreatePTOTransmissionData(vehicle)
 			End If
 
 			Dim result As IList(Of ValidationResult) =
 					vehicleData.Validate(If(Cfg.DeclMode, ExecutionMode.Declaration, ExecutionMode.Engineering))
+			If result.Any() Then
+				Return _
+					New ValidationResult("Vehicle Configuration is invalid. ", result.Select(Function(r) r.ErrorMessage).ToList())
+			End If
+
+			result = retarderData.Validate(If(Cfg.DeclMode, ExecutionMode.Declaration, ExecutionMode.Engineering))
+			If result.Any() Then
+				Return _
+					New ValidationResult("Retarder Configuration is invalid. ", result.Select(Function(r) r.ErrorMessage).ToList())
+			End If
+
+			result = angledriveData.Validate(If(Cfg.DeclMode, ExecutionMode.Declaration, ExecutionMode.Engineering))
+			If result.Any() Then
+				Return _
+					New ValidationResult("AngleDrive Configuration is invalid. ", result.Select(Function(r) r.ErrorMessage).ToList())
+			End If
+
+			If Not ptoData Is Nothing Then
+				result = ptoData.Validate(If(Cfg.DeclMode, ExecutionMode.Declaration, ExecutionMode.Engineering))
+				If result.Any() Then
+					Return _
+						New ValidationResult("PTO Configuration is invalid. ", result.Select(Function(r) r.ErrorMessage).ToList())
+				End If
+			End If
 
-			If Not result.Any() Then Return ValidationResult.Success
+			Return ValidationResult.Success
 
-			Return New ValidationResult("Vehicle Configuration is invalid. ", result.Select(Function(r) r.ErrorMessage).ToList())
 		Catch ex As Exception
 			Return New ValidationResult(ex.Message)
 		End Try
@@ -164,7 +196,8 @@ Public Class Vehicle
 				Validate(If(Cfg.DeclMode, ExecutionMode.Declaration, ExecutionMode.Engineering))
 
 		If validationResults.Count > 0 Then
-			Dim messages As IEnumerable(Of String) = validationResults.Select(Function(r) r.ErrorMessage + String.Join(", ", r.MemberNames.Distinct()))
+			Dim messages As IEnumerable(Of String) =
+					validationResults.Select(Function(r) r.ErrorMessage + String.Join(", ", r.MemberNames.Distinct()))
 			MsgBox("Invalid input." + Environment.NewLine + String.Join("; ", messages), MsgBoxStyle.OkOnly,
 					"Failed to save vehicle")
 			Return False
@@ -243,6 +276,18 @@ Public Class Vehicle
 
 #Region "IInputData"
 
+	Public ReadOnly Property SourceType As DataSourceType Implements IComponentInputData.SourceType
+		Get
+			Return DataSourceType.JSONFile
+		End Get
+	End Property
+
+	Public ReadOnly Property Source As String Implements IComponentInputData.Source
+		Get
+			Return FilePath
+		End Get
+	End Property
+
 	Public ReadOnly Property SavedInDeclarationMode As Boolean Implements IComponentInputData.SavedInDeclarationMode
 		Get
 			Return Cfg.DeclMode
@@ -340,6 +385,8 @@ Public Class Vehicle
 
 	Private Function AxleWheels() As IEnumerable(Of AxleInputData)
 		Return Axles.Select(Function(axle) New AxleInputData With {
+								.SourceType = DataSourceType.JSONFile,
+								.Source = FilePath,
 								.Inertia = axle.Inertia.SI(Of KilogramSquareMeter)(),
 								.Wheels = axle.Wheels,
 								.AxleWeightShare = axle.Share,
@@ -383,5 +430,67 @@ Public Class Vehicle
 		End Get
 	End Property
 
+
+	Public ReadOnly Property Type As RetarderType Implements IRetarderInputData.Type
+		Get
+			Return RetarderType
+		End Get
+	End Property
+
+	Public ReadOnly Property IAngularGearInputData_Ratio As Double Implements IAngularGearInputData.Ratio
+		Get
+			Return AngularGearRatio
+		End Get
+	End Property
+
+	Public ReadOnly Property IAngularGearInputData_Type As AngularGearType Implements IAngularGearInputData.Type
+		Get
+			Return AngularGearType
+		End Get
+	End Property
+
+	Public ReadOnly Property Ratio As Double Implements IRetarderInputData.Ratio
+		Get
+			Return RetarderRatio
+		End Get
+	End Property
+
+	Public ReadOnly Property IAngularGearInputData_LossMap As TableData Implements IAngularGearInputData.LossMap
+		Get
+			Return VectoCSVFile.Read(AngularGearLossMapFile.FullPath)
+		End Get
+	End Property
+
+	Public ReadOnly Property LossMap As TableData Implements IRetarderInputData.LossMap
+		Get
+			Return VectoCSVFile.Read(RetarderLossMapFile.FullPath)
+		End Get
+	End Property
+
+	Public ReadOnly Property Efficiency As Double Implements IAngularGearInputData.Efficiency
+		Get
+			Return If(IsNumeric(AngularGearLossMapFile.OriginalPath), AngularGearLossMapFile.OriginalPath.ToDouble(), -1.0)
+		End Get
+	End Property
+
 #End Region
+
+	Public ReadOnly Property PTOTransmissionType As String Implements IPTOTransmissionInputData.PTOTransmissionType
+		Get
+			Return PTOType
+		End Get
+	End Property
+
+	Public ReadOnly Property IPTOTransmissionInputData_PTOCycle As TableData Implements IPTOTransmissionInputData.PTOCycle
+		Get
+			Return VectoCSVFile.Read(PTOCycle.FullPath)
+		End Get
+	End Property
+
+	Public ReadOnly Property IPTOTransmissionInputData_PTOLossMap As TableData _
+		Implements IPTOTransmissionInputData.PTOLossMap
+		Get
+			Return VectoCSVFile.Read(PTOLossMap.FullPath)
+		End Get
+	End Property
 End Class
\ No newline at end of file
diff --git a/VECTO/VECTO_Global.vb b/VECTO/VECTO_Global.vb
index 9fd843c88b..5abd346350 100644
--- a/VECTO/VECTO_Global.vb
+++ b/VECTO/VECTO_Global.vb
@@ -267,13 +267,7 @@ Module Constants
 
 
 	' ReSharper disable once ClassNeverInstantiated.Global
-	Public Class AuxiliaryKey
-		Public Const Fan As String = "FAN"
-		Public Const SteerPump As String = "STP"
-		Public Const HVAC As String = "AC"
-		Public Const ElecSys As String = "ES"
-		Public Const PneumSys As String = "PS"
-	End Class
+	
 End Module
 
 
diff --git a/VectoCommon/VectoCommon/InputData/DeclarationInputData.cs b/VectoCommon/VectoCommon/InputData/DeclarationInputData.cs
index 3b79def2f7..913b3cb088 100644
--- a/VectoCommon/VectoCommon/InputData/DeclarationInputData.cs
+++ b/VectoCommon/VectoCommon/InputData/DeclarationInputData.cs
@@ -47,6 +47,10 @@ namespace TUGraz.VectoCommon.InputData
 
 	public interface IComponentInputData
 	{
+		DataSourceType SourceType { get; }
+
+		string Source { get; }
+
 		bool SavedInDeclarationMode { get; }
 
 		string Vendor { get; }
diff --git a/VectoCommon/VectoCommon/InputData/TableData.cs b/VectoCommon/VectoCommon/InputData/TableData.cs
index 783e06acaa..218a4f67a3 100644
--- a/VectoCommon/VectoCommon/InputData/TableData.cs
+++ b/VectoCommon/VectoCommon/InputData/TableData.cs
@@ -4,12 +4,6 @@ namespace TUGraz.VectoCommon.InputData
 {
 	public class TableData : DataTable
 	{
-		public enum DataSourceType
-		{
-			Embedded,
-			CSVFile,
-		}
-
 		public TableData(string fileName)
 		{
 			SourceType = DataSourceType.CSVFile;
diff --git a/VectoCommon/VectoCommon/VectoCommon.csproj b/VectoCommon/VectoCommon/VectoCommon.csproj
index c29e1da6e8..767d0d4874 100644
--- a/VectoCommon/VectoCommon/VectoCommon.csproj
+++ b/VectoCommon/VectoCommon/VectoCommon.csproj
@@ -44,6 +44,7 @@
     <Reference Include="System.Xml" />
   </ItemGroup>
   <ItemGroup>
+    <Compile Include="InputData\DataSourceType.cs" />
     <Compile Include="InputData\TableData.cs">
       <SubType>Component</SubType>
     </Compile>
diff --git a/VectoConsole/Properties/Version.cs b/VectoConsole/Properties/Version.cs
index 70953ae2e9..ae81b564be 100644
--- a/VectoConsole/Properties/Version.cs
+++ b/VectoConsole/Properties/Version.cs
@@ -30,5 +30,5 @@
 */
 
 using System.Reflection;
-[assembly: AssemblyVersion("3.0.3.613")]
-[assembly: AssemblyFileVersion("3.0.3.613")]
+[assembly: AssemblyVersion("3.0.3.622")]
+[assembly: AssemblyFileVersion("3.0.3.622")]
diff --git a/VectoCore/VectoCore/InputData/FileIO/JSON/JSONInputData.cs b/VectoCore/VectoCore/InputData/FileIO/JSON/JSONInputData.cs
index 58acc3f130..e78c720a5d 100644
--- a/VectoCore/VectoCore/InputData/FileIO/JSON/JSONInputData.cs
+++ b/VectoCore/VectoCore/InputData/FileIO/JSON/JSONInputData.cs
@@ -50,7 +50,7 @@ namespace TUGraz.VectoCore.InputData.FileIO.JSON
 {
 	public abstract class JSONFile : LoggingObject
 	{
-		private string _basePath;
+		private readonly string _sourceFile;
 
 		protected readonly JObject Header;
 		protected readonly JObject Body;
@@ -59,7 +59,17 @@ namespace TUGraz.VectoCore.InputData.FileIO.JSON
 		{
 			Header = (JObject)data.GetEx(JsonKeys.JsonHeader);
 			Body = (JObject)data.GetEx(JsonKeys.JsonBody);
-			BasePath = filename;
+			_sourceFile = Path.GetFullPath(filename);
+		}
+
+		public DataSourceType SourceType
+		{
+			get { return DataSourceType.JSONFile; }
+		}
+
+		public string Source
+		{
+			get { return _sourceFile; }
 		}
 
 		public bool SavedInDeclarationMode
@@ -69,8 +79,7 @@ namespace TUGraz.VectoCore.InputData.FileIO.JSON
 
 		internal string BasePath
 		{
-			get { return _basePath; }
-			set { _basePath = Path.GetDirectoryName(Path.GetFullPath(value)); }
+			get { return Path.GetDirectoryName(_sourceFile); }
 		}
 
 		protected TableData ReadTableData(string filename, string tableType, bool required = true)
diff --git a/VectoCore/VectoCore/InputData/FileIO/JSON/JSONVehicleData.cs b/VectoCore/VectoCore/InputData/FileIO/JSON/JSONVehicleData.cs
index da8c9daa99..45c648a288 100644
--- a/VectoCore/VectoCore/InputData/FileIO/JSON/JSONVehicleData.cs
+++ b/VectoCore/VectoCore/InputData/FileIO/JSON/JSONVehicleData.cs
@@ -117,6 +117,8 @@ namespace TUGraz.VectoCore.InputData.FileIO.JSON
 			return
 				Body.GetEx(JsonKeys.Vehicle_AxleConfiguration).GetEx(JsonKeys.Vehicle_AxleConfiguration_Axles).Select(
 					axle => new AxleInputData {
+						SourceType = DataSourceType.JSONFile,
+						Source = Source,
 						Inertia = axle.GetEx<double>(JsonKeys.Vehicle_Axles_Inertia).SI<KilogramSquareMeter>(),
 						Wheels = axle.GetEx<string>(JsonKeys.Vehicle_Axles_Wheels),
 						TwinTyres = axle.GetEx<bool>(JsonKeys.Vehicle_Axles_TwinTyres),
diff --git a/VectoCore/VectoCore/InputData/Impl/InputData.cs b/VectoCore/VectoCore/InputData/Impl/InputData.cs
index 22c6fbf007..442266ea11 100644
--- a/VectoCore/VectoCore/InputData/Impl/InputData.cs
+++ b/VectoCore/VectoCore/InputData/Impl/InputData.cs
@@ -98,6 +98,7 @@ namespace TUGraz.VectoCore.InputData.Impl
 
 	public class AxleInputData : IAxleEngineeringInputData
 	{
+
 		[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design",
 			"CA1065:DoNotRaiseExceptionsInUnexpectedLocations")]
 		public bool SavedInDeclarationMode
@@ -105,6 +106,10 @@ namespace TUGraz.VectoCore.InputData.Impl
 			get { throw new System.NotImplementedException(); }
 		}
 
+		public DataSourceType SourceType { get; internal set; }
+
+		public string Source { get; internal set; }
+
 		public string Vendor { get; internal set; }
 
 		public string ModelName { get; internal set; }
diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/EngineeringDataAdapter.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/EngineeringDataAdapter.cs
index 908289bf36..dd1d50c27d 100644
--- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/EngineeringDataAdapter.cs
+++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/EngineeringDataAdapter.cs
@@ -302,7 +302,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter
 		}
 
 		//=================================
-		public RetarderData CreateRetarderData(IRetarderInputData retarder, IVehicleEngineeringInputData vehicle)
+		public RetarderData CreateRetarderData(IRetarderInputData retarder)
 		{
 			return SetCommonRetarderData(retarder);
 		}
diff --git a/VectoCore/VectoCore/InputData/Reader/Impl/EngineeringModeVectoRunDataFactory.cs b/VectoCore/VectoCore/InputData/Reader/Impl/EngineeringModeVectoRunDataFactory.cs
index 4ea718fb17..d83f066d71 100644
--- a/VectoCore/VectoCore/InputData/Reader/Impl/EngineeringModeVectoRunDataFactory.cs
+++ b/VectoCore/VectoCore/InputData/Reader/Impl/EngineeringModeVectoRunDataFactory.cs
@@ -83,7 +83,7 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl
 				DriverData = driver,
 				Aux = dao.CreateAuxiliaryData(InputDataProvider.AuxiliaryInputData()),
 				AdvancedAux = dao.CreateAdvancedAuxData(InputDataProvider.AuxiliaryInputData()),
-				Retarder = dao.CreateRetarderData(InputDataProvider.RetarderInputData, InputDataProvider.VehicleInputData),
+				Retarder = dao.CreateRetarderData(InputDataProvider.RetarderInputData),
 				PTO = ptoTransmissionData,
 				Cycle = DrivingCycleDataReader.ReadFromDataTable(cycle.CycleData, cycle.Name, crossWindRequired),
 				ExecutionMode = ExecutionMode.Engineering
diff --git a/VectoCore/VectoCore/Models/Declaration/AuxiliaryTypeHelper.cs b/VectoCore/VectoCore/Models/Declaration/AuxiliaryTypeHelper.cs
index c1f94c0cc4..e037090a0d 100644
--- a/VectoCore/VectoCore/Models/Declaration/AuxiliaryTypeHelper.cs
+++ b/VectoCore/VectoCore/Models/Declaration/AuxiliaryTypeHelper.cs
@@ -15,6 +15,14 @@ namespace TUGraz.VectoCore.Models.Declaration
 			{ AuxiliaryType.ElectricSystem, Constants.Auxiliaries.Names.ElectricSystem },
 		};
 
+		private static readonly Dictionary<AuxiliaryType, string> AuxToKey = new Dictionary<AuxiliaryType, string> {
+			{ AuxiliaryType.Fan, Constants.Auxiliaries.IDs.Fan },
+			{ AuxiliaryType.SteeringPump, Constants.Auxiliaries.IDs.SteeringPump },
+			{ AuxiliaryType.HVAC, Constants.Auxiliaries.IDs.HeatingVentilationAirCondition },
+			{ AuxiliaryType.PneumaticSystem, Constants.Auxiliaries.IDs.PneumaticSystem },
+			{ AuxiliaryType.ElectricSystem, Constants.Auxiliaries.IDs.ElectricSystem },
+		};
+
 		private static readonly Dictionary<string, AuxiliaryType> StrToAux = AuxToStr.ToDictionary(kv => kv.Value,
 			kv => kv.Key);
 
@@ -28,5 +36,20 @@ namespace TUGraz.VectoCore.Models.Declaration
 		{
 			return AuxToStr[t];
 		}
+
+		public static string GetAuxKey(AuxiliaryType t)
+		{
+			return AuxToKey[t];
+		}
+
+		public static string Key(this AuxiliaryType t)
+		{
+			return AuxToKey[t];
+		}
+
+		public static string Name(this AuxiliaryType t)
+		{
+			return AuxToStr[t];
+		}
 	}
 }
\ No newline at end of file
diff --git a/VectoCore/VectoCore/Properties/Version.cs b/VectoCore/VectoCore/Properties/Version.cs
index dddd78a915..8ec84a2ba2 100644
--- a/VectoCore/VectoCore/Properties/Version.cs
+++ b/VectoCore/VectoCore/Properties/Version.cs
@@ -30,5 +30,5 @@
 */
 
 using System.Reflection;
-[assembly: AssemblyVersion("3.0.90.613")]
-[assembly: AssemblyFileVersion("3.0.90.613")]
+[assembly: AssemblyVersion("3.0.90.623")]
+[assembly: AssemblyFileVersion("3.0.90.623")]
diff --git a/VectoCore/VectoCoreTest/Utils/MockEngineDataProvider.cs b/VectoCore/VectoCoreTest/Utils/MockEngineDataProvider.cs
index 8df9a84d06..c99795d2e7 100644
--- a/VectoCore/VectoCoreTest/Utils/MockEngineDataProvider.cs
+++ b/VectoCore/VectoCoreTest/Utils/MockEngineDataProvider.cs
@@ -37,6 +37,8 @@ namespace TUGraz.VectoCore.Tests.Utils
 {
 	public class MockEngineDataProvider : IEngineEngineeringInputData
 	{
+		public DataSourceType SourceType { get; set; }
+		public string Source { get; set; }
 		public bool SavedInDeclarationMode { get; set; }
 		public string Vendor { get; set; }
 		public string ModelName { get; set; }
@@ -50,7 +52,7 @@ namespace TUGraz.VectoCore.Tests.Utils
 		public double WHTCMotorway { get; set; }
 		public double WHTCRural { get; set; }
 		public double WHTCUrban { get; set; }
-		public double ColdHotBalancingFactor { get;  set; }
+		public double ColdHotBalancingFactor { get; set; }
 		public TableData FuelConsumptionMap { get; set; }
 		public TableData FullLoadCurve { get; set; }
 		public KilogramSquareMeter Inertia { get; set; }
-- 
GitLab