diff --git a/VECTO/File Browser/FB_Global.vb b/VECTO/File Browser/FB_Global.vb
index 741f01d03da42e89a5eb177d6e1825092bb29990..9129d13dedb69b184f758d65db941a86ea227f32 100644
--- a/VECTO/File Browser/FB_Global.vb	
+++ b/VECTO/File Browser/FB_Global.vb	
@@ -36,6 +36,7 @@ Public Module FB_Global
 
 	Public fbGBS As cFileBrowser
 	Public fbTLM As cFileBrowser
+	Public fbPTOLM As cFileBrowser
 	Public fbRLM As cFileBrowser
 	Public fbTCC As cFileBrowser
 	Public fbCDx As cFileBrowser
diff --git a/VECTO/GUI/F_MAINForm.vb b/VECTO/GUI/F_MAINForm.vb
index dc963b9631f8f8951fea0cb4dbe1e7645306e7ec..58ae37bcb61988891203d9b5f2965e3b1469989f 100644
--- a/VECTO/GUI/F_MAINForm.vb
+++ b/VECTO/GUI/F_MAINForm.vb
@@ -136,6 +136,7 @@ Public Class F_MAINForm
 		fbGBS = New cFileBrowser("vgbs")
 		fbRLM = New cFileBrowser("vrlm")
 		fbTLM = New cFileBrowser("vtlm")
+		fbPTOLM = New cFileBrowser("vptol")
 		fbTCC = New cFileBrowser("vtcc")
 		fbCDx = New cFileBrowser("vcdx")
 		fbDfVelocityDrop = New cFileBrowser("DfVelocityDrop")
@@ -160,6 +161,7 @@ Public Class F_MAINForm
 		fbGBS.Extensions = New String() {"vgbs"}
 		fbRLM.Extensions = New String() {"vrlm"}
 		fbTLM.Extensions = New String() {"vtlm"}
+		fbPTOLM.Extensions = New String() {"vptol"}
 		fbTCC.Extensions = New String() {"vtcc"}
 		fbCDx.Extensions = New String() {"vcdv", "vcdb"}
 
@@ -181,6 +183,7 @@ Public Class F_MAINForm
 		fbGBS.Close()
 		fbRLM.Close()
 		fbTLM.Close()
+		fbPTOLM.Close()
 		fbTCC.Close()
 		fbCDx.Close()
 		fbVMOD.Close()
diff --git a/VECTO/GUI/F_VEH.Designer.vb b/VECTO/GUI/F_VEH.Designer.vb
index c7ee84b1f602f55958607854f168ff7ea9ec3a33..bfd1a78fafa873285d6ea00f7460549291a65c86 100644
--- a/VECTO/GUI/F_VEH.Designer.vb
+++ b/VECTO/GUI/F_VEH.Designer.vb
@@ -109,10 +109,11 @@ Partial Class F_VEH
 		Me.ShowInFolderToolStripMenuItem = New System.Windows.Forms.ToolStripMenuItem()
 		Me.PnAll = New System.Windows.Forms.Panel()
 		Me.gbPTO = New System.Windows.Forms.GroupBox()
+		Me.pnPTO = New System.Windows.Forms.Panel()
 		Me.btPTOLossMapBrowse = New System.Windows.Forms.Button()
-		Me.cbPTOType = New System.Windows.Forms.ComboBox()
-		Me.tbPTOLossMap = New System.Windows.Forms.TextBox()
 		Me.Label7 = New System.Windows.Forms.Label()
+		Me.tbPTOLossMap = New System.Windows.Forms.TextBox()
+		Me.cbPTOType = New System.Windows.Forms.ComboBox()
 		Me.GroupBox3 = New System.Windows.Forms.GroupBox()
 		Me.GroupBox2 = New System.Windows.Forms.GroupBox()
 		Me.pnAngularGearFields = New System.Windows.Forms.Panel()
@@ -141,6 +142,7 @@ Partial Class F_VEH
 		Me.CmOpenFile.SuspendLayout()
 		Me.PnAll.SuspendLayout()
 		Me.gbPTO.SuspendLayout()
+		Me.pnPTO.SuspendLayout()
 		Me.GroupBox3.SuspendLayout()
 		Me.GroupBox2.SuspendLayout()
 		Me.pnAngularGearFields.SuspendLayout()
@@ -822,10 +824,8 @@ Partial Class F_VEH
 		'
 		'gbPTO
 		'
-		Me.gbPTO.Controls.Add(Me.btPTOLossMapBrowse)
+		Me.gbPTO.Controls.Add(Me.pnPTO)
 		Me.gbPTO.Controls.Add(Me.cbPTOType)
-		Me.gbPTO.Controls.Add(Me.tbPTOLossMap)
-		Me.gbPTO.Controls.Add(Me.Label7)
 		Me.gbPTO.Location = New System.Drawing.Point(6, 412)
 		Me.gbPTO.Name = "gbPTO"
 		Me.gbPTO.Size = New System.Drawing.Size(564, 86)
@@ -833,44 +833,54 @@ Partial Class F_VEH
 		Me.gbPTO.TabStop = False
 		Me.gbPTO.Text = "PTO Transmission"
 		'
+		'pnPTO
+		'
+		Me.pnPTO.Controls.Add(Me.btPTOLossMapBrowse)
+		Me.pnPTO.Controls.Add(Me.Label7)
+		Me.pnPTO.Controls.Add(Me.tbPTOLossMap)
+		Me.pnPTO.Dock = System.Windows.Forms.DockStyle.Bottom
+		Me.pnPTO.Location = New System.Drawing.Point(3, 42)
+		Me.pnPTO.Name = "pnPTO"
+		Me.pnPTO.Size = New System.Drawing.Size(558, 41)
+		Me.pnPTO.TabIndex = 4
+		'
 		'btPTOLossMapBrowse
 		'
 		Me.btPTOLossMapBrowse.Anchor = CType((System.Windows.Forms.AnchorStyles.Bottom Or System.Windows.Forms.AnchorStyles.Left), System.Windows.Forms.AnchorStyles)
 		Me.btPTOLossMapBrowse.Image = Global.VECTO.My.Resources.Resources.Open_icon
-		Me.btPTOLossMapBrowse.Location = New System.Drawing.Point(532, 55)
+		Me.btPTOLossMapBrowse.Location = New System.Drawing.Point(529, 15)
 		Me.btPTOLossMapBrowse.Name = "btPTOLossMapBrowse"
 		Me.btPTOLossMapBrowse.Size = New System.Drawing.Size(24, 24)
 		Me.btPTOLossMapBrowse.TabIndex = 14
 		Me.btPTOLossMapBrowse.UseVisualStyleBackColor = True
 		'
-		'cbPTOType
+		'Label7
 		'
-		Me.cbPTOType.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList
-		Me.cbPTOType.FormattingEnabled = True
-		Me.cbPTOType.Items.AddRange(New Object() {"None", "only the drive shaft of the PTO - shift claw, synchronizer, Schieberad", "only the drive shaft of the PTO - multi-disc clutch", "only the drive shaft of the PTO - multi-disc clutch, oil pump", "drive shaft and/or up to 2 gear wheels - shift claw, synchronizer, Schieberad", "drive shaft and/or up to 2 gear wheels - multi-disc clutch", "drive shaft and/or up to 2 gear wheels - multi-disc clutch, oil pump", "drive shaft and/or more than 2 gear wheels - shift claw, synchronizer, Schieberad" & _
-				"", "drive shaft and/or more than 2 gear wheels - multi-disc clutch", "drive shaft and/or more than 2 gear wheels - multi-disc clutch, oil pump"})
-		Me.cbPTOType.Location = New System.Drawing.Point(6, 19)
-		Me.cbPTOType.Name = "cbPTOType"
-		Me.cbPTOType.Size = New System.Drawing.Size(550, 21)
-		Me.cbPTOType.TabIndex = 0
+		Me.Label7.Anchor = CType((System.Windows.Forms.AnchorStyles.Bottom Or System.Windows.Forms.AnchorStyles.Left), System.Windows.Forms.AnchorStyles)
+		Me.Label7.Location = New System.Drawing.Point(3, -1)
+		Me.Label7.Name = "Label7"
+		Me.Label7.Size = New System.Drawing.Size(201, 16)
+		Me.Label7.TabIndex = 15
+		Me.Label7.Text = "PTO Consumer Loss Map (.vptol)"
+		Me.Label7.TextAlign = System.Drawing.ContentAlignment.BottomLeft
 		'
 		'tbPTOLossMap
 		'
 		Me.tbPTOLossMap.Anchor = CType((System.Windows.Forms.AnchorStyles.Bottom Or System.Windows.Forms.AnchorStyles.Left), System.Windows.Forms.AnchorStyles)
-		Me.tbPTOLossMap.Location = New System.Drawing.Point(9, 58)
+		Me.tbPTOLossMap.Location = New System.Drawing.Point(6, 18)
 		Me.tbPTOLossMap.Name = "tbPTOLossMap"
 		Me.tbPTOLossMap.Size = New System.Drawing.Size(523, 20)
 		Me.tbPTOLossMap.TabIndex = 13
+		Me.ToolTip1.SetToolTip(Me.tbPTOLossMap, "PTO Consumer Loss Map")
 		'
-		'Label7
+		'cbPTOType
 		'
-		Me.Label7.Anchor = CType((System.Windows.Forms.AnchorStyles.Bottom Or System.Windows.Forms.AnchorStyles.Left), System.Windows.Forms.AnchorStyles)
-		Me.Label7.Location = New System.Drawing.Point(6, 41)
-		Me.Label7.Name = "Label7"
-		Me.Label7.Size = New System.Drawing.Size(201, 16)
-		Me.Label7.TabIndex = 15
-		Me.Label7.Text = "PTO Loss Map"
-		Me.Label7.TextAlign = System.Drawing.ContentAlignment.BottomLeft
+		Me.cbPTOType.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList
+		Me.cbPTOType.Location = New System.Drawing.Point(6, 17)
+		Me.cbPTOType.Name = "cbPTOType"
+		Me.cbPTOType.Size = New System.Drawing.Size(550, 21)
+		Me.cbPTOType.TabIndex = 0
+		Me.ToolTip1.SetToolTip(Me.cbPTOType, "Transmission type to the PTO consumer")
 		'
 		'GroupBox3
 		'
