From e8dc2cc5fc4af392a1710c673e062b680933dc68 Mon Sep 17 00:00:00 2001
From: Markus Quaritsch <markus.quaritsch@tugraz.at>
Date: Tue, 23 Nov 2021 15:58:52 +0100
Subject: [PATCH] moving drag curve per voltage level to single drag curve for
 EM. updating GUI, input data provider, data apapter, etc.

---
 VECTO/GUI/ElectricMotorForm.Designer.vb       | 108 +++++-------------
 VECTO/GUI/ElectricMotorForm.vb                |  26 ++---
 VECTO/GUI/MainForm.Designer.vb                |  28 ++---
 VECTO/Input Files/ElectricMachine.vb          |  70 +++++-------
 VECTO/Input Files/Vehicle.vb                  |   1 +
 .../InputData/DeclarationInputData.cs         |   4 +-
 .../FileIO/JSON/JSONElectricMotor.cs          |  25 +++-
 .../FileIO/JSON/JSONInputDataFactory.cs       |   2 +
 .../VectoCore/InputData/Impl/InputData.cs     |   2 +-
 .../EngineeringDataAdapter.cs                 |   3 +-
 .../Data/ElectricMotor/ElectricMotorData.cs   |  13 +--
 .../SimulationComponent/Impl/ElectricMotor.cs |  10 +-
 .../Strategies/HybridStrategy.cs              |   2 +-
 .../OutputData/FileIO/JSONFileWriter.cs       |   6 +-
 .../FileIO/JsonReadHybridTest.cs              |  11 +-
 .../SimulationComponent/ElectricMotorTest.cs  |   2 +-
 16 files changed, 133 insertions(+), 180 deletions(-)

diff --git a/VECTO/GUI/ElectricMotorForm.Designer.vb b/VECTO/GUI/ElectricMotorForm.Designer.vb
index a978334f88..787eda5c70 100644
--- a/VECTO/GUI/ElectricMotorForm.Designer.vb
+++ b/VECTO/GUI/ElectricMotorForm.Designer.vb
@@ -60,10 +60,6 @@ Partial Class ElectricMotorForm
         Me.OpenWithToolStripMenuItem = New System.Windows.Forms.ToolStripMenuItem()
         Me.ShowInFolderToolStripMenuItem = New System.Windows.Forms.ToolStripMenuItem()
         Me.pnInertia = New System.Windows.Forms.Panel()
-        Me.tbDragTorqueHi = New System.Windows.Forms.TextBox()
-        Me.lblDragTorqueHi = New System.Windows.Forms.Label()
-        Me.btnBrowseDragCurveHi = New System.Windows.Forms.Button()
-        Me.btnDragCurveOpenHi = New System.Windows.Forms.Button()
         Me.btnEmMapOpenHi = New System.Windows.Forms.Button()
         Me.btnBrowseEmMapHi = New System.Windows.Forms.Button()
         Me.lblPowerMapHi = New System.Windows.Forms.Label()
@@ -163,20 +159,20 @@ Partial Class ElectricMotorForm
         '
         Me.ButCancel.Anchor = CType((System.Windows.Forms.AnchorStyles.Bottom Or System.Windows.Forms.AnchorStyles.Right),System.Windows.Forms.AnchorStyles)
         Me.ButCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel
-        Me.ButCancel.Location = New System.Drawing.Point(811, 574)
+        Me.ButCancel.Location = New System.Drawing.Point(839, 567)
         Me.ButCancel.Name = "ButCancel"
         Me.ButCancel.Size = New System.Drawing.Size(75, 23)
-        Me.ButCancel.TabIndex = 11
+        Me.ButCancel.TabIndex = 99
         Me.ButCancel.Text = "Cancel"
         Me.ButCancel.UseVisualStyleBackColor = true
         '
         'ButOK
         '
         Me.ButOK.Anchor = CType((System.Windows.Forms.AnchorStyles.Bottom Or System.Windows.Forms.AnchorStyles.Right),System.Windows.Forms.AnchorStyles)
-        Me.ButOK.Location = New System.Drawing.Point(730, 574)
+        Me.ButOK.Location = New System.Drawing.Point(758, 567)
         Me.ButOK.Name = "ButOK"
         Me.ButOK.Size = New System.Drawing.Size(75, 23)
-        Me.ButOK.TabIndex = 10
+        Me.ButOK.TabIndex = 98
         Me.ButOK.Text = "Save"
         Me.ButOK.UseVisualStyleBackColor = true
         '
@@ -188,7 +184,7 @@ Partial Class ElectricMotorForm
         Me.ToolStrip1.Location = New System.Drawing.Point(0, 0)
         Me.ToolStrip1.Name = "ToolStrip1"
         Me.ToolStrip1.Padding = New System.Windows.Forms.Padding(0, 0, 2, 0)
-        Me.ToolStrip1.Size = New System.Drawing.Size(898, 31)
+        Me.ToolStrip1.Size = New System.Drawing.Size(926, 31)
         Me.ToolStrip1.TabIndex = 30
         Me.ToolStrip1.Text = "ToolStrip1"
         '
@@ -265,9 +261,9 @@ Partial Class ElectricMotorForm
         '
         Me.StatusStrip1.ImageScalingSize = New System.Drawing.Size(24, 24)
         Me.StatusStrip1.Items.AddRange(New System.Windows.Forms.ToolStripItem() {Me.LbStatus})
-        Me.StatusStrip1.Location = New System.Drawing.Point(0, 599)
+        Me.StatusStrip1.Location = New System.Drawing.Point(0, 592)
         Me.StatusStrip1.Name = "StatusStrip1"
-        Me.StatusStrip1.Size = New System.Drawing.Size(898, 22)
+        Me.StatusStrip1.Size = New System.Drawing.Size(926, 22)
         Me.StatusStrip1.SizingGrip = false
         Me.StatusStrip1.TabIndex = 37
         Me.StatusStrip1.Text = "StatusStrip1"
@@ -333,44 +329,10 @@ Partial Class ElectricMotorForm
         Me.pnInertia.Size = New System.Drawing.Size(221, 30)
         Me.pnInertia.TabIndex = 1
         '
-        'tbDragTorqueHi
-        '
-        Me.tbDragTorqueHi.Location = New System.Drawing.Point(6, 103)
-        Me.tbDragTorqueHi.Name = "tbDragTorqueHi"
-        Me.tbDragTorqueHi.Size = New System.Drawing.Size(406, 20)
-        Me.tbDragTorqueHi.TabIndex = 4
-        '
-        'lblDragTorqueHi
-        '
-        Me.lblDragTorqueHi.AutoSize = true
-        Me.lblDragTorqueHi.Location = New System.Drawing.Point(6, 87)
-        Me.lblDragTorqueHi.Name = "lblDragTorqueHi"
-        Me.lblDragTorqueHi.Size = New System.Drawing.Size(98, 13)
-        Me.lblDragTorqueHi.TabIndex = 38
-        Me.lblDragTorqueHi.Text = "Drag Torque Curve"
-        '
-        'btnBrowseDragCurveHi
-        '
-        Me.btnBrowseDragCurveHi.Image = Global.TUGraz.VECTO.My.Resources.Resources.Open_icon
-        Me.btnBrowseDragCurveHi.Location = New System.Drawing.Point(420, 100)
-        Me.btnBrowseDragCurveHi.Name = "btnBrowseDragCurveHi"
-        Me.btnBrowseDragCurveHi.Size = New System.Drawing.Size(24, 24)
-        Me.btnBrowseDragCurveHi.TabIndex = 5
-        Me.btnBrowseDragCurveHi.UseVisualStyleBackColor = true
-        '
-        'btnDragCurveOpenHi
-        '
-        Me.btnDragCurveOpenHi.Image = Global.TUGraz.VECTO.My.Resources.Resources.application_export_icon_small
-        Me.btnDragCurveOpenHi.Location = New System.Drawing.Point(443, 100)
-        Me.btnDragCurveOpenHi.Name = "btnDragCurveOpenHi"
-        Me.btnDragCurveOpenHi.Size = New System.Drawing.Size(24, 24)
-        Me.btnDragCurveOpenHi.TabIndex = 6
-        Me.btnDragCurveOpenHi.UseVisualStyleBackColor = true
-        '
         'btnEmMapOpenHi
         '
         Me.btnEmMapOpenHi.Image = Global.TUGraz.VECTO.My.Resources.Resources.application_export_icon_small
