From 7d60ab1e12697bd51314481e71d64e8153c7cfdd Mon Sep 17 00:00:00 2001
From: Markus Quaritsch <markus.quaritsch@tugraz.at>
Date: Thu, 8 Nov 2018 13:56:47 +0100
Subject: [PATCH] adding vocational flag to segment lookup, additional tests
 for vocational vehicle groups

---
 VECTO/Input Files/Vehicle.vb                  | 172 +++---
 .../EngineeringDataAdapter.cs                 |   4 +-
 .../DeclarationModeVectoRunDataFactory.cs     |  38 +-
 .../DeclarationVTPModeVectoRunDataFactory.cs  |   3 +-
 .../Models/Declaration/LookupData.cs          |   6 +
 .../VectoCore/Models/Declaration/Mission.cs   |   4 +-
 .../VectoCore/Models/Declaration/Segments.cs  |  30 +-
 .../Models/Declaration/DeclarationDataTest.cs | 491 +++++++++++++-----
 8 files changed, 505 insertions(+), 243 deletions(-)

diff --git a/VECTO/Input Files/Vehicle.vb b/VECTO/Input Files/Vehicle.vb
index df47550b81..dac5eaf3da 100644
--- a/VECTO/Input Files/Vehicle.vb	
+++ b/VECTO/Input Files/Vehicle.vb	
@@ -104,7 +104,7 @@ Public Class Vehicle
 			If mode = ExecutionMode.Declaration Then
 				Dim doa As DeclarationDataAdapter = New DeclarationDataAdapter()
 				Dim segment As Segment = DeclarationData.Segments.Lookup(vehicle.VehicleCategory, vehicle.AxleConfiguration,
-																		vehicle.GrossVehicleMassRating, vehicle.CurbMassChassis)
+																		vehicle.GrossVehicleMassRating, vehicle.CurbMassChassis, false)
 				vehicleData = doa.CreateVehicleData(vehicle, segment.Missions.First(),
 													segment.Missions.First().Loadings.First().Value, segment.MunicipalBodyWeight)
 				airdragData = doa.CreateAirdragData(vehicle, segment.Missions.First(), segment)
@@ -320,13 +320,13 @@ Public Class Vehicle
 		End Get
 	End Property
 
-    Public ReadOnly Property ExemptedVehicle As Boolean Implements IVehicleDeclarationInputData.ExemptedVehicle
-    get
-            Return false
-    End Get
-    End Property
+	Public ReadOnly Property ExemptedVehicle As Boolean Implements IVehicleDeclarationInputData.ExemptedVehicle
+	get
+			Return false
+	End Get
+	End Property
 
-    Public ReadOnly Property VIN As String Implements IVehicleDeclarationInputData.VIN
+	Public ReadOnly Property VIN As String Implements IVehicleDeclarationInputData.VIN
 		Get
 			Return "N.A."
 		End Get
@@ -347,7 +347,7 @@ Public Class Vehicle
 	Public ReadOnly Property GrossVehicleMassRating As Kilogram _
 		Implements IVehicleDeclarationInputData.GrossVehicleMassRating
 		Get
-            		Return MassMax.SI(Unit.SI.Ton).Cast(Of Kilogram)()
+					Return MassMax.SI(Unit.SI.Ton).Cast(Of Kilogram)()
 		End Get
 	End Property
 
@@ -420,7 +420,7 @@ Public Class Vehicle
 	Public ReadOnly Property IVehicleEngineeringInputData_DynamicTyreRadius As Meter _
 		Implements IVehicleEngineeringInputData.DynamicTyreRadius
 		Get
-           		Return DynamicTyreRadius.SI(Unit.SI.Milli.Meter).Cast(Of Meter)()
+				Return DynamicTyreRadius.SI(Unit.SI.Milli.Meter).Cast(Of Meter)()
 		End Get
 	End Property
 
@@ -652,81 +652,81 @@ Public Class Vehicle
 		End Get
 	End Property
 
-    Public ReadOnly Property VocationalVehicle As Boolean Implements IVehicleDeclarationInputData.VocationalVehicle
-    get
-            Return DeclarationData.Vehicle.VocationalVehicleDefault
-    End Get
-    End Property
-
-    Public ReadOnly Property SleeperCab As Boolean Implements IVehicleDeclarationInputData.SleeperCab
-    get
-            Return DeclarationData.Vehicle.SleeperCabDefault
-    End Get
-    End Property
-
-    Public ReadOnly Property TankSystem As NgTankSystem Implements IVehicleDeclarationInputData.TankSystem
-    get
-            Return DeclarationData.Vehicle.NgTankSystemDefault
-    End Get
-    End Property
-
-    Public ReadOnly Property ADAS As IAdvancedDriverAssistantSystemDeclarationInputData Implements IVehicleDeclarationInputData.ADAS
-    get
-            return Me
-    End Get
-    End Property
-
-    Public ReadOnly Property ZeroEmissionVehicle As Boolean Implements IVehicleDeclarationInputData.ZeroEmissionVehicle
-    get
-            Return DeclarationData.Vehicle.ZeroEmissionVehicleDefault
-    End Get
-    End Property
-
-    Public ReadOnly Property HybridElectricHDV As Boolean Implements IVehicleDeclarationInputData.HybridElectricHDV
-    get
-            return DeclarationData.Vehicle.HybridElectricHDVDefault
-    End Get
-    End Property
-
-    Public ReadOnly Property DualFuelVehicle As Boolean Implements IVehicleDeclarationInputData.DualFuelVehicle
-    get
-            return DeclarationData.Vehicle.DualFuelVehicleDefault
-    End Get
-    End Property
-
-    Public ReadOnly Property MaxNetPower1 As Watt Implements IVehicleDeclarationInputData.MaxNetPower1
-    get
-            Return Nothing
-    End Get
-    End Property
-
-    Public ReadOnly Property MaxNetPower2 As Watt Implements IVehicleDeclarationInputData.MaxNetPower2
-    get
-            Return Nothing
-    End Get
-    End Property
-
-    Public ReadOnly Property EngineStopStart As Boolean Implements IAdvancedDriverAssistantSystemDeclarationInputData.EngineStopStart
-    get
-            return DeclarationData.Vehicle.ADAS.EngineStopStartDefault
-    End Get
-    End Property
-
-    Public ReadOnly Property EcoRollWitoutEngineStop As Boolean Implements IAdvancedDriverAssistantSystemDeclarationInputData.EcoRollWitoutEngineStop
-    get
-            return DeclarationData.Vehicle.ADAS.EcoRollWitoutEngineStop
-    End Get
-    End Property
-
-    Public ReadOnly Property EcoRollWithEngineStop As Boolean Implements IAdvancedDriverAssistantSystemDeclarationInputData.EcoRollWithEngineStop
-    get
-            Return DeclarationData.Vehicle.ADAS.EcoRollWithEngineStop
-    End Get
-    End Property
-
-    Public ReadOnly Property PredictiveCruiseControl As PredictiveCruiseControlType Implements IAdvancedDriverAssistantSystemDeclarationInputData.PredictiveCruiseControl
-    get
-            Return DeclarationData.Vehicle.ADAS.PredictiveCruiseControlDefault
-    End Get
-    End Property
+	Public ReadOnly Property VocationalVehicle As Boolean Implements IVehicleDeclarationInputData.VocationalVehicle
+	get
+			Return DeclarationData.Vehicle.VocationalVehicleDefault
+	End Get
+	End Property
+
+	Public ReadOnly Property SleeperCab As Boolean Implements IVehicleDeclarationInputData.SleeperCab
+	get
+			Return DeclarationData.Vehicle.SleeperCabDefault
+	End Get
+	End Property
+
+	Public ReadOnly Property TankSystem As NgTankSystem Implements IVehicleDeclarationInputData.TankSystem
+	get
+			Return DeclarationData.Vehicle.NgTankSystemDefault
+	End Get
+	End Property
+
+	Public ReadOnly Property ADAS As IAdvancedDriverAssistantSystemDeclarationInputData Implements IVehicleDeclarationInputData.ADAS
+	get
+			return Me
+	End Get
+	End Property
+
+	Public ReadOnly Property ZeroEmissionVehicle As Boolean Implements IVehicleDeclarationInputData.ZeroEmissionVehicle
+	get
+			Return DeclarationData.Vehicle.ZeroEmissionVehicleDefault
+	End Get
+	End Property
+
+	Public ReadOnly Property HybridElectricHDV As Boolean Implements IVehicleDeclarationInputData.HybridElectricHDV
+	get
+			return DeclarationData.Vehicle.HybridElectricHDVDefault
+	End Get
+	End Property
+
+	Public ReadOnly Property DualFuelVehicle As Boolean Implements IVehicleDeclarationInputData.DualFuelVehicle
+	get
+			return DeclarationData.Vehicle.DualFuelVehicleDefault
+	End Get
+	End Property
+
+	Public ReadOnly Property MaxNetPower1 As Watt Implements IVehicleDeclarationInputData.MaxNetPower1
+	get
+			Return Nothing
+	End Get
+	End Property
+
+	Public ReadOnly Property MaxNetPower2 As Watt Implements IVehicleDeclarationInputData.MaxNetPower2
+	get
+			Return Nothing
+	End Get
+	End Property
+
+	Public ReadOnly Property EngineStopStart As Boolean Implements IAdvancedDriverAssistantSystemDeclarationInputData.EngineStopStart
+	get
+			return DeclarationData.Vehicle.ADAS.EngineStopStartDefault
+	End Get
+	End Property
+
+	Public ReadOnly Property EcoRollWitoutEngineStop As Boolean Implements IAdvancedDriverAssistantSystemDeclarationInputData.EcoRollWitoutEngineStop
+	get
+			return DeclarationData.Vehicle.ADAS.EcoRollWitoutEngineStop
+	End Get
+	End Property
+
+	Public ReadOnly Property EcoRollWithEngineStop As Boolean Implements IAdvancedDriverAssistantSystemDeclarationInputData.EcoRollWithEngineStop
+	get
+			Return DeclarationData.Vehicle.ADAS.EcoRollWithEngineStop
+	End Get
+	End Property
+
+	Public ReadOnly Property PredictiveCruiseControl As PredictiveCruiseControlType Implements IAdvancedDriverAssistantSystemDeclarationInputData.PredictiveCruiseControl
+	get
+			Return DeclarationData.Vehicle.ADAS.PredictiveCruiseControlDefault
+	End Get
+	End Property
 End Class
diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/EngineeringDataAdapter.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/EngineeringDataAdapter.cs
index 9383a10b70..df48694c60 100644
--- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/EngineeringDataAdapter.cs
+++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/EngineeringDataAdapter.cs
@@ -96,9 +96,9 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter
 					break;
 				case CrossWindCorrectionMode.DeclarationModeCorrection:
 					var airDragArea = airdragData.AirDragArea ??