@@ -1040,7 +1050,8 @@ Partial Class F_VEH
 		Me.CmOpenFile.ResumeLayout(False)
 		Me.PnAll.ResumeLayout(False)
 		Me.gbPTO.ResumeLayout(False)
-		Me.gbPTO.PerformLayout()
+		Me.pnPTO.ResumeLayout(False)
+		Me.pnPTO.PerformLayout()
 		Me.GroupBox3.ResumeLayout(False)
 		Me.GroupBox2.ResumeLayout(False)
 		Me.pnAngularGearFields.ResumeLayout(False)
@@ -1142,4 +1153,5 @@ Partial Class F_VEH
 	Friend WithEvents gbPTO As System.Windows.Forms.GroupBox
 	Friend WithEvents btPTOLossMapBrowse As System.Windows.Forms.Button
 	Friend WithEvents cbPTOType As System.Windows.Forms.ComboBox
+	Friend WithEvents pnPTO As System.Windows.Forms.Panel
 End Class
diff --git a/VECTO/GUI/F_VEH.resx b/VECTO/GUI/F_VEH.resx
index 2b54623060b4e67c5930e84c93822b2442ebd8b8..8208af3f02197b9fe447fda8f3a8340fb6499578 100644
--- a/VECTO/GUI/F_VEH.resx
+++ b/VECTO/GUI/F_VEH.resx
@@ -130,7 +130,7 @@
     <value>376, 21</value>
   </metadata>
   <metadata name="$this.TrayHeight" type="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
-    <value>57</value>
+    <value>77</value>
   </metadata>
   <assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
   <data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