-        Me.btnEmMapOpenHi.Location = New System.Drawing.Point(443, 141)
+        Me.btnEmMapOpenHi.Location = New System.Drawing.Point(443, 102)
         Me.btnEmMapOpenHi.Name = "btnEmMapOpenHi"
         Me.btnEmMapOpenHi.Size = New System.Drawing.Size(24, 24)
         Me.btnEmMapOpenHi.TabIndex = 9
@@ -379,7 +341,7 @@ Partial Class ElectricMotorForm
         'btnBrowseEmMapHi
         '
         Me.btnBrowseEmMapHi.Image = Global.TUGraz.VECTO.My.Resources.Resources.Open_icon
-        Me.btnBrowseEmMapHi.Location = New System.Drawing.Point(420, 141)
+        Me.btnBrowseEmMapHi.Location = New System.Drawing.Point(420, 102)
         Me.btnBrowseEmMapHi.Name = "btnBrowseEmMapHi"
         Me.btnBrowseEmMapHi.Size = New System.Drawing.Size(24, 24)
         Me.btnBrowseEmMapHi.TabIndex = 8
@@ -388,7 +350,7 @@ Partial Class ElectricMotorForm
         'lblPowerMapHi
         '
         Me.lblPowerMapHi.AutoSize = true
-        Me.lblPowerMapHi.Location = New System.Drawing.Point(6, 128)
+        Me.lblPowerMapHi.Location = New System.Drawing.Point(6, 89)
         Me.lblPowerMapHi.Name = "lblPowerMapHi"
         Me.lblPowerMapHi.Size = New System.Drawing.Size(163, 13)
         Me.lblPowerMapHi.TabIndex = 43
@@ -396,7 +358,7 @@ Partial Class ElectricMotorForm
         '
         'tbMapHi
         '
-        Me.tbMapHi.Location = New System.Drawing.Point(6, 144)
+        Me.tbMapHi.Location = New System.Drawing.Point(6, 105)
         Me.tbMapHi.Name = "tbMapHi"
         Me.tbMapHi.Size = New System.Drawing.Size(406, 20)
         Me.tbMapHi.TabIndex = 7
@@ -440,7 +402,7 @@ Partial Class ElectricMotorForm
         Me.lblTitle.AutoSize = true
         Me.lblTitle.BackColor = System.Drawing.Color.White
         Me.lblTitle.Font = New System.Drawing.Font("Microsoft Sans Serif", 18!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0,Byte))
-        Me.lblTitle.Location = New System.Drawing.Point(84, 34)
+        Me.lblTitle.Location = New System.Drawing.Point(115, 34)
         Me.lblTitle.Name = "lblTitle"
         Me.lblTitle.Size = New System.Drawing.Size(190, 29)
         Me.lblTitle.TabIndex = 48
@@ -672,10 +634,6 @@ Partial Class ElectricMotorForm
         Me.gbVoltageLevelHi.Controls.Add(Me.lblVoltageHiUnit)
         Me.gbVoltageLevelHi.Controls.Add(Me.tbVoltageHi)
         Me.gbVoltageLevelHi.Controls.Add(Me.lblMaxTorqueHi)
-        Me.gbVoltageLevelHi.Controls.Add(Me.tbDragTorqueHi)
-        Me.gbVoltageLevelHi.Controls.Add(Me.lblDragTorqueHi)
-        Me.gbVoltageLevelHi.Controls.Add(Me.btnBrowseDragCurveHi)
-        Me.gbVoltageLevelHi.Controls.Add(Me.btnDragCurveOpenHi)
         Me.gbVoltageLevelHi.Controls.Add(Me.tbMapHi)
         Me.gbVoltageLevelHi.Controls.Add(Me.lblPowerMapHi)
         Me.gbVoltageLevelHi.Controls.Add(Me.btnBrowseEmMapHi)
@@ -683,9 +641,9 @@ Partial Class ElectricMotorForm
         Me.gbVoltageLevelHi.Controls.Add(Me.tbMaxTorqueHi)
         Me.gbVoltageLevelHi.Controls.Add(Me.btnMaxTorqueCurveOpenHi)
         Me.gbVoltageLevelHi.Controls.Add(Me.btnBrowseMaxTorqueHi)
-        Me.gbVoltageLevelHi.Location = New System.Drawing.Point(12, 418)
+        Me.gbVoltageLevelHi.Location = New System.Drawing.Point(12, 382)
         Me.gbVoltageLevelHi.Name = "gbVoltageLevelHi"
-        Me.gbVoltageLevelHi.Size = New System.Drawing.Size(482, 170)
+        Me.gbVoltageLevelHi.Size = New System.Drawing.Size(482, 136)
         Me.gbVoltageLevelHi.TabIndex = 9
         Me.gbVoltageLevelHi.TabStop = false
         Me.gbVoltageLevelHi.Text = "Voltage Level High"
@@ -721,10 +679,6 @@ Partial Class ElectricMotorForm
         Me.gbVoltageLevelLow.Controls.Add(Me.lblVoltageLowUnit)
         Me.gbVoltageLevelLow.Controls.Add(Me.tbVoltageLow)
         Me.gbVoltageLevelLow.Controls.Add(Me.lblMaxTorqueLow)
-        Me.gbVoltageLevelLow.Controls.Add(Me.tbDragTorqueLow)
-        Me.gbVoltageLevelLow.Controls.Add(Me.lblDragTorqueLow)
-        Me.gbVoltageLevelLow.Controls.Add(Me.btnBrowseDragCurveLow)
-        Me.gbVoltageLevelLow.Controls.Add(Me.btnDragCurveOpenLow)
         Me.gbVoltageLevelLow.Controls.Add(Me.tbMapLow)
         Me.gbVoltageLevelLow.Controls.Add(Me.lblPowerMapLow)
         Me.gbVoltageLevelLow.Controls.Add(Me.btnBrowseEmMapLow)
@@ -734,7 +688,7 @@ Partial Class ElectricMotorForm
         Me.gbVoltageLevelLow.Controls.Add(Me.btnBrowseMaxTorqueLow)
         Me.gbVoltageLevelLow.Location = New System.Drawing.Point(12, 242)
         Me.gbVoltageLevelLow.Name = "gbVoltageLevelLow"
-        Me.gbVoltageLevelLow.Size = New System.Drawing.Size(482, 170)
+        Me.gbVoltageLevelLow.Size = New System.Drawing.Size(482, 134)
         Me.gbVoltageLevelLow.TabIndex = 8
         Me.gbVoltageLevelLow.TabStop = false
         Me.gbVoltageLevelLow.Text = "Voltage Level Low"
@@ -775,15 +729,15 @@ Partial Class ElectricMotorForm
         '
         'tbDragTorqueLow
         '
-        Me.tbDragTorqueLow.Location = New System.Drawing.Point(6, 103)
+        Me.tbDragTorqueLow.Location = New System.Drawing.Point(19, 543)
         Me.tbDragTorqueLow.Name = "tbDragTorqueLow"
         Me.tbDragTorqueLow.Size = New System.Drawing.Size(406, 20)
-        Me.tbDragTorqueLow.TabIndex = 4
+        Me.tbDragTorqueLow.TabIndex = 10
         '
         'lblDragTorqueLow
         '
         Me.lblDragTorqueLow.AutoSize = true
-        Me.lblDragTorqueLow.Location = New System.Drawing.Point(6, 87)
+        Me.lblDragTorqueLow.Location = New System.Drawing.Point(19, 527)
         Me.lblDragTorqueLow.Name = "lblDragTorqueLow"
         Me.lblDragTorqueLow.Size = New System.Drawing.Size(98, 13)
         Me.lblDragTorqueLow.TabIndex = 38
@@ -792,24 +746,24 @@ Partial Class ElectricMotorForm
         'btnBrowseDragCurveLow
         '
         Me.btnBrowseDragCurveLow.Image = Global.TUGraz.VECTO.My.Resources.Resources.Open_icon
-        Me.btnBrowseDragCurveLow.Location = New System.Drawing.Point(420, 100)
+        Me.btnBrowseDragCurveLow.Location = New System.Drawing.Point(433, 540)
         Me.btnBrowseDragCurveLow.Name = "btnBrowseDragCurveLow"
         Me.btnBrowseDragCurveLow.Size = New System.Drawing.Size(24, 24)