-									DeclarationData.Segments.LookupCdA(data.VehicleCategory, data.AxleConfiguration, data.GrossVehicleMassRating);
+									DeclarationData.Segments.LookupCdA(data.VehicleCategory, data.AxleConfiguration, data.GrossVehicleMassRating, false);
 					var height = data.Height ?? DeclarationData.Segments.LookupHeight(data.VehicleCategory, data.AxleConfiguration,
-						data.GrossVehicleMassRating);
+						data.GrossVehicleMassRating, false);
 					retVal.CrossWindCorrectionCurve = new CrosswindCorrectionCdxALookup(airDragArea,
 						DeclarationDataAdapter.GetDeclarationAirResistanceCurve(
 							GetAirdragParameterSet(data.VehicleCategory, data.AxleConfiguration, data.Axles.Count), airDragArea, height),
diff --git a/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationModeVectoRunDataFactory.cs b/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationModeVectoRunDataFactory.cs
index a50d9c2421..fed55d5875 100644
--- a/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationModeVectoRunDataFactory.cs
+++ b/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationModeVectoRunDataFactory.cs
@@ -88,33 +88,35 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl
 		private void Initialize()
 		{
 			_dao = new DeclarationDataAdapter();
-			_segment = GetVehicleClassification(InputDataProvider.JobInputData.Vehicle.VehicleCategory,
-				InputDataProvider.JobInputData.Vehicle.AxleConfiguration,
-				InputDataProvider.JobInputData.Vehicle.GrossVehicleMassRating,
-				InputDataProvider.JobInputData.Vehicle.CurbMassChassis);
+			var vehicle = InputDataProvider.JobInputData.Vehicle;
+			_segment = GetVehicleClassification(vehicle.VehicleCategory,
+				vehicle.AxleConfiguration,
+				vehicle.GrossVehicleMassRating,
+				vehicle.CurbMassChassis,
+				vehicle.VocationalVehicle);
 			if (!_segment.Found) {
 				throw new VectoException(
 					"no segment found for vehicle configruation: vehicle category: {0}, axle configuration: {1}, GVMR: {2}",
-					InputDataProvider.JobInputData.Vehicle.VehicleCategory, InputDataProvider.JobInputData.Vehicle.AxleConfiguration,
-					InputDataProvider.JobInputData.Vehicle.GrossVehicleMassRating);
+					vehicle.VehicleCategory, vehicle.AxleConfiguration,
+					vehicle.GrossVehicleMassRating);
 			}
 			_driverdata = _dao.CreateDriverData();
 			_driverdata.AccelerationCurve = AccelerationCurveReader.ReadFromStream(_segment.AccelerationFile);
-			var tempVehicle = _dao.CreateVehicleData(InputDataProvider.JobInputData.Vehicle, _segment.Missions.First(),
+			var tempVehicle = _dao.CreateVehicleData(vehicle, _segment.Missions.First(),
 				_segment.Missions.First().Loadings.First().Value, _segment.MunicipalBodyWeight);
-			_airdragData = _dao.CreateAirdragData(InputDataProvider.JobInputData.Vehicle.AirdragInputData,
+			_airdragData = _dao.CreateAirdragData(vehicle.AirdragInputData,
 				_segment.Missions.First(), _segment);
-			_engineData = _dao.CreateEngineData(InputDataProvider.JobInputData.Vehicle.EngineInputData,
-				InputDataProvider.JobInputData.Vehicle.EngineIdleSpeed,
-				InputDataProvider.JobInputData.Vehicle.GearboxInputData, InputDataProvider.JobInputData.Vehicle.TorqueLimits);
-			_axlegearData = _dao.CreateAxleGearData(InputDataProvider.JobInputData.Vehicle.AxleGearInputData, false);
-			_angledriveData = _dao.CreateAngledriveData(InputDataProvider.JobInputData.Vehicle.AngledriveInputData, false);
-			_gearboxData = _dao.CreateGearboxData(InputDataProvider.JobInputData.Vehicle.GearboxInputData, _engineData,
+			_engineData = _dao.CreateEngineData(vehicle.EngineInputData,
+				vehicle.EngineIdleSpeed,
+				vehicle.GearboxInputData, vehicle.TorqueLimits);
+			_axlegearData = _dao.CreateAxleGearData(vehicle.AxleGearInputData, false);
+			_angledriveData = _dao.CreateAngledriveData(vehicle.AngledriveInputData, false);
+			_gearboxData = _dao.CreateGearboxData(vehicle.GearboxInputData, _engineData,
 				_axlegearData.AxleGear.Ratio,
 				tempVehicle.DynamicTyreRadius, tempVehicle.VehicleCategory, false);
-			_retarderData = _dao.CreateRetarderData(InputDataProvider.JobInputData.Vehicle.RetarderInputData);
+			_retarderData = _dao.CreateRetarderData(vehicle.RetarderInputData);
 
-			_ptoTransmissionData = _dao.CreatePTOTransmissionData(InputDataProvider.JobInputData.Vehicle.PTOTransmissionInputData);
+			_ptoTransmissionData = _dao.CreatePTOTransmissionData(vehicle.PTOTransmissionInputData);
 
 			_municipalPtoTransmissionData = CreateDefaultPTOData();
 		}
@@ -210,9 +212,9 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl
 		}
 
 		internal Segment GetVehicleClassification(VehicleCategory category, AxleConfiguration axles, Kilogram grossMassRating,
-			Kilogram curbWeight)
+			Kilogram curbWeight, bool vocational)
 		{
-			return DeclarationData.Segments.Lookup(category, axles, grossMassRating, curbWeight);
+			return DeclarationData.Segments.Lookup(category, axles, grossMassRating, curbWeight, vocational);
 		}
 	}
 }
diff --git a/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationVTPModeVectoRunDataFactory.cs b/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationVTPModeVectoRunDataFactory.cs
index c76a1a3c04..60ef0fe048 100644
--- a/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationVTPModeVectoRunDataFactory.cs
+++ b/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationVTPModeVectoRunDataFactory.cs
@@ -115,7 +115,8 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl
 				vehicle.VehicleCategory,
 				vehicle.AxleConfiguration,
 				vehicle.GrossVehicleMassRating,
-				vehicle.CurbMassChassis);
+				vehicle.CurbMassChassis,
+				vehicle.VocationalVehicle);
 			_driverdata = _dao.CreateDriverData();
 			_driverdata.AccelerationCurve = AccelerationCurveReader.ReadFromStream(_segment.AccelerationFile);
 			var tempVehicle = _dao.CreateVehicleData(
diff --git a/VectoCore/VectoCore/Models/Declaration/LookupData.cs b/VectoCore/VectoCore/Models/Declaration/LookupData.cs
index 18a24da2aa..7c5b2ad730 100644
--- a/VectoCore/VectoCore/Models/Declaration/LookupData.cs
+++ b/VectoCore/VectoCore/Models/Declaration/LookupData.cs
@@ -116,4 +116,10 @@ namespace TUGraz.VectoCore.Models.Declaration
 	{
 		public abstract TValue Lookup(TKey1 key1, TKey2 key2, TKey3 key3, TKey4 key4);
 	}
+
+	public abstract class LookupData<TKey1, TKey2, TKey3, TKey4, TKey5, TValue> : LookupData where TValue : struct
+	{
+		public abstract TValue Lookup(TKey1 key1, TKey2 key2, TKey3 key3, TKey4 key4, TKey5 key5);
+	}
+
 }
\ No newline at end of file
diff --git a/VectoCore/VectoCore/Models/Declaration/Mission.cs b/VectoCore/VectoCore/Models/Declaration/Mission.cs
index e0b15c2687..dece38c903 100644
--- a/VectoCore/VectoCore/Models/Declaration/Mission.cs
+++ b/VectoCore/VectoCore/Models/Declaration/Mission.cs
@@ -91,7 +91,9 @@ namespace TUGraz.VectoCore.Models.Declaration
 		T1,
 		T2,
 		ST1,
-		Dolly
+		Dolly,
+		STT1,
+		STT2
 	}
 
 	public static class TrailterTypeHelper
diff --git a/VectoCore/VectoCore/Models/Declaration/Segments.cs b/VectoCore/VectoCore/Models/Declaration/Segments.cs
index 53a29d8f79..e261435519 100644
--- a/VectoCore/VectoCore/Models/Declaration/Segments.cs
+++ b/VectoCore/VectoCore/Models/Declaration/Segments.cs
@@ -42,7 +42,7 @@ using TUGraz.VectoCore.Utils;
 
 namespace TUGraz.VectoCore.Models.Declaration
 {
-	public sealed class Segments : LookupData<VehicleCategory, AxleConfiguration, Kilogram, Kilogram, Segment>
+	public sealed class Segments : LookupData<VehicleCategory, AxleConfiguration, Kilogram, Kilogram, bool, Segment>
 	{
 		private DataTable _segmentTable;
 
@@ -65,9 +65,9 @@ namespace TUGraz.VectoCore.Models.Declaration
 		}
 
 		public override Segment Lookup(VehicleCategory vehicleCategory, AxleConfiguration axleConfiguration,
-			Kilogram grossVehicleMassRating, Kilogram curbWeight)
+			Kilogram grossVehicleMassRating, Kilogram curbWeight, bool vocational)
 		{
-			return Lookup(vehicleCategory, axleConfiguration, grossVehicleMassRating, curbWeight, false);
+			return Lookup(vehicleCategory, axleConfiguration, grossVehicleMassRating, curbWeight, vocational, false);
 		}
 
 		public VehicleCategory[] GetVehicleCategories(bool declarationOnly = true)