diff --git a/VECTO/GUI/F_VEH.vb b/VECTO/GUI/F_VEH.vb
index 54eee8866ba17bd8fc6b9649eef44861cc203137..80fac163db50966fa8adfbe303e83f959f93f10d 100644
--- a/VECTO/GUI/F_VEH.vb
+++ b/VECTO/GUI/F_VEH.vb
@@ -1,758 +1,784 @@
-' Copyright 2014 European Union.
-' Licensed under the EUPL (the 'Licence');
-'
-' * You may not use this work except in compliance with the Licence.
-' * You may obtain a copy of the Licence at: http://ec.europa.eu/idabc/eupl
-' * Unless required by applicable law or agreed to in writing,
-'   software distributed under the Licence is distributed on an "AS IS" basis,
-'   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
-
-Imports System.IO
-Imports System.Text.RegularExpressions
-Imports TUGraz.VectoCommon.Models
-
-''' <summary>
-''' Vehicle Editor.
-''' </summary>
-Public Class F_VEH
-	Private _axlDlog As F_VEH_Axle
-	Private _hdVclass As String
-	Private _vehFile As String
-	Private _changed As Boolean = False
-	Private _cmFiles As String()
-
-	Public AutoSendTo As Boolean = False
-	Public JobDir As String = ""
-
-	'Close - Check for unsaved changes
-	Private Sub F_VEH_FormClosing(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing
-		If e.CloseReason <> CloseReason.ApplicationExitCall And e.CloseReason <> CloseReason.WindowsShutDown Then
-			e.Cancel = ChangeCheckCancel()
-		End If
-	End Sub
-
-	'Initialise form
-	Private Sub F05_VEH_Load(sender As Object, e As EventArgs) Handles MyBase.Load
-		TbLoadingMax.Text = "-"
-		PnLoad.Enabled = Not Cfg.DeclMode
-		ButAxlAdd.Enabled = Not Cfg.DeclMode
-		ButAxlRem.Enabled = Not Cfg.DeclMode
-		CbCdMode.Enabled = Not Cfg.DeclMode
-		PnWheelDiam.Enabled = Not Cfg.DeclMode
-
-		_axlDlog = New F_VEH_Axle
-
-		_changed = False
-
-		NewVehicle()
-	End Sub
-
-	'Set HDVclasss
-	Private Sub SetHdVclass()
-		Dim vehC = CType(CbCat.SelectedIndex, tVehCat)
-		Dim axlC = CType(CbAxleConfig.SelectedIndex, tAxleConf)
-		Dim maxMass = CSng(fTextboxToNumString(TbMassMass.Text))
-
-		Dim s0 As cSegmentTableEntry = Declaration.SegmentTable.SetRef(vehC, axlC, maxMass)
-		_hdVclass = "-"
-		If Not s0 Is Nothing Then
-			_hdVclass = s0.HDVclass
-		End If
-
-		TbHDVclass.Text = _hdVclass
-		PicVehicle.Image = Image.FromFile(cDeclaration.ConvPicPath(_hdVclass, False))
-	End Sub
-
-
-	'Set generic values for Declaration mode
-	Private Sub DeclInit()
-		If Not Cfg.DeclMode Then Exit Sub
-
-		Dim vehC = CType(CbCat.SelectedIndex, tVehCat)
-		Dim axlC = CType(CbAxleConfig.SelectedIndex, tAxleConf)
-		Dim maxMass = CSng(fTextboxToNumString(TbMassMass.Text))
-		Dim s0 = Declaration.SegmentTable.SetRef(vehC, axlC, maxMass)
-
-		If Not s0 Is Nothing Then
-			_hdVclass = s0.HDVclass
-			Dim axleCount As Short = s0.AxleShares(s0.Missions(0)).Count
-			Dim i0 = LvRRC.Items.Count
-
-			If axleCount > i0 Then
-				For i = 1 To axleCount - LvRRC.Items.Count
-					Dim lvi = New ListViewItem
-					lvi.SubItems(0).Text = (i + i0).ToString
-					lvi.SubItems.Add("-")
-					lvi.SubItems.Add("no")
-					lvi.SubItems.Add("")
-					lvi.SubItems.Add("")
-					lvi.SubItems.Add("-")
-					lvi.SubItems.Add("-")
-					LvRRC.Items.Add(lvi)
-				Next
-
-			ElseIf axleCount < LvRRC.Items.Count Then
-				For i = axleCount To LvRRC.Items.Count - 1
-					LvRRC.Items.RemoveAt(LvRRC.Items.Count - 1)
-				Next
-			End If
-
-			PnAll.Enabled = True
-
-		Else
-			PnAll.Enabled = False
-			_hdVclass = "-"
-		End If
-
-		TbMassExtra.Text = "-"
-		TbLoad.Text = "-"
-		CbCdMode.SelectedIndex = CType(tCdMode.CdOfVdecl, Integer)
-		TbCdFile.Text = ""
-
-		Dim rdyn As Single
-		rdyn = -1
-
-		If rdyn < 0 Then
-			TBrdyn.Text = "-"
-		Else
-			TBrdyn.Text = rdyn
-		End If
-	End Sub
-
-
-#Region "Toolbar"
-
-	'New
-	Private Sub ToolStripBtNew_Click(sender As Object, e As EventArgs) Handles ToolStripBtNew.Click
-		NewVehicle()
-	End Sub
-
-	'Open
-	Private Sub ToolStripBtOpen_Click(sender As Object, e As EventArgs) Handles ToolStripBtOpen.Click
-		If fbVEH.OpenDialog(_vehFile) Then OpenVehicle(fbVEH.Files(0))
-	End Sub
-
-	'Save
-	Private Sub ToolStripBtSave_Click(sender As Object, e As EventArgs) Handles ToolStripBtSave.Click
-		SaveOrSaveAs(False)
-	End Sub
-
-	'Save As
-	Private Sub ToolStripBtSaveAs_Click(sender As Object, e As EventArgs) Handles ToolStripBtSaveAs.Click
-		SaveOrSaveAs(True)
-	End Sub
-
-	'Send to VECTO Editor
-	Private Sub ToolStripBtSendTo_Click(sender As Object, e As EventArgs) Handles ToolStripBtSendTo.Click
-
-		If ChangeCheckCancel() Then Exit Sub
-
-		If _vehFile = "" Then
-			If MsgBox("Save file now?", MsgBoxStyle.YesNo) = MsgBoxResult.Yes Then
-				If Not SaveOrSaveAs(True) Then Exit Sub
-			Else
-				Exit Sub
-			End If
-		End If
-
-
-		If Not F_VECTO.Visible Then
-			JobDir = ""
-			F_VECTO.Show()
-			F_VECTO.VECTOnew()
-		Else
-			F_VECTO.WindowState = FormWindowState.Normal
-		End If
-
-		F_VECTO.TbVEH.Text = fFileWoDir(_vehFile, JobDir)
-	End Sub
-
-	'Help
-	Private Sub ToolStripButton1_Click(sender As Object, e As EventArgs) Handles ToolStripButton1.Click
-		If File.Exists(MyAppPath & "User Manual\help.html") Then
-			Dim registryString = My.Computer.Registry.ClassesRoot.OpenSubKey("\http\shell\open\command\").GetValue("").ToString
-			Dim defaultBrowserPath = Regex.Match(registryString, "(\"".*?\"")").Captures(0).ToString
-			Process.Start(defaultBrowserPath, String.Format("""{0}{1}""", MyAppPath, "User Manual\help.html#vehicle-editor"))
-		Else
-			MsgBox("User Manual not found!", MsgBoxStyle.Critical)
-		End If
-	End Sub
-
-#End Region
-
-	'Save and Close
-	Private Sub ButOK_Click(sender As Object, e As EventArgs) Handles ButOK.Click
-		If SaveOrSaveAs(False) Then Close()
-	End Sub
-
-	'Cancel
-	Private Sub ButCancel_Click(sender As Object, e As EventArgs) Handles ButCancel.Click
-		Close()
-	End Sub
-
-	'Save or Save As function = true if file is saved
-	Private Function SaveOrSaveAs(saveAs As Boolean) As Boolean
-		If _vehFile = "" Or saveAs Then
-			If fbVEH.SaveDialog(_vehFile) Then
-				_vehFile = fbVEH.Files(0)
-			Else
-				Return False
-			End If
-		End If
-		Return SaveVehicle(_vehFile)
-	End Function
-
-	'New VEH
-	Private Sub NewVehicle()
-		If ChangeCheckCancel() Then Exit Sub
-
-		TbMass.Text = ""
-		TbLoad.Text = ""
-		TBrdyn.Text = ""
-		TBcdA.Text = ""
-
-		CbCdMode.SelectedIndex = 0
-		TbCdFile.Text = ""
-
-		CbRtType.SelectedIndex = 0
-		TbRtRatio.Text = ""
-		TbRtPath.Text = ""
-
-		CbRtType.SelectedIndex = 0
-		TbRtRatio.Text = ""
-		TbRtPath.Text = ""
-
-		CbCat.SelectedIndex = 0
-
-		LvRRC.Items.Clear()
-
-		TbMassMass.Text = ""
-		TbMassExtra.Text = ""
-		CbAxleConfig.SelectedIndex = 0
-
-		DeclInit()
-
-		_vehFile = ""
-		Text = "VEH Editor"
-		LbStatus.Text = ""
-
-		_changed = False
-	End Sub
-
-	'Open VEH
-	Sub OpenVehicle(file As String)
-		Dim inertia As Single
-
-		If ChangeCheckCancel() Then Exit Sub
-
-		Dim veh = New cVEH
-		veh.FilePath = file
-
-		If Not veh.ReadFile Then
-			MsgBox("Cannot read " & file & "!")
-			Exit Sub
-		End If
-
-		If Cfg.DeclMode <> veh.SavedInDeclMode Then
-			Select Case WrongMode()
-				Case 1
-					Close()
-					F_MAINForm.RbDecl.Checked = Not F_MAINForm.RbDecl.Checked
-					F_MAINForm.OpenVectoFile(file)
-				Case -1
-					Exit Sub
-			End Select
-		End If
-
-		TbMass.Text = veh.Mass
-		TbMassExtra.Text = veh.MassExtra
-		TbLoad.Text = veh.Loading
-		TBrdyn.Text = veh.rdyn
-
-		CbCdMode.SelectedIndex = CType(veh.CdMode, Integer)
-		TbCdFile.Text = veh.CdFile.OriginalPath
-
-		CbRtType.SelectedIndex = CType(veh.RtType, Integer)
-		TbRtRatio.Text = veh.RtRatio
-		TbRtPath.Text = veh.RtFile.OriginalPath
-
-		cbAngularGearType.SelectedIndex = CType(veh.AngularGearType, Integer)
-		tbAngularGearRatio.Text = veh.AngularGearRatio
-		tbAngularGearLossMapPath.Text = veh.AngularGearLossMapFile.OriginalPath
-
-		CbCat.SelectedIndex = CType(veh.VehCat, Integer)
-
-
-		LvRRC.Items.Clear()
-		Dim i = 0
-		For Each a0 In veh.Axles
-			i += 1
-			Dim lvi = New ListViewItem
-			lvi.SubItems(0).Text = i.ToString
-
-			If Cfg.DeclMode Then
-				lvi.SubItems.Add("-")
-			Else
-				lvi.SubItems.Add(a0.Share)
-			End If
-
-			If a0.TwinTire Then
-				lvi.SubItems.Add("yes")
-			Else
-				lvi.SubItems.Add("no")
-			End If
-			lvi.SubItems.Add(a0.RRC)
-			lvi.SubItems.Add(a0.FzISO)
-			lvi.SubItems.Add(a0.Wheels)
-
-			If Cfg.DeclMode Then
-				inertia = Declaration.WheelsInertia(a0.Wheels)
-				If inertia < 0 Then
-					lvi.SubItems.Add("-")
-				Else
-					lvi.SubItems.Add(inertia)
-				End If
-			Else
-				lvi.SubItems.Add(a0.Inertia)
-			End If
-
-			LvRRC.Items.Add(lvi)
-		Next
-
-		TbMassMass.Text = veh.MassMax
-		TbMassExtra.Text = veh.MassExtra
-
-		CbAxleConfig.SelectedIndex = CType(veh.AxleConf, Integer)
-
-		TBcdA.Text = veh.CdA0
-
-		DeclInit()
-
-		fbVEH.UpdateHistory(file)
-		Text = fFILE(file, True)
-		LbStatus.Text = ""
-		_vehFile = file
-		Activate()
-
-		_changed = False
-	End Sub
-
-	'Save VEH
-	Private Function SaveVehicle(file As String) As Boolean
-
-		Dim veh = New cVEH
-		veh.FilePath = file
-
-		veh.Mass = CSng(fTextboxToNumString(TbMass.Text))
-		veh.MassExtra = CSng(fTextboxToNumString(TbMassExtra.Text))
-		veh.Loading = CSng(fTextboxToNumString(TbLoad.Text))
-
-		veh.CdA0 = CSng(fTextboxToNumString(TBcdA.Text))
-		veh.CdA02 = veh.CdA0
-
-		Dim vehC = CType(CbCat.SelectedIndex, tVehCat)
-		Dim axlC = CType(CbAxleConfig.SelectedIndex, tAxleConf)
-		Dim maxMass = CSng(fTextboxToNumString(TbMassMass.Text))
-		Dim s0 As cSegmentTableEntry = Declaration.SegmentTable.SetRef(vehC, axlC, maxMass)
-		If Not s0 Is Nothing Then
-			If s0.HDVclass = "2" Then
-				' CdA Addition for T1 Trailer
-				veh.CdA02 += 1.1
-			End If
-			If s0.HDVclass = "4" OrElse s0.HDVclass = "9" Then
-				' CdA Addition for T2 Trailer
-				veh.CdA02 += 0.6
-			End If
-		End If
-
-		veh.rdyn = CSng(fTextboxToNumString(TBrdyn.Text))
-		veh.CdMode = CType(CbCdMode.SelectedIndex, tCdMode)
-		veh.CdFile.Init(fPATH(file), TbCdFile.Text)
-		veh.RtType = CType(CbRtType.SelectedIndex, tRtType)
-		veh.RtRatio = CSng(fTextboxToNumString(TbRtRatio.Text))
-		veh.RtFile.Init(fPATH(file), TbRtPath.Text)
-
-		veh.AngularGearType = CType(cbAngularGearType.SelectedIndex, AngularGearType)
-		veh.AngularGearRatio = CSng(fTextboxToNumString(tbAngularGearRatio.Text))
-		veh.AngularGearLossMapFile.Init(fPATH(file), tbAngularGearLossMapPath.Text)
-
-		veh.VehCat = CType(CbCat.SelectedIndex, tVehCat)
-
-		Dim axleShareCheck As Double
-		For Each LV0 In LvRRC.Items
-			Dim a0 = New cVEH.cAxle
-			a0.Share = fTextboxToNumString(LV0.SubItems(1).Text)
-			axleShareCheck += a0.Share
-			a0.TwinTire = (LV0.SubItems(2).Text = "yes")
-			a0.RRC = fTextboxToNumString(LV0.SubItems(3).Text)
-			a0.FzISO = fTextboxToNumString(LV0.SubItems(4).Text)
-			a0.Wheels = LV0.SubItems(5).Text
-			a0.Inertia = fTextboxToNumString(LV0.SubItems(6).Text)
-			veh.Axles.Add(a0)
-		Next
-
-		If Not Cfg.DeclMode AndAlso Math.Abs(axleShareCheck - 1) > 0.000001 Then
-			MsgBox("Relative axle loads must sum up to 1.0. Current value: " & axleShareCheck, MsgBoxStyle.Critical)
-			Return False
-		End If
-
-		veh.MassMax = CSng(fTextboxToNumString(TbMassMass.Text))
-		veh.MassExtra = CSng(fTextboxToNumString(TbMassExtra.Text))
-		veh.AxleConf = CType(CbAxleConfig.SelectedIndex, tAxleConf)
-
-		'---------------------------------------------------------------------------------
-		If Not veh.SaveFile Then
-			MsgBox("Cannot safe to " & file, MsgBoxStyle.Critical)
-			Return False
-		End If
-
-		If AutoSendTo Then
-			If F_VECTO.Visible Then
-				If UCase(fFileRepl(F_VECTO.TbVEH.Text, JobDir)) <> UCase(file) Then F_VECTO.TbVEH.Text = fFileWoDir(file, JobDir)
-				F_VECTO.UpdatePic()
-			End If
-		End If
-
-		fbVEH.UpdateHistory(file)
-		Text = fFILE(file, True)
-		LbStatus.Text = ""
-
-		_changed = False
-
-		Return True
-	End Function
-
-#Region "Cd"
-
-	'Cd Mode Change
-	Private Sub CbCdMode_SelectedIndexChanged(sender As Object, e As EventArgs) _
-		Handles CbCdMode.SelectedIndexChanged
-		Dim bEnabled As Boolean
-
-		Select Case CType(CbCdMode.SelectedIndex, tCdMode)
-
-			Case tCdMode.CdOfBeta
-				bEnabled = True
-				LbCdMode.Text = "Input file: Yaw Angle [°], Cd Scaling Factor [-]"
-
-			Case tCdMode.CdOfVeng
-				bEnabled = True
-				LbCdMode.Text = "Input file: Vehicle Speed [km/h], Cd Scaling Factor [-]"
-
-			Case Else ' tCdMode.ConstCd0, tCdMode.CdOfVdecl
-				bEnabled = False
-				LbCdMode.Text = ""
-
-		End Select
-
-		If Not Cfg.DeclMode Then
-			TbCdFile.Enabled = bEnabled
-			BtCdFileBrowse.Enabled = bEnabled
-			BtCdFileOpen.Enabled = bEnabled
-		End If
-
-		Change()
-	End Sub
-
-	'Cd File Browse
-	Private Sub BtCdFileBrowse_Click(sender As Object, e As EventArgs) Handles BtCdFileBrowse.Click
-		Dim ex As String
-
-		If CbCdMode.SelectedIndex = 1 Then
-			ex = "vcdv"
-		Else
-			ex = "vcdb"
-		End If
-
-		If fbCDx.OpenDialog(fFileRepl(TbCdFile.Text, fPATH(_vehFile)), False, ex) Then _
-			TbCdFile.Text = fFileWoDir(fbCDx.Files(0), fPATH(_vehFile))
-	End Sub
-
-	'Open Cd File
-	Private Sub BtCdFileOpen_Click(sender As Object, e As EventArgs) Handles BtCdFileOpen.Click
-		OpenFiles(fFileRepl(TbCdFile.Text, fPATH(_vehFile)))
-	End Sub
-
-#End Region
-
-#Region "Retarder"
-
-	'Rt Type Change
-	Private Sub CbRtType_SelectedIndexChanged(sender As Object, e As EventArgs) _
-		Handles CbRtType.SelectedIndexChanged
-		Select Case CbRtType.SelectedIndex
-			Case 1 'Primary
-				LbRtRatio.Text = "Ratio to engine speed"
-				PnRt.Enabled = True
-			Case 2 'Secondary
-				LbRtRatio.Text = "Ratio to cardan shaft speed"
-				TbRtPath.Enabled = True
-				BtRtBrowse.Enabled = True
-				PnRt.Enabled = True
-			Case Else '0 None
-				LbRtRatio.Text = "Ratio"
-				PnRt.Enabled = False
-		End Select
-
-		Change()
-	End Sub
-
-	'Rt File Browse
-	Private Sub BtRtBrowse_Click(sender As Object, e As EventArgs) Handles BtRtBrowse.Click
-		If fbRLM.OpenDialog(fFileRepl(TbRtPath.Text, fPATH(_vehFile))) Then _
-			TbRtPath.Text = fFileWoDir(fbRLM.Files(0), fPATH(_vehFile))
-	End Sub
-
-#End Region
-
-#Region "Track changes"
-
-	Private Sub Change()
-		If Not _changed Then
-			LbStatus.Text = "Unsaved changes in current file"
-			_changed = True
-		End If
-	End Sub
-
-	' "Save changes? "... Returns True if user aborts
-	Private Function ChangeCheckCancel() As Boolean
-
+' Copyright 2014 European Union.
+' Licensed under the EUPL (the 'Licence');
+'
+' * You may not use this work except in compliance with the Licence.
+' * You may obtain a copy of the Licence at: http://ec.europa.eu/idabc/eupl
+' * Unless required by applicable law or agreed to in writing,
+'   software distributed under the Licence is distributed on an "AS IS" basis,
+'   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
+
+Imports System.IO
+Imports System.Linq
+Imports System.Text.RegularExpressions
+Imports TUGraz.VectoCommon.Models
+
+''' <summary>
+''' Vehicle Editor.
+''' </summary>
+Public Class F_VEH
+	Private _axlDlog As F_VEH_Axle
+	Private _hdVclass As String
+	Private _vehFile As String
+	Private _changed As Boolean = False
+	Private _cmFiles As String()
+
+	Public AutoSendTo As Boolean = False
+	Public JobDir As String = ""
+
+	'Close - Check for unsaved changes
+	Private Sub F_VEH_FormClosing(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing
+		If e.CloseReason <> CloseReason.ApplicationExitCall And e.CloseReason <> CloseReason.WindowsShutDown Then
+			e.Cancel = ChangeCheckCancel()
+		End If
+	End Sub
+
+	'Initialise form
+	Private Sub F05_VEH_Load(sender As Object, e As EventArgs) Handles MyBase.Load
+		TbLoadingMax.Text = "-"
+		PnLoad.Enabled = Not Cfg.DeclMode
+		ButAxlAdd.Enabled = Not Cfg.DeclMode
+		ButAxlRem.Enabled = Not Cfg.DeclMode
+		CbCdMode.Enabled = Not Cfg.DeclMode
+		PnWheelDiam.Enabled = Not Cfg.DeclMode
+		gbPTO.Enabled = Not Cfg.DeclMode
+
+		_axlDlog = New F_VEH_Axle
+
+		cbPTOType.Items.AddRange(PtoTypeStrings.Values.Cast(Of Object).ToArray())
+
+		_changed = False
+
+		NewVehicle()
+	End Sub
+
+	'Set HDVclasss
+	Private Sub SetHdVclass()
+		Dim vehC = CType(CbCat.SelectedIndex, tVehCat)
+		Dim axlC = CType(CbAxleConfig.SelectedIndex, tAxleConf)
+		Dim maxMass = CSng(fTextboxToNumString(TbMassMass.Text))
+
+		Dim s0 As cSegmentTableEntry = Declaration.SegmentTable.SetRef(vehC, axlC, maxMass)
+		_hdVclass = "-"
+		If Not s0 Is Nothing Then
+			_hdVclass = s0.HDVclass
+		End If
+
+		TbHDVclass.Text = _hdVclass
+		PicVehicle.Image = Image.FromFile(cDeclaration.ConvPicPath(_hdVclass, False))
+	End Sub
+
+
+	'Set generic values for Declaration mode
+	Private Sub DeclInit()
+		If Not Cfg.DeclMode Then Exit Sub
+
+		Dim vehC = CType(CbCat.SelectedIndex, tVehCat)
+		Dim axlC = CType(CbAxleConfig.SelectedIndex, tAxleConf)
+		Dim maxMass = CSng(fTextboxToNumString(TbMassMass.Text))
+		Dim s0 = Declaration.SegmentTable.SetRef(vehC, axlC, maxMass)
+
+		If Not s0 Is Nothing Then
+			_hdVclass = s0.HDVclass
+			Dim axleCount As Short = s0.AxleShares(s0.Missions(0)).Count
+			Dim i0 = LvRRC.Items.Count
+
+			If axleCount > i0 Then
+				For i = 1 To axleCount - LvRRC.Items.Count
+					Dim lvi = New ListViewItem
+					lvi.SubItems(0).Text = (i + i0).ToString
+					lvi.SubItems.Add("-")
+					lvi.SubItems.Add("no")
+					lvi.SubItems.Add("")
+					lvi.SubItems.Add("")
+					lvi.SubItems.Add("-")
+					lvi.SubItems.Add("-")
+					LvRRC.Items.Add(lvi)
+				Next
+
+			ElseIf axleCount < LvRRC.Items.Count Then
+				For i = axleCount To LvRRC.Items.Count - 1
+					LvRRC.Items.RemoveAt(LvRRC.Items.Count - 1)
+				Next
+			End If
+
+			PnAll.Enabled = True
+
+		Else
+			PnAll.Enabled = False
+			_hdVclass = "-"
+		End If
+
+		TbMassExtra.Text = "-"
+		TbLoad.Text = "-"
+		CbCdMode.SelectedIndex = CType(tCdMode.CdOfVdecl, Integer)
+		TbCdFile.Text = ""
+
+		Dim rdyn As Single
+		rdyn = -1
+
+		If rdyn < 0 Then
+			TBrdyn.Text = "-"
+		Else
+			TBrdyn.Text = rdyn
+		End If
+	End Sub
+
+
+#Region "Toolbar"
+
+	'New
+	Private Sub ToolStripBtNew_Click(sender As Object, e As EventArgs) Handles ToolStripBtNew.Click
+		NewVehicle()
+	End Sub
+
+	'Open
+	Private Sub ToolStripBtOpen_Click(sender As Object, e As EventArgs) Handles ToolStripBtOpen.Click
+		If fbVEH.OpenDialog(_vehFile) Then OpenVehicle(fbVEH.Files(0))
+	End Sub
+
+	'Save
+	Private Sub ToolStripBtSave_Click(sender As Object, e As EventArgs) Handles ToolStripBtSave.Click
+		SaveOrSaveAs(False)
+	End Sub
+
+	'Save As
+	Private Sub ToolStripBtSaveAs_Click(sender As Object, e As EventArgs) Handles ToolStripBtSaveAs.Click
+		SaveOrSaveAs(True)
+	End Sub
+
+	'Send to VECTO Editor
+	Private Sub ToolStripBtSendTo_Click(sender As Object, e As EventArgs) Handles ToolStripBtSendTo.Click
+
+		If ChangeCheckCancel() Then Exit Sub
+
+		If _vehFile = "" Then
+			If MsgBox("Save file now?", MsgBoxStyle.YesNo) = MsgBoxResult.Yes Then
+				If Not SaveOrSaveAs(True) Then Exit Sub
+			Else
+				Exit Sub
+			End If
+		End If
+
+
+		If Not F_VECTO.Visible Then
+			JobDir = ""
+			F_VECTO.Show()
+			F_VECTO.VECTOnew()
+		Else
+			F_VECTO.WindowState = FormWindowState.Normal
+		End If
+
+		F_VECTO.TbVEH.Text = fFileWoDir(_vehFile, JobDir)
+	End Sub
+
+	'Help
+	Private Sub ToolStripButton1_Click(sender As Object, e As EventArgs) Handles ToolStripButton1.Click
+		If File.Exists(MyAppPath & "User Manual\help.html") Then
+			Dim registryString = My.Computer.Registry.ClassesRoot.OpenSubKey("\http\shell\open\command\").GetValue("").ToString
+			Dim defaultBrowserPath = Regex.Match(registryString, "(\"".*?\"")").Captures(0).ToString
+			Process.Start(defaultBrowserPath, String.Format("""{0}{1}""", MyAppPath, "User Manual\help.html#vehicle-editor"))
+		Else
+			MsgBox("User Manual not found!", MsgBoxStyle.Critical)
+		End If
+	End Sub
+
+#End Region
+
+	'Save and Close
+	Private Sub ButOK_Click(sender As Object, e As EventArgs) Handles ButOK.Click
+		If SaveOrSaveAs(False) Then Close()
+	End Sub
+
+	'Cancel
+	Private Sub ButCancel_Click(sender As Object, e As EventArgs) Handles ButCancel.Click
+		Close()
+	End Sub
+
+	'Save or Save As function = true if file is saved
+	Private Function SaveOrSaveAs(saveAs As Boolean) As Boolean
+		If _vehFile = "" Or saveAs Then
+			If fbVEH.SaveDialog(_vehFile) Then
+				_vehFile = fbVEH.Files(0)
+			Else
+				Return False
+			End If
+		End If
+		Return SaveVehicle(_vehFile)
+	End Function
+
+	'New VEH
+	Private Sub NewVehicle()
+		If ChangeCheckCancel() Then Exit Sub
+
+		TbMass.Text = ""
+		TbLoad.Text = ""
+		TBrdyn.Text = ""
+		TBcdA.Text = ""
+
+		CbCdMode.SelectedIndex = 0
+		TbCdFile.Text = ""
+
+		CbRtType.SelectedIndex = 0
+		TbRtRatio.Text = ""
+		TbRtPath.Text = ""
+
+		CbRtType.SelectedIndex = 0
+		TbRtRatio.Text = ""
+		TbRtPath.Text = ""
+
+		CbCat.SelectedIndex = 0
+
+		LvRRC.Items.Clear()
+
+		TbMassMass.Text = ""
+		TbMassExtra.Text = ""
+		CbAxleConfig.SelectedIndex = 0
+
+		cbPTOType.SelectedIndex = 0
+		tbPTOLossMap.Text = ""
+
+		DeclInit()
+
+		_vehFile = ""
+		Text = "VEH Editor"
+		LbStatus.Text = ""
+
+		_changed = False
+	End Sub
+
+	'Open VEH
+	Sub OpenVehicle(file As String)
+		Dim inertia As Single
+
+		If ChangeCheckCancel() Then Exit Sub
+
+		Dim veh = New cVEH
+		veh.FilePath = file
+
+		If Not veh.ReadFile Then
+			MsgBox("Cannot read " & file & "!")
+			Exit Sub
+		End If
+
+		If Cfg.DeclMode <> veh.SavedInDeclMode Then
+			Select Case WrongMode()
+				Case 1
+					Close()
+					F_MAINForm.RbDecl.Checked = Not F_MAINForm.RbDecl.Checked
+					F_MAINForm.OpenVectoFile(file)
+				Case -1
+					Exit Sub
+			End Select
+		End If
+
+		TbMass.Text = veh.Mass
+		TbMassExtra.Text = veh.MassExtra
+		TbLoad.Text = veh.Loading
+		TBrdyn.Text = veh.rdyn
+
+		CbCdMode.SelectedIndex = CType(veh.CdMode, Integer)
+		TbCdFile.Text = veh.CdFile.OriginalPath
+
+		CbRtType.SelectedIndex = CType(veh.RtType, Integer)
+		TbRtRatio.Text = veh.RtRatio
+		TbRtPath.Text = veh.RtFile.OriginalPath
+
+		cbAngularGearType.SelectedIndex = CType(veh.AngularGearType, Integer)
+		tbAngularGearRatio.Text = veh.AngularGearRatio
+		tbAngularGearLossMapPath.Text = veh.AngularGearLossMapFile.OriginalPath
+
+		CbCat.SelectedIndex = CType(veh.VehCat, Integer)
+
+
+		LvRRC.Items.Clear()
+		Dim i = 0
+		For Each a0 In veh.Axles
+			i += 1
+			Dim lvi = New ListViewItem
+			lvi.SubItems(0).Text = i.ToString
+
+			If Cfg.DeclMode Then
+				lvi.SubItems.Add("-")
+			Else
+				lvi.SubItems.Add(a0.Share)
+			End If
+
+			If a0.TwinTire Then
+				lvi.SubItems.Add("yes")
+			Else
+				lvi.SubItems.Add("no")
+			End If
+			lvi.SubItems.Add(a0.RRC)
+			lvi.SubItems.Add(a0.FzISO)
+			lvi.SubItems.Add(a0.Wheels)
+
+			If Cfg.DeclMode Then
+				inertia = Declaration.WheelsInertia(a0.Wheels)
+				If inertia < 0 Then
+					lvi.SubItems.Add("-")
+				Else
+					lvi.SubItems.Add(inertia)
+				End If
+			Else
+				lvi.SubItems.Add(a0.Inertia)
+			End If
+
+			LvRRC.Items.Add(lvi)
+		Next
+
+		TbMassMass.Text = veh.MassMax
+		TbMassExtra.Text = veh.MassExtra
+
+		CbAxleConfig.SelectedIndex = CType(veh.AxleConf, Integer)
+
+		TBcdA.Text = veh.CdA0
+
+		cbPTOType.SelectedIndex = CType(veh.PTOType, Integer)
+		tbPTOLossMap.Text = veh.PTOLossMap.OriginalPath
+
+		DeclInit()
+
+		fbVEH.UpdateHistory(file)
+		Text = fFILE(file, True)
+		LbStatus.Text = ""
+		_vehFile = file
+		Activate()
+
+		_changed = False
+	End Sub
+
+	'Save VEH
+	Private Function SaveVehicle(file As String) As Boolean
+
+		Dim veh = New cVEH
+		veh.FilePath = file
+
+		veh.Mass = CSng(fTextboxToNumString(TbMass.Text))
+		veh.MassExtra = CSng(fTextboxToNumString(TbMassExtra.Text))
+		veh.Loading = CSng(fTextboxToNumString(TbLoad.Text))
+
+		veh.CdA0 = CSng(fTextboxToNumString(TBcdA.Text))
+		veh.CdA02 = veh.CdA0
+
+		Dim vehC = CType(CbCat.SelectedIndex, tVehCat)
+		Dim axlC = CType(CbAxleConfig.SelectedIndex, tAxleConf)
+		Dim maxMass = CSng(fTextboxToNumString(TbMassMass.Text))
+		Dim s0 As cSegmentTableEntry = Declaration.SegmentTable.SetRef(vehC, axlC, maxMass)
+		If Not s0 Is Nothing Then
+			If s0.HDVclass = "2" Then
+				' CdA Addition for T1 Trailer
+				veh.CdA02 += 1.1
+			End If
+			If s0.HDVclass = "4" OrElse s0.HDVclass = "9" Then
+				' CdA Addition for T2 Trailer
+				veh.CdA02 += 0.6
+			End If
+		End If
+
+		veh.rdyn = CSng(fTextboxToNumString(TBrdyn.Text))
+		veh.CdMode = CType(CbCdMode.SelectedIndex, tCdMode)
+		veh.CdFile.Init(fPATH(file), TbCdFile.Text)
+		veh.RtType = CType(CbRtType.SelectedIndex, tRtType)
+		veh.RtRatio = CSng(fTextboxToNumString(TbRtRatio.Text))
+		veh.RtFile.Init(fPATH(file), TbRtPath.Text)
+
+		veh.AngularGearType = CType(cbAngularGearType.SelectedIndex, AngularGearType)
+		veh.AngularGearRatio = CSng(fTextboxToNumString(tbAngularGearRatio.Text))
+		veh.AngularGearLossMapFile.Init(fPATH(file), tbAngularGearLossMapPath.Text)
+
+		veh.VehCat = CType(CbCat.SelectedIndex, tVehCat)
+
+		Dim axleShareCheck As Double
+		For Each LV0 In LvRRC.Items
+			Dim a0 = New cVEH.cAxle
+			a0.Share = fTextboxToNumString(LV0.SubItems(1).Text)
+			axleShareCheck += a0.Share
+			a0.TwinTire = (LV0.SubItems(2).Text = "yes")
+			a0.RRC = fTextboxToNumString(LV0.SubItems(3).Text)
+			a0.FzISO = fTextboxToNumString(LV0.SubItems(4).Text)
+			a0.Wheels = LV0.SubItems(5).Text
+			a0.Inertia = fTextboxToNumString(LV0.SubItems(6).Text)
+			veh.Axles.Add(a0)
+		Next
+
+		veh.PTOType = CType(cbPTOType.SelectedIndex, tPTOType)
+		veh.PTOLossMap.Init(fPATH(file), tbPTOLossMap.Text)
+
+		If Not Cfg.DeclMode AndAlso Math.Abs(axleShareCheck - 1) > 0.000001 Then
+			MsgBox("Relative axle loads must sum up to 1.0. Current value: " & axleShareCheck, MsgBoxStyle.Critical)
+			Return False
+		End If
+
+		veh.MassMax = CSng(fTextboxToNumString(TbMassMass.Text))
+		veh.MassExtra = CSng(fTextboxToNumString(TbMassExtra.Text))
+		veh.AxleConf = CType(CbAxleConfig.SelectedIndex, tAxleConf)
+
+		'---------------------------------------------------------------------------------
+		If Not veh.SaveFile Then
+			MsgBox("Cannot safe to " & file, MsgBoxStyle.Critical)
+			Return False
+		End If
+
+		If AutoSendTo Then
+			If F_VECTO.Visible Then
+				If UCase(fFileRepl(F_VECTO.TbVEH.Text, JobDir)) <> UCase(file) Then F_VECTO.TbVEH.Text = fFileWoDir(file, JobDir)
+				F_VECTO.UpdatePic()
+			End If
+		End If
+
+		fbVEH.UpdateHistory(file)
+		Text = fFILE(file, True)
+		LbStatus.Text = ""
+
+		_changed = False
+
+		Return True
+	End Function
+
+#Region "Cd"
+
+	'Cd Mode Change
+	Private Sub CbCdMode_SelectedIndexChanged(sender As Object, e As EventArgs) _
+		Handles CbCdMode.SelectedIndexChanged
+		Dim bEnabled As Boolean
+
+		Select Case CType(CbCdMode.SelectedIndex, tCdMode)
+
+			Case tCdMode.CdOfBeta
+				bEnabled = True
+				LbCdMode.Text = "Input file: Yaw Angle [°], Cd Scaling Factor [-]"
+
+			Case tCdMode.CdOfVeng
+				bEnabled = True
+				LbCdMode.Text = "Input file: Vehicle Speed [km/h], Cd Scaling Factor [-]"
+
+			Case Else ' tCdMode.ConstCd0, tCdMode.CdOfVdecl
+				bEnabled = False
+				LbCdMode.Text = ""
+
+		End Select
+
+		If Not Cfg.DeclMode Then
+			TbCdFile.Enabled = bEnabled
+			BtCdFileBrowse.Enabled = bEnabled
+			BtCdFileOpen.Enabled = bEnabled
+		End If
+
+		Change()
+	End Sub
+
+	'Cd File Browse
+	Private Sub BtCdFileBrowse_Click(sender As Object, e As EventArgs) Handles BtCdFileBrowse.Click
+		Dim ex As String
+
+		If CbCdMode.SelectedIndex = 1 Then
+			ex = "vcdv"
+		Else
+			ex = "vcdb"
+		End If
+
+		If fbCDx.OpenDialog(fFileRepl(TbCdFile.Text, fPATH(_vehFile)), False, ex) Then _
+			TbCdFile.Text = fFileWoDir(fbCDx.Files(0), fPATH(_vehFile))
+	End Sub
+
+	'Open Cd File
+	Private Sub BtCdFileOpen_Click(sender As Object, e As EventArgs) Handles BtCdFileOpen.Click
+		OpenFiles(fFileRepl(TbCdFile.Text, fPATH(_vehFile)))
+	End Sub
+
+#End Region
+
+#Region "Retarder"
+
+	'Rt Type Change
+	Private Sub CbRtType_SelectedIndexChanged(sender As Object, e As EventArgs) _
+		Handles CbRtType.SelectedIndexChanged
+		Select Case CbRtType.SelectedIndex
+			Case 1 'Primary
+				LbRtRatio.Text = "Ratio to engine speed"
+				PnRt.Enabled = True
+			Case 2 'Secondary
+				LbRtRatio.Text = "Ratio to cardan shaft speed"
+				TbRtPath.Enabled = True
+				BtRtBrowse.Enabled = True
+				PnRt.Enabled = True
+			Case Else '0 None
+				LbRtRatio.Text = "Ratio"
+				PnRt.Enabled = False
+		End Select
+
+		Change()
+	End Sub
+
+	'Rt File Browse
+	Private Sub BtRtBrowse_Click(sender As Object, e As EventArgs) Handles BtRtBrowse.Click
+		If fbRLM.OpenDialog(fFileRepl(TbRtPath.Text, fPATH(_vehFile))) Then _
+			TbRtPath.Text = fFileWoDir(fbRLM.Files(0), fPATH(_vehFile))
+	End Sub
+
+#End Region
+
+#Region "Track changes"
+
+	Private Sub Change()
+		If Not _changed Then
+			LbStatus.Text = "Unsaved changes in current file"
+			_changed = True
+		End If
+	End Sub
+
+	' "Save changes? "... Returns True if user aborts
+	Private Function ChangeCheckCancel() As Boolean
+
 		If _changed Then
-			Select Case MsgBox("Save changes ?", MsgBoxStyle.YesNoCancel)
-				Case MsgBoxResult.Yes
-					Return Not SaveOrSaveAs(False)
-				Case MsgBoxResult.Cancel
-					Return True
-				Case Else 'MsgBoxResult.No
-					_changed = False
-					Return False
-			End Select
+			Select Case MsgBox("Save changes ?", MsgBoxStyle.YesNoCancel)
+				Case MsgBoxResult.Yes
+					Return Not SaveOrSaveAs(False)
+				Case MsgBoxResult.Cancel
+					Return True
+				Case Else 'MsgBoxResult.No
+					_changed = False
+					Return False
+			End Select
 
 		Else
 
 			Return False
 
 		End If
-	End Function
-
-	Private Sub TBmass_TextChanged(sender As Object, e As EventArgs) Handles TbMass.TextChanged
-		SetMaxLoad()
-		Change()
-	End Sub
-
-	Private Sub CbRim_SelectedIndexChanged(sender As Object, e As EventArgs)
-		Change()
-		DeclInit()
-	End Sub
-
-	Private Sub TBcw_TextChanged(sender As Object, e As EventArgs) _
-		Handles TbLoad.TextChanged, TBrdyn.TextChanged, TBcdA.TextChanged, TbCdFile.TextChanged, TbRtRatio.TextChanged,
-				cbAngularGearType.SelectedIndexChanged, TbRtPath.TextChanged, tbAngularGearLossMapPath.TextChanged,
-				tbAngularGearRatio.TextChanged
-		Change()
-	End Sub
-
-	Private Sub CbCat_SelectedIndexChanged(sender As Object, e As EventArgs) Handles CbCat.SelectedIndexChanged
-		Change()
-		SetHdVclass()
-		DeclInit()
-	End Sub
-
-	Private Sub TbMassTrailer_TextChanged(sender As Object, e As EventArgs) Handles TbMassExtra.TextChanged
-		SetMaxLoad()
-		Change()
-	End Sub
-
-	Private Sub TbMassMax_TextChanged(sender As Object, e As EventArgs) Handles TbMassMass.TextChanged
-		SetMaxLoad()
-		Change()
-		SetHdVclass()
-		DeclInit()
-	End Sub
-
-	Private Sub CbAxleConfig_SelectedIndexChanged(sender As Object, e As EventArgs) _
-		Handles CbAxleConfig.SelectedIndexChanged
-		Change()
-		SetHdVclass()
-		DeclInit()
-	End Sub
-
-#End Region
-
-	'Update maximum load when truck/trailer mass was changed
-	Private Sub SetMaxLoad()
-		If Not Cfg.DeclMode Then
-			If IsNumeric(TbMass.Text) And IsNumeric(TbMassExtra.Text) And IsNumeric(TbMassMass.Text) Then
-				TbLoadingMax.Text = CStr(CSng(TbMassMass.Text) * 1000 - CSng(TbMass.Text) - CSng(TbMassExtra.Text))
-			Else
-				TbLoadingMax.Text = ""
-			End If
-		End If
-	End Sub
-
-#Region "Axle Configuration"
-
-	Private Sub ButAxlAdd_Click(sender As Object, e As EventArgs) Handles ButAxlAdd.Click
-		Dim lv0 As ListViewItem
-
-		_axlDlog.Clear()
-
-		If _axlDlog.ShowDialog = DialogResult.OK Then
-			lv0 = New ListViewItem
-
-			lv0.SubItems(0).Text = LvRRC.Items.Count + 1
-			lv0.SubItems.Add(Trim(_axlDlog.TbAxleShare.Text))
-			If _axlDlog.CbTwinT.Checked Then
-				lv0.SubItems.Add("yes")
-			Else
-				lv0.SubItems.Add("no")
-			End If
-			lv0.SubItems.Add(Trim(_axlDlog.TbRRC.Text))
-			lv0.SubItems.Add(Trim(_axlDlog.TbFzISO.Text))
-			lv0.SubItems.Add(Trim(_axlDlog.CbWheels.Text))
-			lv0.SubItems.Add(Trim(_axlDlog.TbI_wheels.Text))
-
-			LvRRC.Items.Add(lv0)
-
-			Change()
-			DeclInit()
-
-		End If
-	End Sub
-
-	Private Sub ButAxlRem_Click(sender As Object, e As EventArgs) Handles ButAxlRem.Click
-		RemoveAxleItem()
-	End Sub
-
-	Private Sub LvAxle_DoubleClick(sender As Object, e As EventArgs) Handles LvRRC.DoubleClick
-		EditAxleItem()
-	End Sub
-
-	Private Sub LvAxle_KeyDown(sender As Object, e As KeyEventArgs) Handles LvRRC.KeyDown
-		Select Case e.KeyCode
-			Case Keys.Delete, Keys.Back
-				If Not Cfg.DeclMode Then RemoveAxleItem()
-			Case Keys.Enter
-				EditAxleItem()
-		End Select
-	End Sub
-
-	Private Sub RemoveAxleItem()
-		Dim lv0 As ListViewItem
-		Dim i As Integer
-
-		If LvRRC.SelectedItems.Count = 0 Then
-			If LvRRC.Items.Count = 0 Then
-				Exit Sub
-			Else
-				LvRRC.Items(LvRRC.Items.Count - 1).Selected = True
-			End If
-		End If
-
-		LvRRC.SelectedItems(0).Remove()
-
-		If LvRRC.Items.Count > 0 Then
-
-			i = 0
-			For Each lv0 In LvRRC.Items
-				i += 1
-				lv0.SubItems(0).Text = i.ToString
-			Next
-
-			LvRRC.Items(LvRRC.Items.Count - 1).Selected = True
-			LvRRC.Focus()
-		End If
-
-		Change()
-	End Sub
-
-	Private Sub EditAxleItem()
-		If LvRRC.SelectedItems.Count = 0 Then Exit Sub
-
-		Dim lv0 = LvRRC.SelectedItems(0)
-
-		_axlDlog.TbAxleShare.Text = lv0.SubItems(1).Text
-		_axlDlog.CbTwinT.Checked = (lv0.SubItems(2).Text = "yes")
-		_axlDlog.TbRRC.Text = lv0.SubItems(3).Text
-		_axlDlog.TbFzISO.Text = lv0.SubItems(4).Text
-		_axlDlog.TbI_wheels.Text = lv0.SubItems(6).Text
-		_axlDlog.CbWheels.Text = lv0.SubItems(5).Text
-
-		If _axlDlog.ShowDialog = DialogResult.OK Then
-			lv0.SubItems(1).Text = _axlDlog.TbAxleShare.Text
-			If _axlDlog.CbTwinT.Checked Then
-				lv0.SubItems(2).Text = "yes"
-			Else
-				lv0.SubItems(2).Text = "no"
-			End If
-			lv0.SubItems(3).Text = _axlDlog.TbRRC.Text
-			lv0.SubItems(4).Text = _axlDlog.TbFzISO.Text
-			lv0.SubItems(5).Text = _axlDlog.CbWheels.Text
-			lv0.SubItems(6).Text = _axlDlog.TbI_wheels.Text
-
-			Change()
-			DeclInit()
-		End If
-	End Sub
-
-#End Region
-
-#Region "Open File Context Menu"
-
-
-	Private Sub OpenFiles(ParamArray files() As String)
-		If files.Length = 0 Then Exit Sub
-
-		_cmFiles = files
-		OpenWithToolStripMenuItem.Text = "Open with " & Cfg.OpenCmdName
-		CmOpenFile.Show(Cursor.Position)
-	End Sub
-
-	Private Sub OpenWithToolStripMenuItem_Click(sender As Object, e As EventArgs) _
-		Handles OpenWithToolStripMenuItem.Click
-		If Not FileOpenAlt(_cmFiles(0)) Then MsgBox("Failed to open file!")
-	End Sub
-
-	Private Sub ShowInFolderToolStripMenuItem_Click(sender As Object, e As EventArgs) _
-		Handles ShowInFolderToolStripMenuItem.Click
-		If File.Exists(_cmFiles(0)) Then
-			Try
-				Process.Start("explorer", "/select,""" & _cmFiles(0) & "")
-			Catch ex As Exception
-				MsgBox("Failed to open file!")
-			End Try
-		Else
-			MsgBox("File not found!")
+	End Function
+
+	Private Sub TBmass_TextChanged(sender As Object, e As EventArgs) Handles TbMass.TextChanged
+		SetMaxLoad()
+		Change()
+	End Sub
+
+	Private Sub TBcw_TextChanged(sender As Object, e As EventArgs) _
+		Handles TbLoad.TextChanged, TBrdyn.TextChanged, TBcdA.TextChanged, TbCdFile.TextChanged, TbRtRatio.TextChanged,
+				cbAngularGearType.SelectedIndexChanged, TbRtPath.TextChanged, tbAngularGearLossMapPath.TextChanged,
+				tbAngularGearRatio.TextChanged, tbPTOLossMap.TextChanged
+		Change()
+	End Sub
+
+	Private Sub CbCat_SelectedIndexChanged(sender As Object, e As EventArgs) Handles CbCat.SelectedIndexChanged
+		Change()
+		SetHdVclass()
+		DeclInit()
+	End Sub
+
+	Private Sub TbMassTrailer_TextChanged(sender As Object, e As EventArgs) Handles TbMassExtra.TextChanged
+		SetMaxLoad()
+		Change()
+	End Sub
+
+	Private Sub TbMassMax_TextChanged(sender As Object, e As EventArgs) Handles TbMassMass.TextChanged
+		SetMaxLoad()
+		Change()
+		SetHdVclass()
+		DeclInit()
+	End Sub
+
+	Private Sub CbAxleConfig_SelectedIndexChanged(sender As Object, e As EventArgs) _
+		Handles CbAxleConfig.SelectedIndexChanged
+		Change()
+		SetHdVclass()
+		DeclInit()
+	End Sub
+
+#End Region
+
+	'Update maximum load when truck/trailer mass was changed
+	Private Sub SetMaxLoad()
+		If Not Cfg.DeclMode Then
+			If IsNumeric(TbMass.Text) And IsNumeric(TbMassExtra.Text) And IsNumeric(TbMassMass.Text) Then
+				TbLoadingMax.Text = CStr(CSng(TbMassMass.Text) * 1000 - CSng(TbMass.Text) - CSng(TbMassExtra.Text))
+			Else
+				TbLoadingMax.Text = ""
+			End If
+		End If
+	End Sub
+
+#Region "Axle Configuration"
+
+	Private Sub ButAxlAdd_Click(sender As Object, e As EventArgs) Handles ButAxlAdd.Click
+		Dim lv0 As ListViewItem
+
+		_axlDlog.Clear()
+
+		If _axlDlog.ShowDialog = DialogResult.OK Then
+			lv0 = New ListViewItem
+
+			lv0.SubItems(0).Text = LvRRC.Items.Count + 1
+			lv0.SubItems.Add(Trim(_axlDlog.TbAxleShare.Text))
+			If _axlDlog.CbTwinT.Checked Then
+				lv0.SubItems.Add("yes")
+			Else
+				lv0.SubItems.Add("no")
+			End If
+			lv0.SubItems.Add(Trim(_axlDlog.TbRRC.Text))
+			lv0.SubItems.Add(Trim(_axlDlog.TbFzISO.Text))
+			lv0.SubItems.Add(Trim(_axlDlog.CbWheels.Text))
+			lv0.SubItems.Add(Trim(_axlDlog.TbI_wheels.Text))
+
+			LvRRC.Items.Add(lv0)
+
+			Change()
+			DeclInit()
+
+		End If
+	End Sub
+
+	Private Sub ButAxlRem_Click(sender As Object, e As EventArgs) Handles ButAxlRem.Click
+		RemoveAxleItem()
+	End Sub
+
+	Private Sub LvAxle_DoubleClick(sender As Object, e As EventArgs) Handles LvRRC.DoubleClick
+		EditAxleItem()
+	End Sub
+
+	Private Sub LvAxle_KeyDown(sender As Object, e As KeyEventArgs) Handles LvRRC.KeyDown
+		Select Case e.KeyCode
+			Case Keys.Delete, Keys.Back
+				If Not Cfg.DeclMode Then RemoveAxleItem()
+			Case Keys.Enter
+				EditAxleItem()
+		End Select
+	End Sub
+
+	Private Sub RemoveAxleItem()
+		Dim lv0 As ListViewItem
+		Dim i As Integer
+
+		If LvRRC.SelectedItems.Count = 0 Then
+			If LvRRC.Items.Count = 0 Then
+				Exit Sub
+			Else
+				LvRRC.Items(LvRRC.Items.Count - 1).Selected = True
+			End If
+		End If
+
+		LvRRC.SelectedItems(0).Remove()
+
+		If LvRRC.Items.Count > 0 Then
+
+			i = 0
+			For Each lv0 In LvRRC.Items
+				i += 1
+				lv0.SubItems(0).Text = i.ToString
+			Next
+
+			LvRRC.Items(LvRRC.Items.Count - 1).Selected = True
+			LvRRC.Focus()
+		End If
+
+		Change()
+	End Sub
+
+	Private Sub EditAxleItem()
+		If LvRRC.SelectedItems.Count = 0 Then Exit Sub
+
+		Dim lv0 = LvRRC.SelectedItems(0)
+
+		_axlDlog.TbAxleShare.Text = lv0.SubItems(1).Text
+		_axlDlog.CbTwinT.Checked = (lv0.SubItems(2).Text = "yes")
+		_axlDlog.TbRRC.Text = lv0.SubItems(3).Text
+		_axlDlog.TbFzISO.Text = lv0.SubItems(4).Text
+		_axlDlog.TbI_wheels.Text = lv0.SubItems(6).Text
+		_axlDlog.CbWheels.Text = lv0.SubItems(5).Text
+
+		If _axlDlog.ShowDialog = DialogResult.OK Then
+			lv0.SubItems(1).Text = _axlDlog.TbAxleShare.Text
+			If _axlDlog.CbTwinT.Checked Then
+				lv0.SubItems(2).Text = "yes"
+			Else
+				lv0.SubItems(2).Text = "no"
+			End If
+			lv0.SubItems(3).Text = _axlDlog.TbRRC.Text
+			lv0.SubItems(4).Text = _axlDlog.TbFzISO.Text
+			lv0.SubItems(5).Text = _axlDlog.CbWheels.Text
+			lv0.SubItems(6).Text = _axlDlog.TbI_wheels.Text
+
+			Change()
+			DeclInit()
+		End If
+	End Sub
+
+#End Region
+
+#Region "Open File Context Menu"
+
+
+	Private Sub OpenFiles(ParamArray files() As String)
+		If files.Length = 0 Then Exit Sub
+
+		_cmFiles = files
+		OpenWithToolStripMenuItem.Text = "Open with " & Cfg.OpenCmdName
+		CmOpenFile.Show(Cursor.Position)
+	End Sub
+
+	Private Sub OpenWithToolStripMenuItem_Click(sender As Object, e As EventArgs) _
+		Handles OpenWithToolStripMenuItem.Click
+		If Not FileOpenAlt(_cmFiles(0)) Then MsgBox("Failed to open file!")
+	End Sub
+
+	Private Sub ShowInFolderToolStripMenuItem_Click(sender As Object, e As EventArgs) _
+		Handles ShowInFolderToolStripMenuItem.Click
+		If File.Exists(_cmFiles(0)) Then
+			Try
+				Process.Start("explorer", "/select,""" & _cmFiles(0) & "")
+			Catch ex As Exception
+				MsgBox("Failed to open file!")
+			End Try
+		Else
+			MsgBox("File not found!")
+		End If
+	End Sub
+
+#End Region
+
+
+#Region "Angular Gear"
+
+	Private Sub cbAngularGearType_SelectedIndexChanged(sender As Object, e As EventArgs) _
+		Handles cbAngularGearType.SelectedIndexChanged
+		Select Case cbAngularGearType.SelectedIndex
+			Case 1 'Separate Angular Gear
+				pnAngularGearFields.Enabled = True
+				tbAngularGearRatio.Text = "1.0"
+			Case Else 'Losses included in Transmission, None
+				tbAngularGearRatio.Text = ""
+				tbAngularGearLossMapPath.Text = ""
+				pnAngularGearFields.Enabled = False
+		End Select
+		Change()
+	End Sub
+
+	Private Sub btAngularGearLossMapBrowse_Click(sender As Object, e As EventArgs) Handles btAngularGearLossMapBrowse.Click
+		If fbTLM.OpenDialog(fFileRepl(TbRtPath.Text, fPATH(_vehFile))) Then _
+			tbAngularGearLossMapPath.Text = fFileWoDir(fbTLM.Files(0), fPATH(_vehFile))
+	End Sub
+
+#End Region
+
+	Private Sub cbPTOType_SelectedIndexChanged(sender As Object, e As EventArgs) Handles cbPTOType.SelectedIndexChanged
+
+		If (cbPTOType.SelectedIndex = 0) Then
+			pnPTO.Enabled = False
+			tbPTOLossMap.Text = ""
+		Else
+			pnPTO.Enabled = True
+		End If
+
+		Change()
+	End Sub
+
+	Private Sub btPTOLossMapBrowse_Click(sender As Object, e As EventArgs) Handles btPTOLossMapBrowse.Click
+		If fbPTOLM.OpenDialog(fFileRepl(tbPTOLossMap.Text, fPATH(_vehFile))) Then
+			tbPTOLossMap.Text = fFileWoDir(fbPTOLM.Files(0), fPATH(_vehFile))
 		End If
 	End Sub
-
-#End Region
-
-
-#Region "Angular Gear"
-
-	Private Sub cbAngularGearType_SelectedIndexChanged(sender As Object, e As EventArgs) _
-		Handles cbAngularGearType.SelectedIndexChanged
-		Select Case cbAngularGearType.SelectedIndex
-			Case 1 'Separate Angular Gear
-				pnAngularGearFields.Enabled = True
-				tbAngularGearRatio.Text = "1.0"
-			Case Else 'Losses included in Transmission, None
-				tbAngularGearRatio.Text = ""
-				tbAngularGearLossMapPath.Text = ""
-				pnAngularGearFields.Enabled = False
-		End Select
-		Change()
-	End Sub
-
-	Private Sub btAngularGearLossMapBrowse_Click(sender As Object, e As EventArgs) Handles btAngularGearLossMapBrowse.Click
-		If fbTLM.OpenDialog(fFileRepl(TbRtPath.Text, fPATH(_vehFile))) Then _
-			tbAngularGearLossMapPath.Text = fFileWoDir(fbTLM.Files(0), fPATH(_vehFile))
-	End Sub
-
-#End Region
-End Class
-
+End Class
+
diff --git a/VECTO/Input Files/cVEH.vb b/VECTO/Input Files/cVEH.vb
index 456aeb9cbf53d2d22662de0d3d1d2e8114a80d37..e346fac8912329e38f6f4b3150f544366df0f383 100644
--- a/VECTO/Input Files/cVEH.vb	
+++ b/VECTO/Input Files/cVEH.vb	
@@ -62,6 +62,8 @@ Public Class cVEH
 	Public AngularGearRatio As Single
 	Public AngularGearLossMapFile As cSubPath
 
+	Public PTOType As tPTOType
+	Public PTOLossMap As cSubPath
 
 	Public Class cAxle
 		Public RRC As Single
@@ -105,6 +107,7 @@ Public Class cVEH
 		RtnU = New List(Of Single)
 		RtM = New List(Of Single)
 		Axles = New List(Of cAxle)
+		PTOLossMap = New cSubPath()
 		SetDefault()
 	End Sub
 
@@ -129,12 +132,14 @@ Public Class cVEH
 		RtnU.Clear()
 		RtM.Clear()
 		RtFile.Clear()
-		AngularGearLossMapFile.Clear()
 
 		AngularGearType = AngularGearType.None
 		AngularGearLossMapFile.Clear()
 		AngularGearRatio = 1
 
+		PTOType = tPTOType.None
+		PTOLossMap.Clear()
+
 		Axles.Clear()
 		VehCat = tVehCat.Undef
 		MassMax = 0
@@ -263,6 +268,23 @@ Public Class cVEH
 				Axles.Add(axle)
 			Next
 
+			PTOType = tPTOType.None
+			If Not body("PTO") Is Nothing Then
+				Dim ptoStr = body("PTO")("Type")
+
+				If String.IsNullOrWhiteSpace(ptoStr) Then
+					PTOType = tPTOType.None
+					WorkerMsg(tMsgID.Normal, "PTO automatically updated to '" + PTOType + "'", msgSrc)
+				Else
+					PTOType = GetPTOType(ptoStr)
+				End If
+
+			End If
+
+			If Not PTOType = tPTOType.None Then
+				PTOLossMap.Init(MyPath, body("PTO")("LossMap"))
+			End If
+
 		Catch ex As Exception
 			If showMsg Then WorkerMsg(tMsgID.Err, "Failed to read Vehicle file! " & ex.Message, msgSrc)
 			Return False
@@ -304,6 +326,9 @@ Public Class cVEH
 				{"Type", AngularGearType.ToString()},
 				{"Ratio", AngularGearRatio},
 				{"LossMap", AngularGearLossMapFile.PathOrDummy}}},