-        Me.btnBrowseDragCurveLow.TabIndex = 5
+        Me.btnBrowseDragCurveLow.TabIndex = 11
         Me.btnBrowseDragCurveLow.UseVisualStyleBackColor = true
         '
         'btnDragCurveOpenLow
         '
         Me.btnDragCurveOpenLow.Image = Global.TUGraz.VECTO.My.Resources.Resources.application_export_icon_small
-        Me.btnDragCurveOpenLow.Location = New System.Drawing.Point(443, 100)
+        Me.btnDragCurveOpenLow.Location = New System.Drawing.Point(456, 540)
         Me.btnDragCurveOpenLow.Name = "btnDragCurveOpenLow"
         Me.btnDragCurveOpenLow.Size = New System.Drawing.Size(24, 24)
-        Me.btnDragCurveOpenLow.TabIndex = 6
+        Me.btnDragCurveOpenLow.TabIndex = 12
         Me.btnDragCurveOpenLow.UseVisualStyleBackColor = true
         '
         'tbMapLow
         '
-        Me.tbMapLow.Location = New System.Drawing.Point(6, 144)
+        Me.tbMapLow.Location = New System.Drawing.Point(6, 104)
         Me.tbMapLow.Name = "tbMapLow"
         Me.tbMapLow.Size = New System.Drawing.Size(406, 20)
         Me.tbMapLow.TabIndex = 7
@@ -817,7 +771,7 @@ Partial Class ElectricMotorForm
         'lblPowerMapLow
         '
         Me.lblPowerMapLow.AutoSize = true
-        Me.lblPowerMapLow.Location = New System.Drawing.Point(6, 128)
+        Me.lblPowerMapLow.Location = New System.Drawing.Point(6, 88)
         Me.lblPowerMapLow.Name = "lblPowerMapLow"
         Me.lblPowerMapLow.Size = New System.Drawing.Size(163, 13)
         Me.lblPowerMapLow.TabIndex = 43
@@ -826,7 +780,7 @@ Partial Class ElectricMotorForm
         'btnBrowseEmMapLow
         '
         Me.btnBrowseEmMapLow.Image = Global.TUGraz.VECTO.My.Resources.Resources.Open_icon
-        Me.btnBrowseEmMapLow.Location = New System.Drawing.Point(420, 141)
+        Me.btnBrowseEmMapLow.Location = New System.Drawing.Point(420, 101)
         Me.btnBrowseEmMapLow.Name = "btnBrowseEmMapLow"
         Me.btnBrowseEmMapLow.Size = New System.Drawing.Size(24, 24)
         Me.btnBrowseEmMapLow.TabIndex = 8
@@ -835,7 +789,7 @@ Partial Class ElectricMotorForm
         'btnEmMapOpenLow
         '
         Me.btnEmMapOpenLow.Image = Global.TUGraz.VECTO.My.Resources.Resources.application_export_icon_small
-        Me.btnEmMapOpenLow.Location = New System.Drawing.Point(443, 141)
+        Me.btnEmMapOpenLow.Location = New System.Drawing.Point(443, 101)
         Me.btnEmMapOpenLow.Name = "btnEmMapOpenLow"
         Me.btnEmMapOpenLow.Size = New System.Drawing.Size(24, 24)
         Me.btnEmMapOpenLow.TabIndex = 9
@@ -872,12 +826,16 @@ Partial Class ElectricMotorForm
         Me.AutoScaleDimensions = New System.Drawing.SizeF(6!, 13!)
         Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
         Me.CancelButton = Me.ButCancel
-        Me.ClientSize = New System.Drawing.Size(898, 621)
+        Me.ClientSize = New System.Drawing.Size(926, 614)
         Me.Controls.Add(Me.gbVoltageLevelLow)
         Me.Controls.Add(Me.gbVoltageLevelHi)
         Me.Controls.Add(Me.Panel6)
+        Me.Controls.Add(Me.tbDragTorqueLow)
+        Me.Controls.Add(Me.lblDragTorqueLow)
         Me.Controls.Add(Me.pnOverloadTq)
+        Me.Controls.Add(Me.btnBrowseDragCurveLow)
         Me.Controls.Add(Me.Panel4)
+        Me.Controls.Add(Me.btnDragCurveOpenLow)
         Me.Controls.Add(Me.Panel3)
         Me.Controls.Add(Me.Panel2)
         Me.Controls.Add(Me.Panel1)
@@ -950,10 +908,6 @@ End Sub
     Friend WithEvents OpenWithToolStripMenuItem As ToolStripMenuItem
     Friend WithEvents ShowInFolderToolStripMenuItem As ToolStripMenuItem
     Friend WithEvents pnInertia As Panel
-    Friend WithEvents tbDragTorqueHi As TextBox
-    Friend WithEvents lblDragTorqueHi As Label
-    Friend WithEvents btnBrowseDragCurveHi As Button
-    Friend WithEvents btnDragCurveOpenHi As Button
     Friend WithEvents btnEmMapOpenHi As Button
     Friend WithEvents btnBrowseEmMapHi As Button
     Friend WithEvents lblPowerMapHi As Label
diff --git a/VECTO/GUI/ElectricMotorForm.vb b/VECTO/GUI/ElectricMotorForm.vb
index e2e982126f..b1b93a450f 100644
--- a/VECTO/GUI/ElectricMotorForm.vb
+++ b/VECTO/GUI/ElectricMotorForm.vb
@@ -133,7 +133,6 @@ Public Class ElectricMotorForm
         tbMakeModel.Text = ""
         tbInertia.Text = ""
         tbMapHi.Text = ""
-        tbDragTorqueHi.Text = ""
         tbMaxTorqueHi.Text = ""
 
         DeclInit()
@@ -180,16 +179,17 @@ Public Class ElectricMotorForm
         tbRatedSpeed.Text = engine.ContinuousTorqueSpeed.AsRPM.ToGUIFormat()
         tbOverloadRecoveryFactor.Text = engine.OverloadRecoveryFactor.ToGUIFormat()
 
+        tbDragTorqueLow.Text = GetRelativePath(engine.DragCurve.Source, basePath)
+
         Dim voltageLevelHigh As IElectricMotorVoltageLevel = engine.VoltageLevels.MaxBy(function(level) level.VoltageLevel.Value())
 
-        tbDragTorqueHi.Text = GetRelativePath(voltageLevelHigh.DragCurve.Source, basePath)
         tbMaxTorqueHi.Text = GetRelativePath(voltageLevelHigh.FullLoadCurve.Source, basePath)
         tbMapHi.Text = GetRelativePath(voltageLevelHigh.EfficiencyMap.Source, basePath)
         tbVoltageHi.Text = voltageLevelHigh.VoltageLevel.Value().ToGUIFormat()
 
         Dim voltageLevelLow As IElectricMotorVoltageLevel = engine.VoltageLevels.MinBy(function(level) level.VoltageLevel.Value())
 
-        tbDragTorqueLow.Text = GetRelativePath(voltageLevelLow.DragCurve.Source, basePath)
+        
         tbMaxTorqueLow.Text = GetRelativePath(voltageLevelLow.FullLoadCurve.Source, basePath)
         tbMapLow.Text = GetRelativePath(voltageLevelLow.EfficiencyMap.Source, basePath)
         tbVoltageLow.Text = voltageLevelLow.VoltageLevel.Value().ToGUIFormat()
@@ -236,12 +236,11 @@ Public Class ElectricMotorForm
         em.OverloadRecoveryFactor = tbOverloadRecoveryFactor.Text.ToDouble(0)
 
         em.PathMaxTorqueLow = tbMaxTorqueLow.Text
-        em.PathDragLow = tbDragTorqueLow.Text
+        em.PathDrag = tbDragTorqueLow.Text
         em.PathMapLow = tbMapLow.Text
         em.VoltageLevelLow = tbVoltageLow.Text.ToDouble(0)
 
         em.PathMaxTorqueHi = tbMaxTorqueHi.Text
-        em.PathDragHi = tbDragTorqueHi.Text
         em.PathMapHi = tbMapHi.Text
         em.VoltageLevelHigh = tbVoltageHi.Text.ToDouble(0)
 
@@ -304,7 +303,7 @@ Public Class ElectricMotorForm
     End Sub
 
     Private Sub DataChangedUpdatePic(sender As Object, e As EventArgs) _