@@ -82,10 +82,10 @@ namespace TUGraz.VectoCore.Models.Declaration
 		}
 
 		public Segment Lookup(VehicleCategory vehicleCategory, AxleConfiguration axleConfiguration,
-			Kilogram grossVehicleMassRating, Kilogram curbWeight, bool considerInvalid)
+			Kilogram grossVehicleMassRating, Kilogram curbWeight, bool vocational, bool considerInvalid)
 		{
 
-			var row = GetSegmentDataRow(vehicleCategory, axleConfiguration, grossVehicleMassRating, considerInvalid);
+			var row = GetSegmentDataRow(vehicleCategory, axleConfiguration, grossVehicleMassRating, vocational, considerInvalid);
 			if (row == null) {
 				return new Segment() { Found = false };
 			}
@@ -101,7 +101,7 @@ namespace TUGraz.VectoCore.Models.Declaration
 					RessourceHelper.ReadStream(DeclarationData.DeclarationDataResourcePrefix + ".VACC." +
 												row.Field<string>(".vaccfile")),
 				Missions = CreateMissions(ref grossVehicleMassRating, curbWeight, row),
-				VehicleHeight = LookupHeight(vehicleCategory, axleConfiguration, grossVehicleMassRating),
+				VehicleHeight = LookupHeight(vehicleCategory, axleConfiguration, grossVehicleMassRating, vocational),
 				DesignSpeed = row.ParseDouble("designspeed").KMPHtoMeterPerSecond(),
 				GrossVehicleMassRating = grossVehicleMassRating,
 				CdADefault = string.IsNullOrEmpty(row["cdxa_default"].ToString()) ? null : row.ParseDouble("cdxa_default").SI<SquareMeter>(),
@@ -117,17 +117,19 @@ namespace TUGraz.VectoCore.Models.Declaration
 		}
 
 		private DataRow GetSegmentDataRow(VehicleCategory vehicleCategory, AxleConfiguration axleConfiguration,
-			Kilogram grossVehicleMassRating, bool considerInvalid)
+			Kilogram grossVehicleMassRating, bool vocational, bool considerInvalid)
 		{
 			DataRow row;
 			try {
 				row = _segmentTable.AsEnumerable().First(r => {
 					var isValid = r.Field<string>("valid");
+					var isVocational = r.Field<string>("vocational").ToBoolean();
 					var category = r.Field<string>("vehiclecategory");
 					var axleConf = r.Field<string>("axleconf.");
 				    var massMin = r.ParseDouble("gvw_min").SI(Unit.SI.Ton);
 				    var massMax = r.ParseDouble("gvw_max").SI(Unit.SI.Ton);
 					return (considerInvalid || isValid == "1")
+							&& vocational == isVocational
 							&& category == vehicleCategory.ToString()
 							&& axleConf == axleConfiguration.GetName()
 							&& grossVehicleMassRating > massMin && grossVehicleMassRating <= massMax;
@@ -143,9 +145,9 @@ namespace TUGraz.VectoCore.Models.Declaration
 		}
 
 		public Meter LookupHeight(VehicleCategory vehicleCategory, AxleConfiguration axleConfiguration,
-			Kilogram grossVehicleMassRating)
+			Kilogram grossVehicleMassRating, bool vocational)
 		{
-			var row = GetSegmentDataRow(vehicleCategory, axleConfiguration, grossVehicleMassRating, true);
+			var row = GetSegmentDataRow(vehicleCategory, axleConfiguration, grossVehicleMassRating, vocational, true);
 
 			var vehicleHeight = row.ParseDouble("height").SI<Meter>();
 			var vehicleClass = VehicleClassHelper.Parse(row.Field<string>("hdvclass"));
@@ -170,9 +172,9 @@ namespace TUGraz.VectoCore.Models.Declaration
 		/// Looks up the default CdxA value for the cross wind correction.
 		/// </summary>
 		public SquareMeter LookupCdA(VehicleCategory vehicleCategory, AxleConfiguration axleConfiguration,
-			Kilogram grossVehicleMassRating)
+			Kilogram grossVehicleMassRating, bool vocational)
 		{
-			var row = GetSegmentDataRow(vehicleCategory, axleConfiguration, grossVehicleMassRating, true);
+			var row = GetSegmentDataRow(vehicleCategory, axleConfiguration, grossVehicleMassRating, vocational, true);
 			return row.SI<SquareMeter>("cdxa_default");
 		}
 
@@ -181,7 +183,8 @@ namespace TUGraz.VectoCore.Models.Declaration
 			var missionTypes = Enum.GetValues(typeof(MissionType)).Cast<MissionType>();
 			var missions = new List<Mission>();
 			foreach (var missionType in missionTypes.Where(m => m.IsDeclarationMission() && row.Field<string>(m.ToString()) != "-")) {
-				var body = DeclarationData.StandardBodies.Lookup(row.Field<string>("body"));
+				var bodyColumn = missionType == MissionType.Construction ? "bodyconstruction" : "body";
+				var body = DeclarationData.StandardBodies.Lookup(row.Field<string>(bodyColumn));
 
 				var maxGVW = Constants.SimulationSettings.MaximumGrossVehicleWeight;
 				var trailers = new List<MissionTrailer>();
@@ -197,7 +200,8 @@ namespace TUGraz.VectoCore.Models.Declaration
 						trailerWeightShares.Select((t, i) => CreateTrailer(trailerList[i], t.ToDouble() / 100.0, i == 0)));
 				} else {
 					if (ShouldTrailerBeUsed(row, missionType)) {
-						var trailerValue = row.Field<string>("trailer");
+						var trailerColumn = missionType == MissionType.Construction ? "trailerconstruction" : "trailer";
+						var trailerValue = row.Field<string>(trailerColumn);
 						if (string.IsNullOrWhiteSpace(trailerValue)) {
 							throw new VectoException("Error in segmentation table: trailer weight share is defined but not trailer type!");
 						}
diff --git a/VectoCore/VectoCoreTest/Models/Declaration/DeclarationDataTest.cs b/VectoCore/VectoCoreTest/Models/Declaration/DeclarationDataTest.cs
index 15e331f5e1..4a692c600d 100644
--- a/VectoCore/VectoCoreTest/Models/Declaration/DeclarationDataTest.cs
+++ b/VectoCore/VectoCoreTest/Models/Declaration/DeclarationDataTest.cs
@@ -562,7 +562,8 @@ namespace TUGraz.VectoCore.Tests.Models.Declaration
 					VehicleCategory.RigidTruck,
 					AxleConfiguration.AxleConfig_4x2,
 					weight.SI<Kilogram>(),
-					0.SI<Kilogram>()),
+					0.SI<Kilogram>(),
+					false),
 				string.Format("ERROR: Could not find the declaration segment for vehicle. Category: {0}, AxleConfiguration: {1}, GrossVehicleWeight: {2}", VehicleCategory.RigidTruck, AxleConfiguration.AxleConfig_4x2.GetName(), weight.SI<Kilogram>()));
 		}
 
@@ -579,108 +580,121 @@ namespace TUGraz.VectoCore.Tests.Models.Declaration
 					VehicleCategory.RigidTruck,
 					AxleConfiguration.AxleConfig_4x4,
 					weight.SI<Kilogram>(),