+			{"PTO", New Dictionary(Of String, Object) From {
+				{"Type", GetPTOString(PTOType)},
+				{"LossMap", PTOLossMap.PathOrDummy}}},
 			{"AxleConfig", New Dictionary(Of String, Object) From {
 				{"Type", ConvAxleConf(AxleConf)},
 				{"Axles", (From axle In Axles Select New Dictionary(Of String, Object) From {
diff --git a/VECTO/VECTO_Types.vb b/VECTO/VECTO_Types.vb
index bc848ef2b4444c664fae04091743bcd4c78e5eba..851c327bbe38d4015618be9477ef961277ff6f37 100644
--- a/VECTO/VECTO_Types.vb
+++ b/VECTO/VECTO_Types.vb
@@ -8,6 +8,10 @@
 '   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
+
+Imports System.Collections.Generic
+Imports System.Linq
 Imports System.Runtime.CompilerServices
 
 ''' <summary>
@@ -154,6 +158,58 @@ Public Enum tAxleConf As Integer
 	a8x8 = 9
 End Enum
 
+
+Public Enum tPTOType
+	None = 0
+	OnlyDriveShaftShiftClawSynchronizerSchieberad = 1
+	OnlyDriveShaftMultiDiscClutch = 2
+	OnlyDriveShaftMultiDiscClutchOilPump = 3
+	DriveShaftUpTo2GearWheelsShiftClawSynchronizerSchieberad = 4
+	DriveShaftUpTo2GearWheelsMultiDiscClutch = 5
+	DriveShaftUpTo2GearWheelsMultiDiscClutchOilPump = 6
+	DriveShaftMoreThan2GearWheelsShiftClawSynchronizerSchieberad = 7
+	DriveShaftMoreThan2GearWheelsMultiDiscClutch = 8
+	DriveShaftMoreThan2GearWheelsMultiDiscClutchOilPump = 9
+End Enum
+
+Module PTOType
+	Public ReadOnly PtoTypeStrings As New Dictionary(Of tPTOType, String) From {
+		{tPTOType.None, "None"},
+		{tPTOType.OnlyDriveShaftShiftClawSynchronizerSchieberad,
+		"only the drive shaft of the PTO - shift claw, synchronizer, Schieberad"},
+		{tPTOType.OnlyDriveShaftMultiDiscClutch, "only the drive shaft of the PTO - multi-disc clutch"},
+		{tPTOType.OnlyDriveShaftMultiDiscClutchOilPump, "only the drive shaft of the PTO - multi-disc clutch, oil pump"},
+		{tPTOType.DriveShaftUpTo2GearWheelsShiftClawSynchronizerSchieberad,
+		"drive shaft and/or up to 2 gear wheels - shift claw, synchronizer, Schieberad"},
+		{tPTOType.DriveShaftUpTo2GearWheelsMultiDiscClutch, "drive shaft and/or up to 2 gear wheels - multi-disc clutch"},
+		{tPTOType.DriveShaftUpTo2GearWheelsMultiDiscClutchOilPump,
+		"drive shaft and/or up to 2 gear wheels - multi-disc clutch, oil pump"},
+		{tPTOType.DriveShaftMoreThan2GearWheelsShiftClawSynchronizerSchieberad,
+		"drive shaft and/or more than 2 gear wheels - shift claw, synchronizer, Schieberad"},
+		{tPTOType.DriveShaftMoreThan2GearWheelsMultiDiscClutch,
+		"drive shaft and/or more than 2 gear wheels - multi-disc clutch"},
+		{tPTOType.DriveShaftMoreThan2GearWheelsMultiDiscClutchOilPump,
+		"drive shaft and/or more than 2 gear wheels - multi-disc clutch, oil pump"}
+		}
+
+
+	Public Function GetPTOString(p As tPTOType) As String
+		If Not PtoTypeStrings.ContainsKey(p) Then
+			Return PtoTypeStrings(tPTOType.None)
+		Else
+			Return PtoTypeStrings(p)
+		End If
+	End Function
+
+	Public Function GetPTOType(p As String) As tPTOType
+		If Not PtoTypeStrings.ContainsValue(p) Then
+			Return tPTOType.None
+		End If
+		Return PtoTypeStrings.ToDictionary(Function(pair) pair.Value, Function(pair) pair.Key)(p)
+	End Function
+End Module
+
+
 Public Enum tLoading
 	FullLoaded
 	EmptyLoaded
diff --git a/VectoCore/VectoCore/JsonKeys.Designer.cs b/VectoCore/VectoCore/JsonKeys.Designer.cs
index f73bb2606bc49ea29cb432ec64145899d25d05ce..7d0b2c195f7c03ebdc1cd1a392463a911dc6680e 100644
--- a/VectoCore/VectoCore/JsonKeys.Designer.cs
+++ b/VectoCore/VectoCore/JsonKeys.Designer.cs
@@ -727,7 +727,7 @@ namespace TUGraz.VectoCore {
         }
         
         /// <summary>
-        ///   Looks up a localized string similar to PTOTransmission.
+        ///   Looks up a localized string similar to PTO.
         /// </summary>
         internal static string Vehicle_PTO {
             get {
diff --git a/VectoCore/VectoCore/JsonKeys.resx b/VectoCore/VectoCore/JsonKeys.resx
index d08053e9f0eb377714c58e6b67482878936e4ba4..d7fc848dd831eb2edc44afb99383cdcf476f1d50 100644
--- a/VectoCore/VectoCore/JsonKeys.resx
+++ b/VectoCore/VectoCore/JsonKeys.resx
@@ -174,7 +174,7 @@
     <value>File</value>
   </data>
 	<data name="Vehicle_PTO" xml:space="preserve">
-    <value>PTOTransmission</value>
+    <value>PTO</value>
   </data>
 	<data name="Vehicle_PTO_LossMapFile" xml:space="preserve">
     <value>LossMap</value>