-        Handles tbDragTorqueHi.TextChanged, tbMaxTorqueLow.TextChanged, tbMaxTorqueHi.TextChanged, tbDragTorqueLow.TextChanged
+        Handles  tbMaxTorqueLow.TextChanged, tbMaxTorqueHi.TextChanged, tbDragTorqueLow.TextChanged
         UpdatePic()
         Change()
     End Sub
@@ -335,7 +334,7 @@ Public Class ElectricMotorForm
 
         Try
             Dim fldFile As String =
-                    If(Not String.IsNullOrWhiteSpace(_emFile), Path.Combine(Path.GetDirectoryName(_emFile), tbMaxTorqueHi.Text), tbDragTorqueHi.Text)
+                    If(Not String.IsNullOrWhiteSpace(_emFile), Path.Combine(Path.GetDirectoryName(_emFile), tbMaxTorqueHi.Text), tbDragTorqueLow.Text)
             If File.Exists(fldFile) Then _
                 fullLoadCurve = ElectricFullLoadCurveReader.Create(VectoCSVFile.Read(fldFile), 1)
         Catch ex As Exception
@@ -350,7 +349,7 @@ Public Class ElectricMotorForm
 
         Try
             Dim dragFile As String =
-                    If(Not String.IsNullOrWhiteSpace(_emFile), Path.Combine(Path.GetDirectoryName(_emFile), tbDragTorqueHi.Text), tbMapHi.Text)
+                    If(Not String.IsNullOrWhiteSpace(_emFile), Path.Combine(Path.GetDirectoryName(_emFile), tbDragTorqueLow.Text), tbMapHi.Text)
             If File.Exists(dragFile) Then dragCurve = ElectricMotorDragCurveReader.Create(VectoCSVFile.Read(dragFile), 1)
         Catch ex As Exception
         End Try
@@ -371,7 +370,7 @@ Public Class ElectricMotorForm
             series.ChartType = SeriesChartType.FastLine
             series.BorderWidth = 2
             series.Color = Color.DarkBlue
-            series.Name = "Max drive torque (" & tbDragTorqueHi.Text & ")"
+            series.Name = "Max drive torque (" & tbDragTorqueLow.Text & ")"
             chart.Series.Add(series)
 
             series = New Series
@@ -495,9 +494,6 @@ Public Class ElectricMotorForm
         CreateNewFile(tbMaxTorqueHi)
     End Sub
 
-    Private Sub btnDragCurveOpen_Click(sender As Object, e As EventArgs) Handles btnDragCurveOpenHi.Click
-        CreateNewFile(tbDragTorqueHi)
-    End Sub
 
     Private Sub btnEmMapOpen_Click(sender As Object, e As EventArgs) Handles btnEmMapOpenHi.Click
         CreateNewFile(tbMapHi)
@@ -519,11 +515,7 @@ Public Class ElectricMotorForm
         SelectFile(ElectricMachineMaxTorqueFileBrowser, tbMaxTorqueHi)
     End Sub
 
-    Private Sub btnBrowseDragCurve_Click(sender As Object, e As EventArgs) Handles btnBrowseDragCurveHi.Click
-        SelectFile(ElectricMachineDragTorqueFileBrowser, tbDragTorqueHi)
-    End Sub
-
-    Private Sub btnBrowseEmMap_Click(sender As Object, e As EventArgs) Handles btnBrowseEmMapHi.Click
+   Private Sub btnBrowseEmMap_Click(sender As Object, e As EventArgs) Handles btnBrowseEmMapHi.Click
         SelectFile(ElectricMachineEfficiencyMapFileBrowser, tbMapHi)
     End Sub
 
diff --git a/VECTO/GUI/MainForm.Designer.vb b/VECTO/GUI/MainForm.Designer.vb
index 12282beb58..883e66e0d8 100644
--- a/VECTO/GUI/MainForm.Designer.vb
+++ b/VECTO/GUI/MainForm.Designer.vb
@@ -443,9 +443,9 @@ Partial Class MainForm
         Me.Label2.AutoSize = true
         Me.Label2.Location = New System.Drawing.Point(7, 19)
         Me.Label2.Name = "Label2"
-        Me.Label2.Size = New System.Drawing.Size(84, 13)
+        Me.Label2.Size = New System.Drawing.Size(61, 13)
         Me.Label2.TabIndex = 1
-        Me.Label2.Text = "Output Directory"
+        Me.Label2.Text = "Min Speed:"
         '
         'GroupBox4
         '
@@ -730,80 +730,80 @@ Partial Class MainForm
         '
         Me.GENEditorToolStripMenuItem1.Image = Global.TUGraz.VECTO.My.Resources.Resources.F_VECTO
         Me.GENEditorToolStripMenuItem1.Name = "GENEditorToolStripMenuItem1"
-        Me.GENEditorToolStripMenuItem1.Size = New System.Drawing.Size(262, 30)
+        Me.GENEditorToolStripMenuItem1.Size = New System.Drawing.Size(254, 22)
         Me.GENEditorToolStripMenuItem1.Text = "Job Editor - Conventional Vehicle"
         '
         'JobEditorParallelHybridVehicleToolStripMenuItem
         '
         Me.JobEditorParallelHybridVehicleToolStripMenuItem.Image = Global.TUGraz.VECTO.My.Resources.Resources.F_VECTO
         Me.JobEditorParallelHybridVehicleToolStripMenuItem.Name = "JobEditorParallelHybridVehicleToolStripMenuItem"
-        Me.JobEditorParallelHybridVehicleToolStripMenuItem.Size = New System.Drawing.Size(262, 30)
+        Me.JobEditorParallelHybridVehicleToolStripMenuItem.Size = New System.Drawing.Size(254, 22)
         Me.JobEditorParallelHybridVehicleToolStripMenuItem.Text = "Job Editor - Parallel Hybrid Vehicle"
         '
         'JobEditorBatteryElectricVehicleToolStripMenuItem
         '
         Me.JobEditorBatteryElectricVehicleToolStripMenuItem.Image = Global.TUGraz.VECTO.My.Resources.Resources.F_VECTO
         Me.JobEditorBatteryElectricVehicleToolStripMenuItem.Name = "JobEditorBatteryElectricVehicleToolStripMenuItem"
-        Me.JobEditorBatteryElectricVehicleToolStripMenuItem.Size = New System.Drawing.Size(262, 30)
+        Me.JobEditorBatteryElectricVehicleToolStripMenuItem.Size = New System.Drawing.Size(254, 22)
         Me.JobEditorBatteryElectricVehicleToolStripMenuItem.Text = "JobEditor - Battery Electric Vehicle"
         '
         'JobEditorEngineOnlyModeToolStripMenuItem
         '
         Me.JobEditorEngineOnlyModeToolStripMenuItem.Image = Global.TUGraz.VECTO.My.Resources.Resources.F_VECTO
         Me.JobEditorEngineOnlyModeToolStripMenuItem.Name = "JobEditorEngineOnlyModeToolStripMenuItem"
-        Me.JobEditorEngineOnlyModeToolStripMenuItem.Size = New System.Drawing.Size(262, 30)
+        Me.JobEditorEngineOnlyModeToolStripMenuItem.Size = New System.Drawing.Size(254, 22)
         Me.JobEditorEngineOnlyModeToolStripMenuItem.Text = "Job Editor - Engine Only Mode"
         '
         'EPTPJobEditorToolStripMenuItem
         '
         Me.EPTPJobEditorToolStripMenuItem.Image = Global.TUGraz.VECTO.My.Resources.Resources.F_VECTO
         Me.EPTPJobEditorToolStripMenuItem.Name = "EPTPJobEditorToolStripMenuItem"
-        Me.EPTPJobEditorToolStripMenuItem.Size = New System.Drawing.Size(262, 30)
+        Me.EPTPJobEditorToolStripMenuItem.Size = New System.Drawing.Size(254, 22)
         Me.EPTPJobEditorToolStripMenuItem.Text = "VTP Job Editor"
         '
         'VEHEditorToolStripMenuItem
         '
         Me.VEHEditorToolStripMenuItem.Image = Global.TUGraz.VECTO.My.Resources.Resources.F_VEH
         Me.VEHEditorToolStripMenuItem.Name = "VEHEditorToolStripMenuItem"