-					0.SI<Kilogram>()),
+					0.SI<Kilogram>(),
+					false),
 					string.Format("ERROR: Could not find the declaration segment for vehicle. Category: {0}, AxleConfiguration: {1}, GrossVehicleWeight: {2}", VehicleCategory.RigidTruck, AxleConfiguration.AxleConfig_4x4.GetName(), weight.SI<Kilogram>()));
 		}
 
 		[Test,
-		TestCase(VehicleCategory.RigidTruck, AxleConfiguration.AxleConfig_4x2, 7500.01, 0, VehicleClass.Class1),
-		TestCase(VehicleCategory.Tractor, AxleConfiguration.AxleConfig_4x2, 7500.01, 0, VehicleClass.Class1),
-		TestCase(VehicleCategory.RigidTruck, AxleConfiguration.AxleConfig_4x2, 10000, 0, VehicleClass.Class1),
-		TestCase(VehicleCategory.Tractor, AxleConfiguration.AxleConfig_4x2, 10000, 0, VehicleClass.Class1),
-		TestCase(VehicleCategory.RigidTruck, AxleConfiguration.AxleConfig_4x2, 10001, 0, VehicleClass.Class2),
-		TestCase(VehicleCategory.Tractor, AxleConfiguration.AxleConfig_4x2, 10001, 0, VehicleClass.Class2),
-		TestCase(VehicleCategory.RigidTruck, AxleConfiguration.AxleConfig_4x2, 12000, 0, VehicleClass.Class2),
-		TestCase(VehicleCategory.Tractor, AxleConfiguration.AxleConfig_4x2, 12000, 0, VehicleClass.Class2),
-		TestCase(VehicleCategory.RigidTruck, AxleConfiguration.AxleConfig_4x2, 12001, 0, VehicleClass.Class3),
-		TestCase(VehicleCategory.Tractor, AxleConfiguration.AxleConfig_4x2, 12001, 0, VehicleClass.Class3),
-		TestCase(VehicleCategory.RigidTruck, AxleConfiguration.AxleConfig_4x2, 16000, 0, VehicleClass.Class3),
-		TestCase(VehicleCategory.Tractor, AxleConfiguration.AxleConfig_4x2, 16000, 0, VehicleClass.Class3),
-		TestCase(VehicleCategory.RigidTruck, AxleConfiguration.AxleConfig_4x2, 16001, 0, VehicleClass.Class4),
-		TestCase(VehicleCategory.RigidTruck, AxleConfiguration.AxleConfig_4x2, 99000, 0, VehicleClass.Class4),
-		TestCase(VehicleCategory.Tractor, AxleConfiguration.AxleConfig_4x2, 16001, 0, VehicleClass.Class5),
-		TestCase(VehicleCategory.Tractor, AxleConfiguration.AxleConfig_4x2, 99000, 0, VehicleClass.Class5),
+		TestCase(VehicleCategory.RigidTruck, AxleConfiguration.AxleConfig_4x2, 7500.01, 0, false, VehicleClass.Class1),
+		TestCase(VehicleCategory.Tractor, AxleConfiguration.AxleConfig_4x2, 7500.01, 0, false, VehicleClass.Class1),
+		TestCase(VehicleCategory.RigidTruck, AxleConfiguration.AxleConfig_4x2, 10000, 0, false, VehicleClass.Class1),
+		TestCase(VehicleCategory.Tractor, AxleConfiguration.AxleConfig_4x2, 10000, 0, false, VehicleClass.Class1),
+		TestCase(VehicleCategory.RigidTruck, AxleConfiguration.AxleConfig_4x2, 10001, 0, false, VehicleClass.Class2),
+		TestCase(VehicleCategory.Tractor, AxleConfiguration.AxleConfig_4x2, 10001, 0, false, VehicleClass.Class2),
+		TestCase(VehicleCategory.RigidTruck, AxleConfiguration.AxleConfig_4x2, 12000, 0, false, VehicleClass.Class2),
+		TestCase(VehicleCategory.Tractor, AxleConfiguration.AxleConfig_4x2, 12000, 0, false, VehicleClass.Class2),
+		TestCase(VehicleCategory.RigidTruck, AxleConfiguration.AxleConfig_4x2, 12001, 0, false, VehicleClass.Class3),
+		TestCase(VehicleCategory.Tractor, AxleConfiguration.AxleConfig_4x2, 12001, 0, false, VehicleClass.Class3),
+		TestCase(VehicleCategory.RigidTruck, AxleConfiguration.AxleConfig_4x2, 16000, 0, false, VehicleClass.Class3),
+		TestCase(VehicleCategory.Tractor, AxleConfiguration.AxleConfig_4x2, 16000, 0, false, VehicleClass.Class3),
+		TestCase(VehicleCategory.RigidTruck, AxleConfiguration.AxleConfig_4x2, 16001, 0, false, VehicleClass.Class4),
+		TestCase(VehicleCategory.RigidTruck, AxleConfiguration.AxleConfig_4x2, 99000, 0, false, VehicleClass.Class4),
+		TestCase(VehicleCategory.RigidTruck, AxleConfiguration.AxleConfig_4x2, 16001, 0, true, VehicleClass.Class4),
+		TestCase(VehicleCategory.RigidTruck, AxleConfiguration.AxleConfig_4x2, 99000, 0, true, VehicleClass.Class4),
+		TestCase(VehicleCategory.Tractor, AxleConfiguration.AxleConfig_4x2, 16001, 0, false, VehicleClass.Class5),
+		TestCase(VehicleCategory.Tractor, AxleConfiguration.AxleConfig_4x2, 99000, 0, false, VehicleClass.Class5),
+		TestCase(VehicleCategory.Tractor, AxleConfiguration.AxleConfig_4x2, 16001, 0, true, VehicleClass.Class5),
+		TestCase(VehicleCategory.Tractor, AxleConfiguration.AxleConfig_4x2, 99000, 0, true, VehicleClass.Class5),
 		//TestCase(VehicleCategory.RigidTruck, AxleConfiguration.AxleConfig_4x4, 7500, 0, VehicleClass.Class6),
 		//TestCase(VehicleCategory.RigidTruck, AxleConfiguration.AxleConfig_4x4, 16000, 0, VehicleClass.Class6),
 		//TestCase(VehicleCategory.RigidTruck, AxleConfiguration.AxleConfig_4x4, 16001, 0, VehicleClass.Class7),
 		//TestCase(VehicleCategory.RigidTruck, AxleConfiguration.AxleConfig_4x4, 99000, 0, VehicleClass.Class7),
 		//TestCase(VehicleCategory.Tractor, AxleConfiguration.AxleConfig_4x4, 16000, 0, VehicleClass.Class8),
 		//TestCase(VehicleCategory.Tractor, AxleConfiguration.AxleConfig_4x4, 99000, 0, VehicleClass.Class8),
-		TestCase(VehicleCategory.RigidTruck, AxleConfiguration.AxleConfig_6x2, 7500, 0, VehicleClass.Class9),
-		TestCase(VehicleCategory.RigidTruck, AxleConfiguration.AxleConfig_6x2, 16000, 0, VehicleClass.Class9),
-		TestCase(VehicleCategory.RigidTruck, AxleConfiguration.AxleConfig_6x2, 40000, 0, VehicleClass.Class9),
-		TestCase(VehicleCategory.RigidTruck, AxleConfiguration.AxleConfig_6x2, 99000, 0, VehicleClass.Class9),
-		TestCase(VehicleCategory.Tractor, AxleConfiguration.AxleConfig_6x2, 7500, 0, VehicleClass.Class10),
-		TestCase(VehicleCategory.Tractor, AxleConfiguration.AxleConfig_6x2, 16000, 0, VehicleClass.Class10),
-		TestCase(VehicleCategory.Tractor, AxleConfiguration.AxleConfig_6x2, 40000, 0, VehicleClass.Class10),
-		TestCase(VehicleCategory.Tractor, AxleConfiguration.AxleConfig_6x2, 99000, 0, VehicleClass.Class10),
-		TestCase(VehicleCategory.RigidTruck, AxleConfiguration.AxleConfig_6x4, 7500, 0, VehicleClass.Class11),
-		TestCase(VehicleCategory.RigidTruck, AxleConfiguration.AxleConfig_6x4, 40000, 0, VehicleClass.Class11),
-		TestCase(VehicleCategory.Tractor, AxleConfiguration.AxleConfig_6x4, 7500, 0, VehicleClass.Class12),
-		TestCase(VehicleCategory.Tractor, AxleConfiguration.AxleConfig_6x4, 99000, 0, VehicleClass.Class12),
-		TestCase(VehicleCategory.RigidTruck, AxleConfiguration.AxleConfig_8x4, 7500, 0, VehicleClass.Class16),
-		TestCase(VehicleCategory.RigidTruck, AxleConfiguration.AxleConfig_8x4, 99000, 0, VehicleClass.Class16)
+		TestCase(VehicleCategory.RigidTruck, AxleConfiguration.AxleConfig_6x2, 7500, 0, false, VehicleClass.Class9),
+		TestCase(VehicleCategory.RigidTruck, AxleConfiguration.AxleConfig_6x2, 16000, 0, false, VehicleClass.Class9),
+		TestCase(VehicleCategory.RigidTruck, AxleConfiguration.AxleConfig_6x2, 40000, 0, false, VehicleClass.Class9),
+		TestCase(VehicleCategory.RigidTruck, AxleConfiguration.AxleConfig_6x2, 99000, 0, false, VehicleClass.Class9),
+		TestCase(VehicleCategory.RigidTruck, AxleConfiguration.AxleConfig_6x2, 7500, 0, true, VehicleClass.Class9),
+		TestCase(VehicleCategory.RigidTruck, AxleConfiguration.AxleConfig_6x2, 99000, 0, true, VehicleClass.Class9),
+		TestCase(VehicleCategory.Tractor, AxleConfiguration.AxleConfig_6x2, 7500, 0, false, VehicleClass.Class10),
+		TestCase(VehicleCategory.Tractor, AxleConfiguration.AxleConfig_6x2, 16000, 0, false, VehicleClass.Class10),
+		TestCase(VehicleCategory.Tractor, AxleConfiguration.AxleConfig_6x2, 40000, 0, false, VehicleClass.Class10),
+		TestCase(VehicleCategory.Tractor, AxleConfiguration.AxleConfig_6x2, 99000, 0, false, VehicleClass.Class10),
+		TestCase(VehicleCategory.Tractor, AxleConfiguration.AxleConfig_6x2, 7500, 0, true, VehicleClass.Class10),
+		TestCase(VehicleCategory.Tractor, AxleConfiguration.AxleConfig_6x2, 99000, 0, true, VehicleClass.Class10),
+		TestCase(VehicleCategory.RigidTruck, AxleConfiguration.AxleConfig_6x4, 7500, 0, false, VehicleClass.Class11),
+		TestCase(VehicleCategory.RigidTruck, AxleConfiguration.AxleConfig_6x4, 40000, 0, false, VehicleClass.Class11),
+		TestCase(VehicleCategory.Tractor, AxleConfiguration.AxleConfig_6x4, 7500, 0, false, VehicleClass.Class12),
+		TestCase(VehicleCategory.Tractor, AxleConfiguration.AxleConfig_6x4, 99000, 0, false, VehicleClass.Class12),
+		TestCase(VehicleCategory.RigidTruck, AxleConfiguration.AxleConfig_8x4, 7500, 0, false, VehicleClass.Class16),
+		TestCase(VehicleCategory.RigidTruck, AxleConfiguration.AxleConfig_8x4, 99000, 0, false, VehicleClass.Class16)
 		]
 		public void SegmentLookupTest(VehicleCategory category, AxleConfiguration axleConfiguration, double grossWeight,
-			double curbWeight, VehicleClass expectedClass)
+			double curbWeight, bool vocational, VehicleClass expectedClass)
 		{
 			var segment = DeclarationData.Segments.Lookup(category, axleConfiguration, grossWeight.SI<Kilogram>(),
-				curbWeight.SI<Kilogram>());
+				curbWeight.SI<Kilogram>(), vocational);
 			Assert.AreEqual(expectedClass, segment.VehicleClass);
 		}
 