-        Me.VEHEditorToolStripMenuItem.Size = New System.Drawing.Size(262, 30)
+        Me.VEHEditorToolStripMenuItem.Size = New System.Drawing.Size(254, 22)
         Me.VEHEditorToolStripMenuItem.Text = "Vehicle Editor"
         '
         'EngineEditorToolStripMenuItem
         '
         Me.EngineEditorToolStripMenuItem.Image = Global.TUGraz.VECTO.My.Resources.Resources.F_ENG
         Me.EngineEditorToolStripMenuItem.Name = "EngineEditorToolStripMenuItem"
-        Me.EngineEditorToolStripMenuItem.Size = New System.Drawing.Size(262, 30)
+        Me.EngineEditorToolStripMenuItem.Size = New System.Drawing.Size(254, 22)
         Me.EngineEditorToolStripMenuItem.Text = "Engine Editor"
         '
         'GearboxEditorToolStripMenuItem
         '
         Me.GearboxEditorToolStripMenuItem.Image = Global.TUGraz.VECTO.My.Resources.Resources.F_GBX
         Me.GearboxEditorToolStripMenuItem.Name = "GearboxEditorToolStripMenuItem"
-        Me.GearboxEditorToolStripMenuItem.Size = New System.Drawing.Size(262, 30)
+        Me.GearboxEditorToolStripMenuItem.Size = New System.Drawing.Size(254, 22)
         Me.GearboxEditorToolStripMenuItem.Text = "Gearbox Editor"
         '
         'GraphToolStripMenuItem
         '
         Me.GraphToolStripMenuItem.Image = Global.TUGraz.VECTO.My.Resources.Resources.F_Graph
         Me.GraphToolStripMenuItem.Name = "GraphToolStripMenuItem"
-        Me.GraphToolStripMenuItem.Size = New System.Drawing.Size(262, 30)
+        Me.GraphToolStripMenuItem.Size = New System.Drawing.Size(254, 22)
         Me.GraphToolStripMenuItem.Text = "Graph"
         '
         'ToolStripSeparator6
         '
         Me.ToolStripSeparator6.Name = "ToolStripSeparator6"
-        Me.ToolStripSeparator6.Size = New System.Drawing.Size(259, 6)
+        Me.ToolStripSeparator6.Size = New System.Drawing.Size(251, 6)
         '
         'OpenLogToolStripMenuItem
         '
         Me.OpenLogToolStripMenuItem.Name = "OpenLogToolStripMenuItem"
-        Me.OpenLogToolStripMenuItem.Size = New System.Drawing.Size(262, 30)
+        Me.OpenLogToolStripMenuItem.Size = New System.Drawing.Size(254, 22)
         Me.OpenLogToolStripMenuItem.Text = "Open Log"
         '
         'SettingsToolStripMenuItem
         '
         Me.SettingsToolStripMenuItem.Name = "SettingsToolStripMenuItem"
-        Me.SettingsToolStripMenuItem.Size = New System.Drawing.Size(262, 30)
+        Me.SettingsToolStripMenuItem.Size = New System.Drawing.Size(254, 22)
         Me.SettingsToolStripMenuItem.Text = "Settings"
         '
         'ToolStripDrDnBtInfo
diff --git a/VECTO/Input Files/ElectricMachine.vb b/VECTO/Input Files/ElectricMachine.vb
index 72740e0b4b..6c0136cbb9 100644
--- a/VECTO/Input Files/ElectricMachine.vb	
+++ b/VECTO/Input Files/ElectricMachine.vb	
@@ -17,12 +17,11 @@ Public Class ElectricMachine
 
     public VoltageLevelLow As Double
     Private ReadOnly _fullLoadCurvePathLow As SubPath
-    Private ReadOnly _dragCurvePathLow As SubPath
+    Private ReadOnly _dragCurvePath As SubPath
     Private ReadOnly _efficiencyMapLow As SubPath
 
     public VoltageLevelHigh as Double
     Private ReadOnly _fullLoadCurvePathHi As SubPath
-    Private ReadOnly _dragCurvePathHi As SubPath
     Private ReadOnly _efficiencyMapHi As SubPath
 
     ''' <summary>
@@ -54,12 +53,11 @@ Public Class ElectricMachine
         _filePath = ""
 
         _fullLoadCurvePathLow = New SubPath
-        _dragCurvePathLow = New SubPath()
+        _dragCurvePath = New SubPath()
         _efficiencyMapLow = New SubPath()
 
         _fullLoadCurvePathHi = New SubPath
-        _dragCurvePathHi = New SubPath()
-        _efficiencyMapHi = New SubPath()
+       _efficiencyMapHi = New SubPath()
 
         SetDefault()
     End Sub
@@ -213,17 +211,17 @@ Public Class ElectricMachine
             Return VectoCSVFile.Read(_fullLoadCurvePathLow.FullPath)
         End Get
     End Property
-    protected ReadOnly Property DragCurvLow As TableData 
-        Get
-            If Not File.Exists(_dragCurvePathLow.FullPath) Then _
-                Throw New VectoException("Drag Curve is missing or invalid")
-            Return VectoCSVFile.Read(_dragCurvePathLow.FullPath)
-        End Get
-    End Property
+    'protected ReadOnly Property DragCurvLow As TableData 
+    '    Get
+    '        If Not File.Exists(_dragCurvePathLow.FullPath) Then _
+    '            Throw New VectoException("Drag Curve is missing or invalid")
+    '        Return VectoCSVFile.Read(_dragCurvePathLow.FullPath)
+    '    End Get
+    'End Property
     protected ReadOnly Property EfficiencyMapLow As TableData
         Get
             If Not File.Exists(_efficiencyMapLow.FullPath) Then _
-                Throw New VectoException("Drag Curve is missing or invalid")
+                Throw New VectoException("EfficiencyMap is missing or invalid")
             Return VectoCSVFile.Read(_efficiencyMapLow.FullPath)
         End Get
     End Property
@@ -234,17 +232,17 @@ Public Class ElectricMachine
             Return VectoCSVFile.Read(_fullLoadCurvePathHi.FullPath)
         End Get
                     End Property
-    protected ReadOnly Property DragCurvHi As TableData 
-        Get
-            If Not File.Exists(_dragCurvePathHi.FullPath) Then _
-                Throw New VectoException("Drag Curve is missing or invalid")
-            Return VectoCSVFile.Read(_dragCurvePathHi.FullPath)
-        End Get
-    End Property
+    'protected ReadOnly Property DragCurvHi As TableData 
+    '    Get
+    '        If Not File.Exists(_dragCurvePathHi.FullPath) Then _
+    '            Throw New VectoException("Drag Curve is missing or invalid")
+    '        Return VectoCSVFile.Read(_dragCurvePathHi.FullPath)
+    '    End Get
+    'End Property
     protected ReadOnly Property EfficiencyMapHi As TableData
         Get
             If Not File.Exists(_efficiencyMapHi.FullPath) Then _
-                Throw New VectoException("Drag Curve is missing or invalid")
+                Throw New VectoException("EfficiencyMap is missing or invalid")
             Return VectoCSVFile.Read(_efficiencyMapHi.FullPath)
         End Get
     End Property
@@ -255,17 +253,23 @@ Public Class ElectricMachine
                 New ElectricMotorVoltageLevel() With {
                     .VoltageLevel = VoltageLevelLow.SI(of Volt),
                     .EfficiencyMap = EfficiencyMapLow,
-                    .DragCurve = DragCurvLow,
                     .FullLoadCurve = FullLoadCurveLow},
                 New ElectricMotorVoltageLevel()  With {
                     .VoltageLevel = VoltageLevelHigh.SI(of Volt),
                     .EfficiencyMap = EfficiencyMapHi,
-                    .DragCurve = DragCurvHi,
                     .FullLoadCurve = FullLoadCurveHi}
                 }
     End Get
     End Property
 
+    Public ReadOnly Property DragCurve As TableData Implements IElectricMotorDeclarationInputData.DragCurve
+    Get
+            If Not File.Exists(_dragCurvePath.FullPath) Then _
+                Throw New VectoException("Drag Curve is missing or invalid")
+            Return VectoCSVFile.Read(_dragCurvePath.FullPath)
+        End Get
+    end Property
+
     Public ReadOnly Property Inertia As KilogramSquareMeter Implements IElectricMotorDeclarationInputData.Inertia
         Get
             Return MotorInertia.SI(Of KilogramSquareMeter)
@@ -317,16 +321,16 @@ Public Class ElectricMachine
         End Set
     End Property
 
-    Public Property PathDragLow(Optional ByVal original As Boolean = False) As String
+    Public Property PathDrag(Optional ByVal original As Boolean = False) As String
         Get
             If original Then
-                Return _dragCurvePathLow.OriginalPath
+                Return _dragCurvePath.OriginalPath
             Else
-                Return _dragCurvePathLow.FullPath
+                Return _dragCurvePath.FullPath
             End If
         End Get
         Set(ByVal value As String)
-            _dragCurvePathLow.Init(_myPath, value)
+            _dragCurvePath.Init(_myPath, value)
         End Set
     End Property
 
@@ -356,18 +360,6 @@ Public Class ElectricMachine
         End Set
     End Property
 
-    Public Property PathDragHi(Optional ByVal original As Boolean = False) As String
-        Get
-            If original Then
-                Return _dragCurvePathHi.OriginalPath
-            Else
-                Return _dragCurvePathHi.FullPath
-            End If
-        End Get
-        Set(ByVal value As String)
-            _dragCurvePathHi.Init(_myPath, value)
-        End Set
-    End Property
 
     Public Property PathMapHi(Optional ByVal original As Boolean = False) As String
         Get
diff --git a/VECTO/Input Files/Vehicle.vb b/VECTO/Input Files/Vehicle.vb
index 5aca52896b..0a2ea94fe7 100644
--- a/VECTO/Input Files/Vehicle.vb	
+++ b/VECTO/Input Files/Vehicle.vb	
@@ -1043,6 +1043,7 @@ Public Class ElectricMachineWrapper
 	Public ReadOnly Property DigestValue As DigestData Implements IComponentInputData.DigestValue
 
     Public ReadOnly Property VoltageLevels As IList(Of IElectricMotorVoltageLevel) Implements IElectricMotorDeclarationInputData.VoltageLevels
+    Public ReadOnly Property DragCurve As TableData Implements IElectricMotorDeclarationInputData.DragCurve
     Public ReadOnly Property Inertia As KilogramSquareMeter Implements IElectricMotorDeclarationInputData.Inertia
 	Public ReadOnly Property OverloadTime As Second Implements IElectricMotorDeclarationInputData.OverloadTime
 	Public ReadOnly Property ContinuousTorqueSpeed As PerSecond Implements IElectricMotorDeclarationInputData.ContinuousTorqueSpeed
diff --git a/VectoCommon/VectoCommon/InputData/DeclarationInputData.cs b/VectoCommon/VectoCommon/InputData/DeclarationInputData.cs
index d8d748873f..f1f03f28f8 100644
--- a/VectoCommon/VectoCommon/InputData/DeclarationInputData.cs
+++ b/VectoCommon/VectoCommon/InputData/DeclarationInputData.cs
@@ -713,6 +713,8 @@ namespace TUGraz.VectoCommon.InputData
 	{
 		IList<IElectricMotorVoltageLevel> VoltageLevels { get; }
 
+		TableData DragCurve { get; }
+
 		KilogramSquareMeter Inertia { get; }
 
 		Second OverloadTime { get; }
@@ -734,8 +736,6 @@ namespace TUGraz.VectoCommon.InputData
 
 		TableData FullLoadCurve { get; }
 
-		TableData DragCurve { get; }
-
 		TableData EfficiencyMap { get; }
 	}
 
diff --git a/VectoCore/VectoCore/InputData/FileIO/JSON/JSONElectricMotor.cs b/VectoCore/VectoCore/InputData/FileIO/JSON/JSONElectricMotor.cs
index 2e537cda6e..111a8cc108 100644
--- a/VectoCore/VectoCore/InputData/FileIO/JSON/JSONElectricMotor.cs
+++ b/VectoCore/VectoCore/InputData/FileIO/JSON/JSONElectricMotor.cs
@@ -1,5 +1,6 @@
 using System;
 using System.Collections.Generic;
+using System.Configuration;
 using System.Linq;
 using Newtonsoft.Json.Linq;
 using TUGraz.VectoCommon.InputData;
@@ -7,10 +8,19 @@ using TUGraz.VectoCommon.Models;
 using TUGraz.VectoCommon.Utils;
 using TUGraz.VectoCore.Configuration;
 using TUGraz.VectoCore.InputData.Impl;
+using TUGraz.VectoCore.Utils;
 
 namespace TUGraz.VectoCore.InputData.FileIO.JSON 
 {
 
+	public class JSONElectricMotorV4 : JSONElectricMotorV3
+	{
+		public JSONElectricMotorV4(JObject data, string filename, bool tolerateMissing = false) : base(data, filename, tolerateMissing) { }
+
+		public override TableData DragCurve => ReadTableData(Body.GetEx<string>("DragCurve"), "ElectricMotor DragCurve");
+
+	}
+
 	public class JSONElectricMotorV3 : JSONElectricMotorV2
 	{
 		public JSONElectricMotorV3(JObject data, string filename, bool tolerateMissing = false) : base(data, filename, tolerateMissing) { }
@@ -22,11 +32,14 @@ namespace TUGraz.VectoCore.InputData.FileIO.JSON
 			return Body["VoltageLevels"].Select(entry => new ElectricMotorVoltageLevel() {
 				VoltageLevel = entry.GetEx<double>("Voltage").SI<Volt>(),
 				EfficiencyMap = ReadTableData(entry.GetEx<string>("EfficiencyMap"), "ElectricMotor Map"),
-				DragCurve = ReadTableData(entry.GetEx<string>("DragCurve"), "ElectricMotor DragCurve"),
+				//DragCurve = ReadTableData(entry.GetEx<string>("DragCurve"), "ElectricMotor DragCurve"),
 				FullLoadCurve = ReadTableData(entry.GetEx<string>("FullLoadCurve"), "ElectricMotor FullLoadCurve")
 			}).Cast<IElectricMotorVoltageLevel>().ToList();
 		}
 
+		public override TableData DragCurve=> Body["VoltageLevels"].Select(x => ReadTableData(x.GetEx<string>("DragCurve"), "ElectricMotor DragCurve")).First();
+		
+
 		#endregion
 	}
 
@@ -64,13 +77,13 @@ namespace TUGraz.VectoCore.InputData.FileIO.JSON
 				new ElectricMotorVoltageLevel() {
 					VoltageLevel = 0.SI<Volt>(),
 					EfficiencyMap = ReadTableData(Body.GetEx<string>("EfficiencyMap"), "ElectricMotor Map"),
-					DragCurve = ReadTableData(Body.GetEx<string>("DragCurve"), "ElectricMotor DragCurve"),
+					//DragCurve = ReadTableData(Body.GetEx<string>("DragCurve"), "ElectricMotor DragCurve"),
 					FullLoadCurve = ReadTableData(Body.GetEx<string>("FullLoadCurve"), "ElectricMotor FullLoadCurve")
 				},
 				new ElectricMotorVoltageLevel() {
 					VoltageLevel = 1e9.SI<Volt>(),
 					EfficiencyMap = ReadTableData(Body.GetEx<string>("EfficiencyMap"), "ElectricMotor Map"),
-					DragCurve = ReadTableData(Body.GetEx<string>("DragCurve"), "ElectricMotor DragCurve"),
+					//DragCurve = ReadTableData(Body.GetEx<string>("DragCurve"), "ElectricMotor DragCurve"),
 					FullLoadCurve = ReadTableData(Body.GetEx<string>("FullLoadCurve"), "ElectricMotor FullLoadCurve")
 				},
 			};
@@ -78,15 +91,15 @@ namespace TUGraz.VectoCore.InputData.FileIO.JSON
 
 		public DigestData DigestValue => null;
 
-		public virtual TableData FullLoadCurve => ReadTableData(Body.GetEx<string>("FullLoadCurve"), "ElectricMotor FullLoadCurve");
+		//public virtual TableData FullLoadCurve => ReadTableData(Body.GetEx<string>("FullLoadCurve"), "ElectricMotor FullLoadCurve");
 
 		public virtual TableData DragCurve => ReadTableData(Body.GetEx<string>("DragCurve"), "ElectricMotor DragCurve");
 
-		public virtual TableData EfficiencyMap => ReadTableData(Body.GetEx<string>("EfficiencyMap"), "ElectricMotor Map");
+		//public virtual TableData EfficiencyMap => ReadTableData(Body.GetEx<string>("EfficiencyMap"), "ElectricMotor Map");
 
 		public virtual KilogramSquareMeter Inertia => Body.GetEx<double>("Inertia").SI<KilogramSquareMeter>();
 
-		public virtual Joule OverloadBuffer => Body.GetValueOrDefault<double>("ThermalOverloadBuffer")?.SI(Unit.SI.Mega.Joule).Cast<Joule>() ?? 1e18.SI<Joule>();
+		//public virtual Joule OverloadBuffer => Body.GetValueOrDefault<double>("ThermalOverloadBuffer")?.SI(Unit.SI.Mega.Joule).Cast<Joule>() ?? 1e18.SI<Joule>();
 
 		public virtual double OverloadRecoveryFactor => Body.GetValueOrDefault<double>("ThermalOverloadRecoveryFactor") ?? 0.9;
 
diff --git a/VectoCore/VectoCore/InputData/FileIO/JSON/JSONInputDataFactory.cs b/VectoCore/VectoCore/InputData/FileIO/JSON/JSONInputDataFactory.cs
index 4e9c56a7f2..08573d70a7 100644
--- a/VectoCore/VectoCore/InputData/FileIO/JSON/JSONInputDataFactory.cs
+++ b/VectoCore/VectoCore/InputData/FileIO/JSON/JSONInputDataFactory.cs
@@ -214,6 +214,8 @@ namespace TUGraz.VectoCore.InputData.FileIO.JSON
 					return new JSONElectricMotorV2(json, filename, tolerateMissing);
 				case 3:
 					return new JSONElectricMotorV3(json, filename, tolerateMissing);
+				case 4:
+					return new JSONElectricMotorV4(json, filename, tolerateMissing);
 				default:
 					throw new VectoException("ElectricMotor-File: Unsupported FileVersion. Got {0}", version);
 			}
diff --git a/VectoCore/VectoCore/InputData/Impl/InputData.cs b/VectoCore/VectoCore/InputData/Impl/InputData.cs
index 2468d3d0bd..386b4c6ff0 100644
--- a/VectoCore/VectoCore/InputData/Impl/InputData.cs
+++ b/VectoCore/VectoCore/InputData/Impl/InputData.cs
@@ -299,7 +299,7 @@ namespace TUGraz.VectoCore.InputData.Impl
 
 		public Volt VoltageLevel { get; internal set; }
 		public TableData FullLoadCurve { get; internal set; }
-		public TableData DragCurve { get; internal set; }
+		//public TableData DragCurve { get; internal set; }
 		public TableData EfficiencyMap { get; internal set; }
 
 		#endregion
diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/EngineeringDataAdapter.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/EngineeringDataAdapter.cs
index 8b613d79b1..e803c63d34 100644
--- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/EngineeringDataAdapter.cs
+++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/EngineeringDataAdapter.cs
@@ -889,7 +889,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter
 				voltageLevels.Add(new ElectricMotorVoltageLevelData() {
 					Voltage = entry.VoltageLevel,
 					FullLoadCurve = fullLoadCurveCombined,
-					DragCurve = ElectricMotorDragCurveReader.Create(entry.DragCurve, count),
+					//DragCurve = ElectricMotorDragCurveReader.Create(entry.DragCurve, count),
 					EfficiencyMap = ElectricMotorMapReader.Create(entry.EfficiencyMap, count),
 				});
 			}
@@ -901,6 +901,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter
 
 			return new ElectricMotorData() {
 				EfficiencyData = new VoltageLevelData() { VoltageLevels = voltageLevels},
+				DragCurve = ElectricMotorDragCurveReader.Create(motorData.DragCurve, count),
 				Inertia = motorData.Inertia,
 				ContinuousTorque = motorData.ContinuousTorque * count,
 				ContinuousTorqueSpeed = motorData.ContinuousTorqueSpeed,
diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Data/ElectricMotor/ElectricMotorData.cs b/VectoCore/VectoCore/Models/SimulationComponent/Data/ElectricMotor/ElectricMotorData.cs
index 67ec469a5d..91e17a240c 100644
--- a/VectoCore/VectoCore/Models/SimulationComponent/Data/ElectricMotor/ElectricMotorData.cs
+++ b/VectoCore/VectoCore/Models/SimulationComponent/Data/ElectricMotor/ElectricMotorData.cs
@@ -41,6 +41,9 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data
 
 		[ValidateObject]
 		public VoltageLevelData EfficiencyData { get; internal set; }
+
+		[ValidateObject]
+		public DragCurve DragCurve { get; internal set; }
 	}
 
 	public class VoltageLevelData
@@ -54,12 +57,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data
 			_maxSpeed ?? (_maxSpeed = VoltageLevels
 				.Min(v => VectoMath.Min(v.EfficiencyMap.MaxSpeed, v.FullLoadCurve.MaxSpeed)));
 
-		public NewtonMeter LookupDragTorque(Volt voltage, PerSecond avgSpeed) {
-			var (a, b) = GetSection(voltage);
-			return VectoMath.Interpolate(a.Voltage, b.Voltage, 
-				a.DragCurve.Lookup(avgSpeed), b.DragCurve.Lookup(avgSpeed), voltage);
-		}
-
+		
 		public NewtonMeter EfficiencyMapLookupTorque(Volt voltage, Watt electricPower, PerSecond avgSpeed, NewtonMeter maxEmTorque)
 		{
 			if (avgSpeed.IsGreaterOrEqual(MaxSpeed)) {
@@ -157,9 +155,6 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data
 		[ValidateObject]
 		public ElectricMotorFullLoadCurve FullLoadCurve { get; internal set; }
 
-		[ValidateObject]
-		public DragCurve DragCurve { get; internal set; }
-
 		[ValidateObject]
 		public EfficiencyMap EfficiencyMap { get; internal set; }
 
diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/ElectricMotor.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/ElectricMotor.cs
index 8a5429fb40..c9c30009eb 100644
--- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/ElectricMotor.cs
+++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/ElectricMotor.cs
@@ -77,7 +77,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 
 		public Watt DragPower(Volt volt, PerSecond electricMotorSpeed)
 		{
-			return ModelData.EfficiencyData.LookupDragTorque(volt, electricMotorSpeed) * electricMotorSpeed;
+			return ModelData.DragCurve.Lookup(electricMotorSpeed) * electricMotorSpeed;
 		}
 
 		public Watt MaxPowerDrive(Volt volt, PerSecond electricMotorSpeed)
@@ -260,7 +260,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 				// no electric system or EM shall be off - apply drag only
 				// if EM is off, calculate EM drag torque 'forward' to be applied on drivetrain
 				// add inertia, drag is positive
-				emTorque =  ModelData.EfficiencyData.LookupDragTorque(voltage, avgEmSpeed) + inertiaTorqueEm;
+				emTorque =  ModelData.DragCurve.Lookup(avgEmSpeed) + inertiaTorqueEm;
 				emTorqueDt = ConvertEmTorqueToDrivetrain(avgEmSpeed, emTorque);
 				emOff = true;
 			}
@@ -274,7 +274,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 				emTorqueMap = null;
 			}
 
-			var electricPower = emOff || (ModelData.EfficiencyData.LookupDragTorque(voltage, avgEmSpeed) + inertiaTorqueEm).IsEqual(emTorque, 1e-3.SI<NewtonMeter>())
+			var electricPower = emOff || (ModelData.DragCurve.Lookup(avgEmSpeed) + inertiaTorqueEm).IsEqual(emTorque, 1e-3.SI<NewtonMeter>())
 				? 0.SI<Watt>()
 				: ModelData.EfficiencyData
 					.LookupElectricPower(voltage, avgEmSpeed, emTorqueMap, DataBus.ExecutionMode != ExecutionMode.Declaration)
@@ -409,7 +409,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 			}
 
 			var maxBatRecuperationTorque = maxBatPower.IsEqual(0, 1e-3)
-				? ModelData.EfficiencyData.LookupDragTorque(volt, avgSpeed)
+				? ModelData.DragCurve.Lookup(avgSpeed)
 				: ModelData.EfficiencyData.EfficiencyMapLookupTorque(volt, maxBatPower, avgSpeed, maxEmTorque);
 			var maxTorqueRecuperate = VectoMath.Min(maxEmTorque, maxBatRecuperationTorque);
 			if (maxTorqueRecuperate < 0) {
@@ -437,7 +437,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 			}
 
 			var maxBatDriveTorque = maxBatPower.IsEqual(0, 1e-3)
-				? ModelData.EfficiencyData.LookupDragTorque(volt, avgSpeed)
+				? ModelData.DragCurve.Lookup(avgSpeed)
 				: ModelData.EfficiencyData.EfficiencyMapLookupTorque(volt, maxBatPower, avgSpeed, maxEmTorque);
 			
 			var maxTorqueDrive = VectoMath.Max(maxEmTorque, maxBatDriveTorque);
diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Strategies/HybridStrategy.cs b/VectoCore/VectoCore/Models/SimulationComponent/Strategies/HybridStrategy.cs
index 9264e039e3..0683ea1db8 100644
--- a/VectoCore/VectoCore/Models/SimulationComponent/Strategies/HybridStrategy.cs
+++ b/VectoCore/VectoCore/Models/SimulationComponent/Strategies/HybridStrategy.cs
@@ -1871,7 +1871,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Strategies
 
 					var emDriveTorque = DataBus.ElectricMotorInfo(emPos).GetTorqueForElectricPower(voltage, emDrivePower, firstResponse.ElectricMotor.AngularVelocity, dt);
 					var emDragTorque = ModelData.ElectricMachinesData.First(x => x.Item1 == emPos).Item2
-												.EfficiencyData.LookupDragTorque(voltage, firstResponse.ElectricMotor.AngularVelocity);
+												.DragCurve.Lookup(firstResponse.ElectricMotor.AngularVelocity);
 					if (emDriveTorque != null &&
 						emDriveTorque.IsBetween(
 							firstResponse.ElectricMotor.MaxRecuperationTorque, firstResponse.ElectricMotor.MaxDriveTorque) &&
diff --git a/VectoCore/VectoCore/OutputData/FileIO/JSONFileWriter.cs b/VectoCore/VectoCore/OutputData/FileIO/JSONFileWriter.cs
index ff256764d9..e8eea0d5a7 100644
--- a/VectoCore/VectoCore/OutputData/FileIO/JSONFileWriter.cs
+++ b/VectoCore/VectoCore/OutputData/FileIO/JSONFileWriter.cs
@@ -11,6 +11,7 @@ using TUGraz.VectoCommon.OutputData;
 using TUGraz.VectoCore;
 using TUGraz.VectoCore.Models.Declaration;
 using TUGraz.VectoCommon.Utils;
+using TUGraz.VectoCore.Models.SimulationComponent.Data;
 
 public class JSONFileWriter : IOutputFileWriter
 {
@@ -34,7 +35,7 @@ public class JSONFileWriter : IOutputFileWriter
 
 	private const int VectoVTPJobFormatVersion = 4;
 
-	private const int ElectricMotorFormatVersion = 3;
+	private const int ElectricMotorFormatVersion = 4;
 
 	private const int REESSFormatVersion = 1;
 
@@ -89,13 +90,14 @@ public class JSONFileWriter : IOutputFileWriter
 		body.Add("OverloadTorqueSpeed", electricMachine.OverloadTestSpeed.AsRPM);
 		body.Add("OverloadTime", electricMachine.OverloadTime.Value());
 		body.Add("ThermalOverloadRecoveryFactor", electricMachine.OverloadRecoveryFactor);
+		body.Add("DragCurve", GetRelativePath(electricMachine.DragCurve.Source, Path.GetDirectoryName(filename)));
 
 		var vlevels = new List<Dictionary<string, object>>();
 		foreach (var entry in electricMachine.VoltageLevels) {
 			var vlevel = new Dictionary<string, object>();
 			vlevel.Add("Voltage", entry.VoltageLevel.Value());
 			vlevel.Add("FullLoadCurve", GetRelativePath(entry.FullLoadCurve.Source, Path.GetDirectoryName(filename)));
-			vlevel.Add("DragCurve", GetRelativePath(entry.DragCurve.Source, Path.GetDirectoryName(filename)));
+			//vlevel.Add("DragCurve", GetRelativePath(entry.DragCurve.Source, Path.GetDirectoryName(filename)));
 			vlevel.Add("EfficiencyMap", GetRelativePath(entry.EfficiencyMap.Source, Path.GetDirectoryName(filename)));
 			vlevels.Add(vlevel);
         }
diff --git a/VectoCore/VectoCoreTest/FileIO/JsonReadHybridTest.cs b/VectoCore/VectoCoreTest/FileIO/JsonReadHybridTest.cs
index ce7a39972d..fff7330b5f 100644
--- a/VectoCore/VectoCoreTest/FileIO/JsonReadHybridTest.cs
+++ b/VectoCore/VectoCoreTest/FileIO/JsonReadHybridTest.cs
@@ -140,6 +140,12 @@ namespace TUGraz.VectoCore.Tests.FileIO
 			var daa = new EngineeringDataAdapter();
 			var emData = daa.CreateElectricMachines(inputProvider.ElectricMachines, null).First().Item2;
 
+
+			Assert.AreEqual(26, emData.DragCurve.Lookup(2000.RPMtoRad()).Value());
+			Assert.AreEqual(33, emData.DragCurve.Lookup(2000.RPMtoRad()).Value());
+			Assert.AreEqual(29.5, emData.DragCurve.Lookup(2000.RPMtoRad()).Value());
+			Assert.AreEqual(31.25, emData.DragCurve.Lookup(2000.RPMtoRad()).Value());
+
 			var em = emData.EfficiencyData;
 
 			Assert.AreEqual(-334.2300, em.FullLoadDriveTorque(400.SI<Volt>(), 2000.RPMtoRad()).Value());
@@ -152,11 +158,6 @@ namespace TUGraz.VectoCore.Tests.FileIO
 			Assert.AreEqual(370.153, em.FullGenerationTorque(500.SI<Volt>(), 2000.RPMtoRad()).Value());
 			Assert.AreEqual(388.1145, em.FullGenerationTorque(550.SI<Volt>(), 2000.RPMtoRad()).Value());
 
-			Assert.AreEqual(26, em.LookupDragTorque(400.SI<Volt>(), 2000.RPMtoRad()).Value());
-			Assert.AreEqual(33, em.LookupDragTorque(600.SI<Volt>(), 2000.RPMtoRad()).Value());
-			Assert.AreEqual(29.5, em.LookupDragTorque(500.SI<Volt>(), 2000.RPMtoRad()).Value());
-			Assert.AreEqual(31.25, em.LookupDragTorque(550.SI<Volt>(), 2000.RPMtoRad()).Value());
-
 			Assert.AreEqual(-101.760, em.EfficiencyMapLookupTorque(400.SI<Volt>(), -25000.SI<Watt>(), 2000.RPMtoRad(), -300.SI<NewtonMeter>()).Value(), 1e-3);
             Assert.AreEqual(-115.1818, em.EfficiencyMapLookupTorque(600.SI<Volt>(), -25000.SI<Watt>(), 2000.RPMtoRad(), -300.SI<NewtonMeter>()).Value(), 1e-3);
             Assert.AreEqual(14.5383, em.EfficiencyMapLookupTorque(500.SI<Volt>(), -25000.SI<Watt>(), 2000.RPMtoRad(), -300.SI<NewtonMeter>()).Value(), 1e-3);
diff --git a/VectoCore/VectoCoreTest/Models/SimulationComponent/ElectricMotorTest.cs b/VectoCore/VectoCoreTest/Models/SimulationComponent/ElectricMotorTest.cs
index f8861e6e38..fce37835be 100644
--- a/VectoCore/VectoCoreTest/Models/SimulationComponent/ElectricMotorTest.cs
+++ b/VectoCore/VectoCoreTest/Models/SimulationComponent/ElectricMotorTest.cs
@@ -276,7 +276,7 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponent
 			var response = motor.Request(absTime, dt, torque.SI<NewtonMeter>(), speed.RPMtoRad());
 
 			Assert.IsInstanceOf<ResponseSuccess>(response);
-			var dragTorque = data.First().Item2.EfficiencyData.VoltageLevels.First().DragCurve.Lookup(speed.RPMtoRad());
+			var dragTorque = data.First().Item2.DragCurve.Lookup(speed.RPMtoRad());
 			var enginePower = speed.RPMtoRad() * (torque.SI<NewtonMeter>() + dragTorque);
 			var motorMechPower = dragTorque * speed.RPMtoRad();
 			Assert.AreEqual(enginePower.Value(), response.Engine.PowerRequest.Value(), 1e-6);
-- 
GitLab