-		[TestCase(VehicleCategory.RigidTruck, AxleConfiguration.AxleConfig_4x2, 7501, 0, VehicleClass.Class1, 85),
-		TestCase(VehicleCategory.RigidTruck, AxleConfiguration.AxleConfig_4x2, 10001, 0, VehicleClass.Class2, 85),
-		TestCase(VehicleCategory.RigidTruck, AxleConfiguration.AxleConfig_4x2, 12001, 0, VehicleClass.Class3, 85),
-		TestCase(VehicleCategory.RigidTruck, AxleConfiguration.AxleConfig_4x2, 16001, 0, VehicleClass.Class4, 85),
-		TestCase(VehicleCategory.Tractor, AxleConfiguration.AxleConfig_4x2, 16001, 0, VehicleClass.Class5, 85),
-		TestCase(VehicleCategory.RigidTruck, AxleConfiguration.AxleConfig_6x2, 7501, 0, VehicleClass.Class9, 85),
-		TestCase(VehicleCategory.Tractor, AxleConfiguration.AxleConfig_6x2, 7500, 0, VehicleClass.Class10, 85),
-		TestCase(VehicleCategory.RigidTruck, AxleConfiguration.AxleConfig_6x4, 7500, 0, VehicleClass.Class11, 85),
-		TestCase(VehicleCategory.Tractor, AxleConfiguration.AxleConfig_6x4, 7500, 0, VehicleClass.Class12, 85),
-		TestCase(VehicleCategory.RigidTruck, AxleConfiguration.AxleConfig_8x4, 7500, 0, VehicleClass.Class16, 85),
+		[TestCase(VehicleCategory.RigidTruck, AxleConfiguration.AxleConfig_4x2, 7501, 0, false, VehicleClass.Class1, 85),
+		TestCase(VehicleCategory.RigidTruck, AxleConfiguration.AxleConfig_4x2, 10001, 0, false, VehicleClass.Class2, 85),
+		TestCase(VehicleCategory.RigidTruck, AxleConfiguration.AxleConfig_4x2, 12001, 0, false, VehicleClass.Class3, 85),
+		TestCase(VehicleCategory.RigidTruck, AxleConfiguration.AxleConfig_4x2, 16001, 0, false, VehicleClass.Class4, 85),
+		TestCase(VehicleCategory.RigidTruck, AxleConfiguration.AxleConfig_4x2, 16001, 0, true, VehicleClass.Class4, 85),
+		TestCase(VehicleCategory.Tractor, AxleConfiguration.AxleConfig_4x2, 16001, 0, false, VehicleClass.Class5, 85),
+		TestCase(VehicleCategory.Tractor, AxleConfiguration.AxleConfig_4x2, 16001, 0, true, VehicleClass.Class5, 85),
+		TestCase(VehicleCategory.RigidTruck, AxleConfiguration.AxleConfig_6x2, 7501, 0, false, VehicleClass.Class9, 85),
+		TestCase(VehicleCategory.RigidTruck, AxleConfiguration.AxleConfig_6x2, 7501, 0, true, VehicleClass.Class9, 85),
+		TestCase(VehicleCategory.Tractor, AxleConfiguration.AxleConfig_6x2, 7500, 0, false, VehicleClass.Class10, 85),
+		TestCase(VehicleCategory.Tractor, AxleConfiguration.AxleConfig_6x2, 7500, 0, true, VehicleClass.Class10, 85),
+		TestCase(VehicleCategory.RigidTruck, AxleConfiguration.AxleConfig_6x4, 7500, 0, false, VehicleClass.Class11, 85),
+		TestCase(VehicleCategory.Tractor, AxleConfiguration.AxleConfig_6x4, 7500, 0, false, VehicleClass.Class12, 85),
+		TestCase(VehicleCategory.RigidTruck, AxleConfiguration.AxleConfig_8x4, 7500, 0, false, VehicleClass.Class16, 85),
 		]
 		public void SegmentDesignSpeedTest(VehicleCategory category, AxleConfiguration axleConfiguration, double grossWeight,
-			double curbWeight, VehicleClass expectedClass, double speed)
+			double curbWeight, bool vocational, VehicleClass expectedClass, double speed)
 		{
 			var segment = DeclarationData.Segments.Lookup(category, axleConfiguration, grossWeight.SI<Kilogram>(),
-				curbWeight.SI<Kilogram>());
+				curbWeight.SI<Kilogram>(), vocational);
 
 			Assert.AreEqual(speed.KMPHtoMeterPerSecond(), segment.DesignSpeed);
 		}
 
 		[Test,
-		TestCase(VehicleCategory.RigidTruck, AxleConfiguration.AxleConfig_4x2, 10000, 0, VehicleClass.Class1, 1600, null,
+		TestCase(VehicleCategory.RigidTruck, AxleConfiguration.AxleConfig_4x2, 10000, 0, false, VehicleClass.Class1, 1600, null,
 			TestName = "SegmentLookupBodyWeight Class1 Rigid"),
-		TestCase(VehicleCategory.Tractor, AxleConfiguration.AxleConfig_4x2, 10000, 0, VehicleClass.Class1, 1600, null,
+		TestCase(VehicleCategory.Tractor, AxleConfiguration.AxleConfig_4x2, 10000, 0, false, VehicleClass.Class1, 1600, null,
 			TestName = "SegmentLookupBodyWeight Class1 Tractor"),
-		TestCase(VehicleCategory.RigidTruck, AxleConfiguration.AxleConfig_4x2, 12000, 0, VehicleClass.Class2, 1900, 3400,
+		TestCase(VehicleCategory.RigidTruck, AxleConfiguration.AxleConfig_4x2, 12000, 0, false, VehicleClass.Class2, 1900, 3400,
 			TestName = "SegmentLookupBodyWeight Class2 Rigid"),
-		TestCase(VehicleCategory.Tractor, AxleConfiguration.AxleConfig_4x2, 12000, 0, VehicleClass.Class2, 1900, 3400,
+		TestCase(VehicleCategory.Tractor, AxleConfiguration.AxleConfig_4x2, 12000, 0, false, VehicleClass.Class2, 1900, 3400,
 			TestName = "SegmentLookupBodyWeight Class2 Tractor"),
-		TestCase(VehicleCategory.RigidTruck, AxleConfiguration.AxleConfig_4x2, 16000, 0, VehicleClass.Class3, 2000, null,
+		TestCase(VehicleCategory.RigidTruck, AxleConfiguration.AxleConfig_4x2, 16000, 0, false, VehicleClass.Class3, 2000, null,
 			TestName = "SegmentLookupBodyWeight Class3 Rigid"),
-		TestCase(VehicleCategory.Tractor, AxleConfiguration.AxleConfig_4x2, 16000, 0, VehicleClass.Class3, 2000, null,
+		TestCase(VehicleCategory.Tractor, AxleConfiguration.AxleConfig_4x2, 16000, 0, false, VehicleClass.Class3, 2000, null,
 			TestName = "SegmentLookupBodyWeight Class3 Tractor"),
-		TestCase(VehicleCategory.RigidTruck, AxleConfiguration.AxleConfig_4x2, 18000, 0, VehicleClass.Class4, 2100, 5400,
+		TestCase(VehicleCategory.RigidTruck, AxleConfiguration.AxleConfig_4x2, 18000, 0, false, VehicleClass.Class4, 2100, 5400,
 			TestName = "SegmentLookupBodyWeight Class4"),
-		TestCase(VehicleCategory.Tractor, AxleConfiguration.AxleConfig_4x2, 18000, 0, VehicleClass.Class5, null, 7500,
+		TestCase(VehicleCategory.Tractor, AxleConfiguration.AxleConfig_4x2, 18000, 0, false, VehicleClass.Class5, null, 7500,
 			TestName = "SegmentLookupBodyWeight Class5"),
-		TestCase(VehicleCategory.RigidTruck, AxleConfiguration.AxleConfig_6x2, 40000, 0, VehicleClass.Class9, 2200, 5400,
+		TestCase(VehicleCategory.RigidTruck, AxleConfiguration.AxleConfig_6x2, 40000, 0, false, VehicleClass.Class9, 2200, 5400,
 			TestName = "SegmentLookupBodyWeight Class9"),
-		TestCase(VehicleCategory.Tractor, AxleConfiguration.AxleConfig_6x2, 40000, 0, VehicleClass.Class10, null, 7500,
+		TestCase(VehicleCategory.Tractor, AxleConfiguration.AxleConfig_6x2, 40000, 0, false, VehicleClass.Class10, null, 7500,
 			TestName = "SegmentLookupBodyWeight Class10"),
-		TestCase(VehicleCategory.RigidTruck, AxleConfiguration.AxleConfig_6x4, 12000, 0, VehicleClass.Class11, 2200, 5400,
+		TestCase(VehicleCategory.RigidTruck, AxleConfiguration.AxleConfig_6x4, 12000, 0, false, VehicleClass.Class11, 2200, 5400,
 			TestName = "SegmentLookupBodyWeight Class11"),
-		TestCase(VehicleCategory.Tractor, AxleConfiguration.AxleConfig_6x4, 12000, 0, VehicleClass.Class12, null, 7500,
+		TestCase(VehicleCategory.Tractor, AxleConfiguration.AxleConfig_6x4, 12000, 0, false, VehicleClass.Class12, null, 7500,
 			TestName = "SegmentLookupBodyWeight Class12"),
-		TestCase(VehicleCategory.RigidTruck, AxleConfiguration.AxleConfig_8x4, 12000, 0, VehicleClass.Class16, null, null,
+		TestCase(VehicleCategory.RigidTruck, AxleConfiguration.AxleConfig_8x4, 12000, 0, false, VehicleClass.Class16, null, null,
 			TestName = "SegmentLookupBodyWeight Class16")]
 		public void SegmentLookupBodyTest(VehicleCategory category, AxleConfiguration axleConfiguration, double grossWeight,
-			double curbWeight, VehicleClass expectedClass, int? expectedBodyWeight, int? expectedTrailerWeight)
+			double curbWeight, bool vocational, VehicleClass expectedClass, int? expectedBodyWeight, int? expectedTrailerWeight)
 		{
 			var segment = DeclarationData.Segments.Lookup(category, axleConfiguration, grossWeight.SI<Kilogram>(),
-				curbWeight.SI<Kilogram>());
+				curbWeight.SI<Kilogram>(), vocational);
 			Assert.AreEqual(expectedClass, segment.VehicleClass);
 
 			if (expectedBodyWeight.HasValue) {
@@ -695,83 +709,99 @@ namespace TUGraz.VectoCore.Tests.Models.Declaration
 		}
 
 		[Test,
-		TestCase(VehicleCategory.RigidTruck, AxleConfiguration.AxleConfig_4x2, 10000, 0, VehicleClass.Class1, 3.6,
+		TestCase(VehicleCategory.RigidTruck, AxleConfiguration.AxleConfig_4x2, 10000, 0, false, VehicleClass.Class1, 3.6,
 			TestName = "SegmentLookupHeight Class1 Rigid"),
-		TestCase(VehicleCategory.Tractor, AxleConfiguration.AxleConfig_4x2, 10000, 0, VehicleClass.Class1, 3.6,
+		TestCase(VehicleCategory.Tractor, AxleConfiguration.AxleConfig_4x2, 10000, 0, false, VehicleClass.Class1, 3.6,
 			TestName = "SegmentLookupHeight Class1 Tractor"),
-		TestCase(VehicleCategory.RigidTruck, AxleConfiguration.AxleConfig_4x2, 12000, 0, VehicleClass.Class2, 3.75,
+		TestCase(VehicleCategory.RigidTruck, AxleConfiguration.AxleConfig_4x2, 12000, 0, false, VehicleClass.Class2, 3.75,
 			TestName = "SegmentLookupHeight Class2 Rigid"),
-		TestCase(VehicleCategory.Tractor, AxleConfiguration.AxleConfig_4x2, 12000, 0, VehicleClass.Class2, 3.75,
+		TestCase(VehicleCategory.Tractor, AxleConfiguration.AxleConfig_4x2, 12000, 0, false, VehicleClass.Class2, 3.75,
 			TestName = "SegmentLookupHeight Class2 Tractor"),
-		TestCase(VehicleCategory.RigidTruck, AxleConfiguration.AxleConfig_4x2, 16000, 0, VehicleClass.Class3, 3.9,
+		TestCase(VehicleCategory.RigidTruck, AxleConfiguration.AxleConfig_4x2, 16000, 0, false, VehicleClass.Class3, 3.9,
 			TestName = "SegmentLookupHeight Class3 Rigid"),
-		TestCase(VehicleCategory.Tractor, AxleConfiguration.AxleConfig_4x2, 16000, 0, VehicleClass.Class3, 3.9,
+		TestCase(VehicleCategory.Tractor, AxleConfiguration.AxleConfig_4x2, 16000, 0, false, VehicleClass.Class3, 3.9,
 			TestName = "SegmentLookupHeight Class3 Tractor"),
-		TestCase(VehicleCategory.RigidTruck, AxleConfiguration.AxleConfig_4x2, 18000, 0, VehicleClass.Class4, 4.0,
+		TestCase(VehicleCategory.RigidTruck, AxleConfiguration.AxleConfig_4x2, 18000, 0, false, VehicleClass.Class4, 4.0,
 			TestName = "SegmentLookupHeight Class4"),
-		TestCase(VehicleCategory.Tractor, AxleConfiguration.AxleConfig_4x2, 18000, 0, VehicleClass.Class5, 4.0,
+		TestCase(VehicleCategory.RigidTruck, AxleConfiguration.AxleConfig_4x2, 18000, 0, true, VehicleClass.Class4, 4.0,
+			TestName = "SegmentLookupHeight Class4"),
+		TestCase(VehicleCategory.Tractor, AxleConfiguration.AxleConfig_4x2, 18000, 0, false, VehicleClass.Class5, 4.0,
+			TestName = "SegmentLookupHeight Class5"),
+		TestCase(VehicleCategory.Tractor, AxleConfiguration.AxleConfig_4x2, 18000, 0, true, VehicleClass.Class5, 4.0,
 			TestName = "SegmentLookupHeight Class5"),
-		TestCase(VehicleCategory.RigidTruck, AxleConfiguration.AxleConfig_6x2, 10000, 0, VehicleClass.Class9, 3.6,
+		TestCase(VehicleCategory.RigidTruck, AxleConfiguration.AxleConfig_6x2, 10000, 0, false, VehicleClass.Class9, 3.6,
 			TestName = "SegmentLookupHeight Class9 - 1"),
-		TestCase(VehicleCategory.RigidTruck, AxleConfiguration.AxleConfig_6x2, 12000, 0, VehicleClass.Class9, 3.75,
+		TestCase(VehicleCategory.RigidTruck, AxleConfiguration.AxleConfig_6x2, 12000, 0, false, VehicleClass.Class9, 3.75,
 			TestName = "SegmentLookupHeight Class9 - 2"),
-		TestCase(VehicleCategory.RigidTruck, AxleConfiguration.AxleConfig_6x2, 16000, 0, VehicleClass.Class9, 3.9,
+		TestCase(VehicleCategory.RigidTruck, AxleConfiguration.AxleConfig_6x2, 16000, 0, false, VehicleClass.Class9, 3.9,
 			TestName = "SegmentLookupHeight Class9 - 3"),
-		TestCase(VehicleCategory.RigidTruck, AxleConfiguration.AxleConfig_6x2, 18000, 0, VehicleClass.Class9, 4.0,
+		TestCase(VehicleCategory.RigidTruck, AxleConfiguration.AxleConfig_6x2, 18000, 0, false, VehicleClass.Class9, 4.0,
 			TestName = "SegmentLookupHeight Class9 - 4"),
-		TestCase(VehicleCategory.RigidTruck, AxleConfiguration.AxleConfig_6x2, 40000, 0, VehicleClass.Class9, 4.0,
+		TestCase(VehicleCategory.RigidTruck, AxleConfiguration.AxleConfig_6x2, 40000, 0, false, VehicleClass.Class9, 4.0,
+			TestName = "SegmentLookupHeight Class9 - other"),
+		TestCase(VehicleCategory.RigidTruck, AxleConfiguration.AxleConfig_6x2, 40000, 0, true, VehicleClass.Class9, 4.0,
 			TestName = "SegmentLookupHeight Class9 - other"),
-		TestCase(VehicleCategory.Tractor, AxleConfiguration.AxleConfig_6x2, 40000, 0, VehicleClass.Class10, 4.0,
+		TestCase(VehicleCategory.Tractor, AxleConfiguration.AxleConfig_6x2, 40000, 0, false, VehicleClass.Class10, 4.0,
 			TestName = "SegmentLookupHeight Class10"),
-		TestCase(VehicleCategory.RigidTruck, AxleConfiguration.AxleConfig_6x4, 12000, 0, VehicleClass.Class11, 4.0,
+		TestCase(VehicleCategory.Tractor, AxleConfiguration.AxleConfig_6x2, 40000, 0, true, VehicleClass.Class10, 4.0,
+			TestName = "SegmentLookupHeight Class10"),
+		TestCase(VehicleCategory.RigidTruck, AxleConfiguration.AxleConfig_6x4, 12000, 0, false, VehicleClass.Class11, 4.0,
 			TestName = "SegmentLookupHeight Class11"),
-		TestCase(VehicleCategory.Tractor, AxleConfiguration.AxleConfig_6x4, 12000, 0, VehicleClass.Class12, 4.0,
+		TestCase(VehicleCategory.Tractor, AxleConfiguration.AxleConfig_6x4, 12000, 0, false, VehicleClass.Class12, 4.0,
 			TestName = "SegmentLookupHeight Class12"),
-		TestCase(VehicleCategory.RigidTruck, AxleConfiguration.AxleConfig_8x4, 12000, 0, VehicleClass.Class16, 3.6,
+		TestCase(VehicleCategory.RigidTruck, AxleConfiguration.AxleConfig_8x4, 12000, 0, false, VehicleClass.Class16, 3.6,
 			TestName = "SegmentLookupHeight Class16")]
 		public void SegmentLookupHeightTest(VehicleCategory category, AxleConfiguration axleConfiguration, double grossWeight,
-			double curbWeight, VehicleClass expectedClass, double expectedHeight)
+			double curbWeight, bool vocational, VehicleClass expectedClass, double expectedHeight)
 		{
 			var segment = DeclarationData.Segments.Lookup(category, axleConfiguration, grossWeight.SI<Kilogram>(),
-				curbWeight.SI<Kilogram>());
+				curbWeight.SI<Kilogram>(), vocational);
 			Assert.AreEqual(expectedClass, segment.VehicleClass);
 			AssertHelper.AreRelativeEqual(expectedHeight, segment.VehicleHeight);
 		}
 
 		[Test,
-		TestCase(VehicleCategory.RigidTruck, AxleConfiguration.AxleConfig_4x2, 7501, 0, VehicleClass.Class1,
+		TestCase(VehicleCategory.RigidTruck, AxleConfiguration.AxleConfig_4x2, 7501, 0, false, VehicleClass.Class1,
 			new[] { 36.5, 36.5 }),
-		TestCase(VehicleCategory.Tractor, AxleConfiguration.AxleConfig_4x2, 7501, 0, VehicleClass.Class1,
+		TestCase(VehicleCategory.Tractor, AxleConfiguration.AxleConfig_4x2, 7501, 0, false, VehicleClass.Class1,
 			new[] { 36.5, 36.5 }),
-		TestCase(VehicleCategory.RigidTruck, AxleConfiguration.AxleConfig_4x2, 12000, 0, VehicleClass.Class2,
+		TestCase(VehicleCategory.RigidTruck, AxleConfiguration.AxleConfig_4x2, 12000, 0, false, VehicleClass.Class2,
 			new[] { 85.0, 45.2, 45.2 }),
-		TestCase(VehicleCategory.Tractor, AxleConfiguration.AxleConfig_4x2, 12000, 0, VehicleClass.Class2,
+		TestCase(VehicleCategory.Tractor, AxleConfiguration.AxleConfig_4x2, 12000, 0, false, VehicleClass.Class2,
 			new[] { 85.0, 45.2, 45.2 }),
-		TestCase(VehicleCategory.RigidTruck, AxleConfiguration.AxleConfig_4x2, 16000, 0, VehicleClass.Class3,
+		TestCase(VehicleCategory.RigidTruck, AxleConfiguration.AxleConfig_4x2, 16000, 0, false, VehicleClass.Class3,
 			new[] { 47.7, 47.7 }),
-		TestCase(VehicleCategory.Tractor, AxleConfiguration.AxleConfig_4x2, 16000, 0, VehicleClass.Class3,
+		TestCase(VehicleCategory.Tractor, AxleConfiguration.AxleConfig_4x2, 16000, 0, false, VehicleClass.Class3,
 			new[] { 47.7, 47.7 }),
-		TestCase(VehicleCategory.RigidTruck, AxleConfiguration.AxleConfig_4x2, 18000, 0, VehicleClass.Class4,
-			new[] { 98.9, 49.4, 49.4 }),
-		TestCase(VehicleCategory.Tractor, AxleConfiguration.AxleConfig_4x2, 18000, 0, VehicleClass.Class5,
-			new[] { 91.0, 140.5, 91.0, 140.5 }),
-		TestCase(VehicleCategory.RigidTruck, AxleConfiguration.AxleConfig_6x2, 16000, 0, VehicleClass.Class9,
+		TestCase(VehicleCategory.RigidTruck, AxleConfiguration.AxleConfig_4x2, 18000, 0, false, VehicleClass.Class4,
+			new[] { 98.9, 49.4, 49.4, 49.4 }),
+		TestCase(VehicleCategory.RigidTruck, AxleConfiguration.AxleConfig_4x2, 18000, 0, true, VehicleClass.Class4,
+			new[] { 49.4, 0.0 }),
+		TestCase(VehicleCategory.Tractor, AxleConfiguration.AxleConfig_4x2, 18000, 0, false, VehicleClass.Class5,
+			new[] { 91.0, 140.5, 91.0, 140.5, 91.0 }),
+		TestCase(VehicleCategory.Tractor, AxleConfiguration.AxleConfig_4x2, 18000, 0, true, VehicleClass.Class5,
+			new[] { 0.0 }),
+		TestCase(VehicleCategory.RigidTruck, AxleConfiguration.AxleConfig_6x2, 16000, 0, false, VehicleClass.Class9,
 			new[] { 101.4, 142.9, 51.9, 142.9, 51.9 }),
-		TestCase(VehicleCategory.Tractor, AxleConfiguration.AxleConfig_6x2, 16000, 0, VehicleClass.Class10,
+		TestCase(VehicleCategory.RigidTruck, AxleConfiguration.AxleConfig_6x2, 16000, 0, true, VehicleClass.Class9,
+			new[] { 51.9, 0.0 }),
+		TestCase(VehicleCategory.Tractor, AxleConfiguration.AxleConfig_6x2, 16000, 0, false, VehicleClass.Class10,
 			new[] { 91.0, 140.5, 91.0, 140.5 }),
-		TestCase(VehicleCategory.RigidTruck, AxleConfiguration.AxleConfig_6x4, 40000, 0, VehicleClass.Class11,
-			new[] { 101.4, 142.9, 51.9, 142.9, 51.9, 51.9 }),
-		TestCase(VehicleCategory.Tractor, AxleConfiguration.AxleConfig_6x4, 99000, 0, VehicleClass.Class12,
-			new[] { 91.0, 140.5, 91.0, 140.5, 91.0 }),
-		TestCase(VehicleCategory.RigidTruck, AxleConfiguration.AxleConfig_8x4, 99000, 0, VehicleClass.Class16,
+		TestCase(VehicleCategory.Tractor, AxleConfiguration.AxleConfig_6x2, 16000, 0, true, VehicleClass.Class10,
+			new[] { 0.0 }),
+		TestCase(VehicleCategory.RigidTruck, AxleConfiguration.AxleConfig_6x4, 40000, 0, false, VehicleClass.Class11,
+			new[] { 101.4, 142.9, 51.9, 142.9, 51.9, 0.0 }),
+		TestCase(VehicleCategory.Tractor, AxleConfiguration.AxleConfig_6x4, 99000, 0, false, VehicleClass.Class12,
+			new[] { 91.0, 140.5, 91.0, 140.5, 0.0 }),
+		TestCase(VehicleCategory.RigidTruck, AxleConfiguration.AxleConfig_8x4, 99000, 0, false, VehicleClass.Class16,
 			new[] { 0.0 })
 		]
 		public void SegmentLookupCargoVolumeTest(VehicleCategory category, AxleConfiguration axleConfiguration,
 			double grossWeight,
-			double curbWeight, VehicleClass expectedClass, double[] expectedCargoVolume)
+			double curbWeight, bool vocational, VehicleClass expectedClass, double[] expectedCargoVolume)
 		{
 			var segment = DeclarationData.Segments.Lookup(category, axleConfiguration, grossWeight.SI<Kilogram>(),
-				curbWeight.SI<Kilogram>());
+				curbWeight.SI<Kilogram>(), vocational);
 			Assert.AreEqual(expectedClass, segment.VehicleClass);
 			Assert.AreEqual(expectedCargoVolume.Length, segment.Missions.Length);
 			for (var i = 0; i < expectedCargoVolume.Length; i++) {
@@ -793,7 +823,7 @@ namespace TUGraz.VectoCore.Tests.Models.Declaration
 			};
 
 			var segment = DeclarationData.Segments.Lookup(vehicleData.VehicleCategory, vehicleData.AxleConfiguration,
-				vehicleData.GrossVehicleMassRating, vehicleData.CurbWeight);
+				vehicleData.GrossVehicleMassRating, vehicleData.CurbWeight, false);
 
 			Assert.AreEqual(VehicleClass.Class2, segment.VehicleClass);
 
@@ -866,7 +896,7 @@ namespace TUGraz.VectoCore.Tests.Models.Declaration
 			};
 
 			var segment = DeclarationData.Segments.Lookup(vehicleData.VehicleCategory, vehicleData.AxleConfiguration,
-				vehicleData.GrossVehicleMassRating, vehicleData.CurbWeight);
+				vehicleData.GrossVehicleMassRating, vehicleData.CurbWeight, false);
 
 			Assert.AreEqual(VehicleClass.Class2, segment.VehicleClass);
 
@@ -939,7 +969,7 @@ namespace TUGraz.VectoCore.Tests.Models.Declaration
 			};
 
 			var segment = DeclarationData.Segments.Lookup(vehicleData.VehicleCategory, vehicleData.AxleConfiguration,
-				vehicleData.GrossVehicleMassRating, vehicleData.CurbWeight);
+				vehicleData.GrossVehicleMassRating, vehicleData.CurbWeight, false);
 
 			Assert.AreEqual(VehicleClass.Class3, segment.VehicleClass);
 
@@ -992,14 +1022,14 @@ namespace TUGraz.VectoCore.Tests.Models.Declaration
 			};
 
 			var segment = DeclarationData.Segments.Lookup(vehicleData.VehicleCategory, vehicleData.AxleConfiguration,
-				vehicleData.GrossVehicleMassRating, vehicleData.CurbWeight);
+				vehicleData.GrossVehicleMassRating, vehicleData.CurbWeight, false);
 
 			Assert.AreEqual(VehicleClass.Class4, segment.VehicleClass);
 
 			var data = AccelerationCurveReader.ReadFromStream(segment.AccelerationFile);
 			TestAcceleration(data);
 
-			Assert.AreEqual(3, segment.Missions.Length);
+			Assert.AreEqual(4, segment.Missions.Length);
 
 			AssertMission(segment.Missions[0],
 				vehicleData: vehicleData,
@@ -1034,6 +1064,62 @@ namespace TUGraz.VectoCore.Tests.Models.Declaration
 				maxLoad: 8400);
 
 			AssertMission(segment.Missions[2],
+						vehicleData: vehicleData,
+						missionType: MissionType.UrbanDelivery,
+						cosswindCorrection: "RigidSolo",
+						axleWeightDistribution: new[] { 0.45, 0.55 },
+						trailerAxleWeightDistribution: new double[] { },
+						trailerAxleCount: new int[] { },
+						bodyCurbWeight: 2100,
+						trailerCurbWeight: new double[] { },
+						trailerType: new TrailerType[] { },
+						lowLoad: 900,
+						refLoad: 4400,
+						trailerGrossVehicleWeight: new double[] { },
+						deltaCdA: 0,
+						maxLoad: 8400);
+
+			AssertMission(segment.Missions[3],
+				vehicleData: vehicleData,
+				missionType: MissionType.MunicipalUtility,
+				cosswindCorrection: "RigidSolo",
+				axleWeightDistribution: new[] { 0.45, 0.55 },
+				trailerAxleWeightDistribution: new double[] { },
+				trailerAxleCount: new int[] { },
+				bodyCurbWeight: 2100,
+				trailerCurbWeight: new double[] { },
+				trailerType: new TrailerType[] { },
+				lowLoad: 600,
+				refLoad: 3000,
+				trailerGrossVehicleWeight: new double[] { },
+				deltaCdA: 0,
+				maxLoad: 8400);
+		}
+
+		/// <summary>
+		/// fixed reference weight, trailer only in longhaul
+		/// </summary>
+		[TestCase]
+		public void Segment4VocationalTest()
+		{
+			var vehicleData = new {
+				VehicleCategory = VehicleCategory.RigidTruck,
+				AxleConfiguration = AxleConfiguration.AxleConfig_4x2,
+				GrossVehicleMassRating = 18000.SI<Kilogram>(),
+				CurbWeight = 7500.SI<Kilogram>()
+			};
+
+			var segment = DeclarationData.Segments.Lookup(vehicleData.VehicleCategory, vehicleData.AxleConfiguration,
+				vehicleData.GrossVehicleMassRating, vehicleData.CurbWeight, true);
+
+			Assert.AreEqual(VehicleClass.Class4, segment.VehicleClass);
+
+			var data = AccelerationCurveReader.ReadFromStream(segment.AccelerationFile);
+			TestAcceleration(data);
+
+			Assert.AreEqual(2, segment.Missions.Length);
+
+			AssertMission(segment.Missions[0],
 				vehicleData: vehicleData,
 				missionType: MissionType.MunicipalUtility,
 				cosswindCorrection: "RigidSolo",
@@ -1048,6 +1134,22 @@ namespace TUGraz.VectoCore.Tests.Models.Declaration
 				trailerGrossVehicleWeight: new double[] { },
 				deltaCdA: 0,
 				maxLoad: 8400);
+
+			AssertMission(segment.Missions[1],
+						vehicleData: vehicleData,
+						missionType: MissionType.Construction,
+						cosswindCorrection: "RigidSolo",
+						axleWeightDistribution: new[] { 0.45, 0.55 },
+						trailerAxleWeightDistribution: new double[] { },
+						trailerAxleCount: new int[] { },
+						bodyCurbWeight: 1900,
+						trailerCurbWeight: new double[] { },
+						trailerType: new TrailerType[] { },
+						lowLoad: 900,
+						refLoad: 4400,
+						trailerGrossVehicleWeight: new double[] { },
+						deltaCdA: 0,
+						maxLoad: 8600);
 		}
 
 		/// <summary>
@@ -1064,14 +1166,14 @@ namespace TUGraz.VectoCore.Tests.Models.Declaration
 			};
 
 			var segment = DeclarationData.Segments.Lookup(vehicleData.VehicleCategory, vehicleData.AxleConfiguration,
-				vehicleData.GrossVehicleMassRating, vehicleData.CurbWeight);
+				vehicleData.GrossVehicleMassRating, vehicleData.CurbWeight, false);
 
 			Assert.AreEqual(VehicleClass.Class5, segment.VehicleClass);
 
 			var data = AccelerationCurveReader.ReadFromStream(segment.AccelerationFile);
 			TestAcceleration(data);
 
-			Assert.AreEqual(4, segment.Missions.Length);
+			Assert.AreEqual(5, segment.Missions.Length);
 
 			AssertMission(segment.Missions[0],
 				vehicleData: vehicleData,
@@ -1138,6 +1240,46 @@ namespace TUGraz.VectoCore.Tests.Models.Declaration
 				ems: true);
 		}
 
+		/// <summary>
+		/// Segment 5: fixed reference weight, trailer always used
+		/// </summary>
+		[TestCase]
+		public void Segment5VocationalTest()
+		{
+			var vehicleData = new {
+				VehicleCategory = VehicleCategory.Tractor,
+				AxleConfiguration = AxleConfiguration.AxleConfig_4x2,
+				GrossVehicleMassRating = 18000.SI<Kilogram>(),
+				CurbWeight = 7500.SI<Kilogram>()
+			};
+
+			var segment = DeclarationData.Segments.Lookup(vehicleData.VehicleCategory, vehicleData.AxleConfiguration,
+				vehicleData.GrossVehicleMassRating, vehicleData.CurbWeight, true);
+
+			Assert.AreEqual(VehicleClass.Class5, segment.VehicleClass);
+
+			var data = AccelerationCurveReader.ReadFromStream(segment.AccelerationFile);
+			TestAcceleration(data);
+
+			Assert.AreEqual(1, segment.Missions.Length);
+
+			AssertMission(segment.Missions[0],
+				vehicleData: vehicleData,
+				missionType: MissionType.Construction,
+				cosswindCorrection: "TractorSemitrailer",
+				axleWeightDistribution: new[] { 0.25, 0.25 },
+				trailerAxleWeightDistribution: new[] { 0.5 },
+				trailerAxleCount: new[] { 3 }, bodyCurbWeight: 0,
+				trailerCurbWeight: new[] { 6100.0 },
+				trailerType: new[] { TrailerType.STT1 },
+				lowLoad: 2600,
+				refLoad: 12900,
+				trailerGrossVehicleWeight: new[] { 24000.0 },
+				deltaCdA: 0,
+				maxLoad: 26400);
+
+		}
+
 		/// <summary>
 		/// Segment 9: fixed reference weight, trailer always used
 		/// </summary>
@@ -1152,7 +1294,7 @@ namespace TUGraz.VectoCore.Tests.Models.Declaration
 			};
 
 			var segment = DeclarationData.Segments.Lookup(vehicleData.VehicleCategory, vehicleData.AxleConfiguration,
-				vehicleData.GrossVehicleMassRating, vehicleData.CurbWeight);
+				vehicleData.GrossVehicleMassRating, vehicleData.CurbWeight, false);
 
 			Assert.AreEqual(VehicleClass.Class9, segment.VehicleClass);
 
@@ -1244,6 +1386,63 @@ namespace TUGraz.VectoCore.Tests.Models.Declaration
 				maxLoad: 14300);
 		}
 
+		/// <summary>
+		/// Segment 9: fixed reference weight, trailer always used
+		/// </summary>
+		[TestCase]
+		public void Segment9VocationalTest()
+		{
+			var vehicleData = new {
+				VehicleCategory = VehicleCategory.RigidTruck,
+				AxleConfiguration = AxleConfiguration.AxleConfig_6x2,
+				GrossVehicleMassRating = 24000.SI<Kilogram>(),
+				CurbWeight = 7500.SI<Kilogram>()
+			};
+
+			var segment = DeclarationData.Segments.Lookup(vehicleData.VehicleCategory, vehicleData.AxleConfiguration,
+				vehicleData.GrossVehicleMassRating, vehicleData.CurbWeight, true);
+
+			Assert.AreEqual(VehicleClass.Class9, segment.VehicleClass);
+
+			var data = AccelerationCurveReader.ReadFromStream(segment.AccelerationFile);
+			TestAcceleration(data);
+
+			Assert.AreEqual(2, segment.Missions.Length);
+
+			AssertMission(segment.Missions[0],
+				vehicleData: vehicleData,
+				missionType: MissionType.MunicipalUtility,
+				cosswindCorrection: "RigidSolo",
+				axleWeightDistribution: new[] { 0.35, 0.4, 0.25 },
+				trailerAxleWeightDistribution: new double[] { },
+				trailerAxleCount: new int[] { },
+				bodyCurbWeight: 2200,
+				trailerCurbWeight: new double[] { },
+				trailerType: new TrailerType[] { },
+				lowLoad: 1200,
+				refLoad: 6000,
+				trailerGrossVehicleWeight: new double[] { },
+				deltaCdA: 0,
+				maxLoad: 14300);
+
+			AssertMission(segment.Missions[1],
+						vehicleData: vehicleData,
+						missionType: MissionType.Construction,
+						cosswindCorrection: "RigidSolo",
+						axleWeightDistribution: new[] { 0.35, 0.4, 0.25 },
+						trailerAxleWeightDistribution: new double[] { },
+						trailerAxleCount: new int[] { },
+						bodyCurbWeight: 3100,
+						trailerCurbWeight: new double[] { },
+						trailerType: new TrailerType[] { },
+						lowLoad: 1400,
+						refLoad: 7100,
+						trailerGrossVehicleWeight: new double[] { },
+						deltaCdA: 0,
+						maxLoad: 13400);
+
+		}
+
 		/// <summary>
 		/// Segment 10: fixed reference weight, trailer always used
 		/// </summary>
@@ -1258,7 +1457,7 @@ namespace TUGraz.VectoCore.Tests.Models.Declaration
 			};
 
 			var segment = DeclarationData.Segments.Lookup(vehicleData.VehicleCategory, vehicleData.AxleConfiguration,
-				vehicleData.GrossVehicleMassRating, vehicleData.CurbWeight);
+				vehicleData.GrossVehicleMassRating, vehicleData.CurbWeight, false);
 
 			Assert.AreEqual(VehicleClass.Class10, segment.VehicleClass);
 
@@ -1334,6 +1533,47 @@ namespace TUGraz.VectoCore.Tests.Models.Declaration
 				ems: true);
 		}
 
+		/// <summary>
+		/// Segment 10: fixed reference weight, trailer always used
+		/// </summary>
+		[TestCase]
+		public void Segment10VocationalTest()
+		{
+			var vehicleData = new {
+				VehicleCategory = VehicleCategory.Tractor,
+				AxleConfiguration = AxleConfiguration.AxleConfig_6x2,
+				GrossVehicleMassRating = 24000.SI<Kilogram>(),
+				CurbWeight = 7500.SI<Kilogram>()
+			};
+
+			var segment = DeclarationData.Segments.Lookup(vehicleData.VehicleCategory, vehicleData.AxleConfiguration,
+				vehicleData.GrossVehicleMassRating, vehicleData.CurbWeight, true);
+
+			Assert.AreEqual(VehicleClass.Class10, segment.VehicleClass);
+
+			var data = AccelerationCurveReader.ReadFromStream(segment.AccelerationFile);
+			TestAcceleration(data);
+
+			Assert.AreEqual(1, segment.Missions.Length);
+
+			AssertMission(segment.Missions[0],
+				vehicleData: vehicleData,
+				missionType: MissionType.Construction,
+				cosswindCorrection: "TractorSemitrailer",
+				axleWeightDistribution: new[] { 0.2, 0.1, 0.2 },
+				trailerAxleWeightDistribution: new[] { 0.5 },
+				trailerAxleCount: new[] { 2 },
+				bodyCurbWeight: 0,
+				trailerCurbWeight: new[] { 5600.0 },
+				trailerType: new[] { TrailerType.STT2 },
+				lowLoad: 2600,
+				refLoad: 12900,
+				trailerGrossVehicleWeight: new[] { 18000.0 },
+				deltaCdA: 0,
+				maxLoad: 26900);
+
+		}
+
 		/// <summary>
 		/// Segment 11: fixed reference weight, trailer always used
 		/// </summary>
@@ -1348,7 +1588,7 @@ namespace TUGraz.VectoCore.Tests.Models.Declaration
 			};
 
 			var segment = DeclarationData.Segments.Lookup(vehicleData.VehicleCategory, vehicleData.AxleConfiguration,
-				vehicleData.GrossVehicleMassRating, vehicleData.CurbWeight);
+				vehicleData.GrossVehicleMassRating, vehicleData.CurbWeight, false);
 
 			Assert.AreEqual(VehicleClass.Class11, segment.VehicleClass);
 
@@ -1445,14 +1685,14 @@ namespace TUGraz.VectoCore.Tests.Models.Declaration
 				axleWeightDistribution: new[] { 0.35, 0.35, 0.3 },
 				trailerAxleWeightDistribution: new double[] { },
 				trailerAxleCount: new int[] { },
-				bodyCurbWeight: 2200,
+				bodyCurbWeight: 3100,
 				trailerCurbWeight: new double[] { },
 				trailerType: new TrailerType[] { },
 				lowLoad: 1400,
 				refLoad: 7100,
 				trailerGrossVehicleWeight: new double[] { },
 				deltaCdA: 0,
-				maxLoad: 14300);
+				maxLoad: 13400);
 		}
 
 		/// <summary>
@@ -1469,7 +1709,7 @@ namespace TUGraz.VectoCore.Tests.Models.Declaration
 			};
 
 			var segment = DeclarationData.Segments.Lookup(vehicleData.VehicleCategory, vehicleData.AxleConfiguration,
-				vehicleData.GrossVehicleMassRating, vehicleData.CurbWeight);
+				vehicleData.GrossVehicleMassRating, vehicleData.CurbWeight, false);
 
 			Assert.AreEqual(VehicleClass.Class12, segment.VehicleClass);
 
@@ -1550,15 +1790,15 @@ namespace TUGraz.VectoCore.Tests.Models.Declaration
 				cosswindCorrection: "TractorSemitrailer",
 				axleWeightDistribution: new[] { 0.2, 0.15, 0.15 },
 				trailerAxleWeightDistribution: new[] { 0.5 },
-				trailerAxleCount: new[] { 3 },
+				trailerAxleCount: new[] { 2 },
 				bodyCurbWeight: 0,
-				trailerCurbWeight: new[] { 7500.0 },
-				trailerType: new[] { TrailerType.ST1 },
+				trailerCurbWeight: new[] { 5600.0 },
+				trailerType: new[] { TrailerType.STT2 },
 				lowLoad: 2600,
 				refLoad: 12900,
-				trailerGrossVehicleWeight: new[] { 24000.0 },
+				trailerGrossVehicleWeight: new[] { 18000.0 },
 				deltaCdA: 0,
-				maxLoad: 25000,
+				maxLoad: 26900,
 				ems: false);
 		}
 
@@ -1576,7 +1816,7 @@ namespace TUGraz.VectoCore.Tests.Models.Declaration
 			};
 
 			var segment = DeclarationData.Segments.Lookup(vehicleData.VehicleCategory, vehicleData.AxleConfiguration,
-				vehicleData.GrossVehicleMassRating, vehicleData.CurbWeight);
+				vehicleData.GrossVehicleMassRating, vehicleData.CurbWeight, false);
 
 			Assert.AreEqual(VehicleClass.Class16, segment.VehicleClass);
 
@@ -1592,14 +1832,14 @@ namespace TUGraz.VectoCore.Tests.Models.Declaration
 				axleWeightDistribution: new[] { 0.25, 0.25, 0.25, 0.25 },
 				trailerAxleWeightDistribution: new double[] { },
 				trailerAxleCount: new int[] { },
-				bodyCurbWeight: 0,
+				bodyCurbWeight: 4200,
 				trailerCurbWeight: new double[] { },
 				trailerType: new TrailerType[] { },
 				lowLoad: 2600,
 				refLoad: 12900,
 				trailerGrossVehicleWeight: new double[] { },
 				deltaCdA: 0,
-				maxLoad: 28500);
+				maxLoad: 24300);
 		}
 
 		public static void AssertMission(Mission m, dynamic vehicleData, MissionType missionType, string cosswindCorrection,
@@ -1699,7 +1939,7 @@ namespace TUGraz.VectoCore.Tests.Models.Declaration
 			var dataReader = new DeclarationModeVectoRunDataFactory(dataProvider, null);
 
 			var runs = dataReader.NextRun().ToList();
-			Assert.AreEqual(6, runs.Count);
+			Assert.AreEqual(8, runs.Count);
 			var withT1 = new[] { 14.9, 14.9, 19.2, 19.2 };
 			CollectionAssert.AreEqual(withT1, runs[0].VehicleData.AxleData.Select(a => a.Inertia.Value()));
 			CollectionAssert.AreEqual(withT1, runs[1].VehicleData.AxleData.Select(a => a.Inertia.Value()));
@@ -1710,6 +1950,9 @@ namespace TUGraz.VectoCore.Tests.Models.Declaration
 
 			CollectionAssert.AreEqual(bodyOnly, runs[4].VehicleData.AxleData.Select(a => a.Inertia.Value()));
 			CollectionAssert.AreEqual(bodyOnly, runs[5].VehicleData.AxleData.Select(a => a.Inertia.Value()));
+
+			CollectionAssert.AreEqual(bodyOnly, runs[6].VehicleData.AxleData.Select(a => a.Inertia.Value()));
+			CollectionAssert.AreEqual(bodyOnly, runs[7].VehicleData.AxleData.Select(a => a.Inertia.Value()));
 		}
 
 		[TestCase]
@@ -1722,10 +1965,11 @@ namespace TUGraz.VectoCore.Tests.Models.Declaration
 			var runs = dataReader.NextRun().ToList();
 
 			Assert.AreEqual(VehicleClass.Class5, runs[0].VehicleData.VehicleClass);
-			Assert.AreEqual(8, runs.Count);
+			Assert.AreEqual(10, runs.Count);
 
 			//var bodyOnly = new[] { 14.9, 14.9 };
 			var withST1 = new[] { 14.9, 14.9, 19.2, 19.2, 19.2 };
+			var withSTT1 = new[] { 14.9, 14.9, 19.2, 19.2, 19.2 };
 			var withST1andT2 = new[] { 14.9, 14.9, 19.2, 19.2, 19.2, 19.2, 19.2 };
 
 			CollectionAssert.AreEqual(withST1, runs[0].VehicleData.AxleData.Select(a => a.Inertia.Value()));
@@ -1739,6 +1983,9 @@ namespace TUGraz.VectoCore.Tests.Models.Declaration
 
 			CollectionAssert.AreEqual(withST1andT2, runs[6].VehicleData.AxleData.Select(a => a.Inertia.Value()));
 			CollectionAssert.AreEqual(withST1andT2, runs[7].VehicleData.AxleData.Select(a => a.Inertia.Value()));
+
+			CollectionAssert.AreEqual(withSTT1, runs[8].VehicleData.AxleData.Select(a => a.Inertia.Value()));
+			CollectionAssert.AreEqual(withSTT1, runs[9].VehicleData.AxleData.Select(a => a.Inertia.Value()));
 		}
 	}
 }
\ No newline at end of file
-- 
GitLab