diff --git a/Documentation/Cdv_Generator_VECTO3.2.xlsx b/Documentation/Cdv_Generator_VECTO3.2.xlsx
new file mode 100644
index 0000000000000000000000000000000000000000..ae743ae20422e6a4f4e7a49511930d05c6ee8c8c
Binary files /dev/null and b/Documentation/Cdv_Generator_VECTO3.2.xlsx differ
diff --git a/Documentation/User Manual/3-simulation-models/PTO.md b/Documentation/User Manual/3-simulation-models/PTO.md
index 755033f69852d88baf2d60315d0ac4d0416c4a51..a2b51e0485a4781d152c49b8d0f4c7ab478a0e8f 100644
--- a/Documentation/User Manual/3-simulation-models/PTO.md	
+++ b/Documentation/User Manual/3-simulation-models/PTO.md	
@@ -25,19 +25,19 @@ This is considered by constant power consumption as a function of the PTO type.
 
 #### Idling losses of the PTO "Consumer" (red)
 
-The idling losses are a function of speed as determined by the DIN 30752-1 procedure. If the PTO transmission includes a shifting element (i.e. declutching of consumer part possible) the torque losses of the consumer in VECTO input shall be defined with zero. This is only used outside of PTO cycles, since the PTO cycles already include these losses. The idling losses are defined as a lossmap dependend on speed which is configurable in the [Vehicle Editor](#vehicle-editor). The file format is described in [PTO-Consumer](#pto-consumer).
+The idling losses are a function of speed as determined by the DIN 30752-1 procedure. If the PTO transmission includes a shifting element (i.e. declutching of consumer part possible) the torque losses of the consumer in VECTO input shall be defined with zero. This is only used outside of PTO cycles, since the PTO cycles already include these losses. The idling losses are defined as a lossmap dependend on speed which is configurable in the [Vehicle Editor](#vehicle-editor). The file format is described in [PTO Idle Consumption Map](#pto-idle-consumption-map-.vptoi).
 
 
 #### Cycle losses during the PTO cycle of the PTO "Consumer" (red)
 
 A specific PTO cycle (time-based, engine speed and torque from PTO consumer as determined by the DIN 30752-1 procedure) is simulated during vehicle stops labelled as "with PTO activation". The execution of the driving cycle stops during this time and the pto cycle is executed. Afterwards the normal driving cycle continues.
 
-Power consumption in the PTO transmission part added to power demand from the PTO cycle. The cycle is configurable in the [Vehicle Editor](#vehicle-editor) and follows the file format described in [PTO-Cycle](#pto-cycle). The timings in the PTO cycle get shifted to start at 0.
+Power consumption in the PTO transmission part added to power demand from the PTO cycle. The cycle is configurable in the [Vehicle Editor](#vehicle-editor) and follows the file format described in [PTO-Cycle](#pto-cycle-.vptoc). The timings in the PTO cycle get shifted to start at 0.
 
 
 ### Behavior During PTO Driving Cycles
 
-A PTO cycle can only be activated during a stop phase in the driving cycle. When the PTO cycle is activated VECTO exhibits the following behavior: Half of the stop time is added before the pto cycle, and the other half is added afterwards. If the halved stop times are still longer than 3 seconds, they get divided even further to 3 intervals in order to achieve a more appealing visualization in the output (falling down, low baseline, rising again).
+A PTO cycle can only be activated during a stop phase in the driving cycle. When the PTO cycle is activated VECTO exhibits the following behavior: Half of the stop time is added before the pto cycle, and the other half is added afterwards. If the halved stop times are still longer than 3 seconds, they get divided even further to 3 intervals in order to achieve a more appealing visualization in the output (falling down, low baseline, rising again). It is recommended to have a stop time of at least 2 seconds.
 
 The following image shows the behavior of running PTO cycles during a normal driving cycle:
 
diff --git a/Documentation/User Manual/5-input-and-output-files/VDRI.md b/Documentation/User Manual/5-input-and-output-files/VDRI.md
index 4739256603e481d3b3c4eb8968aa2107ac28043f..d9d9c3c8304995f40b9e1f3a273911ae48cf7756 100644
--- a/Documentation/User Manual/5-input-and-output-files/VDRI.md	
+++ b/Documentation/User Manual/5-input-and-output-files/VDRI.md	
@@ -1,176 +1,176 @@
-##Driving Cycles
-
-A Driving Cycle defines the parameters of a simulated route in Vecto. It is either time-based or distance-based and has different fields depending on the driving cycle type.
-The basic file format is [Vecto-CSV](#csv) and the file type ending is ".vdri". A Job must have at least one driving cycle (except in Declaration mode, where the driving cycles are predefined).
-
-###Driving Cycle Types
-- **Declaration Mode**: [Target speed, distance-based](#declaration-mode-cycles)
-- **Engineering Mode**:
-	- [Target speed, distance-based](#engineering-mode-target-speed-distance-based-cycle)
-	- [Measured speed, time-based](#engineering-mode-measured-speed-time-based-cycle)
-	- [Measured speed with gear, time-based](#engineering-mode-measured-speed-with-gear-time-based-cycle)
-	- [Pwheel (SiCo) Mode, time-based](#engineering-mode-pwheel-sico-time-based)
-- **Engine Only Mode**: [Engine Only Mode, time-based](#engine-only-mode-engine-only-driving-cycle)
-
-
-- Distance-based cycles can be defined in any distance resolution, including variable distance steps.
-- Time-based cycles can be defined in any time resolution, including variable time steps.
-
-###Declaration Mode Cycles
-In Declaration Mode driving cycles are automatically chosen depending on vehicle category and cannot be changed by the user. These predefined cycles are of type target-speed, distance-based.
-
-- Coach: 275km
-- Construction: 21km
-- Heavy Urban: 30km
-- Inter Urban: 123km
-- Long Haul: 100km
-- Municipal Utility: 10km
-- Regional Delivery: 26km
-- Sub Urban: 23km
-- Urban: 40km
-- Urban Delivery: 28km
-
-###Engineering Mode: Target-Speed, Distance-Based Cycle
-This driving cycle defines the target speed over distance. Vecto tries to achieve and maintain this target speed.
-
-Header: **\<s>, \<v>, \<stop>***\[, \<Padd>]\[, \<grad>]\[, \<PTO>]\[, \<vair\_res>, \<vair\_beta>]\[, \<Aux\_ID>]*
-
-**Bold columns** are mandatory. *Italic columns* are optional. Only the listed columns are allowed (no other columns!).<br />
-Units are optional and are enclosed in [square-brackets] after the header-column. Comments may be written with a preceding hash-sign "#".
-
-|  Identifier |  Unit  |                                                                                                                                             Description                                                                                                                                              |
-|-------------|--------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
-| **s**       | [m]    | Traveled distance. Must always be increasing.                                                                                                                                                                                                                                                        |
-| **v**       | [km/h] | The target vehicle velocity.  Must be >= 0 km/h.                                                                                                                                                                                                                                                     |
-| **stop**    | [s]    | Stopping Time. Defines the time span the vehicle is standing still (time the vehicle spending in a stop phase). After this time, the vehicle tries to accelerate to \<v>.                                                                                                                            |
-| *Padd*      | [kW]   | Additional auxiliary power demand. This power demand will be directly added to the engine power in addition to possible other auxiliaries. Must be >= 0 kW.                                                                                                                                          |
-| *grad*      | [%]    | The road gradient.                                                                                                                                                                                                                                                                                   |
-| *PTO*       | [0/1]  | "0"=disabled or "1"=enabled. If at a vehicle stop (defined by target velocity=0) "1" is specified, the PTO cycle as specified in the *.vptoc–File is simulated. The PTO activation is added to the simulation time in the middle of the stopping time as defined by the cycle parameter "stop". The PTO Cycle can be specified in the [**Vehicle Editor**](#vehicle-editor).                                                                                                                                                                                                                                                                                                     |
-| *vair_res*  | [km/h] | Air speed relative to vehicle for cross wind correction. Only required if [**Cross Wind Correction**](#cross-wind-correction) is set to **Vair & Beta Input**.                                                                                                                                       |
-| *vair_beta* | [°]    | Wind Yaw Angle for cross wind correction. Only required if [**Cross Wind Correction**](#cross-wind-correction) is set to **Vair & Beta Input**.                                                                                                                                                      |
-| *Aux_ID*    | [kW]   | Auxiliary Supply Power. Can be defined multiple times with different Identifiers. The supply power input for each auxiliary defined in the [.vecto file](#job-file) with the corresponding ID. ID's are not case sensitive and must only contain letters and numbers [a-z,A-Z,0-9]. Must be >= 0 kW. |
-
-
-**Example:**
-
-| \<s> [m] | \<v> [km/h] | \<stop> [s] | \<grad> [%] | \<Padd> [kW] |
-| -------- | ----------- | ----------- | ----------- | ------------ |
-|        0 |          10 |          10 |        2.95 |          1.5 |
-|        1 |          20 |           0 |        2.97 |          1.3 |
-|        2 |          35 |           0 |        3.03 |          1.3 |
-|        3 |          50 |           0 |        2.99 |          1.3 |
-
-###Engineering Mode: Measured-Speed, Time-Based Cycle
-This driving cycle defines the actual measured speed over time. Vecto tries to simulate the vehicle model using this speed as the actual vehicle speed.
-Due to differences in the real and simulated shift strategies a small difference in speed can occur, but Vecto immediately tries to catch up after the gear is engaged again.
-
-Header: **\<t>, \<v>***\[, \<grad>]\[, \<Padd>]\[, \<vair\_res>, \<vair\_beta>\]\[, \<Aux\_ID>]*
-
-**Bold columns** are mandatory. *Italic columns* are optional. Only the listed columns are allowed (no other columns!).<br />
-Units are optional and are enclosed in [square-brackets] after the header-column. Comments may be written with a preceding hash-sign "#".
-
-|  Identifier |  Unit  |                                                                                                                                              Description                                                                                                                                               |
-| ----------- | ------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
-| **t**       | [s]    | The absolute time. Must always be increasing.                                                                                                                                                                                                                                                          |
-| **v**       | [km/h] | The actual velocity of the vehicle. Must be >= 0 km/h.                                                                                                                                                                                                                                                 |
-| *Padd*      | [kW]   | Additional auxiliary power demand. This power demand will be directly added to the engine power in addition to possible other auxiliaries. Must be >= 0 kW.                                                                                                                                            |
-| *grad*      | [%]    | The road gradient.                                                                                                                                                                                                                                                                                     |
-| *vair_res*  | [km/h] | Air speed relative to vehicle for cross wind correction. Only required if [**Cross Wind Correction**](#cross-wind-correction) is set to **Vair & Beta Input**.                                                                                                                                         |
-| *vair_beta* | [°]    | Wind Yaw Angle for cross wind correction. Only required if [**Cross Wind Correction**](#cross-wind-correction) is set to **Vair & Beta Input**.                                                                                                                                                        |
-| *Aux_ID*    | [kW]   | Auxiliary Supply Power. Can be defined multiple times with different Identifiers. The supply power input for each auxiliary defined in the [.vecto file](#job-editor) with the corresponding ID. ID's are not case sensitive and must only contain letters and numbers [a-z,A-Z,0-9]. Must be >= 0 kW. |
-
-**Example:**
-
-| \<t> [s] | \<v> [km/h] | \<grad> [%] | \<Padd> [kW] |
-| -------- | ----------- | ----------- | ------------ |
-|        0 |           0 |        2.95 |          1.5 |
-|        1 |         0.6 |        2.97 |          1.3 |
-|        2 |         1.2 |        3.03 |          1.3 |
-|        3 |         2.4 |        2.99 |          1.3 |
-
-
-###Engineering Mode: Measured-Speed With Gear, Time-Based Cycle
-
-This driving cycle defines the actual measured speed of the vehicle, the gear, and the engine speed over time.
-It overrides the shift strategy of Vecto and also directly sets the engine speed.
-
-
-Header: **\<t>, \<v>, \<gear>***\[, \<tc\_active>, \<grad>]\[, \<Padd>]\[, \<vair\_res>, \<vair\_beta>]\[, \<Aux\_ID>\]*
-
-**Bold columns** are mandatory. *Italic columns* are optional. Only the listed columns are allowed (no other columns!).<br />
-Units are optional and are enclosed in [square-brackets] after the header-column. Comments may be written with a preceding hash-sign "#".
-
-|  Identifier |  Unit  |                                                                                                                                              Description                                                                                                                                               |
-| ----------- | ------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
-| **t**       | [s]    | The absolute time. Must always be increasing.                                                                                                                                                                                                                                                          |
-| **v**       | [km/h] | The actual velocity of the vehicle. Must be >= 0 km/h.                                                                                                                                                                                                                                                 |
-| **gear**    | [-]    | The current gear. Must be >= 0 (0 is neutral).                                                                                                                                                                                                                                                         |
-| **tc_active**| [-]    | For AT gearboxes mandatory! Indicate if the torque converter is active or locked. Depending on the gearbox type only allowed for 1st gear or 1st and 2nd gear.                                                                                                                                                                                                                                                       |
-| *Padd*      | [kW]   | Additional auxiliary power demand. This power demand will be directly added to the engine power in addition to possible other auxiliaries. Must be >= 0 kW.                                                                                                                                            |
-| *grad*      | [%]    | The road gradient.                                                                                                                                                                                                                                                                                     |
-| *vair_res*  | [km/h] | Air speed relative to vehicle for cross wind correction. Only required if [**Cross Wind Correction**](#cross-wind-correction) is set to **Vair & Beta Input**.                                                                                                                                         |
-| *vair_beta* | [°]    | Wind Yaw Angle for cross wind correction. Only required if [**Cross Wind Correction**](#cross-wind-correction) is set to **Vair & Beta Input**.                                                                                                                                                        |
-| *Aux_ID*    | [kW]   | Auxiliary Supply Power. Can be defined multiple times with different Identifiers. The supply power input for each auxiliary defined in the [.vecto file](#job-editor) with the corresponding ID. ID's are not case sensitive and must only contain letters and numbers [a-z,A-Z,0-9]. Must be >= 0 kW. |
-
-**Example:**
-
-| \<t> [s] | \<v> [km/h] | \<gear> [-] | \<grad> [%] | \<Padd> [kW] |
-| -------- | ----------- | ----------- | ----------- | ------------ |
-|        0 |           0 |           0 |        2.95 |          1.5 |
-|        1 |         0.6 |           3 |        2.97 |          1.3 |
-|        2 |         1.2 |           3 |        3.03 |          1.3 |
-|        3 |         2.4 |           3 |        2.99 |          1.3 |
-
-###Engineering Mode: Pwheel (SiCo), Time-Based
-This driving cycle defines the power measured at the wheels over time. Vecto tries to simulate the vehicle with this power requirement.
-
-Header: **\<t>, \<Pwheel>, \<gear>, \<n>***\[, \<Padd>]*
-
-**Bold columns** are mandatory. *Italic columns* are optional. Only the listed columns are allowed (no other columns!).<br />
-Units are optional and are enclosed in [square-brackets] after the header-column. Comments may be written with a preceding hash-sign "#".
-
-| Identifier |  Unit |                      Quantity                                                    Description                      |
-| ---------- | ----- | ----------------------------------------------------------------------------------------------------------------- |
-| **t**      | [s]   | The absolute time. Must always be increasing.                                                                     |
-| **Pwheel** | [kW]  | Power at the wheels.                                                                                              |
-| **gear**   | [-]   | The current gear. Must be >= 0 (0 is neutral).                                                                    |
-| **n**      | [rpm] | The actual engine speed. Must be >= 0 rpm.                                                                        |
-| *Padd*     | [kW]  | Additional auxiliary power demand. This power demand will be directly added to the engine power. Must be >= 0 kW. |
-
-**Example:**
-
-| \<t> [s] | \<Pwheel> [kW] | \<gear> [-] | \<n> [rpm] | \<Padd> [kW] |
-| -------- | -------------- | ----------- | ---------- | ------------ |
-|        0 |              0 |           0 |        600 |          1.5 |
-|        1 |          4.003 |           3 |        950 |          1.3 |
-|        2 |         15.333 |           3 |       1200 |          1.3 |
-|        3 |          50.56 |           3 |       1400 |          1.3 |
-
-
-###Engine Only Mode: Engine Only Driving Cycle
-
-This driving cycle directly defines the engine's power or torque at the output shaft over time. Vecto adds the engine's inertia to the given power demand and simulates the engine.
-
-Header: **\<t>, \<n>, (\<Pe>|\<Me>)***\[, \<Padd>]*
-
-**Bold columns** are mandatory. *Italic columns* are optional. Only the listed columns are allowed (no other columns!).<br />
-Units are optional and are enclosed in [square-brackets] after the header-column. Comments may be written with a preceding hash-sign "#".
-
-| Identifier |  Unit |                                                    Description                                                    |
-| ---------- | ----- | ----------------------------------------------------------------------------------------------------------------- |
-| **t**      | [s]   | The absolute time. Must always be increasing.                                                                     |
-| **n**      | [rpm] | The actual engine speed. Must be >= 0 rpm.                                                                        |
-| **Pe**     | [kW]  | The power at the output shaft of the engine. Either \<Pe> or \<Me> must be defined.                               |
-| **Me**     | [Nm]  | The torque at the output shaft of the engine. Either \<Pe> or \<Me> must be defined.                              |
-| *Padd*     | [kW]  | Additional auxiliary power demand. This power demand will be directly added to the engine power. Must be >= 0 kW. |
-
-**Example:**
-
-| \<t> [s] | \<n> [rpm] | \<Pe> [kW] | \<Padd> [kW] |
-| -------- | ---------- | ---------- | ------------ |
-|        0 |        600 |          0 |          1.5 |
-|        1 |        950 |       25.3 |          1.3 |
-|        2 |       1200 |     65.344 |          1.3 |
-|        3 |       1400 |      110.1 |          1.3 |
-
-
+##Driving Cycles
+
+A Driving Cycle defines the parameters of a simulated route in Vecto. It is either time-based or distance-based and has different fields depending on the driving cycle type.
+The basic file format is [Vecto-CSV](#csv) and the file type ending is ".vdri". A Job must have at least one driving cycle (except in Declaration mode, where the driving cycles are predefined).
+
+###Driving Cycle Types
+- **Declaration Mode**: [Target speed, distance-based](#declaration-mode-cycles)
+- **Engineering Mode**:
+	- [Target speed, distance-based](#engineering-mode-target-speed-distance-based-cycle)
+	- [Measured speed, time-based](#engineering-mode-measured-speed-time-based-cycle)
+	- [Measured speed with gear, time-based](#engineering-mode-measured-speed-with-gear-time-based-cycle)
+	- [Pwheel (SiCo) Mode, time-based](#engineering-mode-pwheel-sico-time-based)
+- **Engine Only Mode**: [Engine Only Mode, time-based](#engine-only-mode-engine-only-driving-cycle)
+
+
+- Distance-based cycles can be defined in any distance resolution, including variable distance steps.
+- Time-based cycles can be defined in any time resolution, including variable time steps.
+
+###Declaration Mode Cycles
+In Declaration Mode driving cycles are automatically chosen depending on vehicle category and cannot be changed by the user. These predefined cycles are of type target-speed, distance-based.
+
+- Coach: 275km
+- Construction: 21km
+- Heavy Urban: 30km
+- Inter Urban: 123km
+- Long Haul: 100km
+- Municipal Utility: 10km
+- Regional Delivery: 26km
+- Sub Urban: 23km
+- Urban: 40km
+- Urban Delivery: 28km
+
+###Engineering Mode: Target-Speed, Distance-Based Cycle
+This driving cycle defines the target speed over distance. Vecto tries to achieve and maintain this target speed.
+
+Header: **\<s>, \<v>, \<stop>***\[, \<Padd>]\[, \<grad>]\[, \<PTO>]\[, \<vair\_res>, \<vair\_beta>]\[, \<Aux\_ID>]*
+
+**Bold columns** are mandatory. *Italic columns* are optional. Only the listed columns are allowed (no other columns!).<br />
+Units are optional and are enclosed in [square-brackets] after the header-column. Comments may be written with a preceding hash-sign "#".
+
+|  Identifier |  Unit  |                                                                                                                                             Description                                                                                                                                              |
+|-------------|--------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| **s**       | [m]    | Traveled distance. Must always be increasing.                                                                                                                                                                                                                                                        |
+| **v**       | [km/h] | The target vehicle velocity.  Must be >= 0 km/h.                                                                                                                                                                                                                                                     |
+| **stop**    | [s]    | Stopping Time. Defines the time span the vehicle is standing still (time the vehicle spending in a stop phase). After this time, the vehicle tries to accelerate to \<v>. If during a stop phase the PTO cycle is activated, it is recommended to use at least 2 seconds of stop time (which gets split up: first half before the PTO cycle, second half after the PTO cycle).                                                                                                                            |
+| *Padd*      | [kW]   | Additional auxiliary power demand. This power demand will be directly added to the engine power in addition to possible other auxiliaries. Must be >= 0 kW.                                                                                                                                          |
+| *grad*      | [%]    | The road gradient.                                                                                                                                                                                                                                                                                   |
+| *PTO*       | [0/1]  | "0"=disabled or "1"=enabled. If at a vehicle stop (defined by target velocity=0) "1" is specified, the PTO cycle as specified in the *.vptoc–File is simulated. This is described in the [PTO Simulation Model](#pto)  The PTO activation is added to the simulation time in the middle of the stopping time as defined by the cycle parameter "stop". The PTO Cycle can be specified in the [**Vehicle Editor**](#vehicle-editor). When PTO is activated it is recommended to use at least 2 seconds as stop time.                                                                                                                                                                                                                                                                                                     |
+| *vair_res*  | [km/h] | Air speed relative to vehicle for cross wind correction. Only required if [**Cross Wind Correction**](#cross-wind-correction) is set to **Vair & Beta Input**.                                                                                                                                       |
+| *vair_beta* | [°]    | Wind Yaw Angle for cross wind correction. Only required if [**Cross Wind Correction**](#cross-wind-correction) is set to **Vair & Beta Input**.                                                                                                                                                      |
+| *Aux_ID*    | [kW]   | Auxiliary Supply Power. Can be defined multiple times with different Identifiers. The supply power input for each auxiliary defined in the [.vecto file](#job-file) with the corresponding ID. ID's are not case sensitive and must only contain letters and numbers [a-z,A-Z,0-9]. Must be >= 0 kW. |
+
+
+**Example:**
+
+| \<s> [m] | \<v> [km/h] | \<stop> [s] | \<grad> [%] | \<Padd> [kW] |
+| -------- | ----------- | ----------- | ----------- | ------------ |
+|        0 |          10 |          10 |        2.95 |          1.5 |
+|        1 |          20 |           0 |        2.97 |          1.3 |
+|        2 |          35 |           0 |        3.03 |          1.3 |
+|        3 |          50 |           0 |        2.99 |          1.3 |
+
+###Engineering Mode: Measured-Speed, Time-Based Cycle
+This driving cycle defines the actual measured speed over time. Vecto tries to simulate the vehicle model using this speed as the actual vehicle speed.
+Due to differences in the real and simulated shift strategies a small difference in speed can occur, but Vecto immediately tries to catch up after the gear is engaged again.
+
+Header: **\<t>, \<v>***\[, \<grad>]\[, \<Padd>]\[, \<vair\_res>, \<vair\_beta>\]\[, \<Aux\_ID>]*
+
+**Bold columns** are mandatory. *Italic columns* are optional. Only the listed columns are allowed (no other columns!).<br />
+Units are optional and are enclosed in [square-brackets] after the header-column. Comments may be written with a preceding hash-sign "#".
+
+|  Identifier |  Unit  |                                                                                                                                              Description                                                                                                                                               |
+| ----------- | ------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
+| **t**       | [s]    | The absolute time. Must always be increasing.                                                                                                                                                                                                                                                          |
+| **v**       | [km/h] | The actual velocity of the vehicle. Must be >= 0 km/h.                                                                                                                                                                                                                                                 |
+| *Padd*      | [kW]   | Additional auxiliary power demand. This power demand will be directly added to the engine power in addition to possible other auxiliaries. Must be >= 0 kW.                                                                                                                                            |
+| *grad*      | [%]    | The road gradient.                                                                                                                                                                                                                                                                                     |
+| *vair_res*  | [km/h] | Air speed relative to vehicle for cross wind correction. Only required if [**Cross Wind Correction**](#cross-wind-correction) is set to **Vair & Beta Input**.                                                                                                                                         |
+| *vair_beta* | [°]    | Wind Yaw Angle for cross wind correction. Only required if [**Cross Wind Correction**](#cross-wind-correction) is set to **Vair & Beta Input**.                                                                                                                                                        |
+| *Aux_ID*    | [kW]   | Auxiliary Supply Power. Can be defined multiple times with different Identifiers. The supply power input for each auxiliary defined in the [.vecto file](#job-editor) with the corresponding ID. ID's are not case sensitive and must only contain letters and numbers [a-z,A-Z,0-9]. Must be >= 0 kW. |
+
+**Example:**
+
+| \<t> [s] | \<v> [km/h] | \<grad> [%] | \<Padd> [kW] |
+| -------- | ----------- | ----------- | ------------ |
+|        0 |           0 |        2.95 |          1.5 |
+|        1 |         0.6 |        2.97 |          1.3 |
+|        2 |         1.2 |        3.03 |          1.3 |
+|        3 |         2.4 |        2.99 |          1.3 |
+
+
+###Engineering Mode: Measured-Speed With Gear, Time-Based Cycle
+
+This driving cycle defines the actual measured speed of the vehicle, the gear, and the engine speed over time.
+It overrides the shift strategy of Vecto and also directly sets the engine speed.
+
+
+Header: **\<t>, \<v>, \<gear>***\[, \<tc\_active>, \<grad>]\[, \<Padd>]\[, \<vair\_res>, \<vair\_beta>]\[, \<Aux\_ID>\]*
+
+**Bold columns** are mandatory. *Italic columns* are optional. Only the listed columns are allowed (no other columns!).<br />
+Units are optional and are enclosed in [square-brackets] after the header-column. Comments may be written with a preceding hash-sign "#".
+
+|  Identifier |  Unit  |                                                                                                                                              Description                                                                                                                                               |
+| ----------- | ------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
+| **t**       | [s]    | The absolute time. Must always be increasing.                                                                                                                                                                                                                                                          |
+| **v**       | [km/h] | The actual velocity of the vehicle. Must be >= 0 km/h.                                                                                                                                                                                                                                                 |
+| **gear**    | [-]    | The current gear. Must be >= 0 (0 is neutral).                                                                                                                                                                                                                                                         |
+| **tc_active**| [-]    | For AT gearboxes mandatory! Indicate if the torque converter is active or locked. Depending on the gearbox type only allowed for 1st gear or 1st and 2nd gear.                                                                                                                                                                                                                                                       |
+| *Padd*      | [kW]   | Additional auxiliary power demand. This power demand will be directly added to the engine power in addition to possible other auxiliaries. Must be >= 0 kW.                                                                                                                                            |
+| *grad*      | [%]    | The road gradient.                                                                                                                                                                                                                                                                                     |
+| *vair_res*  | [km/h] | Air speed relative to vehicle for cross wind correction. Only required if [**Cross Wind Correction**](#cross-wind-correction) is set to **Vair & Beta Input**.                                                                                                                                         |
+| *vair_beta* | [°]    | Wind Yaw Angle for cross wind correction. Only required if [**Cross Wind Correction**](#cross-wind-correction) is set to **Vair & Beta Input**.                                                                                                                                                        |
+| *Aux_ID*    | [kW]   | Auxiliary Supply Power. Can be defined multiple times with different Identifiers. The supply power input for each auxiliary defined in the [.vecto file](#job-editor) with the corresponding ID. ID's are not case sensitive and must only contain letters and numbers [a-z,A-Z,0-9]. Must be >= 0 kW. |
+
+**Example:**
+
+| \<t> [s] | \<v> [km/h] | \<gear> [-] | \<grad> [%] | \<Padd> [kW] |
+| -------- | ----------- | ----------- | ----------- | ------------ |
+|        0 |           0 |           0 |        2.95 |          1.5 |
+|        1 |         0.6 |           3 |        2.97 |          1.3 |
+|        2 |         1.2 |           3 |        3.03 |          1.3 |
+|        3 |         2.4 |           3 |        2.99 |          1.3 |
+
+###Engineering Mode: Pwheel (SiCo), Time-Based
+This driving cycle defines the power measured at the wheels over time. Vecto tries to simulate the vehicle with this power requirement.
+
+Header: **\<t>, \<Pwheel>, \<gear>, \<n>***\[, \<Padd>]*
+
+**Bold columns** are mandatory. *Italic columns* are optional. Only the listed columns are allowed (no other columns!).<br />
+Units are optional and are enclosed in [square-brackets] after the header-column. Comments may be written with a preceding hash-sign "#".
+
+| Identifier |  Unit |                      Quantity                                                    Description                      |
+| ---------- | ----- | ----------------------------------------------------------------------------------------------------------------- |
+| **t**      | [s]   | The absolute time. Must always be increasing.                                                                     |
+| **Pwheel** | [kW]  | Power at the wheels.                                                                                              |
+| **gear**   | [-]   | The current gear. Must be >= 0 (0 is neutral).                                                                    |
+| **n**      | [rpm] | The actual engine speed. Must be >= 0 rpm.                                                                        |
+| *Padd*     | [kW]  | Additional auxiliary power demand. This power demand will be directly added to the engine power. Must be >= 0 kW. |
+
+**Example:**
+
+| \<t> [s] | \<Pwheel> [kW] | \<gear> [-] | \<n> [rpm] | \<Padd> [kW] |
+| -------- | -------------- | ----------- | ---------- | ------------ |
+|        0 |              0 |           0 |        600 |          1.5 |
+|        1 |          4.003 |           3 |        950 |          1.3 |
+|        2 |         15.333 |           3 |       1200 |          1.3 |
+|        3 |          50.56 |           3 |       1400 |          1.3 |
+
+
+###Engine Only Mode: Engine Only Driving Cycle
+
+This driving cycle directly defines the engine's power or torque at the output shaft over time. Vecto adds the engine's inertia to the given power demand and simulates the engine.
+
+Header: **\<t>, \<n>, (\<Pe>|\<Me>)***\[, \<Padd>]*
+
+**Bold columns** are mandatory. *Italic columns* are optional. Only the listed columns are allowed (no other columns!).<br />
+Units are optional and are enclosed in [square-brackets] after the header-column. Comments may be written with a preceding hash-sign "#".
+
+| Identifier |  Unit |                                                    Description                                                    |
+| ---------- | ----- | ----------------------------------------------------------------------------------------------------------------- |
+| **t**      | [s]   | The absolute time. Must always be increasing.                                                                     |
+| **n**      | [rpm] | The actual engine speed. Must be >= 0 rpm.                                                                        |
+| **Pe**     | [kW]  | The power at the output shaft of the engine. Either \<Pe> or \<Me> must be defined.                               |
+| **Me**     | [Nm]  | The torque at the output shaft of the engine. Either \<Pe> or \<Me> must be defined.                              |
+| *Padd*     | [kW]  | Additional auxiliary power demand. This power demand will be directly added to the engine power. Must be >= 0 kW. |
+
+**Example:**
+
+| \<t> [s] | \<n> [rpm] | \<Pe> [kW] | \<Padd> [kW] |
+| -------- | ---------- | ---------- | ------------ |
+|        0 |        600 |          0 |          1.5 |
+|        1 |        950 |       25.3 |          1.3 |
+|        2 |       1200 |     65.344 |          1.3 |
+|        3 |       1400 |      110.1 |          1.3 |
+
+
diff --git a/Documentation/User Manual/5-input-and-output-files/VPTOC.md b/Documentation/User Manual/5-input-and-output-files/VPTOC.md
index 36da928a35ea883aa5f4a5ddf2924080551324a2..e089faa0d6d6a35f28f280ff5b6e651572484c5b 100644
--- a/Documentation/User Manual/5-input-and-output-files/VPTOC.md	
+++ b/Documentation/User Manual/5-input-and-output-files/VPTOC.md	
@@ -1,6 +1,6 @@
 ##PTO Cycle (.vptoc)
 
-The PTO cycle defines the power demands during standing still and doing a pto operation. This can only be used in [Engineering Mode](#engineering-mode) when a pto transmission is defined. It can be set in the [Vehicle-Editor](#vehicle-editor). The basic file format is [Vecto-CSV](#csv) and the file type ending is ".vptoc". A PTO cycle is time-based and may have variable time steps. Regardless of starting time, VECTO shifts it to always begin at 0[s].
+The PTO cycle defines the power demands during standing still and doing a pto operation. This can only be used in [Engineering Mode](#engineering-mode) when a pto transmission is defined. It can be set in the [Vehicle-Editor](#vehicle-editor). The basic file format is [Vecto-CSV](#csv) and the file type ending is ".vptoc". A PTO cycle is time-based and may have variable time steps, but it is recommended to use a resolution between 1[Hz] and 2[Hz]. Regardless of starting time, VECTO shifts it to always begin at 0[s].
 
 Header: **\<t>, \<Engine speed>, \<PTO Torque>**
 
diff --git a/Documentation/User Manual/help.html b/Documentation/User Manual/help.html
index 7e7708714a497d52edb982187aead8339233b5db..d2db264fa8341dc79d33432e4ca2d6a2d0df142e 100644
--- a/Documentation/User Manual/help.html	
+++ b/Documentation/User Manual/help.html	
@@ -2859,7 +2859,7 @@ Example: “Gears\Gear1.vtlm” points to the “Gears” subdirectory of the Ge
 <div id="rolling-resistance-coefficient" class="section level2">
 <h2>Rolling Resistance Coefficient</h2>
 <p>The rolling resistance is calculated using a speed-independent rolling resistance coefficient (RRC). In order to consider that the RRC depends on the vehicle weight it is modelled as a function of the total vehicle mass. The total RRC is calculated in VECTO using the following equation (the index i refers to the vehicle’s axle (truck and trailer)):</p>
-<p><img style="vertical-align:middle" src="data:image/png;base64,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" alt="RRC = \sum_{i=1}^{n} s_{(i)} \cdot RRC_{ISO(i)} \cdot \left( \frac{s_{(i)} \cdot m \cdot g }{w_{(i)} \cdot F_{zISO(i)} } \right)^{\beta-1}" title="RRC = \sum_{i=1}^{n} s_{(i)} \cdot RRC_{ISO(i)} \cdot \left( \frac{s_{(i)} \cdot m \cdot g }{w_{(i)} \cdot F_{zISO(i)} } \right)^{\beta-1}" /></p>
+<p><img style="vertical-align:middle" src="data:image/png;base64,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" alt="RRC = \sum_{i=1}^{n} s_{(i)} \cdot RRC_{ISO(i)} \cdot \left( \frac{s_{(i)} \cdot m \cdot g }{w_{(i)} \cdot F_{zISO(i)} } \right)^{\beta-1}" title="RRC = \sum_{i=1}^{n} s_{(i)} \cdot RRC_{ISO(i)} \cdot \left( \frac{s_{(i)} \cdot m \cdot g }{w_{(i)} \cdot F_{zISO(i)} } \right)^{\beta-1}" /></p>
 <p>with:</p>
 <table>
 <colgroup>
@@ -3439,17 +3439,17 @@ Example: “Gears\Gear1.vtlm” points to the “Gears” subdirectory of the Ge
 </div>
 <div id="idling-losses-of-the-pto-consumer-red" class="section level4">
 <h4>Idling losses of the PTO “Consumer” (red)</h4>
-<p>The idling losses are a function of speed as determined by the DIN 30752-1 procedure. If the PTO transmission includes a shifting element (i.e. declutching of consumer part possible) the torque losses of the consumer in VECTO input shall be defined with zero. This is only used outside of PTO cycles, since the PTO cycles already include these losses. The idling losses are defined as a lossmap dependend on speed which is configurable in the <a href="#vehicle-editor">Vehicle Editor</a>. The file format is described in <a href="#pto-consumer">PTO-Consumer</a>.</p>
+<p>The idling losses are a function of speed as determined by the DIN 30752-1 procedure. If the PTO transmission includes a shifting element (i.e. declutching of consumer part possible) the torque losses of the consumer in VECTO input shall be defined with zero. This is only used outside of PTO cycles, since the PTO cycles already include these losses. The idling losses are defined as a lossmap dependend on speed which is configurable in the <a href="#vehicle-editor">Vehicle Editor</a>. The file format is described in <a href="#pto-idle-consumption-map-.vptoi">PTO Idle Consumption Map</a>.</p>
 </div>
 <div id="cycle-losses-during-the-pto-cycle-of-the-pto-consumer-red" class="section level4">
 <h4>Cycle losses during the PTO cycle of the PTO “Consumer” (red)</h4>
 <p>A specific PTO cycle (time-based, engine speed and torque from PTO consumer as determined by the DIN 30752-1 procedure) is simulated during vehicle stops labelled as “with PTO activation”. The execution of the driving cycle stops during this time and the pto cycle is executed. Afterwards the normal driving cycle continues.</p>
-<p>Power consumption in the PTO transmission part added to power demand from the PTO cycle. The cycle is configurable in the <a href="#vehicle-editor">Vehicle Editor</a> and follows the file format described in <a href="#pto-cycle">PTO-Cycle</a>. The timings in the PTO cycle get shifted to start at 0.</p>
+<p>Power consumption in the PTO transmission part added to power demand from the PTO cycle. The cycle is configurable in the <a href="#vehicle-editor">Vehicle Editor</a> and follows the file format described in <a href="#pto-cycle-.vptoc">PTO-Cycle</a>. The timings in the PTO cycle get shifted to start at 0.</p>
 </div>
 </div>
 <div id="behavior-during-pto-driving-cycles" class="section level3">
 <h3>Behavior During PTO Driving Cycles</h3>
-<p>A PTO cycle can only be activated during a stop phase in the driving cycle. When the PTO cycle is activated VECTO exhibits the following behavior: Half of the stop time is added before the pto cycle, and the other half is added afterwards. If the halved stop times are still longer than 3 seconds, they get divided even further to 3 intervals in order to achieve a more appealing visualization in the output (falling down, low baseline, rising again).</p>
+<p>A PTO cycle can only be activated during a stop phase in the driving cycle. When the PTO cycle is activated VECTO exhibits the following behavior: Half of the stop time is added before the pto cycle, and the other half is added afterwards. If the halved stop times are still longer than 3 seconds, they get divided even further to 3 intervals in order to achieve a more appealing visualization in the output (falling down, low baseline, rising again). It is recommended to have a stop time of at least 2 seconds.</p>
 <p>The following image shows the behavior of running PTO cycles during a normal driving cycle:</p>
 <div class="figure">
 <img src="data:image/png;base64,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" />
@@ -4062,7 +4062,7 @@ Example: “Gears\Gear1.vtlm” points to the “Gears” subdirectory of the Ge
 </div>
 <div id="pto-cycle-.vptoc" class="section level2">
 <h2>PTO Cycle (.vptoc)</h2>
-<p>The PTO cycle defines the power demands during standing still and doing a pto operation. This can only be used in <a href="#engineering-mode">Engineering Mode</a> when a pto transmission is defined. It can be set in the <a href="#vehicle-editor">Vehicle-Editor</a>. The basic file format is <a href="#csv">Vecto-CSV</a> and the file type ending is “.vptoc”. A PTO cycle is time-based and may have variable time steps. Regardless of starting time, VECTO shifts it to always begin at 0[s].</p>
+<p>The PTO cycle defines the power demands during standing still and doing a pto operation. This can only be used in <a href="#engineering-mode">Engineering Mode</a> when a pto transmission is defined. It can be set in the <a href="#vehicle-editor">Vehicle-Editor</a>. The basic file format is <a href="#csv">Vecto-CSV</a> and the file type ending is “.vptoc”. A PTO cycle is time-based and may have variable time steps, but it is recommended to use a resolution between 1[Hz] and 2[Hz]. Regardless of starting time, VECTO shifts it to always begin at 0[s].</p>
 <p>Header: <strong>&lt;t&gt;, &lt;Engine speed&gt;, &lt;PTO Torque&gt;</strong></p>
 <p><strong>Bold columns</strong> are mandatory. Only the listed columns are allowed (no other columns!).<br /> The order is not important when the headers are annotated with &lt;angle-brackets&gt; (less-than-sign “&lt;” and greater-than-sign “&gt;”).<br /> Units are optional and are enclosed in [square-brackets] after the header-column. Comments may be written with a preceding hash-sign “#”.</p>
 <table style="width:100%;">
@@ -4820,7 +4820,7 @@ CycleTime,UnknownCycleName,3600</code></pre>
 <tr class="odd">
 <td align="left"><strong>stop</strong></td>
 <td align="left">[s]</td>
-<td align="left">Stopping Time. Defines the time span the vehicle is standing still (time the vehicle spending in a stop phase). After this time, the vehicle tries to accelerate to &lt;v&gt;.</td>
+<td align="left">Stopping Time. Defines the time span the vehicle is standing still (time the vehicle spending in a stop phase). After this time, the vehicle tries to accelerate to &lt;v&gt;. If during a stop phase the PTO cycle is activated, it is recommended to use at least 2 seconds of stop time (which gets split up: first half before the PTO cycle, second half after the PTO cycle).</td>
 </tr>
 <tr class="even">
 <td align="left"><em>Padd</em></td>
@@ -4835,7 +4835,7 @@ CycleTime,UnknownCycleName,3600</code></pre>
 <tr class="even">
 <td align="left"><em>PTO</em></td>
 <td align="left">[0/1]</td>
-<td align="left">“0”=disabled or “1”=enabled. If at a vehicle stop (defined by target velocity=0) “1” is specified, the PTO cycle as specified in the <em>.vptoc–File is simulated. The PTO activation is added to the simulation time in the middle of the stopping time as defined by the cycle parameter “stop”. The PTO Cycle can be specified in the <a href="#vehicle-editor"><strong>Vehicle Editor</strong></a>. | | </em>vair_res*</td>
+<td align="left">“0”=disabled or “1”=enabled. If at a vehicle stop (defined by target velocity=0) “1” is specified, the PTO cycle as specified in the <em>.vptoc–File is simulated. This is described in the <a href="#pto">PTO Simulation Model</a> The PTO activation is added to the simulation time in the middle of the stopping time as defined by the cycle parameter “stop”. The PTO Cycle can be specified in the <a href="#vehicle-editor"><strong>Vehicle Editor</strong></a>. When PTO is activated it is recommended to use at least 2 seconds as stop time. | | </em>vair_res*</td>
 </tr>
 <tr class="odd">
 <td align="left"><em>vair_beta</em></td>
@@ -5301,7 +5301,7 @@ CycleTime,UnknownCycleName,3600</code></pre>
 <h2>Modal Results (.vmod)</h2>
 <p>Modal results are only created if enabled in the <a href="#main-form">Options</a> tab. One file is created for each calculation and stored in the same directory as the .vecto file.</p>
 <p>In Vecto 3 the structure of the modal data output has been revised and re-structured. Basically for every powertrain component the .vmod file contains the power at the input shaft and the individual power losses for every component. For the engine the power, torque and engine speed at the output shaft is given along with the internal power and torque used for computing the fuel consumption. See <a href="#powertrain-and-components-structure">Powertrain and Components Structure</a> for schematics how the powertrain looks like and which positions in the powertrain the values represent.</p>
-<p>Every line in the .vmod file represents the simulation interval from time - dt/2 to time + dt/2. All values represent the average power/torque/angular velocity during this simulation interval. If a certain power value can be described as function of the vehicle’s acceleration the average power is calculated by <img style="vertical-align:middle" src="data:image/png;base64,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" alt="P_{avg} = \frac{1}{simulation interval} \int{P(t) dt}" title="P_{avg} = \frac{1}{simulation interval} \int{P(t) dt}" />. <strong>Note:</strong> Columns for the torque converter operating point represent the torque/angular speed at the end of the simulation interval!</p>
+<p>Every line in the .vmod file represents the simulation interval from time - dt/2 to time + dt/2. All values represent the average power/torque/angular velocity during this simulation interval. If a certain power value can be described as function of the vehicle’s acceleration the average power is calculated by <img style="vertical-align:middle" src="data:image/png;base64,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" alt="P_{avg} = \frac{1}{simulation interval} \int{P(t) dt}" title="P_{avg} = \frac{1}{simulation interval} \int{P(t) dt}" />. <strong>Note:</strong> Columns for the torque converter operating point represent the torque/angular speed at the end of the simulation interval!</p>
 <p>The following table lists the columns in the .vmod file:</p>
 <p><strong><em>Quantities:</em></strong></p>
 <table style="width:94%;">
diff --git a/Generic Vehicles/Declaration Mode/Class2_RigidTruck_4x2/Class2_RigidTruck.vveh b/Generic Vehicles/Declaration Mode/Class2_RigidTruck_4x2/Class2_RigidTruck.vveh
index 6179011253332280b3e7654152587e72e0478675..4a182089b5854b495a0e1bd6b30381c5060cce0d 100644
--- a/Generic Vehicles/Declaration Mode/Class2_RigidTruck_4x2/Class2_RigidTruck.vveh	
+++ b/Generic Vehicles/Declaration Mode/Class2_RigidTruck_4x2/Class2_RigidTruck.vveh	
@@ -1,13 +1,14 @@
 {
   "Header": {
     "CreatedBy": "",
-    "Date": "2017-06-22T11:15:06.0747543Z",
+    "Date": "2017-07-03T14:47:21.4326880Z",
     "AppVersion": "3",
     "FileVersion": 7
   },
   "Body": {
     "SavedInDeclMode": true,
     "VehCat": "RigidTruck",
+    "LegislativeClass": "N2",
     "CurbWeight": 4670.0,
     "CurbWeightExtra": 0.0,
     "Loading": 0.0,
diff --git a/Generic Vehicles/Declaration Mode/Class5_Tractor_4x2/Class5_Tractor.vveh b/Generic Vehicles/Declaration Mode/Class5_Tractor_4x2/Class5_Tractor.vveh
index 69fe6f0b805c94258cbf487159a0ecb6c7703994..1867c8867861d3b86e44d92250eae2809526c75a 100644
--- a/Generic Vehicles/Declaration Mode/Class5_Tractor_4x2/Class5_Tractor.vveh	
+++ b/Generic Vehicles/Declaration Mode/Class5_Tractor_4x2/Class5_Tractor.vveh	
@@ -1,13 +1,14 @@
 {
   "Header": {
     "CreatedBy": "",
-    "Date": "2017-06-22T11:14:19.0107543Z",
+    "Date": "2017-07-03T14:47:35.9436880Z",
     "AppVersion": "3",
     "FileVersion": 7
   },
   "Body": {
     "SavedInDeclMode": true,
     "VehCat": "Tractor",
+    "LegislativeClass": "N3",
     "CurbWeight": 8229.0,
     "CurbWeightExtra": 0.0,
     "Loading": 0.0,
diff --git a/Generic Vehicles/Declaration Mode/Class5_Tractor_4x2/Class5_Tractor_DECL.vecto b/Generic Vehicles/Declaration Mode/Class5_Tractor_4x2/Class5_Tractor_DECL.vecto
index 9d8e26457327e1c6851c8282a8a9f9cd92d5660c..542e4626d43dac5b8a483403aed82ab9b8917914 100644
--- a/Generic Vehicles/Declaration Mode/Class5_Tractor_4x2/Class5_Tractor_DECL.vecto	
+++ b/Generic Vehicles/Declaration Mode/Class5_Tractor_4x2/Class5_Tractor_DECL.vecto	
@@ -1,7 +1,7 @@
 {
   "Header": {
-    "CreatedBy": " ()",
-    "Date": "2016-10-13T10:08:21.7776564Z",
+    "CreatedBy": "",
+    "Date": "2017-07-03T14:47:43.6586880Z",
     "AppVersion": "3",
     "FileVersion": 3
   },
@@ -51,12 +51,6 @@
         ]
       }
     ],
-    "StartStop": {
-      "Enabled": false,
-      "MaxSpeed": 5.0,
-      "MinTime": 5.0,
-      "Delay": 5.0
-    },
     "OverSpeedEcoRoll": {
       "Mode": "Overspeed",
       "MinSpeed": 50.0,
diff --git a/Generic Vehicles/Declaration Mode/Class9_RigidTruck_6x2/Class9_RigidTruck.vveh b/Generic Vehicles/Declaration Mode/Class9_RigidTruck_6x2/Class9_RigidTruck.vveh
index d2a3b50e5b25192b95786e2a5f5f36c21ef45db0..3bd49af68ee95788da316d6944aaf949686f4910 100644
--- a/Generic Vehicles/Declaration Mode/Class9_RigidTruck_6x2/Class9_RigidTruck.vveh	
+++ b/Generic Vehicles/Declaration Mode/Class9_RigidTruck_6x2/Class9_RigidTruck.vveh	
@@ -1,13 +1,14 @@
 {
   "Header": {
     "CreatedBy": "",
-    "Date": "2017-06-22T11:16:11.6047543Z",
+    "Date": "2017-07-03T14:48:16.7076880Z",
     "AppVersion": "3",
     "FileVersion": 7
   },
   "Body": {
     "SavedInDeclMode": true,
     "VehCat": "RigidTruck",
+    "LegislativeClass": "N3",
     "CurbWeight": 9300.0,
     "CurbWeightExtra": 0.0,
     "Loading": 0.0,
diff --git a/Generic Vehicles/Declaration Mode/Class9_RigidTruck_AT_6x2/APT-S Generic TqMax1200.vgbx b/Generic Vehicles/Declaration Mode/Class9_RigidTruck_AT_6x2/APT-S Generic TqMax1200.vgbx
new file mode 100644
index 0000000000000000000000000000000000000000..e87c262e7982995d539eb34372e0a09429b8c8c1
--- /dev/null
+++ b/Generic Vehicles/Declaration Mode/Class9_RigidTruck_AT_6x2/APT-S Generic TqMax1200.vgbx	
@@ -0,0 +1,82 @@
+{
+  "Header": {
+    "CreatedBy": "",
+    "Date": "2017-06-28T08:04:09.4161407Z",
+    "AppVersion": "3",
+    "FileVersion": 6
+  },
+  "Body": {
+    "SavedInDeclMode": true,
+    "ModelName": "APT-S Generic TqMax1200",
+    "Inertia": 0.0,
+    "TracInt": 0.0,
+    "Gears": [
+      {
+        "Ratio": 6.5,
+        "LossMap": "Axle_i6-5.vtlm"
+      },
+      {
+        "Ratio": 3.49,
+        "LossMap": "Gear_1_i=3-49.vtlm",
+        "ShiftPolygon": "",
+        "MaxTorque": "",
+        "MaxSpeed": ""
+      },
+      {
+        "Ratio": 1.86,
+        "LossMap": "Gear_2_i=1-86.vtlm",
+        "ShiftPolygon": "",
+        "MaxTorque": "",
+        "MaxSpeed": ""
+      },
+      {
+        "Ratio": 1.41,
+        "LossMap": "Gear_3_i=1-41.vtlm",
+        "ShiftPolygon": "",
+        "MaxTorque": "",
+        "MaxSpeed": ""
+      },
+      {
+        "Ratio": 1.0,
+        "LossMap": "Gear_4_i=1.vtlm",
+        "ShiftPolygon": "",
+        "MaxTorque": "",
+        "MaxSpeed": ""
+      },
+      {
+        "Ratio": 0.75,
+        "LossMap": "Gear_5_i=0-75.vtlm",
+        "ShiftPolygon": "",
+        "MaxTorque": "",
+        "MaxSpeed": ""
+      },
+      {
+        "Ratio": 0.65,
+        "LossMap": "Gear_6_i=0-65.vtlm",
+        "ShiftPolygon": "",
+        "MaxTorque": "",
+        "MaxSpeed": ""
+      }
+    ],
+    "TqReserve": 20.0,
+    "ShiftTime": 1.5,
+    "StartTqReserve": 20.0,
+    "StartSpeed": 1.3,
+    "StartAcc": 0.6,
+    "GearboxType": "ATSerial",
+    "TorqueConverter": {
+      "Enabled": true,
+      "File": "TorqueConverter_Serial_TqMax1200.vtcc",
+      "RefRPM": 999.99999999999989,
+      "Inertia": 1.3,
+      "MaxTCSpeed": 5000.0,
+      "ShiftPolygon": "",
+      "CLUpshiftMinAcceleration": 0.0,
+      "CCUpshiftMinAcceleration": 0.0
+    },
+    "DownshiftAfterUpshiftDelay": 10.0,
+    "UpshiftAfterDownshiftDelay": 10.0,
+    "UpshiftMinAcceleration": 0.1,
+    "PowershiftShiftTime": 0.8
+  }
+}
\ No newline at end of file
diff --git a/Generic Vehicles/Declaration Mode/Class9_RigidTruck_AT_6x2/Axle_i6-5.vtlm b/Generic Vehicles/Declaration Mode/Class9_RigidTruck_AT_6x2/Axle_i6-5.vtlm
new file mode 100644
index 0000000000000000000000000000000000000000..27aedb86e849e955ffe7dc23e03d35f0bba112c4
--- /dev/null
+++ b/Generic Vehicles/Declaration Mode/Class9_RigidTruck_AT_6x2/Axle_i6-5.vtlm	
@@ -0,0 +1,771 @@
+Input Speed [1/min], Input Torque [Nm], Torque Loss [Nm]
+0,31.9587628865979,31.9587628865979
+0,70.4203013481364,31.9587628865979
+0,110.071371927042,33.1482950039651
+0,149.722442505948,34.3378271213323
+0,189.373513084853,35.5273592386995
+0,268.675654242665,37.9064234734338
+0,347.977795400476,40.2854877081681
+0,506.582077716098,45.0436161776368
+0,665.186360031721,49.8017446471055
+0,823.790642347343,54.5598731165741
+0,982.394924662966,59.3180015860429
+0,1140.99920697859,64.0761300555115
+0,1299.60348929421,68.8342585249803
+0,1458.20777160983,73.5923869944488
+0,1616.81205392546,78.3505154639175
+0,1934.0206185567,87.866772402855
+0,2251.22918318795,97.3830293417923
+0,2568.43774781919,106.89928628073
+0,2885.64631245044,116.415543219667
+0,3202.85487708168,125.931800158604
+0,3520.06344171293,135.448057097542
+0,3837.27200634417,144.964314036479
+0,4154.48057097542,154.480570975416
+0,4471.68913560666,163.996827914354
+0,4788.89770023791,173.513084853291
+0,5106.10626486915,183.029341792229
+0,5423.3148295004,192.545598731166
+0,5740.52339413164,202.061855670103
+0,6057.73195876289,211.578112609041
+0,6374.94052339413,221.094369547978
+0,6692.14908802538,230.610626486916
+0,7009.35765265662,240.126883425853
+0,7326.56621728787,249.64314036479
+0,7643.77478191911,259.159397303728
+0,7960.98334655036,268.675654242665
+325,31.9587628865979,31.9587628865979
+325,70.4203013481364,31.9587628865979
+325,110.071371927042,33.1482950039651
+325,149.722442505948,34.3378271213323
+325,189.373513084853,35.5273592386995
+325,268.675654242665,37.9064234734338
+325,347.977795400476,40.2854877081681
+325,506.582077716098,45.0436161776368
+325,665.186360031721,49.8017446471055
+325,823.790642347343,54.5598731165741
+325,982.394924662966,59.3180015860429
+325,1140.99920697859,64.0761300555115
+325,1299.60348929421,68.8342585249803
+325,1458.20777160983,73.5923869944488
+325,1616.81205392546,78.3505154639175
+325,1934.0206185567,87.866772402855
+325,2251.22918318795,97.3830293417923
+325,2568.43774781919,106.89928628073
+325,2885.64631245044,116.415543219667
+325,3202.85487708168,125.931800158604
+325,3520.06344171293,135.448057097542
+325,3837.27200634417,144.964314036479
+325,4154.48057097542,154.480570975416
+325,4471.68913560666,163.996827914354
+325,4788.89770023791,173.513084853291
+325,5106.10626486915,183.029341792229
+325,5423.3148295004,192.545598731166
+325,5740.52339413164,202.061855670103
+325,6057.73195876289,211.578112609041
+325,6374.94052339413,221.094369547978
+325,6692.14908802538,230.610626486916
+325,7009.35765265662,240.126883425853
+325,7326.56621728787,249.64314036479
+325,7643.77478191911,259.159397303728
+325,7960.98334655036,268.675654242665
+650,31.9587628865979,31.9587628865979
+650,70.4203013481364,31.9587628865979
+650,110.071371927042,33.1482950039651
+650,149.722442505948,34.3378271213323
+650,189.373513084853,35.5273592386995
+650,268.675654242665,37.9064234734338
+650,347.977795400476,40.2854877081681
+650,506.582077716098,45.0436161776368
+650,665.186360031721,49.8017446471055
+650,823.790642347343,54.5598731165741
+650,982.394924662966,59.3180015860429
+650,1140.99920697859,64.0761300555115
+650,1299.60348929421,68.8342585249803
+650,1458.20777160983,73.5923869944488
+650,1616.81205392546,78.3505154639175
+650,1934.0206185567,87.866772402855
+650,2251.22918318795,97.3830293417923
+650,2568.43774781919,106.89928628073
+650,2885.64631245044,116.415543219667
+650,3202.85487708168,125.931800158604
+650,3520.06344171293,135.448057097542
+650,3837.27200634417,144.964314036479
+650,4154.48057097542,154.480570975416
+650,4471.68913560666,163.996827914354
+650,4788.89770023791,173.513084853291
+650,5106.10626486915,183.029341792229
+650,5423.3148295004,192.545598731166
+650,5740.52339413164,202.061855670103
+650,6057.73195876289,211.578112609041
+650,6374.94052339413,221.094369547978
+650,6692.14908802538,230.610626486916
+650,7009.35765265662,240.126883425853
+650,7326.56621728787,249.64314036479
+650,7643.77478191911,259.159397303728
+650,7960.98334655036,268.675654242665
+975,31.9587628865979,31.9587628865979
+975,70.4203013481364,31.9587628865979
+975,110.071371927042,33.1482950039651
+975,149.722442505948,34.3378271213323
+975,189.373513084853,35.5273592386995
+975,268.675654242665,37.9064234734338
+975,347.977795400476,40.2854877081681
+975,506.582077716098,45.0436161776368
+975,665.186360031721,49.8017446471055
+975,823.790642347343,54.5598731165741
+975,982.394924662966,59.3180015860429
+975,1140.99920697859,64.0761300555115
+975,1299.60348929421,68.8342585249803
+975,1458.20777160983,73.5923869944488
+975,1616.81205392546,78.3505154639175
+975,1934.0206185567,87.866772402855
+975,2251.22918318795,97.3830293417923
+975,2568.43774781919,106.89928628073
+975,2885.64631245044,116.415543219667
+975,3202.85487708168,125.931800158604
+975,3520.06344171293,135.448057097542
+975,3837.27200634417,144.964314036479
+975,4154.48057097542,154.480570975416
+975,4471.68913560666,163.996827914354
+975,4788.89770023791,173.513084853291
+975,5106.10626486915,183.029341792229
+975,5423.3148295004,192.545598731166
+975,5740.52339413164,202.061855670103
+975,6057.73195876289,211.578112609041
+975,6374.94052339413,221.094369547978
+975,6692.14908802538,230.610626486916
+975,7009.35765265662,240.126883425853
+975,7326.56621728787,249.64314036479
+975,7643.77478191911,259.159397303728
+975,7960.98334655036,268.675654242665
+1300,31.9587628865979,31.9587628865979
+1300,70.4203013481364,31.9587628865979
+1300,110.071371927042,33.1482950039651
+1300,149.722442505948,34.3378271213323
+1300,189.373513084853,35.5273592386995
+1300,268.675654242665,37.9064234734338
+1300,347.977795400476,40.2854877081681
+1300,506.582077716098,45.0436161776368
+1300,665.186360031721,49.8017446471055
+1300,823.790642347343,54.5598731165741
+1300,982.394924662966,59.3180015860429
+1300,1140.99920697859,64.0761300555115
+1300,1299.60348929421,68.8342585249803
+1300,1458.20777160983,73.5923869944488
+1300,1616.81205392546,78.3505154639175
+1300,1934.0206185567,87.866772402855
+1300,2251.22918318795,97.3830293417923
+1300,2568.43774781919,106.89928628073
+1300,2885.64631245044,116.415543219667
+1300,3202.85487708168,125.931800158604
+1300,3520.06344171293,135.448057097542
+1300,3837.27200634417,144.964314036479
+1300,4154.48057097542,154.480570975416
+1300,4471.68913560666,163.996827914354
+1300,4788.89770023791,173.513084853291
+1300,5106.10626486915,183.029341792229
+1300,5423.3148295004,192.545598731166
+1300,5740.52339413164,202.061855670103
+1300,6057.73195876289,211.578112609041
+1300,6374.94052339413,221.094369547978
+1300,6692.14908802538,230.610626486916
+1300,7009.35765265662,240.126883425853
+1300,7326.56621728787,249.64314036479
+1300,7643.77478191911,259.159397303728
+1300,7960.98334655036,268.675654242665
+1625,31.9587628865979,31.9587628865979
+1625,70.4203013481364,31.9587628865979
+1625,110.071371927042,33.1482950039651
+1625,149.722442505948,34.3378271213323
+1625,189.373513084853,35.5273592386995
+1625,268.675654242665,37.9064234734338
+1625,347.977795400476,40.2854877081681
+1625,506.582077716098,45.0436161776368
+1625,665.186360031721,49.8017446471055
+1625,823.790642347343,54.5598731165741
+1625,982.394924662966,59.3180015860429
+1625,1140.99920697859,64.0761300555115
+1625,1299.60348929421,68.8342585249803
+1625,1458.20777160983,73.5923869944488
+1625,1616.81205392546,78.3505154639175
+1625,1934.0206185567,87.866772402855
+1625,2251.22918318795,97.3830293417923
+1625,2568.43774781919,106.89928628073
+1625,2885.64631245044,116.415543219667
+1625,3202.85487708168,125.931800158604
+1625,3520.06344171293,135.448057097542
+1625,3837.27200634417,144.964314036479
+1625,4154.48057097542,154.480570975416
+1625,4471.68913560666,163.996827914354
+1625,4788.89770023791,173.513084853291
+1625,5106.10626486915,183.029341792229
+1625,5423.3148295004,192.545598731166
+1625,5740.52339413164,202.061855670103
+1625,6057.73195876289,211.578112609041
+1625,6374.94052339413,221.094369547978
+1625,6692.14908802538,230.610626486916
+1625,7009.35765265662,240.126883425853
+1625,7326.56621728787,249.64314036479
+1625,7643.77478191911,259.159397303728
+1625,7960.98334655036,268.675654242665
+1950,31.9587628865979,31.9587628865979
+1950,70.4203013481364,31.9587628865979
+1950,110.071371927042,33.1482950039651
+1950,149.722442505948,34.3378271213323
+1950,189.373513084853,35.5273592386995
+1950,268.675654242665,37.9064234734338
+1950,347.977795400476,40.2854877081681
+1950,506.582077716098,45.0436161776368
+1950,665.186360031721,49.8017446471055
+1950,823.790642347343,54.5598731165741
+1950,982.394924662966,59.3180015860429
+1950,1140.99920697859,64.0761300555115
+1950,1299.60348929421,68.8342585249803
+1950,1458.20777160983,73.5923869944488
+1950,1616.81205392546,78.3505154639175
+1950,1934.0206185567,87.866772402855
+1950,2251.22918318795,97.3830293417923
+1950,2568.43774781919,106.89928628073
+1950,2885.64631245044,116.415543219667
+1950,3202.85487708168,125.931800158604
+1950,3520.06344171293,135.448057097542
+1950,3837.27200634417,144.964314036479
+1950,4154.48057097542,154.480570975416
+1950,4471.68913560666,163.996827914354
+1950,4788.89770023791,173.513084853291
+1950,5106.10626486915,183.029341792229
+1950,5423.3148295004,192.545598731166
+1950,5740.52339413164,202.061855670103
+1950,6057.73195876289,211.578112609041
+1950,6374.94052339413,221.094369547978
+1950,6692.14908802538,230.610626486916
+1950,7009.35765265662,240.126883425853
+1950,7326.56621728787,249.64314036479
+1950,7643.77478191911,259.159397303728
+1950,7960.98334655036,268.675654242665
+2275,31.9587628865979,31.9587628865979
+2275,70.4203013481364,31.9587628865979
+2275,110.071371927042,33.1482950039651
+2275,149.722442505948,34.3378271213323
+2275,189.373513084853,35.5273592386995
+2275,268.675654242665,37.9064234734338
+2275,347.977795400476,40.2854877081681
+2275,506.582077716098,45.0436161776368
+2275,665.186360031721,49.8017446471055
+2275,823.790642347343,54.5598731165741
+2275,982.394924662966,59.3180015860429
+2275,1140.99920697859,64.0761300555115
+2275,1299.60348929421,68.8342585249803
+2275,1458.20777160983,73.5923869944488
+2275,1616.81205392546,78.3505154639175
+2275,1934.0206185567,87.866772402855
+2275,2251.22918318795,97.3830293417923
+2275,2568.43774781919,106.89928628073
+2275,2885.64631245044,116.415543219667
+2275,3202.85487708168,125.931800158604
+2275,3520.06344171293,135.448057097542
+2275,3837.27200634417,144.964314036479
+2275,4154.48057097542,154.480570975416
+2275,4471.68913560666,163.996827914354
+2275,4788.89770023791,173.513084853291
+2275,5106.10626486915,183.029341792229
+2275,5423.3148295004,192.545598731166
+2275,5740.52339413164,202.061855670103
+2275,6057.73195876289,211.578112609041
+2275,6374.94052339413,221.094369547978
+2275,6692.14908802538,230.610626486916
+2275,7009.35765265662,240.126883425853
+2275,7326.56621728787,249.64314036479
+2275,7643.77478191911,259.159397303728
+2275,7960.98334655036,268.675654242665
+2600,31.9587628865979,31.9587628865979
+2600,70.4203013481364,31.9587628865979
+2600,110.071371927042,33.1482950039651
+2600,149.722442505948,34.3378271213323
+2600,189.373513084853,35.5273592386995
+2600,268.675654242665,37.9064234734338
+2600,347.977795400476,40.2854877081681
+2600,506.582077716098,45.0436161776368
+2600,665.186360031721,49.8017446471055
+2600,823.790642347343,54.5598731165741
+2600,982.394924662966,59.3180015860429
+2600,1140.99920697859,64.0761300555115
+2600,1299.60348929421,68.8342585249803
+2600,1458.20777160983,73.5923869944488
+2600,1616.81205392546,78.3505154639175
+2600,1934.0206185567,87.866772402855
+2600,2251.22918318795,97.3830293417923
+2600,2568.43774781919,106.89928628073
+2600,2885.64631245044,116.415543219667
+2600,3202.85487708168,125.931800158604
+2600,3520.06344171293,135.448057097542
+2600,3837.27200634417,144.964314036479
+2600,4154.48057097542,154.480570975416
+2600,4471.68913560666,163.996827914354
+2600,4788.89770023791,173.513084853291
+2600,5106.10626486915,183.029341792229
+2600,5423.3148295004,192.545598731166
+2600,5740.52339413164,202.061855670103
+2600,6057.73195876289,211.578112609041
+2600,6374.94052339413,221.094369547978
+2600,6692.14908802538,230.610626486916
+2600,7009.35765265662,240.126883425853
+2600,7326.56621728787,249.64314036479
+2600,7643.77478191911,259.159397303728
+2600,7960.98334655036,268.675654242665
+2925,31.9587628865979,31.9587628865979
+2925,70.4203013481364,31.9587628865979
+2925,110.071371927042,33.1482950039651
+2925,149.722442505948,34.3378271213323
+2925,189.373513084853,35.5273592386995
+2925,268.675654242665,37.9064234734338
+2925,347.977795400476,40.2854877081681
+2925,506.582077716098,45.0436161776368
+2925,665.186360031721,49.8017446471055
+2925,823.790642347343,54.5598731165741
+2925,982.394924662966,59.3180015860429
+2925,1140.99920697859,64.0761300555115
+2925,1299.60348929421,68.8342585249803
+2925,1458.20777160983,73.5923869944488
+2925,1616.81205392546,78.3505154639175
+2925,1934.0206185567,87.866772402855
+2925,2251.22918318795,97.3830293417923
+2925,2568.43774781919,106.89928628073
+2925,2885.64631245044,116.415543219667
+2925,3202.85487708168,125.931800158604
+2925,3520.06344171293,135.448057097542
+2925,3837.27200634417,144.964314036479
+2925,4154.48057097542,154.480570975416
+2925,4471.68913560666,163.996827914354
+2925,4788.89770023791,173.513084853291
+2925,5106.10626486915,183.029341792229
+2925,5423.3148295004,192.545598731166
+2925,5740.52339413164,202.061855670103
+2925,6057.73195876289,211.578112609041
+2925,6374.94052339413,221.094369547978
+2925,6692.14908802538,230.610626486916
+2925,7009.35765265662,240.126883425853
+2925,7326.56621728787,249.64314036479
+2925,7643.77478191911,259.159397303728
+2925,7960.98334655036,268.675654242665
+3250,31.9587628865979,31.9587628865979
+3250,70.4203013481364,31.9587628865979
+3250,110.071371927042,33.1482950039651
+3250,149.722442505948,34.3378271213323
+3250,189.373513084853,35.5273592386995
+3250,268.675654242665,37.9064234734338
+3250,347.977795400476,40.2854877081681
+3250,506.582077716098,45.0436161776368
+3250,665.186360031721,49.8017446471055
+3250,823.790642347343,54.5598731165741
+3250,982.394924662966,59.3180015860429
+3250,1140.99920697859,64.0761300555115
+3250,1299.60348929421,68.8342585249803
+3250,1458.20777160983,73.5923869944488
+3250,1616.81205392546,78.3505154639175
+3250,1934.0206185567,87.866772402855
+3250,2251.22918318795,97.3830293417923
+3250,2568.43774781919,106.89928628073
+3250,2885.64631245044,116.415543219667
+3250,3202.85487708168,125.931800158604
+3250,3520.06344171293,135.448057097542
+3250,3837.27200634417,144.964314036479
+3250,4154.48057097542,154.480570975416
+3250,4471.68913560666,163.996827914354
+3250,4788.89770023791,173.513084853291
+3250,5106.10626486915,183.029341792229
+3250,5423.3148295004,192.545598731166
+3250,5740.52339413164,202.061855670103
+3250,6057.73195876289,211.578112609041
+3250,6374.94052339413,221.094369547978
+3250,6692.14908802538,230.610626486916
+3250,7009.35765265662,240.126883425853
+3250,7326.56621728787,249.64314036479
+3250,7643.77478191911,259.159397303728
+3250,7960.98334655036,268.675654242665
+0,-31.9587628865979,31.9587628865979
+0,-70.4203013481364,31.9587628865979
+0,-110.071371927042,33.1482950039651
+0,-149.722442505948,34.3378271213323
+0,-189.373513084853,35.5273592386995
+0,-268.675654242665,37.9064234734338
+0,-347.977795400476,40.2854877081681
+0,-506.582077716098,45.0436161776368
+0,-665.186360031721,49.8017446471055
+0,-823.790642347343,54.5598731165741
+0,-982.394924662966,59.3180015860429
+0,-1140.99920697859,64.0761300555115
+0,-1299.60348929421,68.8342585249803
+0,-1458.20777160983,73.5923869944488
+0,-1616.81205392546,78.3505154639175
+0,-1934.0206185567,87.866772402855
+0,-2251.22918318795,97.3830293417923
+0,-2568.43774781919,106.89928628073
+0,-2885.64631245044,116.415543219667
+0,-3202.85487708168,125.931800158604
+0,-3520.06344171293,135.448057097542
+0,-3837.27200634417,144.964314036479
+0,-4154.48057097542,154.480570975416
+0,-4471.68913560666,163.996827914354
+0,-4788.89770023791,173.513084853291
+0,-5106.10626486915,183.029341792229
+0,-5423.3148295004,192.545598731166
+0,-5740.52339413164,202.061855670103
+0,-6057.73195876289,211.578112609041
+0,-6374.94052339413,221.094369547978
+0,-6692.14908802538,230.610626486916
+0,-7009.35765265662,240.126883425853
+0,-7326.56621728787,249.64314036479
+0,-7643.77478191911,259.159397303728
+0,-7960.98334655036,268.675654242665
+325,-31.9587628865979,31.9587628865979
+325,-70.4203013481364,31.9587628865979
+325,-110.071371927042,33.1482950039651
+325,-149.722442505948,34.3378271213323
+325,-189.373513084853,35.5273592386995
+325,-268.675654242665,37.9064234734338
+325,-347.977795400476,40.2854877081681
+325,-506.582077716098,45.0436161776368
+325,-665.186360031721,49.8017446471055
+325,-823.790642347343,54.5598731165741
+325,-982.394924662966,59.3180015860429
+325,-1140.99920697859,64.0761300555115
+325,-1299.60348929421,68.8342585249803
+325,-1458.20777160983,73.5923869944488
+325,-1616.81205392546,78.3505154639175
+325,-1934.0206185567,87.866772402855
+325,-2251.22918318795,97.3830293417923
+325,-2568.43774781919,106.89928628073
+325,-2885.64631245044,116.415543219667
+325,-3202.85487708168,125.931800158604
+325,-3520.06344171293,135.448057097542
+325,-3837.27200634417,144.964314036479
+325,-4154.48057097542,154.480570975416
+325,-4471.68913560666,163.996827914354
+325,-4788.89770023791,173.513084853291
+325,-5106.10626486915,183.029341792229
+325,-5423.3148295004,192.545598731166
+325,-5740.52339413164,202.061855670103
+325,-6057.73195876289,211.578112609041
+325,-6374.94052339413,221.094369547978
+325,-6692.14908802538,230.610626486916
+325,-7009.35765265662,240.126883425853
+325,-7326.56621728787,249.64314036479
+325,-7643.77478191911,259.159397303728
+325,-7960.98334655036,268.675654242665
+650,-31.9587628865979,31.9587628865979
+650,-70.4203013481364,31.9587628865979
+650,-110.071371927042,33.1482950039651
+650,-149.722442505948,34.3378271213323
+650,-189.373513084853,35.5273592386995
+650,-268.675654242665,37.9064234734338
+650,-347.977795400476,40.2854877081681
+650,-506.582077716098,45.0436161776368
+650,-665.186360031721,49.8017446471055
+650,-823.790642347343,54.5598731165741
+650,-982.394924662966,59.3180015860429
+650,-1140.99920697859,64.0761300555115
+650,-1299.60348929421,68.8342585249803
+650,-1458.20777160983,73.5923869944488
+650,-1616.81205392546,78.3505154639175
+650,-1934.0206185567,87.866772402855
+650,-2251.22918318795,97.3830293417923
+650,-2568.43774781919,106.89928628073
+650,-2885.64631245044,116.415543219667
+650,-3202.85487708168,125.931800158604
+650,-3520.06344171293,135.448057097542
+650,-3837.27200634417,144.964314036479
+650,-4154.48057097542,154.480570975416
+650,-4471.68913560666,163.996827914354
+650,-4788.89770023791,173.513084853291
+650,-5106.10626486915,183.029341792229
+650,-5423.3148295004,192.545598731166
+650,-5740.52339413164,202.061855670103
+650,-6057.73195876289,211.578112609041
+650,-6374.94052339413,221.094369547978
+650,-6692.14908802538,230.610626486916
+650,-7009.35765265662,240.126883425853
+650,-7326.56621728787,249.64314036479
+650,-7643.77478191911,259.159397303728
+650,-7960.98334655036,268.675654242665
+975,-31.9587628865979,31.9587628865979
+975,-70.4203013481364,31.9587628865979
+975,-110.071371927042,33.1482950039651
+975,-149.722442505948,34.3378271213323
+975,-189.373513084853,35.5273592386995
+975,-268.675654242665,37.9064234734338
+975,-347.977795400476,40.2854877081681
+975,-506.582077716098,45.0436161776368
+975,-665.186360031721,49.8017446471055
+975,-823.790642347343,54.5598731165741
+975,-982.394924662966,59.3180015860429
+975,-1140.99920697859,64.0761300555115
+975,-1299.60348929421,68.8342585249803
+975,-1458.20777160983,73.5923869944488
+975,-1616.81205392546,78.3505154639175
+975,-1934.0206185567,87.866772402855
+975,-2251.22918318795,97.3830293417923
+975,-2568.43774781919,106.89928628073
+975,-2885.64631245044,116.415543219667
+975,-3202.85487708168,125.931800158604
+975,-3520.06344171293,135.448057097542
+975,-3837.27200634417,144.964314036479
+975,-4154.48057097542,154.480570975416
+975,-4471.68913560666,163.996827914354
+975,-4788.89770023791,173.513084853291
+975,-5106.10626486915,183.029341792229
+975,-5423.3148295004,192.545598731166
+975,-5740.52339413164,202.061855670103
+975,-6057.73195876289,211.578112609041
+975,-6374.94052339413,221.094369547978
+975,-6692.14908802538,230.610626486916
+975,-7009.35765265662,240.126883425853
+975,-7326.56621728787,249.64314036479
+975,-7643.77478191911,259.159397303728
+975,-7960.98334655036,268.675654242665
+1300,-31.9587628865979,31.9587628865979
+1300,-70.4203013481364,31.9587628865979
+1300,-110.071371927042,33.1482950039651
+1300,-149.722442505948,34.3378271213323
+1300,-189.373513084853,35.5273592386995
+1300,-268.675654242665,37.9064234734338
+1300,-347.977795400476,40.2854877081681
+1300,-506.582077716098,45.0436161776368
+1300,-665.186360031721,49.8017446471055
+1300,-823.790642347343,54.5598731165741
+1300,-982.394924662966,59.3180015860429
+1300,-1140.99920697859,64.0761300555115
+1300,-1299.60348929421,68.8342585249803
+1300,-1458.20777160983,73.5923869944488
+1300,-1616.81205392546,78.3505154639175
+1300,-1934.0206185567,87.866772402855
+1300,-2251.22918318795,97.3830293417923
+1300,-2568.43774781919,106.89928628073
+1300,-2885.64631245044,116.415543219667
+1300,-3202.85487708168,125.931800158604
+1300,-3520.06344171293,135.448057097542
+1300,-3837.27200634417,144.964314036479
+1300,-4154.48057097542,154.480570975416
+1300,-4471.68913560666,163.996827914354
+1300,-4788.89770023791,173.513084853291
+1300,-5106.10626486915,183.029341792229
+1300,-5423.3148295004,192.545598731166
+1300,-5740.52339413164,202.061855670103
+1300,-6057.73195876289,211.578112609041
+1300,-6374.94052339413,221.094369547978
+1300,-6692.14908802538,230.610626486916
+1300,-7009.35765265662,240.126883425853
+1300,-7326.56621728787,249.64314036479
+1300,-7643.77478191911,259.159397303728
+1300,-7960.98334655036,268.675654242665
+1625,-31.9587628865979,31.9587628865979
+1625,-70.4203013481364,31.9587628865979
+1625,-110.071371927042,33.1482950039651
+1625,-149.722442505948,34.3378271213323
+1625,-189.373513084853,35.5273592386995
+1625,-268.675654242665,37.9064234734338
+1625,-347.977795400476,40.2854877081681
+1625,-506.582077716098,45.0436161776368
+1625,-665.186360031721,49.8017446471055
+1625,-823.790642347343,54.5598731165741
+1625,-982.394924662966,59.3180015860429
+1625,-1140.99920697859,64.0761300555115
+1625,-1299.60348929421,68.8342585249803
+1625,-1458.20777160983,73.5923869944488
+1625,-1616.81205392546,78.3505154639175
+1625,-1934.0206185567,87.866772402855
+1625,-2251.22918318795,97.3830293417923
+1625,-2568.43774781919,106.89928628073
+1625,-2885.64631245044,116.415543219667
+1625,-3202.85487708168,125.931800158604
+1625,-3520.06344171293,135.448057097542
+1625,-3837.27200634417,144.964314036479
+1625,-4154.48057097542,154.480570975416
+1625,-4471.68913560666,163.996827914354
+1625,-4788.89770023791,173.513084853291
+1625,-5106.10626486915,183.029341792229
+1625,-5423.3148295004,192.545598731166
+1625,-5740.52339413164,202.061855670103
+1625,-6057.73195876289,211.578112609041
+1625,-6374.94052339413,221.094369547978
+1625,-6692.14908802538,230.610626486916
+1625,-7009.35765265662,240.126883425853
+1625,-7326.56621728787,249.64314036479
+1625,-7643.77478191911,259.159397303728
+1625,-7960.98334655036,268.675654242665
+1950,-31.9587628865979,31.9587628865979
+1950,-70.4203013481364,31.9587628865979
+1950,-110.071371927042,33.1482950039651
+1950,-149.722442505948,34.3378271213323
+1950,-189.373513084853,35.5273592386995
+1950,-268.675654242665,37.9064234734338
+1950,-347.977795400476,40.2854877081681
+1950,-506.582077716098,45.0436161776368
+1950,-665.186360031721,49.8017446471055
+1950,-823.790642347343,54.5598731165741
+1950,-982.394924662966,59.3180015860429
+1950,-1140.99920697859,64.0761300555115
+1950,-1299.60348929421,68.8342585249803
+1950,-1458.20777160983,73.5923869944488
+1950,-1616.81205392546,78.3505154639175
+1950,-1934.0206185567,87.866772402855
+1950,-2251.22918318795,97.3830293417923
+1950,-2568.43774781919,106.89928628073
+1950,-2885.64631245044,116.415543219667
+1950,-3202.85487708168,125.931800158604
+1950,-3520.06344171293,135.448057097542
+1950,-3837.27200634417,144.964314036479
+1950,-4154.48057097542,154.480570975416
+1950,-4471.68913560666,163.996827914354
+1950,-4788.89770023791,173.513084853291
+1950,-5106.10626486915,183.029341792229
+1950,-5423.3148295004,192.545598731166
+1950,-5740.52339413164,202.061855670103
+1950,-6057.73195876289,211.578112609041
+1950,-6374.94052339413,221.094369547978
+1950,-6692.14908802538,230.610626486916
+1950,-7009.35765265662,240.126883425853
+1950,-7326.56621728787,249.64314036479
+1950,-7643.77478191911,259.159397303728
+1950,-7960.98334655036,268.675654242665
+2275,-31.9587628865979,31.9587628865979
+2275,-70.4203013481364,31.9587628865979
+2275,-110.071371927042,33.1482950039651
+2275,-149.722442505948,34.3378271213323
+2275,-189.373513084853,35.5273592386995
+2275,-268.675654242665,37.9064234734338
+2275,-347.977795400476,40.2854877081681
+2275,-506.582077716098,45.0436161776368
+2275,-665.186360031721,49.8017446471055
+2275,-823.790642347343,54.5598731165741
+2275,-982.394924662966,59.3180015860429
+2275,-1140.99920697859,64.0761300555115
+2275,-1299.60348929421,68.8342585249803
+2275,-1458.20777160983,73.5923869944488
+2275,-1616.81205392546,78.3505154639175
+2275,-1934.0206185567,87.866772402855
+2275,-2251.22918318795,97.3830293417923
+2275,-2568.43774781919,106.89928628073
+2275,-2885.64631245044,116.415543219667
+2275,-3202.85487708168,125.931800158604
+2275,-3520.06344171293,135.448057097542
+2275,-3837.27200634417,144.964314036479
+2275,-4154.48057097542,154.480570975416
+2275,-4471.68913560666,163.996827914354
+2275,-4788.89770023791,173.513084853291
+2275,-5106.10626486915,183.029341792229
+2275,-5423.3148295004,192.545598731166
+2275,-5740.52339413164,202.061855670103
+2275,-6057.73195876289,211.578112609041
+2275,-6374.94052339413,221.094369547978
+2275,-6692.14908802538,230.610626486916
+2275,-7009.35765265662,240.126883425853
+2275,-7326.56621728787,249.64314036479
+2275,-7643.77478191911,259.159397303728
+2275,-7960.98334655036,268.675654242665
+2600,-31.9587628865979,31.9587628865979
+2600,-70.4203013481364,31.9587628865979
+2600,-110.071371927042,33.1482950039651
+2600,-149.722442505948,34.3378271213323
+2600,-189.373513084853,35.5273592386995
+2600,-268.675654242665,37.9064234734338
+2600,-347.977795400476,40.2854877081681
+2600,-506.582077716098,45.0436161776368
+2600,-665.186360031721,49.8017446471055
+2600,-823.790642347343,54.5598731165741
+2600,-982.394924662966,59.3180015860429
+2600,-1140.99920697859,64.0761300555115
+2600,-1299.60348929421,68.8342585249803
+2600,-1458.20777160983,73.5923869944488
+2600,-1616.81205392546,78.3505154639175
+2600,-1934.0206185567,87.866772402855
+2600,-2251.22918318795,97.3830293417923
+2600,-2568.43774781919,106.89928628073
+2600,-2885.64631245044,116.415543219667
+2600,-3202.85487708168,125.931800158604
+2600,-3520.06344171293,135.448057097542
+2600,-3837.27200634417,144.964314036479
+2600,-4154.48057097542,154.480570975416
+2600,-4471.68913560666,163.996827914354
+2600,-4788.89770023791,173.513084853291
+2600,-5106.10626486915,183.029341792229
+2600,-5423.3148295004,192.545598731166
+2600,-5740.52339413164,202.061855670103
+2600,-6057.73195876289,211.578112609041
+2600,-6374.94052339413,221.094369547978
+2600,-6692.14908802538,230.610626486916
+2600,-7009.35765265662,240.126883425853
+2600,-7326.56621728787,249.64314036479
+2600,-7643.77478191911,259.159397303728
+2600,-7960.98334655036,268.675654242665
+2925,-31.9587628865979,31.9587628865979
+2925,-70.4203013481364,31.9587628865979
+2925,-110.071371927042,33.1482950039651
+2925,-149.722442505948,34.3378271213323
+2925,-189.373513084853,35.5273592386995
+2925,-268.675654242665,37.9064234734338
+2925,-347.977795400476,40.2854877081681
+2925,-506.582077716098,45.0436161776368
+2925,-665.186360031721,49.8017446471055
+2925,-823.790642347343,54.5598731165741
+2925,-982.394924662966,59.3180015860429
+2925,-1140.99920697859,64.0761300555115
+2925,-1299.60348929421,68.8342585249803
+2925,-1458.20777160983,73.5923869944488
+2925,-1616.81205392546,78.3505154639175
+2925,-1934.0206185567,87.866772402855
+2925,-2251.22918318795,97.3830293417923
+2925,-2568.43774781919,106.89928628073
+2925,-2885.64631245044,116.415543219667
+2925,-3202.85487708168,125.931800158604
+2925,-3520.06344171293,135.448057097542
+2925,-3837.27200634417,144.964314036479
+2925,-4154.48057097542,154.480570975416
+2925,-4471.68913560666,163.996827914354
+2925,-4788.89770023791,173.513084853291
+2925,-5106.10626486915,183.029341792229
+2925,-5423.3148295004,192.545598731166
+2925,-5740.52339413164,202.061855670103
+2925,-6057.73195876289,211.578112609041
+2925,-6374.94052339413,221.094369547978
+2925,-6692.14908802538,230.610626486916
+2925,-7009.35765265662,240.126883425853
+2925,-7326.56621728787,249.64314036479
+2925,-7643.77478191911,259.159397303728
+2925,-7960.98334655036,268.675654242665
+3250,-31.9587628865979,31.9587628865979
+3250,-70.4203013481364,31.9587628865979
+3250,-110.071371927042,33.1482950039651
+3250,-149.722442505948,34.3378271213323
+3250,-189.373513084853,35.5273592386995
+3250,-268.675654242665,37.9064234734338
+3250,-347.977795400476,40.2854877081681
+3250,-506.582077716098,45.0436161776368
+3250,-665.186360031721,49.8017446471055
+3250,-823.790642347343,54.5598731165741
+3250,-982.394924662966,59.3180015860429
+3250,-1140.99920697859,64.0761300555115
+3250,-1299.60348929421,68.8342585249803
+3250,-1458.20777160983,73.5923869944488
+3250,-1616.81205392546,78.3505154639175
+3250,-1934.0206185567,87.866772402855
+3250,-2251.22918318795,97.3830293417923
+3250,-2568.43774781919,106.89928628073
+3250,-2885.64631245044,116.415543219667
+3250,-3202.85487708168,125.931800158604
+3250,-3520.06344171293,135.448057097542
+3250,-3837.27200634417,144.964314036479
+3250,-4154.48057097542,154.480570975416
+3250,-4471.68913560666,163.996827914354
+3250,-4788.89770023791,173.513084853291
+3250,-5106.10626486915,183.029341792229
+3250,-5423.3148295004,192.545598731166
+3250,-5740.52339413164,202.061855670103
+3250,-6057.73195876289,211.578112609041
+3250,-6374.94052339413,221.094369547978
+3250,-6692.14908802538,230.610626486916
+3250,-7009.35765265662,240.126883425853
+3250,-7326.56621728787,249.64314036479
+3250,-7643.77478191911,259.159397303728
+3250,-7960.98334655036,268.675654242665
diff --git a/Generic Vehicles/Declaration Mode/Class9_RigidTruck_AT_6x2/Class_9_RigidTruck_AT_Decl.vecto b/Generic Vehicles/Declaration Mode/Class9_RigidTruck_AT_6x2/Class_9_RigidTruck_AT_Decl.vecto
new file mode 100644
index 0000000000000000000000000000000000000000..7b6c7a4813b944438dd1e05049ff2bdd27a7b164
--- /dev/null
+++ b/Generic Vehicles/Declaration Mode/Class9_RigidTruck_AT_6x2/Class_9_RigidTruck_AT_Decl.vecto	
@@ -0,0 +1,61 @@
+{
+  "Header": {
+    "CreatedBy": "",
+    "Date": "2017-07-03T12:21:05.6496880Z",
+    "AppVersion": "3",
+    "FileVersion": 3
+  },
+  "Body": {
+    "SavedInDeclMode": true,
+    "EngineOnlyMode": false,
+    "VehicleFile": "RigidTruck_6x2.vveh",
+    "EngineFile": "Engine_220kW.veng",
+    "GearboxFile": "APT-S Generic TqMax1200.vgbx",
+    "AuxiliaryAssembly": "Classic",
+    "AuxiliaryVersion": "CLASSIC",
+    "AdvancedAuxiliaryFilePath": "",
+    "Aux": [
+      {
+        "ID": "FAN",
+        "Type": "Fan",
+        "Technology": [
+          "Belt driven or driven via transm. - Electronically controlled visco clutch"
+        ]
+      },
+      {
+        "ID": "STP",
+        "Type": "Steering pump",
+        "Technology": [
+          "Fixed displacement"
+        ]
+      },
+      {
+        "ID": "AC",
+        "Type": "HVAC",
+        "Technology": [
+          "Default"
+        ]
+      },
+      {
+        "ID": "ES",
+        "Type": "Electric System",
+        "Technology": [
+          "Standard technology"
+        ]
+      },
+      {
+        "ID": "PS",
+        "Type": "Pneumatic System",
+        "Technology": [
+          "Medium Supply 2-stage + ESS + AMS"
+        ]
+      }
+    ],
+    "OverSpeedEcoRoll": {
+      "Mode": "Overspeed",
+      "MinSpeed": 50.0,
+      "OverSpeed": 5.0,
+      "UnderSpeed": 5.0
+    }
+  }
+}
\ No newline at end of file
diff --git a/Generic Vehicles/Declaration Mode/Class9_RigidTruck_AT_6x2/Engine_220kW.veng b/Generic Vehicles/Declaration Mode/Class9_RigidTruck_AT_6x2/Engine_220kW.veng
new file mode 100644
index 0000000000000000000000000000000000000000..2518101cee6f75f8dc94e86f60994e441dfa5ce1
--- /dev/null
+++ b/Generic Vehicles/Declaration Mode/Class9_RigidTruck_AT_6x2/Engine_220kW.veng	
@@ -0,0 +1,28 @@
+{
+  "Header": {
+    "CreatedBy": "",
+    "Date": "2017-06-28T08:27:38.7951297Z",
+    "AppVersion": "3",
+    "FileVersion": 4
+  },
+  "Body": {
+    "SavedInDeclMode": true,
+    "ModelName": "Generic 220kW 7.7l Engine",
+    "Displacement": "7700",
+    "IdlingSpeed": 600.0,
+    "Inertia": 3.789,
+    "WHTC-Urban": 1.03,
+    "WHTC-Rural": 1.01,
+    "WHTC-Motorway": 1.0,
+    "WHTC-Engineering": 1.03,
+    "ColdHotBalancingFactor": 1.0,
+    "CFRegPer": 1.0,
+    "CFNCV": 1.0,
+    "RatedPower": 220000.0,
+    "RatedSpeed": 2200.0,
+    "MaxTorque": 1200.0,
+    "FuelType": "DieselCI",
+    "FullLoadCurve": "Engine_220kW.vfld",
+    "FuelMap": "Engine_220kW.vmap"
+  }
+}
\ No newline at end of file
diff --git a/Generic Vehicles/Declaration Mode/Class9_RigidTruck_AT_6x2/Engine_220kW.vfld b/Generic Vehicles/Declaration Mode/Class9_RigidTruck_AT_6x2/Engine_220kW.vfld
new file mode 100644
index 0000000000000000000000000000000000000000..1950d7635e43cc30c5a10f139625041e43d2c61d
--- /dev/null
+++ b/Generic Vehicles/Declaration Mode/Class9_RigidTruck_AT_6x2/Engine_220kW.vfld	
@@ -0,0 +1,13 @@
+engine speed [1/min],full load torque [Nm],motoring torque [Nm]
+600,600,-43.579
+800,836,-53.659
+1000,1069.521218,-62.025357
+1200,1200,-73.94288
+1400,1200,-85.2547035
+1600,1200,-96.566527
+1800,1123.617983,-103.414737
+2000,1037.521525,-110.72677
+2200,953.9486854,-124.56264
+2400,815.3547523,-134.718847
+2500,711.2927252,-139.183674
+2600,0,-145.132532
diff --git a/Generic Vehicles/Declaration Mode/Class9_RigidTruck_AT_6x2/Engine_220kW.vmap b/Generic Vehicles/Declaration Mode/Class9_RigidTruck_AT_6x2/Engine_220kW.vmap
new file mode 100644
index 0000000000000000000000000000000000000000..7ae025ef1f2a8fd8d8e070eb5dcf42ecb49be07b
--- /dev/null
+++ b/Generic Vehicles/Declaration Mode/Class9_RigidTruck_AT_6x2/Engine_220kW.vmap	
@@ -0,0 +1,147 @@
+engine speed [rpm],torque [Nm],fuel consumption [g/h]
+600,-44.579,0
+600,0,638
+600,70,1601.24
+600,100,2020.04
+600,200,3330.70588235294
+600,300,4651.64
+600,400,5962.41176470588
+600,500,7979.12
+600,600,10025.1176470588
+800,-54.659,0
+800,0,914.256225905983
+800,70,1862.23669744703
+800,100,2367.74806976117
+800,200,4006.78510458877
+800,300,5667.98318630181
+800,400,7335.34723841065
+800,500,9511.01908700806
+800,600,11650.650968045
+800,700,13773.9770410575
+800,800,15797.4270742006
+800,836,16529.9195199215
+1000,-63.6310565,0
+1000,0,1190.51245181197
+1000,70,2123.23339489406
+1000,100,2715.45613952235
+1000,200,4682.86432682459
+1000,300,6684.32637260363
+1000,400,8708.28271211541
+1000,500,11042.9181740161
+1000,600,13276.1842890311
+1000,700,15477.7580036837
+1000,800,17682.6776778131
+1000,900,19910.3154481575
+1000,1000,22137.4733292159
+1000,1070,23687.7506196206
+1200,-74.94288,0
+1200,0,1466.76867771795
+1200,70,2384.23009234109
+1200,100,3063.16420928352
+1200,200,5358.94354906042
+1200,300,7700.66955890544
+1200,400,10081.2181858202
+1200,500,12574.8172610242
+1200,600,14901.7176100172
+1200,700,17181.5389663098
+1200,800,19567.9282814255
+1200,900,21988.5025840009
+1200,1000,24410.5499938238
+1200,1100,26818.115111918
+1200,1200,29600.8460156484
+1400,-86.2547035,0
+1400,0,1943.23102011723
+1400,70,2867.47013233511
+1400,100,3660.89882141199
+1400,200,6305.66552427192
+1400,300,9033.22733052332
+1400,400,11786.0215181328
+1400,500,14469.4815362731
+1400,600,17183.3279696788
+1400,700,20019.0117898106
+1400,800,22833.0135382571
+1400,900,25503.8101180654
+1400,1000,28133.1269579571
+1400,1100,30822.6887344662
+1400,1200,33616.5017759808
+1600,-97.566527,0
+1600,0,2390.6835686806
+1600,70,3375.40160192783
+1600,100,4270.71119614809
+1600,200,7255.07651021562
+1600,300,10395.2548568878
+1600,400,13532.5784663098
+1600,500,16706.5392692034
+1600,600,19830.2452028337
+1600,700,22960.5043452122
+1600,800,26109.440635472
+1600,900,29158.7021558733
+1600,1000,32050.2297249921
+1600,1100,35223.8264822578
+1600,1200,38415.2311208446
+1800,-104.414737,0
+1800,0,2890.45579554627
+1800,70,3985.0324218874
+1800,100,4965.43037801527
+1800,200,8233.42356510818
+1800,300,11783.4265584525
+1800,400,15307.0860504043
+1800,500,18849.1633858464
+1800,600,22267.4693346934
+1800,700,25749.1637322378
+1800,800,29389.5619094482
+1800,900,32951.6548737928
+1800,1000,36567.9831510803
+1800,1100,40354.8768962419
+1800,1124,41263.456024854
+2000,-111.72677,0
+2000,0,3496.10145365531
+2000,70,4806.78887658531
+2000,100,5854.50681474508
+2000,200,9346.90740755971
+2000,300,13318.196653646
+2000,400,17192.1593059257
+2000,500,21141.1017187055
+2000,600,25063.6902845325
+2000,700,28933.7283892341
+2000,800,33033.1981895635
+2000,900,37186.4876337875
+2000,1000,41216.6584804945
+2000,1038,42697.6298262953
+2200,-125.56264,0
+2200,0,4247.17502566154
+2200,70,5534.02108620948
+2200,100,6687.77342580669
+2200,200,10533.6121100547
+2200,300,14853.0183929775
+2200,400,19148.399769035
+2200,500,23390.9892034139
+2200,600,27829.4437635697
+2200,700,32500.7462334357
+2200,800,37123.6305457812
+2200,900,41612.3079508872
+2200,955,44050.2046085433
+2400,-135.718847,0
+2400,0,4945.09679719305
+2400,70,6234.18143404208
+2400,100,7525.65706479749
+2400,200,11830.6027591525
+2400,300,16443.4719386838
+2400,400,21308.1934105712
+2400,500,26325.659943101
+2400,600,31335.4206079209
+2400,700,36716.1939552295
+2400,800,42106.7959841282
+2400,815,42844.1063139178
+2500,-140.183674,0
+2500,0,5337.86693039768
+2500,70,6286.75667605001
+2500,100,7731.92699872726
+2500,200,12386.9152267725
+2500,300,17232.6104469567
+2500,400,22335.9931616381
+2500,500,27944.5498150782
+2500,600,33199.9206079209
+2500,710,39388.7795567867
+2600,-146.132532,0
+2600,0,5534.251997
diff --git a/Generic Vehicles/Declaration Mode/Class9_RigidTruck_AT_6x2/Gear_1_i=3-49.vtlm b/Generic Vehicles/Declaration Mode/Class9_RigidTruck_AT_6x2/Gear_1_i=3-49.vtlm
new file mode 100644
index 0000000000000000000000000000000000000000..5e25d590800c006073435dc6f634f14e0848cbb4
--- /dev/null
+++ b/Generic Vehicles/Declaration Mode/Class9_RigidTruck_AT_6x2/Gear_1_i=3-49.vtlm	
@@ -0,0 +1,202 @@
+Input Speed [1/min], Input Torque [Nm], Torque Loss [Nm]
+0,0,48
+0,200,56
+0,400,64
+0,600,72
+0,900,84
+0,1200,96
+0,1600,112
+0,2000,128
+0,2500,148
+600,0,48
+600,200,56
+600,400,64
+600,600,72
+600,900,84
+600,1200,96
+600,1600,112
+600,2000,128
+600,2500,148
+900,0,57
+900,200,65
+900,400,73
+900,600,81
+900,900,93
+900,1200,105
+900,1600,121
+900,2000,137
+900,2500,157
+1200,0,66
+1200,200,74
+1200,400,82
+1200,600,90
+1200,900,102
+1200,1200,114
+1200,1600,130
+1200,2000,146
+1200,2500,166
+1600,0,78
+1600,200,86
+1600,400,94
+1600,600,102
+1600,900,114
+1600,1200,126
+1600,1600,142
+1600,2000,158
+1600,2500,178
+2000,0,90
+2000,200,98
+2000,400,106
+2000,600,114
+2000,900,126
+2000,1200,138
+2000,1600,154
+2000,2000,170
+2000,2500,190
+2500,0,105
+2500,200,113
+2500,400,121
+2500,600,129
+2500,900,141
+2500,1200,153
+2500,1600,169
+2500,2000,185
+2500,2500,205
+3000,0,120
+3000,200,128
+3000,400,136
+3000,600,144
+3000,900,156
+3000,1200,168
+3000,1600,184
+3000,2000,200
+3000,2500,220
+600,0,48
+600,-200,56
+600,-400,64
+600,-600,72
+600,-900,84
+600,-1200,96
+600,-1600,112
+600,-2000,128
+600,-2500,148
+900,0,57
+900,-200,65
+900,-400,73
+900,-600,81
+900,-900,93
+900,-1200,105
+900,-1600,121
+900,-2000,137
+900,-2500,157
+1200,0,66
+1200,-200,74
+1200,-400,82
+1200,-600,90
+1200,-900,102
+1200,-1200,114
+1200,-1600,130
+1200,-2000,146
+1200,-2500,166
+1600,0,78
+1600,-200,86
+1600,-400,94
+1600,-600,102
+1600,-900,114
+1600,-1200,126
+1600,-1600,142
+1600,-2000,158
+1600,-2500,178
+2000,0,90
+2000,-200,98
+2000,-400,106
+2000,-600,114
+2000,-900,126
+2000,-1200,138
+2000,-1600,154
+2000,-2000,170
+2000,-2500,190
+2500,0,105
+2500,-200,113
+2500,-400,121
+2500,-600,129
+2500,-900,141
+2500,-1200,153
+2500,-1600,169
+2500,-2000,185
+2500,-2500,205
+3000,0,120
+3000,-200,128
+3000,-400,136
+3000,-600,144
+3000,-900,156
+3000,-1200,168
+3000,-1600,184
+3000,-2000,200
+3000,-2500,220
+1300,2610,66
+1300,2842,71
+1500,-812,46
+1500,-348,37
+1500,0,13
+1500,58,16
+1500,290,21
+1500,522,26
+1500,754,30
+1500,986,35
+1500,1218,39
+1500,1450,44
+1500,1682,49
+1500,1914,53
+1500,2146,58
+1500,2378,63
+1500,2610,67
+1500,2842,72
+1700,-812,49
+1700,-348,39
+1700,0,14
+1700,58,17
+1700,290,22
+1700,522,27
+1700,754,31
+1700,986,36
+1700,1218,41
+1700,1450,45
+1700,1682,50
+1700,1914,55
+1700,2146,59
+1700,2378,64
+1700,2610,68
+1700,2842,73
+1900,-812,51
+1900,-348,42
+1900,0,15
+1900,58,19
+1900,290,23
+1900,522,28
+1900,754,32
+1900,986,37
+1900,1218,42
+1900,1450,46
+1900,1682,51
+1900,1914,56
+1900,2146,60
+1900,2378,65
+1900,2610,70
+1900,2842,74
+2100,-812,53
+2100,-348,44
+2100,0,16
+2100,58,20
+2100,290,24
+2100,522,29
+2100,754,34
+2100,986,38
+2100,1218,43
+2100,1450,48
+2100,1682,52
+2100,1914,57
+2100,2146,61
+2100,2378,66
+2100,2610,71
+2100,2842,75
diff --git a/Generic Vehicles/Declaration Mode/Class9_RigidTruck_AT_6x2/Gear_2_i=1-86.vtlm b/Generic Vehicles/Declaration Mode/Class9_RigidTruck_AT_6x2/Gear_2_i=1-86.vtlm
new file mode 100644
index 0000000000000000000000000000000000000000..1cdc06160aa4dcdfe6fcf5775fc18e4c5fa943ff
--- /dev/null
+++ b/Generic Vehicles/Declaration Mode/Class9_RigidTruck_AT_6x2/Gear_2_i=1-86.vtlm	
@@ -0,0 +1,136 @@
+Input Speed [1/min], Input Torque [Nm], Torque Loss [Nm]
+0,0,48
+0,200,56
+0,400,64
+0,600,72
+0,900,84
+0,1200,96
+0,1600,112
+0,2000,128
+0,2500,148
+600,0,48
+600,200,56
+600,400,64
+600,600,72
+600,900,84
+600,1200,96
+600,1600,112
+600,2000,128
+600,2500,148
+900,0,57
+900,200,65
+900,400,73
+900,600,81
+900,900,93
+900,1200,105
+900,1600,121
+900,2000,137
+900,2500,157
+1200,0,66
+1200,200,74
+1200,400,82
+1200,600,90
+1200,900,102
+1200,1200,114
+1200,1600,130
+1200,2000,146
+1200,2500,166
+1600,0,78
+1600,200,86
+1600,400,94
+1600,600,102
+1600,900,114
+1600,1200,126
+1600,1600,142
+1600,2000,158
+1600,2500,178
+2000,0,90
+2000,200,98
+2000,400,106
+2000,600,114
+2000,900,126
+2000,1200,138
+2000,1600,154
+2000,2000,170
+2000,2500,190
+2500,0,105
+2500,200,113
+2500,400,121
+2500,600,129
+2500,900,141
+2500,1200,153
+2500,1600,169
+2500,2000,185
+2500,2500,205
+3000,0,120
+3000,200,128
+3000,400,136
+3000,600,144
+3000,900,156
+3000,1200,168
+3000,1600,184
+3000,2000,200
+3000,2500,220
+600,0,48
+600,-200,56
+600,-400,64
+600,-600,72
+600,-900,84
+600,-1200,96
+600,-1600,112
+600,-2000,128
+600,-2500,148
+900,0,57
+900,-200,65
+900,-400,73
+900,-600,81
+900,-900,93
+900,-1200,105
+900,-1600,121
+900,-2000,137
+900,-2500,157
+1200,0,66
+1200,-200,74
+1200,-400,82
+1200,-600,90
+1200,-900,102
+1200,-1200,114
+1200,-1600,130
+1200,-2000,146
+1200,-2500,166
+1600,0,78
+1600,-200,86
+1600,-400,94
+1600,-600,102
+1600,-900,114
+1600,-1200,126
+1600,-1600,142
+1600,-2000,158
+1600,-2500,178
+2000,0,90
+2000,-200,98
+2000,-400,106
+2000,-600,114
+2000,-900,126
+2000,-1200,138
+2000,-1600,154
+2000,-2000,170
+2000,-2500,190
+2500,0,105
+2500,-200,113
+2500,-400,121
+2500,-600,129
+2500,-900,141
+2500,-1200,153
+2500,-1600,169
+2500,-2000,185
+2500,-2500,205
+3000,0,120
+3000,-200,128
+3000,-400,136
+3000,-600,144
+3000,-900,156
+3000,-1200,168
+3000,-1600,184
+3000,-2000,200
+3000,-2500,220
diff --git a/Generic Vehicles/Declaration Mode/Class9_RigidTruck_AT_6x2/Gear_3_i=1-41.vtlm b/Generic Vehicles/Declaration Mode/Class9_RigidTruck_AT_6x2/Gear_3_i=1-41.vtlm
new file mode 100644
index 0000000000000000000000000000000000000000..1cdc06160aa4dcdfe6fcf5775fc18e4c5fa943ff
--- /dev/null
+++ b/Generic Vehicles/Declaration Mode/Class9_RigidTruck_AT_6x2/Gear_3_i=1-41.vtlm	
@@ -0,0 +1,136 @@
+Input Speed [1/min], Input Torque [Nm], Torque Loss [Nm]
+0,0,48
+0,200,56
+0,400,64
+0,600,72
+0,900,84
+0,1200,96
+0,1600,112
+0,2000,128
+0,2500,148
+600,0,48
+600,200,56
+600,400,64
+600,600,72
+600,900,84
+600,1200,96
+600,1600,112
+600,2000,128
+600,2500,148
+900,0,57
+900,200,65
+900,400,73
+900,600,81
+900,900,93
+900,1200,105
+900,1600,121
+900,2000,137
+900,2500,157
+1200,0,66
+1200,200,74
+1200,400,82
+1200,600,90
+1200,900,102
+1200,1200,114
+1200,1600,130
+1200,2000,146
+1200,2500,166
+1600,0,78
+1600,200,86
+1600,400,94
+1600,600,102
+1600,900,114
+1600,1200,126
+1600,1600,142
+1600,2000,158
+1600,2500,178
+2000,0,90
+2000,200,98
+2000,400,106
+2000,600,114
+2000,900,126
+2000,1200,138
+2000,1600,154
+2000,2000,170
+2000,2500,190
+2500,0,105
+2500,200,113
+2500,400,121
+2500,600,129
+2500,900,141
+2500,1200,153
+2500,1600,169
+2500,2000,185
+2500,2500,205
+3000,0,120
+3000,200,128
+3000,400,136
+3000,600,144
+3000,900,156
+3000,1200,168
+3000,1600,184
+3000,2000,200
+3000,2500,220
+600,0,48
+600,-200,56
+600,-400,64
+600,-600,72
+600,-900,84
+600,-1200,96
+600,-1600,112
+600,-2000,128
+600,-2500,148
+900,0,57
+900,-200,65
+900,-400,73
+900,-600,81
+900,-900,93
+900,-1200,105
+900,-1600,121
+900,-2000,137
+900,-2500,157
+1200,0,66
+1200,-200,74
+1200,-400,82
+1200,-600,90
+1200,-900,102
+1200,-1200,114
+1200,-1600,130
+1200,-2000,146
+1200,-2500,166
+1600,0,78
+1600,-200,86
+1600,-400,94
+1600,-600,102
+1600,-900,114
+1600,-1200,126
+1600,-1600,142
+1600,-2000,158
+1600,-2500,178
+2000,0,90
+2000,-200,98
+2000,-400,106
+2000,-600,114
+2000,-900,126
+2000,-1200,138
+2000,-1600,154
+2000,-2000,170
+2000,-2500,190
+2500,0,105
+2500,-200,113
+2500,-400,121
+2500,-600,129
+2500,-900,141
+2500,-1200,153
+2500,-1600,169
+2500,-2000,185
+2500,-2500,205
+3000,0,120
+3000,-200,128
+3000,-400,136
+3000,-600,144
+3000,-900,156
+3000,-1200,168
+3000,-1600,184
+3000,-2000,200
+3000,-2500,220
diff --git a/Generic Vehicles/Declaration Mode/Class9_RigidTruck_AT_6x2/Gear_4_i=1.vtlm b/Generic Vehicles/Declaration Mode/Class9_RigidTruck_AT_6x2/Gear_4_i=1.vtlm
new file mode 100644
index 0000000000000000000000000000000000000000..36365e666f12b3e1f9083aaf6dc653069c1e92f3
--- /dev/null
+++ b/Generic Vehicles/Declaration Mode/Class9_RigidTruck_AT_6x2/Gear_4_i=1.vtlm	
@@ -0,0 +1,136 @@
+Input Speed [1/min], Input Torque [Nm], Torque Loss [Nm]
+0,0,48
+0,200,50
+0,400,52
+0,600,54
+0,900,57
+0,1200,60
+0,1600,64
+0,2000,68
+0,2500,73
+600,0,48
+600,200,50
+600,400,52
+600,600,54
+600,900,57
+600,1200,60
+600,1600,64
+600,2000,68
+600,2500,73
+900,0,57
+900,200,59
+900,400,61
+900,600,63
+900,900,66
+900,1200,69
+900,1600,73
+900,2000,77
+900,2500,82
+1200,0,66
+1200,200,68
+1200,400,70
+1200,600,72
+1200,900,75
+1200,1200,78
+1200,1600,82
+1200,2000,86
+1200,2500,91
+1600,0,78
+1600,200,80
+1600,400,82
+1600,600,84
+1600,900,87
+1600,1200,90
+1600,1600,94
+1600,2000,98
+1600,2500,103
+2000,0,90
+2000,200,92
+2000,400,94
+2000,600,96
+2000,900,99
+2000,1200,102
+2000,1600,106
+2000,2000,110
+2000,2500,115
+2500,0,105
+2500,200,107
+2500,400,109
+2500,600,111
+2500,900,114
+2500,1200,117
+2500,1600,121
+2500,2000,125
+2500,2500,130
+3000,0,120
+3000,200,122
+3000,400,124
+3000,600,126
+3000,900,129
+3000,1200,132
+3000,1600,136
+3000,2000,140
+3000,2500,145
+600,0,48
+600,-200,50
+600,-400,52
+600,-600,54
+600,-900,57
+600,-1200,60
+600,-1600,64
+600,-2000,68
+600,-2500,73
+900,0,57
+900,-200,59
+900,-400,61
+900,-600,63
+900,-900,66
+900,-1200,69
+900,-1600,73
+900,-2000,77
+900,-2500,82
+1200,0,66
+1200,-200,68
+1200,-400,70
+1200,-600,72
+1200,-900,75
+1200,-1200,78
+1200,-1600,82
+1200,-2000,86
+1200,-2500,91
+1600,0,78
+1600,-200,80
+1600,-400,82
+1600,-600,84
+1600,-900,87
+1600,-1200,90
+1600,-1600,94
+1600,-2000,98
+1600,-2500,103
+2000,0,90
+2000,-200,92
+2000,-400,94
+2000,-600,96
+2000,-900,99
+2000,-1200,102
+2000,-1600,106
+2000,-2000,110
+2000,-2500,115
+2500,0,105
+2500,-200,107
+2500,-400,109
+2500,-600,111
+2500,-900,114
+2500,-1200,117
+2500,-1600,121
+2500,-2000,125
+2500,-2500,130
+3000,0,120
+3000,-200,122
+3000,-400,124
+3000,-600,126
+3000,-900,129
+3000,-1200,132
+3000,-1600,136
+3000,-2000,140
+3000,-2500,145
diff --git a/Generic Vehicles/Declaration Mode/Class9_RigidTruck_AT_6x2/Gear_5_i=0-75.vtlm b/Generic Vehicles/Declaration Mode/Class9_RigidTruck_AT_6x2/Gear_5_i=0-75.vtlm
new file mode 100644
index 0000000000000000000000000000000000000000..1cdc06160aa4dcdfe6fcf5775fc18e4c5fa943ff
--- /dev/null
+++ b/Generic Vehicles/Declaration Mode/Class9_RigidTruck_AT_6x2/Gear_5_i=0-75.vtlm	
@@ -0,0 +1,136 @@
+Input Speed [1/min], Input Torque [Nm], Torque Loss [Nm]
+0,0,48
+0,200,56
+0,400,64
+0,600,72
+0,900,84
+0,1200,96
+0,1600,112
+0,2000,128
+0,2500,148
+600,0,48
+600,200,56
+600,400,64
+600,600,72
+600,900,84
+600,1200,96
+600,1600,112
+600,2000,128
+600,2500,148
+900,0,57
+900,200,65
+900,400,73
+900,600,81
+900,900,93
+900,1200,105
+900,1600,121
+900,2000,137
+900,2500,157
+1200,0,66
+1200,200,74
+1200,400,82
+1200,600,90
+1200,900,102
+1200,1200,114
+1200,1600,130
+1200,2000,146
+1200,2500,166
+1600,0,78
+1600,200,86
+1600,400,94
+1600,600,102
+1600,900,114
+1600,1200,126
+1600,1600,142
+1600,2000,158
+1600,2500,178
+2000,0,90
+2000,200,98
+2000,400,106
+2000,600,114
+2000,900,126
+2000,1200,138
+2000,1600,154
+2000,2000,170
+2000,2500,190
+2500,0,105
+2500,200,113
+2500,400,121
+2500,600,129
+2500,900,141
+2500,1200,153
+2500,1600,169
+2500,2000,185
+2500,2500,205
+3000,0,120
+3000,200,128
+3000,400,136
+3000,600,144
+3000,900,156
+3000,1200,168
+3000,1600,184
+3000,2000,200
+3000,2500,220
+600,0,48
+600,-200,56
+600,-400,64
+600,-600,72
+600,-900,84
+600,-1200,96
+600,-1600,112
+600,-2000,128
+600,-2500,148
+900,0,57
+900,-200,65
+900,-400,73
+900,-600,81
+900,-900,93
+900,-1200,105
+900,-1600,121
+900,-2000,137
+900,-2500,157
+1200,0,66
+1200,-200,74
+1200,-400,82
+1200,-600,90
+1200,-900,102
+1200,-1200,114
+1200,-1600,130
+1200,-2000,146
+1200,-2500,166
+1600,0,78
+1600,-200,86
+1600,-400,94
+1600,-600,102
+1600,-900,114
+1600,-1200,126
+1600,-1600,142
+1600,-2000,158
+1600,-2500,178
+2000,0,90
+2000,-200,98
+2000,-400,106
+2000,-600,114
+2000,-900,126
+2000,-1200,138
+2000,-1600,154
+2000,-2000,170
+2000,-2500,190
+2500,0,105
+2500,-200,113
+2500,-400,121
+2500,-600,129
+2500,-900,141
+2500,-1200,153
+2500,-1600,169
+2500,-2000,185
+2500,-2500,205
+3000,0,120
+3000,-200,128
+3000,-400,136
+3000,-600,144
+3000,-900,156
+3000,-1200,168
+3000,-1600,184
+3000,-2000,200
+3000,-2500,220
diff --git a/Generic Vehicles/Declaration Mode/Class9_RigidTruck_AT_6x2/Gear_6_i=0-65.vtlm b/Generic Vehicles/Declaration Mode/Class9_RigidTruck_AT_6x2/Gear_6_i=0-65.vtlm
new file mode 100644
index 0000000000000000000000000000000000000000..1cdc06160aa4dcdfe6fcf5775fc18e4c5fa943ff
--- /dev/null
+++ b/Generic Vehicles/Declaration Mode/Class9_RigidTruck_AT_6x2/Gear_6_i=0-65.vtlm	
@@ -0,0 +1,136 @@
+Input Speed [1/min], Input Torque [Nm], Torque Loss [Nm]
+0,0,48
+0,200,56
+0,400,64
+0,600,72
+0,900,84
+0,1200,96
+0,1600,112
+0,2000,128
+0,2500,148
+600,0,48
+600,200,56
+600,400,64
+600,600,72
+600,900,84
+600,1200,96
+600,1600,112
+600,2000,128
+600,2500,148
+900,0,57
+900,200,65
+900,400,73
+900,600,81
+900,900,93
+900,1200,105
+900,1600,121
+900,2000,137
+900,2500,157
+1200,0,66
+1200,200,74
+1200,400,82
+1200,600,90
+1200,900,102
+1200,1200,114
+1200,1600,130
+1200,2000,146
+1200,2500,166
+1600,0,78
+1600,200,86
+1600,400,94
+1600,600,102
+1600,900,114
+1600,1200,126
+1600,1600,142
+1600,2000,158
+1600,2500,178
+2000,0,90
+2000,200,98
+2000,400,106
+2000,600,114
+2000,900,126
+2000,1200,138
+2000,1600,154
+2000,2000,170
+2000,2500,190
+2500,0,105
+2500,200,113
+2500,400,121
+2500,600,129
+2500,900,141
+2500,1200,153
+2500,1600,169
+2500,2000,185
+2500,2500,205
+3000,0,120
+3000,200,128
+3000,400,136
+3000,600,144
+3000,900,156
+3000,1200,168
+3000,1600,184
+3000,2000,200
+3000,2500,220
+600,0,48
+600,-200,56
+600,-400,64
+600,-600,72
+600,-900,84
+600,-1200,96
+600,-1600,112
+600,-2000,128
+600,-2500,148
+900,0,57
+900,-200,65
+900,-400,73
+900,-600,81
+900,-900,93
+900,-1200,105
+900,-1600,121
+900,-2000,137
+900,-2500,157
+1200,0,66
+1200,-200,74
+1200,-400,82
+1200,-600,90
+1200,-900,102
+1200,-1200,114
+1200,-1600,130
+1200,-2000,146
+1200,-2500,166
+1600,0,78
+1600,-200,86
+1600,-400,94
+1600,-600,102
+1600,-900,114
+1600,-1200,126
+1600,-1600,142
+1600,-2000,158
+1600,-2500,178
+2000,0,90
+2000,-200,98
+2000,-400,106
+2000,-600,114
+2000,-900,126
+2000,-1200,138
+2000,-1600,154
+2000,-2000,170
+2000,-2500,190
+2500,0,105
+2500,-200,113
+2500,-400,121
+2500,-600,129
+2500,-900,141
+2500,-1200,153
+2500,-1600,169
+2500,-2000,185
+2500,-2500,205
+3000,0,120
+3000,-200,128
+3000,-400,136
+3000,-600,144
+3000,-900,156
+3000,-1200,168
+3000,-1600,184
+3000,-2000,200
+3000,-2500,220
diff --git a/Generic Vehicles/Declaration Mode/Class9_RigidTruck_AT_6x2/RigidTruck_6x2.vveh b/Generic Vehicles/Declaration Mode/Class9_RigidTruck_AT_6x2/RigidTruck_6x2.vveh
new file mode 100644
index 0000000000000000000000000000000000000000..9abad02504a0b58c3636ef26ba0220b74bb50d2e
--- /dev/null
+++ b/Generic Vehicles/Declaration Mode/Class9_RigidTruck_AT_6x2/RigidTruck_6x2.vveh	
@@ -0,0 +1,70 @@
+{
+  "Header": {
+    "CreatedBy": "",
+    "Date": "2017-07-03T14:48:36.5106880Z",
+    "AppVersion": "3",
+    "FileVersion": 7
+  },
+  "Body": {
+    "SavedInDeclMode": true,
+    "VehCat": "RigidTruck",
+    "LegislativeClass": "N3",
+    "CurbWeight": 7750.0,
+    "CurbWeightExtra": 0.0,
+    "Loading": 0.0,
+    "MassMax": 26.0,
+    "rdyn": 0.0,
+    "CdCorrMode": "CdofVdecl",
+    "CdCorrFile": "",
+    "Retarder": {
+      "Type": "None",
+      "Ratio": 1.0,
+      "File": ""
+    },
+    "Angledrive": {
+      "Type": "None",
+      "Ratio": "NaN",
+      "LossMap": ""
+    },
+    "PTO": {
+      "Type": "only the drive shaft of the PTO - shift claw, synchronizer, sliding gearwheel",
+      "LossMap": "",
+      "Cycle": ""
+    },
+    "TorqueLimits": {},
+    "IdlingSpeed": 0.0,
+    "AxleConfig": {
+      "Type": "6x2",
+      "Axles": [
+        {
+          "Inertia": 14.9,
+          "Wheels": "315/70 R22.5",
+          "AxleWeightShare": 0.0,
+          "TwinTyres": false,
+          "RRCISO": 0.0055,
+          "FzISO": 33350.0,
+          "Type": "VehicleNonDriven"
+        },
+        {
+          "Inertia": 14.9,
+          "Wheels": "315/70 R22.5",
+          "AxleWeightShare": 0.0,
+          "TwinTyres": true,
+          "RRCISO": 0.0055,
+          "FzISO": 33350.0,
+          "Type": "VehicleDriven"
+        },
+        {
+          "Inertia": 14.9,
+          "Wheels": "315/70 R22.5",
+          "AxleWeightShare": 0.0,
+          "TwinTyres": false,
+          "RRCISO": 0.0055,
+          "FzISO": 33350.0,
+          "Type": "VehicleNonDriven"
+        }
+      ]
+    },
+    "CdA": 5.8
+  }
+}
\ No newline at end of file
diff --git a/Generic Vehicles/Declaration Mode/Class9_RigidTruck_AT_6x2/TorqueConverter_Serial_TqMax1200.vtcc b/Generic Vehicles/Declaration Mode/Class9_RigidTruck_AT_6x2/TorqueConverter_Serial_TqMax1200.vtcc
new file mode 100644
index 0000000000000000000000000000000000000000..e96d65d4c14370fdda7fb7f432bd1400685cb056
--- /dev/null
+++ b/Generic Vehicles/Declaration Mode/Class9_RigidTruck_AT_6x2/TorqueConverter_Serial_TqMax1200.vtcc	
@@ -0,0 +1,28 @@
+Speed Ratio, Torque Ratio, Input Torque at reference rpm
+0,1.8,404.790015179626
+0.1,1.70555555555556,391.297014673638
+0.2,1.61111111111111,377.804014167651
+0.3,1.51666666666667,364.311013661663
+0.4,1.42222222222222,350.818013155675
+0.5,1.32777777777778,337.325012649688
+0.6,1.23333333333333,323.8320121437
+0.65,1.18611111111111,303.592511384719
+0.7,1.13888888888889,283.353010625738
+0.75,1.09166666666667,263.113509866757
+0.8,1.04444444444444,242.874009107775
+0.85,0.997222222222222,222.634508348794
+0.9,0.95,202.395007589813
+0.95,0.95,101.197503794907
+1,0.95,0
+1.1,0.9999,-40.34
+1.222,0.9998,-80.34
+1.375,0.9997,-136.11
+1.571,0.9996,-216.52
+1.833,0.9995,-335.19
+2.2,0.9994,-528.77
+2.5,0.9993,-721
+3,0.9992,-1122
+3.5,0.9991,-1648
+4,0.999,-2326
+4.5,0.9989,-3182
+5,0.9988,-4242
diff --git a/HashingCmd/Program.cs b/HashingCmd/Program.cs
index e693f7f472d9a8c8f0d4c2ccb0929877d2597500..5ce77962cb62ff18c7860874a6acd59af3f2c361 100644
--- a/HashingCmd/Program.cs
+++ b/HashingCmd/Program.cs
@@ -46,20 +46,20 @@ namespace HashingCmd
 	{
 		public delegate void HashingAction(string filename, VectoHash h);
 
-		private const string Usage = @"
-hashingcmd.exe (-h | [-v] [[-s] -x] [-c] [-r]) <file.xml> <file2.xml> <file3.xml>
-
+		private const string Usage = @"
+hashingcmd.exe (-h | [-v] [[-s] -x] [-c] [-r]) <file.xml> <file2.xml> <file3.xml>
+
 ";
 
-		private const string Help = @"
-hashingcmd.exe
-
--h:    print help
--v:    verify hashed file
--s:    create hashed file
--x:    validate generated XML against VECTO XML schema
--c:    compute hash and write to stdout
--r:    read hash from file and write to stdout
+		private const string Help = @"
+hashingcmd.exe
+
+-h:    print help
+-v:    verify hashed file
+-s:    create hashed file
+-x:    validate generated XML against VECTO XML schema
+-c:    compute hash and write to stdout
+-r:    read hash from file and write to stdout
 ";
 
 		private static readonly Dictionary<string, HashingAction> Actions = new Dictionary<string, HashingAction> {
diff --git a/VECTO.sln b/VECTO.sln
index f6601e5fd41736ec568ec48329b1322282b60441..f30c2893267063f9b98fb47c75a6305dbf38bf53 100644
--- a/VECTO.sln
+++ b/VECTO.sln
@@ -66,6 +66,12 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HashingCmd", "HashingCmd\Ha
 EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
+		Debug PerformanceStats|Any CPU = Debug PerformanceStats|Any CPU
+		Debug PerformanceStats|x64 = Debug PerformanceStats|x64
+		Debug PerformanceStats|x86 = Debug PerformanceStats|x86
+		Debug PerformanceTrace|Any CPU = Debug PerformanceTrace|Any CPU
+		Debug PerformanceTrace|x64 = Debug PerformanceTrace|x64
+		Debug PerformanceTrace|x86 = Debug PerformanceTrace|x86
 		Debug|Any CPU = Debug|Any CPU
 		Debug|x64 = Debug|x64
 		Debug|x86 = Debug|x86
@@ -74,6 +80,16 @@ Global
 		Release|x86 = Release|x86
 	EndGlobalSection
 	GlobalSection(ProjectConfigurationPlatforms) = postSolution
+		{AAC0F132-0A9F-45B3-B682-77AC9B24B352}.Debug PerformanceStats|Any CPU.ActiveCfg = Release|Any CPU
+		{AAC0F132-0A9F-45B3-B682-77AC9B24B352}.Debug PerformanceStats|Any CPU.Build.0 = Release|Any CPU
+		{AAC0F132-0A9F-45B3-B682-77AC9B24B352}.Debug PerformanceStats|x64.ActiveCfg = Debug|Any CPU
+		{AAC0F132-0A9F-45B3-B682-77AC9B24B352}.Debug PerformanceStats|x86.ActiveCfg = Debug|x86
+		{AAC0F132-0A9F-45B3-B682-77AC9B24B352}.Debug PerformanceStats|x86.Build.0 = Debug|x86
+		{AAC0F132-0A9F-45B3-B682-77AC9B24B352}.Debug PerformanceTrace|Any CPU.ActiveCfg = Debug|Any CPU
+		{AAC0F132-0A9F-45B3-B682-77AC9B24B352}.Debug PerformanceTrace|Any CPU.Build.0 = Debug|Any CPU
+		{AAC0F132-0A9F-45B3-B682-77AC9B24B352}.Debug PerformanceTrace|x64.ActiveCfg = Debug|Any CPU
+		{AAC0F132-0A9F-45B3-B682-77AC9B24B352}.Debug PerformanceTrace|x86.ActiveCfg = Debug|x86
+		{AAC0F132-0A9F-45B3-B682-77AC9B24B352}.Debug PerformanceTrace|x86.Build.0 = Debug|x86
 		{AAC0F132-0A9F-45B3-B682-77AC9B24B352}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
 		{AAC0F132-0A9F-45B3-B682-77AC9B24B352}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{AAC0F132-0A9F-45B3-B682-77AC9B24B352}.Debug|x64.ActiveCfg = Debug|Any CPU
@@ -84,6 +100,12 @@ Global
 		{AAC0F132-0A9F-45B3-B682-77AC9B24B352}.Release|x64.ActiveCfg = Release|Any CPU
 		{AAC0F132-0A9F-45B3-B682-77AC9B24B352}.Release|x86.ActiveCfg = Release|x86
 		{AAC0F132-0A9F-45B3-B682-77AC9B24B352}.Release|x86.Build.0 = Release|x86
+		{FDEEE460-0B8A-4EF6-8D9E-72F203A50F65}.Debug PerformanceStats|Any CPU.ActiveCfg = Debug|Any CPU
+		{FDEEE460-0B8A-4EF6-8D9E-72F203A50F65}.Debug PerformanceStats|x64.ActiveCfg = Debug|Any CPU
+		{FDEEE460-0B8A-4EF6-8D9E-72F203A50F65}.Debug PerformanceStats|x86.ActiveCfg = Debug|Any CPU
+		{FDEEE460-0B8A-4EF6-8D9E-72F203A50F65}.Debug PerformanceTrace|Any CPU.ActiveCfg = Debug|Any CPU
+		{FDEEE460-0B8A-4EF6-8D9E-72F203A50F65}.Debug PerformanceTrace|x64.ActiveCfg = Debug|Any CPU
+		{FDEEE460-0B8A-4EF6-8D9E-72F203A50F65}.Debug PerformanceTrace|x86.ActiveCfg = Debug|Any CPU
 		{FDEEE460-0B8A-4EF6-8D9E-72F203A50F65}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
 		{FDEEE460-0B8A-4EF6-8D9E-72F203A50F65}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{FDEEE460-0B8A-4EF6-8D9E-72F203A50F65}.Debug|x64.ActiveCfg = Debug|Any CPU
@@ -92,6 +114,14 @@ Global
 		{FDEEE460-0B8A-4EF6-8D9E-72F203A50F65}.Release|Any CPU.Build.0 = Release|Any CPU
 		{FDEEE460-0B8A-4EF6-8D9E-72F203A50F65}.Release|x64.ActiveCfg = Release|Any CPU
 		{FDEEE460-0B8A-4EF6-8D9E-72F203A50F65}.Release|x86.ActiveCfg = Release|Any CPU
+		{CD36938A-ADD9-4C65-96DA-B397CDEEA90A}.Debug PerformanceStats|Any CPU.ActiveCfg = Debug|Any CPU
+		{CD36938A-ADD9-4C65-96DA-B397CDEEA90A}.Debug PerformanceStats|Any CPU.Build.0 = Debug|Any CPU
+		{CD36938A-ADD9-4C65-96DA-B397CDEEA90A}.Debug PerformanceStats|x64.ActiveCfg = Debug|Any CPU
+		{CD36938A-ADD9-4C65-96DA-B397CDEEA90A}.Debug PerformanceStats|x86.ActiveCfg = Debug|Any CPU
+		{CD36938A-ADD9-4C65-96DA-B397CDEEA90A}.Debug PerformanceTrace|Any CPU.ActiveCfg = Debug|Any CPU
+		{CD36938A-ADD9-4C65-96DA-B397CDEEA90A}.Debug PerformanceTrace|Any CPU.Build.0 = Debug|Any CPU
+		{CD36938A-ADD9-4C65-96DA-B397CDEEA90A}.Debug PerformanceTrace|x64.ActiveCfg = Debug|Any CPU
+		{CD36938A-ADD9-4C65-96DA-B397CDEEA90A}.Debug PerformanceTrace|x86.ActiveCfg = Debug|Any CPU
 		{CD36938A-ADD9-4C65-96DA-B397CDEEA90A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
 		{CD36938A-ADD9-4C65-96DA-B397CDEEA90A}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{CD36938A-ADD9-4C65-96DA-B397CDEEA90A}.Debug|x64.ActiveCfg = Debug|Any CPU
@@ -100,6 +130,12 @@ Global
 		{CD36938A-ADD9-4C65-96DA-B397CDEEA90A}.Release|Any CPU.Build.0 = Release|Any CPU
 		{CD36938A-ADD9-4C65-96DA-B397CDEEA90A}.Release|x64.ActiveCfg = Release|Any CPU
 		{CD36938A-ADD9-4C65-96DA-B397CDEEA90A}.Release|x86.ActiveCfg = Release|Any CPU
+		{6F31F8B2-6AB3-4F85-8AC9-D09ADCA6432D}.Debug PerformanceStats|Any CPU.ActiveCfg = Debug|Any CPU
+		{6F31F8B2-6AB3-4F85-8AC9-D09ADCA6432D}.Debug PerformanceStats|x64.ActiveCfg = Debug|Any CPU
+		{6F31F8B2-6AB3-4F85-8AC9-D09ADCA6432D}.Debug PerformanceStats|x86.ActiveCfg = Debug|Any CPU
+		{6F31F8B2-6AB3-4F85-8AC9-D09ADCA6432D}.Debug PerformanceTrace|Any CPU.ActiveCfg = Debug|Any CPU
+		{6F31F8B2-6AB3-4F85-8AC9-D09ADCA6432D}.Debug PerformanceTrace|x64.ActiveCfg = Debug|Any CPU
+		{6F31F8B2-6AB3-4F85-8AC9-D09ADCA6432D}.Debug PerformanceTrace|x86.ActiveCfg = Debug|Any CPU
 		{6F31F8B2-6AB3-4F85-8AC9-D09ADCA6432D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
 		{6F31F8B2-6AB3-4F85-8AC9-D09ADCA6432D}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{6F31F8B2-6AB3-4F85-8AC9-D09ADCA6432D}.Debug|x64.ActiveCfg = Debug|Any CPU
@@ -108,6 +144,14 @@ Global
 		{6F31F8B2-6AB3-4F85-8AC9-D09ADCA6432D}.Release|Any CPU.Build.0 = Release|Any CPU
 		{6F31F8B2-6AB3-4F85-8AC9-D09ADCA6432D}.Release|x64.ActiveCfg = Release|Any CPU
 		{6F31F8B2-6AB3-4F85-8AC9-D09ADCA6432D}.Release|x86.ActiveCfg = Release|Any CPU
+		{6A27F93E-4A58-48F6-B00B-3908C5D3D5A2}.Debug PerformanceStats|Any CPU.ActiveCfg = Debug|Any CPU
+		{6A27F93E-4A58-48F6-B00B-3908C5D3D5A2}.Debug PerformanceStats|Any CPU.Build.0 = Debug|Any CPU
+		{6A27F93E-4A58-48F6-B00B-3908C5D3D5A2}.Debug PerformanceStats|x64.ActiveCfg = Debug|Any CPU
+		{6A27F93E-4A58-48F6-B00B-3908C5D3D5A2}.Debug PerformanceStats|x86.ActiveCfg = Debug|Any CPU
+		{6A27F93E-4A58-48F6-B00B-3908C5D3D5A2}.Debug PerformanceTrace|Any CPU.ActiveCfg = Debug|Any CPU
+		{6A27F93E-4A58-48F6-B00B-3908C5D3D5A2}.Debug PerformanceTrace|Any CPU.Build.0 = Debug|Any CPU
+		{6A27F93E-4A58-48F6-B00B-3908C5D3D5A2}.Debug PerformanceTrace|x64.ActiveCfg = Debug|Any CPU
+		{6A27F93E-4A58-48F6-B00B-3908C5D3D5A2}.Debug PerformanceTrace|x86.ActiveCfg = Debug|Any CPU
 		{6A27F93E-4A58-48F6-B00B-3908C5D3D5A2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
 		{6A27F93E-4A58-48F6-B00B-3908C5D3D5A2}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{6A27F93E-4A58-48F6-B00B-3908C5D3D5A2}.Debug|x64.ActiveCfg = Debug|Any CPU
@@ -116,12 +160,24 @@ Global
 		{6A27F93E-4A58-48F6-B00B-3908C5D3D5A2}.Release|Any CPU.Build.0 = Release|Any CPU
 		{6A27F93E-4A58-48F6-B00B-3908C5D3D5A2}.Release|x64.ActiveCfg = Release|Any CPU
 		{6A27F93E-4A58-48F6-B00B-3908C5D3D5A2}.Release|x86.ActiveCfg = Release|Any CPU
+		{E23B3A9B-62E7-4476-849E-EEF1C3804A2F}.Debug PerformanceStats|Any CPU.ActiveCfg = Debug|Any CPU
+		{E23B3A9B-62E7-4476-849E-EEF1C3804A2F}.Debug PerformanceStats|x64.ActiveCfg = Debug|Any CPU
+		{E23B3A9B-62E7-4476-849E-EEF1C3804A2F}.Debug PerformanceStats|x86.ActiveCfg = Debug|Any CPU
+		{E23B3A9B-62E7-4476-849E-EEF1C3804A2F}.Debug PerformanceTrace|Any CPU.ActiveCfg = Debug|Any CPU
+		{E23B3A9B-62E7-4476-849E-EEF1C3804A2F}.Debug PerformanceTrace|x64.ActiveCfg = Debug|Any CPU
+		{E23B3A9B-62E7-4476-849E-EEF1C3804A2F}.Debug PerformanceTrace|x86.ActiveCfg = Debug|Any CPU
 		{E23B3A9B-62E7-4476-849E-EEF1C3804A2F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
 		{E23B3A9B-62E7-4476-849E-EEF1C3804A2F}.Debug|x64.ActiveCfg = Debug|Any CPU
 		{E23B3A9B-62E7-4476-849E-EEF1C3804A2F}.Debug|x86.ActiveCfg = Debug|Any CPU
 		{E23B3A9B-62E7-4476-849E-EEF1C3804A2F}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{E23B3A9B-62E7-4476-849E-EEF1C3804A2F}.Release|x64.ActiveCfg = Release|Any CPU
 		{E23B3A9B-62E7-4476-849E-EEF1C3804A2F}.Release|x86.ActiveCfg = Release|Any CPU
+		{B4B9BD2F-FD8F-4BB8-82FA-E2154D2C7FBD}.Debug PerformanceStats|Any CPU.ActiveCfg = Debug|Any CPU
+		{B4B9BD2F-FD8F-4BB8-82FA-E2154D2C7FBD}.Debug PerformanceStats|x64.ActiveCfg = Debug|Any CPU
+		{B4B9BD2F-FD8F-4BB8-82FA-E2154D2C7FBD}.Debug PerformanceStats|x86.ActiveCfg = Debug|Any CPU
+		{B4B9BD2F-FD8F-4BB8-82FA-E2154D2C7FBD}.Debug PerformanceTrace|Any CPU.ActiveCfg = Debug|Any CPU
+		{B4B9BD2F-FD8F-4BB8-82FA-E2154D2C7FBD}.Debug PerformanceTrace|x64.ActiveCfg = Debug|Any CPU
+		{B4B9BD2F-FD8F-4BB8-82FA-E2154D2C7FBD}.Debug PerformanceTrace|x86.ActiveCfg = Debug|Any CPU
 		{B4B9BD2F-FD8F-4BB8-82FA-E2154D2C7FBD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
 		{B4B9BD2F-FD8F-4BB8-82FA-E2154D2C7FBD}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{B4B9BD2F-FD8F-4BB8-82FA-E2154D2C7FBD}.Debug|x64.ActiveCfg = Debug|Any CPU
@@ -130,6 +186,14 @@ Global
 		{B4B9BD2F-FD8F-4BB8-82FA-E2154D2C7FBD}.Release|Any CPU.Build.0 = Release|Any CPU
 		{B4B9BD2F-FD8F-4BB8-82FA-E2154D2C7FBD}.Release|x64.ActiveCfg = Release|Any CPU
 		{B4B9BD2F-FD8F-4BB8-82FA-E2154D2C7FBD}.Release|x86.ActiveCfg = Release|Any CPU
+		{60AD4DF0-6648-4374-83CB-C7A162EFB391}.Debug PerformanceStats|Any CPU.ActiveCfg = Debug|Any CPU
+		{60AD4DF0-6648-4374-83CB-C7A162EFB391}.Debug PerformanceStats|Any CPU.Build.0 = Debug|Any CPU
+		{60AD4DF0-6648-4374-83CB-C7A162EFB391}.Debug PerformanceStats|x64.ActiveCfg = Debug|Any CPU
+		{60AD4DF0-6648-4374-83CB-C7A162EFB391}.Debug PerformanceStats|x86.ActiveCfg = Debug|Any CPU
+		{60AD4DF0-6648-4374-83CB-C7A162EFB391}.Debug PerformanceTrace|Any CPU.ActiveCfg = Debug|Any CPU
+		{60AD4DF0-6648-4374-83CB-C7A162EFB391}.Debug PerformanceTrace|Any CPU.Build.0 = Debug|Any CPU
+		{60AD4DF0-6648-4374-83CB-C7A162EFB391}.Debug PerformanceTrace|x64.ActiveCfg = Debug|Any CPU
+		{60AD4DF0-6648-4374-83CB-C7A162EFB391}.Debug PerformanceTrace|x86.ActiveCfg = Debug|Any CPU
 		{60AD4DF0-6648-4374-83CB-C7A162EFB391}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
 		{60AD4DF0-6648-4374-83CB-C7A162EFB391}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{60AD4DF0-6648-4374-83CB-C7A162EFB391}.Debug|x64.ActiveCfg = Debug|Any CPU
@@ -138,6 +202,14 @@ Global
 		{60AD4DF0-6648-4374-83CB-C7A162EFB391}.Release|Any CPU.Build.0 = Release|Any CPU
 		{60AD4DF0-6648-4374-83CB-C7A162EFB391}.Release|x64.ActiveCfg = Release|Any CPU
 		{60AD4DF0-6648-4374-83CB-C7A162EFB391}.Release|x86.ActiveCfg = Release|Any CPU
+		{6589CAEC-ECC9-4BCC-9699-DE3F22BBCBD4}.Debug PerformanceStats|Any CPU.ActiveCfg = Debug|Any CPU
+		{6589CAEC-ECC9-4BCC-9699-DE3F22BBCBD4}.Debug PerformanceStats|Any CPU.Build.0 = Debug|Any CPU
+		{6589CAEC-ECC9-4BCC-9699-DE3F22BBCBD4}.Debug PerformanceStats|x64.ActiveCfg = Debug|Any CPU
+		{6589CAEC-ECC9-4BCC-9699-DE3F22BBCBD4}.Debug PerformanceStats|x86.ActiveCfg = Debug|Any CPU
+		{6589CAEC-ECC9-4BCC-9699-DE3F22BBCBD4}.Debug PerformanceTrace|Any CPU.ActiveCfg = Debug|Any CPU
+		{6589CAEC-ECC9-4BCC-9699-DE3F22BBCBD4}.Debug PerformanceTrace|Any CPU.Build.0 = Debug|Any CPU
+		{6589CAEC-ECC9-4BCC-9699-DE3F22BBCBD4}.Debug PerformanceTrace|x64.ActiveCfg = Debug|Any CPU
+		{6589CAEC-ECC9-4BCC-9699-DE3F22BBCBD4}.Debug PerformanceTrace|x86.ActiveCfg = Debug|Any CPU
 		{6589CAEC-ECC9-4BCC-9699-DE3F22BBCBD4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
 		{6589CAEC-ECC9-4BCC-9699-DE3F22BBCBD4}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{6589CAEC-ECC9-4BCC-9699-DE3F22BBCBD4}.Debug|x64.ActiveCfg = Debug|Any CPU
@@ -146,6 +218,14 @@ Global
 		{6589CAEC-ECC9-4BCC-9699-DE3F22BBCBD4}.Release|Any CPU.Build.0 = Release|Any CPU
 		{6589CAEC-ECC9-4BCC-9699-DE3F22BBCBD4}.Release|x64.ActiveCfg = Release|Any CPU
 		{6589CAEC-ECC9-4BCC-9699-DE3F22BBCBD4}.Release|x86.ActiveCfg = Release|Any CPU
+		{2320CD6F-FE7B-4341-A9BB-3ABCA7EF18F6}.Debug PerformanceStats|Any CPU.ActiveCfg = Debug|Any CPU
+		{2320CD6F-FE7B-4341-A9BB-3ABCA7EF18F6}.Debug PerformanceStats|Any CPU.Build.0 = Debug|Any CPU
+		{2320CD6F-FE7B-4341-A9BB-3ABCA7EF18F6}.Debug PerformanceStats|x64.ActiveCfg = Debug|Any CPU
+		{2320CD6F-FE7B-4341-A9BB-3ABCA7EF18F6}.Debug PerformanceStats|x86.ActiveCfg = Debug|Any CPU
+		{2320CD6F-FE7B-4341-A9BB-3ABCA7EF18F6}.Debug PerformanceTrace|Any CPU.ActiveCfg = Debug|Any CPU
+		{2320CD6F-FE7B-4341-A9BB-3ABCA7EF18F6}.Debug PerformanceTrace|Any CPU.Build.0 = Debug|Any CPU
+		{2320CD6F-FE7B-4341-A9BB-3ABCA7EF18F6}.Debug PerformanceTrace|x64.ActiveCfg = Debug|Any CPU
+		{2320CD6F-FE7B-4341-A9BB-3ABCA7EF18F6}.Debug PerformanceTrace|x86.ActiveCfg = Debug|Any CPU
 		{2320CD6F-FE7B-4341-A9BB-3ABCA7EF18F6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
 		{2320CD6F-FE7B-4341-A9BB-3ABCA7EF18F6}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{2320CD6F-FE7B-4341-A9BB-3ABCA7EF18F6}.Debug|x64.ActiveCfg = Debug|Any CPU
@@ -154,6 +234,14 @@ Global
 		{2320CD6F-FE7B-4341-A9BB-3ABCA7EF18F6}.Release|Any CPU.Build.0 = Release|Any CPU
 		{2320CD6F-FE7B-4341-A9BB-3ABCA7EF18F6}.Release|x64.ActiveCfg = Release|Any CPU
 		{2320CD6F-FE7B-4341-A9BB-3ABCA7EF18F6}.Release|x86.ActiveCfg = Release|Any CPU
+		{E8B0B447-1A54-4BEC-A160-AF0017000781}.Debug PerformanceStats|Any CPU.ActiveCfg = Debug|Any CPU
+		{E8B0B447-1A54-4BEC-A160-AF0017000781}.Debug PerformanceStats|Any CPU.Build.0 = Debug|Any CPU
+		{E8B0B447-1A54-4BEC-A160-AF0017000781}.Debug PerformanceStats|x64.ActiveCfg = Debug|Any CPU
+		{E8B0B447-1A54-4BEC-A160-AF0017000781}.Debug PerformanceStats|x86.ActiveCfg = Debug|Any CPU
+		{E8B0B447-1A54-4BEC-A160-AF0017000781}.Debug PerformanceTrace|Any CPU.ActiveCfg = Debug|Any CPU
+		{E8B0B447-1A54-4BEC-A160-AF0017000781}.Debug PerformanceTrace|Any CPU.Build.0 = Debug|Any CPU
+		{E8B0B447-1A54-4BEC-A160-AF0017000781}.Debug PerformanceTrace|x64.ActiveCfg = Debug|Any CPU
+		{E8B0B447-1A54-4BEC-A160-AF0017000781}.Debug PerformanceTrace|x86.ActiveCfg = Debug|Any CPU
 		{E8B0B447-1A54-4BEC-A160-AF0017000781}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
 		{E8B0B447-1A54-4BEC-A160-AF0017000781}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{E8B0B447-1A54-4BEC-A160-AF0017000781}.Debug|x64.ActiveCfg = Debug|Any CPU
@@ -162,6 +250,12 @@ Global
 		{E8B0B447-1A54-4BEC-A160-AF0017000781}.Release|Any CPU.Build.0 = Release|Any CPU
 		{E8B0B447-1A54-4BEC-A160-AF0017000781}.Release|x64.ActiveCfg = Release|Any CPU
 		{E8B0B447-1A54-4BEC-A160-AF0017000781}.Release|x86.ActiveCfg = Release|Any CPU
+		{79A066AD-69A9-4223-90F6-6ED5D2D084F4}.Debug PerformanceStats|Any CPU.ActiveCfg = Debug|Any CPU
+		{79A066AD-69A9-4223-90F6-6ED5D2D084F4}.Debug PerformanceStats|x64.ActiveCfg = Debug|Any CPU
+		{79A066AD-69A9-4223-90F6-6ED5D2D084F4}.Debug PerformanceStats|x86.ActiveCfg = Debug|Any CPU
+		{79A066AD-69A9-4223-90F6-6ED5D2D084F4}.Debug PerformanceTrace|Any CPU.ActiveCfg = Debug|Any CPU
+		{79A066AD-69A9-4223-90F6-6ED5D2D084F4}.Debug PerformanceTrace|x64.ActiveCfg = Debug|Any CPU
+		{79A066AD-69A9-4223-90F6-6ED5D2D084F4}.Debug PerformanceTrace|x86.ActiveCfg = Debug|Any CPU
 		{79A066AD-69A9-4223-90F6-6ED5D2D084F4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
 		{79A066AD-69A9-4223-90F6-6ED5D2D084F4}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{79A066AD-69A9-4223-90F6-6ED5D2D084F4}.Debug|x64.ActiveCfg = Debug|Any CPU
@@ -170,6 +264,12 @@ Global
 		{79A066AD-69A9-4223-90F6-6ED5D2D084F4}.Release|Any CPU.Build.0 = Release|Any CPU
 		{79A066AD-69A9-4223-90F6-6ED5D2D084F4}.Release|x64.ActiveCfg = Release|Any CPU
 		{79A066AD-69A9-4223-90F6-6ED5D2D084F4}.Release|x86.ActiveCfg = Release|Any CPU
+		{A0256B2A-09F8-45AD-B46A-FD98D7AAAA0C}.Debug PerformanceStats|Any CPU.ActiveCfg = Debug|Any CPU
+		{A0256B2A-09F8-45AD-B46A-FD98D7AAAA0C}.Debug PerformanceStats|x64.ActiveCfg = Debug|Any CPU
+		{A0256B2A-09F8-45AD-B46A-FD98D7AAAA0C}.Debug PerformanceStats|x86.ActiveCfg = Debug|Any CPU
+		{A0256B2A-09F8-45AD-B46A-FD98D7AAAA0C}.Debug PerformanceTrace|Any CPU.ActiveCfg = Debug|Any CPU
+		{A0256B2A-09F8-45AD-B46A-FD98D7AAAA0C}.Debug PerformanceTrace|x64.ActiveCfg = Debug|Any CPU
+		{A0256B2A-09F8-45AD-B46A-FD98D7AAAA0C}.Debug PerformanceTrace|x86.ActiveCfg = Debug|Any CPU
 		{A0256B2A-09F8-45AD-B46A-FD98D7AAAA0C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
 		{A0256B2A-09F8-45AD-B46A-FD98D7AAAA0C}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{A0256B2A-09F8-45AD-B46A-FD98D7AAAA0C}.Debug|x64.ActiveCfg = Debug|Any CPU
@@ -178,6 +278,12 @@ Global
 		{A0256B2A-09F8-45AD-B46A-FD98D7AAAA0C}.Release|Any CPU.Build.0 = Release|Any CPU
 		{A0256B2A-09F8-45AD-B46A-FD98D7AAAA0C}.Release|x64.ActiveCfg = Release|Any CPU
 		{A0256B2A-09F8-45AD-B46A-FD98D7AAAA0C}.Release|x86.ActiveCfg = Release|Any CPU
+		{49F0275A-4517-49FA-859E-77279B9C8B18}.Debug PerformanceStats|Any CPU.ActiveCfg = Debug|Any CPU
+		{49F0275A-4517-49FA-859E-77279B9C8B18}.Debug PerformanceStats|x64.ActiveCfg = Debug|Any CPU
+		{49F0275A-4517-49FA-859E-77279B9C8B18}.Debug PerformanceStats|x86.ActiveCfg = Debug|Any CPU
+		{49F0275A-4517-49FA-859E-77279B9C8B18}.Debug PerformanceTrace|Any CPU.ActiveCfg = Debug|Any CPU
+		{49F0275A-4517-49FA-859E-77279B9C8B18}.Debug PerformanceTrace|x64.ActiveCfg = Debug|Any CPU
+		{49F0275A-4517-49FA-859E-77279B9C8B18}.Debug PerformanceTrace|x86.ActiveCfg = Debug|Any CPU
 		{49F0275A-4517-49FA-859E-77279B9C8B18}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
 		{49F0275A-4517-49FA-859E-77279B9C8B18}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{49F0275A-4517-49FA-859E-77279B9C8B18}.Debug|x64.ActiveCfg = Debug|Any CPU
@@ -186,6 +292,12 @@ Global
 		{49F0275A-4517-49FA-859E-77279B9C8B18}.Release|Any CPU.Build.0 = Release|Any CPU
 		{49F0275A-4517-49FA-859E-77279B9C8B18}.Release|x64.ActiveCfg = Release|Any CPU
 		{49F0275A-4517-49FA-859E-77279B9C8B18}.Release|x86.ActiveCfg = Release|Any CPU
+		{512C2CD1-E5BE-4F6B-943B-2BFA7E0CBD64}.Debug PerformanceStats|Any CPU.ActiveCfg = Debug|Any CPU
+		{512C2CD1-E5BE-4F6B-943B-2BFA7E0CBD64}.Debug PerformanceStats|x64.ActiveCfg = Debug|Any CPU
+		{512C2CD1-E5BE-4F6B-943B-2BFA7E0CBD64}.Debug PerformanceStats|x86.ActiveCfg = Debug|Any CPU
+		{512C2CD1-E5BE-4F6B-943B-2BFA7E0CBD64}.Debug PerformanceTrace|Any CPU.ActiveCfg = Debug|Any CPU
+		{512C2CD1-E5BE-4F6B-943B-2BFA7E0CBD64}.Debug PerformanceTrace|x64.ActiveCfg = Debug|Any CPU
+		{512C2CD1-E5BE-4F6B-943B-2BFA7E0CBD64}.Debug PerformanceTrace|x86.ActiveCfg = Debug|Any CPU
 		{512C2CD1-E5BE-4F6B-943B-2BFA7E0CBD64}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
 		{512C2CD1-E5BE-4F6B-943B-2BFA7E0CBD64}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{512C2CD1-E5BE-4F6B-943B-2BFA7E0CBD64}.Debug|x64.ActiveCfg = Debug|Any CPU
@@ -194,6 +306,12 @@ Global
 		{512C2CD1-E5BE-4F6B-943B-2BFA7E0CBD64}.Release|Any CPU.Build.0 = Release|Any CPU
 		{512C2CD1-E5BE-4F6B-943B-2BFA7E0CBD64}.Release|x64.ActiveCfg = Release|Any CPU
 		{512C2CD1-E5BE-4F6B-943B-2BFA7E0CBD64}.Release|x86.ActiveCfg = Release|Any CPU
+		{D959CB7C-F514-4F5E-9C33-684D0012474B}.Debug PerformanceStats|Any CPU.ActiveCfg = Debug|Any CPU
+		{D959CB7C-F514-4F5E-9C33-684D0012474B}.Debug PerformanceStats|x64.ActiveCfg = Debug|Any CPU
+		{D959CB7C-F514-4F5E-9C33-684D0012474B}.Debug PerformanceStats|x86.ActiveCfg = Debug|Any CPU
+		{D959CB7C-F514-4F5E-9C33-684D0012474B}.Debug PerformanceTrace|Any CPU.ActiveCfg = Debug|Any CPU
+		{D959CB7C-F514-4F5E-9C33-684D0012474B}.Debug PerformanceTrace|x64.ActiveCfg = Debug|Any CPU
+		{D959CB7C-F514-4F5E-9C33-684D0012474B}.Debug PerformanceTrace|x86.ActiveCfg = Debug|Any CPU
 		{D959CB7C-F514-4F5E-9C33-684D0012474B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
 		{D959CB7C-F514-4F5E-9C33-684D0012474B}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{D959CB7C-F514-4F5E-9C33-684D0012474B}.Debug|x64.ActiveCfg = Debug|Any CPU
@@ -202,6 +320,12 @@ Global
 		{D959CB7C-F514-4F5E-9C33-684D0012474B}.Release|Any CPU.Build.0 = Release|Any CPU
 		{D959CB7C-F514-4F5E-9C33-684D0012474B}.Release|x64.ActiveCfg = Release|Any CPU
 		{D959CB7C-F514-4F5E-9C33-684D0012474B}.Release|x86.ActiveCfg = Release|Any CPU
+		{41314A40-AB3E-4F43-B1A4-58443F4014F2}.Debug PerformanceStats|Any CPU.ActiveCfg = Debug|Any CPU
+		{41314A40-AB3E-4F43-B1A4-58443F4014F2}.Debug PerformanceStats|x64.ActiveCfg = Debug|Any CPU
+		{41314A40-AB3E-4F43-B1A4-58443F4014F2}.Debug PerformanceStats|x86.ActiveCfg = Debug|Any CPU
+		{41314A40-AB3E-4F43-B1A4-58443F4014F2}.Debug PerformanceTrace|Any CPU.ActiveCfg = Debug|Any CPU
+		{41314A40-AB3E-4F43-B1A4-58443F4014F2}.Debug PerformanceTrace|x64.ActiveCfg = Debug|Any CPU
+		{41314A40-AB3E-4F43-B1A4-58443F4014F2}.Debug PerformanceTrace|x86.ActiveCfg = Debug|Any CPU
 		{41314A40-AB3E-4F43-B1A4-58443F4014F2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
 		{41314A40-AB3E-4F43-B1A4-58443F4014F2}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{41314A40-AB3E-4F43-B1A4-58443F4014F2}.Debug|x64.ActiveCfg = Debug|Any CPU
@@ -210,6 +334,12 @@ Global
 		{41314A40-AB3E-4F43-B1A4-58443F4014F2}.Release|Any CPU.Build.0 = Release|Any CPU
 		{41314A40-AB3E-4F43-B1A4-58443F4014F2}.Release|x64.ActiveCfg = Release|Any CPU
 		{41314A40-AB3E-4F43-B1A4-58443F4014F2}.Release|x86.ActiveCfg = Release|Any CPU
+		{749F150A-F974-46DC-A1E2-F4153C54FC0D}.Debug PerformanceStats|Any CPU.ActiveCfg = Debug|Any CPU
+		{749F150A-F974-46DC-A1E2-F4153C54FC0D}.Debug PerformanceStats|x64.ActiveCfg = Debug|Any CPU
+		{749F150A-F974-46DC-A1E2-F4153C54FC0D}.Debug PerformanceStats|x86.ActiveCfg = Debug|Any CPU
+		{749F150A-F974-46DC-A1E2-F4153C54FC0D}.Debug PerformanceTrace|Any CPU.ActiveCfg = Debug|Any CPU
+		{749F150A-F974-46DC-A1E2-F4153C54FC0D}.Debug PerformanceTrace|x64.ActiveCfg = Debug|Any CPU
+		{749F150A-F974-46DC-A1E2-F4153C54FC0D}.Debug PerformanceTrace|x86.ActiveCfg = Debug|Any CPU
 		{749F150A-F974-46DC-A1E2-F4153C54FC0D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
 		{749F150A-F974-46DC-A1E2-F4153C54FC0D}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{749F150A-F974-46DC-A1E2-F4153C54FC0D}.Debug|x64.ActiveCfg = Debug|Any CPU
@@ -218,6 +348,12 @@ Global
 		{749F150A-F974-46DC-A1E2-F4153C54FC0D}.Release|Any CPU.Build.0 = Release|Any CPU
 		{749F150A-F974-46DC-A1E2-F4153C54FC0D}.Release|x64.ActiveCfg = Release|Any CPU
 		{749F150A-F974-46DC-A1E2-F4153C54FC0D}.Release|x86.ActiveCfg = Release|Any CPU
+		{2C58BA97-2954-4D19-920F-A24B78FC80A4}.Debug PerformanceStats|Any CPU.ActiveCfg = Debug|Any CPU
+		{2C58BA97-2954-4D19-920F-A24B78FC80A4}.Debug PerformanceStats|x64.ActiveCfg = Debug|Any CPU
+		{2C58BA97-2954-4D19-920F-A24B78FC80A4}.Debug PerformanceStats|x86.ActiveCfg = Debug|Any CPU
+		{2C58BA97-2954-4D19-920F-A24B78FC80A4}.Debug PerformanceTrace|Any CPU.ActiveCfg = Debug|Any CPU
+		{2C58BA97-2954-4D19-920F-A24B78FC80A4}.Debug PerformanceTrace|x64.ActiveCfg = Debug|Any CPU
+		{2C58BA97-2954-4D19-920F-A24B78FC80A4}.Debug PerformanceTrace|x86.ActiveCfg = Debug|Any CPU
 		{2C58BA97-2954-4D19-920F-A24B78FC80A4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
 		{2C58BA97-2954-4D19-920F-A24B78FC80A4}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{2C58BA97-2954-4D19-920F-A24B78FC80A4}.Debug|x64.ActiveCfg = Debug|Any CPU
@@ -226,6 +362,12 @@ Global
 		{2C58BA97-2954-4D19-920F-A24B78FC80A4}.Release|Any CPU.Build.0 = Release|Any CPU
 		{2C58BA97-2954-4D19-920F-A24B78FC80A4}.Release|x64.ActiveCfg = Release|Any CPU
 		{2C58BA97-2954-4D19-920F-A24B78FC80A4}.Release|x86.ActiveCfg = Release|Any CPU
+		{7C364099-9B85-473A-8A42-BBEBE4798FF5}.Debug PerformanceStats|Any CPU.ActiveCfg = Debug|Any CPU
+		{7C364099-9B85-473A-8A42-BBEBE4798FF5}.Debug PerformanceStats|x64.ActiveCfg = Debug|Any CPU
+		{7C364099-9B85-473A-8A42-BBEBE4798FF5}.Debug PerformanceStats|x86.ActiveCfg = Debug|Any CPU
+		{7C364099-9B85-473A-8A42-BBEBE4798FF5}.Debug PerformanceTrace|Any CPU.ActiveCfg = Debug|Any CPU
+		{7C364099-9B85-473A-8A42-BBEBE4798FF5}.Debug PerformanceTrace|x64.ActiveCfg = Debug|Any CPU
+		{7C364099-9B85-473A-8A42-BBEBE4798FF5}.Debug PerformanceTrace|x86.ActiveCfg = Debug|Any CPU
 		{7C364099-9B85-473A-8A42-BBEBE4798FF5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
 		{7C364099-9B85-473A-8A42-BBEBE4798FF5}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{7C364099-9B85-473A-8A42-BBEBE4798FF5}.Debug|x64.ActiveCfg = Debug|Any CPU
@@ -234,6 +376,12 @@ Global
 		{7C364099-9B85-473A-8A42-BBEBE4798FF5}.Release|Any CPU.Build.0 = Release|Any CPU
 		{7C364099-9B85-473A-8A42-BBEBE4798FF5}.Release|x64.ActiveCfg = Release|Any CPU
 		{7C364099-9B85-473A-8A42-BBEBE4798FF5}.Release|x86.ActiveCfg = Release|Any CPU
+		{B673E12F-D323-4C4C-8805-9915B2C72D3D}.Debug PerformanceStats|Any CPU.ActiveCfg = Debug|Any CPU
+		{B673E12F-D323-4C4C-8805-9915B2C72D3D}.Debug PerformanceStats|x64.ActiveCfg = Debug|Any CPU
+		{B673E12F-D323-4C4C-8805-9915B2C72D3D}.Debug PerformanceStats|x86.ActiveCfg = Debug|Any CPU
+		{B673E12F-D323-4C4C-8805-9915B2C72D3D}.Debug PerformanceTrace|Any CPU.ActiveCfg = Debug|Any CPU
+		{B673E12F-D323-4C4C-8805-9915B2C72D3D}.Debug PerformanceTrace|x64.ActiveCfg = Debug|Any CPU
+		{B673E12F-D323-4C4C-8805-9915B2C72D3D}.Debug PerformanceTrace|x86.ActiveCfg = Debug|Any CPU
 		{B673E12F-D323-4C4C-8805-9915B2C72D3D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
 		{B673E12F-D323-4C4C-8805-9915B2C72D3D}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{B673E12F-D323-4C4C-8805-9915B2C72D3D}.Debug|x64.ActiveCfg = Debug|Any CPU
@@ -242,6 +390,12 @@ Global
 		{B673E12F-D323-4C4C-8805-9915B2C72D3D}.Release|Any CPU.Build.0 = Release|Any CPU
 		{B673E12F-D323-4C4C-8805-9915B2C72D3D}.Release|x64.ActiveCfg = Release|Any CPU
 		{B673E12F-D323-4C4C-8805-9915B2C72D3D}.Release|x86.ActiveCfg = Release|Any CPU
+		{760C1C5B-A767-463E-BA85-F0BCFC23A550}.Debug PerformanceStats|Any CPU.ActiveCfg = Debug|Any CPU
+		{760C1C5B-A767-463E-BA85-F0BCFC23A550}.Debug PerformanceStats|x64.ActiveCfg = Debug|Any CPU
+		{760C1C5B-A767-463E-BA85-F0BCFC23A550}.Debug PerformanceStats|x86.ActiveCfg = Debug|Any CPU
+		{760C1C5B-A767-463E-BA85-F0BCFC23A550}.Debug PerformanceTrace|Any CPU.ActiveCfg = Debug|Any CPU
+		{760C1C5B-A767-463E-BA85-F0BCFC23A550}.Debug PerformanceTrace|x64.ActiveCfg = Debug|Any CPU
+		{760C1C5B-A767-463E-BA85-F0BCFC23A550}.Debug PerformanceTrace|x86.ActiveCfg = Debug|Any CPU
 		{760C1C5B-A767-463E-BA85-F0BCFC23A550}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
 		{760C1C5B-A767-463E-BA85-F0BCFC23A550}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{760C1C5B-A767-463E-BA85-F0BCFC23A550}.Debug|x64.ActiveCfg = Debug|Any CPU
@@ -250,6 +404,12 @@ Global
 		{760C1C5B-A767-463E-BA85-F0BCFC23A550}.Release|Any CPU.Build.0 = Release|Any CPU
 		{760C1C5B-A767-463E-BA85-F0BCFC23A550}.Release|x64.ActiveCfg = Release|Any CPU
 		{760C1C5B-A767-463E-BA85-F0BCFC23A550}.Release|x86.ActiveCfg = Release|Any CPU
+		{E14FC935-30EA-4BE6-AA8A-85CB76FEBA6A}.Debug PerformanceStats|Any CPU.ActiveCfg = Debug|Any CPU
+		{E14FC935-30EA-4BE6-AA8A-85CB76FEBA6A}.Debug PerformanceStats|x64.ActiveCfg = Debug|Any CPU
+		{E14FC935-30EA-4BE6-AA8A-85CB76FEBA6A}.Debug PerformanceStats|x86.ActiveCfg = Debug|Any CPU
+		{E14FC935-30EA-4BE6-AA8A-85CB76FEBA6A}.Debug PerformanceTrace|Any CPU.ActiveCfg = Debug|Any CPU
+		{E14FC935-30EA-4BE6-AA8A-85CB76FEBA6A}.Debug PerformanceTrace|x64.ActiveCfg = Debug|Any CPU
+		{E14FC935-30EA-4BE6-AA8A-85CB76FEBA6A}.Debug PerformanceTrace|x86.ActiveCfg = Debug|Any CPU
 		{E14FC935-30EA-4BE6-AA8A-85CB76FEBA6A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
 		{E14FC935-30EA-4BE6-AA8A-85CB76FEBA6A}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{E14FC935-30EA-4BE6-AA8A-85CB76FEBA6A}.Debug|x64.ActiveCfg = Debug|Any CPU
@@ -258,6 +418,12 @@ Global
 		{E14FC935-30EA-4BE6-AA8A-85CB76FEBA6A}.Release|Any CPU.Build.0 = Release|Any CPU
 		{E14FC935-30EA-4BE6-AA8A-85CB76FEBA6A}.Release|x64.ActiveCfg = Release|Any CPU
 		{E14FC935-30EA-4BE6-AA8A-85CB76FEBA6A}.Release|x86.ActiveCfg = Release|Any CPU
+		{33F9848E-9257-4BE2-915F-68E748AEB204}.Debug PerformanceStats|Any CPU.ActiveCfg = Debug|Any CPU
+		{33F9848E-9257-4BE2-915F-68E748AEB204}.Debug PerformanceStats|x64.ActiveCfg = Debug|Any CPU
+		{33F9848E-9257-4BE2-915F-68E748AEB204}.Debug PerformanceStats|x86.ActiveCfg = Debug|Any CPU
+		{33F9848E-9257-4BE2-915F-68E748AEB204}.Debug PerformanceTrace|Any CPU.ActiveCfg = Debug|Any CPU
+		{33F9848E-9257-4BE2-915F-68E748AEB204}.Debug PerformanceTrace|x64.ActiveCfg = Debug|Any CPU
+		{33F9848E-9257-4BE2-915F-68E748AEB204}.Debug PerformanceTrace|x86.ActiveCfg = Debug|Any CPU
 		{33F9848E-9257-4BE2-915F-68E748AEB204}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
 		{33F9848E-9257-4BE2-915F-68E748AEB204}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{33F9848E-9257-4BE2-915F-68E748AEB204}.Debug|x64.ActiveCfg = Debug|Any CPU
diff --git a/VECTO/GUI/VectoJobForm.vb b/VECTO/GUI/VectoJobForm.vb
index 18bd338ee58e8a67da2967b6ff8302c114d6b7bf..0863126db6e867e1dd55e8b86071fec98d863f33 100644
--- a/VECTO/GUI/VectoJobForm.vb
+++ b/VECTO/GUI/VectoJobForm.vb
@@ -1312,7 +1312,7 @@ lbDlog:
 												True)
 		Catch
 		End Try
-		If s0 Is Nothing Then
+		If Not s0.Found Then
 			HDVclass = "-"
 		Else
 			HDVclass = s0.VehicleClass.GetClassNumber()
@@ -1327,7 +1327,7 @@ lbDlog:
 
 		End If
 
-		PicVehicle.Image = ConvPicPath(If(s0 Is Nothing, -1, HDVclass.ToInt()), False) _
+		PicVehicle.Image = ConvPicPath(If(Not s0.Found, -1, HDVclass.ToInt()), False) _
 		'Image.FromFile(cDeclaration.ConvPicPath(HDVclass, False))
 
 		TbHVCclass.Text = String.Format("HDV Class {0}", HDVclass)
diff --git a/VECTO/GUI/VehicleAxleDialog.Designer.vb b/VECTO/GUI/VehicleAxleDialog.Designer.vb
index e52ce1856dbf713453287ca26dc0225ae40e70c2..fccfd299c47df79b5bd4a178c574ad533e06a968 100644
--- a/VECTO/GUI/VehicleAxleDialog.Designer.vb
+++ b/VECTO/GUI/VehicleAxleDialog.Designer.vb
@@ -58,6 +58,7 @@ Partial Class VehicleAxleDialog
 		Me.CbWheels = New System.Windows.Forms.ComboBox()
 		Me.cbAxleType = New System.Windows.Forms.ComboBox()
 		Me.Label11 = New System.Windows.Forms.Label()
+		Me.Label12 = New System.Windows.Forms.Label()
 		Me.TableLayoutPanel1.SuspendLayout()
 		Me.PnAxle.SuspendLayout()
 		Me.SuspendLayout()
@@ -149,7 +150,7 @@ Partial Class VehicleAxleDialog
 		'Label5
 		'
 		Me.Label5.AutoSize = True
-		Me.Label5.Location = New System.Drawing.Point(67, 119)
+		Me.Label5.Location = New System.Drawing.Point(67, 120)
 		Me.Label5.Name = "Label5"
 		Me.Label5.Size = New System.Drawing.Size(39, 13)
 		Me.Label5.TabIndex = 1
@@ -158,7 +159,7 @@ Partial Class VehicleAxleDialog
 		'Label6
 		'
 		Me.Label6.AutoSize = True
-		Me.Label6.Location = New System.Drawing.Point(202, 91)
+		Me.Label6.Location = New System.Drawing.Point(202, 120)
 		Me.Label6.Name = "Label6"
 		Me.Label6.Size = New System.Drawing.Size(21, 13)
 		Me.Label6.TabIndex = 1
@@ -273,6 +274,15 @@ Partial Class VehicleAxleDialog
 		Me.Label11.TabIndex = 9
 		Me.Label11.Text = "Configuration"
 		'
+		'Label12
+		'
+		Me.Label12.AutoSize = True
+		Me.Label12.Location = New System.Drawing.Point(202, 94)
+		Me.Label12.Name = "Label12"
+		Me.Label12.Size = New System.Drawing.Size(16, 13)
+		Me.Label12.TabIndex = 10
+		Me.Label12.Text = "[-]"
+		'
 		'VehicleAxleDialog
 		'
 		Me.AcceptButton = Me.OK_Button
@@ -280,6 +290,7 @@ Partial Class VehicleAxleDialog
 		Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
 		Me.CancelButton = Me.Cancel_Button
 		Me.ClientSize = New System.Drawing.Size(467, 202)
+		Me.Controls.Add(Me.Label12)
 		Me.Controls.Add(Me.Label11)
 		Me.Controls.Add(Me.cbAxleType)
 		Me.Controls.Add(Me.CbWheels)
@@ -332,5 +343,6 @@ Partial Class VehicleAxleDialog
 	Friend WithEvents CbWheels As ComboBox
 	Friend WithEvents cbAxleType As System.Windows.Forms.ComboBox
 	Friend WithEvents Label11 As System.Windows.Forms.Label
+	Friend WithEvents Label12 As System.Windows.Forms.Label
 
 End Class
diff --git a/VECTO/GUI/VehicleForm.Designer.vb b/VECTO/GUI/VehicleForm.Designer.vb
index 0db5e85b16b9d50c2221c4ac5fa06fbc802ca8c8..f44fafcf25beb17007d3366f602452a28c7b0d9a 100644
--- a/VECTO/GUI/VehicleForm.Designer.vb
+++ b/VECTO/GUI/VehicleForm.Designer.vb
@@ -142,6 +142,7 @@ Partial Class VehicleForm
 		Me.Label17 = New System.Windows.Forms.Label()
 		Me.btDelMaxTorqueEntry = New System.Windows.Forms.Button()
 		Me.btAddMaxTorqueEntry = New System.Windows.Forms.Button()
+		Me.cbLegislativeClass = New System.Windows.Forms.ComboBox()
 		Me.GroupBox6.SuspendLayout()
 		Me.ToolStrip1.SuspendLayout()
 		Me.GroupBox7.SuspendLayout()
@@ -1093,7 +1094,7 @@ Partial Class VehicleForm
 		Me.TabPage2.Location = New System.Drawing.Point(4, 22)
 		Me.TabPage2.Name = "TabPage2"
 		Me.TabPage2.Padding = New System.Windows.Forms.Padding(3)
-		Me.TabPage2.Size = New System.Drawing.Size(579, 350)
+		Me.TabPage2.Size = New System.Drawing.Size(579, 329)
 		Me.TabPage2.TabIndex = 1
 		Me.TabPage2.Text = "Powertrain"
 		Me.TabPage2.UseVisualStyleBackColor = True
@@ -1106,7 +1107,7 @@ Partial Class VehicleForm
 		Me.TabPage3.Controls.Add(Me.btAddMaxTorqueEntry)
 		Me.TabPage3.Location = New System.Drawing.Point(4, 22)
 		Me.TabPage3.Name = "TabPage3"
-		Me.TabPage3.Size = New System.Drawing.Size(579, 350)
+		Me.TabPage3.Size = New System.Drawing.Size(579, 329)
 		Me.TabPage3.TabIndex = 2
 		Me.TabPage3.Text = "Torque Limits"
 		Me.TabPage3.UseVisualStyleBackColor = True
@@ -1165,6 +1166,15 @@ Partial Class VehicleForm
 		Me.btAddMaxTorqueEntry.TabIndex = 4
 		Me.btAddMaxTorqueEntry.UseVisualStyleBackColor = True
 		'
+		'cbLegislativeClass
+		'
+		Me.cbLegislativeClass.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList
+		Me.cbLegislativeClass.FormattingEnabled = True
+		Me.cbLegislativeClass.Location = New System.Drawing.Point(219, 106)
+		Me.cbLegislativeClass.Name = "cbLegislativeClass"
+		Me.cbLegislativeClass.Size = New System.Drawing.Size(52, 21)
+		Me.cbLegislativeClass.TabIndex = 41
+		'
 		'VehicleForm
 		'
 		Me.AcceptButton = Me.ButOK
@@ -1172,6 +1182,7 @@ Partial Class VehicleForm
 		Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
 		Me.CancelButton = Me.ButCancel
 		Me.ClientSize = New System.Drawing.Size(599, 580)
+		Me.Controls.Add(Me.cbLegislativeClass)
 		Me.Controls.Add(Me.TabControl1)
 		Me.Controls.Add(Me.ButCancel)
 		Me.Controls.Add(Me.ButOK)
@@ -1342,4 +1353,5 @@ Partial Class VehicleForm
 	Friend WithEvents tbVehIdlingSpeed As System.Windows.Forms.TextBox
 	Friend WithEvents Label18 As System.Windows.Forms.Label
 	Friend WithEvents Label19 As System.Windows.Forms.Label
+	Friend WithEvents cbLegislativeClass As System.Windows.Forms.ComboBox
 End Class
diff --git a/VECTO/GUI/VehicleForm.vb b/VECTO/GUI/VehicleForm.vb
index e850b7f9e247f67511ef903eab97bf208b0e319c..25eea0c99f89e21704d0edf89ee250b679a84b78 100644
--- a/VECTO/GUI/VehicleForm.vb
+++ b/VECTO/GUI/VehicleForm.vb
@@ -102,6 +102,11 @@ Public Class VehicleForm
 		cbPTOType.DisplayMember = "Label"
 		cbPTOType.DataSource = DeclarationData.PTOTransmission.GetTechnologies.Select(
 			Function(technology) New With {Key .Value = technology, .Label = technology}).ToList()
+
+		cbLegislativeClass.ValueMember = "Value"
+		cbLegislativeClass.DisplayMember = "Label"
+		cbLegislativeClass.DataSource = [Enum].GetValues(GetType(LegislativeClass)) _
+			.Cast(Of LegislativeClass).Select(Function(x) New With {Key .Value = x, .Label = x.GetLabel()}).Tolist()
 		'Items.AddRange(PtoTypeStrings.Values.Cast(Of Object).ToArray())
 
 		_changed = False
@@ -127,13 +132,13 @@ Public Class VehicleForm
 		Catch
 			' no segment found - ignore
 		End Try
-		If Not s0 Is Nothing Then
+		If s0.Found Then
 			_hdVclass = s0.VehicleClass.GetClassNumber()
 		End If
 
 
 		TbHDVclass.Text = _hdVclass
-		PicVehicle.Image = ConvPicPath(If(s0 Is Nothing, -1, _hdVclass.ToInt()), False)
+		PicVehicle.Image = ConvPicPath(If(Not s0.Found, -1, _hdVclass.ToInt()), False)
 	End Sub
 
 
@@ -155,7 +160,7 @@ Public Class VehicleForm
 		Catch
 			' no segment found - ignore
 		End Try
-		If Not s0 Is Nothing Then
+		If s0.found Then
 			_hdVclass = s0.VehicleClass.GetClassNumber()
 			Dim axleCount As Integer = s0.Missions(0).AxleWeightDistribution.Count()
 			Dim i0 As Integer = LvRRC.Items.Count
@@ -366,6 +371,7 @@ Public Class VehicleForm
 		TbCdFile.Text =
 			If(airdrag.CrosswindCorrectionMap Is Nothing, "", GetRelativePath(airdrag.CrosswindCorrectionMap.Source, basePath))
 
+		cbLegislativeClass.SelectedValue = vehicle.LegislativeClass
 		CbRtType.SelectedValue = retarder.Type
 		TbRtRatio.Text = retarder.Ratio.ToGUIFormat()
 		TbRtPath.Text = If(retarder.LossMap Is Nothing, "", GetRelativePath(retarder.LossMap.Source, basePath))
@@ -450,7 +456,7 @@ Public Class VehicleForm
 		veh.Loading = TbLoad.Text.ToDouble(0)
 
 		veh.CdA0 = If(String.IsNullOrWhiteSpace(TBcdA.Text), Double.NaN, TBcdA.Text.ToDouble(0))
-
+		veh.legClass = CType(cbLegislativeClass.SelectedValue, LegislativeClass)
 		veh.DynamicTyreRadius = TBrdyn.Text.ToDouble(0)
 		veh.CrossWindCorrectionMode = CType(CbCdMode.SelectedValue, CrossWindCorrectionMode)
 		veh.CrossWindCorrectionFile.Init(GetPath(file), TbCdFile.Text)
diff --git a/VECTO/GUI/XMLExportJobDialog.vb b/VECTO/GUI/XMLExportJobDialog.vb
index 8072b66ce3046925fc75ba1dc90a15e5f7e49727..48236bee9e9b37d7e9ae82267b83d7bf3c9ffe2f 100644
--- a/VECTO/GUI/XMLExportJobDialog.vb
+++ b/VECTO/GUI/XMLExportJobDialog.vb
@@ -1,78 +1,78 @@
-Imports System.IO
-Imports System.Xml.Linq
-Imports TUGraz.VectoCommon.Exceptions
-Imports TUGraz.VectoCommon.InputData
-Imports TUGraz.VectoCommon.Models
-Imports TUGraz.VectoCore.OutputData.XML
-
-Public Class XMLExportJobDialog
-	Private _mode As ExecutionMode
-	Private _data As IInputDataProvider
-
-	Public Sub Initialize(data As IInputDataProvider)
-		Dim source As String
-		Dim allowSingleFile As Boolean
-		Dim eng As IEngineeringInputDataProvider = CType(data, IEngineeringInputDataProvider)
-		If (Not eng Is Nothing AndAlso Not eng.JobInputData().SavedInDeclarationMode) Then
-			source = eng.JobInputData().JobName
-			_mode = ExecutionMode.Engineering
-			allowSingleFile = True
-		Else
-			Dim decl As IDeclarationInputDataProvider = CType(data, IDeclarationInputDataProvider)
-			If (Not decl Is Nothing AndAlso decl.JobInputData().SavedInDeclarationMode) Then
-				source = decl.JobInputData().JobName
-				_mode = ExecutionMode.Declaration
-				allowSingleFile = False
-			Else
-				Throw New VectoException("Input data is neither declaration nor engineering mode!")
-			End If
-		End If
-		_data = data
-		tbJobfile.Text = source
-		tbMode.Text = If(_mode = ExecutionMode.Engineering, "Engineering Mode", "Declaration Mode")
-		cbSingleFile.Checked = True
-		cbSingleFile.Enabled = allowSingleFile
-	End Sub
-
+Imports System.IO
+Imports System.Xml.Linq
+Imports TUGraz.VectoCommon.Exceptions
+Imports TUGraz.VectoCommon.InputData
+Imports TUGraz.VectoCommon.Models
+Imports TUGraz.VectoCore.OutputData.XML
+
+Public Class XMLExportJobDialog
+	Private _mode As ExecutionMode
+	Private _data As IInputDataProvider
+
+	Public Sub Initialize(data As IInputDataProvider)
+		Dim source As String
+		Dim allowSingleFile As Boolean
+		Dim eng As IEngineeringInputDataProvider = CType(data, IEngineeringInputDataProvider)
+		If (Not eng Is Nothing AndAlso Not eng.JobInputData().SavedInDeclarationMode) Then
+			source = eng.JobInputData().JobName
+			_mode = ExecutionMode.Engineering
+			allowSingleFile = True
+		Else
+			Dim decl As IDeclarationInputDataProvider = CType(data, IDeclarationInputDataProvider)
+			If (Not decl Is Nothing AndAlso decl.JobInputData().SavedInDeclarationMode) Then
+				source = decl.JobInputData().JobName
+				_mode = ExecutionMode.Declaration
+				allowSingleFile = False
+			Else
+				Throw New VectoException("Input data is neither declaration nor engineering mode!")
+			End If
+		End If
+		_data = data
+		tbJobfile.Text = source
+		tbMode.Text = If(_mode = ExecutionMode.Engineering, "Engineering Mode", "Declaration Mode")
+		cbSingleFile.Checked = True
+		cbSingleFile.Enabled = allowSingleFile
+	End Sub
+
 	Private Sub btnBrowseOutputDir_Click(sender As Object, e As EventArgs) Handles BtTCfileBrowse.Click
 		If Not FolderFileBrowser.OpenDialog("") Then
 			Exit Sub
-		End If
+		End If
 
 		Dim filePath As String = FolderFileBrowser.Files(0)
 		tbDestination.Text = Path.GetFullPath(filePath)
-	End Sub
-
-	Private Sub btnCancel_Click(sender As Object, e As EventArgs) Handles btnCancel.Click
-		Close()
-	End Sub
-
-	Private Sub btnExport_Click(sender As Object, e As EventArgs) Handles btnExport.Click
-		If (String.IsNullOrWhiteSpace(tbDestination.Text) OrElse Not Directory.Exists(tbDestination.Text)) Then
-			MessageBox.Show("Output directory is invalid", "Invalid Output", MessageBoxButtons.OK)
-			Exit Sub
-		End If
-
-		If (_mode = ExecutionMode.Engineering) Then
-			Dim engineeringData As IEngineeringInputDataProvider = CType(_data, IEngineeringInputDataProvider)
-			If (engineeringData Is Nothing OrElse engineeringData.JobInputData().SavedInDeclarationMode) Then
-				Throw New Exception("Input data is not in engineering mode!")
-			End If
-			Dim document As XDocument =
-					New XMLEngineeringWriter(tbDestination.Text, cbSingleFile.Checked, tbVendor.Text).GenerateVectoJob(engineeringData)
-			document.Save(Path.Combine(tbDestination.Text, engineeringData.JobInputData().JobName + ".xml"))
-			MessageBox.Show("Successfully exported")
-			Close()
-		Else
-			Dim declarationData As IDeclarationInputDataProvider = CType(_data, IDeclarationInputDataProvider)
-			If (declarationData Is Nothing OrElse Not declarationData.JobInputData().SavedInDeclarationMode) Then
-				Throw New Exception("Input data is not in declaration mode")
-			End If
-			Dim document As XDocument =
-					New XMLDeclarationWriter(tbVendor.Text).GenerateVectoJob(declarationData)
-			document.Save(Path.Combine(tbDestination.Text, declarationData.JobInputData().JobName + ".xml"))
-			MessageBox.Show("Successfully exported")
-			Close()
-		End If
-	End Sub
+	End Sub
+
+	Private Sub btnCancel_Click(sender As Object, e As EventArgs) Handles btnCancel.Click
+		Close()
+	End Sub
+
+	Private Sub btnExport_Click(sender As Object, e As EventArgs) Handles btnExport.Click
+		If (String.IsNullOrWhiteSpace(tbDestination.Text) OrElse Not Directory.Exists(tbDestination.Text)) Then
+			MessageBox.Show("Output directory is invalid", "Invalid Output", MessageBoxButtons.OK)
+			Exit Sub
+		End If
+
+		If (_mode = ExecutionMode.Engineering) Then
+			Dim engineeringData As IEngineeringInputDataProvider = CType(_data, IEngineeringInputDataProvider)
+			If (engineeringData Is Nothing OrElse engineeringData.JobInputData().SavedInDeclarationMode) Then
+				Throw New Exception("Input data is not in engineering mode!")
+			End If
+			Dim document As XDocument =
+					New XMLEngineeringWriter(tbDestination.Text, cbSingleFile.Checked, tbVendor.Text).GenerateVectoJob(engineeringData)
+			document.Save(Path.Combine(tbDestination.Text, engineeringData.JobInputData().JobName + ".xml"))
+			MessageBox.Show("Successfully exported")
+			Close()
+		Else
+			Dim declarationData As IDeclarationInputDataProvider = CType(_data, IDeclarationInputDataProvider)
+			If (declarationData Is Nothing OrElse Not declarationData.JobInputData().SavedInDeclarationMode) Then
+				Throw New Exception("Input data is not in declaration mode")
+			End If
+			Dim document As XDocument =
+					New XMLDeclarationWriter(tbVendor.Text).GenerateVectoJob(declarationData)
+			document.Save(Path.Combine(tbDestination.Text, declarationData.JobInputData().JobName + ".xml"))
+			MessageBox.Show("Successfully exported")
+			Close()
+		End If
+	End Sub
 End Class
\ No newline at end of file
diff --git a/VECTO/Input Files/Vehicle.vb b/VECTO/Input Files/Vehicle.vb
index cf4a0695ef2fe9b00a4f04d00f08bdee49387ab1..107f9dc7005a26797e1fe2c18aa4dda6632824ff 100644
--- a/VECTO/Input Files/Vehicle.vb	
+++ b/VECTO/Input Files/Vehicle.vb	
@@ -63,6 +63,7 @@ Public Class Vehicle
 	Public ReadOnly PtoCycle As SubPath
 	Public torqueLimitsList As List(Of ITorqueLimitInputData)
 	Public VehicleidlingSpeed As PerSecond
+	Public legClass As LegislativeClass
 
 
 	Public Sub New()
@@ -323,9 +324,9 @@ Public Class Vehicle
 		End Get
 	End Property
 
-	Public ReadOnly Property LegislativeClass As String Implements IVehicleDeclarationInputData.LegislativeClass
+	Public ReadOnly Property LegislativeClass As LegislativeClass Implements IVehicleEngineeringInputData.LegislativeClass
 		Get
-			Return "N3"
+			Return legClass
 		End Get
 	End Property
 
diff --git a/VECTO/OutputData/JSONFileWriter.vb b/VECTO/OutputData/JSONFileWriter.vb
index a5f76f078f9c783e6f8f7559e35e810e18bafb44..814a599beefeba5f3d7e0cb03220b0910f285bc7 100644
--- a/VECTO/OutputData/JSONFileWriter.vb
+++ b/VECTO/OutputData/JSONFileWriter.vb
@@ -202,6 +202,7 @@ Public Class JSONFileWriter
 		Dim body As Dictionary(Of String, Object) = New Dictionary(Of String, Object) From {
 				{"SavedInDeclMode", Cfg.DeclMode},
 				{"VehCat", vehicle.VehicleCategory.ToString()},
+				{"LegislativeClass", vehicle.LegislativeClass.ToString()},
 				{"CurbWeight", vehicle.CurbMassChassis.Value()},
 				{"CurbWeightExtra", vehicle.CurbMassExtra.Value()},
 				{"Loading", vehicle.Loading.Value()},
diff --git a/VectoCommon/VectoCommon/InputData/DeclarationInputData.cs b/VectoCommon/VectoCommon/InputData/DeclarationInputData.cs
index 574c9a579db9b7aab3fd3745091b03e61c27f421..75060d28e6ee1a754cd0940625c1e97951e67dd2 100644
--- a/VectoCommon/VectoCommon/InputData/DeclarationInputData.cs
+++ b/VectoCommon/VectoCommon/InputData/DeclarationInputData.cs
@@ -29,400 +29,400 @@
 *   Martin Rexeis, rexeis@ivt.tugraz.at, IVT, Graz University of Technology
 */
 
-using System.Collections.Generic;
-using TUGraz.VectoCommon.Models;
-using TUGraz.VectoCommon.Utils;
-
-namespace TUGraz.VectoCommon.InputData
-{
-	public interface IDeclarationJobInputData
-	{
-		bool SavedInDeclarationMode { get; }
-
-		IVehicleDeclarationInputData Vehicle { get; }
-
-		string JobName { get; }
-	}
-
-	public interface IComponentInputData
-	{
-		DataSourceType SourceType { get; }
-
-		string Source { get; }
-
-		bool SavedInDeclarationMode { get; }
-
-		string Manufacturer { get; }
-
-		string Model { get; }
-
-		string Date { get; }
-
-		CertificationMethod CertificationMethod { get; }
-
-		string CertificationNumber { get; }
-
-		string DigestValue { get; }
-	}
-
-	public interface IVehicleDeclarationInputData : IComponentInputData
-	{
-		string VIN { get; }
-
-		string LegislativeClass { get; }
-
-		/// <summary>
-		/// P036
-		/// cf. VECTO Input Parameters.xlsx
-		/// </summary>
-		VehicleCategory VehicleCategory { get; }
-
-		/// <summary>
-		/// P037  
-		/// cf. VECTO Input Parameters.xlsx
-		/// </summary>
-		AxleConfiguration AxleConfiguration { get; }
-
-		/// <summary>
-		/// P038  Curb Weight Vehicle
-		/// cf. VECTO Input Parameters.xlsx
-		/// </summary>
-		Kilogram CurbMassChassis { get; }
-
-		/// <summary>
-		/// P041  Max. vehicle weight
-		/// cf. VECTO Input Parameters.xlsx
-		/// </summary>
-		Kilogram GrossVehicleMassRating { get; }
-
-		///// <summary>
-		///// P117  Powered axle tyres/rims
-		///// cf. VECTO Input Parameters.xlsx
-		///// </summary>
-		//string Rim { get; }  // deprecated
-
-		IList<ITorqueLimitInputData> TorqueLimits { get; }
-
-		/// <summary>
-		/// parameters for every axle
-		/// P044, P045, P046, P047, P048, P108
-		/// cf. VECTO Input Parameters.xlsx
-		/// </summary>
-		IList<IAxleDeclarationInputData> Axles { get; }
-
-		string ManufacturerAddress { get; }
-
-		PerSecond EngineIdleSpeed { get; }
-	}
-
-	public interface IAirdragDeclarationInputData : IComponentInputData
-	{
-		/// <summary>
-		/// P146, P147  DragCoefficient * Cross Section Area - Rigid
-		/// cf. VECTO Input Parameters.xlsx
-		/// </summary>
-		SquareMeter AirDragArea { get; } // without trailer
-	}
-
-	public interface IRetarderInputData : IComponentInputData
-	{
-		/// <summary>
-		/// P052  
-		/// cf. VECTO Input Parameters.xlsx
-		/// </summary>
-		RetarderType Type { get; }
-
-		/// <summary>
-		/// P053
-		/// cf. VECTO Input Parameters.xlsx
-		/// </summary>
-		double Ratio { get; }
-
-		/// <summary>
-		/// P054
-		/// P057, P058
-		/// cf. VECTO Input Parameters.xlsx
-		/// </summary>
-		TableData LossMap { get; }
-	}
-
-	public interface IAngledriveInputData : IComponentInputData
-	{
-		/// <summary>
-		/// P180
-		/// </summary>
-		AngledriveType Type { get; }
-
-		/// <summary>
-		/// P176
-		/// </summary>
-		double Ratio { get; }
-
-		/// <summary>
-		/// P173, P174, P175
-		/// </summary>
-		TableData LossMap { get; }
-
-		/// <summary>
-		/// P177
-		/// </summary>
-		double Efficiency { get; }
-	}
-
-	public interface IAxleDeclarationInputData
-	{
-		/// <summary>
-		/// P108  
-		/// cf. VECTO Input Parameters.xlsx
-		/// </summary>
-		string Wheels { get; }
-
-		/// <summary>
-		/// P045
-		/// cf. VECTO Input Parameters.xlsx
-		/// </summary>
-		bool TwinTyres { get; }
-
-		AxleType AxleType { get; }
-
-		/// <summary>
-		/// P046
-		/// cf. VECTO Input Parameters.xlsx
-		/// </summary>
-		double RollResistanceCoefficient { get; }
-
-		/// <summary>
-		/// P047
-		/// cf. VECTO Input Parameters.xlsx
-		/// </summary>
-		Newton TyreTestLoad { get; }
-	}
-
-	public interface IGearboxDeclarationInputData : IComponentInputData
-	{
-		/// <summary>
-		/// P076
-		/// cf. VECTO Input Parameters.xlsx
-		/// </summary>
-		GearboxType Type { get; }
-
-		/// <summary>
-		/// P078, P079, P077, P082, P145 (for every gear)
-		/// cf. VECTO Input Parameters.xlsx
-		/// </summary>
-		IList<ITransmissionInputData> Gears { get; }
-
-		/// <summary>
-		/// P090, P091, P092, P127
-		/// cf. VECTO Input Parameters.xlsx
-		/// </summary>
-		ITorqueConverterDeclarationInputData TorqueConverter { get; }
-	}
-
-
-	public interface ITransmissionInputData
-	{
-		int Gear { get; }
-
-		/// <summary>
-		/// P078
-		/// cf. VECTO Input Parameters.xlsx
-		/// </summary>
-		double Ratio { get; }
-
-		/// <summary>
-		/// P079
-		/// P096, P097, P098
-		/// cf. VECTO Input Parameters.xlsx
-		/// </summary>
-		TableData LossMap { get; }
-
-		/// <summary>
-		/// P079
-		/// cf. VECTO Input Parameters.xlsx
-		/// </summary>
-		double Efficiency { get; }
-
-		///// <summary>
-		///// P145
-		///// cf. VECTO Input Parameters.xlsx
-		///// </summary>
-		//DataTable FullLoadCurve { get; } // deprecated
-
-		/// <summary>
-		/// P157
-		/// </summary>
-		NewtonMeter MaxTorque { get; }
-
-		PerSecond MaxInputSpeed { get; }
-
-		/// <summary>
-		/// P082
-		/// P093, P094, P095
-		/// cf. VECTO Input Parameters.xlsx
-		/// </summary>
-		TableData ShiftPolygon { get; }
-
-		///// <summary>
-		///// P077
-		///// cf. VECTO Input Parameters.xlsx
-		///// </summary>
-		//bool HasTorqueConverter { get; }     // DEPRECATED
-	}
-
-	public interface IAxleGearInputData : IComponentInputData
-	{
-		/// <summary>
-		/// P078
-		/// cf. VECTO Input Parameters.xlsx
-		/// </summary>
-		double Ratio { get; }
-
-		/// <summary>
-		/// P079
-		/// P096, P097, P098
-		/// cf. VECTO Input Parameters.xlsx
-		/// </summary>
-		TableData LossMap { get; }
-
-		/// <summary>
-		/// P079
-		/// cf. VECTO Input Parameters.xlsx
-		/// </summary>
-		double Efficiency { get; }
-
-		AxleLineType LineType { get; }
-	}
-
-	public interface ITorqueConverterDeclarationInputData : IComponentInputData
-	{
-		/// <summary>
-		/// P091
-		/// P099, P100, P101
-		/// cf. VECTO Input Parameters.xlsx
-		/// </summary>
-		// ReSharper disable once InconsistentNaming
-		TableData TCData { get; }
-	}
-
-	public interface IEngineDeclarationInputData : IComponentInputData
-	{
-		/// <summary>
-		/// P061
-		/// cf. VECTO Input Parameters.xlsx
-		/// </summary>
-		CubicMeter Displacement { get; }
-
-		/// <summary>
-		/// P063
-		/// cf. VECTO Input Parameters.xlsx
-		/// </summary>
-		PerSecond IdleSpeed { get; }
-
-		/// <summary>
-		/// P111
-		/// cf. VECTO Input Parameters.xlsx
-		/// </summary>
-		double WHTCMotorway { get; }
-
-		/// <summary>
-		/// P110
-		/// cf. VECTO Input Parameters.xlsx
-		/// </summary>
-		double WHTCRural { get; }
-
-		/// <summary>
-		/// P109
-		/// cf. VECTO Input Parameters.xlsx
-		/// </summary>
-		double WHTCUrban { get; }
-
-		/// <summary>
-		/// P159
-		/// </summary>
-		double ColdHotBalancingFactor { get; }
-
-		double CorrectionFactorRegPer { get; }
-
-		double CorrectionFactorNCV { get; }
-
-		FuelType FuelType { get; }
-
-		/// <summary>
-		/// P067
-		/// P072, P073, P074
-		/// cf. VECTO Input Parameters.xlsx
-		/// engine speed in rpm, torque in NM, fuel consumption in g/h
-		/// </summary>
-		TableData FuelConsumptionMap { get; }
-
-		/// <summary>
-		/// P144
-		/// P068, P069, P70, P71
-		/// cf. VECTO Input Parameters.xlsx
-		/// </summary>
-		TableData FullLoadCurve { get; }
-
-		Watt RatedPowerDeclared { get; }
-
-		PerSecond RatedSpeedDeclared { get; }
-
-		NewtonMeter MaxTorqueDeclared { get; }
-	}
-
-	public interface IAuxiliariesDeclarationInputData
-	{
-		bool SavedInDeclarationMode { get; }
-
-		IList<IAuxiliaryDeclarationInputData> Auxiliaries { get; }
-	}
-
-	public interface ICycleData
-	{
-		string Name { get; }
-
-		/// <summary>
-		/// P028, P029, P030, P031, P032, P119, P120, P121, P122, P123, P124, P125, P126
-		/// cf. VECTO Input Parameters.xlsx
-		/// </summary>
-		TableData CycleData { get; }
-	}
-
-	public interface IDriverDeclarationInputData
-	{
-		bool SavedInDeclarationMode { get; }
-
-		IOverSpeedEcoRollDeclarationInputData OverSpeedEcoRoll { get; }
-	}
-
-	public interface IOverSpeedEcoRollDeclarationInputData
-	{
-		/// <summary>
-		/// P015
-		/// cf. VECTO Input Parameters.xlsx
-		/// </summary>
-		DriverMode Mode { get; }
-	}
-
-	public interface IAuxiliaryDeclarationInputData
-	{
-		/// <summary>
-		/// P005  Aux-Type
-		/// cf. VECTO Input Parameters.xlsx
-		/// </summary>
-		AuxiliaryType Type { get; }
-
-		/// <summary>
-		/// P118  Aux-Technology
-		/// cf. VECTO Input Parameters.xlsx
-		/// </summary>
-		IList<string> Technology { get; }
-	}
-
-	public interface ITorqueLimitInputData
-	{
-		int Gear { get; }
-
-		NewtonMeter MaxTorque { get; }
-	}
+using System.Collections.Generic;
+using TUGraz.VectoCommon.Models;
+using TUGraz.VectoCommon.Utils;
+
+namespace TUGraz.VectoCommon.InputData
+{
+	public interface IDeclarationJobInputData
+	{
+		bool SavedInDeclarationMode { get; }
+
+		IVehicleDeclarationInputData Vehicle { get; }
+
+		string JobName { get; }
+	}
+
+	public interface IComponentInputData
+	{
+		DataSourceType SourceType { get; }
+
+		string Source { get; }
+
+		bool SavedInDeclarationMode { get; }
+
+		string Manufacturer { get; }
+
+		string Model { get; }
+
+		string Date { get; }
+
+		CertificationMethod CertificationMethod { get; }
+
+		string CertificationNumber { get; }
+
+		string DigestValue { get; }
+	}
+
+	public interface IVehicleDeclarationInputData : IComponentInputData
+	{
+		string VIN { get; }
+
+		LegislativeClass LegislativeClass { get; }
+
+		/// <summary>
+		/// P036
+		/// cf. VECTO Input Parameters.xlsx
+		/// </summary>
+		VehicleCategory VehicleCategory { get; }
+
+		/// <summary>
+		/// P037  
+		/// cf. VECTO Input Parameters.xlsx
+		/// </summary>
+		AxleConfiguration AxleConfiguration { get; }
+
+		/// <summary>
+		/// P038  Curb Weight Vehicle
+		/// cf. VECTO Input Parameters.xlsx
+		/// </summary>
+		Kilogram CurbMassChassis { get; }
+
+		/// <summary>
+		/// P041  Max. vehicle weight
+		/// cf. VECTO Input Parameters.xlsx
+		/// </summary>
+		Kilogram GrossVehicleMassRating { get; }
+
+		///// <summary>
+		///// P117  Powered axle tyres/rims
+		///// cf. VECTO Input Parameters.xlsx
+		///// </summary>
+		//string Rim { get; }  // deprecated
+
+		IList<ITorqueLimitInputData> TorqueLimits { get; }
+
+		/// <summary>
+		/// parameters for every axle
+		/// P044, P045, P046, P047, P048, P108
+		/// cf. VECTO Input Parameters.xlsx
+		/// </summary>
+		IList<IAxleDeclarationInputData> Axles { get; }
+
+		string ManufacturerAddress { get; }
+
+		PerSecond EngineIdleSpeed { get; }
+	}
+
+	public interface IAirdragDeclarationInputData : IComponentInputData
+	{
+		/// <summary>
+		/// P146, P147  DragCoefficient * Cross Section Area - Rigid
+		/// cf. VECTO Input Parameters.xlsx
+		/// </summary>
+		SquareMeter AirDragArea { get; } // without trailer
+	}
+
+	public interface IRetarderInputData : IComponentInputData
+	{
+		/// <summary>
+		/// P052  
+		/// cf. VECTO Input Parameters.xlsx
+		/// </summary>
+		RetarderType Type { get; }
+
+		/// <summary>
+		/// P053
+		/// cf. VECTO Input Parameters.xlsx
+		/// </summary>
+		double Ratio { get; }
+
+		/// <summary>
+		/// P054
+		/// P057, P058
+		/// cf. VECTO Input Parameters.xlsx
+		/// </summary>
+		TableData LossMap { get; }
+	}
+
+	public interface IAngledriveInputData : IComponentInputData
+	{
+		/// <summary>
+		/// P180
+		/// </summary>
+		AngledriveType Type { get; }
+
+		/// <summary>
+		/// P176
+		/// </summary>
+		double Ratio { get; }
+
+		/// <summary>
+		/// P173, P174, P175
+		/// </summary>
+		TableData LossMap { get; }
+
+		/// <summary>
+		/// P177
+		/// </summary>
+		double Efficiency { get; }
+	}
+
+	public interface IAxleDeclarationInputData
+	{
+		/// <summary>
+		/// P108  
+		/// cf. VECTO Input Parameters.xlsx
+		/// </summary>
+		string Wheels { get; }
+
+		/// <summary>
+		/// P045
+		/// cf. VECTO Input Parameters.xlsx
+		/// </summary>
+		bool TwinTyres { get; }
+
+		AxleType AxleType { get; }
+
+		/// <summary>
+		/// P046
+		/// cf. VECTO Input Parameters.xlsx
+		/// </summary>
+		double RollResistanceCoefficient { get; }
+
+		/// <summary>
+		/// P047
+		/// cf. VECTO Input Parameters.xlsx
+		/// </summary>
+		Newton TyreTestLoad { get; }
+	}
+
+	public interface IGearboxDeclarationInputData : IComponentInputData
+	{
+		/// <summary>
+		/// P076
+		/// cf. VECTO Input Parameters.xlsx
+		/// </summary>
+		GearboxType Type { get; }
+
+		/// <summary>
+		/// P078, P079, P077, P082, P145 (for every gear)
+		/// cf. VECTO Input Parameters.xlsx
+		/// </summary>
+		IList<ITransmissionInputData> Gears { get; }
+
+		/// <summary>
+		/// P090, P091, P092, P127
+		/// cf. VECTO Input Parameters.xlsx
+		/// </summary>
+		ITorqueConverterDeclarationInputData TorqueConverter { get; }
+	}
+
+
+	public interface ITransmissionInputData
+	{
+		int Gear { get; }
+
+		/// <summary>
+		/// P078
+		/// cf. VECTO Input Parameters.xlsx
+		/// </summary>
+		double Ratio { get; }
+
+		/// <summary>
+		/// P079
+		/// P096, P097, P098
+		/// cf. VECTO Input Parameters.xlsx
+		/// </summary>
+		TableData LossMap { get; }
+
+		/// <summary>
+		/// P079
+		/// cf. VECTO Input Parameters.xlsx
+		/// </summary>
+		double Efficiency { get; }
+
+		///// <summary>
+		///// P145
+		///// cf. VECTO Input Parameters.xlsx
+		///// </summary>
+		//DataTable FullLoadCurve { get; } // deprecated
+
+		/// <summary>
+		/// P157
+		/// </summary>
+		NewtonMeter MaxTorque { get; }
+
+		PerSecond MaxInputSpeed { get; }
+
+		/// <summary>
+		/// P082
+		/// P093, P094, P095
+		/// cf. VECTO Input Parameters.xlsx
+		/// </summary>
+		TableData ShiftPolygon { get; }
+
+		///// <summary>
+		///// P077
+		///// cf. VECTO Input Parameters.xlsx
+		///// </summary>
+		//bool HasTorqueConverter { get; }     // DEPRECATED
+	}
+
+	public interface IAxleGearInputData : IComponentInputData
+	{
+		/// <summary>
+		/// P078
+		/// cf. VECTO Input Parameters.xlsx
+		/// </summary>
+		double Ratio { get; }
+
+		/// <summary>
+		/// P079
+		/// P096, P097, P098
+		/// cf. VECTO Input Parameters.xlsx
+		/// </summary>
+		TableData LossMap { get; }
+
+		/// <summary>
+		/// P079
+		/// cf. VECTO Input Parameters.xlsx
+		/// </summary>
+		double Efficiency { get; }
+
+		AxleLineType LineType { get; }
+	}
+
+	public interface ITorqueConverterDeclarationInputData : IComponentInputData
+	{
+		/// <summary>
+		/// P091
+		/// P099, P100, P101
+		/// cf. VECTO Input Parameters.xlsx
+		/// </summary>
+		// ReSharper disable once InconsistentNaming
+		TableData TCData { get; }
+	}
+
+	public interface IEngineDeclarationInputData : IComponentInputData
+	{
+		/// <summary>
+		/// P061
+		/// cf. VECTO Input Parameters.xlsx
+		/// </summary>
+		CubicMeter Displacement { get; }
+
+		/// <summary>
+		/// P063
+		/// cf. VECTO Input Parameters.xlsx
+		/// </summary>
+		PerSecond IdleSpeed { get; }
+
+		/// <summary>
+		/// P111
+		/// cf. VECTO Input Parameters.xlsx
+		/// </summary>
+		double WHTCMotorway { get; }
+
+		/// <summary>
+		/// P110
+		/// cf. VECTO Input Parameters.xlsx
+		/// </summary>
+		double WHTCRural { get; }
+
+		/// <summary>
+		/// P109
+		/// cf. VECTO Input Parameters.xlsx
+		/// </summary>
+		double WHTCUrban { get; }
+
+		/// <summary>
+		/// P159
+		/// </summary>
+		double ColdHotBalancingFactor { get; }
+
+		double CorrectionFactorRegPer { get; }
+
+		double CorrectionFactorNCV { get; }
+
+		FuelType FuelType { get; }
+
+		/// <summary>
+		/// P067
+		/// P072, P073, P074
+		/// cf. VECTO Input Parameters.xlsx
+		/// engine speed in rpm, torque in NM, fuel consumption in g/h
+		/// </summary>
+		TableData FuelConsumptionMap { get; }
+
+		/// <summary>
+		/// P144
+		/// P068, P069, P70, P71
+		/// cf. VECTO Input Parameters.xlsx
+		/// </summary>
+		TableData FullLoadCurve { get; }
+
+		Watt RatedPowerDeclared { get; }
+
+		PerSecond RatedSpeedDeclared { get; }
+
+		NewtonMeter MaxTorqueDeclared { get; }
+	}
+
+	public interface IAuxiliariesDeclarationInputData
+	{
+		bool SavedInDeclarationMode { get; }
+
+		IList<IAuxiliaryDeclarationInputData> Auxiliaries { get; }
+	}
+
+	public interface ICycleData
+	{
+		string Name { get; }
+
+		/// <summary>
+		/// P028, P029, P030, P031, P032, P119, P120, P121, P122, P123, P124, P125, P126
+		/// cf. VECTO Input Parameters.xlsx
+		/// </summary>
+		TableData CycleData { get; }
+	}
+
+	public interface IDriverDeclarationInputData
+	{
+		bool SavedInDeclarationMode { get; }
+
+		IOverSpeedEcoRollDeclarationInputData OverSpeedEcoRoll { get; }
+	}
+
+	public interface IOverSpeedEcoRollDeclarationInputData
+	{
+		/// <summary>
+		/// P015
+		/// cf. VECTO Input Parameters.xlsx
+		/// </summary>
+		DriverMode Mode { get; }
+	}
+
+	public interface IAuxiliaryDeclarationInputData
+	{
+		/// <summary>
+		/// P005  Aux-Type
+		/// cf. VECTO Input Parameters.xlsx
+		/// </summary>
+		AuxiliaryType Type { get; }
+
+		/// <summary>
+		/// P118  Aux-Technology
+		/// cf. VECTO Input Parameters.xlsx
+		/// </summary>
+		IList<string> Technology { get; }
+	}
+
+	public interface ITorqueLimitInputData
+	{
+		int Gear { get; }
+
+		NewtonMeter MaxTorque { get; }
+	}
 }
\ No newline at end of file
diff --git a/VectoCommon/VectoCommon/InputData/EngineeringInputData.cs b/VectoCommon/VectoCommon/InputData/EngineeringInputData.cs
index 843b776eb5f9803e06f9f05281624e63bb111287..4f9230a9f46510fd976786efaa6e352d69bb7f00 100644
--- a/VectoCommon/VectoCommon/InputData/EngineeringInputData.cs
+++ b/VectoCommon/VectoCommon/InputData/EngineeringInputData.cs
@@ -29,340 +29,341 @@
 *   Martin Rexeis, rexeis@ivt.tugraz.at, IVT, Graz University of Technology
 */
 
-using System.Collections.Generic;
-using TUGraz.VectoCommon.Models;
-using TUGraz.VectoCommon.Utils;
-
-namespace TUGraz.VectoCommon.InputData
-{
-	public interface IEngineeringJobInputData : IDeclarationJobInputData
-	{
-		new IVehicleEngineeringInputData Vehicle { get; }
-
-		/// <summary>
-		/// P008  Cycles
-		/// cf. VECTO Input Parameters.xlsx
-		/// </summary>
-		IList<ICycleData> Cycles { get; }
-
-		/// <summary>
-		/// P001
-		/// cf. VECTO Input Parameters.xlsx
-		/// </summary>
-		bool EngineOnlyMode { get; }
-	}
-
-	public interface IVehicleEngineeringInputData : IVehicleDeclarationInputData
-	{
-		/// <summary>
-		/// P039  Curb Weight Extra Trailer/Body
-		/// cf. VECTO Input Parameters.xlsx
-		/// </summary>
-		Kilogram CurbMassExtra { get; }
-
-		/// <summary>
-		/// P040  Loading
-		/// cf. VECTO Input Parameters.xlsx
-		/// </summary>
-		Kilogram Loading { get; }
-
-		/// <summary>
-		/// parameters for every axle
-		/// P044, P045, P046, P047, P048, P108
-		/// cf. VECTO Input Parameters.xlsx
-		/// </summary>
-		new IList<IAxleEngineeringInputData> Axles { get; }
-
-		/// <summary>
-		/// P049
-		/// cf. VECTO Input Parameters.xlsx
-		/// </summary>
-		Meter DynamicTyreRadius { get; }
-	}
-
-	public interface IAirdragEngineeringInputData : IAirdragDeclarationInputData
-	{
-		/// <summary>
-		/// P050 - Cross Wind Correction Mode
-		/// cf. VECTO Input Parameters.xlsx
-		/// </summary>
-		CrossWindCorrectionMode CrossWindCorrectionMode { get; }
-
-		/// <summary>
-		/// P051
-		/// P055, P056
-		/// cf. VECTO Input Parameters.xlsx
-		/// </summary>
-		TableData CrosswindCorrectionMap { get; }
-	}
-
-	public interface IPTOTransmissionInputData
-	{
-		/// <summary>
-		/// The transmission type for the constant pto transmission losses.
-		/// </summary>
-		string PTOTransmissionType { get; }
-
-		/// <summary>
-		/// The PTO Loss map for idling losses of the "consumer" part.
-		/// </summary>
-		TableData PTOLossMap { get; }
-
-		TableData PTOCycle { get; }
-	}
-
-	public interface IAxleEngineeringInputData : IAxleDeclarationInputData
-	{
-		/// <summary>
-		/// P044 (0 - 1)
-		/// cf. VECTO Input Parameters.xlsx
-		/// </summary>
-		double AxleWeightShare { get; }
-
-		/// <summary>
-		/// P048
-		/// cf. VECTO Input Parameters.xlsx
-		/// </summary>
-		KilogramSquareMeter Inertia { get; }
-	}
-
-	public interface IGearboxEngineeringInputData : IGearboxDeclarationInputData
-	{
-		/// <summary>
-		/// P080
-		/// cf. VECTO Input Parameters.xlsx
-		/// </summary>
-		KilogramSquareMeter Inertia { get; }
-
-		/// <summary>
-		/// P081
-		/// cf. VECTO Input Parameters.xlsx
-		/// </summary>
-		Second TractionInterruption { get; }
-
-		/// <summary>
-		/// P086
-		/// cf. VECTO Input Parameters.xlsx
-		/// </summary>
-		Second MinTimeBetweenGearshift { get; }
-
-		///// <summary>
-		///// P083
-		///// cf. VECTO Input Parameters.xlsx
-		///// </summary>
-		//bool EarlyShiftUp { get; }
-
-		/// <summary>
-		/// P085
-		/// cf. VECTO Input Parameters.xlsx
-		/// </summary>
-		double TorqueReserve { get; }
-
-		/// <summary>
-		/// P087
-		/// cf. VECTO Input Parameters.xlsx
-		/// </summary>
-		MeterPerSecond StartSpeed { get; }
-
-		/// <summary>
-		/// P088
-		/// cf. VECTO Input Parameters.xlsx
-		/// </summary>
-		MeterPerSquareSecond StartAcceleration { get; }
-
-		/// <summary>
-		/// P089
-		/// [%] (0-1)
-		/// cf. VECTO Input Parameters.xlsx
-		/// </summary>
-		double StartTorqueReserve { get; }
-
-		///// <summary>
-		///// P084
-		///// cf. VECTO Input Parameters.xlsx
-		///// </summary>
-		//bool SkipGears { get; }
-
-		Second DownshiftAfterUpshiftDelay { get; }
-
-		Second UpshiftAfterDownshiftDelay { get; }
-
-		MeterPerSquareSecond UpshiftMinAcceleration { get; }
-
-		Second PowershiftShiftTime { get; }
-
-		new ITorqueConverterEngineeringInputData TorqueConverter { get; }
-	}
-
-	public interface ITorqueConverterEngineeringInputData : ITorqueConverterDeclarationInputData
-	{
-		///// <summary>
-		///// P090
-		///// cf. VECTO Input Parameters.xlsx
-		///// </summary>
-		//bool Enabled { get; }   // deprecated
-
-		/// <summary>
-		/// P092
-		/// cf. VECTO Input Parameters.xlsx
-		/// </summary>
-		// ReSharper disable once InconsistentNaming
-		PerSecond ReferenceRPM { get; }
-
-		/// <summary>
-		/// P127
-		/// cf. VECTO Input Parameters.xlsx
-		/// </summary>
-		KilogramSquareMeter Inertia { get; }
-
-		TableData ShiftPolygon { get; }
-
-		PerSecond MaxInputSpeed { get; }
-
-		/// <summary>
-		/// Min Acceleration after C->L upshifts.
-		/// </summary>
-		MeterPerSquareSecond CLUpshiftMinAcceleration { get; }
-
-		/// <summary>
-		/// Min Acceleration after C->C upshifts.
-		/// </summary>
-		MeterPerSquareSecond CCUpshiftMinAcceleration { get; }
-	}
-
-	public interface IEngineEngineeringInputData : IEngineDeclarationInputData
-	{
-		/// <summary>
-		/// P062
-		/// cf. VECTO Input Parameters.xlsx
-		/// </summary>
-		KilogramSquareMeter Inertia { get; }
-
-		/// <summary>
-		/// P170
-		/// </summary>
-		double WHTCEngineering { get; }
-	}
-
-	public interface IAuxiliariesEngineeringInputData
-	{
-		IList<IAuxiliaryEngineeringInputData> Auxiliaries { get; }
-
-		// Advanced Auxiliaries
-		AuxiliaryModel AuxiliaryAssembly { get; }
-
-		string AuxiliaryVersion { get; }
-
-		string AdvancedAuxiliaryFilePath { get; }
-	}
-
-	public interface IDriverEngineeringInputData : IDriverDeclarationInputData
-	{
-		//new IStartStopEngineeringInputData StartStop { get; }
-
-		new IOverSpeedEcoRollEngineeringInputData OverSpeedEcoRoll { get; }
-
-		/// <summary>
-		/// P009; P033, P034, P035
-		/// cf. VECTO Input Parameters.xlsx
-		/// </summary>
-		TableData AccelerationCurve { get; }
-
-		ILookaheadCoastingInputData Lookahead { get; }
-	}
-
-	public interface IOverSpeedEcoRollEngineeringInputData : IOverSpeedEcoRollDeclarationInputData
-	{
-		/// <summary>
-		/// P016
-		/// cf. VECTO Input Parameters.xlsx
-		/// </summary>
-		MeterPerSecond MinSpeed { get; }
-
-		/// <summary>
-		/// P017
-		/// cf. VECTO Input Parameters.xlsx
-		/// </summary>
-		MeterPerSecond OverSpeed { get; }
-
-		/// <summary>
-		/// P018
-		/// cf. VECTO Input Parameters.xlsx
-		/// </summary>
-		MeterPerSecond UnderSpeed { get; }
-	}
-
-	public interface ILookaheadCoastingInputData
-	{
-		/// <summary>
-		/// P019
-		/// cf. VECTO Input Parameters.xlsx
-		/// </summary>
-		bool Enabled { get; }
-
-		/// <summary>
-		/// P020
-		/// cf. VECTO Input Parameters.xlsx
-		/// </summary>
-		//MeterPerSquareSecond Deceleration { get; }
-		/// <summary>
-		/// P021
-		/// cf. VECTO Input Parameters.xlsx
-		/// </summary>
-		MeterPerSecond MinSpeed { get; }
-
-		double CoastingDecisionFactorOffset { get; }
-
-		double CoastingDecisionFactorScaling { get; }
-
-		double LookaheadDistanceFactor { get; }
-
-		TableData CoastingDecisionFactorTargetSpeedLookup { get; }
-
-		TableData CoastingDecisionFactorVelocityDropLookup { get; }
-	}
-
-	public interface IAuxiliaryEngineeringInputData
-	{
-		/// <summary>
-		/// P006  Aux-ID
-		/// cf. VECTO Input Parameters.xlsx
-		/// </summary>
-		string ID { get; }
-
-		/// <summary>
-		/// either mapping or constant
-		/// </summary>
-		AuxiliaryDemandType AuxiliaryType { get; }
-
-		/// <summary>
-		/// P022  Aux-InputFile: transmission ratio
-		/// cf. VECTO Input Parameters.xlsx
-		/// </summary>
-		double TransmissionRatio { get; }
-
-		/// <summary>
-		/// P023  Aux-InputFile: efficiency to engine
-		/// cf. VECTO Input Parameters.xlsx
-		/// </summary>
-		double EfficiencyToEngine { get; }
-
-		/// <summary>
-		/// P024  Aux-InputFile: efficiency to supply
-		/// cf. VECTO Input Parameters.xlsx
-		/// </summary>
-		double EfficiencyToSupply { get; }
-
-		/// <summary>
-		/// P025, P026, P027  Aux-InputFile: map
-		/// cf. VECTO Input Parameters.xlsx
-		/// </summary>
-		TableData DemandMap { get; }
-
-		/// <summary>
-		/// P178
-		/// additional constant auxiliary load, similar to Padd; not specified in the cycle but as auxiliary
-		/// </summary>
-		Watt ConstantPowerDemand { get; }
-	}
+using System.Collections.Generic;
+using TUGraz.VectoCommon.Models;
+using TUGraz.VectoCommon.Utils;
+
+namespace TUGraz.VectoCommon.InputData
+{
+	public interface IEngineeringJobInputData : IDeclarationJobInputData
+	{
+		new IVehicleEngineeringInputData Vehicle { get; }
+
+		/// <summary>
+		/// P008  Cycles
+		/// cf. VECTO Input Parameters.xlsx
+		/// </summary>
+		IList<ICycleData> Cycles { get; }
+
+		/// <summary>
+		/// P001
+		/// cf. VECTO Input Parameters.xlsx
+		/// </summary>
+		bool EngineOnlyMode { get; }
+	}
+
+	public interface IVehicleEngineeringInputData : IVehicleDeclarationInputData
+	{
+		
+		/// <summary>
+		/// P039  Curb Weight Extra Trailer/Body
+		/// cf. VECTO Input Parameters.xlsx
+		/// </summary>
+		Kilogram CurbMassExtra { get; }
+
+		/// <summary>
+		/// P040  Loading
+		/// cf. VECTO Input Parameters.xlsx
+		/// </summary>
+		Kilogram Loading { get; }
+
+		/// <summary>
+		/// parameters for every axle
+		/// P044, P045, P046, P047, P048, P108
+		/// cf. VECTO Input Parameters.xlsx
+		/// </summary>
+		new IList<IAxleEngineeringInputData> Axles { get; }
+
+		/// <summary>
+		/// P049
+		/// cf. VECTO Input Parameters.xlsx
+		/// </summary>
+		Meter DynamicTyreRadius { get; }
+	}
+
+	public interface IAirdragEngineeringInputData : IAirdragDeclarationInputData
+	{
+		/// <summary>
+		/// P050 - Cross Wind Correction Mode
+		/// cf. VECTO Input Parameters.xlsx
+		/// </summary>
+		CrossWindCorrectionMode CrossWindCorrectionMode { get; }
+
+		/// <summary>
+		/// P051
+		/// P055, P056
+		/// cf. VECTO Input Parameters.xlsx
+		/// </summary>
+		TableData CrosswindCorrectionMap { get; }
+	}
+
+	public interface IPTOTransmissionInputData
+	{
+		/// <summary>
+		/// The transmission type for the constant pto transmission losses.
+		/// </summary>
+		string PTOTransmissionType { get; }
+
+		/// <summary>
+		/// The PTO Loss map for idling losses of the "consumer" part.
+		/// </summary>
+		TableData PTOLossMap { get; }
+
+		TableData PTOCycle { get; }
+	}
+
+	public interface IAxleEngineeringInputData : IAxleDeclarationInputData
+	{
+		/// <summary>
+		/// P044 (0 - 1)
+		/// cf. VECTO Input Parameters.xlsx
+		/// </summary>
+		double AxleWeightShare { get; }
+
+		/// <summary>
+		/// P048
+		/// cf. VECTO Input Parameters.xlsx
+		/// </summary>
+		KilogramSquareMeter Inertia { get; }
+	}
+
+	public interface IGearboxEngineeringInputData : IGearboxDeclarationInputData
+	{
+		/// <summary>
+		/// P080
+		/// cf. VECTO Input Parameters.xlsx
+		/// </summary>
+		KilogramSquareMeter Inertia { get; }
+
+		/// <summary>
+		/// P081
+		/// cf. VECTO Input Parameters.xlsx
+		/// </summary>
+		Second TractionInterruption { get; }
+
+		/// <summary>
+		/// P086
+		/// cf. VECTO Input Parameters.xlsx
+		/// </summary>
+		Second MinTimeBetweenGearshift { get; }
+
+		///// <summary>
+		///// P083
+		///// cf. VECTO Input Parameters.xlsx
+		///// </summary>
+		//bool EarlyShiftUp { get; }
+
+		/// <summary>
+		/// P085
+		/// cf. VECTO Input Parameters.xlsx
+		/// </summary>
+		double TorqueReserve { get; }
+
+		/// <summary>
+		/// P087
+		/// cf. VECTO Input Parameters.xlsx
+		/// </summary>
+		MeterPerSecond StartSpeed { get; }
+
+		/// <summary>
+		/// P088
+		/// cf. VECTO Input Parameters.xlsx
+		/// </summary>
+		MeterPerSquareSecond StartAcceleration { get; }
+
+		/// <summary>
+		/// P089
+		/// [%] (0-1)
+		/// cf. VECTO Input Parameters.xlsx
+		/// </summary>
+		double StartTorqueReserve { get; }
+
+		///// <summary>
+		///// P084
+		///// cf. VECTO Input Parameters.xlsx
+		///// </summary>
+		//bool SkipGears { get; }
+
+		Second DownshiftAfterUpshiftDelay { get; }
+
+		Second UpshiftAfterDownshiftDelay { get; }
+
+		MeterPerSquareSecond UpshiftMinAcceleration { get; }
+
+		Second PowershiftShiftTime { get; }
+
+		new ITorqueConverterEngineeringInputData TorqueConverter { get; }
+	}
+
+	public interface ITorqueConverterEngineeringInputData : ITorqueConverterDeclarationInputData
+	{
+		///// <summary>
+		///// P090
+		///// cf. VECTO Input Parameters.xlsx
+		///// </summary>
+		//bool Enabled { get; }   // deprecated
+
+		/// <summary>
+		/// P092
+		/// cf. VECTO Input Parameters.xlsx
+		/// </summary>
+		// ReSharper disable once InconsistentNaming
+		PerSecond ReferenceRPM { get; }
+
+		/// <summary>
+		/// P127
+		/// cf. VECTO Input Parameters.xlsx
+		/// </summary>
+		KilogramSquareMeter Inertia { get; }
+
+		TableData ShiftPolygon { get; }
+
+		PerSecond MaxInputSpeed { get; }
+
+		/// <summary>
+		/// Min Acceleration after C->L upshifts.
+		/// </summary>
+		MeterPerSquareSecond CLUpshiftMinAcceleration { get; }
+
+		/// <summary>
+		/// Min Acceleration after C->C upshifts.
+		/// </summary>
+		MeterPerSquareSecond CCUpshiftMinAcceleration { get; }
+	}
+
+	public interface IEngineEngineeringInputData : IEngineDeclarationInputData
+	{
+		/// <summary>
+		/// P062
+		/// cf. VECTO Input Parameters.xlsx
+		/// </summary>
+		KilogramSquareMeter Inertia { get; }
+
+		/// <summary>
+		/// P170
+		/// </summary>
+		double WHTCEngineering { get; }
+	}
+
+	public interface IAuxiliariesEngineeringInputData
+	{
+		IList<IAuxiliaryEngineeringInputData> Auxiliaries { get; }
+
+		// Advanced Auxiliaries
+		AuxiliaryModel AuxiliaryAssembly { get; }
+
+		string AuxiliaryVersion { get; }
+
+		string AdvancedAuxiliaryFilePath { get; }
+	}
+
+	public interface IDriverEngineeringInputData : IDriverDeclarationInputData
+	{
+		//new IStartStopEngineeringInputData StartStop { get; }
+
+		new IOverSpeedEcoRollEngineeringInputData OverSpeedEcoRoll { get; }
+
+		/// <summary>
+		/// P009; P033, P034, P035
+		/// cf. VECTO Input Parameters.xlsx
+		/// </summary>
+		TableData AccelerationCurve { get; }
+
+		ILookaheadCoastingInputData Lookahead { get; }
+	}
+
+	public interface IOverSpeedEcoRollEngineeringInputData : IOverSpeedEcoRollDeclarationInputData
+	{
+		/// <summary>
+		/// P016
+		/// cf. VECTO Input Parameters.xlsx
+		/// </summary>
+		MeterPerSecond MinSpeed { get; }
+
+		/// <summary>
+		/// P017
+		/// cf. VECTO Input Parameters.xlsx
+		/// </summary>
+		MeterPerSecond OverSpeed { get; }
+
+		/// <summary>
+		/// P018
+		/// cf. VECTO Input Parameters.xlsx
+		/// </summary>
+		MeterPerSecond UnderSpeed { get; }
+	}
+
+	public interface ILookaheadCoastingInputData
+	{
+		/// <summary>
+		/// P019
+		/// cf. VECTO Input Parameters.xlsx
+		/// </summary>
+		bool Enabled { get; }
+
+		/// <summary>
+		/// P020
+		/// cf. VECTO Input Parameters.xlsx
+		/// </summary>
+		//MeterPerSquareSecond Deceleration { get; }
+		/// <summary>
+		/// P021
+		/// cf. VECTO Input Parameters.xlsx
+		/// </summary>
+		MeterPerSecond MinSpeed { get; }
+
+		double CoastingDecisionFactorOffset { get; }
+
+		double CoastingDecisionFactorScaling { get; }
+
+		double LookaheadDistanceFactor { get; }
+
+		TableData CoastingDecisionFactorTargetSpeedLookup { get; }
+
+		TableData CoastingDecisionFactorVelocityDropLookup { get; }
+	}
+
+	public interface IAuxiliaryEngineeringInputData
+	{
+		/// <summary>
+		/// P006  Aux-ID
+		/// cf. VECTO Input Parameters.xlsx
+		/// </summary>
+		string ID { get; }
+
+		/// <summary>
+		/// either mapping or constant
+		/// </summary>
+		AuxiliaryDemandType AuxiliaryType { get; }
+
+		/// <summary>
+		/// P022  Aux-InputFile: transmission ratio
+		/// cf. VECTO Input Parameters.xlsx
+		/// </summary>
+		double TransmissionRatio { get; }
+
+		/// <summary>
+		/// P023  Aux-InputFile: efficiency to engine
+		/// cf. VECTO Input Parameters.xlsx
+		/// </summary>
+		double EfficiencyToEngine { get; }
+
+		/// <summary>
+		/// P024  Aux-InputFile: efficiency to supply
+		/// cf. VECTO Input Parameters.xlsx
+		/// </summary>
+		double EfficiencyToSupply { get; }
+
+		/// <summary>
+		/// P025, P026, P027  Aux-InputFile: map
+		/// cf. VECTO Input Parameters.xlsx
+		/// </summary>
+		TableData DemandMap { get; }
+
+		/// <summary>
+		/// P178
+		/// additional constant auxiliary load, similar to Padd; not specified in the cycle but as auxiliary
+		/// </summary>
+		Watt ConstantPowerDemand { get; }
+	}
 }
\ No newline at end of file
diff --git a/VectoCommon/VectoCommon/Models/AngledriveType.cs b/VectoCommon/VectoCommon/Models/AngledriveType.cs
index 0dd942600798bcf91b1e4068d28cb1019afe9f0e..8f9a25d8ad946ceb9b53c5ed6de59aa69ced1c0f 100644
--- a/VectoCommon/VectoCommon/Models/AngledriveType.cs
+++ b/VectoCommon/VectoCommon/Models/AngledriveType.cs
@@ -29,45 +29,45 @@
 *   Martin Rexeis, rexeis@ivt.tugraz.at, IVT, Graz University of Technology
 */
 
-using System;
-
-namespace TUGraz.VectoCommon.Models
-{
-	public enum AngledriveType
-	{
-		None,
-		SeparateAngledrive,
-		LossesIncludedInGearbox,
-	}
-
-	public static class AngledriveTypeHelper
-	{
-		public static string GetLabel(this AngledriveType type)
-		{
-			switch (type) {
-				case AngledriveType.None:
-					return "None";
-				case AngledriveType.SeparateAngledrive:
-					return "Separate Angledrive";
-				case AngledriveType.LossesIncludedInGearbox:
-					return "Included in Transmission Loss Maps";
-				default:
-					throw new ArgumentOutOfRangeException("AngledriveType", type, null);
-			}
-		}
-
-		public static string ToXMLFormat(this AngledriveType type)
-		{
-			switch (type) {
-				case AngledriveType.None:
-					return "None";
-				case AngledriveType.SeparateAngledrive:
-					return "Separate Angledrive";
-				case AngledriveType.LossesIncludedInGearbox:
-					return "Losses included in Gearbox";
-				default:
-					throw new ArgumentOutOfRangeException("Angledrive Type", type, null);
-			}
-		}
-	}
+using System;
+
+namespace TUGraz.VectoCommon.Models
+{
+	public enum AngledriveType
+	{
+		None,
+		SeparateAngledrive,
+		LossesIncludedInGearbox,
+	}
+
+	public static class AngledriveTypeHelper
+	{
+		public static string GetLabel(this AngledriveType type)
+		{
+			switch (type) {
+				case AngledriveType.None:
+					return "None";
+				case AngledriveType.SeparateAngledrive:
+					return "Separate Angledrive";
+				case AngledriveType.LossesIncludedInGearbox:
+					return "Included in Transmission Loss Maps";
+				default:
+					throw new ArgumentOutOfRangeException("AngledriveType", type, null);
+			}
+		}
+
+		public static string ToXMLFormat(this AngledriveType type)
+		{
+			switch (type) {
+				case AngledriveType.None:
+					return "None";
+				case AngledriveType.SeparateAngledrive:
+					return "Separate Angledrive";
+				case AngledriveType.LossesIncludedInGearbox:
+					return "Losses included in Gearbox";
+				default:
+					throw new ArgumentOutOfRangeException("Angledrive Type", type, null);
+			}
+		}
+	}
 }
\ No newline at end of file
diff --git a/VectoCommon/VectoCommon/Models/AxleConfiguration.cs b/VectoCommon/VectoCommon/Models/AxleConfiguration.cs
index 19d6524dce6fbccbf49c362d0c4b673609e97fe1..c03fdd32d0404d68137a5da18f8d45679506ebd4 100644
--- a/VectoCommon/VectoCommon/Models/AxleConfiguration.cs
+++ b/VectoCommon/VectoCommon/Models/AxleConfiguration.cs
@@ -29,81 +29,101 @@
 *   Martin Rexeis, rexeis@ivt.tugraz.at, IVT, Graz University of Technology
 */
 
-using System;
-using System.Diagnostics.CodeAnalysis;
-using TUGraz.VectoCommon.Utils;
-
-namespace TUGraz.VectoCommon.Models
-{
-	[SuppressMessage("ReSharper", "InconsistentNaming")]
-	public enum AxleConfiguration
-	{
-		AxleConfig_4x2,
-		AxleConfig_4x4,
-		AxleConfig_6x2,
-		AxleConfig_6x4,
-		AxleConfig_6x6,
-		AxleConfig_8x2,
-		AxleConfig_8x4,
-		AxleConfig_8x6,
-		AxleConfig_8x8,
-	}
-
-	public enum AxleType
-	{
-		VehicleDriven,
-		VehicleNonDriven,
-		Trailer
-	}
-
-	public static class AxleTypeHelper
-	{
-		public static string GetLabel(this AxleType self)
-		{
-			switch (self) {
-				case AxleType.VehicleDriven:
-					return "Vehicle driven";
-				case AxleType.VehicleNonDriven:
-					return "Vehicle non-driven";
-				case AxleType.Trailer:
-					return "Trailer";
-				default:
-					throw new ArgumentOutOfRangeException("self", self, null);
-			}
-		}
-	}
-
-	public static class AxleConfigurationHelper
-	{
-		private const string Prefix = "AxleConfig_";
-
-		public static string GetName(this AxleConfiguration self)
-		{
-			return self.ToString().Replace(Prefix, "");
-		}
-
-		public static AxleConfiguration Parse(string typeString)
-		{
-			return (Prefix + typeString).ParseEnum<AxleConfiguration>();
-		}
-
-		public static int NumAxles(this AxleConfiguration self)
-		{
-			switch (self) {
-				case AxleConfiguration.AxleConfig_4x2:
-				case AxleConfiguration.AxleConfig_4x4:
-					return 2;
-				case AxleConfiguration.AxleConfig_6x2:
-				case AxleConfiguration.AxleConfig_6x4:
-				case AxleConfiguration.AxleConfig_6x6:
-					return 3;
-				case AxleConfiguration.AxleConfig_8x2:
-				case AxleConfiguration.AxleConfig_8x4:
-				case AxleConfiguration.AxleConfig_8x6:
-				case AxleConfiguration.AxleConfig_8x8:
-					return 4;
-			}
-			return 0;
-		}
-	}
+using System;
+using System.Diagnostics.CodeAnalysis;
+using TUGraz.VectoCommon.Utils;
+
+namespace TUGraz.VectoCommon.Models
+{
+	[SuppressMessage("ReSharper", "InconsistentNaming")]
+	public enum AxleConfiguration
+	{
+		AxleConfig_4x2,
+		AxleConfig_4x4,
+		AxleConfig_6x2,
+		AxleConfig_6x4,
+		AxleConfig_6x6,
+		AxleConfig_8x2,
+		AxleConfig_8x4,
+		AxleConfig_8x6,
+		AxleConfig_8x8,
+	}
+
+	public enum AxleType
+	{
+		VehicleDriven,
+		VehicleNonDriven,
+		Trailer
+	}
+
+	public static class AxleTypeHelper
+	{
+		public static string GetLabel(this AxleType self)
+		{
+			switch (self) {
+				case AxleType.VehicleDriven:
+					return "Vehicle driven";
+				case AxleType.VehicleNonDriven:
+					return "Vehicle non-driven";
+				case AxleType.Trailer:
+					return "Trailer";
+				default:
+					throw new ArgumentOutOfRangeException("self", self, null);
+			}
+		}
+	}
+
+	public static class AxleConfigurationHelper
+	{
+		private const string Prefix = "AxleConfig_";
+
+		public static string GetName(this AxleConfiguration self)
+		{
+			return self.ToString().Replace(Prefix, "");
+		}
+
+		public static AxleConfiguration Parse(string typeString)
+		{
+			return (Prefix + typeString).ParseEnum<AxleConfiguration>();
+		}
+
+		public static int NumAxles(this AxleConfiguration self)
+		{
+			switch (self) {
+				case AxleConfiguration.AxleConfig_4x2:
+				case AxleConfiguration.AxleConfig_4x4:
+					return 2;
+				case AxleConfiguration.AxleConfig_6x2:
+				case AxleConfiguration.AxleConfig_6x4:
+				case AxleConfiguration.AxleConfig_6x6:
+					return 3;
+				case AxleConfiguration.AxleConfig_8x2:
+				case AxleConfiguration.AxleConfig_8x4:
+				case AxleConfiguration.AxleConfig_8x6:
+				case AxleConfiguration.AxleConfig_8x8:
+					return 4;
+			}
+			return 0;
+		}
+
+		public static int NumDrivenAxles(this AxleConfiguration self)
+		{
+			switch (self) {
+				case AxleConfiguration.AxleConfig_4x2:
+				case AxleConfiguration.AxleConfig_6x2:
+				case AxleConfiguration.AxleConfig_8x2:
+					return 1;
+				case AxleConfiguration.AxleConfig_4x4:
+				case AxleConfiguration.AxleConfig_6x4:
+				case AxleConfiguration.AxleConfig_8x4:
+					return 2;
+				case AxleConfiguration.AxleConfig_6x6:
+				case AxleConfiguration.AxleConfig_8x6:
+					return 3;
+				case AxleConfiguration.AxleConfig_8x8:
+					return 4;
+			}
+			return 0;
+		}
+	}
 }
\ No newline at end of file
diff --git a/VectoCommon/VectoCommon/Models/LegislativeClass.cs b/VectoCommon/VectoCommon/Models/LegislativeClass.cs
new file mode 100644
index 0000000000000000000000000000000000000000..d6addcc01eab7107b0b79663fe600f0203737943
--- /dev/null
+++ b/VectoCommon/VectoCommon/Models/LegislativeClass.cs
@@ -0,0 +1,22 @@
+namespace TUGraz.VectoCommon.Models
+{
+	public enum LegislativeClass
+	{
+		Unknown,
+		N2,
+		N3
+	}
+
+	public static class LegislativeClassHelper
+	{
+		public static string GetLabel(this LegislativeClass self)
+		{
+			return self.ToString();
+		}
+
+		public static string ToXMLFormat(this LegislativeClass self)
+		{
+			return self.ToString();
+		}
+	}
+}
\ No newline at end of file
diff --git a/VectoCommon/VectoCommon/Models/OperatingPoint.cs b/VectoCommon/VectoCommon/Models/OperatingPoint.cs
index c5b154f942a2da0103f7c934dd234f9174b2c0e7..627ef89223fc810aff533b2b6c9981dc501ac2a5 100644
--- a/VectoCommon/VectoCommon/Models/OperatingPoint.cs
+++ b/VectoCommon/VectoCommon/Models/OperatingPoint.cs
@@ -35,7 +35,7 @@ using TUGraz.VectoCommon.Utils;
 namespace TUGraz.VectoCommon.Models
 {
 	[DebuggerDisplay("a: {Acceleration}, dt: {SimulationInterval}, ds: {SimulationDistance}")]
-	public struct OperatingPoint
+	public class OperatingPoint
 	{
 		public MeterPerSquareSecond Acceleration;
 		public Meter SimulationDistance;
diff --git a/VectoCommon/VectoCommon/Utils/VectoMath.cs b/VectoCommon/VectoCommon/Utils/VectoMath.cs
index 4a63f351383d5cdeac2a5e9d7a7351f13084cc51..e3c10c4302dca7c8666acebd50fc14500329ec2d 100644
--- a/VectoCommon/VectoCommon/Utils/VectoMath.cs
+++ b/VectoCommon/VectoCommon/Utils/VectoMath.cs
@@ -29,704 +29,706 @@
 *   Martin Rexeis, rexeis@ivt.tugraz.at, IVT, Graz University of Technology
 */
 
-using System;
-using System.Collections.Generic;
-using System.Diagnostics;
-using System.Linq;
-using System.Runtime.CompilerServices;
-using TUGraz.VectoCommon.Exceptions;
-using TUGraz.VectoCommon.Models;
-
-namespace TUGraz.VectoCommon.Utils
-{
-	/// <summary>
-	/// Provides helper methods for mathematical functions.
-	/// </summary>
-	public static class VectoMath
-	{
-		/// <summary>
-		/// Linearly interpolates a value between two points.
-		/// </summary>
-		/// <typeparam name="T"></typeparam>
-		/// <typeparam name="TResult">The type of the result.</typeparam>
-		/// <param name="x1">First Value on the X-Axis.</param>
-		/// <param name="x2">Second Value on the X-Axis.</param>
-		/// <param name="y1">First Value on the Y-Axis.</param>
-		/// <param name="y2">Second Value on the Y-Axis.</param>
-		/// <param name="xint">Value on the X-Axis, for which the Y-Value should be interpolated.</param>
-		/// <returns></returns>
-		[MethodImpl(MethodImplOptions.AggressiveInlining)]
-		public static TResult Interpolate<T, TResult>(T x1, T x2, TResult y1, TResult y2, T xint) where T : SI
-			where TResult : SIBase<TResult>
-		{
-			return Interpolate(x1.Value(), x2.Value(), y1.Value(), y2.Value(), xint.Value()).SI<TResult>();
-		}
-
-		[MethodImpl(MethodImplOptions.AggressiveInlining)]
-		public static TResult Interpolate<TInput, T, TResult>(this Tuple<TInput, TInput> self, Func<TInput, T> x,
-			Func<TInput, TResult> y, T xInterpolate)
-			where T : SIBase<T>
-			where TResult : SIBase<TResult>
-		{
-			return Interpolate(x(self.Item1).Value(), x(self.Item2).Value(), y(self.Item1).Value(), y(self.Item2).Value(),
-				xInterpolate.Value()).SI<TResult>();
-		}
-
-		[MethodImpl(MethodImplOptions.AggressiveInlining)]
-		public static TResult Interpolate<TInput, TResult>(this Tuple<TInput, TInput> self, Func<TInput, double> x,
-			Func<TInput, TResult> y, double xInterpolate)
-			where TResult : SIBase<TResult>
-		{
-			return
-				Interpolate(x(self.Item1), x(self.Item2), y(self.Item1).Value(), y(self.Item2).Value(), xInterpolate).SI<TResult>();
-		}
-
-		[MethodImpl(MethodImplOptions.AggressiveInlining)]
-		public static TResult Interpolate<TInput, TResult>(this IEnumerable<TInput> self, Func<TInput, double> x,
-			Func<TInput, TResult> y, double xInterpolate)
-			where TResult : SIBase<TResult>
-		{
-			return self.GetSection(elem => x(elem) < xInterpolate).Interpolate(x, y, xInterpolate);
-		}
-
-		[MethodImpl(MethodImplOptions.AggressiveInlining)]
-		public static double Interpolate<TInput>(this IEnumerable<TInput> self, Func<TInput, double> x,
-			Func<TInput, double> y, double xInterpolate)
-		{
-			return self.GetSection(elem => x(elem) < xInterpolate).Interpolate(x, y, xInterpolate);
-		}
-
-		[MethodImpl(MethodImplOptions.AggressiveInlining)]
-		public static double Interpolate<TInput>(this Tuple<TInput, TInput> self, Func<TInput, double> x,
-			Func<TInput, double> y, double xInterpolate)
-		{
-			return Interpolate(x(self.Item1), x(self.Item2), y(self.Item1), y(self.Item2), xInterpolate);
-		}
-
-		[MethodImpl(MethodImplOptions.AggressiveInlining)]
-		public static double Interpolate<T>(T x1, T x2, double y1, double y2, T xint) where T : SI
-		{
-			return Interpolate(x1.Value(), x2.Value(), y1, y2, xint.Value());
-		}
-
-		[MethodImpl(MethodImplOptions.AggressiveInlining)]
-		public static TResult Interpolate<TResult>(double x1, double x2, TResult y1, TResult y2, double xint)
-			where TResult : SIBase<TResult>
-		{
-			return Interpolate(x1, x2, y1.Value(), y2.Value(), xint).SI<TResult>();
-		}
-
-		[MethodImpl(MethodImplOptions.AggressiveInlining)]
-		public static double Interpolate(Point p1, Point p2, double x)
-		{
-			return Interpolate(p1.X, p2.X, p1.Y, p2.Y, x);
-		}
-
-		/// <summary>
-		/// Linearly interpolates a value between two points.
-		/// </summary>
-		[MethodImpl(MethodImplOptions.AggressiveInlining)]
-		public static double Interpolate(double x1, double x2, double y1, double y2, double xint)
-		{
-			return (xint - x1) * (y2 - y1) / (x2 - x1) + y1;
-		}
-
-		/// <summary>
-		/// Returns the absolute value.
-		/// </summary>
-		[DebuggerStepThrough]
-		[MethodImpl(MethodImplOptions.AggressiveInlining)]
-		public static SI Abs(SI si)
-		{
-			return si.Abs();
-		}
-
-		/// <summary>
-		/// Returns the minimum of two values.
-		/// </summary>
-		[DebuggerStepThrough]
-		[MethodImpl(MethodImplOptions.AggressiveInlining)]
-		public static T Min<T>(T c1, T c2) where T : IComparable
-		{
-			if (c1 == null) {
-				return c2;
-			}
-
-			if (c2 == null) {
-				return c1;
-			}
-
-			return c1.CompareTo(c2) <= 0 ? c1 : c2;
-		}
-
-		/// <summary>
-		/// Returns the maximum of two values.
-		/// </summary>
-		[DebuggerStepThrough]
-		[MethodImpl(MethodImplOptions.AggressiveInlining)]
-		public static T Max<T>(T c1, T c2) where T : IComparable
-		{
-			return c1.CompareTo(c2) > 0 ? c1 : c2;
-		}
-
-		/// <summary>
-		/// Returns the maximum of two values.
-		/// </summary>
-		[DebuggerStepThrough]
-		[MethodImpl(MethodImplOptions.AggressiveInlining)]
-		public static T Max<T>(double c1, T c2) where T : SIBase<T>
-		{
-			return c1 > c2.Value() ? c1.SI<T>() : c2;
-		}
-
-		[DebuggerStepThrough]
-		[MethodImpl(MethodImplOptions.AggressiveInlining)]
-		public static T Max<T>(T c1, T c2, T c3) where T : SIBase<T>
-		{
-			return Max(Max(c1, c2), c3);
-		}
-
-		[DebuggerStepThrough]
-		[MethodImpl(MethodImplOptions.AggressiveInlining)]
-		public static T LimitTo<T>(this T value, T lowerBound, T upperBound) where T : IComparable
-		{
-			if (lowerBound.CompareTo(upperBound) > 0) {
-				throw new VectoException(
-					"VectoMath.LimitTo: lowerBound must not be greater than upperBound. lowerBound: {0}, upperBound: {1}", lowerBound,
-					upperBound);
-			}
-
-			if (value.CompareTo(upperBound) > 0) {
-				return upperBound;
-			}
-
-			if (value.CompareTo(lowerBound) < 0) {
-				return lowerBound;
-			}
-
-			return value;
-		}
-
-		/// <summary>
-		///	converts the given inclination in percent (0-1+) into Radians
-		/// </summary>
-		[DebuggerStepThrough]
-		[MethodImpl(MethodImplOptions.AggressiveInlining)]
-		public static Radian InclinationToAngle(double inclinationPercent)
-		{
-			return Math.Atan(inclinationPercent).SI<Radian>();
-		}
-
-		public static double[] QuadraticEquationSolver(double a, double b, double c)
-		{
-			var d = b * b - 4 * a * c;
-
-			// no real solution
-			if (d < 0) {
-				return new double[0];
-			}
-
-			if (d > 0) {
-				// two solutions
-				return new[] { (-b + Math.Sqrt(d)) / (2 * a), (-b - Math.Sqrt(d)) / (2 * a) };
-			}
-
-			// one real solution
-			return new[] { -b / (2 * a) };
-		}
-
-		public static Point Intersect(Edge line1, Edge line2)
-		{
-			var s10X = line1.P2.X - line1.P1.X;
-			var s10Y = line1.P2.Y - line1.P1.Y;
-			var s32X = line2.P2.X - line2.P1.X;
-			var s32Y = line2.P2.Y - line2.P1.Y;
-
-			var denom = s10X * s32Y - s32X * s10Y;
-			if (denom.IsEqual(0)) {
-				return null;
-			}
-
-			var s02X = line1.P1.X - line2.P1.X;
-			var s02Y = line1.P1.Y - line2.P1.Y;
-			var sNumer = s10X * s02Y - s10Y * s02X;
-			if ((sNumer < 0) == (denom > 0)) {
-				return null;
-			}
-			var tNumer = s32X * s02Y - s32Y * s02X;
-			if ((tNumer < 0) == (denom > 0)) {
-				return null;
-			}
-			if (((sNumer > denom) == (denom > 0)) || ((tNumer > denom) == (denom > 0))) {
-				return null;
-			}
-			var t = tNumer / denom;
-
-			return new Point(line1.P1.X + t * s10X, line1.P1.Y + t * s10Y);
-		}
-
-		/// <summary>
-		/// Computes the time interval for driving the given distance ds with the vehicle's current speed and the given acceleration.
-		/// If the distance ds can not be reached (i.e., the vehicle would halt before ds is reached) then the distance parameter is adjusted.
-		/// Returns a new operating point (a, ds, dt)
-		/// </summary>
-		/// <param name="currentSpeed">vehicle's current speed at the beginning of the simulation interval</param>
-		/// <param name="acceleration">vehicle's acceleration</param>
-		/// <param name="distance">absolute distance at the beginning of the simulation interval (can be 0)</param>
-		/// <param name="ds">distance to drive in the current simulation interval</param>
-		/// <returns>Operating point (a, ds, dt)</returns>
-		public static OperatingPoint ComputeTimeInterval(MeterPerSecond currentSpeed, MeterPerSquareSecond acceleration,
-			Meter distance, Meter ds)
-		{
-			if (!(ds > 0)) {
-				throw new VectoSimulationException("ds has to be greater than 0! ds: {0}", ds);
-			}
-
-			var retVal = new OperatingPoint() { Acceleration = acceleration, SimulationDistance = ds };
-			if (acceleration.IsEqual(0)) {
-				if (currentSpeed > 0) {
-					retVal.SimulationInterval = ds / currentSpeed;
-					return retVal;
-				}
-				//Log.Error("{2}: vehicle speed is {0}, acceleration is {1}", currentSpeed.Value(), acceleration.Value(),
-				//	distance);
-				throw new VectoSimulationException(
-					"vehicle speed has to be > 0 if acceleration = 0!  v: {0}, a: {1}, distance: {2}", currentSpeed.Value(),
-					acceleration.Value(), distance);
-			}
-
-			// we need to accelerate / decelerate. solve quadratic equation...
-			// ds = acceleration / 2 * dt^2 + currentSpeed * dt   => solve for dt
-			var solutions = QuadraticEquationSolver(acceleration.Value() / 2.0, currentSpeed.Value(),
-				-ds.Value());
-
-			if (solutions.Length == 0) {
-				// no real-valued solutions: acceleration is so negative that vehicle stops already before the required distance can be reached.
-				// adapt ds to the halting-point.
-				// t = v / a
-				var dt = currentSpeed / -acceleration;
-
-				// s = a/2*t^2 + v*t
-				var stopDistance = acceleration / 2 * dt * dt + currentSpeed * dt;
-
-				if (stopDistance.IsGreater(ds)) {
-					// just to cover everything - does not happen...
-					//Log.Error(
-					//	"Could not find solution for computing required time interval to drive distance ds: {0}. currentSpeed: {1}, acceleration: {2}, stopDistance: {3}, distance: {4}",
-					//	ds, currentSpeed, acceleration, stopDistance,distance);
-					throw new VectoSimulationException("Could not find solution for time-interval!  ds: {0}, stopDistance: {1}", ds,
-						stopDistance);
-				}
-
-				//LoggingObject.Logger<>().Info(
-				//	"Adjusted distance when computing time interval: currentSpeed: {0}, acceleration: {1}, distance: {2} -> {3}, timeInterval: {4}",
-				//	currentSpeed, acceleration, stopDistance, stopDistance, dt);
-
-				retVal.SimulationInterval = dt;
-				retVal.SimulationDistance = stopDistance;
-				return retVal;
-			}
-			// if there are 2 positive solutions (i.e. when decelerating), take the smaller time interval
-			// (the second solution means that you reach negative speed)
-			retVal.SimulationInterval = solutions.Where(x => x >= 0).Min().SI<Second>();
-			return retVal;
-		}
-
-		[DebuggerStepThrough]
-		[MethodImpl(MethodImplOptions.AggressiveInlining)]
-		public static T Ceiling<T>(T si) where T : SIBase<T>
-		{
-			return Math.Ceiling(si.Value()).SI<T>();
-		}
-
-		public static double[] CubicEquationSolver(double a, double b, double c, double d)
-		{
-			var solutions = new List<double>();
-			if (a.IsEqual(0, 1e-12)) {
-				return QuadraticEquationSolver(b, c, d);
-			}
-			var w = b / (3 * a);
-			var p = Math.Pow(c / (3 * a) - w * w, 3);
-			var q = -0.5 * (2 * (w * w * w) - (c * w - d) / a);
-			var discriminant = q * q + p;
-			if (discriminant < 0.0) {
-				// 3 real solutions
-				var h = q / Math.Sqrt(-p);
-				var phi = Math.Acos(Math.Max(-1.0, Math.Min(1.0, h)));
-				p = 2 * Math.Pow(-p, 1.0 / 6.0);
-				for (var i = 0; i < 3; i++) {
-					solutions.Add(p * Math.Cos((phi + 2 * i * Math.PI) / 3.0) - w);
-				}
-			} else {
-				// one real solution
-				discriminant = Math.Sqrt(discriminant);
-				solutions.Add(Cbrt(q + discriminant) + Cbrt(q - discriminant) - w);
-			}
-
-			// 1 Newton iteration step in order to minimize round-off errors
-			for (var i = 0; i < solutions.Count; i++) {
-				var h = c + solutions[i] * (2 * b + 3 * solutions[i] * a);
-				if (!h.IsEqual(0, 1e-12)) {
-					solutions[i] -= (d + solutions[i] * (c + solutions[i] * (b + solutions[i] * a))) / h;
-				}
-			}
-			solutions.Sort();
-			return solutions.ToArray();
-		}
-
-		private static double Cbrt(double x)
-		{
-			return x < 0 ? -Math.Pow(-x, 1.0 / 3.0) : Math.Pow(x, 1.0 / 3.0);
-		}
-
-
-		public static void LeastSquaresFitting<T>(IEnumerable<T> entries, Func<T, double> getX, Func<T, double> getY,
-			out double k, out double d, out double r)
-		{
-			// algoritm taken from http://mathworld.wolfram.com/LeastSquaresFitting.html (eqn. 27 & 28)
-			var count = 0;
-			var sumX = 0.0;
-			var sumY = 0.0;
-			var sumXSquare = 0.0;
-			var sumYSquare = 0.0;
-			var sumXY = 0.0;
-			foreach (var entry in entries) {
-				var x = getX(entry);
-				var y = getY(entry);
-				sumX += x;
-				sumY += y;
-				sumXSquare += x * x;
-				sumYSquare += y * y;
-				sumXY += x * y;
-				count++;
-			}
-			if (count == 0) {
-				k = 0;
-				d = 0;
-				r = 0;
-				return;
-			}
-			var ssxx = sumXSquare - sumX * sumX / count;
-			var ssxy = sumXY - sumX * sumY / count;
-			var ssyy = sumYSquare - sumY * sumY / count;
-			k = ssxy / ssxx;
-			d = (sumY - k * sumX) / count;
-			r = ssxy * ssxy / ssxx / ssyy;
-		}
-	}
-
-	[DebuggerDisplay("(X:{X}, Y:{Y}, Z:{Z})")]
-	public class Point
-	{
-		public readonly double X;
-		public readonly double Y;
-		public readonly double Z;
-
-		public Point(double x, double y, double z = 0)
-		{
-			X = x;
-			Y = y;
-			Z = z;
-		}
-
-		public static Point operator +(Point p1, Point p2)
-		{
-			return new Point(p1.X + p2.X, p1.Y + p2.Y, p1.Z + p2.Z);
-		}
-
-		public static Point operator -(Point p1, Point p2)
-		{
-			return new Point(p1.X - p2.X, p1.Y - p2.Y, p1.Z - p2.Z);
-		}
-
-		public static Point operator -(Point p1)
-		{
-			return new Point(-p1.X, -p1.Y);
-		}
-
-		public static Point operator *(Point p1, double scalar)
-		{
-			return new Point(p1.X * scalar, p1.Y * scalar, p1.Z * scalar);
-		}
-
-		public static Point operator *(double scalar, Point p1)
-		{
-			return p1 * scalar;
-		}
-
-		/// <summary>
-		/// Returns perpendicular vector for xy-components of this point. P = (-Y, X)
-		/// </summary>
-		/// <returns></returns>
-		public Point Perpendicular()
-		{
-			return new Point(-Y, X);
-		}
-
-		/// <summary>
-		/// Returns dot product between two 3d-vectors.
-		/// </summary>
-		/// <param name="other"></param>
-		/// <returns></returns>
-		public double Dot(Point other)
-		{
-			return X * other.X + Y * other.Y + Z * other.Z;
-		}
-
-		#region Equality members
-
-		private bool Equals(Point other)
-		{
-			return X.IsEqual(other.X) && Y.IsEqual(other.Y) && Z.IsEqual(other.Z);
-		}
-
-		public override bool Equals(object obj)
-		{
-			if (ReferenceEquals(null, obj)) {
-				return false;
-			}
-			return obj.GetType() == GetType() && Equals((Point)obj);
-		}
-
-		public override int GetHashCode()
-		{
-			return unchecked((((X.GetHashCode() * 397) ^ Y.GetHashCode()) * 397) ^ Z.GetHashCode());
-		}
-
-		#endregion
-
-		/// <summary>
-		/// Test if point is on the left side of an edge.
-		/// </summary>
-		/// <param name="e"></param>
-		/// <returns></returns>
-		public bool IsLeftOf(Edge e)
-		{
-			var abX = e.P2.X - e.P1.X;
-			var abY = e.P2.Y - e.P1.Y;
-			var acX = X - e.P1.X;
-			var acY = Y - e.P1.Y;
-			var z = abX * acY - abY * acX;
-			return z.IsGreater(0);
-		}
-	}
-
-	[DebuggerDisplay("Plane({X}, {Y}, {Z}, {W})")]
-	public class Plane
-	{
-		public readonly double X;
-		public readonly double Y;
-		public readonly double Z;
-		public readonly double W;
-
-		public Plane(Triangle tr)
-		{
-			var abX = tr.P2.X - tr.P1.X;
-			var abY = tr.P2.Y - tr.P1.Y;
-			var abZ = tr.P2.Z - tr.P1.Z;
-
-			var acX = tr.P3.X - tr.P1.X;
-			var acY = tr.P3.Y - tr.P1.Y;
-			var acZ = tr.P3.Z - tr.P1.Z;
-
-			X = abY * acZ - abZ * acY;
-			Y = abZ * acX - abX * acZ;
-			Z = abX * acY - abY * acX;
-			W = tr.P1.X * X + tr.P1.Y * Y + tr.P1.Z * Z;
-		}
-	}
-
-	[DebuggerDisplay("Triangle(({P1.X}, {P1.Y}, {P1.Z}), ({P2.X}, {P2.Y}, {P2.Z}), ({P3.X}, {P3.Y}, {P3.Z}))")]
-	public class Triangle
-	{
-		public readonly Point P1;
-		public readonly Point P2;
-		public readonly Point P3;
-
-		public Triangle(Point p1, Point p2, Point p3)
-		{
-			P1 = p1;
-			P2 = p2;
-			P3 = p3;
-
-			if ((P1.X.IsEqual(P2.X) && P2.X.IsEqual(P3.X)) || (P1.Y.IsEqual(P2.Y) && P2.Y.IsEqual(P3.Y))) {
-				throw new VectoException("triangle is not extrapolatable by a plane.");
-			}
-		}
-
-		/// <summary>
-		/// Check if Point is inside of Triangle. Barycentric Technique: http://www.blackpawn.com/texts/pointinpoly/default.html
-		/// </summary>
-		public bool IsInside(double x, double y, bool exact)
-		{
-			var smallerY = y - DoubleExtensionMethods.Tolerance;
-			var biggerY = y + DoubleExtensionMethods.Tolerance;
-			var smallerX = x - DoubleExtensionMethods.Tolerance;
-			var biggerX = x + DoubleExtensionMethods.Tolerance;
-
-			if ((P1.Y < smallerY && P2.Y < smallerY && P3.Y < smallerY)
-				|| (P1.X < smallerX && P2.X < smallerX && P3.X < smallerX)
-				|| (P1.X > biggerX && P2.X > biggerX && P3.X > biggerX)
-				|| (P1.Y > biggerY && P2.Y > biggerY && P3.Y > biggerY)) {
-				return false;
-			}
-
-			var v0X = P3.X - P1.X;
-			var v0Y = P3.Y - P1.Y;
-			var v1X = P2.X - P1.X;
-			var v1Y = P2.Y - P1.Y;
-			var v2X = x - P1.X;
-			var v2Y = y - P1.Y;
-
-			var dot00 = v0X * v0X + v0Y * v0Y;
-			var dot01 = v0X * v1X + v0Y * v1Y;
-			var dot02 = v0X * v2X + v0Y * v2Y;
-			var dot11 = v1X * v1X + v1Y * v1Y;
-			var dot12 = v1X * v2X + v1Y * v2Y;
-
-			var invDenom = 1.0 / (dot00 * dot11 - dot01 * dot01);
-			var u = (dot11 * dot02 - dot01 * dot12) * invDenom;
-			var v = (dot00 * dot12 - dot01 * dot02) * invDenom;
-
-			if (exact) {
-				return u >= 0 && v >= 0 && u + v <= 1;
-			}
-
-			return u.IsPositive() && v.IsPositive() && (u + v).IsSmallerOrEqual(1);
-		}
-
-		public bool ContainsInCircumcircle(Point p)
-		{
-			var p0X = P1.X - p.X;
-			var p0Y = P1.Y - p.Y;
-			var p1X = P2.X - p.X;
-			var p1Y = P2.Y - p.Y;
-			var p2X = P3.X - p.X;
-			var p2Y = P3.Y - p.Y;
-
-			var p0Square = p0X * p0X + p0Y * p0Y;
-			var p1Square = p1X * p1X + p1Y * p1Y;
-			var p2Square = p2X * p2X + p2Y * p2Y;
-
-			var det01 = p0X * p1Y - p1X * p0Y;
-			var det12 = p1X * p2Y - p2X * p1Y;
-			var det20 = p2X * p0Y - p0X * p2Y;
-
-			var result = p0Square * det12 + p1Square * det20 + p2Square * det01;
-			return result > 0;
-		}
-
-		public bool Contains(Point p)
-		{
-			return p.Equals(P1) || p.Equals(P2) || p.Equals(P3);
-		}
-
-		public bool SharesVertexWith(Triangle t)
-		{
-			return Contains(t.P1) || Contains(t.P2) || Contains(t.P3);
-		}
-
-		public IEnumerable<Edge> GetEdges()
-		{
-			return new[] { new Edge(P1, P2), new Edge(P2, P3), new Edge(P3, P1) };
-		}
-
-		#region Equality members
-
-		protected bool Equals(Triangle other)
-		{
-			return Equals(P1, other.P1) && Equals(P2, other.P2) && Equals(P3, other.P3);
-		}
-
-		public override bool Equals(object obj)
-		{
-			if (ReferenceEquals(null, obj)) {
-				return false;
-			}
-			if (ReferenceEquals(this, obj)) {
-				return true;
-			}
-			if (obj.GetType() != GetType()) {
-				return false;
-			}
-			return Equals((Triangle)obj);
-		}
-
-		public override int GetHashCode()
-		{
-			unchecked {
-				var hashCode = P1.GetHashCode();
-				hashCode = (hashCode * 397) ^ P2.GetHashCode();
-				hashCode = (hashCode * 397) ^ P3.GetHashCode();
-				return hashCode;
-			}
-		}
-
-		#endregion
-	}
-
-	[DebuggerDisplay("Edge(({P1.X}, {P1.Y},{P1.Z}), ({P2.X}, {P2.Y},{P2.Z}))")]
-	public class Edge
-	{
-		public readonly Point P1;
-		public readonly Point P2;
-
-		private Point _vector;
-
-		public Edge(Point p1, Point p2)
-		{
-			P1 = p1;
-			P2 = p2;
-		}
-
-		public Point Vector
-		{
-			get { return _vector ?? (_vector = P2 - P1); }
-		}
-
-		public double SlopeXY
-		{
-			get { return Vector.Y / Vector.X; }
-		}
-
-		public double OffsetXY
-		{
-			get { return P2.Y - SlopeXY * P2.X; }
-		}
-
-		#region Equality members
-
-		protected bool Equals(Edge other)
-		{
-			return (P1.Equals(other.P1) && Equals(P2, other.P2)) || (P1.Equals(other.P2) && P2.Equals(other.P1));
-		}
-
-		public override bool Equals(object obj)
-		{
-			if (ReferenceEquals(null, obj)) {
-				return false;
-			}
-			if (ReferenceEquals(this, obj)) {
-				return true;
-			}
-			return obj.GetType() == GetType() && Equals((Edge)obj);
-		}
-
-		public override int GetHashCode()
-		{
-			return P1.GetHashCode() ^ P2.GetHashCode();
-		}
-
-		#endregion
-
-		public static Edge Create(Point arg1, Point arg2)
-		{
-			return new Edge(arg1, arg2);
-		}
-
-		public bool ContainsXY(Point point)
-		{
-			return (SlopeXY * point.X + (P1.Y - SlopeXY * P1.X) - point.Y).IsEqual(0, 1E-9);
-		}
-	}
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.Linq;
+using System.Runtime.CompilerServices;
+using TUGraz.VectoCommon.Exceptions;
+using TUGraz.VectoCommon.Models;
+
+namespace TUGraz.VectoCommon.Utils
+{
+	/// <summary>
+	/// Provides helper methods for mathematical functions.
+	/// </summary>
+	public static class VectoMath
+	{
+		/// <summary>
+		/// Linearly interpolates a value between two points.
+		/// </summary>
+		/// <typeparam name="T"></typeparam>
+		/// <typeparam name="TResult">The type of the result.</typeparam>
+		/// <param name="x1">First Value on the X-Axis.</param>
+		/// <param name="x2">Second Value on the X-Axis.</param>
+		/// <param name="y1">First Value on the Y-Axis.</param>
+		/// <param name="y2">Second Value on the Y-Axis.</param>
+		/// <param name="xint">Value on the X-Axis, for which the Y-Value should be interpolated.</param>
+		/// <returns></returns>
+		[MethodImpl(MethodImplOptions.AggressiveInlining)]
+		public static TResult Interpolate<T, TResult>(T x1, T x2, TResult y1, TResult y2, T xint) where T : SI
+			where TResult : SIBase<TResult>
+		{
+			return Interpolate(x1.Value(), x2.Value(), y1.Value(), y2.Value(), xint.Value()).SI<TResult>();
+		}
+
+		[MethodImpl(MethodImplOptions.AggressiveInlining)]
+		public static TResult Interpolate<TInput, T, TResult>(this Tuple<TInput, TInput> self, Func<TInput, T> x,
+			Func<TInput, TResult> y, T xInterpolate)
+			where T : SIBase<T>
+			where TResult : SIBase<TResult>
+		{
+			return Interpolate(x(self.Item1).Value(), x(self.Item2).Value(), y(self.Item1).Value(), y(self.Item2).Value(),
+				xInterpolate.Value()).SI<TResult>();
+		}
+
+		[MethodImpl(MethodImplOptions.AggressiveInlining)]
+		public static TResult Interpolate<TInput, TResult>(this Tuple<TInput, TInput> self, Func<TInput, double> x,
+			Func<TInput, TResult> y, double xInterpolate)
+			where TResult : SIBase<TResult>
+		{
+			return
+				Interpolate(x(self.Item1), x(self.Item2), y(self.Item1).Value(), y(self.Item2).Value(), xInterpolate).SI<TResult>();
+		}
+
+		[MethodImpl(MethodImplOptions.AggressiveInlining)]
+		public static TResult Interpolate<TInput, TResult>(this IEnumerable<TInput> self, Func<TInput, double> x,
+			Func<TInput, TResult> y, double xInterpolate)
+			where TResult : SIBase<TResult>
+		{
+			return self.GetSection(elem => x(elem) < xInterpolate).Interpolate(x, y, xInterpolate);
+		}
+
+		[MethodImpl(MethodImplOptions.AggressiveInlining)]
+		public static double Interpolate<TInput>(this IEnumerable<TInput> self, Func<TInput, double> x,
+			Func<TInput, double> y, double xInterpolate)
+		{
+			return self.GetSection(elem => x(elem) < xInterpolate).Interpolate(x, y, xInterpolate);
+		}
+
+		[MethodImpl(MethodImplOptions.AggressiveInlining)]
+		public static double Interpolate<TInput>(this Tuple<TInput, TInput> self, Func<TInput, double> x,
+			Func<TInput, double> y, double xInterpolate)
+		{
+			return Interpolate(x(self.Item1), x(self.Item2), y(self.Item1), y(self.Item2), xInterpolate);
+		}
+
+		[MethodImpl(MethodImplOptions.AggressiveInlining)]
+		public static double Interpolate<T>(T x1, T x2, double y1, double y2, T xint) where T : SI
+		{
+			return Interpolate(x1.Value(), x2.Value(), y1, y2, xint.Value());
+		}
+
+		[MethodImpl(MethodImplOptions.AggressiveInlining)]
+		public static TResult Interpolate<TResult>(double x1, double x2, TResult y1, TResult y2, double xint)
+			where TResult : SIBase<TResult>
+		{
+			return Interpolate(x1, x2, y1.Value(), y2.Value(), xint).SI<TResult>();
+		}
+
+		[MethodImpl(MethodImplOptions.AggressiveInlining)]
+		public static double Interpolate(Point p1, Point p2, double x)
+		{
+			return Interpolate(p1.X, p2.X, p1.Y, p2.Y, x);
+		}
+
+		/// <summary>
+		/// Linearly interpolates a value between two points.
+		/// </summary>
+		[MethodImpl(MethodImplOptions.AggressiveInlining)]
+		public static double Interpolate(double x1, double x2, double y1, double y2, double xint)
+		{
+			return (xint - x1) * (y2 - y1) / (x2 - x1) + y1;
+		}
+
+		/// <summary>
+		/// Returns the absolute value.
+		/// </summary>
+		[DebuggerStepThrough]
+		[MethodImpl(MethodImplOptions.AggressiveInlining)]
+		public static SI Abs(SI si)
+		{
+			return si.Abs();
+		}
+
+		/// <summary>
+		/// Returns the minimum of two values.
+		/// </summary>
+		[DebuggerStepThrough]
+		[MethodImpl(MethodImplOptions.AggressiveInlining)]
+		public static T Min<T>(T c1, T c2) where T : IComparable
+		{
+			if (c1 == null) {
+				return c2;
+			}
+
+			if (c2 == null) {
+				return c1;
+			}
+
+			return c1.CompareTo(c2) <= 0 ? c1 : c2;
+		}
+
+		/// <summary>
+		/// Returns the maximum of two values.
+		/// </summary>
+		[DebuggerStepThrough]
+		[MethodImpl(MethodImplOptions.AggressiveInlining)]
+		public static T Max<T>(T c1, T c2) where T : IComparable
+		{
+			return c1.CompareTo(c2) > 0 ? c1 : c2;
+		}
+
+		/// <summary>
+		/// Returns the maximum of two values.
+		/// </summary>
+		[DebuggerStepThrough]
+		[MethodImpl(MethodImplOptions.AggressiveInlining)]
+		public static T Max<T>(double c1, T c2) where T : SIBase<T>
+		{
+			return c1 > c2.Value() ? c1.SI<T>() : c2;
+		}
+
+		[DebuggerStepThrough]
+		[MethodImpl(MethodImplOptions.AggressiveInlining)]
+		public static T Max<T>(T c1, T c2, T c3) where T : SIBase<T>
+		{
+			return Max(Max(c1, c2), c3);
+		}
+
+		[DebuggerStepThrough]
+		[MethodImpl(MethodImplOptions.AggressiveInlining)]
+		public static T LimitTo<T>(this T value, T lowerBound, T upperBound) where T : IComparable
+		{
+			if (lowerBound.CompareTo(upperBound) > 0) {
+				throw new VectoException(
+					"VectoMath.LimitTo: lowerBound must not be greater than upperBound. lowerBound: {0}, upperBound: {1}", lowerBound,
+					upperBound);
+			}
+
+			if (value.CompareTo(upperBound) > 0) {
+				return upperBound;
+			}
+
+			if (value.CompareTo(lowerBound) < 0) {
+				return lowerBound;
+			}
+
+			return value;
+		}
+
+		/// <summary>
+		///	converts the given inclination in percent (0-1+) into Radians
+		/// </summary>
+		[DebuggerStepThrough]
+		[MethodImpl(MethodImplOptions.AggressiveInlining)]
+		public static Radian InclinationToAngle(double inclinationPercent)
+		{
+			return Math.Atan(inclinationPercent).SI<Radian>();
+		}
+
+		public static double[] QuadraticEquationSolver(double a, double b, double c)
+		{
+			var d = b * b - 4 * a * c;
+
+			// no real solution
+			if (d < 0) {
+				return new double[0];
+			}
+
+			if (d > 0) {
+				// two solutions
+				return new[] { (-b + Math.Sqrt(d)) / (2 * a), (-b - Math.Sqrt(d)) / (2 * a) };
+			}
+
+			// one real solution
+			return new[] { -b / (2 * a) };
+		}
+
+		public static Point Intersect(Edge line1, Edge line2)
+		{
+			var s10X = line1.P2.X - line1.P1.X;
+			var s10Y = line1.P2.Y - line1.P1.Y;
+			var s32X = line2.P2.X - line2.P1.X;
+			var s32Y = line2.P2.Y - line2.P1.Y;
+
+			var denom = s10X * s32Y - s32X * s10Y;
+			if (denom.IsEqual(0)) {
+				return null;
+			}
+
+			var s02X = line1.P1.X - line2.P1.X;
+			var s02Y = line1.P1.Y - line2.P1.Y;
+			var sNumer = s10X * s02Y - s10Y * s02X;
+			if ((sNumer < 0) == (denom > 0)) {
+				return null;
+			}
+			var tNumer = s32X * s02Y - s32Y * s02X;
+			if ((tNumer < 0) == (denom > 0)) {
+				return null;
+			}
+			if (((sNumer > denom) == (denom > 0)) || ((tNumer > denom) == (denom > 0))) {
+				return null;
+			}
+			var t = tNumer / denom;
+
+			return new Point(line1.P1.X + t * s10X, line1.P1.Y + t * s10Y);
+		}
+
+		/// <summary>
+		/// Computes the time interval for driving the given distance ds with the vehicle's current speed and the given acceleration.
+		/// If the distance ds can not be reached (i.e., the vehicle would halt before ds is reached) then the distance parameter is adjusted.
+		/// Returns a new operating point (a, ds, dt)
+		/// </summary>
+		/// <param name="currentSpeed">vehicle's current speed at the beginning of the simulation interval</param>
+		/// <param name="acceleration">vehicle's acceleration</param>
+		/// <param name="distance">absolute distance at the beginning of the simulation interval (can be 0)</param>
+		/// <param name="ds">distance to drive in the current simulation interval</param>
+		/// <returns>Operating point (a, ds, dt)</returns>
+		public static OperatingPoint ComputeTimeInterval(MeterPerSecond currentSpeed, MeterPerSquareSecond acceleration,
+			Meter distance, Meter ds)
+		{
+			if (!(ds > 0)) {
+				throw new VectoSimulationException("ds has to be greater than 0! ds: {0}", ds);
+			}
+
+			var retVal = new OperatingPoint() { Acceleration = acceleration, SimulationDistance = ds };
+			if (acceleration.IsEqual(0)) {
+				if (currentSpeed > 0) {
+					retVal.SimulationInterval = ds / currentSpeed;
+					return retVal;
+				}
+				//Log.Error("{2}: vehicle speed is {0}, acceleration is {1}", currentSpeed.Value(), acceleration.Value(),
+				//	distance);
+				throw new VectoSimulationException(
+					"vehicle speed has to be > 0 if acceleration = 0!  v: {0}, a: {1}, distance: {2}", currentSpeed.Value(),
+					acceleration.Value(), distance);
+			}
+
+			// we need to accelerate / decelerate. solve quadratic equation...
+			// ds = acceleration / 2 * dt^2 + currentSpeed * dt   => solve for dt
+			var solutions = QuadraticEquationSolver(acceleration.Value() / 2.0, currentSpeed.Value(),
+				-ds.Value());
+
+			if (solutions.Length == 0) {
+				// no real-valued solutions: acceleration is so negative that vehicle stops already before the required distance can be reached.
+				// adapt ds to the halting-point.
+				// t = v / a
+				var dt = currentSpeed / -acceleration;
+
+				// s = a/2*t^2 + v*t
+				var stopDistance = acceleration / 2 * dt * dt + currentSpeed * dt;
+
+				if (stopDistance.IsGreater(ds)) {
+					// just to cover everything - does not happen...
+					//Log.Error(
+					//	"Could not find solution for computing required time interval to drive distance ds: {0}. currentSpeed: {1}, acceleration: {2}, stopDistance: {3}, distance: {4}",
+					//	ds, currentSpeed, acceleration, stopDistance,distance);
+					throw new VectoSimulationException("Could not find solution for time-interval!  ds: {0}, stopDistance: {1}", ds,
+						stopDistance);
+				}
+
+				//LoggingObject.Logger<>().Info(
+				//	"Adjusted distance when computing time interval: currentSpeed: {0}, acceleration: {1}, distance: {2} -> {3}, timeInterval: {4}",
+				//	currentSpeed, acceleration, stopDistance, stopDistance, dt);
+
+				retVal.SimulationInterval = dt;
+				retVal.SimulationDistance = stopDistance;
+				return retVal;
+			}
+			// if there are 2 positive solutions (i.e. when decelerating), take the smaller time interval
+			// (the second solution means that you reach negative speed)
+			retVal.SimulationInterval = solutions.Where(x => x >= 0).Min().SI<Second>();
+			return retVal;
+		}
+
+		[DebuggerStepThrough]
+		[MethodImpl(MethodImplOptions.AggressiveInlining)]
+		public static T Ceiling<T>(T si) where T : SIBase<T>
+		{
+			return Math.Ceiling(si.Value()).SI<T>();
+		}
+
+		public static double[] CubicEquationSolver(double a, double b, double c, double d)
+		{
+			var solutions = new List<double>();
+			if (a.IsEqual(0, 1e-12)) {
+				return QuadraticEquationSolver(b, c, d);
+			}
+			var w = b / (3 * a);
+			var p = Math.Pow(c / (3 * a) - w * w, 3);
+			var q = -0.5 * (2 * (w * w * w) - (c * w - d) / a);
+			var discriminant = q * q + p;
+			if (discriminant < 0.0) {
+				// 3 real solutions
+				var h = q / Math.Sqrt(-p);
+				var phi = Math.Acos(Math.Max(-1.0, Math.Min(1.0, h)));
+				p = 2 * Math.Pow(-p, 1.0 / 6.0);
+				for (var i = 0; i < 3; i++) {
+					solutions.Add(p * Math.Cos((phi + 2 * i * Math.PI) / 3.0) - w);
+				}
+			} else {
+				// one real solution
+				discriminant = Math.Sqrt(discriminant);
+				solutions.Add(Cbrt(q + discriminant) + Cbrt(q - discriminant) - w);
+			}
+
+			// 1 Newton iteration step in order to minimize round-off errors
+			for (var i = 0; i < solutions.Count; i++) {
+				var h = c + solutions[i] * (2 * b + 3 * solutions[i] * a);
+				if (!h.IsEqual(0, 1e-12)) {
+					solutions[i] -= (d + solutions[i] * (c + solutions[i] * (b + solutions[i] * a))) / h;
+				}
+			}
+			solutions.Sort();
+			return solutions.ToArray();
+		}
+
+		private static double Cbrt(double x)
+		{
+			return x < 0 ? -Math.Pow(-x, 1.0 / 3.0) : Math.Pow(x, 1.0 / 3.0);
+		}
+
+
+		public static void LeastSquaresFitting<T>(IEnumerable<T> entries, Func<T, double> getX, Func<T, double> getY,
+			out double k, out double d, out double r)
+		{
+			// algoritm taken from http://mathworld.wolfram.com/LeastSquaresFitting.html (eqn. 27 & 28)
+			var count = 0;
+			var sumX = 0.0;
+			var sumY = 0.0;
+			var sumXSquare = 0.0;
+			var sumYSquare = 0.0;
+			var sumXY = 0.0;
+			foreach (var entry in entries) {
+				var x = getX(entry);
+				var y = getY(entry);
+				sumX += x;
+				sumY += y;
+				sumXSquare += x * x;
+				sumYSquare += y * y;
+				sumXY += x * y;
+				count++;
+			}
+			if (count == 0) {
+				k = 0;
+				d = 0;
+				r = 0;
+				return;
+			}
+			var ssxx = sumXSquare - sumX * sumX / count;
+			var ssxy = sumXY - sumX * sumY / count;
+			var ssyy = sumYSquare - sumY * sumY / count;
+			k = ssxy / ssxx;
+			d = (sumY - k * sumX) / count;
+			r = ssxy * ssxy / ssxx / ssyy;
+		}
+	}
+
+	[DebuggerDisplay("(X:{X}, Y:{Y}, Z:{Z})")]
+	public class Point
+	{
+		public readonly double X;
+		public readonly double Y;
+		public readonly double Z;
+
+		public Point(double x, double y, double z = 0)
+		{
+			X = x;
+			Y = y;
+			Z = z;
+		}
+
+		public static Point operator +(Point p1, Point p2)
+		{
+			return new Point(p1.X + p2.X, p1.Y + p2.Y, p1.Z + p2.Z);
+		}
+
+		public static Point operator -(Point p1, Point p2)
+		{
+			return new Point(p1.X - p2.X, p1.Y - p2.Y, p1.Z - p2.Z);
+		}
+
+		public static Point operator -(Point p1)
+		{
+			return new Point(-p1.X, -p1.Y);
+		}
+
+		public static Point operator *(Point p1, double scalar)
+		{
+			return new Point(p1.X * scalar, p1.Y * scalar, p1.Z * scalar);
+		}
+
+		public static Point operator *(double scalar, Point p1)
+		{
+			return p1 * scalar;
+		}
+
+		/// <summary>
+		/// Returns perpendicular vector for xy-components of this point. P = (-Y, X)
+		/// </summary>
+		/// <returns></returns>
+		public Point Perpendicular()
+		{
+			return new Point(-Y, X);
+		}
+
+		/// <summary>
+		/// Returns dot product between two 3d-vectors.
+		/// </summary>
+		/// <param name="other"></param>
+		/// <returns></returns>
+		public double Dot(Point other)
+		{
+			return X * other.X + Y * other.Y + Z * other.Z;
+		}
+
+		#region Equality members
+
+		private bool Equals(Point other)
+		{
+			return X.IsEqual(other.X) && Y.IsEqual(other.Y) && Z.IsEqual(other.Z);
+		}
+
+		public override bool Equals(object obj)
+		{
+			if (ReferenceEquals(null, obj)) {
+				return false;
+			}
+			return obj.GetType() == GetType() && Equals((Point)obj);
+		}
+
+		public override int GetHashCode()
+		{
+			return unchecked((((X.GetHashCode() * 397) ^ Y.GetHashCode()) * 397) ^ Z.GetHashCode());
+		}
+
+		#endregion
+
+		/// <summary>
+		/// Test if point is on the left side of an edge.
+		/// </summary>
+		/// <param name="e"></param>
+		/// <returns></returns>
+		public bool IsLeftOf(Edge e)
+		{
+			var abX = e.P2.X - e.P1.X;
+			var abY = e.P2.Y - e.P1.Y;
+			var acX = X - e.P1.X;
+			var acY = Y - e.P1.Y;
+			var z = abX * acY - abY * acX;
+			return z.IsGreater(0);
+		}
+	}
+
+	[DebuggerDisplay("Plane({X}, {Y}, {Z}, {W})")]
+	public class Plane
+	{
+		public readonly double X;
+		public readonly double Y;
+		public readonly double Z;
+		public readonly double W;
+
+		public Plane(Triangle tr)
+		{
+			var abX = tr.P2.X - tr.P1.X;
+			var abY = tr.P2.Y - tr.P1.Y;
+			var abZ = tr.P2.Z - tr.P1.Z;
+
+			var acX = tr.P3.X - tr.P1.X;
+			var acY = tr.P3.Y - tr.P1.Y;
+			var acZ = tr.P3.Z - tr.P1.Z;
+
+			X = abY * acZ - abZ * acY;
+			Y = abZ * acX - abX * acZ;
+			Z = abX * acY - abY * acX;
+			W = tr.P1.X * X + tr.P1.Y * Y + tr.P1.Z * Z;
+		}
+	}
+
+	[DebuggerDisplay("Triangle(({P1.X}, {P1.Y}, {P1.Z}), ({P2.X}, {P2.Y}, {P2.Z}), ({P3.X}, {P3.Y}, {P3.Z}))")]
+	public class Triangle
+	{
+		public readonly Point P1;
+		public readonly Point P2;
+		public readonly Point P3;
+
+		public Triangle(Point p1, Point p2, Point p3)
+		{
+			P1 = p1;
+			P2 = p2;
+			P3 = p3;
+
+			if ((P1.X.IsEqual(P2.X) && P2.X.IsEqual(P3.X)) || (P1.Y.IsEqual(P2.Y) && P2.Y.IsEqual(P3.Y))) {
+				throw new VectoException("triangle is not extrapolatable by a plane.");
+			}
+		}
+
+		/// <summary>
+		/// Check if Point is inside of Triangle. Barycentric Technique: http://www.blackpawn.com/texts/pointinpoly/default.html
+		/// </summary>
+		public bool IsInside(double x, double y, bool exact)
+		{
+			var smallerY = y - DoubleExtensionMethods.Tolerance;
+			var biggerY = y + DoubleExtensionMethods.Tolerance;
+			var smallerX = x - DoubleExtensionMethods.Tolerance;
+			var biggerX = x + DoubleExtensionMethods.Tolerance;
+
+			var aboveTriangle = P1.Y < smallerY && P2.Y < smallerY && P3.Y < smallerY;
+			var belowTriangle = P1.Y > biggerY && P2.Y > biggerY && P3.Y > biggerY;
+			var leftOfTriangle = P1.X > biggerX && P2.X > biggerX && P3.X > biggerX;
+			var rightOfTriangle = P1.X < smallerX && P2.X < smallerX && P3.X < smallerX;
+
+			if (aboveTriangle || rightOfTriangle || leftOfTriangle || belowTriangle) {
+				return false;
+			}
+
+			var v0X = P3.X - P1.X;
+			var v0Y = P3.Y - P1.Y;
+			var v1X = P2.X - P1.X;
+			var v1Y = P2.Y - P1.Y;
+			var v2X = x - P1.X;
+			var v2Y = y - P1.Y;
+
+			var dot00 = v0X * v0X + v0Y * v0Y;
+			var dot01 = v0X * v1X + v0Y * v1Y;
+			var dot02 = v0X * v2X + v0Y * v2Y;
+			var dot11 = v1X * v1X + v1Y * v1Y;
+			var dot12 = v1X * v2X + v1Y * v2Y;
+
+			var invDenom = 1.0 / (dot00 * dot11 - dot01 * dot01);
+			var u = (dot11 * dot02 - dot01 * dot12) * invDenom;
+			var v = (dot00 * dot12 - dot01 * dot02) * invDenom;
+
+			if (exact) {
+				return u >= 0 && v >= 0 && u + v <= 1;
+			}
+
+			return u.IsPositive() && v.IsPositive() && (u + v).IsSmallerOrEqual(1);
+		}
+
+		public bool ContainsInCircumcircle(Point p)
+		{
+			var p0X = P1.X - p.X;
+			var p0Y = P1.Y - p.Y;
+			var p1X = P2.X - p.X;
+			var p1Y = P2.Y - p.Y;
+			var p2X = P3.X - p.X;
+			var p2Y = P3.Y - p.Y;
+
+			var p0Square = p0X * p0X + p0Y * p0Y;
+			var p1Square = p1X * p1X + p1Y * p1Y;
+			var p2Square = p2X * p2X + p2Y * p2Y;
+
+			var det01 = p0X * p1Y - p1X * p0Y;
+			var det12 = p1X * p2Y - p2X * p1Y;
+			var det20 = p2X * p0Y - p0X * p2Y;
+
+			var result = p0Square * det12 + p1Square * det20 + p2Square * det01;
+			return result > 0;
+		}
+
+		public bool Contains(Point p)
+		{
+			return p.Equals(P1) || p.Equals(P2) || p.Equals(P3);
+		}
+
+		public bool SharesVertexWith(Triangle t)
+		{
+			return Contains(t.P1) || Contains(t.P2) || Contains(t.P3);
+		}
+
+		public IEnumerable<Edge> GetEdges()
+		{
+			return new[] { new Edge(P1, P2), new Edge(P2, P3), new Edge(P3, P1) };
+		}
+
+		#region Equality members
+
+		protected bool Equals(Triangle other)
+		{
+			return Equals(P1, other.P1) && Equals(P2, other.P2) && Equals(P3, other.P3);
+		}
+
+		public override bool Equals(object obj)
+		{
+			if (ReferenceEquals(null, obj)) {
+				return false;
+			}
+			if (ReferenceEquals(this, obj)) {
+				return true;
+			}
+			if (obj.GetType() != GetType()) {
+				return false;
+			}
+			return Equals((Triangle)obj);
+		}
+
+		public override int GetHashCode()
+		{
+			unchecked {
+				var hashCode = P1.GetHashCode();
+				hashCode = (hashCode * 397) ^ P2.GetHashCode();
+				hashCode = (hashCode * 397) ^ P3.GetHashCode();
+				return hashCode;
+			}
+		}
+
+		#endregion
+	}
+
+	[DebuggerDisplay("Edge(({P1.X}, {P1.Y},{P1.Z}), ({P2.X}, {P2.Y},{P2.Z}))")]
+	public class Edge
+	{
+		public readonly Point P1;
+		public readonly Point P2;
+
+		private Point _vector;
+
+		public Edge(Point p1, Point p2)
+		{
+			P1 = p1;
+			P2 = p2;
+		}
+
+		public Point Vector
+		{
+			get { return _vector ?? (_vector = P2 - P1); }
+		}
+
+		public double SlopeXY
+		{
+			get { return Vector.Y / Vector.X; }
+		}
+
+		public double OffsetXY
+		{
+			get { return P2.Y - SlopeXY * P2.X; }
+		}
+
+		#region Equality members
+
+		protected bool Equals(Edge other)
+		{
+			return (P1.Equals(other.P1) && Equals(P2, other.P2)) || (P1.Equals(other.P2) && P2.Equals(other.P1));
+		}
+
+		public override bool Equals(object obj)
+		{
+			if (ReferenceEquals(null, obj)) {
+				return false;
+			}
+			if (ReferenceEquals(this, obj)) {
+				return true;
+			}
+			return obj.GetType() == GetType() && Equals((Edge)obj);
+		}
+
+		public override int GetHashCode()
+		{
+			return P1.GetHashCode() ^ P2.GetHashCode();
+		}
+
+		#endregion
+
+		public static Edge Create(Point arg1, Point arg2)
+		{
+			return new Edge(arg1, arg2);
+		}
+
+		public bool ContainsXY(Point point)
+		{
+			return (SlopeXY * point.X + (P1.Y - SlopeXY * P1.X) - point.Y).IsEqual(0, 1E-9);
+		}
+	}
 }
\ No newline at end of file
diff --git a/VectoCommon/VectoCommon/VectoCommon.csproj b/VectoCommon/VectoCommon/VectoCommon.csproj
index c994ad974c018a6524114452fafb12fd69ebc6d0..1d91d423b391097d52a6f7a95579644a1aa93750 100644
--- a/VectoCommon/VectoCommon/VectoCommon.csproj
+++ b/VectoCommon/VectoCommon/VectoCommon.csproj
@@ -67,6 +67,7 @@
     <Compile Include="Models\FuelType.cs" />
     <Compile Include="Models\GearboxType.cs" />
     <Compile Include="Models\IResponse.cs" />
+    <Compile Include="Models\LegislativeClass.cs" />
     <Compile Include="Models\LoggingObject.cs" />
     <Compile Include="Models\OperatingPoint.cs" />
     <Compile Include="Models\RetarderType.cs" />
diff --git a/VectoConsole/Program.cs b/VectoConsole/Program.cs
index 9e4d0f73b25843e4f22cecdf1fdf243531c1ba0e..0a23117745ed764a1d58c44c81354822c67c51ba 100644
--- a/VectoConsole/Program.cs
+++ b/VectoConsole/Program.cs
@@ -64,36 +64,36 @@ namespace VectoConsole
 
 		private const string Usage = @"Usage: vectocmd.exe [-h] [-v] FILE1.vecto [FILE2.vecto ...]";
 
-		private const string Help = @"
-Commandline Interface for Vecto.
-
-Synopsis:
-	vectocmd.exe [-h] [-v] FILE1.(vecto|xml) [FILE2.(vecto|xml) ...]
-
-Description:
-	FILE1.vecto [FILE2.vecto ...]: A list of vecto-job files (with the 
-	   extension: .vecto). At least one file must be given. Delimited by 
-	   whitespace.
-
-	-t: output information about execution times
-	-mod: write mod-data in addition to sum-data
-	-1Hz: convert mod-data to 1Hz resolution
-	-eng: switch to engineering mode (implies -mod)
-	-q: quiet - disables console output unless verbose information is enabled
-	-nv: skip validation of internal data structure before simulation
-	-v: Shows verbose information (errors and warnings will be displayed)
-	-vv: Shows more verbose information (infos will be displayed)
-	-vvv: Shows debug messages (slow!)
-	-vvvv: Shows all verbose information (everything, slow!)
-	-V: show version information
-	-h: Displays this help.
-	
-Examples:
-	vecto.exe ""12t Delivery Truck.vecto"" 40t_Long_Haul_Truck.vecto
-	vecto.exe 24tCoach.vecto 40t_Long_Haul_Truck.vecto
-	vecto.exe -v 24tCoach.vecto
-	vecto.exe -v jobs\40t_Long_Haul_Truck.vecto
-	vecto.exe -h
+		private const string Help = @"
+Commandline Interface for Vecto.
+
+Synopsis:
+	vectocmd.exe [-h] [-v] FILE1.(vecto|xml) [FILE2.(vecto|xml) ...]
+
+Description:
+	FILE1.vecto [FILE2.vecto ...]: A list of vecto-job files (with the 
+	   extension: .vecto). At least one file must be given. Delimited by 
+	   whitespace.
+
+	-t: output information about execution times
+	-mod: write mod-data in addition to sum-data
+	-1Hz: convert mod-data to 1Hz resolution
+	-eng: switch to engineering mode (implies -mod)
+	-q: quiet - disables console output unless verbose information is enabled
+	-nv: skip validation of internal data structure before simulation
+	-v: Shows verbose information (errors and warnings will be displayed)
+	-vv: Shows more verbose information (infos will be displayed)
+	-vvv: Shows debug messages (slow!)
+	-vvvv: Shows all verbose information (everything, slow!)
+	-V: show version information
+	-h: Displays this help.
+	
+Examples:
+	vecto.exe ""12t Delivery Truck.vecto"" 40t_Long_Haul_Truck.vecto
+	vecto.exe 24tCoach.vecto 40t_Long_Haul_Truck.vecto
+	vecto.exe -v 24tCoach.vecto
+	vecto.exe -v jobs\40t_Long_Haul_Truck.vecto
+	vecto.exe -h
 ";
 
 		private static JobContainer _jobContainer;
@@ -289,8 +289,9 @@ Examples:
 #if DEBUG
 			Console.Error.WriteLine("done.");
 
-			if (!Console.IsInputRedirected)
+			if (!Console.IsInputRedirected) {
 				Console.ReadKey();
+			}
 #endif
 			return Environment.ExitCode;
 		}
diff --git a/VectoCore/VectoCore/Configuration/Constants.cs b/VectoCore/VectoCore/Configuration/Constants.cs
index 1bfde99ff9e9708a085b97eb99d6a62733e57ca8..306c57e0fce6e3e3b86fdb366b4eac48ca921756 100644
--- a/VectoCore/VectoCore/Configuration/Constants.cs
+++ b/VectoCore/VectoCore/Configuration/Constants.cs
@@ -29,155 +29,155 @@
 *   Martin Rexeis, rexeis@ivt.tugraz.at, IVT, Graz University of Technology
 */
 
-using System;
-using TUGraz.VectoCommon.Utils;
-
-namespace TUGraz.VectoCore.Configuration
-{
-	public static class Constants
-	{
+using System;
+using TUGraz.VectoCommon.Utils;
+
+namespace TUGraz.VectoCore.Configuration
+{
+	public static class Constants
+	{
 		public static Second DefaultPowerShiftTime = 0.8.SI<Second>();
-		public const double RPMToRad = 2 * Math.PI / 60;
-		public const double Kilo = 1000;
-		public const double MeterPerSecondToKMH = 3.6;
-
-		public static class Auxiliaries
-		{
-			public const string Cycle = "cycle";
-			public const string Prefix = "AUX_";
-			public const string PowerPrefix = "P_";
-
-			public static class IDs
-			{
-				public static string PTOTransmission = "PTO_TRANSM";
-				public const string Fan = "FAN";
-				public const string SteeringPump = "STP";
-				public const string ElectricSystem = "ES";
-				public const string HeatingVentilationAirCondition = "AC";
-				public const string PneumaticSystem = "PS";
-				public const string PTOConsumer = "PTO_CONSUM";
-			}
-
-			public static class Names
-			{
-				public const string Fan = "Fan";
-				public const string SteeringPump = "Steering pump";
-				public const string ElectricSystem = "Electric System";
-				public const string HeatingVentilationAirCondition = "HVAC";
-				public const string PneumaticSystem = "Pneumatic System";
-			}
-		}
-
-		public static class FileExtensions
-		{
-			public const string PDFReport = ".pdf";
-			public const string ModDataFile = ".vmod";
-
-			public const string SumFile = ".vsum";
-
-			public const string VectoJobFile = ".vecto";
-
-			public const string VectoXMLDeclarationFile = ".xml";
-
-			public const string EngineDataFile = ".veng";
-
-			public const string VehicleDataFile = ".vveh";
-
-			public const string GearboxDataFile = ".vgbx";
-
-			public const string CycleFile = ".vdri";
-
-			public const string DriverAccelerationCurve = ".vacc";
-		}
-
-		public static class SimulationSettings
-		{
-			/// <summary>
-			/// base time interval for the simulation. the distance is estimated to reach this time interval as good as possible
-			/// </summary>
-			public static readonly Second TargetTimeInterval = 0.5.SI<Second>();
-
-			/// <summary>
-			/// maximum time interval for the simulation in measured speed mode.
-			/// </summary>
-			public static readonly Second MeasuredSpeedTargetTimeInterval = 1.SI<Second>();
-
-			/// <summary>
-			/// The lower time bound before braking is initiated.
-			/// </summary>
-			public static readonly Second LowerBoundTimeInterval = 0.25.SI<Second>();
-
-			/// <summary>
-			/// simulation interval if the vehicle stands still
-			/// </summary>
-			public static readonly Meter DriveOffDistance = 0.25.SI<Meter>();
-
-			public static readonly Meter BrakeNextTargetDistance = 2.5.SI<Meter>();
-
-			public static readonly MeterPerSecond MinVelocityForCoast = 5.KMPHtoMeterPerSecond();
-
-			/// <summary>
-			/// threshold for changes in the road gradient. changes below this threshold will be considered to be equal for filtering out the driving cycle.
-			/// altitude computation is done before filtering! 
-			/// </summary>
-			public static readonly Radian DrivingCycleRoadGradientTolerance = 1E-12.SI<Radian>();
-
-			/// <summary>
-			/// Tolerance for searching operating point with line search.
-			/// </summary>
-			public const double LineSearchTolerance = 0.5;
-
-			/// <summary>
-			/// Tolerance for searching operating point with interpolating search.
-			/// </summary>
-			public const double InterpolateSearchTolerance = 1e-3;
-
-			public const double ClutchClosingSpeedNorm = 0.065;
-
-			public static readonly MeterPerSecond ClutchDisengageWhenHaltingSpeed = 10.KMPHtoMeterPerSecond();
-
-			public static readonly MeterPerSecond ATGearboxDisengageWhenHaltingSpeed = 5.KMPHtoMeterPerSecond();
-
-			public static readonly Meter DriverActionDistanceTolerance = 0.25.SI<Meter>();
-
-			public static readonly MeterPerSecond VehicleSpeedHaltTolerance = 1e-3.SI<MeterPerSecond>();
-
-			/// <summary>
-			/// The initial search interval for the operating point search in the driver.
-			/// </summary>
-			public static readonly MeterPerSquareSecond OperatingPointInitialSearchIntervalAccelerating =
-				0.1.SI<MeterPerSquareSecond>();
-
-			public static readonly PerSecond EngineIdlingSearchInterval = 10.SI<PerSecond>();
-
-			public const int MaximumIterationCountForSimulationStep = 30;
-
-			public static readonly Meter GearboxLookaheadForAccelerationEstimation = 100.SI<Meter>();
-
-			public static readonly Kilogram MaximumGrossVehicleWeight = 40000.SI<Kilogram>();
-			public static readonly Kilogram MaximumGrossVehicleWeightEMS = 60000.SI<Kilogram>();
-		}
-
-		public static class XML
-		{
-			public const string XSDDeclarationVersion = "1.0";
-			public const string XSDEngineeringVersion = "0.7";
-
-			public const string DeclarationNSPrefix = "vdd";
-
-			public const string EngineeringNSPrefix = "ved";
-
-			public const string RootNSPrefix = "tns";
-
-			public const string VectoDeclarationDefinitionsNS =
-				"urn:tugraz:ivt:VectoAPI:DeclarationDefinitions:v" + XSDDeclarationVersion;
-
-			public const string VectoEngineeringDefinitionsNS =
-				"urn:tugraz:ivt:VectoAPI:EngineeringDefinitions:v" + XSDEngineeringVersion;
-
-			public const string VectoDeclarationInputNS = "urn:tugraz:ivt:VectoAPI:DeclarationInput:v" + XSDDeclarationVersion;
-
-			public const string VectoEngineeringInputNS = "urn:tugraz:ivt:VectoAPI:EngineeringInput:v" + XSDEngineeringVersion;
-		}
-	}
+		public const double RPMToRad = 2 * Math.PI / 60;
+		public const double Kilo = 1000;
+		public const double MeterPerSecondToKMH = 3.6;
+
+		public static class Auxiliaries
+		{
+			public const string Cycle = "cycle";
+			public const string Prefix = "AUX_";
+			public const string PowerPrefix = "P_";
+
+			public static class IDs
+			{
+				public static string PTOTransmission = "PTO_TRANSM";
+				public const string Fan = "FAN";
+				public const string SteeringPump = "STP";
+				public const string ElectricSystem = "ES";
+				public const string HeatingVentilationAirCondition = "AC";
+				public const string PneumaticSystem = "PS";
+				public const string PTOConsumer = "PTO_CONSUM";
+			}
+
+			public static class Names
+			{
+				public const string Fan = "Fan";
+				public const string SteeringPump = "Steering pump";
+				public const string ElectricSystem = "Electric System";
+				public const string HeatingVentilationAirCondition = "HVAC";
+				public const string PneumaticSystem = "Pneumatic System";
+			}
+		}
+
+		public static class FileExtensions
+		{
+			public const string PDFReport = ".pdf";
+			public const string ModDataFile = ".vmod";
+
+			public const string SumFile = ".vsum";
+
+			public const string VectoJobFile = ".vecto";
+
+			public const string VectoXMLDeclarationFile = ".xml";
+
+			public const string EngineDataFile = ".veng";
+
+			public const string VehicleDataFile = ".vveh";
+
+			public const string GearboxDataFile = ".vgbx";
+
+			public const string CycleFile = ".vdri";
+
+			public const string DriverAccelerationCurve = ".vacc";
+		}
+
+		public static class SimulationSettings
+		{
+			/// <summary>
+			/// base time interval for the simulation. the distance is estimated to reach this time interval as good as possible
+			/// </summary>
+			public static readonly Second TargetTimeInterval = 0.5.SI<Second>();
+
+			/// <summary>
+			/// maximum time interval for the simulation in measured speed mode.
+			/// </summary>
+			public static readonly Second MeasuredSpeedTargetTimeInterval = 1.SI<Second>();
+
+			/// <summary>
+			/// The lower time bound before braking is initiated.
+			/// </summary>
+			public static readonly Second LowerBoundTimeInterval = 0.25.SI<Second>();
+
+			/// <summary>
+			/// simulation interval if the vehicle stands still
+			/// </summary>
+			public static readonly Meter DriveOffDistance = 0.25.SI<Meter>();
+
+			public static readonly Meter BrakeNextTargetDistance = 2.5.SI<Meter>();
+
+			public static readonly MeterPerSecond MinVelocityForCoast = 5.KMPHtoMeterPerSecond();
+
+			/// <summary>
+			/// threshold for changes in the road gradient. changes below this threshold will be considered to be equal for filtering out the driving cycle.
+			/// altitude computation is done before filtering! 
+			/// </summary>
+			public static readonly Radian DrivingCycleRoadGradientTolerance = 1E-12.SI<Radian>();
+
+			/// <summary>
+			/// Tolerance for searching operating point with line search.
+			/// </summary>
+			public const double LineSearchTolerance = 0.5;
+
+			/// <summary>
+			/// Tolerance for searching operating point with interpolating search.
+			/// </summary>
+			public const double InterpolateSearchTolerance = 1e-3;
+
+			public const double ClutchClosingSpeedNorm = 0.065;
+
+			public static readonly MeterPerSecond ClutchDisengageWhenHaltingSpeed = 10.KMPHtoMeterPerSecond();
+
+			public static readonly MeterPerSecond ATGearboxDisengageWhenHaltingSpeed = 5.KMPHtoMeterPerSecond();
+
+			public static readonly Meter DriverActionDistanceTolerance = 0.25.SI<Meter>();
+
+			public static readonly MeterPerSecond VehicleSpeedHaltTolerance = 1e-3.SI<MeterPerSecond>();
+
+			/// <summary>
+			/// The initial search interval for the operating point search in the driver.
+			/// </summary>
+			public static readonly MeterPerSquareSecond OperatingPointInitialSearchIntervalAccelerating =
+				0.1.SI<MeterPerSquareSecond>();
+
+			public static readonly PerSecond EngineIdlingSearchInterval = 10.SI<PerSecond>();
+
+			public const int MaximumIterationCountForSimulationStep = 30;
+
+			public static readonly Meter GearboxLookaheadForAccelerationEstimation = 100.SI<Meter>();
+
+			public static readonly Kilogram MaximumGrossVehicleWeight = 40000.SI<Kilogram>();
+			public static readonly Kilogram MaximumGrossVehicleWeightEMS = 60000.SI<Kilogram>();
+		}
+
+		public static class XML
+		{
+			public const string XSDDeclarationVersion = "1.0";
+			public const string XSDEngineeringVersion = "0.7";
+
+			public const string DeclarationNSPrefix = "vdd";
+
+			public const string EngineeringNSPrefix = "ved";
+
+			public const string RootNSPrefix = "tns";
+
+			public const string VectoDeclarationDefinitionsNS =
+				"urn:tugraz:ivt:VectoAPI:DeclarationDefinitions:v" + XSDDeclarationVersion;
+
+			public const string VectoEngineeringDefinitionsNS =
+				"urn:tugraz:ivt:VectoAPI:EngineeringDefinitions:v" + XSDEngineeringVersion;
+
+			public const string VectoDeclarationInputNS = "urn:tugraz:ivt:VectoAPI:DeclarationInput:v" + XSDDeclarationVersion;
+
+			public const string VectoEngineeringInputNS = "urn:tugraz:ivt:VectoAPI:EngineeringInput:v" + XSDEngineeringVersion;
+		}
+	}
 }
\ No newline at end of file
diff --git a/VectoCore/VectoCore/InputData/FileIO/JSON/JSONInputData.cs b/VectoCore/VectoCore/InputData/FileIO/JSON/JSONInputData.cs
index b6b2f19eb55689a195e71e0aef3f912f0574eb1d..19d015b541a80c3718189125ec065210c939c25f 100644
--- a/VectoCore/VectoCore/InputData/FileIO/JSON/JSONInputData.cs
+++ b/VectoCore/VectoCore/InputData/FileIO/JSON/JSONInputData.cs
@@ -29,647 +29,679 @@
 *   Martin Rexeis, rexeis@ivt.tugraz.at, IVT, Graz University of Technology
 */
 
-using Newtonsoft.Json.Linq;
-using System;
-using System.Collections.Generic;
-using System.IO;
-using System.Linq;
-using System.Xml.Linq;
-using TUGraz.VectoCommon.Exceptions;
-using TUGraz.VectoCommon.InputData;
-using TUGraz.VectoCommon.Models;
-using TUGraz.VectoCommon.Utils;
-using TUGraz.VectoCore.Configuration;
-using TUGraz.VectoCore.InputData.Impl;
-using TUGraz.VectoCore.Models.Declaration;
-using TUGraz.VectoCore.Models.SimulationComponent.Data;
-using TUGraz.VectoCore.Utils;
-
-namespace TUGraz.VectoCore.InputData.FileIO.JSON
-{
-	public abstract class JSONFile : LoggingObject
-	{
-		public const string MissingFileSuffix = "   -- (MISSING!)";
-
-		private readonly string _sourceFile;
-
-		protected readonly JObject Body;
-
-		protected JSONFile(JObject data, string filename, bool tolerateMissing = false)
-		{
-			//var header = (JObject)data.GetEx(JsonKeys.JsonHeader);
-			Body = (JObject)data.GetEx(JsonKeys.JsonBody);
-			_sourceFile = Path.GetFullPath(filename);
-			TolerateMissing = tolerateMissing;
-		}
-
-		protected bool TolerateMissing { get; set; }
-
-		public DataSourceType SourceType
-		{
-			get { return DataSourceType.JSONFile; }
-		}
-
-		public string Source
-		{
-			get { return _sourceFile; }
-		}
-
-		public bool SavedInDeclarationMode
-		{
-			get { return Body.GetEx(JsonKeys.SavedInDeclMode).Value<bool>(); }
-		}
-
-		internal string BasePath
-		{
-			get { return Path.GetDirectoryName(_sourceFile); }
-		}
-
-		protected TableData ReadTableData(string filename, string tableType, bool required = true)
-		{
-			if (!EmptyOrInvalidFileName(filename) && File.Exists(Path.Combine(BasePath, filename))) {
-				try {
-					return VectoCSVFile.Read(Path.Combine(BasePath, filename), true);
-				} catch (Exception e) {
-					Log.Warn("Failed to read file {0} {1}", Path.Combine(BasePath, filename), tableType);
-					throw new VectoException("Failed to read file for {0}: {1}", e, tableType, filename);
-				}
-			}
-			if (required) {
-				throw new VectoException("Invalid filename for {0}: {1}", tableType, filename);
-			}
-			return null;
-		}
-
-		internal static bool EmptyOrInvalidFileName(string filename)
-		{
-			return filename == null || !filename.Any() ||
-					filename.Equals("<NOFILE>", StringComparison.InvariantCultureIgnoreCase)
-					|| filename.Equals("-");
-		}
-
-		public static JObject GetDummyJSONStructure()
-		{
-			return JObject.FromObject(new Dictionary<string, object>() {
-				{ JsonKeys.JsonHeader, new object() },
-				{ JsonKeys.JsonBody, new object() }
-			});
-		}
-	}
-
-	/// <summary>
-	/// Class for reading json data of vecto-job-file.
-	/// Fileformat: .vecto
-	/// </summary>
-	public class JSONInputDataV2 : JSONFile, IEngineeringInputDataProvider, IDeclarationInputDataProvider,
-		IEngineeringJobInputData, IDriverEngineeringInputData, IAuxiliariesEngineeringInputData,
-		IAuxiliariesDeclarationInputData
-	{
-		protected readonly IGearboxEngineeringInputData Gearbox;
-		protected readonly IAxleGearInputData AxleGear;
-		protected readonly ITorqueConverterEngineeringInputData TorqueConverter;
-		protected readonly IAngledriveInputData Angledrive;
-		protected readonly IEngineEngineeringInputData Engine;
-		protected readonly IVehicleEngineeringInputData VehicleData;
-		protected readonly IRetarderInputData Retarder;
-		protected readonly IPTOTransmissionInputData PTOTransmission;
-
-		private readonly string _jobname;
-		protected internal IAirdragEngineeringInputData AirdragData;
-
-		public JSONInputDataV2(JObject data, string filename, bool tolerateMissing = false)
-			: base(data, filename, tolerateMissing)
-		{
-			_jobname = Path.GetFileNameWithoutExtension(filename);
-
-			Engine = ReadEngine();
-
-			if (Body.GetEx(JsonKeys.Job_EngineOnlyMode).Value<bool>()) {
-				return;
-			}
-
-			Gearbox = ReadGearbox();
-			AxleGear = Gearbox as IAxleGearInputData;
-			TorqueConverter = Gearbox as ITorqueConverterEngineeringInputData;
-
-			VehicleData = ReadVehicle();
-			Angledrive = VehicleData as IAngledriveInputData;
-			Retarder = VehicleData as IRetarderInputData;
-			PTOTransmission = VehicleData as IPTOTransmissionInputData;
-			AirdragData = VehicleData as IAirdragEngineeringInputData;
-		}
-
-		private IVehicleEngineeringInputData ReadVehicle()
-		{
-			try {
-				var vehicleFile = Body.GetEx(JsonKeys.Vehicle_VehicleFile).Value<string>();
-				return JSONInputDataFactory.ReadJsonVehicle(
-					Path.Combine(BasePath, vehicleFile));
-			} catch (Exception e) {
-				if (!TolerateMissing) {
-					throw new VectoException("JobFile: Failed to read Vehicle file '{0}': {1}", e, Body[JsonKeys.Vehicle_VehicleFile],
-						e.Message);
-				}
-				return new JSONVehicleDataV7(GetDummyJSONStructure(),
-					Path.Combine(BasePath, Body.GetEx(JsonKeys.Vehicle_VehicleFile).Value<string>()) + MissingFileSuffix);
-			}
-		}
-
-		private IGearboxEngineeringInputData ReadGearbox()
-		{
-			try {
-				var gearboxFile = Body.GetEx(JsonKeys.Vehicle_GearboxFile).Value<string>();
-
-				return JSONInputDataFactory.ReadGearbox(Path.Combine(BasePath, gearboxFile));
-			} catch (Exception e) {
-				if (!TolerateMissing) {
-					throw new VectoException("JobFile: Failed to read Gearbox file '{0}': {1}", e, Body[JsonKeys.Vehicle_GearboxFile],
-						e.Message);
-				}
-				return new JSONGearboxDataV6(GetDummyJSONStructure(),
-					Path.Combine(BasePath, Body.GetEx(JsonKeys.Vehicle_GearboxFile).Value<string>()) + MissingFileSuffix);
-			}
-		}
-
-		private IEngineEngineeringInputData ReadEngine()
-		{
-			try {
-				return JSONInputDataFactory.ReadEngine(
-					Path.Combine(BasePath, Body.GetEx(JsonKeys.Vehicle_EngineFile).Value<string>()));
-			} catch (Exception e) {
-				if (!TolerateMissing) {
-					throw new VectoException("JobFile: Failed to read Engine file '{0}': {1}", e, Body[JsonKeys.Vehicle_EngineFile],
-						e.Message);
-				}
-				//JToken.FromObject(New Dictionary(Of String, Object) From {{"Header", header}, {"Body", body}})
-				return
-					new JSONEngineDataV3(GetDummyJSONStructure(),
-						Path.Combine(BasePath, Body.GetEx(JsonKeys.Vehicle_EngineFile).Value<string>()) + MissingFileSuffix);
-			}
-		}
-
-		#region IInputDataProvider
-
-		public virtual IEngineeringJobInputData JobInputData()
-		{
-			return this;
-		}
-
-		IVehicleDeclarationInputData IDeclarationInputDataProvider.VehicleInputData
-		{
-			get { return VehicleInputData; }
-		}
-
-		IAirdragDeclarationInputData IDeclarationInputDataProvider.AirdragInputData
-		{
-			get { return AirdragInputData; }
-		}
-
-		public IAirdragEngineeringInputData AirdragInputData
-		{
-			get { return AirdragData; }
-		}
-
-		IGearboxDeclarationInputData IDeclarationInputDataProvider.GearboxInputData
-		{
-			get { return GearboxInputData; }
-		}
-
-		ITorqueConverterDeclarationInputData IDeclarationInputDataProvider.TorqueConverterInputData
-		{
-			get { return TorqueConverterInputData; }
-		}
-
-		public ITorqueConverterEngineeringInputData TorqueConverterInputData
-		{
-			get {
-				if (TorqueConverter == null) {
-					throw new InvalidFileFormatException("TorqueConverterData not found");
-				}
-				return TorqueConverter;
-			}
-		}
-
-		IDeclarationJobInputData IDeclarationInputDataProvider.JobInputData()
-		{
-			return JobInputData();
-		}
-
-		public virtual IVehicleEngineeringInputData VehicleInputData
-		{
-			[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design",
-				"CA1065:DoNotRaiseExceptionsInUnexpectedLocations")]
-			get {
-				if (VehicleData == null) {
-					throw new InvalidFileFormatException("VehicleData not found ");
-				}
-				return VehicleData;
-			}
-		}
-
-		public virtual IGearboxEngineeringInputData GearboxInputData
-		{
-			[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design",
-				"CA1065:DoNotRaiseExceptionsInUnexpectedLocations")]
-			get {
-				if (Gearbox == null) {
-					throw new InvalidFileFormatException("GearboxData not found");
-				}
-				return Gearbox;
-			}
-		}
-
-		public virtual IAxleGearInputData AxleGearInputData
-		{
-			[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design",
-				"CA1065:DoNotRaiseExceptionsInUnexpectedLocations")]
-			get {
-				if (AxleGear == null) {
-					throw new InvalidFileFormatException("AxleGearData not found");
-				}
-				return AxleGear;
-			}
-		}
-
-		public IAngledriveInputData AngledriveInputData
-		{
-			get { return Angledrive; }
-		}
-
-		IEngineDeclarationInputData IDeclarationInputDataProvider.EngineInputData
-		{
-			get { return EngineInputData; }
-		}
-
-		public virtual IEngineEngineeringInputData EngineInputData
-		{
-			[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design",
-				"CA1065:DoNotRaiseExceptionsInUnexpectedLocations")]
-			get {
-				if (Engine == null) {
-					throw new InvalidFileFormatException("EngineData not found");
-				}
-				return Engine;
-			}
-		}
-
-		public virtual IAuxiliariesEngineeringInputData AuxiliaryInputData()
-		{
-			return this;
-		}
-
-		IDriverEngineeringInputData IEngineeringInputDataProvider.DriverInputData
-		{
-			get { return this; }
-		}
-
-		public IPTOTransmissionInputData PTOTransmissionInputData
-		{
-			get { return PTOTransmission; }
-		}
-
-		public XElement XMLHash
-		{
-			get { return null; }
-		}
-
-		IAuxiliariesDeclarationInputData IDeclarationInputDataProvider.AuxiliaryInputData()
-		{
-			return this;
-		}
-
-		public virtual IRetarderInputData RetarderInputData
-		{
-			[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design",
-				"CA1065:DoNotRaiseExceptionsInUnexpectedLocations")]
-			get {
-				if (Retarder == null) {
-					throw new InvalidFileFormatException("RetarderData not found");
-				}
-				return Retarder;
-			}
-		}
-
-		public virtual IDriverDeclarationInputData DriverInputData
-		{
-			get { return this; }
-		}
-
-		#endregion
-
-		#region IJobInputData
-
-		public virtual IVehicleEngineeringInputData Vehicle
-		{
-			get { return VehicleData; }
-		}
-
-		public virtual IList<ICycleData> Cycles
-		{
-			[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design",
-				"CA1065:DoNotRaiseExceptionsInUnexpectedLocations")]
-			get {
-				var retVal = new List<ICycleData>();
-				if (Body[JsonKeys.Job_Cycles] == null) {
-					return retVal;
-				}
-				foreach (var cycle in Body.GetEx(JsonKeys.Job_Cycles)) {
-					//.Select(cycle => 
-					var cycleFile = Path.Combine(BasePath, cycle.Value<string>());
-					TableData cycleData;
-					if (File.Exists(cycleFile)) {
-						cycleData = VectoCSVFile.Read(cycleFile);
-					} else {
-						try {
-							var resourceName = DeclarationData.DeclarationDataResourcePrefix + ".MissionCycles." +
-												cycle.Value<string>() + Constants.FileExtensions.CycleFile;
-							cycleData = VectoCSVFile.ReadStream(RessourceHelper.ReadStream(resourceName), source: resourceName);
-						} catch (Exception e) {
-							Log.Debug("Driving Cycle could not be read: " + cycleFile);
-							if (!TolerateMissing) {
-								throw new VectoException("Driving Cycle could not be read: " + cycleFile, e);
-							}
-							cycleData = new TableData(cycleFile + MissingFileSuffix, DataSourceType.Missing);
-						}
-					}
-					retVal.Add(new CycleInputData() {
-						Name = Path.GetFileNameWithoutExtension(cycle.Value<string>()),
-						CycleData = cycleData
-					});
-				}
-				return retVal;
-			}
-		}
-
-		public virtual bool EngineOnlyMode
-		{
-			get { return Body.GetEx(JsonKeys.Job_EngineOnlyMode).Value<bool>(); }
-		}
-
-		IVehicleDeclarationInputData IDeclarationJobInputData.Vehicle
-		{
-			get { return Vehicle; }
-		}
-
-		public virtual string JobName
-		{
-			get { return _jobname; }
-		}
-
-		#endregion
-
-		#region DriverInputData
-
-		IOverSpeedEcoRollDeclarationInputData IDriverDeclarationInputData.OverSpeedEcoRoll
-		{
-			get {
-				var overspeed = Body.GetEx(JsonKeys.DriverData_OverspeedEcoRoll);
-				return new OverSpeedEcoRollInputData() {
-					Mode = DriverData.ParseDriverMode(overspeed.GetEx<string>(JsonKeys.DriverData_OverspeedEcoRoll_Mode))
-				};
-			}
-		}
-
-		public virtual ILookaheadCoastingInputData Lookahead
-		{
-			get {
-				if (Body[JsonKeys.DriverData_LookaheadCoasting] == null) {
-					return null;
-				}
-
-				var lac = Body.GetEx(JsonKeys.DriverData_LookaheadCoasting);
-				var distanceScalingFactor = lac["PreviewDistanceFactor"] != null
-					? lac.GetEx<double>("PreviewDistanceFactor")
-					: DeclarationData.Driver.LookAhead.LookAheadDistanceFactor;
-				var lacDfOffset = lac["DF_offset"] != null
-					? lac.GetEx<double>("DF_offset")
-					: DeclarationData.Driver.LookAhead.DecisionFactorCoastingOffset;
-				var lacDfScaling = lac["DF_scaling"] != null
-					? lac.GetEx<double>("DF_scaling")
-					: DeclarationData.Driver.LookAhead.DecisionFactorCoastingScaling;
-				TableData speedDependentLookup = null;
-				if (lac["DF_targetSpeedLookup"] != null && !string.IsNullOrWhiteSpace(lac["DF_targetSpeedLookup"].Value<string>())) {
-					try {
-						speedDependentLookup = ReadTableData(lac.GetEx<string>("DF_targetSpeedLookup"),
-							"Lookahead Coasting Decisionfactor - Target speed");
-					} catch (Exception) {
-						if (TolerateMissing) {
-							speedDependentLookup =
-								new TableData(Path.Combine(BasePath, lac["DF_targetSpeedLookup"].Value<string>()) + MissingFileSuffix,
-									DataSourceType.Missing);
-						}
-					}
-				}
-				TableData velocityDropLookup = null;
-				if (lac["Df_velocityDropLookup"] != null && !string.IsNullOrWhiteSpace(lac["Df_velocityDropLookup"].Value<string>())) {
-					try {
-						velocityDropLookup = ReadTableData(lac.GetEx<string>("Df_velocityDropLookup"),
-							"Lookahead Coasting Decisionfactor - Velocity drop");
-					} catch (Exception) {
-						if (TolerateMissing) {
-							velocityDropLookup =
-								new TableData(Path.Combine(BasePath, lac["Df_velocityDropLookup"].Value<string>()) + MissingFileSuffix,
-									DataSourceType.Missing);
-						}
-					}
-				}
-				var minSpeed = lac["MinSpeed"] != null
-					? lac.GetEx<double>(JsonKeys.DriverData_Lookahead_MinSpeed).KMPHtoMeterPerSecond()
-					: DeclarationData.Driver.LookAhead.MinimumSpeed;
-				return new LookAheadCoastingInputData() {
-					Enabled = lac.GetEx<bool>(JsonKeys.DriverData_Lookahead_Enabled),
-					//Deceleration = lac.GetEx<double>(JsonKeys.DriverData_Lookahead_Deceleration).SI<MeterPerSquareSecond>(),
-					MinSpeed = minSpeed,
-					LookaheadDistanceFactor = distanceScalingFactor,
-					CoastingDecisionFactorOffset = lacDfOffset,
-					CoastingDecisionFactorScaling = lacDfScaling,
-					CoastingDecisionFactorTargetSpeedLookup = speedDependentLookup,
-					CoastingDecisionFactorVelocityDropLookup = velocityDropLookup
-				};
-			}
-		}
-
-		public virtual IOverSpeedEcoRollEngineeringInputData OverSpeedEcoRoll
-		{
-			get {
-				var overspeed = Body.GetEx(JsonKeys.DriverData_OverspeedEcoRoll);
-				return new OverSpeedEcoRollInputData() {
-					Mode = DriverData.ParseDriverMode(overspeed.GetEx<string>(JsonKeys.DriverData_OverspeedEcoRoll_Mode)),
-					MinSpeed = overspeed.GetEx<double>(JsonKeys.DriverData_OverspeedEcoRoll_MinSpeed).KMPHtoMeterPerSecond(),
-					OverSpeed = overspeed.GetEx<double>(JsonKeys.DriverData_OverspeedEcoRoll_OverSpeed).KMPHtoMeterPerSecond(),
-					UnderSpeed =
-						overspeed.GetEx<double>(JsonKeys.DriverData_OverspeedEcoRoll_UnderSpeed).KMPHtoMeterPerSecond()
-				};
-			}
-		}
-
-		public virtual TableData AccelerationCurve
-		{
-			[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design",
-				"CA1065:DoNotRaiseExceptionsInUnexpectedLocations")]
-			get {
-				var acceleration = Body[JsonKeys.DriverData_AccelerationCurve];
-				if (acceleration == null || EmptyOrInvalidFileName(acceleration.Value<string>())) {
-					return null;
-					//					throw new VectoException("AccelerationCurve (VACC) required");
-				}
-				try {
-					return ReadTableData(acceleration.Value<string>(), "DriverAccelerationCurve");
-				} catch (VectoException e) {
-					Log.Warn("Could not find file for acceleration curve. Trying lookup in declaration data.");
-					try {
-						var resourceName = DeclarationData.DeclarationDataResourcePrefix + ".VACC." +
-											acceleration.Value<string>() +
-											Constants.FileExtensions.DriverAccelerationCurve;
-						return VectoCSVFile.ReadStream(RessourceHelper.ReadStream(resourceName), source: resourceName);
-					} catch (Exception) {
-						if (!TolerateMissing) {
-							throw new VectoException("Failed to read Driver Acceleration Curve: " + e.Message, e);
-						}
-						return new TableData(Path.Combine(BasePath, acceleration.Value<string>()) + MissingFileSuffix,
-							DataSourceType.Missing);
-					}
-				}
-			}
-		}
-
-		#endregion
-
-		#region IAuxiliariesEngineeringInputData
-
-		IList<IAuxiliaryEngineeringInputData> IAuxiliariesEngineeringInputData.Auxiliaries
-		{
-			get { return AuxData().Cast<IAuxiliaryEngineeringInputData>().ToList(); }
-		}
-
-		IList<IAuxiliaryDeclarationInputData> IAuxiliariesDeclarationInputData.Auxiliaries
-		{
-			get { return AuxData().Cast<IAuxiliaryDeclarationInputData>().ToList(); }
-		}
-
-		protected virtual IList<AuxiliaryDataInputData> AuxData()
-		{
-			var retVal = new List<AuxiliaryDataInputData>();
-			foreach (var aux in Body["Aux"] ?? Enumerable.Empty<JToken>()) {
-				var type = AuxiliaryTypeHelper.Parse(aux.GetEx<string>("Type"));
-
-				var auxData = new AuxiliaryDataInputData {
-					ID = aux.GetEx<string>("ID"),
-					Type = type,
-					Technology = new List<string>(),
-				};
-				var tech = aux.GetEx<string>("Technology");
-
-				if (auxData.Type == AuxiliaryType.ElectricSystem) {
-					if (aux["TechList"] == null || aux["TechList"].Any()) {
-						auxData.Technology.Add("Standard technology");
-					} else {
-						auxData.Technology.Add("Standard technology - LED headlights, all");
-					}
-				}
-
-				if (auxData.Type == AuxiliaryType.SteeringPump) {
-					auxData.Technology.Add(tech);
-				}
-
-				if (auxData.Type == AuxiliaryType.Fan) {
-					switch (tech) {
-						case "Crankshaft mounted - Electronically controlled visco clutch (Default)":
-							auxData.Technology.Add("Crankshaft mounted - Electronically controlled visco clutch");
-							break;
-						case "Crankshaft mounted - On/Off clutch":
-							auxData.Technology.Add("Crankshaft mounted - On/off clutch");
-							break;
-						case "Belt driven or driven via transm. - On/Off clutch":
-							auxData.Technology.Add("Belt driven or driven via transm. - On/off clutch");
-							break;
-						default:
-							auxData.Technology.Add(tech);
-							break;
-					}
-				}
-
-				var auxFile = aux["Path"];
-				retVal.Add(auxData);
-
-				if (auxFile == null || EmptyOrInvalidFileName(auxFile.Value<string>())) {
-					continue;
-				}
-
-				AuxiliaryFileHelper.FillAuxiliaryDataInputData(auxData, Path.Combine(BasePath, auxFile.Value<string>()));
-			}
-			return retVal;
-		}
-
-		#endregion
-
-		#region AdvancedAuxiliaries
-
-		public AuxiliaryModel AuxiliaryAssembly
-		{
-			get {
-				return AuxiliaryModelHelper.Parse(Body["AuxiliaryAssembly"] == null ? "" : Body["AuxiliaryAssembly"].ToString());
-			}
-		}
-
-		public string AuxiliaryVersion
-		{
-			get { return Body["AuxiliaryVersion"] != null ? Body["AuxiliaryVersion"].Value<string>() : "<CLASSIC>"; }
-		}
-
-		public string AdvancedAuxiliaryFilePath
-		{
-			get {
-				return Body["AdvancedAuxiliaryFilePath"] != null
-					? Path.Combine(Path.GetFullPath(BasePath), Body["AdvancedAuxiliaryFilePath"].Value<string>())
-					: "";
-			}
-		}
-
-		#endregion
-	}
-
-	public class JSONInputDataV3 : JSONInputDataV2
-	{
-		public JSONInputDataV3(JObject data, string filename, bool tolerateMissing = false)
-			: base(data, filename, tolerateMissing) {}
-
-		protected override IList<AuxiliaryDataInputData> AuxData()
-		{
-			var retVal = new List<AuxiliaryDataInputData>();
-			if (Body["Padd"] != null) {
-				retVal.Add(new AuxiliaryDataInputData() {
-					ID = "ConstantAux",
-					AuxiliaryType = AuxiliaryDemandType.Constant,
-					ConstantPowerDemand = Body.GetEx<double>("Padd").SI<Watt>()
-				});
-			}
-			foreach (var aux in Body["Aux"] ?? Enumerable.Empty<JToken>()) {
-				try {
-					aux.GetEx("Technology").ToObject<List<string>>();
-				} catch (Exception) {
-					throw new VectoException(
-						"Aux: Technology for aux '{0}' list could not be read. Maybe it is a single string instead of a list of strings?",
-						aux.GetEx<string>("ID"));
-				}
-
-				var type = AuxiliaryTypeHelper.Parse(aux.GetEx<string>("Type"));
-
-				var auxData = new AuxiliaryDataInputData {
-					ID = aux.GetEx<string>("ID"),
-					Type = type,
-					Technology = aux.GetEx("Technology").ToObject<List<string>>()
-				};
-
-				var auxFile = aux["Path"];
-				retVal.Add(auxData);
-
-				if (auxFile == null || EmptyOrInvalidFileName(auxFile.Value<string>())) {
-					continue;
-				}
-				AuxiliaryFileHelper.FillAuxiliaryDataInputData(auxData, Path.Combine(BasePath, auxFile.Value<string>()));
-			}
-			return retVal;
-		}
-	}
+using Newtonsoft.Json.Linq;
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Xml.Linq;
+using TUGraz.VectoCommon.Exceptions;
+using TUGraz.VectoCommon.InputData;
+using TUGraz.VectoCommon.Models;
+using TUGraz.VectoCommon.Utils;
+using TUGraz.VectoCore.Configuration;
+using TUGraz.VectoCore.InputData.Impl;
+using TUGraz.VectoCore.Models.Declaration;
+using TUGraz.VectoCore.Models.SimulationComponent.Data;
+using TUGraz.VectoCore.Utils;
+
+namespace TUGraz.VectoCore.InputData.FileIO.JSON
+{
+	public abstract class JSONFile : LoggingObject
+	{
+		public const string MissingFileSuffix = "   -- (MISSING!)";
+
+		private readonly string _sourceFile;
+
+		protected readonly JObject Body;
+
+		protected JSONFile(JObject data, string filename, bool tolerateMissing = false)
+		{
+			//var header = (JObject)data.GetEx(JsonKeys.JsonHeader);
+			Body = (JObject)data.GetEx(JsonKeys.JsonBody);
+			_sourceFile = Path.GetFullPath(filename);
+			TolerateMissing = tolerateMissing;
+		}
+
+		protected bool TolerateMissing { get; set; }
+
+		public DataSourceType SourceType
+		{
+			get { return DataSourceType.JSONFile; }
+		}
+
+		public string Source
+		{
+			get { return _sourceFile; }
+		}
+
+		public bool SavedInDeclarationMode
+		{
+			get { return Body.GetEx(JsonKeys.SavedInDeclMode).Value<bool>(); }
+		}
+
+		internal string BasePath
+		{
+			get { return Path.GetDirectoryName(_sourceFile); }
+		}
+
+		protected TableData ReadTableData(string filename, string tableType, bool required = true)
+		{
+			if (!EmptyOrInvalidFileName(filename) && File.Exists(Path.Combine(BasePath, filename))) {
+				try {
+					return VectoCSVFile.Read(Path.Combine(BasePath, filename), true);
+				} catch (Exception e) {
+					Log.Warn("Failed to read file {0} {1}", Path.Combine(BasePath, filename), tableType);
+					throw new VectoException("Failed to read file for {0}: {1}", e, tableType, filename);
+				}
+			}
+			if (required) {
+				throw new VectoException("Invalid filename for {0}: {1}", tableType, filename);
+			}
+			return null;
+		}
+
+		internal static bool EmptyOrInvalidFileName(string filename)
+		{
+			return filename == null || !filename.Any() ||
+					filename.Equals("<NOFILE>", StringComparison.InvariantCultureIgnoreCase)
+					|| filename.Equals("-");
+		}
+
+		public static JObject GetDummyJSONStructure()
+		{
+			return JObject.FromObject(new Dictionary<string, object>() {
+				{ JsonKeys.JsonHeader, new object() },
+				{ JsonKeys.JsonBody, new object() }
+			});
+		}
+	}
+
+	/// <summary>
+	/// Class for reading json data of vecto-job-file.
+	/// Fileformat: .vecto
+	/// </summary>
+	public class JSONInputDataV2 : JSONFile, IEngineeringInputDataProvider, IDeclarationInputDataProvider,
+		IEngineeringJobInputData, IDriverEngineeringInputData, IAuxiliariesEngineeringInputData,
+		IAuxiliariesDeclarationInputData
+	{
+		protected readonly IGearboxEngineeringInputData Gearbox;
+		protected readonly IAxleGearInputData AxleGear;
+		protected readonly ITorqueConverterEngineeringInputData TorqueConverter;
+		protected readonly IAngledriveInputData Angledrive;
+		protected readonly IEngineEngineeringInputData Engine;
+		protected readonly IVehicleEngineeringInputData VehicleData;
+		protected readonly IRetarderInputData Retarder;
+		protected readonly IPTOTransmissionInputData PTOTransmission;
+
+		private readonly string _jobname;
+		protected internal IAirdragEngineeringInputData AirdragData;
+
+		public JSONInputDataV2(JObject data, string filename, bool tolerateMissing = false)
+			: base(data, filename, tolerateMissing)
+		{
+			_jobname = Path.GetFileNameWithoutExtension(filename);
+
+			Engine = ReadEngine();
+
+			if (Body.GetEx(JsonKeys.Job_EngineOnlyMode).Value<bool>()) {
+				return;
+			}
+
+			Gearbox = ReadGearbox();
+			AxleGear = Gearbox as IAxleGearInputData;
+			TorqueConverter = Gearbox as ITorqueConverterEngineeringInputData;
+
+			VehicleData = ReadVehicle();
+			Angledrive = VehicleData as IAngledriveInputData;
+			Retarder = VehicleData as IRetarderInputData;
+			PTOTransmission = VehicleData as IPTOTransmissionInputData;
+			AirdragData = VehicleData as IAirdragEngineeringInputData;
+		}
+
+		private IVehicleEngineeringInputData ReadVehicle()
+		{
+			try {
+				var vehicleFile = Body.GetEx(JsonKeys.Vehicle_VehicleFile).Value<string>();
+				return JSONInputDataFactory.ReadJsonVehicle(
+					Path.Combine(BasePath, vehicleFile));
+			} catch (Exception e) {
+				if (!TolerateMissing) {
+					throw new VectoException("JobFile: Failed to read Vehicle file '{0}': {1}", e, Body[JsonKeys.Vehicle_VehicleFile],
+						e.Message);
+				}
+				return new JSONVehicleDataV7(GetDummyJSONStructure(),
+					Path.Combine(BasePath, Body.GetEx(JsonKeys.Vehicle_VehicleFile).Value<string>()) + MissingFileSuffix);
+			}
+		}
+
+		private IGearboxEngineeringInputData ReadGearbox()
+		{
+			try {
+				var gearboxFile = Body.GetEx(JsonKeys.Vehicle_GearboxFile).Value<string>();
+
+				return JSONInputDataFactory.ReadGearbox(Path.Combine(BasePath, gearboxFile));
+			} catch (Exception e) {
+				if (!TolerateMissing) {
+					throw new VectoException("JobFile: Failed to read Gearbox file '{0}': {1}", e, Body[JsonKeys.Vehicle_GearboxFile],
+						e.Message);
+				}
+				return new JSONGearboxDataV6(GetDummyJSONStructure(),
+					Path.Combine(BasePath, Body.GetEx(JsonKeys.Vehicle_GearboxFile).Value<string>()) + MissingFileSuffix);
+			}
+		}
+
+		private IEngineEngineeringInputData ReadEngine()
+		{
+			try {
+				return JSONInputDataFactory.ReadEngine(
+					Path.Combine(BasePath, Body.GetEx(JsonKeys.Vehicle_EngineFile).Value<string>()));
+			} catch (Exception e) {
+				if (!TolerateMissing) {
+					throw new VectoException("JobFile: Failed to read Engine file '{0}': {1}", e, Body[JsonKeys.Vehicle_EngineFile],
+						e.Message);
+				}
+				//JToken.FromObject(New Dictionary(Of String, Object) From {{"Header", header}, {"Body", body}})
+				return
+					new JSONEngineDataV3(GetDummyJSONStructure(),
+						Path.Combine(BasePath, Body.GetEx(JsonKeys.Vehicle_EngineFile).Value<string>()) + MissingFileSuffix);
+			}
+		}
+
+		#region IInputDataProvider
+
+		public virtual IEngineeringJobInputData JobInputData()
+		{
+			return this;
+		}
+
+		IVehicleDeclarationInputData IDeclarationInputDataProvider.VehicleInputData
+		{
+			get { return VehicleInputData; }
+		}
+
+		IAirdragDeclarationInputData IDeclarationInputDataProvider.AirdragInputData
+		{
+			get { return AirdragInputData; }
+		}
+
+		public IAirdragEngineeringInputData AirdragInputData
+		{
+			get { return AirdragData; }
+		}
+
+		IGearboxDeclarationInputData IDeclarationInputDataProvider.GearboxInputData
+		{
+			get { return GearboxInputData; }
+		}
+
+		ITorqueConverterDeclarationInputData IDeclarationInputDataProvider.TorqueConverterInputData
+		{
+			get { return TorqueConverterInputData; }
+		}
+
+		public ITorqueConverterEngineeringInputData TorqueConverterInputData
+		{
+			get
+			{
+				if (TorqueConverter == null) {
+					throw new InvalidFileFormatException("TorqueConverterData not found");
+				}
+				return TorqueConverter;
+			}
+		}
+
+		IDeclarationJobInputData IDeclarationInputDataProvider.JobInputData()
+		{
+			return JobInputData();
+		}
+
+		public virtual IVehicleEngineeringInputData VehicleInputData
+		{
+			[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design",
+				"CA1065:DoNotRaiseExceptionsInUnexpectedLocations")]
+			get
+			{
+				if (VehicleData == null) {
+					throw new InvalidFileFormatException("VehicleData not found ");
+				}
+				return VehicleData;
+			}
+		}
+
+		public virtual IGearboxEngineeringInputData GearboxInputData
+		{
+			[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design",
+				"CA1065:DoNotRaiseExceptionsInUnexpectedLocations")]
+			get
+			{
+				if (Gearbox == null) {
+					throw new InvalidFileFormatException("GearboxData not found");
+				}
+				return Gearbox;
+			}
+		}
+
+		public virtual IAxleGearInputData AxleGearInputData
+		{
+			[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design",
+				"CA1065:DoNotRaiseExceptionsInUnexpectedLocations")]
+			get
+			{
+				if (AxleGear == null) {
+					throw new InvalidFileFormatException("AxleGearData not found");
+				}
+				return AxleGear;
+			}
+		}
+
+		public IAngledriveInputData AngledriveInputData
+		{
+			get { return Angledrive; }
+		}
+
+		IEngineDeclarationInputData IDeclarationInputDataProvider.EngineInputData
+		{
+			get { return EngineInputData; }
+		}
+
+		public virtual IEngineEngineeringInputData EngineInputData
+		{
+			[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design",
+				"CA1065:DoNotRaiseExceptionsInUnexpectedLocations")]
+			get
+			{
+				if (Engine == null) {
+					throw new InvalidFileFormatException("EngineData not found");
+				}
+				return Engine;
+			}
+		}
+
+		public virtual IAuxiliariesEngineeringInputData AuxiliaryInputData()
+		{
+			return this;
+		}
+
+		IDriverEngineeringInputData IEngineeringInputDataProvider.DriverInputData
+		{
+			get { return this; }
+		}
+
+		public IPTOTransmissionInputData PTOTransmissionInputData
+		{
+			get { return PTOTransmission; }
+		}
+
+		public XElement XMLHash
+		{
+			get { return null; }
+		}
+
+		IAuxiliariesDeclarationInputData IDeclarationInputDataProvider.AuxiliaryInputData()
+		{
+			return this;
+		}
+
+		public virtual IRetarderInputData RetarderInputData
+		{
+			[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design",
+				"CA1065:DoNotRaiseExceptionsInUnexpectedLocations")]
+			get
+			{
+				if (Retarder == null) {
+					throw new InvalidFileFormatException("RetarderData not found");
+				}
+				return Retarder;
+			}
+		}
+
+		public virtual IDriverDeclarationInputData DriverInputData
+		{
+			get { return this; }
+		}
+
+		#endregion
+
+		#region IJobInputData
+
+		public virtual IVehicleEngineeringInputData Vehicle
+		{
+			get { return VehicleData; }
+		}
+
+		public virtual IList<ICycleData> Cycles
+		{
+			[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design",
+				"CA1065:DoNotRaiseExceptionsInUnexpectedLocations")]
+			get
+			{
+				var retVal = new List<ICycleData>();
+				if (Body[JsonKeys.Job_Cycles] == null) {
+					return retVal;
+				}
+				foreach (var cycle in Body.GetEx(JsonKeys.Job_Cycles)) {
+					//.Select(cycle => 
+					var cycleFile = Path.Combine(BasePath, cycle.Value<string>());
+					TableData cycleData;
+					if (File.Exists(cycleFile)) {
+						cycleData = VectoCSVFile.Read(cycleFile);
+					} else {
+						try {
+							var resourceName = DeclarationData.DeclarationDataResourcePrefix + ".MissionCycles." +
+												cycle.Value<string>() + Constants.FileExtensions.CycleFile;
+							cycleData = VectoCSVFile.ReadStream(RessourceHelper.ReadStream(resourceName), source: resourceName);
+						} catch (Exception e) {
+							Log.Debug("Driving Cycle could not be read: " + cycleFile);
+							if (!TolerateMissing) {
+								throw new VectoException("Driving Cycle could not be read: " + cycleFile, e);
+							}
+							cycleData = new TableData(cycleFile + MissingFileSuffix, DataSourceType.Missing);
+						}
+					}
+					retVal.Add(new CycleInputData() {
+						Name = Path.GetFileNameWithoutExtension(cycle.Value<string>()),
+						CycleData = cycleData
+					});
+				}
+				return retVal;
+			}
+		}
+
+		public virtual bool EngineOnlyMode
+		{
+			get { return Body.GetEx(JsonKeys.Job_EngineOnlyMode).Value<bool>(); }
+		}
+
+		IVehicleDeclarationInputData IDeclarationJobInputData.Vehicle
+		{
+			get { return Vehicle; }
+		}
+
+		public virtual string JobName
+		{
+			get { return _jobname; }
+		}
+
+		#endregion
+
+		#region DriverInputData
+
+		IOverSpeedEcoRollDeclarationInputData IDriverDeclarationInputData.OverSpeedEcoRoll
+		{
+			get
+			{
+				var overspeed = Body.GetEx(JsonKeys.DriverData_OverspeedEcoRoll);
+				return new OverSpeedEcoRollInputData() {
+					Mode = DriverData.ParseDriverMode(overspeed.GetEx<string>(JsonKeys.DriverData_OverspeedEcoRoll_Mode))
+				};
+			}
+		}
+
+		public virtual ILookaheadCoastingInputData Lookahead
+		{
+			get
+			{
+				if (Body[JsonKeys.DriverData_LookaheadCoasting] == null) {
+					return null;
+				}
+
+				var lac = Body.GetEx(JsonKeys.DriverData_LookaheadCoasting);
+				var distanceScalingFactor = lac["PreviewDistanceFactor"] != null
+					? lac.GetEx<double>("PreviewDistanceFactor")
+					: DeclarationData.Driver.LookAhead.LookAheadDistanceFactor;
+				var lacDfOffset = lac["DF_offset"] != null
+					? lac.GetEx<double>("DF_offset")
+					: DeclarationData.Driver.LookAhead.DecisionFactorCoastingOffset;
+				var lacDfScaling = lac["DF_scaling"] != null
+					? lac.GetEx<double>("DF_scaling")
+					: DeclarationData.Driver.LookAhead.DecisionFactorCoastingScaling;
+				var speedDependentLookup = GetSpeedDependentLookupTable(lac);
+				var velocityDropLookup = GetVelocityDropLookupTable(lac);
+				var minSpeed = lac["MinSpeed"] != null
+					? lac.GetEx<double>(JsonKeys.DriverData_Lookahead_MinSpeed).KMPHtoMeterPerSecond()
+					: DeclarationData.Driver.LookAhead.MinimumSpeed;
+				return new LookAheadCoastingInputData() {
+					Enabled = lac.GetEx<bool>(JsonKeys.DriverData_Lookahead_Enabled),
+					//Deceleration = lac.GetEx<double>(JsonKeys.DriverData_Lookahead_Deceleration).SI<MeterPerSquareSecond>(),
+					MinSpeed = minSpeed,
+					LookaheadDistanceFactor = distanceScalingFactor,
+					CoastingDecisionFactorOffset = lacDfOffset,
+					CoastingDecisionFactorScaling = lacDfScaling,
+					CoastingDecisionFactorTargetSpeedLookup = speedDependentLookup,
+					CoastingDecisionFactorVelocityDropLookup = velocityDropLookup
+				};
+			}
+		}
+
+		private TableData GetVelocityDropLookupTable(JToken lac)
+		{
+			if (lac["Df_velocityDropLookup"] == null || string.IsNullOrWhiteSpace(lac["Df_velocityDropLookup"].Value<string>())) {
+				return null;
+			}
+			try {
+				return ReadTableData(lac.GetEx<string>("Df_velocityDropLookup"),
+					"Lookahead Coasting Decisionfactor - Velocity drop");
+			} catch (Exception) {
+				if (TolerateMissing) {
+					return
+						new TableData(Path.Combine(BasePath, lac["Df_velocityDropLookup"].Value<string>()) + MissingFileSuffix,
+							DataSourceType.Missing);
+				}
+			}
+			return null;
+		}
+
+		private TableData GetSpeedDependentLookupTable(JToken lac)
+		{
+			if (lac["DF_targetSpeedLookup"] == null || string.IsNullOrWhiteSpace(lac["DF_targetSpeedLookup"].Value<string>())) {
+				return null;
+			}
+			try {
+				return ReadTableData(lac.GetEx<string>("DF_targetSpeedLookup"),
+					"Lookahead Coasting Decisionfactor - Target speed");
+			} catch (Exception) {
+				if (TolerateMissing) {
+					return
+						new TableData(Path.Combine(BasePath, lac["DF_targetSpeedLookup"].Value<string>()) + MissingFileSuffix,
+							DataSourceType.Missing);
+				}
+			}
+			return null;
+		}
+
+		public virtual IOverSpeedEcoRollEngineeringInputData OverSpeedEcoRoll
+		{
+			get
+			{
+				var overspeed = Body.GetEx(JsonKeys.DriverData_OverspeedEcoRoll);
+				return new OverSpeedEcoRollInputData() {
+					Mode = DriverData.ParseDriverMode(overspeed.GetEx<string>(JsonKeys.DriverData_OverspeedEcoRoll_Mode)),
+					MinSpeed = overspeed.GetEx<double>(JsonKeys.DriverData_OverspeedEcoRoll_MinSpeed).KMPHtoMeterPerSecond(),
+					OverSpeed = overspeed.GetEx<double>(JsonKeys.DriverData_OverspeedEcoRoll_OverSpeed).KMPHtoMeterPerSecond(),
+					UnderSpeed =
+						overspeed.GetEx<double>(JsonKeys.DriverData_OverspeedEcoRoll_UnderSpeed).KMPHtoMeterPerSecond()
+				};
+			}
+		}
+
+		public virtual TableData AccelerationCurve
+		{
+			[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design",
+				"CA1065:DoNotRaiseExceptionsInUnexpectedLocations")]
+			get
+			{
+				var acceleration = Body[JsonKeys.DriverData_AccelerationCurve];
+				if (acceleration == null || EmptyOrInvalidFileName(acceleration.Value<string>())) {
+					return null;
+					//					throw new VectoException("AccelerationCurve (VACC) required");
+				}
+				try {
+					return ReadTableData(acceleration.Value<string>(), "DriverAccelerationCurve");
+				} catch (VectoException e) {
+					Log.Warn("Could not find file for acceleration curve. Trying lookup in declaration data.");
+					try {
+						var resourceName = DeclarationData.DeclarationDataResourcePrefix + ".VACC." +
+											acceleration.Value<string>() +
+											Constants.FileExtensions.DriverAccelerationCurve;
+						return VectoCSVFile.ReadStream(RessourceHelper.ReadStream(resourceName), source: resourceName);
+					} catch (Exception) {
+						if (!TolerateMissing) {
+							throw new VectoException("Failed to read Driver Acceleration Curve: " + e.Message, e);
+						}
+						return new TableData(Path.Combine(BasePath, acceleration.Value<string>()) + MissingFileSuffix,
+							DataSourceType.Missing);
+					}
+				}
+			}
+		}
+
+		#endregion
+
+		#region IAuxiliariesEngineeringInputData
+
+		IList<IAuxiliaryEngineeringInputData> IAuxiliariesEngineeringInputData.Auxiliaries
+		{
+			get { return AuxData().Cast<IAuxiliaryEngineeringInputData>().ToList(); }
+		}
+
+		IList<IAuxiliaryDeclarationInputData> IAuxiliariesDeclarationInputData.Auxiliaries
+		{
+			get { return AuxData().Cast<IAuxiliaryDeclarationInputData>().ToList(); }
+		}
+
+		protected virtual IList<AuxiliaryDataInputData> AuxData()
+		{
+			var retVal = new List<AuxiliaryDataInputData>();
+			foreach (var aux in Body["Aux"] ?? Enumerable.Empty<JToken>()) {
+				var type = AuxiliaryTypeHelper.Parse(aux.GetEx<string>("Type"));
+
+				var auxData = new AuxiliaryDataInputData {
+					ID = aux.GetEx<string>("ID"),
+					Type = type,
+					Technology = new List<string>(),
+				};
+				var tech = aux.GetEx<string>("Technology");
+
+				if (auxData.Type == AuxiliaryType.ElectricSystem) {
+					if (aux["TechList"] == null || aux["TechList"].Any()) {
+						auxData.Technology.Add("Standard technology");
+					} else {
+						auxData.Technology.Add("Standard technology - LED headlights, all");
+					}
+				}
+
+				if (auxData.Type == AuxiliaryType.SteeringPump) {
+					auxData.Technology.Add(tech);
+				}
+
+				if (auxData.Type == AuxiliaryType.Fan) {
+					auxData.Technology.Add(MapLegacyFanTechnologies(tech));
+				}
+
+				var auxFile = aux["Path"];
+				retVal.Add(auxData);
+
+				if (auxFile == null || EmptyOrInvalidFileName(auxFile.Value<string>())) {
+					continue;
+				}
+
+				AuxiliaryFileHelper.FillAuxiliaryDataInputData(auxData, Path.Combine(BasePath, auxFile.Value<string>()));
+			}
+			return retVal;
+		}
+
+		private static string MapLegacyFanTechnologies(string tech)
+		{
+			string newTech;
+			switch (tech) {
+				case "Crankshaft mounted - Electronically controlled visco clutch (Default)":
+					newTech = "Crankshaft mounted - Electronically controlled visco clutch";
+					break;
+				case "Crankshaft mounted - On/Off clutch":
+					newTech = "Crankshaft mounted - On/off clutch";
+					break;
+				case "Belt driven or driven via transm. - On/Off clutch":
+					newTech = "Belt driven or driven via transm. - On/off clutch";
+					break;
+				default:
+					newTech = tech;
+					break;
+			}
+			return newTech;
+		}
+
+		#endregion
+
+		#region AdvancedAuxiliaries
+
+		public AuxiliaryModel AuxiliaryAssembly
+		{
+			get
+			{
+				return AuxiliaryModelHelper.Parse(Body["AuxiliaryAssembly"] == null ? "" : Body["AuxiliaryAssembly"].ToString());
+			}
+		}
+
+		public string AuxiliaryVersion
+		{
+			get { return Body["AuxiliaryVersion"] != null ? Body["AuxiliaryVersion"].Value<string>() : "<CLASSIC>"; }
+		}
+
+		public string AdvancedAuxiliaryFilePath
+		{
+			get
+			{
+				return Body["AdvancedAuxiliaryFilePath"] != null
+					? Path.Combine(Path.GetFullPath(BasePath), Body["AdvancedAuxiliaryFilePath"].Value<string>())
+					: "";
+			}
+		}
+
+		#endregion
+	}
+
+	public class JSONInputDataV3 : JSONInputDataV2
+	{
+		public JSONInputDataV3(JObject data, string filename, bool tolerateMissing = false)
+			: base(data, filename, tolerateMissing) {}
+
+		protected override IList<AuxiliaryDataInputData> AuxData()
+		{
+			var retVal = new List<AuxiliaryDataInputData>();
+			if (Body["Padd"] != null) {
+				retVal.Add(new AuxiliaryDataInputData() {
+					ID = "ConstantAux",
+					AuxiliaryType = AuxiliaryDemandType.Constant,
+					ConstantPowerDemand = Body.GetEx<double>("Padd").SI<Watt>()
+				});
+			}
+			foreach (var aux in Body["Aux"] ?? Enumerable.Empty<JToken>()) {
+				try {
+					aux.GetEx("Technology").ToObject<List<string>>();
+				} catch (Exception) {
+					throw new VectoException(
+						"Aux: Technology for aux '{0}' list could not be read. Maybe it is a single string instead of a list of strings?",
+						aux.GetEx<string>("ID"));
+				}
+
+				var type = AuxiliaryTypeHelper.Parse(aux.GetEx<string>("Type"));
+
+				var auxData = new AuxiliaryDataInputData {
+					ID = aux.GetEx<string>("ID"),
+					Type = type,
+					Technology = aux.GetEx("Technology").ToObject<List<string>>()
+				};
+
+				var auxFile = aux["Path"];
+				retVal.Add(auxData);
+
+				if (auxFile == null || EmptyOrInvalidFileName(auxFile.Value<string>())) {
+					continue;
+				}
+				AuxiliaryFileHelper.FillAuxiliaryDataInputData(auxData, Path.Combine(BasePath, auxFile.Value<string>()));
+			}
+			return retVal;
+		}
+	}
 }
\ No newline at end of file
diff --git a/VectoCore/VectoCore/InputData/FileIO/JSON/JSONVehicleData.cs b/VectoCore/VectoCore/InputData/FileIO/JSON/JSONVehicleData.cs
index 6c23a3f3a27fda1aa029a141982343f60d4c8a5e..700f70c88a1822bbef48400b1d964e9975d1266e 100644
--- a/VectoCore/VectoCore/InputData/FileIO/JSON/JSONVehicleData.cs
+++ b/VectoCore/VectoCore/InputData/FileIO/JSON/JSONVehicleData.cs
@@ -29,353 +29,357 @@
 *   Martin Rexeis, rexeis@ivt.tugraz.at, IVT, Graz University of Technology
 */
 
-using System;
-using System.Collections.Generic;
-using System.IO;
-using System.Linq;
-using Newtonsoft.Json.Linq;
-using TUGraz.VectoCommon.InputData;
-using TUGraz.VectoCommon.Models;
-using TUGraz.VectoCommon.Utils;
-using TUGraz.VectoCore.InputData.Impl;
-
-namespace TUGraz.VectoCore.InputData.FileIO.JSON
-{
-	public class JSONVehicleDataV7 : JSONFile, IVehicleEngineeringInputData, IRetarderInputData, IAngledriveInputData,
-		IPTOTransmissionInputData, IAirdragEngineeringInputData
-	{
-		public JSONVehicleDataV7(JObject data, string fileName, bool tolerateMissing = false)
-			: base(data, fileName, tolerateMissing) {}
-
-		#region IVehicleInputData
-
-		public string VIN
-		{
-			get { return "N.A."; }
-		}
-
-		public string LegislativeClass
-		{
-			get { return "N3"; }
-		}
-
-		public VehicleCategory VehicleCategory
-		{
-			get {
-				return
-					(VehicleCategory)Enum.Parse(typeof(VehicleCategory), Body[JsonKeys.Vehicle_VehicleCategory].Value<string>(), true);
-			}
-		}
-
-		public virtual Kilogram CurbMassChassis
-		{
-			get { return Body.GetEx<double>(JsonKeys.Vehicle_CurbWeight).SI<Kilogram>(); }
-		}
-
-		public virtual Kilogram CurbMassExtra
-		{
-			get { return Body.GetEx<double>(JsonKeys.Vehicle_CurbWeightExtra).SI<Kilogram>(); }
-		}
-
-		public virtual Kilogram GrossVehicleMassRating
-		{
-			get { return Body.GetEx<double>(JsonKeys.Vehicle_GrossVehicleMassRating).SI().Ton.Cast<Kilogram>(); }
-		}
-
-		public IList<ITorqueLimitInputData> TorqueLimits
-		{
-			get {
-				var retVal = new List<ITorqueLimitInputData>();
-				if (Body["TorqueLimits"] == null) {
-					return retVal;
-				}
-				foreach (var entry in (JObject)Body["TorqueLimits"]) {
-					retVal.Add(new TorqueLimitInputData() {
-						Gear = entry.Key.ToInt(),
-						MaxTorque = entry.Value.ToString().ToDouble(0).SI<NewtonMeter>()
-					});
-				}
-				return retVal;
-			}
-		}
-
-		public virtual Kilogram Loading
-		{
-			get { return Body.GetEx<double>(JsonKeys.Vehicle_Loading).SI<Kilogram>(); }
-		}
-
-		public virtual Meter DynamicTyreRadius
-		{
-			get { return Body.GetEx<double>(JsonKeys.Vehicle_DynamicTyreRadius).SI().Milli.Meter.Cast<Meter>(); }
-		}
-
-		public virtual AxleConfiguration AxleConfiguration
-		{
-			get {
-				return
-					AxleConfigurationHelper.Parse(
-						Body.GetEx(JsonKeys.Vehicle_AxleConfiguration).GetEx<string>(JsonKeys.Vehicle_AxleConfiguration_Type));
-			}
-		}
-
-		public virtual IList<IAxleEngineeringInputData> Axles
-		{
-			get { return AxleWheels().Cast<IAxleEngineeringInputData>().ToList(); }
-		}
-
-		public string ManufacturerAddress
-		{
-			get { return "N.A."; }
-		}
-
-		public PerSecond EngineIdleSpeed
-		{
-			get { return Body["IdlingSpeed"] != null ? Body.GetEx<double>("IdlingSpeed").RPMtoRad() : null; }
-		}
-
-		IList<IAxleDeclarationInputData> IVehicleDeclarationInputData.Axles
-		{
-			get { return AxleWheels().Cast<IAxleDeclarationInputData>().ToList(); }
-		}
-
-		private IEnumerable<AxleInputData> AxleWheels()
-		{
-			return
-				Body.GetEx(JsonKeys.Vehicle_AxleConfiguration).GetEx(JsonKeys.Vehicle_AxleConfiguration_Axles).Select(
-					(axle, idx) => new AxleInputData {
-						SourceType = DataSourceType.JSONFile,
-						Source = Source,
-						Inertia = axle.GetEx<double>(JsonKeys.Vehicle_Axles_Inertia).SI<KilogramSquareMeter>(),
-						Wheels = axle.GetEx<string>(JsonKeys.Vehicle_Axles_Wheels),
-						TwinTyres = axle.GetEx<bool>(JsonKeys.Vehicle_Axles_TwinTyres),
-						RollResistanceCoefficient = axle.GetEx<double>(JsonKeys.Vehicle_Axles_RollResistanceCoefficient),
-						TyreTestLoad = axle.GetEx<double>(JsonKeys.Vehicle_Axles_TyreTestLoad).SI<Newton>(),
-						AxleWeightShare = axle.GetEx<double>("AxleWeightShare"),
-						AxleType =
-							axle["Type"] != null
-								? axle.GetEx<string>("Type").ParseEnum<AxleType>()
-								: (idx == 1 ? AxleType.VehicleDriven : AxleType.VehicleNonDriven)
-					});
-		}
-
-		#endregion
-
-		#region Airdrag
-
-		public virtual SquareMeter AirDragArea
-		{
-			get {
-				return Body[JsonKeys.Vehicle_DragCoefficient] == null
-					? null
-					: Body.GetEx<double>(JsonKeys.Vehicle_DragCoefficient).SI<SquareMeter>();
-			}
-		}
-
-		public virtual CrossWindCorrectionMode CrossWindCorrectionMode
-		{
-			get { return CrossWindCorrectionModeHelper.Parse(Body.GetEx<string>("CdCorrMode")); }
-		}
-
-		public virtual TableData CrosswindCorrectionMap
-		{
-			get {
-				try {
-					return ReadTableData(Body.GetEx<string>("CdCorrFile"), "CrosswindCorrection File");
-				} catch (Exception) {
-					if (!TolerateMissing) {
-						throw;
-					}
-					return new TableData(Path.Combine(BasePath, Body["CdCorrFile"].ToString()) + MissingFileSuffix,
-						DataSourceType.Missing);
-				}
-			}
-		}
-
-		#endregion
-
-		#region IRetarderInputData
-
-		RetarderType IRetarderInputData.Type
-		{
-			get {
-				var retarderType = Body.GetEx(JsonKeys.Vehicle_Retarder).GetEx<string>(JsonKeys.Vehicle_Retarder_Type);
-				return RetarderTypeHelper.Parse(retarderType);
-			}
-		}
-
-		double IRetarderInputData.Ratio
-		{
-			get { return Body.GetEx(JsonKeys.Vehicle_Retarder).GetEx<double>(JsonKeys.Vehicle_Retarder_Ratio); }
-		}
-
-		TableData IRetarderInputData.LossMap
-		{
-			get {
-				if (Body[JsonKeys.Vehicle_Retarder] != null &&
-					Body.GetEx(JsonKeys.Vehicle_Retarder)[JsonKeys.Vehicle_Retarder_LossMapFile] != null) {
-					var lossmapFile = Body.GetEx(JsonKeys.Vehicle_Retarder)[JsonKeys.Vehicle_Retarder_LossMapFile];
-					if (string.IsNullOrWhiteSpace(lossmapFile.Value<string>())) {
-						return null;
-					}
-					try {
-						return ReadTableData(lossmapFile.Value<string>(), "LossMap");
-					} catch (Exception) {
-						if (!TolerateMissing) {
-							throw;
-						}
-						return new TableData(Path.Combine(BasePath, lossmapFile.Value<string>()) + MissingFileSuffix,
-							DataSourceType.Missing);
-					}
-				}
-				return null;
-			}
-		}
-
-		#endregion
-
-		#region IAngledriveInputData
-
-		AngledriveType IAngledriveInputData.Type
-		{
-			get {
-				var angleDrive = Body[JsonKeys.Vehicle_Angledrive];
-				if (angleDrive == null) {
-					return AngledriveType.None;
-				}
-
-				return angleDrive.GetEx<string>(JsonKeys.Vehicle_Angledrive_Type).ParseEnum<AngledriveType>();
-			}
-		}
-
-		double IAngledriveInputData.Ratio
-		{
-			get {
-				var angleDrive = Body[JsonKeys.Vehicle_Angledrive];
-				if (angleDrive == null) {
-					return double.NaN;
-				}
-				return Body.GetEx(JsonKeys.Vehicle_Angledrive).GetEx<double>(JsonKeys.Vehicle_Angledrive_Ratio);
-			}
-		}
-
-		TableData IAngledriveInputData.LossMap
-		{
-			get {
-				var angleDrive = Body[JsonKeys.Vehicle_Angledrive];
-				if (angleDrive == null || angleDrive[JsonKeys.Vehicle_Angledrive_LossMapFile] == null) {
-					return null;
-				}
-				var lossmapFile = angleDrive[JsonKeys.Vehicle_Angledrive_LossMapFile];
-				if (string.IsNullOrWhiteSpace(lossmapFile.Value<string>())) {
-					return null;
-				}
-				try {
-					return ReadTableData(lossmapFile.Value<string>(), "LossMap");
-				} catch (Exception) {
-					if (!TolerateMissing) {
-						throw;
-					}
-					return new TableData(Path.Combine(BasePath, lossmapFile.Value<string>()) + MissingFileSuffix,
-						DataSourceType.Missing);
-				}
-			}
-		}
-
-		double IAngledriveInputData.Efficiency
-		{
-			get { return Body.GetEx(JsonKeys.Vehicle_Angledrive).GetEx<double>(JsonKeys.Vehicle_Angledrive_Efficiency); }
-		}
-
-		#endregion
-
-		#region IPTOTransmissionInputData
-
-		string IPTOTransmissionInputData.PTOTransmissionType
-		{
-			get {
-				var pto = Body[JsonKeys.Vehicle_PTO];
-				if (pto == null) {
-					return "None";
-				}
-				return pto[JsonKeys.Vehicle_PTO_Type].Value<string>();
-			}
-		}
-
-		TableData IPTOTransmissionInputData.PTOLossMap
-		{
-			get {
-				var pto = Body[JsonKeys.Vehicle_PTO];
-				if (pto == null || pto[JsonKeys.Vehicle_PTO_LossMapFile] == null) {
-					return null;
-				}
-				var lossmapFile = pto[JsonKeys.Vehicle_PTO_LossMapFile];
-				if (string.IsNullOrWhiteSpace(lossmapFile.Value<string>())) {
-					return null;
-				}
-				try {
-					return ReadTableData(Body.GetEx(JsonKeys.Vehicle_PTO).GetEx<string>(JsonKeys.Vehicle_PTO_LossMapFile), "LossMap");
-				} catch (Exception) {
-					if (!TolerateMissing) {
-						throw;
-					}
-					return new TableData(Path.Combine(BasePath, lossmapFile.Value<string>()) + MissingFileSuffix,
-						DataSourceType.Missing);
-				}
-			}
-		}
-
-		public TableData PTOCycle
-		{
-			get {
-				var pto = Body[JsonKeys.Vehicle_PTO];
-				if (pto == null || pto[JsonKeys.Vehicle_PTO_Cycle] == null) {
-					return null;
-				}
-				var cycle = pto[JsonKeys.Vehicle_PTO_Cycle];
-				if (string.IsNullOrWhiteSpace(cycle.Value<string>())) {
-					return null;
-				}
-				try {
-					return ReadTableData(Body.GetEx(JsonKeys.Vehicle_PTO).GetEx<string>(JsonKeys.Vehicle_PTO_Cycle), "Cycle");
-				} catch (Exception) {
-					if (!TolerateMissing) {
-						throw;
-					}
-					return new TableData(Path.Combine(BasePath, cycle.Value<string>()) + MissingFileSuffix, DataSourceType.Missing);
-				}
-			}
-		}
-
-		#endregion
-
-		public string Manufacturer
-		{
-			get { return "N/A"; }
-		}
-
-		public string Model
-		{
-			get { return "N.A."; }
-		}
-
-		public string Date
-		{
-			get { return "N/A"; }
-		}
-
-		public CertificationMethod CertificationMethod
-		{
-			get { return CertificationMethod.NotCertified; }
-		}
-
-		public string CertificationNumber
-		{
-			get { return "N.A."; }
-		}
-
-		public string DigestValue
-		{
-			get { return ""; }
-		}
-	}
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using Newtonsoft.Json.Linq;
+using TUGraz.VectoCommon.InputData;
+using TUGraz.VectoCommon.Models;
+using TUGraz.VectoCommon.Utils;
+using TUGraz.VectoCore.InputData.Impl;
+
+namespace TUGraz.VectoCore.InputData.FileIO.JSON
+{
+	public class JSONVehicleDataV7 : JSONFile, IVehicleEngineeringInputData, IRetarderInputData, IAngledriveInputData,
+		IPTOTransmissionInputData, IAirdragEngineeringInputData
+	{
+		public JSONVehicleDataV7(JObject data, string fileName, bool tolerateMissing = false)
+			: base(data, fileName, tolerateMissing) {}
+
+		#region IVehicleInputData
+
+		public string VIN
+		{
+			get { return "N.A."; }
+		}
+
+		public LegislativeClass LegislativeClass
+		{
+			get {
+				return Body["LegislativeClass"] != null
+					? Body["LegislativeClass"].Value<string>().ParseEnum<LegislativeClass>()
+					: LegislativeClass.Unknown;
+			}
+		}
+
+		public VehicleCategory VehicleCategory
+		{
+			get {
+				return
+					(VehicleCategory)Enum.Parse(typeof(VehicleCategory), Body[JsonKeys.Vehicle_VehicleCategory].Value<string>(), true);
+			}
+		}
+
+		public virtual Kilogram CurbMassChassis
+		{
+			get { return Body.GetEx<double>(JsonKeys.Vehicle_CurbWeight).SI<Kilogram>(); }
+		}
+
+		public virtual Kilogram CurbMassExtra
+		{
+			get { return Body.GetEx<double>(JsonKeys.Vehicle_CurbWeightExtra).SI<Kilogram>(); }
+		}
+
+		public virtual Kilogram GrossVehicleMassRating
+		{
+			get { return Body.GetEx<double>(JsonKeys.Vehicle_GrossVehicleMassRating).SI().Ton.Cast<Kilogram>(); }
+		}
+
+		public IList<ITorqueLimitInputData> TorqueLimits
+		{
+			get {
+				var retVal = new List<ITorqueLimitInputData>();
+				if (Body["TorqueLimits"] == null) {
+					return retVal;
+				}
+				foreach (var entry in (JObject)Body["TorqueLimits"]) {
+					retVal.Add(new TorqueLimitInputData() {
+						Gear = entry.Key.ToInt(),
+						MaxTorque = entry.Value.ToString().ToDouble(0).SI<NewtonMeter>()
+					});
+				}
+				return retVal;
+			}
+		}
+
+		public virtual Kilogram Loading
+		{
+			get { return Body.GetEx<double>(JsonKeys.Vehicle_Loading).SI<Kilogram>(); }
+		}
+
+		public virtual Meter DynamicTyreRadius
+		{
+			get { return Body.GetEx<double>(JsonKeys.Vehicle_DynamicTyreRadius).SI().Milli.Meter.Cast<Meter>(); }
+		}
+
+		public virtual AxleConfiguration AxleConfiguration
+		{
+			get {
+				return
+					AxleConfigurationHelper.Parse(
+						Body.GetEx(JsonKeys.Vehicle_AxleConfiguration).GetEx<string>(JsonKeys.Vehicle_AxleConfiguration_Type));
+			}
+		}
+
+		public virtual IList<IAxleEngineeringInputData> Axles
+		{
+			get { return AxleWheels().Cast<IAxleEngineeringInputData>().ToList(); }
+		}
+
+		public string ManufacturerAddress
+		{
+			get { return "N.A."; }
+		}
+
+		public PerSecond EngineIdleSpeed
+		{
+			get { return Body["IdlingSpeed"] != null ? Body.GetEx<double>("IdlingSpeed").RPMtoRad() : null; }
+		}
+
+		IList<IAxleDeclarationInputData> IVehicleDeclarationInputData.Axles
+		{
+			get { return AxleWheels().Cast<IAxleDeclarationInputData>().ToList(); }
+		}
+
+		private IEnumerable<AxleInputData> AxleWheels()
+		{
+			return
+				Body.GetEx(JsonKeys.Vehicle_AxleConfiguration).GetEx(JsonKeys.Vehicle_AxleConfiguration_Axles).Select(
+					(axle, idx) => new AxleInputData {
+						SourceType = DataSourceType.JSONFile,
+						Source = Source,
+						Inertia = axle.GetEx<double>(JsonKeys.Vehicle_Axles_Inertia).SI<KilogramSquareMeter>(),
+						Wheels = axle.GetEx<string>(JsonKeys.Vehicle_Axles_Wheels),
+						TwinTyres = axle.GetEx<bool>(JsonKeys.Vehicle_Axles_TwinTyres),
+						RollResistanceCoefficient = axle.GetEx<double>(JsonKeys.Vehicle_Axles_RollResistanceCoefficient),
+						TyreTestLoad = axle.GetEx<double>(JsonKeys.Vehicle_Axles_TyreTestLoad).SI<Newton>(),
+						AxleWeightShare = axle.GetEx<double>("AxleWeightShare"),
+						AxleType =
+							axle["Type"] != null
+								? axle.GetEx<string>("Type").ParseEnum<AxleType>()
+								: (idx == 1 ? AxleType.VehicleDriven : AxleType.VehicleNonDriven)
+					});
+		}
+
+		#endregion
+
+		#region Airdrag
+
+		public virtual SquareMeter AirDragArea
+		{
+			get {
+				return Body[JsonKeys.Vehicle_DragCoefficient] == null
+					? null
+					: Body.GetEx<double>(JsonKeys.Vehicle_DragCoefficient).SI<SquareMeter>();
+			}
+		}
+
+		public virtual CrossWindCorrectionMode CrossWindCorrectionMode
+		{
+			get { return CrossWindCorrectionModeHelper.Parse(Body.GetEx<string>("CdCorrMode")); }
+		}
+
+		public virtual TableData CrosswindCorrectionMap
+		{
+			get {
+				try {
+					return ReadTableData(Body.GetEx<string>("CdCorrFile"), "CrosswindCorrection File");
+				} catch (Exception) {
+					if (!TolerateMissing) {
+						throw;
+					}
+					return new TableData(Path.Combine(BasePath, Body["CdCorrFile"].ToString()) + MissingFileSuffix,
+						DataSourceType.Missing);
+				}
+			}
+		}
+
+		#endregion
+
+		#region IRetarderInputData
+
+		RetarderType IRetarderInputData.Type
+		{
+			get {
+				var retarderType = Body.GetEx(JsonKeys.Vehicle_Retarder).GetEx<string>(JsonKeys.Vehicle_Retarder_Type);
+				return RetarderTypeHelper.Parse(retarderType);
+			}
+		}
+
+		double IRetarderInputData.Ratio
+		{
+			get { return Body.GetEx(JsonKeys.Vehicle_Retarder).GetEx<double>(JsonKeys.Vehicle_Retarder_Ratio); }
+		}
+
+		TableData IRetarderInputData.LossMap
+		{
+			get {
+				if (Body[JsonKeys.Vehicle_Retarder] != null &&
+					Body.GetEx(JsonKeys.Vehicle_Retarder)[JsonKeys.Vehicle_Retarder_LossMapFile] != null) {
+					var lossmapFile = Body.GetEx(JsonKeys.Vehicle_Retarder)[JsonKeys.Vehicle_Retarder_LossMapFile];
+					if (string.IsNullOrWhiteSpace(lossmapFile.Value<string>())) {
+						return null;
+					}
+					try {
+						return ReadTableData(lossmapFile.Value<string>(), "LossMap");
+					} catch (Exception) {
+						if (!TolerateMissing) {
+							throw;
+						}
+						return new TableData(Path.Combine(BasePath, lossmapFile.Value<string>()) + MissingFileSuffix,
+							DataSourceType.Missing);
+					}
+				}
+				return null;
+			}
+		}
+
+		#endregion
+
+		#region IAngledriveInputData
+
+		AngledriveType IAngledriveInputData.Type
+		{
+			get {
+				var angleDrive = Body[JsonKeys.Vehicle_Angledrive];
+				if (angleDrive == null) {
+					return AngledriveType.None;
+				}
+
+				return angleDrive.GetEx<string>(JsonKeys.Vehicle_Angledrive_Type).ParseEnum<AngledriveType>();
+			}
+		}
+
+		double IAngledriveInputData.Ratio
+		{
+			get {
+				var angleDrive = Body[JsonKeys.Vehicle_Angledrive];
+				if (angleDrive == null) {
+					return double.NaN;
+				}
+				return Body.GetEx(JsonKeys.Vehicle_Angledrive).GetEx<double>(JsonKeys.Vehicle_Angledrive_Ratio);
+			}
+		}
+
+		TableData IAngledriveInputData.LossMap
+		{
+			get {
+				var angleDrive = Body[JsonKeys.Vehicle_Angledrive];
+				if (angleDrive == null || angleDrive[JsonKeys.Vehicle_Angledrive_LossMapFile] == null) {
+					return null;
+				}
+				var lossmapFile = angleDrive[JsonKeys.Vehicle_Angledrive_LossMapFile];
+				if (string.IsNullOrWhiteSpace(lossmapFile.Value<string>())) {
+					return null;
+				}
+				try {
+					return ReadTableData(lossmapFile.Value<string>(), "LossMap");
+				} catch (Exception) {
+					if (!TolerateMissing) {
+						throw;
+					}
+					return new TableData(Path.Combine(BasePath, lossmapFile.Value<string>()) + MissingFileSuffix,
+						DataSourceType.Missing);
+				}
+			}
+		}
+
+		double IAngledriveInputData.Efficiency
+		{
+			get { return Body.GetEx(JsonKeys.Vehicle_Angledrive).GetEx<double>(JsonKeys.Vehicle_Angledrive_Efficiency); }
+		}
+
+		#endregion
+
+		#region IPTOTransmissionInputData
+
+		string IPTOTransmissionInputData.PTOTransmissionType
+		{
+			get {
+				var pto = Body[JsonKeys.Vehicle_PTO];
+				if (pto == null) {
+					return "None";
+				}
+				return pto[JsonKeys.Vehicle_PTO_Type].Value<string>();
+			}
+		}
+
+		TableData IPTOTransmissionInputData.PTOLossMap
+		{
+			get {
+				var pto = Body[JsonKeys.Vehicle_PTO];
+				if (pto == null || pto[JsonKeys.Vehicle_PTO_LossMapFile] == null) {
+					return null;
+				}
+				var lossmapFile = pto[JsonKeys.Vehicle_PTO_LossMapFile];
+				if (string.IsNullOrWhiteSpace(lossmapFile.Value<string>())) {
+					return null;
+				}
+				try {
+					return ReadTableData(Body.GetEx(JsonKeys.Vehicle_PTO).GetEx<string>(JsonKeys.Vehicle_PTO_LossMapFile), "LossMap");
+				} catch (Exception) {
+					if (!TolerateMissing) {
+						throw;
+					}
+					return new TableData(Path.Combine(BasePath, lossmapFile.Value<string>()) + MissingFileSuffix,
+						DataSourceType.Missing);
+				}
+			}
+		}
+
+		public TableData PTOCycle
+		{
+			get {
+				var pto = Body[JsonKeys.Vehicle_PTO];
+				if (pto == null || pto[JsonKeys.Vehicle_PTO_Cycle] == null) {
+					return null;
+				}
+				var cycle = pto[JsonKeys.Vehicle_PTO_Cycle];
+				if (string.IsNullOrWhiteSpace(cycle.Value<string>())) {
+					return null;
+				}
+				try {
+					return ReadTableData(Body.GetEx(JsonKeys.Vehicle_PTO).GetEx<string>(JsonKeys.Vehicle_PTO_Cycle), "Cycle");
+				} catch (Exception) {
+					if (!TolerateMissing) {
+						throw;
+					}
+					return new TableData(Path.Combine(BasePath, cycle.Value<string>()) + MissingFileSuffix, DataSourceType.Missing);
+				}
+			}
+		}
+
+		#endregion
+
+		public string Manufacturer
+		{
+			get { return "N/A"; }
+		}
+
+		public string Model
+		{
+			get { return "N.A."; }
+		}
+
+		public string Date
+		{
+			get { return "N/A"; }
+		}
+
+		public CertificationMethod CertificationMethod
+		{
+			get { return CertificationMethod.NotCertified; }
+		}
+
+		public string CertificationNumber
+		{
+			get { return "N.A."; }
+		}
+
+		public string DigestValue
+		{
+			get { return ""; }
+		}
+	}
 }
\ No newline at end of file
diff --git a/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/XMLDeclarationVehicleDataProvider.cs b/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/XMLDeclarationVehicleDataProvider.cs
index 88f881aeedff39c3588bdf179771683f33994bad..af787557a5dcd8bd7a6a284e15f8d83bb8915d7c 100644
--- a/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/XMLDeclarationVehicleDataProvider.cs
+++ b/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/XMLDeclarationVehicleDataProvider.cs
@@ -29,190 +29,190 @@
 *   Martin Rexeis, rexeis@ivt.tugraz.at, IVT, Graz University of Technology
 */
 
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Xml;
-using TUGraz.VectoCommon.Exceptions;
-using TUGraz.VectoCommon.InputData;
-using TUGraz.VectoCommon.Models;
-using TUGraz.VectoCommon.Resources;
-using TUGraz.VectoCommon.Utils;
-using TUGraz.VectoCore.InputData.Impl;
-using TUGraz.VectoCore.Models.Declaration;
-
-namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration
-{
-	public class XMLDeclarationVehicleDataProvider : AbstractDeclarationXMLComponentDataProvider,
-		IVehicleDeclarationInputData, IPTOTransmissionInputData
-	{
-		public XMLDeclarationVehicleDataProvider(XMLDeclarationInputDataProvider xmlInputDataProvider)
-			: base(xmlInputDataProvider)
-		{
-			XBasePath = VehiclePath;
-		}
-
-		public string VIN
-		{
-			get { return GetElementValue(XMLNames.Vehicle_VIN); }
-		}
-
-		public string LegislativeClass
-		{
-			get { return GetElementValue(XMLNames.Vehicle_LegislativeClass); }
-		}
-
-		public VehicleCategory VehicleCategory
-		{
-			get { return GetElementValue(XMLNames.Vehicle_VehicleCategory).ParseEnum<VehicleCategory>(); }
-		}
-
-		public Kilogram CurbMassChassis
-		{
-			get { return GetDoubleElementValue(XMLNames.Vehicle_CurbMassChassis).SI<Kilogram>(); }
-		}
-
-
-		public Kilogram GrossVehicleMassRating
-		{
-			get { return GetDoubleElementValue(XMLNames.Vehicle_GrossVehicleMass).SI<Kilogram>(); }
-		}
-
-		public IList<ITorqueLimitInputData> TorqueLimits
-		{
-			get {
-				var retVal = new List<ITorqueLimitInputData>();
-				var limits =
-					Navigator.Select(Helper.Query(VehiclePath, XMLNames.Vehicle_TorqueLimits, XMLNames.Vehicle_TorqueLimits_Entry),
-						Manager);
-				while (limits.MoveNext()) {
-					retVal.Add(new TorqueLimitInputData() {
-						Gear = limits.Current.GetAttribute(XMLNames.Vehicle_TorqueLimits_Entry_Gear_Attr, "").ToInt(),
-						MaxTorque =
-							limits.Current.GetAttribute(XMLNames.Vehicle_TorqueLimits_Entry_MaxTorque_Attr, "").ToDouble().SI<NewtonMeter>()
-					});
-				}
-				return retVal;
-			}
-		}
-
-		public AxleConfiguration AxleConfiguration
-		{
-			get { return AxleConfigurationHelper.Parse(GetElementValue(XMLNames.Vehicle_AxleConfiguration)); }
-		}
-
-		public IList<IAxleDeclarationInputData> Axles
-		{
-			get {
-				var axles = Navigator.Select(Helper.Query(VehiclePath, XMLNames.Vehicle_Components, XMLNames.Component_AxleWheels,
-					XMLNames.ComponentDataWrapper, XMLNames.AxleWheels_Axles, XMLNames.AxleWheels_Axles_Axle), Manager);
-
-				var retVal = new IAxleDeclarationInputData[axles.Count];
-				while (axles.MoveNext()) {
-					var axleNumber = axles.Current.GetAttribute(XMLNames.AxleWheels_Axles_Axle_AxleNumber_Attr, "").ToInt();
-					if (axleNumber < 1 || axleNumber > retVal.Length) {
-						throw new VectoException("Axle #{0} exceeds axle count", axleNumber);
-					}
-					if (retVal[axleNumber - 1] != null) {
-						throw new VectoException("Axle #{0} defined multiple times!", axleNumber);
-					}
-					var axleType = axles.Current.SelectSingleNode(Helper.NSPrefix(XMLNames.AxleWheels_Axles_Axle_AxleType), Manager);
-					var twinTyres = axles.Current.SelectSingleNode(Helper.NSPrefix(XMLNames.AxleWheels_Axles_Axle_TwinTyres), Manager);
-					var steered = axles.Current.SelectSingleNode(Helper.NSPrefix(XMLNames.AxleWheels_Axles_Axle_Steered), Manager);
-					var tyre =
-						axles.Current.SelectSingleNode(Helper.Query(XMLNames.AxleWheels_Axles_Axle_Tyre, XMLNames.ComponentDataWrapper),
-							Manager);
-					if (tyre == null) {
-						throw new VectoException("Axle #{0} contains no tyre definition", axleNumber);
-					}
-					var dimension = tyre.SelectSingleNode(Helper.NSPrefix(XMLNames.AxleWheels_Axles_Axle_Dimension), Manager);
-					var rollResistance = tyre.SelectSingleNode(Helper.NSPrefix(XMLNames.AxleWheels_Axles_Axle_RRCDeclared), Manager);
-					var tyreTestLoad = tyre.SelectSingleNode(Helper.NSPrefix(XMLNames.AxleWheels_Axles_Axle_FzISO), Manager);
-					retVal[axleNumber - 1] = new AxleInputData {
-						AxleType = axleType == null ? AxleType.VehicleNonDriven : axleType.Value.ParseEnum<AxleType>(),
-						TwinTyres = twinTyres != null && XmlConvert.ToBoolean(twinTyres.Value),
-						Steered = steered != null && XmlConvert.ToBoolean(steered.Value),
-						TyreTestLoad = tyreTestLoad == null ? null : tyreTestLoad.Value.ToDouble().SI<Newton>(),
-						RollResistanceCoefficient = rollResistance == null ? double.NaN : rollResistance.Value.ToDouble(),
-						Wheels = dimension == null ? null : dimension.Value,
-					};
-				}
-				return retVal;
-			}
-		}
-
-		public string ManufacturerAddress
-		{
-			get { return GetElementValue(XMLNames.Component_ManufacturerAddress); }
-		}
-
-		public PerSecond EngineIdleSpeed
-		{
-			get { return GetDoubleElementValue(XMLNames.Vehicle_IdlingSpeed).RPMtoRad(); }
-		}
-
-		public double RetarderRatio
-		{
-			get { return GetDoubleElementValue(XMLNames.Vehicle_RetarderRatio); }
-		}
-
-		public RetarderType RetarderType
-		{
-			get {
-				var value = GetElementValue(XMLNames.Vehicle_RetarderType); //.ParseEnum<RetarderType>(); 
-				switch (value) {
-					case "None":
-						return RetarderType.None;
-					case "Losses included in Gearbox":
-						return RetarderType.LossesIncludedInTransmission;
-					case "Engine Retarder":
-						return RetarderType.EngineRetarder;
-					case "Transmission Input Retarder":
-						return RetarderType.TransmissionInputRetarder;
-					case "Transmission Output Retarder":
-						return RetarderType.TransmissionOutputRetarder;
-				}
-				throw new ArgumentOutOfRangeException("RetarderType", value);
-			}
-		}
-
-		public AngledriveType AngulargearType
-		{
-			get { return GetElementValue(XMLNames.Vehicle_AngledriveType).ParseEnum<AngledriveType>(); }
-		}
-
-		public IPTOTransmissionInputData GetPTOData()
-		{
-			return this;
-		}
-
-		public string PTOTransmissionType
-		{
-			get {
-				var shaftGearWheels = GetElementValue(Helper.Query(XMLNames.Vehicle_PTO, XMLNames.Vehicle_PTO_ShaftsGearWheels));
-				if ("none".Equals(shaftGearWheels, StringComparison.InvariantCultureIgnoreCase)) {
-					return "None";
-				}
-				if ("only one engaged gearwheel above oil level".Equals(shaftGearWheels, StringComparison.CurrentCultureIgnoreCase)) {
-					return "only one engaged gearwheel above oil level";
-				}
-				var otherElements = GetElementValue(Helper.Query(XMLNames.Vehicle_PTO, XMLNames.Vehicle_PTO_OtherElements));
-				var ptoTech = string.Format("{0} - {1}", shaftGearWheels, otherElements);
-				if (DeclarationData.PTOTransmission.GetTechnologies().Contains(ptoTech)) {
-					return ptoTech;
-				}
-				throw new VectoException("PTO Technology {0} invalid!", ptoTech);
-			}
-		}
-
-		public TableData PTOLossMap
-		{
-			get { return null; }
-		}
-
-		public TableData PTOCycle
-		{
-			get { return null; }
-		}
-	}
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Xml;
+using TUGraz.VectoCommon.Exceptions;
+using TUGraz.VectoCommon.InputData;
+using TUGraz.VectoCommon.Models;
+using TUGraz.VectoCommon.Resources;
+using TUGraz.VectoCommon.Utils;
+using TUGraz.VectoCore.InputData.Impl;
+using TUGraz.VectoCore.Models.Declaration;
+
+namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration
+{
+	public class XMLDeclarationVehicleDataProvider : AbstractDeclarationXMLComponentDataProvider,
+		IVehicleDeclarationInputData, IPTOTransmissionInputData
+	{
+		public XMLDeclarationVehicleDataProvider(XMLDeclarationInputDataProvider xmlInputDataProvider)
+			: base(xmlInputDataProvider)
+		{
+			XBasePath = VehiclePath;
+		}
+
+		public string VIN
+		{
+			get { return GetElementValue(XMLNames.Vehicle_VIN); }
+		}
+
+		public LegislativeClass LegislativeClass
+		{
+			get { return GetElementValue(XMLNames.Vehicle_LegislativeClass).ParseEnum<LegislativeClass>(); }
+		}
+
+		public VehicleCategory VehicleCategory
+		{
+			get { return GetElementValue(XMLNames.Vehicle_VehicleCategory).ParseEnum<VehicleCategory>(); }
+		}
+
+		public Kilogram CurbMassChassis
+		{
+			get { return GetDoubleElementValue(XMLNames.Vehicle_CurbMassChassis).SI<Kilogram>(); }
+		}
+
+
+		public Kilogram GrossVehicleMassRating
+		{
+			get { return GetDoubleElementValue(XMLNames.Vehicle_GrossVehicleMass).SI<Kilogram>(); }
+		}
+
+		public IList<ITorqueLimitInputData> TorqueLimits
+		{
+			get {
+				var retVal = new List<ITorqueLimitInputData>();
+				var limits =
+					Navigator.Select(Helper.Query(VehiclePath, XMLNames.Vehicle_TorqueLimits, XMLNames.Vehicle_TorqueLimits_Entry),
+						Manager);
+				while (limits.MoveNext()) {
+					retVal.Add(new TorqueLimitInputData() {
+						Gear = limits.Current.GetAttribute(XMLNames.Vehicle_TorqueLimits_Entry_Gear_Attr, "").ToInt(),
+						MaxTorque =
+							limits.Current.GetAttribute(XMLNames.Vehicle_TorqueLimits_Entry_MaxTorque_Attr, "").ToDouble().SI<NewtonMeter>()
+					});
+				}
+				return retVal;
+			}
+		}
+
+		public AxleConfiguration AxleConfiguration
+		{
+			get { return AxleConfigurationHelper.Parse(GetElementValue(XMLNames.Vehicle_AxleConfiguration)); }
+		}
+
+		public IList<IAxleDeclarationInputData> Axles
+		{
+			get {
+				var axles = Navigator.Select(Helper.Query(VehiclePath, XMLNames.Vehicle_Components, XMLNames.Component_AxleWheels,
+					XMLNames.ComponentDataWrapper, XMLNames.AxleWheels_Axles, XMLNames.AxleWheels_Axles_Axle), Manager);
+
+				var retVal = new IAxleDeclarationInputData[axles.Count];
+				while (axles.MoveNext()) {
+					var axleNumber = axles.Current.GetAttribute(XMLNames.AxleWheels_Axles_Axle_AxleNumber_Attr, "").ToInt();
+					if (axleNumber < 1 || axleNumber > retVal.Length) {
+						throw new VectoException("Axle #{0} exceeds axle count", axleNumber);
+					}
+					if (retVal[axleNumber - 1] != null) {
+						throw new VectoException("Axle #{0} defined multiple times!", axleNumber);
+					}
+					var axleType = axles.Current.SelectSingleNode(Helper.NSPrefix(XMLNames.AxleWheels_Axles_Axle_AxleType), Manager);
+					var twinTyres = axles.Current.SelectSingleNode(Helper.NSPrefix(XMLNames.AxleWheels_Axles_Axle_TwinTyres), Manager);
+					var steered = axles.Current.SelectSingleNode(Helper.NSPrefix(XMLNames.AxleWheels_Axles_Axle_Steered), Manager);
+					var tyre =
+						axles.Current.SelectSingleNode(Helper.Query(XMLNames.AxleWheels_Axles_Axle_Tyre, XMLNames.ComponentDataWrapper),
+							Manager);
+					if (tyre == null) {
+						throw new VectoException("Axle #{0} contains no tyre definition", axleNumber);
+					}
+					var dimension = tyre.SelectSingleNode(Helper.NSPrefix(XMLNames.AxleWheels_Axles_Axle_Dimension), Manager);
+					var rollResistance = tyre.SelectSingleNode(Helper.NSPrefix(XMLNames.AxleWheels_Axles_Axle_RRCDeclared), Manager);
+					var tyreTestLoad = tyre.SelectSingleNode(Helper.NSPrefix(XMLNames.AxleWheels_Axles_Axle_FzISO), Manager);
+					retVal[axleNumber - 1] = new AxleInputData {
+						AxleType = axleType == null ? AxleType.VehicleNonDriven : axleType.Value.ParseEnum<AxleType>(),
+						TwinTyres = twinTyres != null && XmlConvert.ToBoolean(twinTyres.Value),
+						Steered = steered != null && XmlConvert.ToBoolean(steered.Value),
+						TyreTestLoad = tyreTestLoad == null ? null : tyreTestLoad.Value.ToDouble().SI<Newton>(),
+						RollResistanceCoefficient = rollResistance == null ? double.NaN : rollResistance.Value.ToDouble(),
+						Wheels = dimension == null ? null : dimension.Value,
+					};
+				}
+				return retVal;
+			}
+		}
+
+		public string ManufacturerAddress
+		{
+			get { return GetElementValue(XMLNames.Component_ManufacturerAddress); }
+		}
+
+		public PerSecond EngineIdleSpeed
+		{
+			get { return GetDoubleElementValue(XMLNames.Vehicle_IdlingSpeed).RPMtoRad(); }
+		}
+
+		public double RetarderRatio
+		{
+			get { return GetDoubleElementValue(XMLNames.Vehicle_RetarderRatio); }
+		}
+
+		public RetarderType RetarderType
+		{
+			get {
+				var value = GetElementValue(XMLNames.Vehicle_RetarderType); //.ParseEnum<RetarderType>(); 
+				switch (value) {
+					case "None":
+						return RetarderType.None;
+					case "Losses included in Gearbox":
+						return RetarderType.LossesIncludedInTransmission;
+					case "Engine Retarder":
+						return RetarderType.EngineRetarder;
+					case "Transmission Input Retarder":
+						return RetarderType.TransmissionInputRetarder;
+					case "Transmission Output Retarder":
+						return RetarderType.TransmissionOutputRetarder;
+				}
+				throw new ArgumentOutOfRangeException("RetarderType", value);
+			}
+		}
+
+		public AngledriveType AngulargearType
+		{
+			get { return GetElementValue(XMLNames.Vehicle_AngledriveType).ParseEnum<AngledriveType>(); }
+		}
+
+		public IPTOTransmissionInputData GetPTOData()
+		{
+			return this;
+		}
+
+		public string PTOTransmissionType
+		{
+			get {
+				var shaftGearWheels = GetElementValue(Helper.Query(XMLNames.Vehicle_PTO, XMLNames.Vehicle_PTO_ShaftsGearWheels));
+				if ("none".Equals(shaftGearWheels, StringComparison.InvariantCultureIgnoreCase)) {
+					return "None";
+				}
+				if ("only one engaged gearwheel above oil level".Equals(shaftGearWheels, StringComparison.CurrentCultureIgnoreCase)) {
+					return "only one engaged gearwheel above oil level";
+				}
+				var otherElements = GetElementValue(Helper.Query(XMLNames.Vehicle_PTO, XMLNames.Vehicle_PTO_OtherElements));
+				var ptoTech = string.Format("{0} - {1}", shaftGearWheels, otherElements);
+				if (DeclarationData.PTOTransmission.GetTechnologies().Contains(ptoTech)) {
+					return ptoTech;
+				}
+				throw new VectoException("PTO Technology {0} invalid!", ptoTech);
+			}
+		}
+
+		public TableData PTOLossMap
+		{
+			get { return null; }
+		}
+
+		public TableData PTOCycle
+		{
+			get { return null; }
+		}
+	}
 }
\ No newline at end of file
diff --git a/VectoCore/VectoCore/InputData/FileIO/XML/Engineering/XMLEngineeringVehicleDataProvider.cs b/VectoCore/VectoCore/InputData/FileIO/XML/Engineering/XMLEngineeringVehicleDataProvider.cs
index c20feb6f484102dc51423a4e7ec74a61c2ebae1e..5442dfe82ef80fe3c3bdbc2db37b6be3988ecb17 100644
--- a/VectoCore/VectoCore/InputData/FileIO/XML/Engineering/XMLEngineeringVehicleDataProvider.cs
+++ b/VectoCore/VectoCore/InputData/FileIO/XML/Engineering/XMLEngineeringVehicleDataProvider.cs
@@ -29,311 +29,311 @@
 *   Martin Rexeis, rexeis@ivt.tugraz.at, IVT, Graz University of Technology
 */
 
-using System;
-using System.Collections.Generic;
-using System.IO;
-using System.Linq;
-using System.Xml;
-using System.Xml.Schema;
-using System.Xml.XPath;
-using TUGraz.IVT.VectoXML;
-using TUGraz.VectoCommon.Exceptions;
-using TUGraz.VectoCommon.InputData;
-using TUGraz.VectoCommon.Models;
-using TUGraz.VectoCommon.Resources;
-using TUGraz.VectoCommon.Utils;
-using TUGraz.VectoCore.Configuration;
-using TUGraz.VectoCore.InputData.Impl;
-
-namespace TUGraz.VectoCore.InputData.FileIO.XML.Engineering
-{
-	public class XMLEngineeringVehicleDataProvider : AbstractEngineeringXMLComponentDataProvider,
-		IVehicleEngineeringInputData,
-		IPTOTransmissionInputData
-	{
-		public XMLEngineeringVehicleDataProvider(XMLEngineeringInputDataProvider xmlEngineeringJobInputDataProvider,
-			XPathDocument vehicleDocument, string xmlBasePath, string fsBasePath)
-			: base(xmlEngineeringJobInputDataProvider, vehicleDocument, xmlBasePath, fsBasePath) {}
-
-		public string GetVehicleID
-		{
-			get { return GetAttributeValue("", XMLNames.Component_ID_Attr); }
-		}
-
-		public string VIN
-		{
-			get { return GetElementValue(XMLNames.Vehicle_VIN); }
-		}
-
-		public string LegislativeClass
-		{
-			get { return GetElementValue(XMLNames.Vehicle_LegislativeClass); }
-		}
-
-		public VehicleCategory VehicleCategory
-		{
-			get { return GetElementValue(XMLNames.Vehicle_VehicleCategory).ParseEnum<VehicleCategory>(); }
-		}
-
-		public Kilogram CurbMassChassis
-		{
-			get { return GetDoubleElementValue(XMLNames.Vehicle_CurbMassChassis).SI<Kilogram>(); }
-		}
-
-		public Kilogram CurbMassExtra
-		{
-			get { return GetDoubleElementValue(XMLNames.Vehicle_CurbMassExtra).SI<Kilogram>(); }
-		}
-
-		public Kilogram GrossVehicleMassRating
-		{
-			get { return GetDoubleElementValue(XMLNames.Vehicle_GrossVehicleMass).SI<Kilogram>(); }
-		}
-
-		public IList<ITorqueLimitInputData> TorqueLimits
-		{
-			get {
-				var retVal = new List<ITorqueLimitInputData>();
-				var limits =
-					Navigator.Select(Helper.Query(VehiclePath, XMLNames.Vehicle_TorqueLimits, XMLNames.Vehicle_TorqueLimits_Entry),
-						Manager);
-				while (limits.MoveNext()) {
-					retVal.Add(new TorqueLimitInputData() {
-						Gear = limits.Current.GetAttribute(XMLNames.Vehicle_TorqueLimits_Entry_Gear_Attr, "").ToInt(),
-						MaxTorque =
-							limits.Current.GetAttribute(XMLNames.Vehicle_TorqueLimits_Entry_MaxTorque_Attr, "").ToDouble().SI<NewtonMeter>()
-					});
-				}
-				return retVal;
-			}
-		}
-
-		public Kilogram Loading
-		{
-			get { return GetDoubleElementValue(XMLNames.Vehicle_Loading).SI<Kilogram>(); }
-		}
-
-		public Meter DynamicTyreRadius
-		{
-			get {
-				var queryPath = Helper.Query(XMLNames.Vehicle_Components,
-					XMLNames.Component_AxleWheels,
-					XMLNames.ComponentDataWrapper,
-					XMLNames.AxleWheels_Axles,
-					Helper.QueryConstraint(Helper.NSPrefix(XMLNames.AxleWheels_Axles_Axle),
-						Helper.NSPrefix(XMLNames.AxleWheels_Axles_Axle_AxleType),
-						AxleType.VehicleDriven.ToString(), ""), // query
-					XMLNames.AxleWheels_Axles_Axle_DynamicTyreRadius
-					);
-				return (GetDoubleElementValue(queryPath) / 1000).SI<Meter>();
-			}
-		}
-
-
-		public AxleConfiguration AxleConfiguration
-		{
-			get { return AxleConfigurationHelper.Parse(GetElementValue(XMLNames.Vehicle_AxleConfiguration)); }
-		}
-
-		public IList<IAxleEngineeringInputData> Axles
-		{
-			get { return AxleEngineeringInput().Cast<IAxleEngineeringInputData>().ToList(); }
-		}
-
-		public string ManufacturerAddress
-		{
-			get { return "N.A."; }
-		}
-
-		public PerSecond EngineIdleSpeed
-		{
-			get { return null; }
-		}
-
-		IList<IAxleDeclarationInputData> IVehicleDeclarationInputData.Axles
-		{
-			get { return AxleEngineeringInput().Cast<IAxleDeclarationInputData>().ToList(); }
-		}
-
-		private IEnumerable<AxleInputData> AxleEngineeringInput()
-		{
-			var axlePath = Helper.Query(
-				XMLNames.Vehicle_Components,
-				XMLNames.Component_AxleWheels,
-				XMLNames.ComponentDataWrapper,
-				XMLNames.AxleWheels_Axles,
-				XMLNames.AxleWheels_Axles_Axle);
-			var axles =
-				Navigator.Select(Helper.Query(XBasePath, axlePath), Manager);
-
-			var retVal = new AxleInputData[axles.Count];
-
-			while (axles.MoveNext()) {
-				var axleNumber = axles.Current.GetAttribute(XMLNames.AxleWheels_Axles_Axle_AxleNumber_Attr, "").ToInt();
-				if (axleNumber < 1 || axleNumber > retVal.Length) {
-					throw new VectoException("Axle #{0} exceeds axle count", axleNumber);
-				}
-				if (retVal[axleNumber - 1] != null) {
-					throw new VectoException("Axle #{0} defined multiple times!", axleNumber);
-				}
-				var dimension = axles.Current.SelectSingleNode(Helper.Query(XMLNames.AxleWheels_Axles_Axle_Dimension), Manager);
-				var rollResistance = axles.Current.SelectSingleNode(Helper.Query(XMLNames.AxleWheels_Axles_Axle_RRCISO), Manager);
-				var tyreTestLoad = axles.Current.SelectSingleNode(Helper.Query(XMLNames.AxleWheels_Axles_Axle_FzISO), Manager);
-				var weightShare = axles.Current.SelectSingleNode(Helper.Query(XMLNames.AxleWheels_Axles_Axle_WeightShare), Manager);
-				var inertia = axles.Current.SelectSingleNode(Helper.Query(XMLNames.AxleWheels_Axles_Axle_Inertia), Manager);
-				var axleType = axles.Current.SelectSingleNode(Helper.NSPrefix(XMLNames.AxleWheels_Axles_Axle_AxleType), Manager);
-				var twinTyres = axles.Current.SelectSingleNode(Helper.NSPrefix(XMLNames.AxleWheels_Axles_Axle_TwinTyres), Manager);
-				var steered = axles.Current.SelectSingleNode(Helper.NSPrefix(XMLNames.AxleWheels_Axles_Axle_Steered), Manager);
-
-				retVal[axleNumber - 1] = new AxleInputData {
-					AxleType = axleType == null ? AxleType.VehicleNonDriven : axleType.Value.ParseEnum<AxleType>(),
-					TwinTyres = twinTyres != null && XmlConvert.ToBoolean(twinTyres.Value),
-					Steered = steered != null && XmlConvert.ToBoolean(steered.Value),
-					TyreTestLoad = tyreTestLoad == null ? null : tyreTestLoad.ValueAsDouble.SI<Newton>(),
-					RollResistanceCoefficient = rollResistance == null ? double.NaN : rollResistance.ValueAsDouble,
-					Wheels = dimension == null ? null : dimension.Value,
-					AxleWeightShare = weightShare == null ? 0 : weightShare.ValueAsDouble,
-					Inertia = inertia == null ? null : inertia.ValueAsDouble.SI<KilogramSquareMeter>()
-				};
-			}
-			return retVal;
-		}
-
-		public double RetarderRatio
-		{
-			get { return GetDoubleElementValue(XMLNames.Vehicle_RetarderRatio); }
-		}
-
-		public RetarderType RetarderType
-		{
-			get { return GetElementValue(XMLNames.Vehicle_RetarderType).ParseEnum<RetarderType>(); }
-		}
-
-		public AngledriveType AngledriveType
-		{
-			get { return GetElementValue(XMLNames.Vehicle_AngledriveType).ParseEnum<AngledriveType>(); }
-		}
-
-		public IAirdragEngineeringInputData GetAirdragInputData(XmlReaderSettings settings)
-		{
-			return CreateComponentInput(XMLNames.Component_AirDrag, settings,
-				(a, b, c, d) => new XMLEngineeringAirdragDataProvider(a, b, c, d));
-		}
-
-		public XMLEngineeringAxlegearDataProvider GetAxleGearInputData(XmlReaderSettings settings)
-		{
-			return CreateComponentInput(XMLNames.Component_Axlegear, settings,
-				(a, b, c, d) => new XMLEngineeringAxlegearDataProvider(a, b, c, d));
-		}
-
-		public XMLEngineeringEngineDataProvider GetEngineInputData(XmlReaderSettings settings)
-		{
-			return CreateComponentInput(XMLNames.Component_Engine, settings,
-				(a, b, c, d) => new XMLEngineeringEngineDataProvider(a, b, c, d));
-		}
-
-		public XMLEngineeringRetarderDataProvider GetRetarderInputData(XmlReaderSettings settings)
-		{
-			if (!RetarderType.IsDedicatedComponent()) {
-				return new XMLEngineeringRetarderDataProvider(InputData, XMLDocument,
-					Helper.Query(XBasePath, XMLNames.Vehicle_Components, XMLNames.Component_Retarder, XMLNames.ComponentDataWrapper),
-					FSBasePath);
-			}
-
-			return CreateComponentInput(XMLNames.Component_Retarder, settings,
-				(a, b, c, d) => new XMLEngineeringRetarderDataProvider(a, b, c, d));
-		}
-
-		public XMLEngineeringGearboxDataProvider GetGearboxData(XmlReaderSettings settings)
-		{
-			return CreateComponentInput(XMLNames.Component_Gearbox, settings,
-				(a, b, c, d) => new XMLEngineeringGearboxDataProvider(a, b, c, d));
-		}
-
-		public XMLEngineeringAuxiliaryDataProvider GetAuxiliaryData(XmlReaderSettings settings)
-		{
-			return CreateComponentInput(XMLNames.Component_Auxiliaries, settings,
-				(a, b, c, d) => new XMLEngineeringAuxiliaryDataProvider(a, b, c, d));
-		}
-
-
-		protected T CreateComponentInput<T>(string componentName, XmlReaderSettings settings,
-			Func<XMLEngineeringInputDataProvider, XPathDocument, string, string, T> creator)
-		{
-			if (ElementExists(Helper.Query(XMLNames.Vehicle_Components, componentName))) {
-				return creator(InputData, XMLDocument,
-					Helper.Query(XBasePath, XMLNames.Vehicle_Components, componentName, XMLNames.ComponentDataWrapper), FSBasePath);
-			}
-			string componentPath = Helper.Query(XMLNames.Vehicle_Components,
-				Helper.QueryConstraint(XMLNames.ExternalResource, string.Format("@component='{0}' and @type='xml'", componentName),
-					null, ""));
-			if (!ElementExists(componentPath)) {
-				throw new VectoException("Component {0} not found!", componentName);
-			}
-			var componentNode =
-				Navigator.SelectSingleNode(Helper.Query(XBasePath, componentPath), Manager);
-			if (componentNode != null) {
-				try {
-					var componentFile = componentNode.GetAttribute(XMLNames.ExtResource_File_Attr, "");
-					var componentDocument = new XPathDocument(XmlReader.Create(Path.Combine(FSBasePath, componentFile), settings));
-					return creator(InputData, componentDocument,
-						Helper.QueryAbs(Helper.NSPrefix(XMLNames.VectoComponentEngineering, Constants.XML.RootNSPrefix), componentName,
-							XMLNames.ComponentDataWrapper),
-						Path.GetDirectoryName(Path.Combine(Path.GetFullPath(FSBasePath), componentFile)));
-				} catch (XmlSchemaValidationException validationException) {
-					throw new VectoException("Validation of XML-file for component {0} failed", validationException, componentName);
-				}
-			}
-			throw new VectoException("Component {0} not found!", componentName);
-		}
-
-		public XMLEngineeringAngledriveDataProvider GetAngularGearInputData()
-		{
-			return new XMLEngineeringAngledriveDataProvider(InputData, XMLDocument,
-				Helper.Query(XBasePath, XMLNames.Vehicle_Components, XMLNames.Component_Angledrive, XMLNames.ComponentDataWrapper)
-				, FSBasePath);
-		}
-
-		#region "PTO"
-
-		public IPTOTransmissionInputData GetPTOData()
-		{
-			return this;
-		}
-
-		public string PTOTransmissionType
-		{
-			get { return GetElementValue(XMLNames.Vehicle_PTOType); }
-		}
-
-		public TableData PTOLossMap
-		{
-			get {
-				if (ElementExists(Helper.Query(XMLNames.Vehicle_PTOIdleLossMap, XMLNames.Vehicle_PTOIdleLossMap_Entry))) {
-					return ReadTableData(AttributeMappings.PTOLossMap,
-						Helper.Query(XMLNames.Vehicle_PTOIdleLossMap, XMLNames.Vehicle_PTOIdleLossMap_Entry));
-				}
-				if (ElementExists(Helper.Query(XMLNames.Vehicle_PTOIdleLossMap, ExtCsvResourceTag))) {
-					return ReadCSVResourceFile(XMLNames.Vehicle_PTOIdleLossMap);
-				}
-				return null;
-			}
-		}
-
-		public TableData PTOCycle
-		{
-			get {
-				if (ElementExists(Helper.Query(XMLNames.Vehicle_PTOCycle, XMLNames.Vehicle_PTOCycle_Entry))) {
-					return ReadTableData(AttributeMappings.PTOCycleMap,
-						Helper.Query(XMLNames.Vehicle_PTOCycle, XMLNames.Vehicle_PTOCycle_Entry));
-				}
-				if (ElementExists(Helper.Query(XMLNames.Vehicle_PTOCycle, ExtCsvResourceTag))) {
-					return ReadCSVResourceFile(XMLNames.Vehicle_PTOCycle);
-				}
-				return null;
-			}
-		}
-
-		#endregion
-	}
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Xml;
+using System.Xml.Schema;
+using System.Xml.XPath;
+using TUGraz.IVT.VectoXML;
+using TUGraz.VectoCommon.Exceptions;
+using TUGraz.VectoCommon.InputData;
+using TUGraz.VectoCommon.Models;
+using TUGraz.VectoCommon.Resources;
+using TUGraz.VectoCommon.Utils;
+using TUGraz.VectoCore.Configuration;
+using TUGraz.VectoCore.InputData.Impl;
+
+namespace TUGraz.VectoCore.InputData.FileIO.XML.Engineering
+{
+	public class XMLEngineeringVehicleDataProvider : AbstractEngineeringXMLComponentDataProvider,
+		IVehicleEngineeringInputData,
+		IPTOTransmissionInputData
+	{
+		public XMLEngineeringVehicleDataProvider(XMLEngineeringInputDataProvider xmlEngineeringJobInputDataProvider,
+			XPathDocument vehicleDocument, string xmlBasePath, string fsBasePath)
+			: base(xmlEngineeringJobInputDataProvider, vehicleDocument, xmlBasePath, fsBasePath) {}
+
+		public string GetVehicleID
+		{
+			get { return GetAttributeValue("", XMLNames.Component_ID_Attr); }
+		}
+
+		public string VIN
+		{
+			get { return GetElementValue(XMLNames.Vehicle_VIN); }
+		}
+
+		public LegislativeClass LegislativeClass
+		{
+			get { return GetElementValue(XMLNames.Vehicle_LegislativeClass).ParseEnum<LegislativeClass>(); }
+		}
+
+		public VehicleCategory VehicleCategory
+		{
+			get { return GetElementValue(XMLNames.Vehicle_VehicleCategory).ParseEnum<VehicleCategory>(); }
+		}
+
+		public Kilogram CurbMassChassis
+		{
+			get { return GetDoubleElementValue(XMLNames.Vehicle_CurbMassChassis).SI<Kilogram>(); }
+		}
+
+		public Kilogram CurbMassExtra
+		{
+			get { return GetDoubleElementValue(XMLNames.Vehicle_CurbMassExtra).SI<Kilogram>(); }
+		}
+
+		public Kilogram GrossVehicleMassRating
+		{
+			get { return GetDoubleElementValue(XMLNames.Vehicle_GrossVehicleMass).SI<Kilogram>(); }
+		}
+
+		public IList<ITorqueLimitInputData> TorqueLimits
+		{
+			get {
+				var retVal = new List<ITorqueLimitInputData>();
+				var limits =
+					Navigator.Select(Helper.Query(VehiclePath, XMLNames.Vehicle_TorqueLimits, XMLNames.Vehicle_TorqueLimits_Entry),
+						Manager);
+				while (limits.MoveNext()) {
+					retVal.Add(new TorqueLimitInputData() {
+						Gear = limits.Current.GetAttribute(XMLNames.Vehicle_TorqueLimits_Entry_Gear_Attr, "").ToInt(),
+						MaxTorque =
+							limits.Current.GetAttribute(XMLNames.Vehicle_TorqueLimits_Entry_MaxTorque_Attr, "").ToDouble().SI<NewtonMeter>()
+					});
+				}
+				return retVal;
+			}
+		}
+
+		public Kilogram Loading
+		{
+			get { return GetDoubleElementValue(XMLNames.Vehicle_Loading).SI<Kilogram>(); }
+		}
+
+		public Meter DynamicTyreRadius
+		{
+			get {
+				var queryPath = Helper.Query(XMLNames.Vehicle_Components,
+					XMLNames.Component_AxleWheels,
+					XMLNames.ComponentDataWrapper,
+					XMLNames.AxleWheels_Axles,
+					Helper.QueryConstraint(Helper.NSPrefix(XMLNames.AxleWheels_Axles_Axle),
+						Helper.NSPrefix(XMLNames.AxleWheels_Axles_Axle_AxleType),
+						AxleType.VehicleDriven.ToString(), ""), // query
+					XMLNames.AxleWheels_Axles_Axle_DynamicTyreRadius
+					);
+				return (GetDoubleElementValue(queryPath) / 1000).SI<Meter>();
+			}
+		}
+
+
+		public AxleConfiguration AxleConfiguration
+		{
+			get { return AxleConfigurationHelper.Parse(GetElementValue(XMLNames.Vehicle_AxleConfiguration)); }
+		}
+
+		public IList<IAxleEngineeringInputData> Axles
+		{
+			get { return AxleEngineeringInput().Cast<IAxleEngineeringInputData>().ToList(); }
+		}
+
+		public string ManufacturerAddress
+		{
+			get { return "N.A."; }
+		}
+
+		public PerSecond EngineIdleSpeed
+		{
+			get { return null; }
+		}
+
+		IList<IAxleDeclarationInputData> IVehicleDeclarationInputData.Axles
+		{
+			get { return AxleEngineeringInput().Cast<IAxleDeclarationInputData>().ToList(); }
+		}
+
+		private IEnumerable<AxleInputData> AxleEngineeringInput()
+		{
+			var axlePath = Helper.Query(
+				XMLNames.Vehicle_Components,
+				XMLNames.Component_AxleWheels,
+				XMLNames.ComponentDataWrapper,
+				XMLNames.AxleWheels_Axles,
+				XMLNames.AxleWheels_Axles_Axle);
+			var axles =
+				Navigator.Select(Helper.Query(XBasePath, axlePath), Manager);
+
+			var retVal = new AxleInputData[axles.Count];
+
+			while (axles.MoveNext()) {
+				var axleNumber = axles.Current.GetAttribute(XMLNames.AxleWheels_Axles_Axle_AxleNumber_Attr, "").ToInt();
+				if (axleNumber < 1 || axleNumber > retVal.Length) {
+					throw new VectoException("Axle #{0} exceeds axle count", axleNumber);
+				}
+				if (retVal[axleNumber - 1] != null) {
+					throw new VectoException("Axle #{0} defined multiple times!", axleNumber);
+				}
+				var dimension = axles.Current.SelectSingleNode(Helper.Query(XMLNames.AxleWheels_Axles_Axle_Dimension), Manager);
+				var rollResistance = axles.Current.SelectSingleNode(Helper.Query(XMLNames.AxleWheels_Axles_Axle_RRCISO), Manager);
+				var tyreTestLoad = axles.Current.SelectSingleNode(Helper.Query(XMLNames.AxleWheels_Axles_Axle_FzISO), Manager);
+				var weightShare = axles.Current.SelectSingleNode(Helper.Query(XMLNames.AxleWheels_Axles_Axle_WeightShare), Manager);
+				var inertia = axles.Current.SelectSingleNode(Helper.Query(XMLNames.AxleWheels_Axles_Axle_Inertia), Manager);
+				var axleType = axles.Current.SelectSingleNode(Helper.NSPrefix(XMLNames.AxleWheels_Axles_Axle_AxleType), Manager);
+				var twinTyres = axles.Current.SelectSingleNode(Helper.NSPrefix(XMLNames.AxleWheels_Axles_Axle_TwinTyres), Manager);
+				var steered = axles.Current.SelectSingleNode(Helper.NSPrefix(XMLNames.AxleWheels_Axles_Axle_Steered), Manager);
+
+				retVal[axleNumber - 1] = new AxleInputData {
+					AxleType = axleType == null ? AxleType.VehicleNonDriven : axleType.Value.ParseEnum<AxleType>(),
+					TwinTyres = twinTyres != null && XmlConvert.ToBoolean(twinTyres.Value),
+					Steered = steered != null && XmlConvert.ToBoolean(steered.Value),
+					TyreTestLoad = tyreTestLoad == null ? null : tyreTestLoad.ValueAsDouble.SI<Newton>(),
+					RollResistanceCoefficient = rollResistance == null ? double.NaN : rollResistance.ValueAsDouble,
+					Wheels = dimension == null ? null : dimension.Value,
+					AxleWeightShare = weightShare == null ? 0 : weightShare.ValueAsDouble,
+					Inertia = inertia == null ? null : inertia.ValueAsDouble.SI<KilogramSquareMeter>()
+				};
+			}
+			return retVal;
+		}
+
+		public double RetarderRatio
+		{
+			get { return GetDoubleElementValue(XMLNames.Vehicle_RetarderRatio); }
+		}
+
+		public RetarderType RetarderType
+		{
+			get { return GetElementValue(XMLNames.Vehicle_RetarderType).ParseEnum<RetarderType>(); }
+		}
+
+		public AngledriveType AngledriveType
+		{
+			get { return GetElementValue(XMLNames.Vehicle_AngledriveType).ParseEnum<AngledriveType>(); }
+		}
+
+		public IAirdragEngineeringInputData GetAirdragInputData(XmlReaderSettings settings)
+		{
+			return CreateComponentInput(XMLNames.Component_AirDrag, settings,
+				(a, b, c, d) => new XMLEngineeringAirdragDataProvider(a, b, c, d));
+		}
+
+		public XMLEngineeringAxlegearDataProvider GetAxleGearInputData(XmlReaderSettings settings)
+		{
+			return CreateComponentInput(XMLNames.Component_Axlegear, settings,
+				(a, b, c, d) => new XMLEngineeringAxlegearDataProvider(a, b, c, d));
+		}
+
+		public XMLEngineeringEngineDataProvider GetEngineInputData(XmlReaderSettings settings)
+		{
+			return CreateComponentInput(XMLNames.Component_Engine, settings,
+				(a, b, c, d) => new XMLEngineeringEngineDataProvider(a, b, c, d));
+		}
+
+		public XMLEngineeringRetarderDataProvider GetRetarderInputData(XmlReaderSettings settings)
+		{
+			if (!RetarderType.IsDedicatedComponent()) {
+				return new XMLEngineeringRetarderDataProvider(InputData, XMLDocument,
+					Helper.Query(XBasePath, XMLNames.Vehicle_Components, XMLNames.Component_Retarder, XMLNames.ComponentDataWrapper),
+					FSBasePath);
+			}
+
+			return CreateComponentInput(XMLNames.Component_Retarder, settings,
+				(a, b, c, d) => new XMLEngineeringRetarderDataProvider(a, b, c, d));
+		}
+
+		public XMLEngineeringGearboxDataProvider GetGearboxData(XmlReaderSettings settings)
+		{
+			return CreateComponentInput(XMLNames.Component_Gearbox, settings,
+				(a, b, c, d) => new XMLEngineeringGearboxDataProvider(a, b, c, d));
+		}
+
+		public XMLEngineeringAuxiliaryDataProvider GetAuxiliaryData(XmlReaderSettings settings)
+		{
+			return CreateComponentInput(XMLNames.Component_Auxiliaries, settings,
+				(a, b, c, d) => new XMLEngineeringAuxiliaryDataProvider(a, b, c, d));
+		}
+
+
+		protected T CreateComponentInput<T>(string componentName, XmlReaderSettings settings,
+			Func<XMLEngineeringInputDataProvider, XPathDocument, string, string, T> creator)
+		{
+			if (ElementExists(Helper.Query(XMLNames.Vehicle_Components, componentName))) {
+				return creator(InputData, XMLDocument,
+					Helper.Query(XBasePath, XMLNames.Vehicle_Components, componentName, XMLNames.ComponentDataWrapper), FSBasePath);
+			}
+			string componentPath = Helper.Query(XMLNames.Vehicle_Components,
+				Helper.QueryConstraint(XMLNames.ExternalResource, string.Format("@component='{0}' and @type='xml'", componentName),
+					null, ""));
+			if (!ElementExists(componentPath)) {
+				throw new VectoException("Component {0} not found!", componentName);
+			}
+			var componentNode =
+				Navigator.SelectSingleNode(Helper.Query(XBasePath, componentPath), Manager);
+			if (componentNode != null) {
+				try {
+					var componentFile = componentNode.GetAttribute(XMLNames.ExtResource_File_Attr, "");
+					var componentDocument = new XPathDocument(XmlReader.Create(Path.Combine(FSBasePath, componentFile), settings));
+					return creator(InputData, componentDocument,
+						Helper.QueryAbs(Helper.NSPrefix(XMLNames.VectoComponentEngineering, Constants.XML.RootNSPrefix), componentName,
+							XMLNames.ComponentDataWrapper),
+						Path.GetDirectoryName(Path.Combine(Path.GetFullPath(FSBasePath), componentFile)));
+				} catch (XmlSchemaValidationException validationException) {
+					throw new VectoException("Validation of XML-file for component {0} failed", validationException, componentName);
+				}
+			}
+			throw new VectoException("Component {0} not found!", componentName);
+		}
+
+		public XMLEngineeringAngledriveDataProvider GetAngularGearInputData()
+		{
+			return new XMLEngineeringAngledriveDataProvider(InputData, XMLDocument,
+				Helper.Query(XBasePath, XMLNames.Vehicle_Components, XMLNames.Component_Angledrive, XMLNames.ComponentDataWrapper)
+				, FSBasePath);
+		}
+
+		#region "PTO"
+
+		public IPTOTransmissionInputData GetPTOData()
+		{
+			return this;
+		}
+
+		public string PTOTransmissionType
+		{
+			get { return GetElementValue(XMLNames.Vehicle_PTOType); }
+		}
+
+		public TableData PTOLossMap
+		{
+			get {
+				if (ElementExists(Helper.Query(XMLNames.Vehicle_PTOIdleLossMap, XMLNames.Vehicle_PTOIdleLossMap_Entry))) {
+					return ReadTableData(AttributeMappings.PTOLossMap,
+						Helper.Query(XMLNames.Vehicle_PTOIdleLossMap, XMLNames.Vehicle_PTOIdleLossMap_Entry));
+				}
+				if (ElementExists(Helper.Query(XMLNames.Vehicle_PTOIdleLossMap, ExtCsvResourceTag))) {
+					return ReadCSVResourceFile(XMLNames.Vehicle_PTOIdleLossMap);
+				}
+				return null;
+			}
+		}
+
+		public TableData PTOCycle
+		{
+			get {
+				if (ElementExists(Helper.Query(XMLNames.Vehicle_PTOCycle, XMLNames.Vehicle_PTOCycle_Entry))) {
+					return ReadTableData(AttributeMappings.PTOCycleMap,
+						Helper.Query(XMLNames.Vehicle_PTOCycle, XMLNames.Vehicle_PTOCycle_Entry));
+				}
+				if (ElementExists(Helper.Query(XMLNames.Vehicle_PTOCycle, ExtCsvResourceTag))) {
+					return ReadCSVResourceFile(XMLNames.Vehicle_PTOCycle);
+				}
+				return null;
+			}
+		}
+
+		#endregion
+	}
 }
\ No newline at end of file
diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapter.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapter.cs
index cb343eb7da69507fb28805d5cbcacfcf5de47191..d135c2e77348e2cd98e7c537d0a4c11db7e54d1a 100644
--- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapter.cs
+++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapter.cs
@@ -96,12 +96,12 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter
 			retVal.BodyAndTrailerWeight = (mission.MissionType == MissionType.MunicipalUtility
 				? municipalBodyWeight
 				: mission.BodyCurbWeight) + mission.Trailer.Sum(t => t.TrailerCurbWeight).DefaultIfNull(0);
-			//retVal.CurbWeight += retVal.BodyAndTrailerWeight;
 
 			retVal.Loading = loading;
-			var drivenIndex = DrivenAxleIndex(data.Axles);
 			retVal.DynamicTyreRadius =
-				DeclarationData.Wheels.Lookup(data.Axles[drivenIndex].Wheels).DynamicTyreRadius;
+				data.Axles.Where(axle => axle.AxleType == AxleType.VehicleDriven)
+					.Select(da => DeclarationData.Wheels.Lookup(da.Wheels).DynamicTyreRadius)
+					.Average();
 			retVal.CargoVolume = mission.MissionType != MissionType.Construction ? mission.TotalCargoVolume : 0.SI<CubicMeter>();
 
 
@@ -139,16 +139,6 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter
 			return retVal;
 		}
 
-		private static int DrivenAxleIndex(IList<IAxleDeclarationInputData> axles)
-		{
-			for (var i = 0; i < axles.Count; i++) {
-				if (axles[i].AxleType != AxleType.VehicleDriven) {
-					continue;
-				}
-				return i;
-			}
-			return DeclarationData.PoweredAxle();
-		}
 
 		internal CombustionEngineData CreateEngineData(IEngineDeclarationInputData engine, PerSecond vehicleEngineIdleSpeed,
 			IGearboxDeclarationInputData gearbox, IEnumerable<ITorqueLimitInputData> torqueLimits)
@@ -254,24 +244,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter
 					LossMap = lossMap,
 				};
 
-				if (gearbox.Type == GearboxType.ATPowerSplit && i == 0) {
-					// powersplit transmission: torque converter already contains ratio and losses
-					CretateTCFirstGearATPowerSplit(gearData, i, tcShiftPolygon);
-				}
-				if (gearbox.Type == GearboxType.ATSerial) {
-					if (i == 0) {
-						// torqueconverter is active in first gear - duplicate ratio and lossmap for torque converter mode
-						CreateTCFirstGearATSerial(gearData, tcShiftPolygon);
-					}
-					if (i == 1 && gearDifferenceRatio >= DeclarationData.Gearbox.TorqueConverterSecondGearThreshold(vehicleCategory)) {
-						// ratio between first and second gear is above threshold, torqueconverter is active in second gear as well
-						// -> duplicate ratio and lossmap for torque converter mode, remove locked transmission for previous gear
-						CreateTCSecondGearATSerial(gearData, tcShiftPolygon);
-						// NOTE: the lower gear in 'gears' dictionary has index i !!
-						gears[i].Ratio = double.NaN;
-						gears[i].LossMap = null;
-					}
-				}
+				CreateATGearData(gearbox, i, gearData, tcShiftPolygon, gearDifferenceRatio, gears, vehicleCategory);
 				gears.Add(i + 1, gearData);
 			}
 			retVal.Gears = gears;
@@ -287,6 +260,30 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter
 			return retVal;
 		}
 
+		private static void CreateATGearData(IGearboxDeclarationInputData gearbox, uint i, GearData gearData,
+			ShiftPolygon tcShiftPolygon, double gearDifferenceRatio, Dictionary<uint, GearData> gears,
+			VehicleCategory vehicleCategory)
+		{
+			if (gearbox.Type == GearboxType.ATPowerSplit && i == 0) {
+				// powersplit transmission: torque converter already contains ratio and losses
+				CretateTCFirstGearATPowerSplit(gearData, i, tcShiftPolygon);
+			}
+			if (gearbox.Type == GearboxType.ATSerial) {
+				if (i == 0) {
+					// torqueconverter is active in first gear - duplicate ratio and lossmap for torque converter mode
+					CreateTCFirstGearATSerial(gearData, tcShiftPolygon);
+				}
+				if (i == 1 && gearDifferenceRatio >= DeclarationData.Gearbox.TorqueConverterSecondGearThreshold(vehicleCategory)) {
+					// ratio between first and second gear is above threshold, torqueconverter is active in second gear as well
+					// -> duplicate ratio and lossmap for torque converter mode, remove locked transmission for previous gear
+					CreateTCSecondGearATSerial(gearData, tcShiftPolygon);
+					// NOTE: the lower gear in 'gears' dictionary has index i !!
+					gears[i].Ratio = double.NaN;
+					gears[i].LossMap = null;
+				}
+			}
+		}
+
 		private static void SetDeclarationData(GearboxData retVal)
 		{
 			retVal.Inertia = DeclarationData.Gearbox.Inertia;
@@ -329,7 +326,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter
 				mission = mission.GetNonEMSMissionType();
 				switch (auxType) {
 					case AuxiliaryType.Fan:
-						aux.PowerDemand = DeclarationData.Fan.Lookup(mission, auxData.Technology.FirstOrDefault());
+						aux.PowerDemand = DeclarationData.Fan.Lookup(mission, auxData.Technology.FirstOrDefault()).PowerDemand;
 						aux.ID = Constants.Auxiliaries.IDs.Fan;
 						break;
 					case AuxiliaryType.SteeringPump:
@@ -338,15 +335,15 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter
 						break;
 					case AuxiliaryType.HVAC:
 						aux.PowerDemand = DeclarationData.HeatingVentilationAirConditioning.Lookup(mission,
-							auxData.Technology.FirstOrDefault(), hvdClass);
+							auxData.Technology.FirstOrDefault(), hvdClass).PowerDemand;
 						aux.ID = Constants.Auxiliaries.IDs.HeatingVentilationAirCondition;
 						break;
 					case AuxiliaryType.PneumaticSystem:
-						aux.PowerDemand = DeclarationData.PneumaticSystem.Lookup(mission, auxData.Technology.FirstOrDefault());
+						aux.PowerDemand = DeclarationData.PneumaticSystem.Lookup(mission, auxData.Technology.FirstOrDefault()).PowerDemand;
 						aux.ID = Constants.Auxiliaries.IDs.PneumaticSystem;
 						break;
 					case AuxiliaryType.ElectricSystem:
-						aux.PowerDemand = DeclarationData.ElectricSystem.Lookup(mission, auxData.Technology.FirstOrDefault());
+						aux.PowerDemand = DeclarationData.ElectricSystem.Lookup(mission, auxData.Technology.FirstOrDefault()).PowerDemand;
 						aux.ID = Constants.Auxiliaries.IDs.ElectricSystem;
 						break;
 					default:
diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/EngineeringDataAdapter.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/EngineeringDataAdapter.cs
index 734c8d536580577601269111a7dc63d01d21e810..813e4d2eb9c71a825ea2aee2dd787e5d1699cd6a 100644
--- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/EngineeringDataAdapter.cs
+++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/EngineeringDataAdapter.cs
@@ -69,6 +69,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter
 				RollResistanceCoefficient = axle.RollResistanceCoefficient,
 				AxleWeightShare = axle.AxleWeightShare,
 				TyreTestLoad = axle.TyreTestLoad,
+				AxleType = axle.AxleType,
 				//Wheels = axle.WheelsStr
 			}).ToList();
 			return retVal;
@@ -82,8 +83,8 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter
 			switch (airdragData.CrossWindCorrectionMode) {
 				case CrossWindCorrectionMode.NoCorrection:
 					retVal.CrossWindCorrectionCurve = new CrosswindCorrectionCdxALookup(airdragData.AirDragArea,
-							CrossWindCorrectionCurveReader.GetNoCorrectionCurve(airdragData.AirDragArea),
-							CrossWindCorrectionMode.NoCorrection);
+						CrossWindCorrectionCurveReader.GetNoCorrectionCurve(airdragData.AirDragArea),
+						CrossWindCorrectionMode.NoCorrection);
 					break;
 				case CrossWindCorrectionMode.SpeedDependentCorrectionFactor:
 					retVal.CrossWindCorrectionCurve = new CrosswindCorrectionCdxALookup(airdragData.AirDragArea,
@@ -100,7 +101,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter
 					var height = DeclarationData.Segments.LookupHeight(data.VehicleCategory, data.AxleConfiguration,
 						data.GrossVehicleMassRating);
 					retVal.CrossWindCorrectionCurve = new CrosswindCorrectionCdxALookup(airDragArea,
-							DeclarationDataAdapter.GetDeclarationAirResistanceCurve(
+						DeclarationDataAdapter.GetDeclarationAirResistanceCurve(
 							GetAirdragParameterSet(data.VehicleCategory, data.AxleConfiguration, data.Axles.Count), airDragArea, height),
 						CrossWindCorrectionMode.DeclarationModeCorrection);
 					break;
@@ -200,24 +201,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter
 					LossMap = lossMap,
 				};
 
-				if (gearbox.Type == GearboxType.ATPowerSplit && i == 0) {
-					// powersplit transmission: torque converter already contains ratio and losses
-					CretateTCFirstGearATPowerSplit(gearData, i, tcShiftPolygon);
-				}
-				if (gearbox.Type == GearboxType.ATSerial) {
-					if (i == 0) {
-						// torqueconverter is active in first gear - duplicate ratio and lossmap for torque converter mode
-						CreateTCFirstGearATSerial(gearData, tcShiftPolygon);
-					}
-					if (i == 1 && gearDifferenceRatio >= DeclarationData.Gearbox.TorqueConverterSecondGearThreshold(vehicleCategory)) {
-						// ratio between first and second gear is above threshold, torqueconverter is active in second gear as well
-						// -> duplicate ratio and lossmap for torque converter mode, remove locked transmission for previous gear
-						CreateTCSecondGearATSerial(gearData, tcShiftPolygon);
-						// NOTE: the lower gear in 'gears' dictionary has index i !!
-						gears[i].Ratio = double.NaN;
-						gears[i].LossMap = null;
-					}
-				}
+				CreateATGearData(gearbox, i, gearData, tcShiftPolygon, gearDifferenceRatio, gears, vehicleCategory);
 				gears.Add(i + 1, gearData);
 			}
 			retVal.Gears = gears;
@@ -230,9 +214,34 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter
 					gearbox.TorqueConverter.CLUpshiftMinAcceleration, gearbox.TorqueConverter.CCUpshiftMinAcceleration);
 			}
 
+
 			return retVal;
 		}
 
+		private static void CreateATGearData(IGearboxEngineeringInputData gearbox, uint i, GearData gearData,
+			ShiftPolygon tcShiftPolygon, double gearDifferenceRatio, Dictionary<uint, GearData> gears,
+			VehicleCategory vehicleCategory)
+		{
+			if (gearbox.Type == GearboxType.ATPowerSplit && i == 0) {
+				// powersplit transmission: torque converter already contains ratio and losses
+				CretateTCFirstGearATPowerSplit(gearData, i, tcShiftPolygon);
+			}
+			if (gearbox.Type == GearboxType.ATSerial) {
+				if (i == 0) {
+					// torqueconverter is active in first gear - duplicate ratio and lossmap for torque converter mode
+					CreateTCFirstGearATSerial(gearData, tcShiftPolygon);
+				}
+				if (i == 1 && gearDifferenceRatio >= DeclarationData.Gearbox.TorqueConverterSecondGearThreshold(vehicleCategory)) {
+					// ratio between first and second gear is above threshold, torqueconverter is active in second gear as well
+					// -> duplicate ratio and lossmap for torque converter mode, remove locked transmission for previous gear
+					CreateTCSecondGearATSerial(gearData, tcShiftPolygon);
+					// NOTE: the lower gear in 'gears' dictionary has index i !!
+					gears[i].Ratio = double.NaN;
+					gears[i].LossMap = null;
+				}
+			}
+		}
+
 		private static void SetEngineeringData(IGearboxEngineeringInputData gearbox, GearboxData retVal)
 		{
 			retVal.Inertia = gearbox.Type.ManualTransmission() ? gearbox.Inertia : 0.SI<KilogramSquareMeter>();
diff --git a/VectoCore/VectoCore/InputData/Reader/FullLoadCurveReader.cs b/VectoCore/VectoCore/InputData/Reader/FullLoadCurveReader.cs
index c8eb1db895ba4625d37aecdc695a38ebbcfa893e..7bb94ac86bac9d1a156f2f43c2f26ab10462e4c7 100644
--- a/VectoCore/VectoCore/InputData/Reader/FullLoadCurveReader.cs
+++ b/VectoCore/VectoCore/InputData/Reader/FullLoadCurveReader.cs
@@ -29,107 +29,107 @@
 *   Martin Rexeis, rexeis@ivt.tugraz.at, IVT, Graz University of Technology
 */
 
-using System;
-using System.Collections.Generic;
-using System.Data;
-using System.Linq;
-using TUGraz.VectoCommon.Exceptions;
-using TUGraz.VectoCommon.Models;
-using TUGraz.VectoCommon.Utils;
-using TUGraz.VectoCore.Models.Declaration;
-using TUGraz.VectoCore.Models.SimulationComponent.Data.Engine;
-using TUGraz.VectoCore.Utils;
-
-namespace TUGraz.VectoCore.InputData.Reader
-{
-	public static class FullLoadCurveReader
-	{
-		public static EngineFullLoadCurve ReadFromFile(string fileName, bool declarationMode = false)
-		{
-			try {
-				var data = VectoCSVFile.Read(fileName);
-				return Create(data, declarationMode);
-			} catch (Exception ex) {
-				throw new VectoException("ERROR while reading FullLoadCurve File: " + ex.Message, ex);
-			}
-		}
-
-		public static EngineFullLoadCurve Create(DataTable data, bool declarationMode = false)
-		{
-			if (data.Columns.Count < 3) {
-				throw new VectoException("Engine FullLoadCurve Data File must consist of at least 3 columns.");
-			}
-
-			if (data.Rows.Count < 2) {
-				throw new VectoException(
-					"FullLoadCurve must consist of at least two lines with numeric values (below file header)");
-			}
-
-			List<EngineFullLoadCurve.FullLoadCurveEntry> entriesFld;
-			if (HeaderIsValid(data.Columns)) {
-				entriesFld = CreateFromColumnNames(data);
-			} else {
-				LoggingObject.Logger<EngineFullLoadCurve>().Warn(
-					"FullLoadCurve: Header Line is not valid. Expected: '{0}, {1}, {2}', Got: '{3}'. Falling back to column index.",
-					Fields.EngineSpeed, Fields.TorqueFullLoad,
-					Fields.TorqueDrag, string.Join(", ", data.Columns.Cast<DataColumn>().Select(c => c.ColumnName)));
-
-				entriesFld = CreateFromColumnIndizes(data);
-			}
-
-			LookupData<PerSecond, PT1.PT1Result> tmp;
-			if (declarationMode) {
-				tmp = new PT1();
-			} else {
-				tmp = data.Columns.Count > 3 ? new PT1(data) : new PT1();
-			}
-			entriesFld.Sort((entry1, entry2) => entry1.EngineSpeed.Value().CompareTo(entry2.EngineSpeed.Value()));
-			return new EngineFullLoadCurve(entriesFld, tmp);
-		}
-
-		private static bool HeaderIsValid(DataColumnCollection columns)
-		{
-			return columns.Contains(Fields.EngineSpeed)
-					&& columns.Contains(Fields.TorqueFullLoad)
-					&& columns.Contains(Fields.TorqueDrag);
-		}
-
-		private static List<EngineFullLoadCurve.FullLoadCurveEntry> CreateFromColumnNames(DataTable data)
-		{
-			return (from DataRow row in data.Rows
-				select new EngineFullLoadCurve.FullLoadCurveEntry {
-					EngineSpeed = row.ParseDouble(Fields.EngineSpeed).RPMtoRad(),
-					TorqueFullLoad = row.ParseDouble(Fields.TorqueFullLoad).SI<NewtonMeter>(),
-					TorqueDrag = row.ParseDouble(Fields.TorqueDrag).SI<NewtonMeter>()
-				}).ToList();
-		}
-
-		private static List<EngineFullLoadCurve.FullLoadCurveEntry> CreateFromColumnIndizes(DataTable data)
-		{
-			return (from DataRow row in data.Rows
-				select new EngineFullLoadCurve.FullLoadCurveEntry {
-					EngineSpeed = row.ParseDouble(0).RPMtoRad(),
-					TorqueFullLoad = row.ParseDouble(1).SI<NewtonMeter>(),
-					TorqueDrag = row.ParseDouble(2).SI<NewtonMeter>()
-				}).ToList();
-		}
-
-		public static class Fields
-		{
-			/// <summary>
-			/// [rpm] engine speed
-			/// </summary>
-			public const string EngineSpeed = "engine speed";
-
-			/// <summary>
-			/// [Nm] full load torque
-			/// </summary>
-			public const string TorqueFullLoad = "full load torque";
-
-			/// <summary>
-			/// [Nm] motoring torque
-			/// </summary>
-			public const string TorqueDrag = "motoring torque";
-		}
-	}
+using System;
+using System.Collections.Generic;
+using System.Data;
+using System.Linq;
+using TUGraz.VectoCommon.Exceptions;
+using TUGraz.VectoCommon.Models;
+using TUGraz.VectoCommon.Utils;
+using TUGraz.VectoCore.Models.Declaration;
+using TUGraz.VectoCore.Models.SimulationComponent.Data.Engine;
+using TUGraz.VectoCore.Utils;
+
+namespace TUGraz.VectoCore.InputData.Reader
+{
+	public static class FullLoadCurveReader
+	{
+		public static EngineFullLoadCurve ReadFromFile(string fileName, bool declarationMode = false)
+		{
+			try {
+				var data = VectoCSVFile.Read(fileName);
+				return Create(data, declarationMode);
+			} catch (Exception ex) {
+				throw new VectoException("ERROR while reading FullLoadCurve File: " + ex.Message, ex);
+			}
+		}
+
+		public static EngineFullLoadCurve Create(DataTable data, bool declarationMode = false)
+		{
+			if (data.Columns.Count < 3) {
+				throw new VectoException("Engine FullLoadCurve Data File must consist of at least 3 columns.");
+			}
+
+			if (data.Rows.Count < 2) {
+				throw new VectoException(
+					"FullLoadCurve must consist of at least two lines with numeric values (below file header)");
+			}
+
+			List<EngineFullLoadCurve.FullLoadCurveEntry> entriesFld;
+			if (HeaderIsValid(data.Columns)) {
+				entriesFld = CreateFromColumnNames(data);
+			} else {
+				LoggingObject.Logger<EngineFullLoadCurve>().Warn(
+					"FullLoadCurve: Header Line is not valid. Expected: '{0}, {1}, {2}', Got: '{3}'. Falling back to column index.",
+					Fields.EngineSpeed, Fields.TorqueFullLoad,
+					Fields.TorqueDrag, string.Join(", ", data.Columns.Cast<DataColumn>().Select(c => c.ColumnName)));
+
+				entriesFld = CreateFromColumnIndizes(data);
+			}
+
+			LookupData<PerSecond, PT1.PT1Result> tmp;
+			if (declarationMode) {
+				tmp = new PT1();
+			} else {
+				tmp = data.Columns.Count > 3 ? new PT1(data) : new PT1();
+			}
+			entriesFld.Sort((entry1, entry2) => entry1.EngineSpeed.Value().CompareTo(entry2.EngineSpeed.Value()));
+			return new EngineFullLoadCurve(entriesFld, tmp);
+		}
+
+		private static bool HeaderIsValid(DataColumnCollection columns)
+		{
+			return columns.Contains(Fields.EngineSpeed)
+					&& columns.Contains(Fields.TorqueFullLoad)
+					&& columns.Contains(Fields.TorqueDrag);
+		}
+
+		private static List<EngineFullLoadCurve.FullLoadCurveEntry> CreateFromColumnNames(DataTable data)
+		{
+			return (from DataRow row in data.Rows
+				select new EngineFullLoadCurve.FullLoadCurveEntry {
+					EngineSpeed = row.ParseDouble(Fields.EngineSpeed).RPMtoRad(),
+					TorqueFullLoad = row.ParseDouble(Fields.TorqueFullLoad).SI<NewtonMeter>(),
+					TorqueDrag = row.ParseDouble(Fields.TorqueDrag).SI<NewtonMeter>()
+				}).ToList();
+		}
+
+		private static List<EngineFullLoadCurve.FullLoadCurveEntry> CreateFromColumnIndizes(DataTable data)
+		{
+			return (from DataRow row in data.Rows
+				select new EngineFullLoadCurve.FullLoadCurveEntry {
+					EngineSpeed = row.ParseDouble(0).RPMtoRad(),
+					TorqueFullLoad = row.ParseDouble(1).SI<NewtonMeter>(),
+					TorqueDrag = row.ParseDouble(2).SI<NewtonMeter>()
+				}).ToList();
+		}
+
+		public static class Fields
+		{
+			/// <summary>
+			/// [rpm] engine speed
+			/// </summary>
+			public const string EngineSpeed = "engine speed";
+
+			/// <summary>
+			/// [Nm] full load torque
+			/// </summary>
+			public const string TorqueFullLoad = "full load torque";
+
+			/// <summary>
+			/// [Nm] motoring torque
+			/// </summary>
+			public const string TorqueDrag = "motoring torque";
+		}
+	}
 }
\ No newline at end of file
diff --git a/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationModeVectoRunDataFactory.cs b/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationModeVectoRunDataFactory.cs
index 8a61d30f9378869da8e4711a1e544f2c475383d3..201451de671cc15783395728810412506986e909 100644
--- a/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationModeVectoRunDataFactory.cs
+++ b/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationModeVectoRunDataFactory.cs
@@ -32,6 +32,7 @@
 using System;
 using System.Collections.Generic;
 using System.Linq;
+using TUGraz.VectoCommon.Exceptions;
 using TUGraz.VectoCommon.InputData;
 using TUGraz.VectoCommon.Models;
 using TUGraz.VectoCommon.Utils;
@@ -90,9 +91,14 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl
 			_segment = GetVehicleClassification(InputDataProvider.VehicleInputData.VehicleCategory,
 				InputDataProvider.VehicleInputData.AxleConfiguration,
 				InputDataProvider.VehicleInputData.GrossVehicleMassRating, InputDataProvider.VehicleInputData.CurbMassChassis);
+			if (!_segment.Found) {
+				throw new VectoException(
+					"no segment found for vehicle configruation: vehicle category: {0}, axle configuration: {1}, GVMR: {2}",
+					InputDataProvider.VehicleInputData.VehicleCategory, InputDataProvider.VehicleInputData.AxleConfiguration,
+					InputDataProvider.VehicleInputData.GrossVehicleMassRating);
+			}
 			_driverdata = _dao.CreateDriverData(InputDataProvider.DriverInputData);
 			_driverdata.AccelerationCurve = AccelerationCurveReader.ReadFromStream(_segment.AccelerationFile);
-
 			var tempVehicle = _dao.CreateVehicleData(InputDataProvider.VehicleInputData, _segment.Missions.First(),
 				_segment.Missions.First().Loadings.First().Value, _segment.MunicipalBodyWeight);
 			_airdragData = _dao.CreateAirdragData(InputDataProvider.AirdragInputData, _segment.Missions.First(), _segment);
diff --git a/VectoCore/VectoCore/Models/Declaration/AuxDemandEntry.cs b/VectoCore/VectoCore/Models/Declaration/AuxDemandEntry.cs
new file mode 100644
index 0000000000000000000000000000000000000000..a04ddfb72d6a5c7079b1e5fb4e90dbd5aa3d44d7
--- /dev/null
+++ b/VectoCore/VectoCore/Models/Declaration/AuxDemandEntry.cs
@@ -0,0 +1,9 @@
+using TUGraz.VectoCommon.Utils;
+
+namespace TUGraz.VectoCore.Models.Declaration
+{
+	public struct AuxDemandEntry
+	{
+		public Watt PowerDemand;
+	}
+}
\ No newline at end of file
diff --git a/VectoCore/VectoCore/Models/Declaration/DeclarationData.cs b/VectoCore/VectoCore/Models/Declaration/DeclarationData.cs
index 2f4f41999a2b25a96fbde71eba1faa5e8b4f8f99..a3c29bfca4aa9200810e8a044d1ec48f25d553db 100644
--- a/VectoCore/VectoCore/Models/Declaration/DeclarationData.cs
+++ b/VectoCore/VectoCore/Models/Declaration/DeclarationData.cs
@@ -29,6 +29,7 @@
 *   Martin Rexeis, rexeis@ivt.tugraz.at, IVT, Graz University of Technology
 */
 
+using System;
 using System.Collections.Generic;
 using System.Data;
 using System.Linq;
@@ -88,7 +89,8 @@ namespace TUGraz.VectoCore.Models.Declaration
 		/// </summary>
 		public static Kilogram GetPayloadForTrailerWeight(Kilogram grossVehicleWeight, Kilogram curbWeight, bool lowLoading)
 		{
-			return Payloads.LookupTrailer(grossVehicleWeight, curbWeight) / (lowLoading ? 7.5 : 1);
+			return (Math.Round((Payloads.LookupTrailer(grossVehicleWeight, curbWeight) / (lowLoading ? 7.5 : 1)).LimitTo(0.SI<Kilogram>(),
+				grossVehicleWeight - curbWeight).Value() / 100, 0) * 100).SI<Kilogram>();
 		}
 
 		public static int PoweredAxle()
diff --git a/VectoCore/VectoCore/Models/Declaration/ElectricSystem.cs b/VectoCore/VectoCore/Models/Declaration/ElectricSystem.cs
index 4c9d90ef465111e095004010cc87e8e066806260..8bddb989396845919e56d3bc5c45633ab6fd3205 100644
--- a/VectoCore/VectoCore/Models/Declaration/ElectricSystem.cs
+++ b/VectoCore/VectoCore/Models/Declaration/ElectricSystem.cs
@@ -37,7 +37,7 @@ using TUGraz.VectoCore.Utils;
 
 namespace TUGraz.VectoCore.Models.Declaration
 {
-	public sealed class ElectricSystem : LookupData<MissionType, string, Watt>, IDeclarationAuxiliaryTable
+	public sealed class ElectricSystem : LookupData<MissionType, string, AuxDemandEntry>, IDeclarationAuxiliaryTable
 	{
 		private readonly Alternator _alternator = new Alternator();
 
@@ -58,19 +58,19 @@ namespace TUGraz.VectoCore.Models.Declaration
 				foreach (DataColumn col in table.Columns) {
 					if (col.Caption != "technology") {
 						Data[Tuple.Create(col.Caption.ParseEnum<MissionType>(), name)] =
-							row.ParseDouble(col).SI<Watt>();
+							new AuxDemandEntry() { PowerDemand = row.ParseDouble(col).SI<Watt>() };
 					}
 				}
 			}
 		}
 
-		public override Watt Lookup(MissionType missionType, string technology = null)
+		public override AuxDemandEntry Lookup(MissionType missionType, string technology = null)
 		{
 			if (string.IsNullOrWhiteSpace(technology)) {
 				technology = "Standard technology";
 			}
 			var value = base.Lookup(missionType, technology);
-			return value / _alternator.Lookup(missionType);
+			return new AuxDemandEntry() { PowerDemand = value.PowerDemand / _alternator.Lookup(missionType) };
 		}
 
 		internal sealed class Alternator : LookupData<MissionType, string, double>
diff --git a/VectoCore/VectoCore/Models/Declaration/Fan.cs b/VectoCore/VectoCore/Models/Declaration/Fan.cs
index 6a35c66ede7c0641af79320544ca830db54a029a..3a576c5d04d0a6b6bda5543afe71755c7627e00c 100644
--- a/VectoCore/VectoCore/Models/Declaration/Fan.cs
+++ b/VectoCore/VectoCore/Models/Declaration/Fan.cs
@@ -37,7 +37,7 @@ using TUGraz.VectoCore.Utils;
 
 namespace TUGraz.VectoCore.Models.Declaration
 {
-	public sealed class Fan : LookupData<MissionType, string, Watt>, IDeclarationAuxiliaryTable
+	public sealed class Fan : LookupData<MissionType, string, AuxDemandEntry>, IDeclarationAuxiliaryTable
 	{
 		protected override string ResourceId
 		{
@@ -56,13 +56,13 @@ namespace TUGraz.VectoCore.Models.Declaration
 
 				foreach (DataColumn col in table.Columns) {
 					if (col.Caption != "technology") {
-						Data[Tuple.Create(col.Caption.ParseEnum<MissionType>(), name)] = row.ParseDouble(col).SI<Watt>();
+						Data[Tuple.Create(col.Caption.ParseEnum<MissionType>(), name)] = new AuxDemandEntry(){PowerDemand = row.ParseDouble(col).SI<Watt>()};
 					}
 				}
 			}
 		}
 
-		public override Watt Lookup(MissionType mission, string technology = null)
+		public override AuxDemandEntry Lookup(MissionType mission, string technology = null)
 		{
 			if (string.IsNullOrWhiteSpace(technology)) {
 				technology = "Crankshaft mounted - Electronically controlled visco clutch";
diff --git a/VectoCore/VectoCore/Models/Declaration/FuelData.cs b/VectoCore/VectoCore/Models/Declaration/FuelData.cs
index e925bfcd173d38f5229d5d487dcd52f83e5e24c7..6f176a7b0d70c1c976fa78f5ac36a34bb557eef8 100644
--- a/VectoCore/VectoCore/Models/Declaration/FuelData.cs
+++ b/VectoCore/VectoCore/Models/Declaration/FuelData.cs
@@ -29,73 +29,73 @@
 *   Martin Rexeis, rexeis@ivt.tugraz.at, IVT, Graz University of Technology
 */
 
-using System;
-using System.Data;
-using System.Linq;
-using TUGraz.VectoCommon.Models;
-using TUGraz.VectoCommon.Utils;
-using TUGraz.VectoCore.Utils;
-
-namespace TUGraz.VectoCore.Models.Declaration
-{
-	public sealed class FuelData : LookupData<FuelType, FuelData.Entry>
-	{
-		private static FuelData _instance;
-
-		public static FuelData Instance()
-		{
-			return _instance ?? (_instance = new FuelData());
-		}
-
-		private FuelData() {}
-
-		protected override string ResourceId
-		{
-			get { return DeclarationData.DeclarationDataResourcePrefix + ".FuelTypes.csv"; }
-		}
-
-		protected override string ErrorMessage
-		{
-			get { throw new InvalidOperationException("ErrorMessage not applicable."); }
-		}
-
-		public static Entry Diesel
-		{
-			get { return Instance().Lookup(FuelType.DieselCI); }
-		}
-
-		protected override void ParseData(DataTable table)
-		{
-			Data = table.Rows.Cast<DataRow>()
-				.Select(r => {
-					var density = r.Field<string>("fueldensity");
-					return new Entry(
-						r.Field<string>(0).ParseEnum<FuelType>(),
-						string.IsNullOrWhiteSpace(density) ? null : density.ToDouble(0).SI<KilogramPerCubicMeter>(),
-						r.ParseDouble("co2perfuelweight"),
-						r.ParseDouble("lowerheatingvalue").SI().Kilo.Joule.Per.Kilo.Gramm.Cast<JoulePerKilogramm>()
-						);
-				})
-				.ToDictionary(e => e.FuelType);
-		}
-
-		public class Entry
-		{
-			public Entry(FuelType type, KilogramPerCubicMeter density, double weight, JoulePerKilogramm heatingValue)
-			{
-				FuelType = type;
-				FuelDensity = density;
-				CO2PerFuelWeight = weight;
-				LowerHeatingValue = heatingValue;
-			}
-
-			public FuelType FuelType { get; private set; }
-
-			public KilogramPerCubicMeter FuelDensity { get; private set; }
-
-			public double CO2PerFuelWeight { get; private set; }
-
-			public JoulePerKilogramm LowerHeatingValue { get; private set; }
-		}
-	}
+using System;
+using System.Data;
+using System.Linq;
+using TUGraz.VectoCommon.Models;
+using TUGraz.VectoCommon.Utils;
+using TUGraz.VectoCore.Utils;
+
+namespace TUGraz.VectoCore.Models.Declaration
+{
+	public sealed class FuelData : LookupData<FuelType, FuelData.Entry>
+	{
+		private static FuelData _instance;
+
+		public static FuelData Instance()
+		{
+			return _instance ?? (_instance = new FuelData());
+		}
+
+		private FuelData() {}
+
+		protected override string ResourceId
+		{
+			get { return DeclarationData.DeclarationDataResourcePrefix + ".FuelTypes.csv"; }
+		}
+
+		protected override string ErrorMessage
+		{
+			get { throw new InvalidOperationException("ErrorMessage not applicable."); }
+		}
+
+		public static Entry Diesel
+		{
+			get { return Instance().Lookup(FuelType.DieselCI); }
+		}
+
+		protected override void ParseData(DataTable table)
+		{
+			Data = table.Rows.Cast<DataRow>()
+				.Select(r => {
+					var density = r.Field<string>("fueldensity");
+					return new Entry(
+						r.Field<string>(0).ParseEnum<FuelType>(),
+						string.IsNullOrWhiteSpace(density) ? null : density.ToDouble(0).SI<KilogramPerCubicMeter>(),
+						r.ParseDouble("co2perfuelweight"),
+						r.ParseDouble("lowerheatingvalue").SI().Kilo.Joule.Per.Kilo.Gramm.Cast<JoulePerKilogramm>()
+						);
+				})
+				.ToDictionary(e => e.FuelType);
+		}
+
+		public struct Entry
+		{
+			public Entry(FuelType type, KilogramPerCubicMeter density, double weight, JoulePerKilogramm heatingValue) : this()
+			{
+				FuelType = type;
+				FuelDensity = density;
+				CO2PerFuelWeight = weight;
+				LowerHeatingValue = heatingValue;
+			}
+
+			public FuelType FuelType { get; private set; }
+
+			public KilogramPerCubicMeter FuelDensity { get; private set; }
+
+			public double CO2PerFuelWeight { get; private set; }
+
+			public JoulePerKilogramm LowerHeatingValue { get; private set; }
+		}
+	}
 }
\ No newline at end of file
diff --git a/VectoCore/VectoCore/Models/Declaration/HVAC.cs b/VectoCore/VectoCore/Models/Declaration/HVAC.cs
index 5a59d415340dc4a61d732e0aa73cf5120e6655e1..650b6c576ca488b4616201e3a868c3e430517f8b 100644
--- a/VectoCore/VectoCore/Models/Declaration/HVAC.cs
+++ b/VectoCore/VectoCore/Models/Declaration/HVAC.cs
@@ -29,50 +29,52 @@
 *   Martin Rexeis, rexeis@ivt.tugraz.at, IVT, Graz University of Technology
 */
 
-using System;
-using System.Collections.Generic;
-using System.Data;
-using System.Linq;
-using TUGraz.VectoCommon.Utils;
-using TUGraz.VectoCore.Utils;
-
-namespace TUGraz.VectoCore.Models.Declaration
-{
-	public sealed class HeatingVentilationAirConditioning : LookupData<MissionType, string, VehicleClass, Watt>,
-		IDeclarationAuxiliaryTable
-	{
-		private List<string> Technologies;
-
-		protected override string ResourceId
-		{
-			get { return DeclarationData.DeclarationDataResourcePrefix + ".VAUX.HVAC-Table.csv"; }
-		}
-
-		protected override string ErrorMessage
-		{
-			get {
-				return "Auxiliary Lookup Error: No value found for HVAC. Mission: '{0}', Technology: '{1}' , HDVClass: '{2}'";
-			}
-		}
-
-		protected override void ParseData(DataTable table)
-		{
-			foreach (DataRow row in table.Rows) {
-				var hdvClass = VehicleClassHelper.Parse(row.Field<string>("hdvclass"));
-				var technology = row.Field<string>("technology");
-				foreach (DataColumn col in table.Columns) {
-					var value = row.ParseDoubleOrGetDefault(col.Caption, double.NaN);
-					if (col.Caption != "hdvclass" && col.Caption != "technology" && !double.IsNaN(value)) {
-						Data[Tuple.Create(col.Caption.ParseEnum<MissionType>(), technology, hdvClass)] = value.SI<Watt>();
-					}
-				}
-			}
-			Technologies = Data.Select(x => x.Key.Item2).Distinct().ToList();
-		}
-
-		public string[] GetTechnologies()
-		{
-			return Technologies.ToArray();
-		}
-	}
+using System;
+using System.Collections.Generic;
+using System.Data;
+using System.Linq;
+using TUGraz.VectoCommon.Utils;
+using TUGraz.VectoCore.Utils;
+
+namespace TUGraz.VectoCore.Models.Declaration
+{
+	public sealed class HeatingVentilationAirConditioning : LookupData<MissionType, string, VehicleClass, AuxDemandEntry>,
+		IDeclarationAuxiliaryTable
+	{
+		private List<string> Technologies;
+
+		protected override string ResourceId
+		{
+			get { return DeclarationData.DeclarationDataResourcePrefix + ".VAUX.HVAC-Table.csv"; }
+		}
+
+		protected override string ErrorMessage
+		{
+			get {
+				return "Auxiliary Lookup Error: No value found for HVAC. Mission: '{0}', Technology: '{1}' , HDVClass: '{2}'";
+			}
+		}
+
+		protected override void ParseData(DataTable table)
+		{
+			foreach (DataRow row in table.Rows) {
+				var hdvClass = VehicleClassHelper.Parse(row.Field<string>("hdvclass"));
+				var technology = row.Field<string>("technology");
+				foreach (DataColumn col in table.Columns) {
+					var value = row.ParseDoubleOrGetDefault(col.Caption, double.NaN);
+					if (col.Caption != "hdvclass" && col.Caption != "technology" && !double.IsNaN(value)) {
+						Data[Tuple.Create(col.Caption.ParseEnum<MissionType>(), technology, hdvClass)] = new AuxDemandEntry() {
+							PowerDemand = value.SI<Watt>()
+						};
+					}
+				}
+			}
+			Technologies = Data.Select(x => x.Key.Item2).Distinct().ToList();
+		}
+
+		public string[] GetTechnologies()
+		{
+			return Technologies.ToArray();
+		}
+	}
 }
\ No newline at end of file
diff --git a/VectoCore/VectoCore/Models/Declaration/LookupData.cs b/VectoCore/VectoCore/Models/Declaration/LookupData.cs
index 933841f9c4fb0c38702425b2f45a511fb1e7fc9f..18a24da2aaa0ae03aebded43a37ba0a35e3c5847 100644
--- a/VectoCore/VectoCore/Models/Declaration/LookupData.cs
+++ b/VectoCore/VectoCore/Models/Declaration/LookupData.cs
@@ -29,91 +29,91 @@
 *   Martin Rexeis, rexeis@ivt.tugraz.at, IVT, Graz University of Technology
 */
 
-using System;
-using System.Collections.Generic;
-using System.Data;
-using TUGraz.VectoCommon.Exceptions;
-using TUGraz.VectoCommon.Models;
-using TUGraz.VectoCommon.Utils;
-using TUGraz.VectoCore.Utils;
-
-namespace TUGraz.VectoCore.Models.Declaration
-{
-	public abstract class LookupData : LoggingObject
-	{
-		protected abstract string ResourceId { get; }
-		protected abstract string ErrorMessage { get; }
-		protected abstract void ParseData(DataTable table);
-
-		protected LookupData()
-		{
-			if (!string.IsNullOrWhiteSpace(ResourceId)) {
-				var table = ReadCsvResource(ResourceId);
-				NormalizeTable(table);
-				ParseData(table);
-			}
-		}
-
-		protected static DataTable ReadCsvResource(string resourceId)
-		{
-			return VectoCSVFile.ReadStream(RessourceHelper.ReadStream(resourceId), source: resourceId);
-		}
-
-		protected static void NormalizeTable(DataTable table)
-		{
-			foreach (DataColumn col in table.Columns) {
-				table.Columns[col.ColumnName].ColumnName = col.ColumnName.ToLower().RemoveWhitespace();
-			}
-		}
-	}
-
-	public abstract class LookupData<TKey, TValue> : LookupData
-	{
-		protected Dictionary<TKey, TValue> Data = new Dictionary<TKey, TValue>();
-
-		public virtual TValue Lookup(TKey key)
-		{
-			try {
-				return Data[key];
-			} catch (KeyNotFoundException) {
-				throw new VectoException(string.Format(ErrorMessage, key));
-			}
-		}
-	}
-
-	public abstract class LookupData<TKey1, TKey2, TValue> : LookupData
-	{
-		protected readonly Dictionary<Tuple<TKey1, TKey2>, TValue> Data = new Dictionary<Tuple<TKey1, TKey2>, TValue>();
-
-		public virtual TValue Lookup(TKey1 key1, TKey2 key2)
-		{
-			try {
-				return Data[Tuple.Create(key1, key2)];
-			} catch (KeyNotFoundException) {
-				throw new VectoException(string.Format(ErrorMessage, key1, key2));
-			}
-		}
-	}
-
-	public abstract class LookupData<TKey1, TKey2, TKey3, TValue> : LookupData
-	{
-		protected readonly Dictionary<Tuple<TKey1, TKey2, TKey3>, TValue> Data =
-			new Dictionary<Tuple<TKey1, TKey2, TKey3>, TValue>();
-
-		public virtual TValue Lookup(TKey1 key1, TKey2 key2, TKey3 key3)
-		{
-			try {
-				return Data[Tuple.Create(key1, key2, key3)];
-			} catch (KeyNotFoundException) {
-				throw new VectoException(string.Format(ErrorMessage, key1, key2, key3));
-			}
-		}
-
-		//public abstract TValue Lookup(TKey1 key1, TKey2 key2, TKey3 key3);
-	}
-
-	public abstract class LookupData<TKey1, TKey2, TKey3, TKey4, TValue> : LookupData
-	{
-		public abstract TValue Lookup(TKey1 key1, TKey2 key2, TKey3 key3, TKey4 key4);
-	}
+using System;
+using System.Collections.Generic;
+using System.Data;
+using TUGraz.VectoCommon.Exceptions;
+using TUGraz.VectoCommon.Models;
+using TUGraz.VectoCommon.Utils;
+using TUGraz.VectoCore.Utils;
+
+namespace TUGraz.VectoCore.Models.Declaration
+{
+	public abstract class LookupData : LoggingObject
+	{
+		protected abstract string ResourceId { get; }
+		protected abstract string ErrorMessage { get; }
+		protected abstract void ParseData(DataTable table);
+
+		protected LookupData()
+		{
+			if (!string.IsNullOrWhiteSpace(ResourceId)) {
+				var table = ReadCsvResource(ResourceId);
+				NormalizeTable(table);
+				ParseData(table);
+			}
+		}
+
+		protected static DataTable ReadCsvResource(string resourceId)
+		{
+			return VectoCSVFile.ReadStream(RessourceHelper.ReadStream(resourceId), source: resourceId);
+		}
+
+		protected static void NormalizeTable(DataTable table)
+		{
+			foreach (DataColumn col in table.Columns) {
+				table.Columns[col.ColumnName].ColumnName = col.ColumnName.ToLower().RemoveWhitespace();
+			}
+		}
+	}
+
+	public abstract class LookupData<TKey, TValue> : LookupData where TValue : struct
+	{
+		protected Dictionary<TKey, TValue> Data = new Dictionary<TKey, TValue>();
+
+		public virtual TValue Lookup(TKey key)
+		{
+			try {
+				return Data[key];
+			} catch (KeyNotFoundException) {
+				throw new VectoException(string.Format(ErrorMessage, key));
+			}
+		}
+	}
+
+	public abstract class LookupData<TKey1, TKey2, TValue> : LookupData where TValue : struct
+	{
+		protected readonly Dictionary<Tuple<TKey1, TKey2>, TValue> Data = new Dictionary<Tuple<TKey1, TKey2>, TValue>();
+
+		public virtual TValue Lookup(TKey1 key1, TKey2 key2)
+		{
+			try {
+				return Data[Tuple.Create(key1, key2)];
+			} catch (KeyNotFoundException) {
+				throw new VectoException(string.Format(ErrorMessage, key1, key2));
+			}
+		}
+	}
+
+	public abstract class LookupData<TKey1, TKey2, TKey3, TValue> : LookupData where TValue : struct
+	{
+		protected readonly Dictionary<Tuple<TKey1, TKey2, TKey3>, TValue> Data =
+			new Dictionary<Tuple<TKey1, TKey2, TKey3>, TValue>();
+
+		public virtual TValue Lookup(TKey1 key1, TKey2 key2, TKey3 key3)
+		{
+			try {
+				return Data[Tuple.Create(key1, key2, key3)];
+			} catch (KeyNotFoundException) {
+				throw new VectoException(string.Format(ErrorMessage, key1, key2, key3));
+			}
+		}
+
+		//public abstract TValue Lookup(TKey1 key1, TKey2 key2, TKey3 key3);
+	}
+
+	public abstract class LookupData<TKey1, TKey2, TKey3, TKey4, TValue> : LookupData where TValue : struct
+	{
+		public abstract TValue Lookup(TKey1 key1, TKey2 key2, TKey3 key3, TKey4 key4);
+	}
 }
\ No newline at end of file
diff --git a/VectoCore/VectoCore/Models/Declaration/PT1.cs b/VectoCore/VectoCore/Models/Declaration/PT1.cs
index 085011993d36a09c8c38a32853a15d12ceca7209..f4737177eccfedc65f67dc12f3d09f6fd6b2c402 100644
--- a/VectoCore/VectoCore/Models/Declaration/PT1.cs
+++ b/VectoCore/VectoCore/Models/Declaration/PT1.cs
@@ -29,101 +29,101 @@
 *   Martin Rexeis, rexeis@ivt.tugraz.at, IVT, Graz University of Technology
 */
 
-using System;
-using System.Collections.Generic;
-using System.Data;
-using System.Linq;
-using TUGraz.VectoCommon.Exceptions;
-using TUGraz.VectoCommon.Utils;
-using TUGraz.VectoCore.Utils;
-
-namespace TUGraz.VectoCore.Models.Declaration
-{
-	public sealed class PT1 : LookupData<PerSecond, PT1.PT1Result>
-	{
-		protected override string ResourceId
-		{
-			get { return DeclarationData.DeclarationDataResourcePrefix + ".PT1.csv"; }
-		}
-
-		protected override string ErrorMessage
-		{
-			get { throw new InvalidOperationException("ErrorMessage not applicable."); }
-		}
-
-		private List<KeyValuePair<PerSecond, Second>> _entries;
-
-		public PT1()
-		{
-			ParseData(ReadCsvResource(ResourceId));
-		}
-
-		public PT1(DataTable data)
-		{
-			ParseDataFromFld(data);
-		}
-
-		protected override void ParseData(DataTable table)
-		{
-			_entries = table.Rows.Cast<DataRow>()
-				.Select(r => new KeyValuePair<PerSecond, Second>(r.ParseDouble("rpm").RPMtoRad(), r.ParseDouble("PT1").SI<Second>()))
-				.OrderBy(x => x.Key)
-				.ToList();
-		}
-
-		private void ParseDataFromFld(DataTable data)
-		{
-			if (data.Columns.Count < 3) {
-				throw new VectoException("FullLoadCurve/PT1 Data File must consist of at least 4 columns.");
-			}
-
-			if (data.Rows.Count < 2) {
-				throw new VectoException(
-					"FullLoadCurve/PT1 must consist of at least two lines with numeric values (below file header)");
-			}
-
-			if (data.Columns.Contains(Fields.EngineSpeed) && data.Columns.Contains(Fields.PT1)) {
-				_entries = data.Rows.Cast<DataRow>()
-					.Select(
-						r => new KeyValuePair<PerSecond, Second>(r.ParseDouble(Fields.EngineSpeed).RPMtoRad(),
-							r.ParseDouble(Fields.PT1).SI<Second>()))
-					.OrderBy(x => x.Key).ToList();
-			} else {
-				_entries = data.Rows.Cast<DataRow>()
-					.Select(r => new KeyValuePair<PerSecond, Second>(r.ParseDouble(0).RPMtoRad(), r.ParseDouble(3).SI<Second>()))
-					.OrderBy(x => x.Key).ToList();
-			}
-		}
-
-		public override PT1Result Lookup(PerSecond key)
-		{
-			var extrapolated = key.IsSmaller(_entries[0].Key) || key.IsGreater(_entries.Last().Key);
-
-			var index = _entries.FindIndex(x => x.Key.IsGreater(key));
-			if (index <= 0) {
-				index = key.IsGreater(_entries[0].Key) ? _entries.Count - 1 : 1;
-			}
-
-			var pt1 = VectoMath.Interpolate(_entries[index - 1].Key, _entries[index].Key, _entries[index - 1].Value,
-				_entries[index].Value, key);
-			if (pt1 < 0) {
-				pt1 = 0.SI<Second>();
-				extrapolated = true;
-				//throw new VectoException("The calculated pt1 value must not be smaller than 0. Value: " + pt1);
-			}
-			return new PT1Result() { Value = pt1, Extrapolated = extrapolated };
-		}
-
-		private static class Fields
-		{
-			public const string PT1 = "PT1";
-			public const string EngineSpeed = "engine speed";
-		}
-
-		public class PT1Result
-		{
-			public Second Value;
-			public bool Extrapolated;
-		}
-	}
+using System;
+using System.Collections.Generic;
+using System.Data;
+using System.Linq;
+using TUGraz.VectoCommon.Exceptions;
+using TUGraz.VectoCommon.Utils;
+using TUGraz.VectoCore.Utils;
+
+namespace TUGraz.VectoCore.Models.Declaration
+{
+	public sealed class PT1 : LookupData<PerSecond, PT1.PT1Result>
+	{
+		protected override string ResourceId
+		{
+			get { return DeclarationData.DeclarationDataResourcePrefix + ".PT1.csv"; }
+		}
+
+		protected override string ErrorMessage
+		{
+			get { throw new InvalidOperationException("ErrorMessage not applicable."); }
+		}
+
+		private List<KeyValuePair<PerSecond, Second>> _entries;
+
+		public PT1()
+		{
+			ParseData(ReadCsvResource(ResourceId));
+		}
+
+		public PT1(DataTable data)
+		{
+			ParseDataFromFld(data);
+		}
+
+		protected override void ParseData(DataTable table)
+		{
+			_entries = table.Rows.Cast<DataRow>()
+				.Select(r => new KeyValuePair<PerSecond, Second>(r.ParseDouble("rpm").RPMtoRad(), r.ParseDouble("PT1").SI<Second>()))
+				.OrderBy(x => x.Key)
+				.ToList();
+		}
+
+		private void ParseDataFromFld(DataTable data)
+		{
+			if (data.Columns.Count < 3) {
+				throw new VectoException("FullLoadCurve/PT1 Data File must consist of at least 4 columns.");
+			}
+
+			if (data.Rows.Count < 2) {
+				throw new VectoException(
+					"FullLoadCurve/PT1 must consist of at least two lines with numeric values (below file header)");
+			}
+
+			if (data.Columns.Contains(Fields.EngineSpeed) && data.Columns.Contains(Fields.PT1)) {
+				_entries = data.Rows.Cast<DataRow>()
+					.Select(
+						r => new KeyValuePair<PerSecond, Second>(r.ParseDouble(Fields.EngineSpeed).RPMtoRad(),
+							r.ParseDouble(Fields.PT1).SI<Second>()))
+					.OrderBy(x => x.Key).ToList();
+			} else {
+				_entries = data.Rows.Cast<DataRow>()
+					.Select(r => new KeyValuePair<PerSecond, Second>(r.ParseDouble(0).RPMtoRad(), r.ParseDouble(3).SI<Second>()))
+					.OrderBy(x => x.Key).ToList();
+			}
+		}
+
+		public override PT1Result Lookup(PerSecond key)
+		{
+			var extrapolated = key.IsSmaller(_entries[0].Key) || key.IsGreater(_entries.Last().Key);
+
+			var index = _entries.FindIndex(x => x.Key.IsGreater(key));
+			if (index <= 0) {
+				index = key.IsGreater(_entries[0].Key) ? _entries.Count - 1 : 1;
+			}
+
+			var pt1 = VectoMath.Interpolate(_entries[index - 1].Key, _entries[index].Key, _entries[index - 1].Value,
+				_entries[index].Value, key);
+			if (pt1 < 0) {
+				pt1 = 0.SI<Second>();
+				extrapolated = true;
+				//throw new VectoException("The calculated pt1 value must not be smaller than 0. Value: " + pt1);
+			}
+			return new PT1Result() { Value = pt1, Extrapolated = extrapolated };
+		}
+
+		private static class Fields
+		{
+			public const string PT1 = "PT1";
+			public const string EngineSpeed = "engine speed";
+		}
+
+		public struct PT1Result
+		{
+			public Second Value;
+			public bool Extrapolated;
+		}
+	}
 }
\ No newline at end of file
diff --git a/VectoCore/VectoCore/Models/Declaration/PTOTransmission.cs b/VectoCore/VectoCore/Models/Declaration/PTOTransmission.cs
index ffbfd1fe09992698d6005baebbdd03d6b0a355d4..1231691fafa4537d39eeae34daa7b8928bceb9d3 100644
--- a/VectoCore/VectoCore/Models/Declaration/PTOTransmission.cs
+++ b/VectoCore/VectoCore/Models/Declaration/PTOTransmission.cs
@@ -36,7 +36,7 @@ using TUGraz.VectoCore.Utils;
 
 namespace TUGraz.VectoCore.Models.Declaration
 {
-	public sealed class PTOTransmission : LookupData<string, Watt>, IDeclarationAuxiliaryTable
+	public sealed class PTOTransmission : LookupData<string, AuxDemandEntry>, IDeclarationAuxiliaryTable
 	{
 		public const string NoPTO = "None";
 
@@ -54,7 +54,7 @@ namespace TUGraz.VectoCore.Models.Declaration
 		{
 			Data = table.Rows.Cast<DataRow>().ToDictionary(
 				r => r.Field<string>("technology"),
-				r => r.ParseDouble("powerloss").SI<Watt>());
+				r => new AuxDemandEntry { PowerDemand = r.ParseDouble("powerloss").SI<Watt>() });
 		}
 
 		public string[] GetTechnologies()
diff --git a/VectoCore/VectoCore/Models/Declaration/Payloads.cs b/VectoCore/VectoCore/Models/Declaration/Payloads.cs
index 1203a2743e97da58e26745287bd0808b86a2d8b6..be9d124b14d6a4971662cba681b86d05173723ce 100644
--- a/VectoCore/VectoCore/Models/Declaration/Payloads.cs
+++ b/VectoCore/VectoCore/Models/Declaration/Payloads.cs
@@ -29,72 +29,72 @@
 *   Martin Rexeis, rexeis@ivt.tugraz.at, IVT, Graz University of Technology
 */
 
-using System;
-using System.Data;
-using System.Linq;
-using TUGraz.VectoCommon.Utils;
-using TUGraz.VectoCore.Utils;
-
-namespace TUGraz.VectoCore.Models.Declaration
-{
-	public sealed class Payloads : LookupData<Kilogram, Payloads.PayloadEntry>
-	{
-		protected override string ResourceId
-		{
-			get { return DeclarationData.DeclarationDataResourcePrefix + ".Payloads.csv"; }
-		}
-
-		protected override string ErrorMessage
-		{
-			get { throw new InvalidOperationException("ErrorMessage not applicable."); }
-		}
-
-		public Kilogram Lookup10Percent(Kilogram grossVehicleWeight)
-		{
-			var section = Data.GetSection(d => d.Key > grossVehicleWeight);
-			return VectoMath.Interpolate(section.Item1.Key, section.Item2.Key,
-				section.Item1.Value.Payload10Percent, section.Item2.Value.Payload10Percent,
-				grossVehicleWeight);
-		}
-
-		public Kilogram Lookup50Percent(Kilogram grossVehicleWeight)
-		{
-			var section = Data.GetSection(d => d.Key > grossVehicleWeight);
-			return VectoMath.Interpolate(section.Item1.Key, section.Item2.Key,
-				section.Item1.Value.Payload50Percent, section.Item2.Value.Payload50Percent,
-				grossVehicleWeight);
-		}
-
-		public Kilogram Lookup75Percent(Kilogram grossVehicleWeight)
-		{
-			var section = Data.GetSection(d => d.Key > grossVehicleWeight);
-			return VectoMath.Interpolate(section.Item1.Key, section.Item2.Key,
-				section.Item1.Value.Payload75Percent, section.Item2.Value.Payload75Percent,
-				grossVehicleWeight);
-		}
-
-		public Kilogram LookupTrailer(Kilogram grossVehicleWeight, Kilogram curbWeight)
-		{
-			return 0.75 * (grossVehicleWeight - curbWeight);
-		}
-
-		protected override void ParseData(DataTable table)
-		{
-			Data = table.Rows.Cast<DataRow>()
-				.ToDictionary(
-					kv => kv.ParseDouble("grossvehicleweight").SI<Kilogram>(),
-					kv => new PayloadEntry {
-						Payload10Percent = kv.ParseDouble("payload10%").SI<Kilogram>(),
-						Payload50Percent = kv.ParseDouble("payload50%").SI<Kilogram>(),
-						Payload75Percent = kv.ParseDouble("payload75%").SI<Kilogram>()
-					});
-		}
-
-		public sealed class PayloadEntry
-		{
-			public Kilogram Payload10Percent;
-			public Kilogram Payload50Percent;
-			public Kilogram Payload75Percent;
-		}
-	}
+using System;
+using System.Data;
+using System.Linq;
+using TUGraz.VectoCommon.Utils;
+using TUGraz.VectoCore.Utils;
+
+namespace TUGraz.VectoCore.Models.Declaration
+{
+	public sealed class Payloads : LookupData<Kilogram, Payloads.PayloadEntry>
+	{
+		protected override string ResourceId
+		{
+			get { return DeclarationData.DeclarationDataResourcePrefix + ".Payloads.csv"; }
+		}
+
+		protected override string ErrorMessage
+		{
+			get { throw new InvalidOperationException("ErrorMessage not applicable."); }
+		}
+
+		public Kilogram Lookup10Percent(Kilogram grossVehicleWeight)
+		{
+			var section = Data.GetSection(d => d.Key > grossVehicleWeight);
+			return VectoMath.Interpolate(section.Item1.Key, section.Item2.Key,
+				section.Item1.Value.Payload10Percent, section.Item2.Value.Payload10Percent,
+				grossVehicleWeight);
+		}
+
+		public Kilogram Lookup50Percent(Kilogram grossVehicleWeight)
+		{
+			var section = Data.GetSection(d => d.Key > grossVehicleWeight);
+			return VectoMath.Interpolate(section.Item1.Key, section.Item2.Key,
+				section.Item1.Value.Payload50Percent, section.Item2.Value.Payload50Percent,
+				grossVehicleWeight);
+		}
+
+		public Kilogram Lookup75Percent(Kilogram grossVehicleWeight)
+		{
+			var section = Data.GetSection(d => d.Key > grossVehicleWeight);
+			return VectoMath.Interpolate(section.Item1.Key, section.Item2.Key,
+				section.Item1.Value.Payload75Percent, section.Item2.Value.Payload75Percent,
+				grossVehicleWeight);
+		}
+
+		public Kilogram LookupTrailer(Kilogram grossVehicleWeight, Kilogram curbWeight)
+		{
+			return 0.75 * (grossVehicleWeight - curbWeight);
+		}
+
+		protected override void ParseData(DataTable table)
+		{
+			Data = table.Rows.Cast<DataRow>()
+				.ToDictionary(
+					kv => kv.ParseDouble("grossvehicleweight").SI<Kilogram>(),
+					kv => new PayloadEntry {
+						Payload10Percent = kv.ParseDouble("payload10%").SI<Kilogram>(),
+						Payload50Percent = kv.ParseDouble("payload50%").SI<Kilogram>(),
+						Payload75Percent = kv.ParseDouble("payload75%").SI<Kilogram>()
+					});
+		}
+
+		public struct PayloadEntry
+		{
+			public Kilogram Payload10Percent;
+			public Kilogram Payload50Percent;
+			public Kilogram Payload75Percent;
+		}
+	}
 }
\ No newline at end of file
diff --git a/VectoCore/VectoCore/Models/Declaration/PneumaticSystem.cs b/VectoCore/VectoCore/Models/Declaration/PneumaticSystem.cs
index 4f4194b90a29696a8db9f54f66968853a85d6403..ef291b23cd70ad0a2d0e478a3f61b2041245cc1a 100644
--- a/VectoCore/VectoCore/Models/Declaration/PneumaticSystem.cs
+++ b/VectoCore/VectoCore/Models/Declaration/PneumaticSystem.cs
@@ -37,7 +37,7 @@ using TUGraz.VectoCore.Utils;
 
 namespace TUGraz.VectoCore.Models.Declaration
 {
-	public sealed class PneumaticSystem : LookupData<MissionType, string, Watt>, IDeclarationAuxiliaryTable
+	public sealed class PneumaticSystem : LookupData<MissionType, string, AuxDemandEntry>, IDeclarationAuxiliaryTable
 	{
 		protected override string ResourceId
 		{
@@ -55,7 +55,9 @@ namespace TUGraz.VectoCore.Models.Declaration
 				var technology = row.Field<string>("technology");
 				foreach (DataColumn col in table.Columns) {
 					if (col.Caption != "technology") {
-						Data[Tuple.Create(col.Caption.ParseEnum<MissionType>(), technology)] = row.ParseDouble(col.Caption).SI<Watt>();
+						Data[Tuple.Create(col.Caption.ParseEnum<MissionType>(), technology)] = new AuxDemandEntry() {
+							PowerDemand = row.ParseDouble(col.Caption).SI<Watt>()
+						};
 					}
 				}
 			}
diff --git a/VectoCore/VectoCore/Models/Declaration/Segment.cs b/VectoCore/VectoCore/Models/Declaration/Segment.cs
index aa0627c1736abbd73aa7e080d42a234e0c493a4c..2dee8dfb6e52a66d25d37cc9d200cce51224c156 100644
--- a/VectoCore/VectoCore/Models/Declaration/Segment.cs
+++ b/VectoCore/VectoCore/Models/Declaration/Segment.cs
@@ -35,8 +35,10 @@ using TUGraz.VectoCommon.Utils;
 
 namespace TUGraz.VectoCore.Models.Declaration
 {
-	public class Segment
+	public struct Segment
 	{
+		public bool Found;
+		
 		public VehicleClass VehicleClass { get; internal set; }
 
 		public VehicleCategory VehicleCategory { get; set; }
diff --git a/VectoCore/VectoCore/Models/Declaration/Segments.cs b/VectoCore/VectoCore/Models/Declaration/Segments.cs
index f070c9e29b1c41c2d2131dc48e2165dbcc551461..f9e89983f303ea9f82d50780d58d349e85b910d9 100644
--- a/VectoCore/VectoCore/Models/Declaration/Segments.cs
+++ b/VectoCore/VectoCore/Models/Declaration/Segments.cs
@@ -78,8 +78,12 @@ namespace TUGraz.VectoCore.Models.Declaration
 			}
 
 			var row = GetSegmentDataRow(vehicleCategory, axleConfiguration, grossVehicleMassRating, considerInvalid);
+			if (row == null) {
+				return new Segment() { Found = false };
+			}
 
 			var segment = new Segment {
+				Found = true,
 				GrossVehicleWeightMin = row.ParseDouble("gvw_min").SI().Ton.Cast<Kilogram>(),
 				GrossVehicleWeightMax = row.ParseDouble("gvw_max").SI().Ton.Cast<Kilogram>(),
 				VehicleCategory = vehicleCategory,
@@ -126,7 +130,7 @@ namespace TUGraz.VectoCore.Models.Declaration
 				var errorMessage = string.Format(ErrorMessage, vehicleCategory, axleConfiguration.GetName(),
 					grossVehicleMassRating);
 				Log.Fatal(errorMessage);
-				throw new VectoException(errorMessage, e);
+				throw new VectoException(errorMessage, e); 
 			}
 			return row;
 		}
@@ -210,12 +214,13 @@ namespace TUGraz.VectoCore.Models.Declaration
 							trailers.Sum(t => t.TrailerCurbWeight).DefaultIfNull(0);
 
 				var payloads = row.Field<string>(missionType.ToString()).Split('/');
+				var vehicleWeight = curbWeight + body.CurbWeight;
 				Kilogram refLoad, lowLoad = 0.SI<Kilogram>();
 				if (payloads.Length == 2) {
-					lowLoad = GetLoading(payloads[0], grossVehicleWeight, trailers, true);
-					refLoad = GetLoading(payloads[1], grossVehicleWeight, trailers, false);
+					lowLoad = GetLoading(payloads[0], grossVehicleWeight, vehicleWeight, trailers, true);
+					refLoad = GetLoading(payloads[1], grossVehicleWeight, vehicleWeight, trailers, false);
 				} else {
-					refLoad = GetLoading(row.Field<string>(missionType.ToString()), grossVehicleWeight, trailers, false);
+					refLoad = GetLoading(row.Field<string>(missionType.ToString()), grossVehicleWeight, vehicleWeight, trailers, false);
 				}
 
 				refLoad = refLoad.LimitTo(0.SI<Kilogram>(), maxLoad);
@@ -242,15 +247,17 @@ namespace TUGraz.VectoCore.Models.Declaration
 			return missions.ToArray();
 		}
 
-		private static Kilogram GetLoading(string payloadStr, Kilogram grossVehicleWeight,
+		private static Kilogram GetLoading(string payloadStr, Kilogram grossVehicleWeight, Kilogram vehicleWeight,
 			IEnumerable<MissionTrailer> trailers, bool lowLoading)
 		{
 			var refLoadValue = payloadStr.ToDouble(double.NaN);
 			if (double.IsNaN(refLoadValue)) {
-				return DeclarationData.GetPayloadForGrossVehicleWeight(grossVehicleWeight, payloadStr) +
-						trailers.Sum(
-							t => DeclarationData.GetPayloadForTrailerWeight(t.TrailerGrossVehicleWeight, t.TrailerCurbWeight, lowLoading))
-							.DefaultIfNull(0);
+				var vehiclePayload = DeclarationData.GetPayloadForGrossVehicleWeight(grossVehicleWeight, payloadStr)
+					.LimitTo(0.SI<Kilogram>(), grossVehicleWeight - vehicleWeight);
+				var trailerPayload = trailers.Sum(
+					t => DeclarationData.GetPayloadForTrailerWeight(t.TrailerGrossVehicleWeight, t.TrailerCurbWeight, lowLoading))
+					.DefaultIfNull(0);
+				return vehiclePayload + trailerPayload;
 			}
 			return refLoadValue.SI<Kilogram>();
 		}
diff --git a/VectoCore/VectoCore/Models/Declaration/StandardBodies.cs b/VectoCore/VectoCore/Models/Declaration/StandardBodies.cs
index 9b34acee42590d6b9733112cfda713842f067a21..f19aa9fb02fee03c6bef1810adbe47b8aeb565ef 100644
--- a/VectoCore/VectoCore/Models/Declaration/StandardBodies.cs
+++ b/VectoCore/VectoCore/Models/Declaration/StandardBodies.cs
@@ -29,105 +29,105 @@
 *   Martin Rexeis, rexeis@ivt.tugraz.at, IVT, Graz University of Technology
 */
 
-using System;
-using System.Collections.Generic;
-using System.Data;
-using System.Linq;
-using TUGraz.VectoCommon.Utils;
-using TUGraz.VectoCore.Utils;
-
-namespace TUGraz.VectoCore.Models.Declaration
-{
-	public sealed class StandardBody
-	{
-		public readonly Kilogram CurbWeight;
-		public readonly Kilogram GrossVehicleWeight;
-		public readonly SquareMeter[] DeltaCrossWindArea;
-		public readonly string Name;
-		public readonly List<Wheels.Entry> Wheels;
-		public readonly CubicMeter CargoVolume;
-
-		public Kilogram MaxPayLoad
-		{
-			get { return GrossVehicleWeight - CurbWeight; }
-		}
-
-		public StandardBody(string name, Kilogram curbWeight, Kilogram grossVehicleWeight, SquareMeter[] deltaCrossWindArea,
-			Wheels.Entry wheels, int axleCount, CubicMeter volume) :
-				this(name, curbWeight, grossVehicleWeight, deltaCrossWindArea,
-					wheels == null ? new List<Wheels.Entry>() : Enumerable.Repeat(wheels, axleCount).ToList(), volume) {}
-
-		private StandardBody(string name, Kilogram curbWeight, Kilogram grossVehicleWeight, SquareMeter[] deltaCrossWindArea,
-			List<Wheels.Entry> wheels, CubicMeter volume)
-		{
-			Name = name;
-			CurbWeight = curbWeight;
-			GrossVehicleWeight = grossVehicleWeight;
-			DeltaCrossWindArea = deltaCrossWindArea;
-			Wheels = wheels;
-			CargoVolume = volume;
-		}
-
-		//public static StandardBody operator +(StandardBody first, StandardBody second)
-		//{
-		//	var wheels = new List<Wheels.Entry>(first.Wheels);
-		//	wheels.AddRange(second.Wheels);
-		//	return new StandardBody(first.Name + second.Name, first.CurbWeight + second.CurbWeight,
-		//		first.GrossVehicleWeight + second.GrossVehicleWeight,
-		//		first.DeltaCrossWindArea + second.DeltaCrossWindArea,
-		//		wheels, first.CargoVolume + second.TotalCargoVolume);
-		//}
-	}
-
-	/// <summary>
-	/// Lookup Class for Standard Weights of Bodies, Trailers and Semitrailers.
-	/// Standard Weights include 
-	///		CurbWeight (=Empty Weight), 
-	///		Gross Vehicle Weight (=Maximum Allowed Weight),
-	///		MaxPayload,
-	///     DeltaCrossWindArea,
-	///     Wheels
-	/// </summary>
-	public sealed class StandardBodies : LookupData<string, StandardBody>
-	{
-		public static readonly StandardBody Empty = new StandardBody("", 0.SI<Kilogram>(), 0.SI<Kilogram>(),
-			new[] { 0.SI<SquareMeter>(), 0.SI<SquareMeter>() }, null, 0, 0.SI<CubicMeter>());
-
-		protected override string ResourceId
-		{
-			get { return DeclarationData.DeclarationDataResourcePrefix + ".Body_Trailers_Weights.csv"; }
-		}
-
-		protected override string ErrorMessage
-		{
-			get { return "StandardWeigths Lookup Error: No value found for ID '{0}'"; }
-		}
-
-		public override StandardBody Lookup(string id)
-		{
-			return string.IsNullOrWhiteSpace(id) ? Empty : base.Lookup(id);
-		}
-
-		protected override void ParseData(DataTable table)
-		{
-			Data = table.Rows.Cast<DataRow>().Select(k => {
-				var deltaCdxAStr = k.Field<string>("deltacdxafortraileroperationinlonghaul");
-				var deltaCdxA = new[] { 0.SI<SquareMeter>(), 0.SI<SquareMeter>() };
-				if (!deltaCdxAStr.Equals("-")) {
-					deltaCdxA = deltaCdxAStr.Split('/').Select(x => x.ToDouble().SI<SquareMeter>()).ToArray();
-				}
-				return new StandardBody(
-					k.Field<string>("name"),
-					k.ParseDoubleOrGetDefault("curbmass").SI<Kilogram>(),
-					k.ParseDoubleOrGetDefault("maxgrossmass").SI<Kilogram>(),
-					deltaCdxA,
-					!string.IsNullOrWhiteSpace(k.Field<string>("wheels"))
-						? DeclarationData.Wheels.Lookup(k.Field<string>("wheels"))
-						: null,
-					Int32.Parse(k.Field<string>("axlecount")),
-					k.ParseDouble("cargovolume").SI<CubicMeter>());
-			})
-				.ToDictionary(kv => kv.Name);
-		}
-	}
+using System;
+using System.Collections.Generic;
+using System.Data;
+using System.Linq;
+using TUGraz.VectoCommon.Utils;
+using TUGraz.VectoCore.Utils;
+
+namespace TUGraz.VectoCore.Models.Declaration
+{
+	public struct StandardBody
+	{
+		public readonly Kilogram CurbWeight;
+		public readonly Kilogram GrossVehicleWeight;
+		public readonly SquareMeter[] DeltaCrossWindArea;
+		public readonly string Name;
+		public readonly List<Wheels.Entry> Wheels;
+		public readonly CubicMeter CargoVolume;
+
+		public Kilogram MaxPayLoad
+		{
+			get { return GrossVehicleWeight - CurbWeight; }
+		}
+
+		public StandardBody(string name, Kilogram curbWeight, Kilogram grossVehicleWeight, SquareMeter[] deltaCrossWindArea,
+			Wheels.Entry? wheels, int axleCount, CubicMeter volume) :
+				this(name, curbWeight, grossVehicleWeight, deltaCrossWindArea,
+					!wheels.HasValue ? new List<Wheels.Entry>() : Enumerable.Repeat(wheels.Value, axleCount).ToList(), volume) {}
+
+		private StandardBody(string name, Kilogram curbWeight, Kilogram grossVehicleWeight, SquareMeter[] deltaCrossWindArea,
+			List<Wheels.Entry> wheels, CubicMeter volume)
+		{
+			Name = name;
+			CurbWeight = curbWeight;
+			GrossVehicleWeight = grossVehicleWeight;
+			DeltaCrossWindArea = deltaCrossWindArea;
+			Wheels = wheels;
+			CargoVolume = volume;
+		}
+
+		//public static StandardBody operator +(StandardBody first, StandardBody second)
+		//{
+		//	var wheels = new List<Wheels.Entry>(first.Wheels);
+		//	wheels.AddRange(second.Wheels);
+		//	return new StandardBody(first.Name + second.Name, first.CurbWeight + second.CurbWeight,
+		//		first.GrossVehicleWeight + second.GrossVehicleWeight,
+		//		first.DeltaCrossWindArea + second.DeltaCrossWindArea,
+		//		wheels, first.CargoVolume + second.TotalCargoVolume);
+		//}
+	}
+
+	/// <summary>
+	/// Lookup Class for Standard Weights of Bodies, Trailers and Semitrailers.
+	/// Standard Weights include 
+	///		CurbWeight (=Empty Weight), 
+	///		Gross Vehicle Weight (=Maximum Allowed Weight),
+	///		MaxPayload,
+	///     DeltaCrossWindArea,
+	///     Wheels
+	/// </summary>
+	public sealed class StandardBodies : LookupData<string, StandardBody>
+	{
+		public static readonly StandardBody Empty = new StandardBody("", 0.SI<Kilogram>(), 0.SI<Kilogram>(),
+			new[] { 0.SI<SquareMeter>(), 0.SI<SquareMeter>() }, null, 0, 0.SI<CubicMeter>());
+
+		protected override string ResourceId
+		{
+			get { return DeclarationData.DeclarationDataResourcePrefix + ".Body_Trailers_Weights.csv"; }
+		}
+
+		protected override string ErrorMessage
+		{
+			get { return "StandardWeigths Lookup Error: No value found for ID '{0}'"; }
+		}
+
+		public override StandardBody Lookup(string id)
+		{
+			return string.IsNullOrWhiteSpace(id) ? Empty : base.Lookup(id);
+		}
+
+		protected override void ParseData(DataTable table)
+		{
+			Data = table.Rows.Cast<DataRow>().Select(k => {
+				var deltaCdxAStr = k.Field<string>("deltacdxafortraileroperationinlonghaul");
+				var deltaCdxA = new[] { 0.SI<SquareMeter>(), 0.SI<SquareMeter>() };
+				if (!deltaCdxAStr.Equals("-")) {
+					deltaCdxA = deltaCdxAStr.Split('/').Select(x => x.ToDouble().SI<SquareMeter>()).ToArray();
+				}
+				return new StandardBody(
+					k.Field<string>("name"),
+					k.ParseDoubleOrGetDefault("curbmass").SI<Kilogram>(),
+					k.ParseDoubleOrGetDefault("maxgrossmass").SI<Kilogram>(),
+					deltaCdxA,
+					!string.IsNullOrWhiteSpace(k.Field<string>("wheels"))
+						? DeclarationData.Wheels.Lookup(k.Field<string>("wheels"))
+						: (Wheels.Entry?)null,
+					int.Parse(k.Field<string>("axlecount")),
+					k.ParseDouble("cargovolume").SI<CubicMeter>());
+			})
+				.ToDictionary(kv => kv.Name);
+		}
+	}
 }
\ No newline at end of file
diff --git a/VectoCore/VectoCore/Models/Declaration/SteeringPump.cs b/VectoCore/VectoCore/Models/Declaration/SteeringPump.cs
index 8b0ec360f361a9866664f2ac8cf29f26b5c5161a..2089c310f32077c1d6e54338a784dd03a9e089c8 100644
--- a/VectoCore/VectoCore/Models/Declaration/SteeringPump.cs
+++ b/VectoCore/VectoCore/Models/Declaration/SteeringPump.cs
@@ -178,7 +178,7 @@ namespace TUGraz.VectoCore.Models.Declaration
 			}
 		}
 
-		private class SteeringPumpValues<T>
+		private struct SteeringPumpValues<T>
 		{
 			public T UnloadedFriction;
 			public T Banking;
diff --git a/VectoCore/VectoCore/Models/Declaration/WHTCCorrection.cs b/VectoCore/VectoCore/Models/Declaration/WHTCCorrection.cs
index 48f214845805dfe649099f9247f5a8773dcfbbf8..94e7ea1ed6641251467d3161d48b9a7c2605ab65 100644
--- a/VectoCore/VectoCore/Models/Declaration/WHTCCorrection.cs
+++ b/VectoCore/VectoCore/Models/Declaration/WHTCCorrection.cs
@@ -71,7 +71,7 @@ namespace TUGraz.VectoCore.Models.Declaration
 			}
 		}
 
-		private class Entry
+		private struct Entry
 		{
 			public double Rural;
 			public double Urban;
diff --git a/VectoCore/VectoCore/Models/Declaration/Wheels.cs b/VectoCore/VectoCore/Models/Declaration/Wheels.cs
index c19a08e0a288a8899ae8a80dc1d0ec2b80069ab3..9bf7e401338c9498168ed13b54796e9384125aee 100644
--- a/VectoCore/VectoCore/Models/Declaration/Wheels.cs
+++ b/VectoCore/VectoCore/Models/Declaration/Wheels.cs
@@ -29,61 +29,61 @@
 *   Martin Rexeis, rexeis@ivt.tugraz.at, IVT, Graz University of Technology
 */
 
-using System;
-using System.Data;
-using System.Linq;
-using TUGraz.VectoCommon.Utils;
-using TUGraz.VectoCore.Utils;
-
-namespace TUGraz.VectoCore.Models.Declaration
-{
-	public sealed class Wheels : LookupData<string, Wheels.Entry>
-	{
-		private string[] _dimensions;
-
-		protected override string ResourceId
-		{
-			get { return DeclarationData.DeclarationDataResourcePrefix + ".Wheels.csv"; }
-		}
-
-		protected override string ErrorMessage
-		{
-			get { return "Wheels Lookup Error: No value found for Wheels. Key: '{0}'"; }
-		}
-
-		public override Entry Lookup(string key)
-		{
-			return base.Lookup(key.RemoveWhitespace());
-		}
-
-		protected override void ParseData(DataTable table)
-		{
-			Data = table.Rows.Cast<DataRow>()
-				.Select(row => new Entry {
-					WheelType = row.Field<string>(0).RemoveWhitespace(),
-					Inertia = row.ParseDouble("inertia").SI<KilogramSquareMeter>(),
-					WheelsDiameter = row.ParseDouble("d").SI().Milli.Meter.Cast<Meter>(),
-					CircumferenceFactor = row.ParseDouble("f")
-				}).ToDictionary(e => e.WheelType);
-			_dimensions = table.Rows.Cast<DataRow>().Select(row => row.Field<string>(0)).ToArray();
-		}
-
-		public class Entry
-		{
-			public string WheelType;
-			public KilogramSquareMeter Inertia;
-			public Meter WheelsDiameter;
-			public double CircumferenceFactor;
-
-			public Meter DynamicTyreRadius
-			{
-				get { return WheelsDiameter * CircumferenceFactor / (2 * Math.PI); }
-			}
-		}
-
-		public string[] GetWheelsDimensions()
-		{
-			return _dimensions;
-		}
-	}
+using System;
+using System.Data;
+using System.Linq;
+using TUGraz.VectoCommon.Utils;
+using TUGraz.VectoCore.Utils;
+
+namespace TUGraz.VectoCore.Models.Declaration
+{
+	public sealed class Wheels : LookupData<string, Wheels.Entry>
+	{
+		private string[] _dimensions;
+
+		protected override string ResourceId
+		{
+			get { return DeclarationData.DeclarationDataResourcePrefix + ".Wheels.csv"; }
+		}
+
+		protected override string ErrorMessage
+		{
+			get { return "Wheels Lookup Error: No value found for Wheels. Key: '{0}'"; }
+		}
+
+		public override Entry Lookup(string key)
+		{
+			return base.Lookup(key.RemoveWhitespace());
+		}
+
+		protected override void ParseData(DataTable table)
+		{
+			Data = table.Rows.Cast<DataRow>()
+				.Select(row => new Entry {
+					WheelType = row.Field<string>(0).RemoveWhitespace(),
+					Inertia = row.ParseDouble("inertia").SI<KilogramSquareMeter>(),
+					WheelsDiameter = row.ParseDouble("d").SI().Milli.Meter.Cast<Meter>(),
+					CircumferenceFactor = row.ParseDouble("f")
+				}).ToDictionary(e => e.WheelType);
+			_dimensions = table.Rows.Cast<DataRow>().Select(row => row.Field<string>(0)).ToArray();
+		}
+
+		public struct Entry
+		{
+			public string WheelType;
+			public KilogramSquareMeter Inertia;
+			public Meter WheelsDiameter;
+			public double CircumferenceFactor;
+
+			public Meter DynamicTyreRadius
+			{
+				get { return WheelsDiameter * CircumferenceFactor / (2 * Math.PI); }
+			}
+		}
+
+		public string[] GetWheelsDimensions()
+		{
+			return _dimensions;
+		}
+	}
 }
\ No newline at end of file
diff --git a/VectoCore/VectoCore/Models/Simulation/Data/VectoRunData.cs b/VectoCore/VectoCore/Models/Simulation/Data/VectoRunData.cs
index 37846d8653cff369a62ea4b6d0636c9ad7c2128c..83f67a12679fe968c8b94cb4cd8e7e0f9f8ef023 100644
--- a/VectoCore/VectoCore/Models/Simulation/Data/VectoRunData.cs
+++ b/VectoCore/VectoCore/Models/Simulation/Data/VectoRunData.cs
@@ -29,176 +29,200 @@
 *   Martin Rexeis, rexeis@ivt.tugraz.at, IVT, Graz University of Technology
 */
 
-using System.Collections.Generic;
-using System.ComponentModel.DataAnnotations;
-using System.Linq;
-using System.Xml.Linq;
-using TUGraz.VectoCommon.Exceptions;
-using TUGraz.VectoCommon.Models;
-using TUGraz.VectoCommon.Utils;
-using TUGraz.VectoCore.Configuration;
-using TUGraz.VectoCore.Models.Declaration;
-using TUGraz.VectoCore.Models.SimulationComponent.Data;
-using TUGraz.VectoCore.OutputData;
-using DriverData = TUGraz.VectoCore.Models.SimulationComponent.Data.DriverData;
-
-namespace TUGraz.VectoCore.Models.Simulation.Data
-{
-	[CustomValidation(typeof(VectoRunData), "ValidateRunData")]
-	public class VectoRunData : SimulationComponentData
-	{
-		[ValidateObject]
-		public VehicleData VehicleData { get; internal set; }
-
-		[ValidateObject]
-		public AirdragData AirdragData { get; internal set; }
-
-		[ValidateObject]
-		public CombustionEngineData EngineData { get; internal set; }
-
-		[ValidateObject]
-		public GearboxData GearboxData { get; internal set; }
-
-		[ValidateObject]
-		public AxleGearData AxleGearData { get; internal set; }
-
-		[ValidateObject]
-		public AngledriveData AngledriveData { get; internal set; }
-
-		[Required, ValidateObject]
-		public IDrivingCycleData Cycle { get; internal set; }
-
-		[ValidateObject]
-		public IEnumerable<AuxData> Aux { get; internal set; }
-
-		public AdvancedAuxData AdvancedAux { get; internal set; }
-
-		[ValidateObject]
-		public RetarderData Retarder { get; internal set; }
-
-		[ValidateObject]
-		public PTOData PTO { get; internal set; }
-
-		[ValidateObject]
-		public DriverData DriverData { get; internal set; }
-
-		public ExecutionMode ExecutionMode { get; internal set; }
-
-		[Required, MinLength(1)]
-		public string JobName { get; internal set; }
-
-		public string ModFileSuffix { get; internal set; }
-
-		[ValidateObject]
-		public IDeclarationReport Report { get; internal set; }
-
-		[Required, ValidateObject]
-		public LoadingType Loading { get; internal set; }
-
-		[ValidateObject]
-		public Mission Mission { get; internal set; }
-
-		public XElement InputDataHash { get; internal set; }
-
-		public class AuxData
-		{
-			// ReSharper disable once InconsistentNaming
-			public string ID;
-
-			public IList<string> Technology;
-
-			[SIRange(0, 100 * Constants.Kilo)] public Watt PowerDemand;
-
-			[Required] public AuxiliaryDemandType DemandType;
-
-			[ValidateObject] public AuxiliaryData Data;
-		}
-
-		public static ValidationResult ValidateRunData(VectoRunData runData, ValidationContext validationContext)
-		{
-			var gearboxData = runData.GearboxData;
-			var engineData = runData.EngineData;
-
-			var maxSpeed = 95.KMPHtoMeterPerSecond();
-
-			if (gearboxData != null) {
-				var axleGearData = runData.AxleGearData;
-				var angledriveData = runData.AngledriveData;
-				var hasAngleDrive = angledriveData != null && angledriveData.Angledrive != null;
-				var angledriveRatio = hasAngleDrive && angledriveData.Type == AngledriveType.SeparateAngledrive
-					? angledriveData.Angledrive.Ratio
-					: 1.0;
-				var axlegearRatio = axleGearData != null ? axleGearData.AxleGear.Ratio : 1.0;
-				var dynamicTyreRadius = runData.VehicleData != null ? runData.VehicleData.DynamicTyreRadius : 0.0.SI<Meter>();
-
-				if (gearboxData.Gears.Count + 1 != engineData.FullLoadCurves.Count) {
-					return
-						new ValidationResult(
-							string.Format("number of full-load curves in engine does not match gear count. engine fld: {0}, gears: {1}",
-								engineData.FullLoadCurves.Count, gearboxData.Gears.Count));
-				}
-
-				foreach (var gear in gearboxData.Gears) {
-					for (var angularVelocity = engineData.IdleSpeed;
-						angularVelocity < engineData.FullLoadCurves[gear.Key].RatedSpeed;
-						angularVelocity += 2.0 / 3.0 * (engineData.FullLoadCurves[gear.Key].RatedSpeed - engineData.IdleSpeed) / 10.0) {
-						if (!gear.Value.HasLockedGear) {
-							continue;
-						}
-
-						var velocity = angularVelocity / gear.Value.Ratio / angledriveRatio / axlegearRatio * dynamicTyreRadius;
-
-						if (velocity > maxSpeed) {
-							continue;
-						}
-
-						for (var inTorque = engineData.FullLoadCurves[gear.Key].FullLoadStationaryTorque(angularVelocity) / 3;
-							inTorque < engineData.FullLoadCurves[gear.Key].FullLoadStationaryTorque(angularVelocity);
-							inTorque += 2.0 / 3.0 * engineData.FullLoadCurves[gear.Key].FullLoadStationaryTorque(angularVelocity) / 10.0) {
-							NewtonMeter angledriveTorque;
-							try {
-								angledriveTorque = gear.Value.LossMap.GetOutTorque(angularVelocity, inTorque);
-							} catch (VectoException) {
-								return new ValidationResult(
-									string.Format("Interpolation of Gear-{0}-LossMap failed with torque={1} and angularSpeed={2}", gear.Key,
-										inTorque, angularVelocity.ConvertTo().Rounds.Per.Minute));
-							}
-							var axlegearTorque = angledriveTorque;
-							try {
-								if (hasAngleDrive) {
-									axlegearTorque = angledriveData.Angledrive.LossMap.GetOutTorque(angularVelocity / gear.Value.Ratio,
-										angledriveTorque);
-								}
-							} catch (VectoException) {
-								return new ValidationResult(
-									string.Format("Interpolation of Angledrive-LossMap failed with torque={0} and angularSpeed={1}",
-										angledriveTorque, (angularVelocity / gear.Value.Ratio).ConvertTo().Rounds.Per.Minute));
-							}
-
-							if (axleGearData != null) {
-								var axleAngularVelocity = angularVelocity / gear.Value.Ratio / angledriveRatio;
-								try {
-									axleGearData.AxleGear.LossMap.GetOutTorque(axleAngularVelocity, axlegearTorque);
-								} catch (VectoException) {
-									return
-										new ValidationResult(
-											string.Format(
-												"Interpolation of AxleGear-LossMap failed with torque={0} and angularSpeed={1} (gear={2}, velocity={3})",
-												axlegearTorque, axleAngularVelocity.ConvertTo().Rounds.Per.Minute, gear.Key, velocity));
-								}
-							}
-						}
-					}
-				}
-			}
-
-			if (runData.Cycle != null && runData.Cycle.Entries.Any(e => e.PTOActive)) {
-				if (runData.PTO == null || runData.PTO.PTOCycle == null) {
-					return new ValidationResult("PTOCycle is used in DrivingCycle, but is not defined in Vehicle-Data.");
-				}
-			}
-
-			return ValidationResult.Success;
-		}
-	}
+using System.Collections.Generic;
+using System.ComponentModel.DataAnnotations;
+using System.Linq;
+using System.Xml.Linq;
+using TUGraz.VectoCommon.Exceptions;
+using TUGraz.VectoCommon.Models;
+using TUGraz.VectoCommon.Utils;
+using TUGraz.VectoCore.Configuration;
+using TUGraz.VectoCore.Models.Declaration;
+using TUGraz.VectoCore.Models.SimulationComponent.Data;
+using TUGraz.VectoCore.Models.SimulationComponent.Data.Gearbox;
+using TUGraz.VectoCore.OutputData;
+using DriverData = TUGraz.VectoCore.Models.SimulationComponent.Data.DriverData;
+
+namespace TUGraz.VectoCore.Models.Simulation.Data
+{
+	[CustomValidation(typeof(VectoRunData), "ValidateRunData")]
+	public class VectoRunData : SimulationComponentData
+	{
+		[ValidateObject]
+		public VehicleData VehicleData { get; internal set; }
+
+		[ValidateObject]
+		public AirdragData AirdragData { get; internal set; }
+
+		[ValidateObject]
+		public CombustionEngineData EngineData { get; internal set; }
+
+		[ValidateObject]
+		public GearboxData GearboxData { get; internal set; }
+
+		[ValidateObject]
+		public AxleGearData AxleGearData { get; internal set; }
+
+		[ValidateObject]
+		public AngledriveData AngledriveData { get; internal set; }
+
+		[Required, ValidateObject]
+		public IDrivingCycleData Cycle { get; internal set; }
+
+		[ValidateObject]
+		public IEnumerable<AuxData> Aux { get; internal set; }
+
+		public AdvancedAuxData AdvancedAux { get; internal set; }
+
+		[ValidateObject]
+		public RetarderData Retarder { get; internal set; }
+
+		[ValidateObject]
+		public PTOData PTO { get; internal set; }
+
+		[ValidateObject]
+		public DriverData DriverData { get; internal set; }
+
+		public ExecutionMode ExecutionMode { get; internal set; }
+
+		[Required, MinLength(1)]
+		public string JobName { get; internal set; }
+
+		public string ModFileSuffix { get; internal set; }
+
+		[ValidateObject]
+		public IDeclarationReport Report { get; internal set; }
+
+		[Required, ValidateObject]
+		public LoadingType Loading { get; internal set; }
+
+		[ValidateObject]
+		public Mission Mission { get; internal set; }
+
+		public XElement InputDataHash { get; internal set; }
+
+		public class AuxData
+		{
+			// ReSharper disable once InconsistentNaming
+			public string ID;
+
+			public IList<string> Technology;
+
+			[SIRange(0, 100 * Constants.Kilo)] public Watt PowerDemand;
+
+			[Required] public AuxiliaryDemandType DemandType;
+
+			[ValidateObject] public AuxiliaryData Data;
+		}
+
+		public static ValidationResult ValidateRunData(VectoRunData runData, ValidationContext validationContext)
+		{
+			var gearboxData = runData.GearboxData;
+			var engineData = runData.EngineData;
+
+			if (gearboxData != null) {
+				var validationResult = CheckPowertrainLossMapsSize(runData, gearboxData, engineData);
+				if (validationResult != null) {
+					return validationResult;
+				}
+			}
+
+			if (runData.Cycle != null && runData.Cycle.Entries.Any(e => e.PTOActive)) {
+				if (runData.PTO == null || runData.PTO.PTOCycle == null) {
+					return new ValidationResult("PTOCycle is used in DrivingCycle, but is not defined in Vehicle-Data.");
+				}
+			}
+
+			return ValidationResult.Success;
+		}
+
+		private static ValidationResult CheckPowertrainLossMapsSize(VectoRunData runData, GearboxData gearboxData,
+			CombustionEngineData engineData)
+		{
+			var maxSpeed = 95.KMPHtoMeterPerSecond();
+			var axleGearData = runData.AxleGearData;
+			var angledriveData = runData.AngledriveData;
+			var hasAngleDrive = angledriveData != null && angledriveData.Angledrive != null;
+			var angledriveRatio = hasAngleDrive && angledriveData.Type == AngledriveType.SeparateAngledrive
+				? angledriveData.Angledrive.Ratio
+				: 1.0;
+			var axlegearRatio = axleGearData != null ? axleGearData.AxleGear.Ratio : 1.0;
+			var dynamicTyreRadius = runData.VehicleData != null ? runData.VehicleData.DynamicTyreRadius : 0.0.SI<Meter>();
+
+			if (gearboxData.Gears.Count + 1 != engineData.FullLoadCurves.Count) {
+				return
+					new ValidationResult(
+						string.Format("number of full-load curves in engine does not match gear count. engine fld: {0}, gears: {1}",
+							engineData.FullLoadCurves.Count, gearboxData.Gears.Count));
+			}
+
+			foreach (var gear in gearboxData.Gears) {
+				for (var angularVelocity = engineData.IdleSpeed;
+					angularVelocity < engineData.FullLoadCurves[gear.Key].RatedSpeed;
+					angularVelocity += 2.0 / 3.0 * (engineData.FullLoadCurves[gear.Key].RatedSpeed - engineData.IdleSpeed) / 10.0) {
+					if (!gear.Value.HasLockedGear) {
+						continue;
+					}
+
+					var velocity = angularVelocity / gear.Value.Ratio / angledriveRatio / axlegearRatio * dynamicTyreRadius;
+
+					if (velocity > maxSpeed) {
+						continue;
+					}
+
+					for (var inTorque = engineData.FullLoadCurves[gear.Key].FullLoadStationaryTorque(angularVelocity) / 3;
+						inTorque < engineData.FullLoadCurves[gear.Key].FullLoadStationaryTorque(angularVelocity);
+						inTorque += 2.0 / 3.0 * engineData.FullLoadCurves[gear.Key].FullLoadStationaryTorque(angularVelocity) / 10.0) {
+						var validateRunData = CheckLossMapsEntries(gear, angularVelocity, inTorque, angledriveData, axleGearData, velocity);
+						if (validateRunData != null) {
+							return validateRunData;
+						}
+					}
+				}
+			}
+			return null;
+		}
+
+		private static ValidationResult CheckLossMapsEntries(KeyValuePair<uint, GearData> gear, PerSecond angularVelocity,
+			NewtonMeter inTorque, AngledriveData angledriveData, AxleGearData axleGearData, SI velocity)
+		{
+			var hasAngleDrive = angledriveData != null && angledriveData.Angledrive != null;
+			var angledriveRatio = hasAngleDrive && angledriveData.Type == AngledriveType.SeparateAngledrive
+				? angledriveData.Angledrive.Ratio
+				: 1.0;
+			NewtonMeter angledriveTorque;
+			try {
+				angledriveTorque = gear.Value.LossMap.GetOutTorque(angularVelocity, inTorque);
+			} catch (VectoException) {
+				return new ValidationResult(
+					string.Format("Interpolation of Gear-{0}-LossMap failed with torque={1} and angularSpeed={2}", gear.Key,
+						inTorque, angularVelocity.ConvertTo().Rounds.Per.Minute));
+			}
+			var axlegearTorque = angledriveTorque;
+			try {
+				if (hasAngleDrive) {
+					axlegearTorque = angledriveData.Angledrive.LossMap.GetOutTorque(angularVelocity / gear.Value.Ratio,
+						angledriveTorque);
+				}
+			} catch (VectoException) {
+				return new ValidationResult(
+					string.Format("Interpolation of Angledrive-LossMap failed with torque={0} and angularSpeed={1}",
+						angledriveTorque, (angularVelocity / gear.Value.Ratio).ConvertTo().Rounds.Per.Minute));
+			}
+
+			if (axleGearData != null) {
+				var axleAngularVelocity = angularVelocity / gear.Value.Ratio / angledriveRatio;
+				try {
+					axleGearData.AxleGear.LossMap.GetOutTorque(axleAngularVelocity, axlegearTorque);
+				} catch (VectoException) {
+					return
+						new ValidationResult(
+							string.Format(
+								"Interpolation of AxleGear-LossMap failed with torque={0} and angularSpeed={1} (gear={2}, velocity={3})",
+								axlegearTorque, axleAngularVelocity.ConvertTo().Rounds.Per.Minute, gear.Key, velocity));
+				}
+			}
+			return null;
+		}
+	}
 }
\ No newline at end of file
diff --git a/VectoCore/VectoCore/Models/Simulation/Impl/JobContainer.cs b/VectoCore/VectoCore/Models/Simulation/Impl/JobContainer.cs
index 775c19f5ccd8861a42cccb59e153412c68f7a446..39f257b9139e565522136b35194128c4ac6aa2d0 100644
--- a/VectoCore/VectoCore/Models/Simulation/Impl/JobContainer.cs
+++ b/VectoCore/VectoCore/Models/Simulation/Impl/JobContainer.cs
@@ -29,203 +29,205 @@
 *   Martin Rexeis, rexeis@ivt.tugraz.at, IVT, Graz University of Technology
 */
 
-using System;
-using System.Collections.Generic;
-using System.Diagnostics;
-using System.Linq;
-using System.Threading;
-using System.Threading.Tasks;
-using TUGraz.VectoCommon.Models;
-using TUGraz.VectoCore.Models.SimulationComponent.Data;
-using TUGraz.VectoCore.OutputData;
-
-namespace TUGraz.VectoCore.Models.Simulation.Impl
-{
-	/// <summary>
-	/// Container for simulation jobs.
-	/// </summary>
-	public class JobContainer : LoggingObject
-	{
-		internal readonly List<RunEntry> Runs = new List<RunEntry>();
-		private readonly SummaryDataContainer _sumWriter;
-
-		private static int _jobNumber;
-
-		/// <summary>
-		/// Initializes a new empty instance of the <see cref="JobContainer"/> class.
-		/// </summary>
-		/// <param name="sumWriter">The sum writer.</param>
-		public JobContainer(SummaryDataContainer sumWriter)
-		{
-			_sumWriter = sumWriter;
-		}
-
-		public void AddRun(IVectoRun run)
-		{
-			Interlocked.Increment(ref _jobNumber);
-			Runs.Add(new RunEntry { Run = run, JobContainer = this });
-		}
-
-		public struct CycleTypeDescription
-		{
-			public string Name;
-			public CycleType CycleType;
-		}
-
-		public IEnumerable<CycleTypeDescription> GetCycleTypes()
-		{
-			return
-				Runs.Select(
-					r => new CycleTypeDescription { Name = r.Run.CycleName, CycleType = r.Run.GetContainer().RunData.Cycle.CycleType })
-					.Distinct();
-		}
-
-		/// <summary>
-		/// Adds the runs from the factory to the job container.
-		/// </summary>
-		/// <returns>A List of Run-Identifiers (unique), int</returns>
-		public List<int> AddRuns(SimulatorFactory factory)
-		{
-			var runIDs = new List<int>();
-
-			factory.SumData = _sumWriter;
-			factory.JobNumber = Interlocked.Increment(ref _jobNumber);
-
-			foreach (var run in factory.SimulationRuns()) {
-				var entry = new RunEntry { Run = run, JobContainer = this };
-				Runs.Add(entry);
-				runIDs.Add(entry.Run.RunIdentifier);
-			}
-			return runIDs;
-		}
-
-		/// <summary>
-		/// Execute all runs, waits until finished.
-		/// </summary>
-		public void Execute(bool multithreaded = true)
-		{
-			Log.Info("VectoRun started running. Executing Runs.");
-			if (multithreaded) {
-				Runs.ForEach(r => r.RunWorkerAsync());
-			} else {
-				var first = new Task(() => { });
-				var task = first;
-				// ReSharper disable once LoopCanBeConvertedToQuery
-				foreach (var run in Runs) {
-					var r = run;
-					task = task.ContinueWith(t => r.RunWorkerAsync().Wait(), TaskContinuationOptions.OnlyOnRanToCompletion);
-				}
-				first.Start();
-			}
-		}
-
-		public void Cancel()
-		{
-			foreach (var job in Runs) {
-				job.CancelAsync();
-			}
-			WaitFinished();
-		}
-
-		public void CancelCurrent()
-		{
-			foreach (var job in Runs) {
-				job.CancelAsync();
-			}
-		}
-
-		public void WaitFinished()
-		{
-			try {
-				Task.WaitAll(Runs.Select(r => r.RunTask).ToArray());
-			} catch (Exception) {
-				// ignored
-			}
-		}
-
-		private void JobCompleted()
-		{
-			if (AllCompleted) {
-				_sumWriter.Finish();
-			}
-		}
-
-		public bool AllCompleted
-		{
-			get { return Runs.All(r => r.Done); }
-		}
-
-		public Dictionary<int, ProgressEntry> GetProgress()
-		{
-			return Runs.ToDictionary(
-				r => r.Run.RunIdentifier,
-				r => new ProgressEntry {
-					RunName = r.Run.RunName,
-					CycleName = r.Run.CycleName,
-					RunSuffix = r.Run.RunSuffix,
-					Progress = r.Run.Progress,
-					Done = r.Done,
-					ExecTime = r.ExecTime,
-					Success = r.Success,
-					Canceled = r.Canceled,
-					Error = r.ExecException
-				});
-		}
-
-		public class ProgressEntry
-		{
-			public string RunName;
-			public double Progress;
-			public double ExecTime;
-			public Exception Error;
-			public bool Canceled;
-			public bool Success;
-			public bool Done;
-			public string CycleName;
-			public string RunSuffix;
-		}
-
-		[DebuggerDisplay("{Run.RunIdentifier}: {Run.RunName}, {Run.CycleName}")]
-		internal class RunEntry : LoggingObject
-		{
-			public IVectoRun Run;
-			public JobContainer JobContainer;
-			public bool Done;
-			public bool Success;
-			public bool Canceled;
-			public double ExecTime;
-			public Exception ExecException;
-			public readonly Task RunTask;
-
-			public RunEntry()
-			{
-				RunTask = new Task(() => {
-					var stopWatch = Stopwatch.StartNew();
-					try {
-						Run.Run();
-					} catch (Exception ex) {
-						Log.Error(ex, "Error during simulation run!");
-						ExecException = ex;
-					}
-					stopWatch.Stop();
-					Success = Run.FinishedWithoutErrors && ExecException == null;
-					Done = true;
-					ExecTime = stopWatch.Elapsed.TotalMilliseconds;
-					JobContainer.JobCompleted();
-				});
-			}
-
-			public Task RunWorkerAsync()
-			{
-				RunTask.Start();
-				return RunTask;
-			}
-
-			public void CancelAsync()
-			{
-				Run.Cancel();
-				Canceled = true;
-			}
-		}
-	}
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.Linq;
+using System.Runtime.CompilerServices;
+using System.Threading;
+using System.Threading.Tasks;
+using TUGraz.VectoCommon.Models;
+using TUGraz.VectoCore.Models.SimulationComponent.Data;
+using TUGraz.VectoCore.OutputData;
+
+namespace TUGraz.VectoCore.Models.Simulation.Impl
+{
+	/// <summary>
+	/// Container for simulation jobs.
+	/// </summary>
+	public class JobContainer : LoggingObject
+	{
+		internal readonly List<RunEntry> Runs = new List<RunEntry>();
+		private readonly SummaryDataContainer _sumWriter;
+
+		private static int _jobNumber;
+
+		/// <summary>
+		/// Initializes a new empty instance of the <see cref="JobContainer"/> class.
+		/// </summary>
+		/// <param name="sumWriter">The sum writer.</param>
+		public JobContainer(SummaryDataContainer sumWriter)
+		{
+			_sumWriter = sumWriter;
+		}
+
+		public void AddRun(IVectoRun run)
+		{
+			Interlocked.Increment(ref _jobNumber);
+			Runs.Add(new RunEntry { Run = run, JobContainer = this });
+		}
+
+		public struct CycleTypeDescription
+		{
+			public string Name;
+			public CycleType CycleType;
+		}
+
+		public IEnumerable<CycleTypeDescription> GetCycleTypes()
+		{
+			return
+				Runs.Select(
+					r => new CycleTypeDescription { Name = r.Run.CycleName, CycleType = r.Run.GetContainer().RunData.Cycle.CycleType })
+					.Distinct();
+		}
+
+		/// <summary>
+		/// Adds the runs from the factory to the job container.
+		/// </summary>
+		/// <returns>A List of Run-Identifiers (unique), int</returns>
+		public List<int> AddRuns(SimulatorFactory factory)
+		{
+			var runIDs = new List<int>();
+
+			factory.SumData = _sumWriter;
+			factory.JobNumber = Interlocked.Increment(ref _jobNumber);
+
+			foreach (var run in factory.SimulationRuns()) {
+				var entry = new RunEntry { Run = run, JobContainer = this };
+				Runs.Add(entry);
+				runIDs.Add(entry.Run.RunIdentifier);
+			}
+			return runIDs;
+		}
+
+		/// <summary>
+		/// Execute all runs, waits until finished.
+		/// </summary>
+		public void Execute(bool multithreaded = true)
+		{
+			Log.Info("VectoRun started running. Executing Runs.");
+			if (multithreaded) {
+				Runs.ForEach(r => r.RunWorkerAsync());
+			} else {
+				var first = new Task(() => { });
+				var task = first;
+				// ReSharper disable once LoopCanBeConvertedToQuery
+				foreach (var run in Runs) {
+					var r = run;
+					task = task.ContinueWith(t => r.RunWorkerAsync().Wait(), TaskContinuationOptions.OnlyOnRanToCompletion);
+				}
+				first.Start();
+			}
+		}
+
+		public void Cancel()
+		{
+			foreach (var job in Runs) {
+				job.CancelAsync();
+			}
+			WaitFinished();
+		}
+
+		public void CancelCurrent()
+		{
+			foreach (var job in Runs) {
+				job.CancelAsync();
+			}
+		}
+
+		public void WaitFinished()
+		{
+			try {
+				Task.WaitAll(Runs.Select(r => r.RunTask).ToArray());
+			} catch (Exception) {
+				// ignored
+			}
+		}
+
+		[MethodImpl(MethodImplOptions.Synchronized)]
+		private void JobCompleted()
+		{
+			if (AllCompleted) {
+				_sumWriter.Finish();
+			}
+		}
+
+		public bool AllCompleted
+		{
+			get { return Runs.All(r => r.Done); }
+		}
+
+		public Dictionary<int, ProgressEntry> GetProgress()
+		{
+			return Runs.ToDictionary(
+				r => r.Run.RunIdentifier,
+				r => new ProgressEntry {
+					RunName = r.Run.RunName,
+					CycleName = r.Run.CycleName,
+					RunSuffix = r.Run.RunSuffix,
+					Progress = r.Run.Progress,
+					Done = r.Done,
+					ExecTime = r.ExecTime,
+					Success = r.Success,
+					Canceled = r.Canceled,
+					Error = r.ExecException
+				});
+		}
+
+		public class ProgressEntry
+		{
+			public string RunName;
+			public double Progress;
+			public double ExecTime;
+			public Exception Error;
+			public bool Canceled;
+			public bool Success;
+			public bool Done;
+			public string CycleName;
+			public string RunSuffix;
+		}
+
+		[DebuggerDisplay("{Run.RunIdentifier}: {Run.RunName}, {Run.CycleName}")]
+		internal class RunEntry : LoggingObject
+		{
+			public IVectoRun Run;
+			public JobContainer JobContainer;
+			public bool Done;
+			public bool Success;
+			public bool Canceled;
+			public double ExecTime;
+			public Exception ExecException;
+			public readonly Task RunTask;
+
+			public RunEntry()
+			{
+				RunTask = new Task(() => {
+					var stopWatch = Stopwatch.StartNew();
+					try {
+						Run.Run();
+					} catch (Exception ex) {
+						Log.Error(ex, "Error during simulation run!");
+						ExecException = ex;
+					}
+					stopWatch.Stop();
+					Success = Run.FinishedWithoutErrors && ExecException == null;
+					Done = true;
+					ExecTime = stopWatch.Elapsed.TotalMilliseconds;
+					JobContainer.JobCompleted();
+				});
+			}
+
+			public Task RunWorkerAsync()
+			{
+				RunTask.Start();
+				return RunTask;
+			}
+
+			public void CancelAsync()
+			{
+				Run.Cancel();
+				Canceled = true;
+			}
+		}
+	}
 }
\ No newline at end of file
diff --git a/VectoCore/VectoCore/Models/Simulation/Impl/PowertrainBuilder.cs b/VectoCore/VectoCore/Models/Simulation/Impl/PowertrainBuilder.cs
index 9ffcefc470bfcdb0282dc8ca5c34e0426daf38fc..f677315e4e085472ae482fcf597976cf8ad75c4a 100644
--- a/VectoCore/VectoCore/Models/Simulation/Impl/PowertrainBuilder.cs
+++ b/VectoCore/VectoCore/Models/Simulation/Impl/PowertrainBuilder.cs
@@ -263,7 +263,7 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl
 
 			if (data.PTO != null) {
 				aux.AddConstant(Constants.Auxiliaries.IDs.PTOTransmission,
-					DeclarationData.PTOTransmission.Lookup(data.PTO.TransmissionType));
+					DeclarationData.PTOTransmission.Lookup(data.PTO.TransmissionType).PowerDemand);
 				container.ModalData.AddAuxiliary(Constants.Auxiliaries.IDs.PTOTransmission,
 					Constants.Auxiliaries.PowerPrefix + Constants.Auxiliaries.IDs.PTOTransmission);
 
diff --git a/VectoCore/VectoCore/Models/Simulation/Impl/SimulatorFactory.cs b/VectoCore/VectoCore/Models/Simulation/Impl/SimulatorFactory.cs
index eb8bf008cc8ad5559e832ff6416cb6f5e80c4704..2c395c3bdecff8629c84e037a59256f356582539 100644
--- a/VectoCore/VectoCore/Models/Simulation/Impl/SimulatorFactory.cs
+++ b/VectoCore/VectoCore/Models/Simulation/Impl/SimulatorFactory.cs
@@ -41,6 +41,7 @@ using TUGraz.VectoCommon.Utils;
 using TUGraz.VectoCore.InputData;
 using TUGraz.VectoCore.InputData.Reader.Impl;
 using TUGraz.VectoCore.Models.Declaration;
+using TUGraz.VectoCore.Models.Simulation.Data;
 using TUGraz.VectoCore.Models.SimulationComponent.Data;
 using TUGraz.VectoCore.OutputData;
 using TUGraz.VectoCore.OutputData.ModFilter;
@@ -53,7 +54,7 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl
 		private static int _jobNumberCounter;
 
 		private readonly ExecutionMode _mode;
-		private readonly bool _engineOnlyMode;
+		private bool _engineOnlyMode;
 
 		public SimulatorFactory(ExecutionMode mode, IInputDataProvider dataProvider, IOutputDataWriter writer,
 			IDeclarationReport declarationReport = null, bool validate = true)
@@ -74,30 +75,47 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl
 
 			switch (mode) {
 				case ExecutionMode.Declaration:
-					var declDataProvider = dataProvider as IDeclarationInputDataProvider;
-					if (declDataProvider == null) {
-						throw new VectoException("InputDataProvider does not implement DeclarationData interface");
-					}
+					var declDataProvider = ToDeclarationInputDataProvider(dataProvider);
 					var report = declarationReport ?? new XMLDeclarationReport(writer);
 					DataReader = new DeclarationModeVectoRunDataFactory(declDataProvider, report);
 					break;
 				case ExecutionMode.Engineering:
-					var engDataProvider = dataProvider as IEngineeringInputDataProvider;
-					if (engDataProvider == null) {
-						throw new VectoException("InputDataProvider does not implement Engineering interface");
-					}
-					if (engDataProvider.JobInputData().EngineOnlyMode) {
-						DataReader = new EngineOnlyVectoRunDataFactory(engDataProvider);
-						_engineOnlyMode = true;
-					} else {
-						DataReader = new EngineeringModeVectoRunDataFactory(engDataProvider);
-					}
+					CreateEngineeringDataReader(dataProvider);
 					break;
 				default:
 					throw new VectoException("Unkown factory mode in SimulatorFactory: {0}", mode);
 			}
 		}
 
+		private void CreateEngineeringDataReader(IInputDataProvider dataProvider)
+		{
+			var engDataProvider = ToEngineeringInputDataProvider(dataProvider);
+			if (engDataProvider.JobInputData().EngineOnlyMode) {
+				DataReader = new EngineOnlyVectoRunDataFactory(engDataProvider);
+				_engineOnlyMode = true;
+			} else {
+				DataReader = new EngineeringModeVectoRunDataFactory(engDataProvider);
+			}
+		}
+
+		private static IDeclarationInputDataProvider ToDeclarationInputDataProvider(IInputDataProvider dataProvider)
+		{
+			var declDataProvider = dataProvider as IDeclarationInputDataProvider;
+			if (declDataProvider == null) {
+				throw new VectoException("InputDataProvider does not implement DeclarationData interface");
+			}
+			return declDataProvider;
+		}
+
+		private static IEngineeringInputDataProvider ToEngineeringInputDataProvider(IInputDataProvider dataProvider)
+		{
+			var engDataProvider = dataProvider as IEngineeringInputDataProvider;
+			if (engDataProvider == null) {
+				throw new VectoException("InputDataProvider does not implement Engineering interface");
+			}
+			return engDataProvider;
+		}
+
 		public bool Validate { get; set; }
 
 		public IVectoRunDataFactory DataReader { get; private set; }
@@ -119,27 +137,13 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl
 		public IEnumerable<IVectoRun> SimulationRuns()
 		{
 			var i = 0;
-			var modDataFilter = ModalResults1Hz
-				? new IModalDataFilter[] { new ModalData1HzFilter() }
-				: null;
-
-			if (ActualModalData) {
-				modDataFilter = new IModalDataFilter[] { new ActualModalDataFilter(), };
-			}
 
 
 			var warning1Hz = false;
 
 			foreach (var data in DataReader.NextRun()) {
 				var d = data;
-				if (d.Report != null) {
-					d.Report.PrepareResult(d.Loading, d.Mission, d);
-				}
-				Action<ModalDataContainer> addReportResult = writer => {
-					if (d.Report != null) {
-						d.Report.AddResult(d.Loading, d.Mission, d, writer);
-					}
-				};
+				var addReportResult = PrepareReport(data);
 				if (!data.Cycle.CycleType.IsDistanceBased() && ModalResults1Hz && !warning1Hz) {
 					Log.Error("Output filter for 1Hz results is only available for distance-based cycles!");
 					warning1Hz = true;
@@ -148,7 +152,7 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl
 					new ModalDataContainer(data, ModWriter,
 						addReportResult: _mode == ExecutionMode.Declaration ? addReportResult : null,
 						writeEngineOnly: _engineOnlyMode,
-						filter: data.Cycle.CycleType.IsDistanceBased() && ModalResults1Hz || ActualModalData ? modDataFilter : null) {
+						filter: GetModDataFilter(data)) {
 							WriteAdvancedAux = data.AdvancedAux != null && data.AdvancedAux.AuxiliaryAssembly == AuxiliaryModel.Advanced,
 							WriteModalResults = _mode != ExecutionMode.Declaration || WriteModalResults
 						};
@@ -156,39 +160,72 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl
 				var builder = new PowertrainBuilder(modContainer, modData => {
 					if (SumData != null) {
 						SumData.Write(modData, JobNumber, current, d);
-						//SumData.Write(modContainer, d.JobName, string.Format("{0}-{1}", JobNumber, current),
-						//	d.Cycle.Name + Constants.FileExtensions.CycleFile, mass, loading, volume ?? 0.SI<CubicMeter>(), gearCount);
 					}
 				});
 
-				VectoRun run;
-
-				switch (data.Cycle.CycleType) {
-					case CycleType.DistanceBased:
-						run = new DistanceRun(builder.Build(data));
-						break;
-					case CycleType.EngineOnly:
-					case CycleType.PWheel:
-					case CycleType.MeasuredSpeed:
-					case CycleType.MeasuredSpeedGear:
-						run = new TimeRun(builder.Build(data));
-						break;
-					case CycleType.PTO:
-						throw new VectoException("PTO Cycle can not be used as main cycle!");
-					default:
-						throw new ArgumentOutOfRangeException("CycleType unknown:" + data.Cycle.CycleType);
-				}
+				var run = GetVectoRun(data, builder);
 
 				if (Validate) {
-					var validationErrors = run.Validate(_mode, data.GearboxData == null ? (GearboxType?)null : data.GearboxData.Type,
+					ValidateVectoRunData(run, data.GearboxData == null ? (GearboxType?)null : data.GearboxData.Type,
 						data.Mission != null && data.Mission.MissionType.IsEMS());
-					if (validationErrors.Any()) {
-						throw new VectoException("Validation of Run-Data Failed: " +
-												string.Join("\n", validationErrors.Select(r => r.ErrorMessage + string.Join("; ", r.MemberNames))));
-					}
 				}
 				yield return run;
 			}
 		}
+
+		private IModalDataFilter[] GetModDataFilter(VectoRunData data)
+		{
+			var modDataFilter = ModalResults1Hz
+				? new IModalDataFilter[] { new ModalData1HzFilter() }
+				: null;
+
+			if (ActualModalData) {
+				modDataFilter = new IModalDataFilter[] { new ActualModalDataFilter(), };
+			}
+			return data.Cycle.CycleType.IsDistanceBased() && ModalResults1Hz || ActualModalData ? modDataFilter : null;
+		}
+
+		private void ValidateVectoRunData(VectoRun run, GearboxType? gearboxtype, bool isEms)
+		{
+			var validationErrors = run.Validate(_mode, gearboxtype, isEms);
+			if (validationErrors.Any()) {
+				throw new VectoException("Validation of Run-Data Failed: " +
+										string.Join("\n", validationErrors.Select(r => r.ErrorMessage + string.Join("; ", r.MemberNames))));
+			}
+		}
+
+		private static VectoRun GetVectoRun(VectoRunData data, PowertrainBuilder builder)
+		{
+			VectoRun run;
+			switch (data.Cycle.CycleType) {
+				case CycleType.DistanceBased:
+					run = new DistanceRun(builder.Build(data));
+					break;
+				case CycleType.EngineOnly:
+				case CycleType.PWheel:
+				case CycleType.MeasuredSpeed:
+				case CycleType.MeasuredSpeedGear:
+					run = new TimeRun(builder.Build(data));
+					break;
+				case CycleType.PTO:
+					throw new VectoException("PTO Cycle can not be used as main cycle!");
+				default:
+					throw new ArgumentOutOfRangeException("CycleType unknown:" + data.Cycle.CycleType);
+			}
+			return run;
+		}
+
+		private static Action<ModalDataContainer> PrepareReport(VectoRunData data)
+		{
+			if (data.Report != null) {
+				data.Report.PrepareResult(data.Loading, data.Mission, data);
+			}
+			Action<ModalDataContainer> addReportResult = writer => {
+				if (data.Report != null) {
+					data.Report.AddResult(data.Loading, data.Mission, data, writer);
+				}
+			};
+			return addReportResult;
+		}
 	}
 }
\ No newline at end of file
diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Data/VehicleData.cs b/VectoCore/VectoCore/Models/SimulationComponent/Data/VehicleData.cs
index 1d688b2e734e64862d201e3aba535b0a44a9427e..2422a84ff6faa1154fef0106916db14c0267ee7c 100644
--- a/VectoCore/VectoCore/Models/SimulationComponent/Data/VehicleData.cs
+++ b/VectoCore/VectoCore/Models/SimulationComponent/Data/VehicleData.cs
@@ -56,9 +56,10 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data
 		public static ValidationResult ValidateAirDragData(AirdragData airDragData, ValidationContext validationContext)
 		{
 			if (airDragData.CrossWindCorrectionMode != CrossWindCorrectionMode.DeclarationModeCorrection &&
-				airDragData.CrossWindCorrectionCurve.AirDragArea == null)
+				airDragData.CrossWindCorrectionCurve.AirDragArea == null) {
 				return new ValidationResult(
 					"AirDrag Area (CdxA) must not be empty when the cross wind correction mode is not \"Speed dependent (Declaration Mode)\"");
+			}
 
 			return ValidationResult.Success;
 		}
@@ -72,7 +73,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data
 	{
 		public string VIN { get; internal set; }
 
-		public string LegislativeClass { get; internal set; }
+		public LegislativeClass LegislativeClass { get; internal set; }
 
 		public VehicleCategory VehicleCategory { get; internal set; }
 
@@ -280,8 +281,13 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data
 			}
 
 			var numDrivenAxles = vehicleData._axleData.Count(x => x.AxleType == AxleType.VehicleDriven);
-			if (numDrivenAxles != 1) {
-				return new ValidationResult("Exactly one axle has to be defined as driven!");
+			if (numDrivenAxles != vehicleData.AxleConfiguration.NumDrivenAxles()) {
+				return
+					new ValidationResult(string.Format(
+						vehicleData.AxleConfiguration.NumAxles() == 1
+							? "Exactly {0} axle has to be defined as driven, given {1}!"
+							: "Exactly {0} axles have to be defined as driven, given {1}!", vehicleData.AxleConfiguration.NumDrivenAxles(),
+						numDrivenAxles));
 			}
 
 			return ValidationResult.Success;
diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/AMTShiftStrategy.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/AMTShiftStrategy.cs
index 1aa3d8a4ad9e4af5af8a753c9b2cf7514a13cc6b..137d9a7e9123283d7c2f732fe0a4d21169002507 100644
--- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/AMTShiftStrategy.cs
+++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/AMTShiftStrategy.cs
@@ -29,301 +29,306 @@
 *   Martin Rexeis, rexeis@ivt.tugraz.at, IVT, Graz University of Technology
 */
 
-using System.Linq;
-using TUGraz.VectoCommon.Utils;
-using TUGraz.VectoCore.Configuration;
-using TUGraz.VectoCore.Models.Connector.Ports.Impl;
-using TUGraz.VectoCore.Models.Simulation.Data;
-using TUGraz.VectoCore.Models.Simulation.DataBus;
-
-namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
-{
-	/// <summary>
-	/// AMTShiftStrategy implements the AMT Shifting Behaviour.
-	/// </summary>
-	public class AMTShiftStrategy : ShiftStrategy
-	{
-		protected readonly uint MaxStartGear;
-		protected uint _nextGear;
-
-		public AMTShiftStrategy(VectoRunData runData, IDataBus dataBus) : base(runData.GearboxData, dataBus)
-		{
-			EarlyShiftUp = true;
-			SkipGears = true;
-
-			var transmissionRatio = runData.AxleGearData.AxleGear.Ratio *
-									(runData.AngledriveData == null ? 1.0 : runData.AngledriveData.Angledrive.Ratio) /
-									runData.VehicleData.DynamicTyreRadius;
-			var minEngineSpeed = (runData.EngineData.FullLoadCurves[0].RatedSpeed - runData.EngineData.IdleSpeed) *
-								Constants.SimulationSettings.ClutchClosingSpeedNorm + runData.EngineData.IdleSpeed;
-			foreach (var gearData in ModelData.Gears.Reverse()) {
-				if (ModelData.StartSpeed * transmissionRatio * gearData.Value.Ratio > minEngineSpeed) {
-					MaxStartGear = gearData.Key;
-					break;
-				}
-			}
-		}
-
-		private bool SpeedTooLowForEngine(uint gear, PerSecond outAngularSpeed)
-		{
-			return (outAngularSpeed * ModelData.Gears[gear].Ratio).IsSmaller(DataBus.EngineIdleSpeed);
-		}
-
-		private bool SpeedTooHighForEngine(uint gear, PerSecond outAngularSpeed)
-		{
-			return
-				(outAngularSpeed * ModelData.Gears[gear].Ratio).IsGreaterOrEqual(ModelData.Gears[gear].MaxSpeed ??
-																				DataBus.EngineN95hSpeed);
-		}
-
-		public override GearInfo NextGear
-		{
-			get { return new GearInfo(_nextGear, false); }
-		}
-
-		public override uint Engage(Second absTime, Second dt, NewtonMeter outTorque, PerSecond outAngularVelocity)
-		{
-			while (_nextGear > 1 && SpeedTooLowForEngine(_nextGear, outAngularVelocity)) {
-				_nextGear--;
-			}
-			while (_nextGear < ModelData.Gears.Count && SpeedTooHighForEngine(_nextGear, outAngularVelocity)) {
-				_nextGear++;
-			}
-
-			return _nextGear;
-		}
-
-		public override void Disengage(Second absTime, Second dt, NewtonMeter outTorque, PerSecond outEngineSpeed) {}
-
-		public override uint InitGear(Second absTime, Second dt, NewtonMeter outTorque, PerSecond outAngularVelocity)
-		{
-			if (DataBus.VehicleSpeed.IsEqual(0)) {
-				for (var gear = MaxStartGear; gear > 1; gear--) {
-					var inAngularSpeed = outAngularVelocity * ModelData.Gears[gear].Ratio;
-
-					var ratedSpeed = DataBus.EngineRatedSpeed;
-					if (inAngularSpeed > ratedSpeed || inAngularSpeed.IsEqual(0)) {
-						continue;
-					}
-
-					var response = _gearbox.Initialize(gear, outTorque, outAngularVelocity);
-
-					var fullLoadPower = response.DynamicFullLoadPower; //EnginePowerRequest - response.DeltaFullLoad;
-					var reserve = 1 - response.EnginePowerRequest / fullLoadPower;
-					
-					if (response.EngineSpeed > DataBus.EngineIdleSpeed && reserve >= ModelData.StartTorqueReserve) {
-						_nextGear = gear;
-						return gear;
-					}
-				}
-				_nextGear = 1;
-				return 1;
-			}
-			for (var gear = (uint)ModelData.Gears.Count; gear > 1; gear--) {
-				var response = _gearbox.Initialize(gear, outTorque, outAngularVelocity);
-
-				var inAngularSpeed = outAngularVelocity * ModelData.Gears[gear].Ratio;
-				var fullLoadPower = response.EnginePowerRequest - response.DeltaFullLoad;
-				var reserve = 1 - response.EnginePowerRequest / fullLoadPower;
-				var inTorque = response.ClutchPowerRequest / inAngularSpeed;
-
-				// if in shift curve and torque reserve is provided: return the current gear
-				if (!IsBelowDownShiftCurve(gear, inTorque, inAngularSpeed) && !IsAboveUpShiftCurve(gear, inTorque, inAngularSpeed) &&
-					reserve >= ModelData.StartTorqueReserve) {
-					if ((inAngularSpeed - DataBus.EngineIdleSpeed) / (DataBus.EngineRatedSpeed - DataBus.EngineIdleSpeed) <
-						Constants.SimulationSettings.ClutchClosingSpeedNorm && gear > 1) {
-						gear--;
-					}
-					_nextGear = gear;
-					return gear;
-				}
-
-				// if over the up shift curve: return the previous gear (even thou it did not provide the required torque reserve)
-				if (IsAboveUpShiftCurve(gear, inTorque, inAngularSpeed) && gear < ModelData.Gears.Count) {
-					_nextGear = gear;
-					return gear + 1;
-				}
-			}
-
-			// fallback: return first gear
-			_nextGear = 1;
-			return 1;
-		}
-
-		public override bool ShiftRequired(Second absTime, Second dt, NewtonMeter outTorque, PerSecond outAngularVelocity,
-			NewtonMeter inTorque, PerSecond inAngularVelocity, uint gear, Second lastShiftTime)
-		{
-			// no shift when vehicle stands
-			if (DataBus.VehicleStopped) {
-				return false;
-			}
-
-			// emergency shift to not stall the engine ------------------------
-			if (gear == 1 && SpeedTooLowForEngine(_nextGear, inAngularVelocity / ModelData.Gears[gear].Ratio)) {
-				return true;
-			}
-			_nextGear = gear;
-			while (_nextGear > 1 && SpeedTooLowForEngine(_nextGear, inAngularVelocity / ModelData.Gears[gear].Ratio)) {
-				_nextGear--;
-			}
-			while (_nextGear < ModelData.Gears.Count &&
-					SpeedTooHighForEngine(_nextGear, inAngularVelocity / ModelData.Gears[gear].Ratio)) {
-				_nextGear++;
-			}
-			if (_nextGear != gear) {
-				return true;
-			}
-
-			// normal shift when all requirements are fullfilled ------------------
-			var minimumShiftTimePassed = (lastShiftTime + ModelData.ShiftTime).IsSmallerOrEqual(absTime);
-			if (!minimumShiftTimePassed) {
-				return false;
-			}
-
-			_nextGear = CheckDownshift(absTime, dt, outTorque, outAngularVelocity, inTorque, inAngularVelocity, gear);
-			if (_nextGear != gear) {
-				return true;
-			}
-
-			_nextGear = CheckUpshift(absTime, dt, outTorque, outAngularVelocity, inTorque, inAngularVelocity, gear);
-
-			//if ((ModelData.Gears[_nextGear].Ratio * outAngularVelocity - DataBus.EngineIdleSpeed) /
-			//	(DataBus.EngineRatedSpeed - DataBus.EngineIdleSpeed) <
-			//	Constants.SimulationSettings.ClutchClosingSpeedNorm && _nextGear > 1) {
-			//	_nextGear--;
-			//}
-
-			return _nextGear != gear;
-		}
-
-		protected virtual uint CheckUpshift(Second absTime, Second dt, NewtonMeter outTorque, PerSecond outAngularVelocity,
-			NewtonMeter inTorque, PerSecond inAngularVelocity, uint currentGear)
-		{
-			// if the driver's intention is _not_ to accelerate or drive along then don't upshift
-			if (DataBus.DriverBehavior != DrivingBehavior.Accelerating && DataBus.DriverBehavior != DrivingBehavior.Driving) {
-				return currentGear;
-			}
-			if ((absTime - _gearbox.LastDownshift).IsSmaller(_gearbox.ModelData.UpshiftAfterDownshiftDelay)) {
-				return currentGear;
-			}
-			var nextGear = DoCheckUpshift(absTime, dt, outTorque, outAngularVelocity, inTorque, inAngularVelocity, currentGear);
-			if (nextGear == currentGear) {
-				return nextGear;
-			}
-
-			// estimate acceleration for selected gear
-			if (EstimateAccelerationForGear(nextGear, outAngularVelocity).IsSmaller(_gearbox.ModelData.UpshiftMinAcceleration)) {
-				// if less than 0.1 for next gear, don't shift
-				if (nextGear - currentGear == 1) {
-					return currentGear;
-				}
-				// if a gear is skipped but acceleration is less than 0.1, try for next gear. if acceleration is still below 0.1 don't shift!
-				if (nextGear > currentGear &&
-					EstimateAccelerationForGear(currentGear + 1, outAngularVelocity)
-						.IsSmaller(_gearbox.ModelData.UpshiftMinAcceleration)) {
-					return currentGear;
-				}
-				nextGear = currentGear + 1;
-			}
-
-			return nextGear;
-		}
-
-		protected virtual uint CheckDownshift(Second absTime, Second dt, NewtonMeter outTorque, PerSecond outAngularVelocity,
-			NewtonMeter inTorque, PerSecond inAngularVelocity, uint currentGear)
-		{
-			if ((absTime - _gearbox.LastUpshift).IsSmaller(_gearbox.ModelData.DownshiftAfterUpshiftDelay)) {
-				return currentGear;
-			}
-			return DoCheckDownshift(absTime, dt, outTorque, outAngularVelocity, inTorque, inAngularVelocity, currentGear);
-		}
-
-		protected virtual uint DoCheckUpshift(Second absTime, Second dt, NewtonMeter outTorque, PerSecond outAngularVelocity,
-			NewtonMeter inTorque, PerSecond inAngularVelocity, uint currentGear)
-		{
-			// upshift
-			if (IsAboveUpShiftCurve(currentGear, inTorque, inAngularVelocity)) {
-				currentGear++;
-
-				while (SkipGears && currentGear < ModelData.Gears.Count) {
-					currentGear++;
-					var tmpGear = Gearbox.Gear;
-					_gearbox.Gear = currentGear;
-					var response = (ResponseDryRun)_gearbox.Request(absTime, dt, outTorque, outAngularVelocity, true);
-					_gearbox.Gear = tmpGear;
-
-					inAngularVelocity = response.EngineSpeed; //ModelData.Gears[currentGear].Ratio * outAngularVelocity;
-					inTorque = response.ClutchPowerRequest / inAngularVelocity;
-
-					var maxTorque = VectoMath.Min(response.DynamicFullLoadPower / ((DataBus.EngineSpeed + response.EngineSpeed) / 2),
-						currentGear > 1
-							? ModelData.Gears[currentGear].ShiftPolygon.InterpolateDownshift(response.EngineSpeed)
-							: double.MaxValue.SI<NewtonMeter>());
-					var reserve = 1 - inTorque / maxTorque;
-
-					if (reserve >= ModelData.TorqueReserve && IsAboveDownShiftCurve(currentGear, inTorque, inAngularVelocity)) {
-						continue;
-					}
-
-					currentGear--;
-					break;
-				}
-			}
-
-			// early up shift to higher gear ---------------------------------------
-			if (EarlyShiftUp && currentGear < ModelData.Gears.Count) {
-				// try if next gear would provide enough torque reserve
-				var tryNextGear = currentGear + 1;
-				var tmpGear = Gearbox.Gear;
-				_gearbox.Gear = tryNextGear;
-				var response = (ResponseDryRun)_gearbox.Request(absTime, dt, outTorque, outAngularVelocity, true);
-				_gearbox.Gear = tmpGear;
-
-				inAngularVelocity = ModelData.Gears[tryNextGear].Ratio * outAngularVelocity;
-				inTorque = response.ClutchPowerRequest / inAngularVelocity;
-
-				// if next gear supplied enough power reserve: take it
-				// otherwise take
-				if (!IsBelowDownShiftCurve(tryNextGear, inTorque, inAngularVelocity)) {
-					var fullLoadPower = response.EnginePowerRequest - response.DeltaFullLoad;
-					var reserve = 1 - response.EnginePowerRequest / fullLoadPower;
-
-					if (reserve >= ModelData.TorqueReserve) {
-						currentGear = tryNextGear;
-					}
-				}
-			}
-			return currentGear;
-		}
-
-		protected virtual uint DoCheckDownshift(Second absTime, Second dt, NewtonMeter outTorque, PerSecond outAngularVelocity,
-			NewtonMeter inTorque, PerSecond inAngularVelocity, uint currentGear)
-		{
-			// down shift
-			if (IsBelowDownShiftCurve(currentGear, inTorque, inAngularVelocity)) {
-				currentGear--;
-				while (SkipGears && currentGear > 1) {
-					currentGear--;
-					var tmpGear = Gearbox.Gear;
-					_gearbox.Gear = currentGear;
-					var response = (ResponseDryRun)_gearbox.Request(absTime, dt, outTorque, outAngularVelocity, true);
-					_gearbox.Gear = tmpGear;
-
-					inAngularVelocity = ModelData.Gears[currentGear].Ratio * outAngularVelocity;
-					inTorque = response.ClutchPowerRequest / inAngularVelocity;
-					var maxTorque = VectoMath.Min(response.DynamicFullLoadPower / ((DataBus.EngineSpeed + response.EngineSpeed) / 2),
-						currentGear > 1
-							? ModelData.Gears[currentGear].ShiftPolygon.InterpolateDownshift(response.EngineSpeed)
-							: double.MaxValue.SI<NewtonMeter>());
-					var reserve = maxTorque.IsEqual(0) ? -1 : (1 - inTorque / maxTorque).Value();
-					if (reserve >= ModelData.TorqueReserve && IsBelowUpShiftCurve(currentGear, inTorque, inAngularVelocity)) {
-						continue;
-					}
-					currentGear++;
-					break;
-				}
-			}
-			return currentGear;
-		}
-	}
+using System.Linq;
+using TUGraz.VectoCommon.Utils;
+using TUGraz.VectoCore.Configuration;
+using TUGraz.VectoCore.Models.Connector.Ports.Impl;
+using TUGraz.VectoCore.Models.Simulation.Data;
+using TUGraz.VectoCore.Models.Simulation.DataBus;
+
+namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
+{
+	/// <summary>
+	/// AMTShiftStrategy implements the AMT Shifting Behaviour.
+	/// </summary>
+	public class AMTShiftStrategy : ShiftStrategy
+	{
+		protected readonly uint MaxStartGear;
+		protected uint _nextGear;
+
+		public AMTShiftStrategy(VectoRunData runData, IDataBus dataBus) : base(runData.GearboxData, dataBus)
+		{
+			EarlyShiftUp = true;
+			SkipGears = true;
+
+			var transmissionRatio = runData.AxleGearData.AxleGear.Ratio *
+									(runData.AngledriveData == null ? 1.0 : runData.AngledriveData.Angledrive.Ratio) /
+									runData.VehicleData.DynamicTyreRadius;
+			var minEngineSpeed = (runData.EngineData.FullLoadCurves[0].RatedSpeed - runData.EngineData.IdleSpeed) *
+								Constants.SimulationSettings.ClutchClosingSpeedNorm + runData.EngineData.IdleSpeed;
+			foreach (var gearData in ModelData.Gears.Reverse()) {
+				if (ModelData.StartSpeed * transmissionRatio * gearData.Value.Ratio > minEngineSpeed) {
+					MaxStartGear = gearData.Key;
+					break;
+				}
+			}
+		}
+
+		private bool SpeedTooLowForEngine(uint gear, PerSecond outAngularSpeed)
+		{
+			return (outAngularSpeed * ModelData.Gears[gear].Ratio).IsSmaller(DataBus.EngineIdleSpeed);
+		}
+
+		private bool SpeedTooHighForEngine(uint gear, PerSecond outAngularSpeed)
+		{
+			return
+				(outAngularSpeed * ModelData.Gears[gear].Ratio).IsGreaterOrEqual(ModelData.Gears[gear].MaxSpeed ??
+																				DataBus.EngineN95hSpeed);
+		}
+
+		public override GearInfo NextGear
+		{
+			get { return new GearInfo(_nextGear, false); }
+		}
+
+		public override uint Engage(Second absTime, Second dt, NewtonMeter outTorque, PerSecond outAngularVelocity)
+		{
+			while (_nextGear > 1 && SpeedTooLowForEngine(_nextGear, outAngularVelocity)) {
+				_nextGear--;
+			}
+			while (_nextGear < ModelData.Gears.Count && SpeedTooHighForEngine(_nextGear, outAngularVelocity)) {
+				_nextGear++;
+			}
+
+			return _nextGear;
+		}
+
+		public override void Disengage(Second absTime, Second dt, NewtonMeter outTorque, PerSecond outEngineSpeed) {}
+
+		public override uint InitGear(Second absTime, Second dt, NewtonMeter outTorque, PerSecond outAngularVelocity)
+		{
+			if (DataBus.VehicleSpeed.IsEqual(0)) {
+				return InitStartGear(outTorque, outAngularVelocity);
+			}
+			for (var gear = (uint)ModelData.Gears.Count; gear > 1; gear--) {
+				var response = _gearbox.Initialize(gear, outTorque, outAngularVelocity);
+
+				var inAngularSpeed = outAngularVelocity * ModelData.Gears[gear].Ratio;
+				var fullLoadPower = response.EnginePowerRequest - response.DeltaFullLoad;
+				var reserve = 1 - response.EnginePowerRequest / fullLoadPower;
+				var inTorque = response.ClutchPowerRequest / inAngularSpeed;
+
+				// if in shift curve and torque reserve is provided: return the current gear
+				if (!IsBelowDownShiftCurve(gear, inTorque, inAngularSpeed) && !IsAboveUpShiftCurve(gear, inTorque, inAngularSpeed) &&
+					reserve >= ModelData.StartTorqueReserve) {
+					if ((inAngularSpeed - DataBus.EngineIdleSpeed) / (DataBus.EngineRatedSpeed - DataBus.EngineIdleSpeed) <
+						Constants.SimulationSettings.ClutchClosingSpeedNorm && gear > 1) {
+						gear--;
+					}
+					_nextGear = gear;
+					return gear;
+				}
+
+				// if over the up shift curve: return the previous gear (even thou it did not provide the required torque reserve)
+				if (IsAboveUpShiftCurve(gear, inTorque, inAngularSpeed) && gear < ModelData.Gears.Count) {
+					_nextGear = gear;
+					return gear + 1;
+				}
+			}
+
+			// fallback: return first gear
+			_nextGear = 1;
+			return 1;
+		}
+
+		private uint InitStartGear(NewtonMeter outTorque, PerSecond outAngularVelocity)
+		{
+			for (var gear = MaxStartGear; gear > 1; gear--) {
+				var inAngularSpeed = outAngularVelocity * ModelData.Gears[gear].Ratio;
+
+				var ratedSpeed = DataBus.EngineRatedSpeed;
+				if (inAngularSpeed > ratedSpeed || inAngularSpeed.IsEqual(0)) {
+					continue;
+				}
+
+				var response = _gearbox.Initialize(gear, outTorque, outAngularVelocity);
+
+				var fullLoadPower = response.DynamicFullLoadPower; //EnginePowerRequest - response.DeltaFullLoad;
+				var reserve = 1 - response.EnginePowerRequest / fullLoadPower;
+
+				if (response.EngineSpeed > DataBus.EngineIdleSpeed && reserve >= ModelData.StartTorqueReserve) {
+					_nextGear = gear;
+					return gear;
+				}
+			}
+			_nextGear = 1;
+			return 1;
+		}
+
+		public override bool ShiftRequired(Second absTime, Second dt, NewtonMeter outTorque, PerSecond outAngularVelocity,
+			NewtonMeter inTorque, PerSecond inAngularVelocity, uint gear, Second lastShiftTime)
+		{
+			// no shift when vehicle stands
+			if (DataBus.VehicleStopped) {
+				return false;
+			}
+
+			// emergency shift to not stall the engine ------------------------
+			if (gear == 1 && SpeedTooLowForEngine(_nextGear, inAngularVelocity / ModelData.Gears[gear].Ratio)) {
+				return true;
+			}
+			_nextGear = gear;
+			while (_nextGear > 1 && SpeedTooLowForEngine(_nextGear, inAngularVelocity / ModelData.Gears[gear].Ratio)) {
+				_nextGear--;
+			}
+			while (_nextGear < ModelData.Gears.Count &&
+					SpeedTooHighForEngine(_nextGear, inAngularVelocity / ModelData.Gears[gear].Ratio)) {
+				_nextGear++;
+			}
+			if (_nextGear != gear) {
+				return true;
+			}
+
+			// normal shift when all requirements are fullfilled ------------------
+			var minimumShiftTimePassed = (lastShiftTime + ModelData.ShiftTime).IsSmallerOrEqual(absTime);
+			if (!minimumShiftTimePassed) {
+				return false;
+			}
+
+			_nextGear = CheckDownshift(absTime, dt, outTorque, outAngularVelocity, inTorque, inAngularVelocity, gear);
+			if (_nextGear != gear) {
+				return true;
+			}
+
+			_nextGear = CheckUpshift(absTime, dt, outTorque, outAngularVelocity, inTorque, inAngularVelocity, gear);
+
+			//if ((ModelData.Gears[_nextGear].Ratio * outAngularVelocity - DataBus.EngineIdleSpeed) /
+			//	(DataBus.EngineRatedSpeed - DataBus.EngineIdleSpeed) <
+			//	Constants.SimulationSettings.ClutchClosingSpeedNorm && _nextGear > 1) {
+			//	_nextGear--;
+			//}
+
+			return _nextGear != gear;
+		}
+
+		protected virtual uint CheckUpshift(Second absTime, Second dt, NewtonMeter outTorque, PerSecond outAngularVelocity,
+			NewtonMeter inTorque, PerSecond inAngularVelocity, uint currentGear)
+		{
+			// if the driver's intention is _not_ to accelerate or drive along then don't upshift
+			if (DataBus.DriverBehavior != DrivingBehavior.Accelerating && DataBus.DriverBehavior != DrivingBehavior.Driving) {
+				return currentGear;
+			}
+			if ((absTime - _gearbox.LastDownshift).IsSmaller(_gearbox.ModelData.UpshiftAfterDownshiftDelay)) {
+				return currentGear;
+			}
+			var nextGear = DoCheckUpshift(absTime, dt, outTorque, outAngularVelocity, inTorque, inAngularVelocity, currentGear);
+			if (nextGear == currentGear) {
+				return nextGear;
+			}
+
+			// estimate acceleration for selected gear
+			if (EstimateAccelerationForGear(nextGear, outAngularVelocity).IsSmaller(_gearbox.ModelData.UpshiftMinAcceleration)) {
+				// if less than 0.1 for next gear, don't shift
+				if (nextGear - currentGear == 1) {
+					return currentGear;
+				}
+				// if a gear is skipped but acceleration is less than 0.1, try for next gear. if acceleration is still below 0.1 don't shift!
+				if (nextGear > currentGear &&
+					EstimateAccelerationForGear(currentGear + 1, outAngularVelocity)
+						.IsSmaller(_gearbox.ModelData.UpshiftMinAcceleration)) {
+					return currentGear;
+				}
+				nextGear = currentGear + 1;
+			}
+
+			return nextGear;
+		}
+
+		protected virtual uint CheckDownshift(Second absTime, Second dt, NewtonMeter outTorque, PerSecond outAngularVelocity,
+			NewtonMeter inTorque, PerSecond inAngularVelocity, uint currentGear)
+		{
+			if ((absTime - _gearbox.LastUpshift).IsSmaller(_gearbox.ModelData.DownshiftAfterUpshiftDelay)) {
+				return currentGear;
+			}
+			return DoCheckDownshift(absTime, dt, outTorque, outAngularVelocity, inTorque, inAngularVelocity, currentGear);
+		}
+
+		protected virtual uint DoCheckUpshift(Second absTime, Second dt, NewtonMeter outTorque, PerSecond outAngularVelocity,
+			NewtonMeter inTorque, PerSecond inAngularVelocity, uint currentGear)
+		{
+			// upshift
+			if (IsAboveUpShiftCurve(currentGear, inTorque, inAngularVelocity)) {
+				currentGear++;
+
+				while (SkipGears && currentGear < ModelData.Gears.Count) {
+					currentGear++;
+					var tmpGear = Gearbox.Gear;
+					_gearbox.Gear = currentGear;
+					var response = (ResponseDryRun)_gearbox.Request(absTime, dt, outTorque, outAngularVelocity, true);
+					_gearbox.Gear = tmpGear;
+
+					inAngularVelocity = response.EngineSpeed; //ModelData.Gears[currentGear].Ratio * outAngularVelocity;
+					inTorque = response.ClutchPowerRequest / inAngularVelocity;
+
+					var maxTorque = VectoMath.Min(response.DynamicFullLoadPower / ((DataBus.EngineSpeed + response.EngineSpeed) / 2),
+						currentGear > 1
+							? ModelData.Gears[currentGear].ShiftPolygon.InterpolateDownshift(response.EngineSpeed)
+							: double.MaxValue.SI<NewtonMeter>());
+					var reserve = 1 - inTorque / maxTorque;
+
+					if (reserve >= ModelData.TorqueReserve && IsAboveDownShiftCurve(currentGear, inTorque, inAngularVelocity)) {
+						continue;
+					}
+
+					currentGear--;
+					break;
+				}
+			}
+
+			// early up shift to higher gear ---------------------------------------
+			if (EarlyShiftUp && currentGear < ModelData.Gears.Count) {
+				// try if next gear would provide enough torque reserve
+				var tryNextGear = currentGear + 1;
+				var tmpGear = Gearbox.Gear;
+				_gearbox.Gear = tryNextGear;
+				var response = (ResponseDryRun)_gearbox.Request(absTime, dt, outTorque, outAngularVelocity, true);
+				_gearbox.Gear = tmpGear;
+
+				inAngularVelocity = ModelData.Gears[tryNextGear].Ratio * outAngularVelocity;
+				inTorque = response.ClutchPowerRequest / inAngularVelocity;
+
+				// if next gear supplied enough power reserve: take it
+				// otherwise take
+				if (!IsBelowDownShiftCurve(tryNextGear, inTorque, inAngularVelocity)) {
+					var fullLoadPower = response.EnginePowerRequest - response.DeltaFullLoad;
+					var reserve = 1 - response.EnginePowerRequest / fullLoadPower;
+
+					if (reserve >= ModelData.TorqueReserve) {
+						currentGear = tryNextGear;
+					}
+				}
+			}
+			return currentGear;
+		}
+
+		protected virtual uint DoCheckDownshift(Second absTime, Second dt, NewtonMeter outTorque, PerSecond outAngularVelocity,
+			NewtonMeter inTorque, PerSecond inAngularVelocity, uint currentGear)
+		{
+			// down shift
+			if (IsBelowDownShiftCurve(currentGear, inTorque, inAngularVelocity)) {
+				currentGear--;
+				while (SkipGears && currentGear > 1) {
+					currentGear--;
+					var tmpGear = Gearbox.Gear;
+					_gearbox.Gear = currentGear;
+					var response = (ResponseDryRun)_gearbox.Request(absTime, dt, outTorque, outAngularVelocity, true);
+					_gearbox.Gear = tmpGear;
+
+					inAngularVelocity = ModelData.Gears[currentGear].Ratio * outAngularVelocity;
+					inTorque = response.ClutchPowerRequest / inAngularVelocity;
+					var maxTorque = VectoMath.Min(response.DynamicFullLoadPower / ((DataBus.EngineSpeed + response.EngineSpeed) / 2),
+						currentGear > 1
+							? ModelData.Gears[currentGear].ShiftPolygon.InterpolateDownshift(response.EngineSpeed)
+							: double.MaxValue.SI<NewtonMeter>());
+					var reserve = maxTorque.IsEqual(0) ? -1 : (1 - inTorque / maxTorque).Value();
+					if (reserve >= ModelData.TorqueReserve && IsBelowUpShiftCurve(currentGear, inTorque, inAngularVelocity)) {
+						continue;
+					}
+					currentGear++;
+					break;
+				}
+			}
+			return currentGear;
+		}
+	}
 }
\ No newline at end of file
diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/ATGearbox.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/ATGearbox.cs
index d9f0b0341354b449747a868b53ad183e4080f860..d9fb06e6d86da8aa421209671e5ca90f2a3385aa 100644
--- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/ATGearbox.cs
+++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/ATGearbox.cs
@@ -29,386 +29,395 @@
 *   Martin Rexeis, rexeis@ivt.tugraz.at, IVT, Graz University of Technology
 */
 
-using TUGraz.VectoCommon.Exceptions;
-using TUGraz.VectoCommon.Models;
-using TUGraz.VectoCommon.Utils;
-using TUGraz.VectoCore.Configuration;
-using TUGraz.VectoCore.Models.Connector.Ports;
-using TUGraz.VectoCore.Models.Connector.Ports.Impl;
-using TUGraz.VectoCore.Models.Simulation;
-using TUGraz.VectoCore.Models.Simulation.Data;
-using TUGraz.VectoCore.Models.Simulation.DataBus;
-using TUGraz.VectoCore.Models.SimulationComponent.Data.Gearbox;
-using TUGraz.VectoCore.OutputData;
-using TUGraz.VectoCore.Utils;
-
-namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
-{
-	public class ATGearbox : AbstractGearbox<ATGearbox.ATGearboxState>
-	{
-		private readonly IShiftStrategy _strategy;
-		protected internal readonly TorqueConverter TorqueConverter;
-		private IIdleController _idleController;
-		protected bool RequestAfterGearshift;
-
-		public bool TorqueConverterLocked
-		{
-			get { return CurrentState.TorqueConverterLocked; }
-			set { CurrentState.TorqueConverterLocked = value; }
-		}
-
-		public ATGearbox(IVehicleContainer container, IShiftStrategy strategy, VectoRunData runData)
-			: base(container, runData)
-		{
-			_strategy = strategy;
-			_strategy.Gearbox = this;
-			LastShift = -double.MaxValue.SI<Second>();
-			TorqueConverter = new TorqueConverter(this, _strategy, container, ModelData.TorqueConverterData,
-				runData);
-		}
-
-		public IIdleController IdleController
-		{
-			get { return _idleController; }
-			set {
-				_idleController = value;
-				_idleController.RequestPort = NextComponent;
-			}
-		}
-
-		public bool Disengaged
-		{
-			get { return CurrentState.Disengaged; }
-			set { CurrentState.Disengaged = value; }
-		}
-
-		public override void Connect(ITnOutPort other)
-		{
-			base.Connect(other);
-			TorqueConverter.NextComponent = other;
-		}
-
-		public override GearInfo NextGear
-		{
-			get { return _strategy.NextGear; }
-		}
-
-		public override bool ClutchClosed(Second absTime)
-		{
-			return absTime.IsGreater(DataBus.AbsTime) ||
-					!(CurrentState.Disengaged || (DataBus.DriverBehavior == DrivingBehavior.Halted));
-		}
-
-		public override IResponse Initialize(NewtonMeter outTorque, PerSecond outAngularVelocity)
-		{
-			if (CurrentState.Disengaged) {
-				Gear = _strategy.InitGear(0.SI<Second>(), Constants.SimulationSettings.TargetTimeInterval, outTorque,
-					outAngularVelocity);
-			}
-			var inAngularVelocity = 0.SI<PerSecond>();
-			var inTorque = 0.SI<NewtonMeter>();
-			var effectiveRatio = ModelData.Gears[Gear].Ratio;
-			var effectiveLossMap = ModelData.Gears[Gear].LossMap;
-			if (!CurrentState.TorqueConverterLocked) {
-				effectiveRatio = ModelData.Gears[Gear].TorqueConverterRatio;
-				effectiveLossMap = ModelData.Gears[Gear].TorqueConverterGearLossMap;
-			}
-			if (!DataBus.VehicleStopped) {
-				inAngularVelocity = outAngularVelocity * effectiveRatio;
-				var torqueLossResult = effectiveLossMap.GetTorqueLoss(outAngularVelocity, outTorque);
-				CurrentState.TorqueLossResult = torqueLossResult;
-
-				inTorque = outTorque / effectiveRatio + torqueLossResult.Value;
-			}
-			if (CurrentState.Disengaged) {
-				return NextComponent.Initialize(0.SI<NewtonMeter>(), null);
-			}
-
-			if (!CurrentState.TorqueConverterLocked && !ModelData.Gears[Gear].HasTorqueConverter) {
-				throw new VectoSimulationException(
-					"Torque converter requested by strategy for gear without torque converter!");
-			}
-			var response = CurrentState.TorqueConverterLocked
-				? NextComponent.Initialize(inTorque, inAngularVelocity)
-				: TorqueConverter.Initialize(inTorque, inAngularVelocity);
-
-			CurrentState.TorqueLossResult = new TransmissionLossMap.LossMapResult() {
-				Value = 0.SI<NewtonMeter>(),
-				Extrapolated = false
-			};
-
-			PreviousState.SetState(inTorque, inAngularVelocity, outTorque, outAngularVelocity);
-			PreviousState.Gear = Gear;
-			PreviousState.TorqueConverterLocked = CurrentState.TorqueConverterLocked;
-			return response;
-		}
-
-		internal ResponseDryRun Initialize(uint gear, bool torqueConverterLocked, NewtonMeter outTorque,
-			PerSecond outAngularVelocity)
-		{
-			var effectiveRatio = torqueConverterLocked
-				? ModelData.Gears[gear].Ratio
-				: ModelData.Gears[gear].TorqueConverterRatio;
-
-			var inAngularVelocity = outAngularVelocity * effectiveRatio;
-			var torqueLossResult = torqueConverterLocked
-				? ModelData.Gears[gear].LossMap.GetTorqueLoss(outAngularVelocity, outTorque)
-				: ModelData.Gears[gear].TorqueConverterGearLossMap.GetTorqueLoss(outAngularVelocity, outTorque);
-
-			var inTorque = outTorque / effectiveRatio + torqueLossResult.Value;
-
-			IResponse response;
-			if (torqueConverterLocked) {
-				response = NextComponent.Initialize(inTorque, inAngularVelocity);
-			} else {
-				if (!ModelData.Gears[gear].HasTorqueConverter) {
-					throw new VectoSimulationException(
-						"Torque converter requested by strategy for gear without torque converter!");
-				}
-				response = TorqueConverter.Initialize(inTorque, inAngularVelocity);
-			}
-
-			response.Switch().
-				Case<ResponseSuccess>(). // accept
-				Case<ResponseUnderload>(). // accept
-				Case<ResponseOverload>(). // accept
-				Default(r => { throw new UnexpectedResponseException("AT-Gearbox.Initialize", r); });
-
-			return new ResponseDryRun {
-				Source = this,
-				EngineSpeed = response.EngineSpeed,
-				EnginePowerRequest = response.EnginePowerRequest,
-				GearboxPowerRequest = outTorque * outAngularVelocity,
-			};
-		}
-
-		public override IResponse Request(Second absTime, Second dt, NewtonMeter outTorque, PerSecond outAngularVelocity,
-			bool dryRun = false)
-		{
-			IterationStatistics.Increment(this, "Requests");
-
-			Log.Debug("AT-Gearbox Power Request: torque: {0}, angularVelocity: {1}", outTorque, outAngularVelocity);
-
-			if (!dryRun &&
-				((DataBus.VehicleStopped && outAngularVelocity > 0) ||
-				(CurrentState.Disengaged && outTorque.IsGreater(0, 1e-3)))) {
-				Gear = 1;
-				CurrentState.TorqueConverterLocked = false;
-				LastShift = absTime;
-				CurrentState.Disengaged = false;
-			}
-
-			IResponse retVal;
-			var count = 0;
-			var loop = false;
-			if (RequestAfterGearshift) {
-				LastShift = absTime;
-				Gear = _strategy.Engage(absTime, dt, outTorque, outAngularVelocity);
-				CurrentState.PowershiftLossEnergy = ComputeShiftLosses(outTorque, outAngularVelocity);
-			} else {
-				if (PreviousState.PowershiftLossEnergy != null && PreviousState.PowershiftLossEnergy.IsGreater(0)) {
-					CurrentState.PowershiftLossEnergy = PreviousState.PowershiftLossEnergy;
-				}
-			}
-			do {
-				if (CurrentState.Disengaged || (DataBus.DriverBehavior == DrivingBehavior.Halted)) {
-					// only when vehicle is halted or close before halting
-					retVal = RequestDisengaged(absTime, dt, outTorque, outAngularVelocity, dryRun);
-				} else {
-					CurrentState.Disengaged = false;
-					retVal = RequestEngaged(absTime, dt, outTorque, outAngularVelocity, dryRun);
-					IdleController.Reset();
-				}
-				if (retVal is ResponseGearShift) {
-					if (ConsiderShiftLosses(_strategy.NextGear, outTorque)) {
-						retVal = new ResponseFailTimeInterval {
-							Source = this,
-							DeltaT = ModelData.PowershiftShiftTime,
-							GearboxPowerRequest =
-								outTorque * (PreviousState.OutAngularVelocity + outAngularVelocity) / 2.0
-						};
-						RequestAfterGearshift = true;
-						LastShift = absTime;
-					} else {
-						loop = true;
-						Gear = _strategy.Engage(absTime, dt, outTorque, outAngularVelocity);
-						LastShift = absTime;
-					}
-				}
-			} while (loop && ++count < 2);
-
-			retVal.GearboxPowerRequest = outTorque * (PreviousState.OutAngularVelocity + outAngularVelocity) / 2.0;
-			return retVal;
-		}
-
-		private IResponse RequestEngaged(Second absTime, Second dt, NewtonMeter outTorque, PerSecond outAngularVelocity,
-			bool dryRun)
-		{
-			if (!CurrentState.TorqueConverterLocked && !ModelData.Gears[Gear].HasTorqueConverter) {
-				throw new VectoSimulationException(
-					"Torque converter requested by strategy for gear without torque converter!");
-			}
-
-			var effectiveRatio = ModelData.Gears[Gear].Ratio;
-			var effectiveLossMap = ModelData.Gears[Gear].LossMap;
-			if (!CurrentState.TorqueConverterLocked) {
-				effectiveRatio = ModelData.Gears[Gear].TorqueConverterRatio;
-				effectiveLossMap = ModelData.Gears[Gear].TorqueConverterGearLossMap;
-			}
-
-			var inAngularVelocity = outAngularVelocity * effectiveRatio;
-			var avgOutAngularVelocity = (PreviousState.OutAngularVelocity + outAngularVelocity) / 2.0;
-			var avgInAngularVelocity = (PreviousState.InAngularVelocity + inAngularVelocity) / 2.0;
-			var inTorqueLossResult = effectiveLossMap.GetTorqueLoss(avgOutAngularVelocity, outTorque);
-			var inTorque = outTorque * (avgOutAngularVelocity / avgInAngularVelocity) + inTorqueLossResult.Value;
-
-			var inertiaTorqueLossOut = !inAngularVelocity.IsEqual(0)
-				? Formulas.InertiaPower(outAngularVelocity, PreviousState.OutAngularVelocity, ModelData.Inertia, dt) /
-				avgOutAngularVelocity
-				: 0.SI<NewtonMeter>();
-			inTorque += inertiaTorqueLossOut / effectiveRatio;
-
-			if (CurrentState.PowershiftLossEnergy != null) {
-				var remainingShiftLossLime = ModelData.PowershiftShiftTime - (absTime - LastShift);
-				if (remainingShiftLossLime.IsGreater(0)) {
-					var aliquotEnergyLoss = CurrentState.PowershiftLossEnergy * VectoMath.Min(1.0, dt / remainingShiftLossLime);
-					var avgEngineSpeed = (DataBus.EngineSpeed + outAngularVelocity * ModelData.Gears[Gear].Ratio) / 2;
-					CurrentState.PowershiftLoss = aliquotEnergyLoss / dt / avgEngineSpeed;
-					inTorque += CurrentState.PowershiftLoss;
-					CurrentState.PowershiftLossEnergy -= aliquotEnergyLoss;
-					//inTorque += CurrentState.PowershiftLossEnergy;
-				}
-			}
-
-			if (!dryRun) {
-				CurrentState.InertiaTorqueLossOut = inertiaTorqueLossOut;
-				CurrentState.TorqueLossResult = inTorqueLossResult;
-				CurrentState.SetState(inTorque, inAngularVelocity, outTorque, outAngularVelocity);
-				CurrentState.Gear = Gear;
-				CurrentState.TransmissionTorqueLoss = inTorque * effectiveRatio - outTorque;
-				TorqueConverter.Locked(CurrentState.InTorque, CurrentState.InAngularVelocity, CurrentState.InTorque,
-					CurrentState.InAngularVelocity);
-			}
-
-			if (!CurrentState.TorqueConverterLocked) {
-				return TorqueConverter.Request(absTime, dt, inTorque, inAngularVelocity, dryRun);
-			}
-			var retVal = NextComponent.Request(absTime, dt, inTorque, inAngularVelocity, dryRun);
-			if (!dryRun && retVal is ResponseSuccess &&
-				_strategy.ShiftRequired(absTime, dt, outTorque, outAngularVelocity, inTorque, inAngularVelocity, Gear,
-					LastShift)) {
-				return new ResponseGearShift { Source = this };
-			}
-
-			return retVal;
-		}
-
-		private IResponse RequestDisengaged(Second absTime, Second dt, NewtonMeter outTorque, PerSecond outAngularVelocity,
-			bool dryRun)
-		{
-			var avgAngularVelocity = (PreviousState.OutAngularVelocity + outAngularVelocity) / 2.0;
-			if (dryRun) {
-				// if gearbox is disengaged the 0[W]-line is the limit for drag and full load.
-				return new ResponseDryRun {
-					Source = this,
-					GearboxPowerRequest = outTorque * avgAngularVelocity,
-					DeltaDragLoad = outTorque * avgAngularVelocity,
-					DeltaFullLoad = outTorque * avgAngularVelocity,
-				};
-			}
-			if ((outTorque * avgAngularVelocity).IsGreater(0.SI<Watt>(),
-				Constants.SimulationSettings.LineSearchTolerance)) {
-				return new ResponseOverload {
-					Source = this,
-					Delta = outTorque * avgAngularVelocity,
-					GearboxPowerRequest = outTorque * avgAngularVelocity
-				};
-			}
-
-			if ((outTorque * avgAngularVelocity).IsSmaller(0.SI<Watt>(),
-				Constants.SimulationSettings.LineSearchTolerance)) {
-				return new ResponseUnderload {
-					Source = this,
-					Delta = outTorque * avgAngularVelocity,
-					GearboxPowerRequest = outTorque * avgAngularVelocity
-				};
-			}
-
-			Log.Debug("Invoking IdleController...");
-
-			var retval = IdleController.Request(absTime, dt, 0.SI<NewtonMeter>(), null);
-			retval.ClutchPowerRequest = 0.SI<Watt>();
-
-			// no dry-run - update state
-			var effectiveRatio = ModelData.Gears[Gear].Ratio;
-			if (!CurrentState.TorqueConverterLocked) {
-				effectiveRatio = ModelData.Gears[Gear].TorqueConverterRatio;
-			}
-			CurrentState.SetState(0.SI<NewtonMeter>(), outAngularVelocity * effectiveRatio, outTorque,
-				outAngularVelocity);
-			CurrentState.Gear = 1;
-			CurrentState.TorqueConverterLocked = !ModelData.Gears[Gear].HasTorqueConverter;
-			CurrentState.TorqueLossResult = new TransmissionLossMap.LossMapResult() {
-				Extrapolated = false,
-				Value = 0.SI<NewtonMeter>()
-			};
-			TorqueConverter.Locked(DataBus.VehicleStopped ? 0.SI<NewtonMeter>() : CurrentState.InTorque, retval.EngineSpeed,
-				CurrentState.InTorque,
-				outAngularVelocity * effectiveRatio);
-
-
-			return retval;
-		}
-
-		protected override void DoWriteModalResults(IModalDataContainer container)
-		{
-			var avgInAngularSpeed = (PreviousState.InAngularVelocity + CurrentState.InAngularVelocity) / 2.0;
-			var avgOutAngularSpeed = (PreviousState.OutAngularVelocity + CurrentState.OutAngularVelocity) / 2.0;
-
-			container[ModalResultField.Gear] = CurrentState.Disengaged || DataBus.VehicleStopped ? 0 : Gear;
-			container[ModalResultField.TC_Locked] = CurrentState.TorqueConverterLocked;
-			container[ModalResultField.P_gbx_loss] = CurrentState.InTorque * avgInAngularSpeed -
-													CurrentState.OutTorque * avgOutAngularSpeed;
-			container[ModalResultField.P_gbx_inertia] = CurrentState.InertiaTorqueLossOut * avgOutAngularSpeed;
-			container[ModalResultField.P_gbx_in] = CurrentState.InTorque * avgInAngularSpeed;
-			container[ModalResultField.P_gbx_shift_loss] = CurrentState.PowershiftLoss.DefaultIfNull(0) * avgInAngularSpeed;
-			container[ModalResultField.n_gbx_out_avg] = avgOutAngularSpeed;
-			container[ModalResultField.T_gbx_out] = CurrentState.OutTorque;
-		}
-
-		protected override void DoCommitSimulationStep()
-		{
-			if (!CurrentState.Disengaged && CurrentState.TorqueLossResult != null &&
-				CurrentState.TorqueLossResult.Extrapolated) {
-				Log.Warn(
-					"Gear {0} LossMap data was extrapolated: range for loss map is not sufficient: n:{1}, torque:{2}, ratio:{3}",
-					Gear, CurrentState.OutAngularVelocity.ConvertTo().Rounds.Per.Minute, CurrentState.OutTorque,
-					ModelData.Gears[Gear].Ratio);
-				if (DataBus.ExecutionMode == ExecutionMode.Declaration) {
-					throw new VectoException(
-						"Gear {0} LossMap data was extrapolated in Declaration Mode: range for loss map is not sufficient: n:{1}, torque:{2}, ratio:{3}",
-						Gear, CurrentState.InAngularVelocity.ConvertTo().Rounds.Per.Minute, CurrentState.InTorque,
-						ModelData.Gears[Gear].Ratio);
-				}
-			}
-			RequestAfterGearshift = false;
-
-			if (DataBus.VehicleStopped) {
-				CurrentState.Disengaged = true;
-			}
-
-			AdvanceState();
-
-			CurrentState.TorqueConverterLocked = PreviousState.TorqueConverterLocked;
-			CurrentState.Disengaged = PreviousState.Disengaged;
-		}
-
-		public class ATGearboxState : GearboxState
-		{
-			public bool TorqueConverterLocked;
-			public bool Disengaged = true;
-			public WattSecond PowershiftLossEnergy;
-			public NewtonMeter PowershiftLoss;
-		}
-	}
+using TUGraz.VectoCommon.Exceptions;
+using TUGraz.VectoCommon.Models;
+using TUGraz.VectoCommon.Utils;
+using TUGraz.VectoCore.Configuration;
+using TUGraz.VectoCore.Models.Connector.Ports;
+using TUGraz.VectoCore.Models.Connector.Ports.Impl;
+using TUGraz.VectoCore.Models.Simulation;
+using TUGraz.VectoCore.Models.Simulation.Data;
+using TUGraz.VectoCore.Models.Simulation.DataBus;
+using TUGraz.VectoCore.Models.SimulationComponent.Data.Gearbox;
+using TUGraz.VectoCore.OutputData;
+using TUGraz.VectoCore.Utils;
+
+namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
+{
+	public class ATGearbox : AbstractGearbox<ATGearbox.ATGearboxState>
+	{
+		private readonly IShiftStrategy _strategy;
+		protected internal readonly TorqueConverter TorqueConverter;
+		private IIdleController _idleController;
+		protected bool RequestAfterGearshift;
+
+		public bool TorqueConverterLocked
+		{
+			get { return CurrentState.TorqueConverterLocked; }
+			set { CurrentState.TorqueConverterLocked = value; }
+		}
+
+		public ATGearbox(IVehicleContainer container, IShiftStrategy strategy, VectoRunData runData)
+			: base(container, runData)
+		{
+			_strategy = strategy;
+			_strategy.Gearbox = this;
+			LastShift = -double.MaxValue.SI<Second>();
+			TorqueConverter = new TorqueConverter(this, _strategy, container, ModelData.TorqueConverterData,
+				runData);
+		}
+
+		public IIdleController IdleController
+		{
+			get { return _idleController; }
+			set
+			{
+				_idleController = value;
+				_idleController.RequestPort = NextComponent;
+			}
+		}
+
+		public bool Disengaged
+		{
+			get { return CurrentState.Disengaged; }
+			set { CurrentState.Disengaged = value; }
+		}
+
+		public override void Connect(ITnOutPort other)
+		{
+			base.Connect(other);
+			TorqueConverter.NextComponent = other;
+		}
+
+		public override GearInfo NextGear
+		{
+			get { return _strategy.NextGear; }
+		}
+
+		public override bool ClutchClosed(Second absTime)
+		{
+			return absTime.IsGreater(DataBus.AbsTime) ||
+					!(CurrentState.Disengaged || (DataBus.DriverBehavior == DrivingBehavior.Halted));
+		}
+
+		public override IResponse Initialize(NewtonMeter outTorque, PerSecond outAngularVelocity)
+		{
+			if (CurrentState.Disengaged) {
+				Gear = _strategy.InitGear(0.SI<Second>(), Constants.SimulationSettings.TargetTimeInterval, outTorque,
+					outAngularVelocity);
+			}
+			var inAngularVelocity = 0.SI<PerSecond>();
+			var inTorque = 0.SI<NewtonMeter>();
+			var effectiveRatio = ModelData.Gears[Gear].Ratio;
+			var effectiveLossMap = ModelData.Gears[Gear].LossMap;
+			if (!CurrentState.TorqueConverterLocked) {
+				effectiveRatio = ModelData.Gears[Gear].TorqueConverterRatio;
+				effectiveLossMap = ModelData.Gears[Gear].TorqueConverterGearLossMap;
+			}
+			if (!DataBus.VehicleStopped) {
+				inAngularVelocity = outAngularVelocity * effectiveRatio;
+				var torqueLossResult = effectiveLossMap.GetTorqueLoss(outAngularVelocity, outTorque);
+				CurrentState.TorqueLossResult = torqueLossResult;
+
+				inTorque = outTorque / effectiveRatio + torqueLossResult.Value;
+			}
+			if (CurrentState.Disengaged) {
+				return NextComponent.Initialize(0.SI<NewtonMeter>(), null);
+			}
+
+			if (!CurrentState.TorqueConverterLocked && !ModelData.Gears[Gear].HasTorqueConverter) {
+				throw new VectoSimulationException(
+					"Torque converter requested by strategy for gear without torque converter!");
+			}
+			var response = CurrentState.TorqueConverterLocked
+				? NextComponent.Initialize(inTorque, inAngularVelocity)
+				: TorqueConverter.Initialize(inTorque, inAngularVelocity);
+
+			CurrentState.TorqueLossResult = new TransmissionLossMap.LossMapResult() {
+				Value = 0.SI<NewtonMeter>(),
+				Extrapolated = false
+			};
+
+			PreviousState.SetState(inTorque, inAngularVelocity, outTorque, outAngularVelocity);
+			PreviousState.Gear = Gear;
+			PreviousState.TorqueConverterLocked = CurrentState.TorqueConverterLocked;
+			return response;
+		}
+
+		internal ResponseDryRun Initialize(uint gear, bool torqueConverterLocked, NewtonMeter outTorque,
+			PerSecond outAngularVelocity)
+		{
+			var effectiveRatio = torqueConverterLocked
+				? ModelData.Gears[gear].Ratio
+				: ModelData.Gears[gear].TorqueConverterRatio;
+
+			var inAngularVelocity = outAngularVelocity * effectiveRatio;
+			var torqueLossResult = torqueConverterLocked
+				? ModelData.Gears[gear].LossMap.GetTorqueLoss(outAngularVelocity, outTorque)
+				: ModelData.Gears[gear].TorqueConverterGearLossMap.GetTorqueLoss(outAngularVelocity, outTorque);
+
+			var inTorque = outTorque / effectiveRatio + torqueLossResult.Value;
+
+			IResponse response;
+			if (torqueConverterLocked) {
+				response = NextComponent.Initialize(inTorque, inAngularVelocity);
+			} else {
+				if (!ModelData.Gears[gear].HasTorqueConverter) {
+					throw new VectoSimulationException(
+						"Torque converter requested by strategy for gear without torque converter!");
+				}
+				response = TorqueConverter.Initialize(inTorque, inAngularVelocity);
+			}
+
+			response.Switch().
+				Case<ResponseSuccess>(). // accept
+				Case<ResponseUnderload>(). // accept
+				Case<ResponseOverload>(). // accept
+				Default(r => {
+					throw new UnexpectedResponseException("AT-Gearbox.Initialize", r);
+				});
+
+			return new ResponseDryRun {
+				Source = this,
+				EngineSpeed = response.EngineSpeed,
+				EnginePowerRequest = response.EnginePowerRequest,
+				GearboxPowerRequest = outTorque * outAngularVelocity,
+			};
+		}
+
+		public override IResponse Request(Second absTime, Second dt, NewtonMeter outTorque, PerSecond outAngularVelocity,
+			bool dryRun = false)
+		{
+			IterationStatistics.Increment(this, "Requests");
+
+			Log.Debug("AT-Gearbox Power Request: torque: {0}, angularVelocity: {1}", outTorque, outAngularVelocity);
+
+			var driveOffSpeed = DataBus.VehicleStopped && outAngularVelocity > 0;
+			var driveOffTorque = CurrentState.Disengaged && outTorque.IsGreater(0, 1e-3);
+			if (!dryRun && (driveOffSpeed || driveOffTorque)) {
+				Gear = 1;
+				CurrentState.TorqueConverterLocked = false;
+				LastShift = absTime;
+				CurrentState.Disengaged = false;
+			}
+
+			IResponse retVal;
+			var count = 0;
+			var loop = false;
+			SetPowershiftLossEnergy(absTime, dt, outTorque, outAngularVelocity);
+			do {
+				if (CurrentState.Disengaged || (DataBus.DriverBehavior == DrivingBehavior.Halted)) {
+					// only when vehicle is halted or close before halting
+					retVal = RequestDisengaged(absTime, dt, outTorque, outAngularVelocity, dryRun);
+				} else {
+					CurrentState.Disengaged = false;
+					retVal = RequestEngaged(absTime, dt, outTorque, outAngularVelocity, dryRun);
+					IdleController.Reset();
+				}
+				if (!(retVal is ResponseGearShift)) {
+					continue;
+				}
+				if (ConsiderShiftLosses(_strategy.NextGear, outTorque)) {
+					retVal = new ResponseFailTimeInterval {
+						Source = this,
+						DeltaT = ModelData.PowershiftShiftTime,
+						GearboxPowerRequest =
+							outTorque * (PreviousState.OutAngularVelocity + outAngularVelocity) / 2.0
+					};
+					RequestAfterGearshift = true;
+					LastShift = absTime;
+				} else {
+					loop = true;
+					Gear = _strategy.Engage(absTime, dt, outTorque, outAngularVelocity);
+					LastShift = absTime;
+				}
+			} while (loop && ++count < 2);
+
+			retVal.GearboxPowerRequest = outTorque * (PreviousState.OutAngularVelocity + outAngularVelocity) / 2.0;
+			return retVal;
+		}
+
+		private void SetPowershiftLossEnergy(Second absTime, Second dt, NewtonMeter outTorque, PerSecond outAngularVelocity)
+		{
+			if (RequestAfterGearshift) {
+				LastShift = absTime;
+				Gear = _strategy.Engage(absTime, dt, outTorque, outAngularVelocity);
+				CurrentState.PowershiftLossEnergy = ComputeShiftLosses(outTorque, outAngularVelocity);
+			} else {
+				if (PreviousState.PowershiftLossEnergy != null && PreviousState.PowershiftLossEnergy.IsGreater(0)) {
+					CurrentState.PowershiftLossEnergy = PreviousState.PowershiftLossEnergy;
+				}
+			}
+		}
+
+		private IResponse RequestEngaged(Second absTime, Second dt, NewtonMeter outTorque, PerSecond outAngularVelocity,
+			bool dryRun)
+		{
+			if (!CurrentState.TorqueConverterLocked && !ModelData.Gears[Gear].HasTorqueConverter) {
+				throw new VectoSimulationException(
+					"Torque converter requested by strategy for gear without torque converter!");
+			}
+
+			var effectiveRatio = ModelData.Gears[Gear].Ratio;
+			var effectiveLossMap = ModelData.Gears[Gear].LossMap;
+			if (!CurrentState.TorqueConverterLocked) {
+				effectiveRatio = ModelData.Gears[Gear].TorqueConverterRatio;
+				effectiveLossMap = ModelData.Gears[Gear].TorqueConverterGearLossMap;
+			}
+
+			var inAngularVelocity = outAngularVelocity * effectiveRatio;
+			var avgOutAngularVelocity = (PreviousState.OutAngularVelocity + outAngularVelocity) / 2.0;
+			var avgInAngularVelocity = (PreviousState.InAngularVelocity + inAngularVelocity) / 2.0;
+			var inTorqueLossResult = effectiveLossMap.GetTorqueLoss(avgOutAngularVelocity, outTorque);
+			var inTorque = outTorque * (avgOutAngularVelocity / avgInAngularVelocity) + inTorqueLossResult.Value;
+
+			var inertiaTorqueLossOut = !inAngularVelocity.IsEqual(0)
+				? Formulas.InertiaPower(outAngularVelocity, PreviousState.OutAngularVelocity, ModelData.Inertia, dt) /
+				avgOutAngularVelocity
+				: 0.SI<NewtonMeter>();
+			inTorque += inertiaTorqueLossOut / effectiveRatio;
+
+			if (CurrentState.PowershiftLossEnergy != null) {
+				var remainingShiftLossLime = ModelData.PowershiftShiftTime - (absTime - LastShift);
+				if (remainingShiftLossLime.IsGreater(0)) {
+					var aliquotEnergyLoss = CurrentState.PowershiftLossEnergy * VectoMath.Min(1.0, dt / remainingShiftLossLime);
+					var avgEngineSpeed = (DataBus.EngineSpeed + outAngularVelocity * ModelData.Gears[Gear].Ratio) / 2;
+					CurrentState.PowershiftLoss = aliquotEnergyLoss / dt / avgEngineSpeed;
+					inTorque += CurrentState.PowershiftLoss;
+					CurrentState.PowershiftLossEnergy -= aliquotEnergyLoss;
+					//inTorque += CurrentState.PowershiftLossEnergy;
+				}
+			}
+
+			if (!dryRun) {
+				CurrentState.InertiaTorqueLossOut = inertiaTorqueLossOut;
+				CurrentState.TorqueLossResult = inTorqueLossResult;
+				CurrentState.SetState(inTorque, inAngularVelocity, outTorque, outAngularVelocity);
+				CurrentState.Gear = Gear;
+				CurrentState.TransmissionTorqueLoss = inTorque * effectiveRatio - outTorque;
+				TorqueConverter.Locked(CurrentState.InTorque, CurrentState.InAngularVelocity, CurrentState.InTorque,
+					CurrentState.InAngularVelocity);
+			}
+
+			if (!CurrentState.TorqueConverterLocked) {
+				return TorqueConverter.Request(absTime, dt, inTorque, inAngularVelocity, dryRun);
+			}
+			var retVal = NextComponent.Request(absTime, dt, inTorque, inAngularVelocity, dryRun);
+			if (!dryRun && retVal is ResponseSuccess &&
+				_strategy.ShiftRequired(absTime, dt, outTorque, outAngularVelocity, inTorque, inAngularVelocity, Gear,
+					LastShift)) {
+				return new ResponseGearShift { Source = this };
+			}
+
+			return retVal;
+		}
+
+		private IResponse RequestDisengaged(Second absTime, Second dt, NewtonMeter outTorque, PerSecond outAngularVelocity,
+			bool dryRun)
+		{
+			var avgAngularVelocity = (PreviousState.OutAngularVelocity + outAngularVelocity) / 2.0;
+			if (dryRun) {
+				// if gearbox is disengaged the 0[W]-line is the limit for drag and full load.
+				return new ResponseDryRun {
+					Source = this,
+					GearboxPowerRequest = outTorque * avgAngularVelocity,
+					DeltaDragLoad = outTorque * avgAngularVelocity,
+					DeltaFullLoad = outTorque * avgAngularVelocity,
+				};
+			}
+			if ((outTorque * avgAngularVelocity).IsGreater(0.SI<Watt>(),
+				Constants.SimulationSettings.LineSearchTolerance)) {
+				return new ResponseOverload {
+					Source = this,
+					Delta = outTorque * avgAngularVelocity,
+					GearboxPowerRequest = outTorque * avgAngularVelocity
+				};
+			}
+
+			if ((outTorque * avgAngularVelocity).IsSmaller(0.SI<Watt>(),
+				Constants.SimulationSettings.LineSearchTolerance)) {
+				return new ResponseUnderload {
+					Source = this,
+					Delta = outTorque * avgAngularVelocity,
+					GearboxPowerRequest = outTorque * avgAngularVelocity
+				};
+			}
+
+			Log.Debug("Invoking IdleController...");
+
+			var retval = IdleController.Request(absTime, dt, 0.SI<NewtonMeter>(), null);
+			retval.ClutchPowerRequest = 0.SI<Watt>();
+
+			// no dry-run - update state
+			var effectiveRatio = ModelData.Gears[Gear].Ratio;
+			if (!CurrentState.TorqueConverterLocked) {
+				effectiveRatio = ModelData.Gears[Gear].TorqueConverterRatio;
+			}
+			CurrentState.SetState(0.SI<NewtonMeter>(), outAngularVelocity * effectiveRatio, outTorque,
+				outAngularVelocity);
+			CurrentState.Gear = 1;
+			CurrentState.TorqueConverterLocked = !ModelData.Gears[Gear].HasTorqueConverter;
+			CurrentState.TorqueLossResult = new TransmissionLossMap.LossMapResult() {
+				Extrapolated = false,
+				Value = 0.SI<NewtonMeter>()
+			};
+			TorqueConverter.Locked(DataBus.VehicleStopped ? 0.SI<NewtonMeter>() : CurrentState.InTorque, retval.EngineSpeed,
+				CurrentState.InTorque,
+				outAngularVelocity * effectiveRatio);
+
+
+			return retval;
+		}
+
+		protected override void DoWriteModalResults(IModalDataContainer container)
+		{
+			var avgInAngularSpeed = (PreviousState.InAngularVelocity + CurrentState.InAngularVelocity) / 2.0;
+			var avgOutAngularSpeed = (PreviousState.OutAngularVelocity + CurrentState.OutAngularVelocity) / 2.0;
+
+			container[ModalResultField.Gear] = CurrentState.Disengaged || DataBus.VehicleStopped ? 0 : Gear;
+			container[ModalResultField.TC_Locked] = CurrentState.TorqueConverterLocked;
+			container[ModalResultField.P_gbx_loss] = CurrentState.InTorque * avgInAngularSpeed -
+													CurrentState.OutTorque * avgOutAngularSpeed;
+			container[ModalResultField.P_gbx_inertia] = CurrentState.InertiaTorqueLossOut * avgOutAngularSpeed;
+			container[ModalResultField.P_gbx_in] = CurrentState.InTorque * avgInAngularSpeed;
+			container[ModalResultField.P_gbx_shift_loss] = CurrentState.PowershiftLoss.DefaultIfNull(0) * avgInAngularSpeed;
+			container[ModalResultField.n_gbx_out_avg] = avgOutAngularSpeed;
+			container[ModalResultField.T_gbx_out] = CurrentState.OutTorque;
+		}
+
+		protected override void DoCommitSimulationStep()
+		{
+			if (!CurrentState.Disengaged && CurrentState.TorqueLossResult != null &&
+				CurrentState.TorqueLossResult.Extrapolated) {
+				Log.Warn(
+					"Gear {0} LossMap data was extrapolated: range for loss map is not sufficient: n:{1}, torque:{2}, ratio:{3}",
+					Gear, CurrentState.OutAngularVelocity.ConvertTo().Rounds.Per.Minute, CurrentState.OutTorque,
+					ModelData.Gears[Gear].Ratio);
+				if (DataBus.ExecutionMode == ExecutionMode.Declaration) {
+					throw new VectoException(
+						"Gear {0} LossMap data was extrapolated in Declaration Mode: range for loss map is not sufficient: n:{1}, torque:{2}, ratio:{3}",
+						Gear, CurrentState.InAngularVelocity.ConvertTo().Rounds.Per.Minute, CurrentState.InTorque,
+						ModelData.Gears[Gear].Ratio);
+				}
+			}
+			RequestAfterGearshift = false;
+
+			if (DataBus.VehicleStopped) {
+				CurrentState.Disengaged = true;
+			}
+
+			AdvanceState();
+
+			CurrentState.TorqueConverterLocked = PreviousState.TorqueConverterLocked;
+			CurrentState.Disengaged = PreviousState.Disengaged;
+		}
+
+		public class ATGearboxState : GearboxState
+		{
+			public bool TorqueConverterLocked;
+			public bool Disengaged = true;
+			public WattSecond PowershiftLossEnergy;
+			public NewtonMeter PowershiftLoss;
+		}
+	}
 }
\ No newline at end of file
diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/ATShiftStrategy.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/ATShiftStrategy.cs
index af2e454f5b6bd98c43436456f99bd9e805dae830..7d2f64e0de6e6b511db0b0a8a1f1f86bf267409b 100644
--- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/ATShiftStrategy.cs
+++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/ATShiftStrategy.cs
@@ -36,6 +36,7 @@ using TUGraz.VectoCommon.Utils;
 using TUGraz.VectoCore.Configuration;
 using TUGraz.VectoCore.Models.Simulation.DataBus;
 using TUGraz.VectoCore.Models.SimulationComponent.Data;
+using TUGraz.VectoCore.Models.SimulationComponent.Data.Gearbox;
 
 namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 {
@@ -47,7 +48,8 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 		public override IGearbox Gearbox
 		{
 			get { return _gearbox; }
-			set {
+			set
+			{
 				_gearbox = value as ATGearbox;
 				if (_gearbox == null) {
 					throw new VectoException("AT Shift strategy can only handle AT gearboxes, given: {0}", value.GetType());
@@ -147,20 +149,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 			}
 
 			// EMERGENCY SHIFTS ---------------------------------------
-			// Emergency Downshift: if lower than engine idle speed
-			if (inAngularVelocity.IsSmaller(DataBus.EngineIdleSpeed)) {
-				Log.Debug("engine speed would fall below idle speed - shift down");
-				Downshift(absTime, gear);
-				return true;
-			}
-			// Emergency Upshift: if higher than engine rated speed
-			if (inAngularVelocity.IsGreaterOrEqual(ModelData.Gears[gear].MaxSpeed ?? DataBus.EngineRatedSpeed)) {
-				// check if upshift is possible
-				if (!ModelData.Gears.ContainsKey(gear + 1)) {
-					return false;
-				}
-				Log.Debug("engine speed would be above max speed / rated speed - shift up");
-				Upshift(absTime, gear);
+			if (CheckEmergencyShift(absTime, inAngularVelocity, gear)) {
 				return true;
 			}
 
@@ -179,6 +168,27 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 			return false;
 		}
 
+		private bool CheckEmergencyShift(Second absTime, PerSecond inAngularVelocity, uint gear)
+		{
+// Emergency Downshift: if lower than engine idle speed
+			if (inAngularVelocity.IsSmaller(DataBus.EngineIdleSpeed)) {
+				Log.Debug("engine speed would fall below idle speed - shift down");
+				Downshift(absTime, gear);
+				return true;
+			}
+			// Emergency Upshift: if higher than engine rated speed
+			if (inAngularVelocity.IsGreaterOrEqual(ModelData.Gears[gear].MaxSpeed ?? DataBus.EngineRatedSpeed)) {
+				// check if upshift is possible
+				if (!ModelData.Gears.ContainsKey(gear + 1)) {
+					return false;
+				}
+				Log.Debug("engine speed would be above max speed / rated speed - shift up");
+				Upshift(absTime, gear);
+				return true;
+			}
+			return false;
+		}
+
 		[SuppressMessage("ReSharper", "UnusedParameter.Local")]
 		private bool CheckUpshift(Second absTime, Second dt, NewtonMeter outTorque, PerSecond outAngularVelocity,
 			NewtonMeter inTorque, PerSecond inAngularVelocity, uint gear, Second lastShiftTime)
@@ -191,64 +201,84 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 			var currentGear = ModelData.Gears[gear];
 
 			if (_gearbox.TorqueConverterLocked || currentGear.HasLockedGear) {
-				// UPSHIFT - General Rule
-				// L -> L+1 
-				// C -> L
-				var nextGear = _gearbox.TorqueConverterLocked ? gear + 1 : gear;
-				if (!ModelData.Gears.ContainsKey(nextGear)) {
-					return false;
-				}
-
-				var nextEngineSpeed = outAngularVelocity * ModelData.Gears[nextGear].Ratio;
-				if (nextEngineSpeed.IsEqual(0)) {
-					return false;
-				}
-
-				var currentEnginePower = inTorque * inAngularVelocity;
-				var nextEngineTorque = currentEnginePower / nextEngineSpeed;
-				var isAboveUpShift = IsAboveUpShiftCurve(gear, nextEngineTorque, nextEngineSpeed, _gearbox.TorqueConverterLocked);
-
-				var minAccelerationReachable = true;
-				if (!DataBus.VehicleSpeed.IsEqual(0)) {
-					var reachableAcceleration = EstimateAccelerationForGear(nextGear, outAngularVelocity);
-					var minAcceleration = _gearbox.TorqueConverterLocked
-						? ModelData.UpshiftMinAcceleration
-						: ModelData.TorqueConverterData.CLUpshiftMinAcceleration;
-					minAcceleration = VectoMath.Min(minAcceleration, DataBus.DriverAcceleration);
-					minAccelerationReachable = reachableAcceleration.IsGreaterOrEqual(minAcceleration);
-				}
-
-				if (isAboveUpShift && minAccelerationReachable) {
-					Upshift(absTime, gear);
-					return true;
+				var result = CheckUpshiftToLocked(absTime, outAngularVelocity, inTorque, inAngularVelocity, gear);
+				if (result.HasValue) {
+					return result.Value;
 				}
 			}
 
 			// UPSHIFT - Special rule for 1C -> 2C
 			if (!_gearbox.TorqueConverterLocked && ModelData.Gears.ContainsKey(gear + 1) &&
 				ModelData.Gears[gear + 1].HasTorqueConverter && outAngularVelocity.IsGreater(0)) {
-				// C -> C+1
-				var nextGear = ModelData.Gears[gear + 1];
-				var gearRatio = nextGear.TorqueConverterRatio / currentGear.TorqueConverterRatio;
-				var minEngineSpeed = VectoMath.Min(700.RPMtoRad(), gearRatio * (DataBus.EngineN80hSpeed - 150.RPMtoRad()));
+				var result = CheckUpshiftTcTc(absTime, outTorque, outAngularVelocity, gear, currentGear);
+				if (result.HasValue) {
+					return result.Value;
+				}
+			}
+			return false;
+		}
 
-				var nextGearboxInSpeed = outAngularVelocity * nextGear.TorqueConverterRatio;
-				var nextGearboxInTorque = outTorque / nextGear.TorqueConverterRatio;
-				var tcOperatingPoint = _gearbox.TorqueConverter.FindOperatingPoint(nextGearboxInTorque, nextGearboxInSpeed);
+		private bool? CheckUpshiftTcTc(Second absTime, NewtonMeter outTorque, PerSecond outAngularVelocity, uint gear,
+			GearData currentGear)
+		{
+// C -> C+1
+			var nextGear = ModelData.Gears[gear + 1];
+			var gearRatio = nextGear.TorqueConverterRatio / currentGear.TorqueConverterRatio;
+			var minEngineSpeed = VectoMath.Min(700.RPMtoRad(), gearRatio * (DataBus.EngineN80hSpeed - 150.RPMtoRad()));
 
-				var engineSpeedOverMin = tcOperatingPoint.InAngularVelocity.IsGreater(minEngineSpeed);
+			var nextGearboxInSpeed = outAngularVelocity * nextGear.TorqueConverterRatio;
+			var nextGearboxInTorque = outTorque / nextGear.TorqueConverterRatio;
+			var tcOperatingPoint = _gearbox.TorqueConverter.FindOperatingPoint(nextGearboxInTorque, nextGearboxInSpeed);
 
-				var reachableAcceleration = EstimateAccelerationForGear(gear + 1, outAngularVelocity);
-				var minAcceleration = VectoMath.Min(ModelData.TorqueConverterData.CCUpshiftMinAcceleration,
-					DataBus.DriverAcceleration);
-				var minAccelerationReachable = reachableAcceleration.IsGreaterOrEqual(minAcceleration);
+			var engineSpeedOverMin = tcOperatingPoint.InAngularVelocity.IsGreater(minEngineSpeed);
 
-				if (engineSpeedOverMin && minAccelerationReachable) {
-					Upshift(absTime, gear);
-					return true;
-				}
+			var reachableAcceleration = EstimateAccelerationForGear(gear + 1, outAngularVelocity);
+			var minAcceleration = VectoMath.Min(ModelData.TorqueConverterData.CCUpshiftMinAcceleration,
+				DataBus.DriverAcceleration);
+			var minAccelerationReachable = reachableAcceleration.IsGreaterOrEqual(minAcceleration);
+
+			if (engineSpeedOverMin && minAccelerationReachable) {
+				Upshift(absTime, gear);
+				return true;
 			}
-			return false;
+			return null;
+		}
+
+		private bool? CheckUpshiftToLocked(Second absTime, PerSecond outAngularVelocity, NewtonMeter inTorque,
+			PerSecond inAngularVelocity, uint gear)
+		{
+// UPSHIFT - General Rule
+			// L -> L+1 
+			// C -> L
+			var nextGear = _gearbox.TorqueConverterLocked ? gear + 1 : gear;
+			if (!ModelData.Gears.ContainsKey(nextGear)) {
+				return false;
+			}
+
+			var nextEngineSpeed = outAngularVelocity * ModelData.Gears[nextGear].Ratio;
+			if (nextEngineSpeed.IsEqual(0)) {
+				return false;
+			}
+
+			var currentEnginePower = inTorque * inAngularVelocity;
+			var nextEngineTorque = currentEnginePower / nextEngineSpeed;
+			var isAboveUpShift = IsAboveUpShiftCurve(gear, nextEngineTorque, nextEngineSpeed, _gearbox.TorqueConverterLocked);
+
+			var minAccelerationReachable = true;
+			if (!DataBus.VehicleSpeed.IsEqual(0)) {
+				var reachableAcceleration = EstimateAccelerationForGear(nextGear, outAngularVelocity);
+				var minAcceleration = _gearbox.TorqueConverterLocked
+					? ModelData.UpshiftMinAcceleration
+					: ModelData.TorqueConverterData.CLUpshiftMinAcceleration;
+				minAcceleration = VectoMath.Min(minAcceleration, DataBus.DriverAcceleration);
+				minAccelerationReachable = reachableAcceleration.IsGreaterOrEqual(minAcceleration);
+			}
+
+			if (isAboveUpShift && minAccelerationReachable) {
+				Upshift(absTime, gear);
+				return true;
+			}
+			return null;
 		}
 
 		/// <summary>
diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/Clutch.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/Clutch.cs
index 5af38c58dcdf83cf3998edb8dc7c978e5a7f423b..ab488ae867df7ec8734cc941d4dfe200d29b01fa 100644
--- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/Clutch.cs
+++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/Clutch.cs
@@ -29,145 +29,152 @@
 *   Martin Rexeis, rexeis@ivt.tugraz.at, IVT, Graz University of Technology
 */
 
-using TUGraz.VectoCommon.Models;
-using TUGraz.VectoCommon.Utils;
-using TUGraz.VectoCore.Configuration;
-using TUGraz.VectoCore.Models.Connector.Ports;
-using TUGraz.VectoCore.Models.Simulation;
-using TUGraz.VectoCore.Models.Simulation.Data;
-using TUGraz.VectoCore.Models.Simulation.DataBus;
-using TUGraz.VectoCore.Models.SimulationComponent.Data;
-using TUGraz.VectoCore.OutputData;
-using TUGraz.VectoCore.Utils;
-
-namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
-{
-	public class Clutch : StatefulProviderComponent<Clutch.ClutchState, ITnOutPort, ITnInPort, ITnOutPort>, IClutch,
-		ITnOutPort, ITnInPort
-	{
-		private readonly PerSecond _idleSpeed;
-		private readonly PerSecond _ratedSpeed;
-
-		public IIdleController IdleController {
-			get { return _idleController; }
-			set {
-				_idleController = value;
-				_idleController.RequestPort = NextComponent;
-			}
-		}
-
-		private readonly SI _clutchSpeedSlippingFactor;
-		private IIdleController _idleController;
-
-		public Clutch(IVehicleContainer container, CombustionEngineData engineData) : base(container)
-		{
-			_idleSpeed = engineData.IdleSpeed;
-			_ratedSpeed = engineData.FullLoadCurves[0].RatedSpeed;
-			_clutchSpeedSlippingFactor = Constants.SimulationSettings.ClutchClosingSpeedNorm * (_ratedSpeed - _idleSpeed) /
-										(_idleSpeed + Constants.SimulationSettings.ClutchClosingSpeedNorm * (_ratedSpeed - _idleSpeed));
-		}
-
-		public IResponse Initialize(NewtonMeter outTorque, PerSecond outAngularVelocity)
-		{
-			NewtonMeter torqueIn;
-			PerSecond engineSpeedIn;
-			if (DataBus.DriverBehavior == DrivingBehavior.Halted /*DataBus.VehicleStopped*/) {
-				engineSpeedIn = _idleSpeed;
-				torqueIn = 0.SI<NewtonMeter>();
-			} else {
-				AddClutchLoss(outTorque, outAngularVelocity, true, out torqueIn, out engineSpeedIn);
-			}
-			PreviousState.SetState(torqueIn, outAngularVelocity, outTorque, outAngularVelocity);
-
-			var retVal = NextComponent.Initialize(torqueIn, engineSpeedIn);
-			retVal.ClutchPowerRequest = outTorque * outAngularVelocity;
-			return retVal;
-		}
-
-		public IResponse Request(Second absTime, Second dt, NewtonMeter outTorque, PerSecond outAngularVelocity,
-			bool dryRun = false)
-		{
-			var startClutch = DataBus.VehicleStopped || !PreviousState.ClutchLoss.IsEqual(0);
-			if (!DataBus.ClutchClosed(absTime) && !dryRun) {
-				Log.Debug("Invoking IdleController...");
-				var retval = IdleController.Request(absTime, dt, outTorque, null, dryRun);
-				retval.ClutchPowerRequest = 0.SI<Watt>();
-				CurrentState.SetState(0.SI<NewtonMeter>(), retval.EngineSpeed, outTorque, outAngularVelocity);
-				CurrentState.ClutchLoss = 0.SI<Watt>();
-				return retval;
-			}
-			if (IdleController != null) {
-				IdleController.Reset();
-			}
-
-			Log.Debug("from Wheels: torque: {0}, angularVelocity: {1}, power {2}", outTorque, outAngularVelocity,
-				Formulas.TorqueToPower(outTorque, outAngularVelocity));
-
-			NewtonMeter torqueIn;
-			PerSecond angularVelocityIn;
-			if (DataBus.DriverBehavior == DrivingBehavior.Halted /*DataBus.VehicleStopped*/) {
-				angularVelocityIn = _idleSpeed;
-				torqueIn = 0.SI<NewtonMeter>();
-			} else {
-				AddClutchLoss(outTorque, outAngularVelocity, (DataBus.Gear == 1 && outTorque > 0) ||startClutch || outAngularVelocity.IsEqual(0), out torqueIn, out angularVelocityIn);
-			}
-			Log.Debug("to Engine:   torque: {0}, angularVelocity: {1}, power {2}", torqueIn, angularVelocityIn,
-				Formulas.TorqueToPower(torqueIn, angularVelocityIn));
-
-			var avgOutAngularVelocity = (PreviousState.OutAngularVelocity + outAngularVelocity) / 2.0;
-			var avgInAngularVelocity = (PreviousState.InAngularVelocity + angularVelocityIn) / 2.0;
-			var clutchLoss = torqueIn * avgInAngularVelocity - outTorque * avgOutAngularVelocity;
-			if (!startClutch && !clutchLoss.IsEqual(0)) {
-				// we don't want to have negative clutch losses, so adapt input torque to match the average output power
-				torqueIn = outTorque * avgOutAngularVelocity / avgInAngularVelocity;
-			}
-
-			var retVal = NextComponent.Request(absTime, dt, torqueIn, angularVelocityIn, dryRun);
-			if (!dryRun) {
-				CurrentState.SetState(torqueIn, angularVelocityIn, outTorque, outAngularVelocity);
-				CurrentState.ClutchLoss = torqueIn * avgInAngularVelocity - outTorque * avgOutAngularVelocity;
-			}
-			retVal.ClutchPowerRequest = outTorque *
-										((PreviousState.OutAngularVelocity ?? 0.SI<PerSecond>()) + CurrentState.OutAngularVelocity) / 2.0;
-			return retVal;
-		}
-
-		private void AddClutchLoss(NewtonMeter torque, PerSecond angularVelocity, bool startClutch, out NewtonMeter torqueIn, out PerSecond angularVelocityIn)
-		{
-			torqueIn = torque;
-			angularVelocityIn = angularVelocity;
-
-			var engineSpeedNorm = (angularVelocity - _idleSpeed) / (_ratedSpeed - _idleSpeed);
-			if (startClutch && engineSpeedNorm < Constants.SimulationSettings.ClutchClosingSpeedNorm) {
-				// MQ: 27.5.2016: when angularVelocity is 0 (at the end of the simulation interval) don't use the 
-				//     angularVelocity but average angular velocity
-				//     Reason: if angularVelocity = 0 also the power (torque * angularVelocity) is 0 and then
-				//             the torque demand for the engine is 0. no drag torque although vehicle has to decelerate
-				//             "the clutch" eats up the whole torque
-				var engineSpeed = VectoMath.Max(_idleSpeed, angularVelocity);
-
-				angularVelocityIn = _clutchSpeedSlippingFactor * engineSpeed + _idleSpeed;
-				
-			}
-		}
-
-		protected override void DoWriteModalResults(IModalDataContainer container)
-		{
-			if (PreviousState.InAngularVelocity == null || CurrentState.InAngularVelocity == null) {
-				container[ModalResultField.P_clutch_out] = 0.SI<Watt>();
-				container[ModalResultField.P_clutch_loss] = 0.SI<Watt>();
-			} else {
-				var avgOutAngularVelocity = (PreviousState.OutAngularVelocity + CurrentState.OutAngularVelocity) / 2.0;
-				var avgInAngularVelocity = (PreviousState.InAngularVelocity + CurrentState.InAngularVelocity) / 2.0;
-				container[ModalResultField.P_clutch_out] = CurrentState.OutTorque * avgOutAngularVelocity;
-				container[ModalResultField.P_clutch_loss] = CurrentState.InTorque * avgInAngularVelocity -
-															CurrentState.OutTorque * avgOutAngularVelocity;
-			}
-		}
-
-		public class ClutchState : SimpleComponentState
-		{
-			public Watt ClutchLoss = 0.SI<Watt>();
-		}
-	}
+using TUGraz.VectoCommon.Models;
+using TUGraz.VectoCommon.Utils;
+using TUGraz.VectoCore.Configuration;
+using TUGraz.VectoCore.Models.Connector.Ports;
+using TUGraz.VectoCore.Models.Simulation;
+using TUGraz.VectoCore.Models.Simulation.Data;
+using TUGraz.VectoCore.Models.Simulation.DataBus;
+using TUGraz.VectoCore.Models.SimulationComponent.Data;
+using TUGraz.VectoCore.OutputData;
+using TUGraz.VectoCore.Utils;
+
+namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
+{
+	public class Clutch : StatefulProviderComponent<Clutch.ClutchState, ITnOutPort, ITnInPort, ITnOutPort>, IClutch,
+		ITnOutPort, ITnInPort
+	{
+		private readonly PerSecond _idleSpeed;
+		private readonly PerSecond _ratedSpeed;
+
+		public IIdleController IdleController
+		{
+			get { return _idleController; }
+			set
+			{
+				_idleController = value;
+				_idleController.RequestPort = NextComponent;
+			}
+		}
+
+		private readonly SI _clutchSpeedSlippingFactor;
+		private IIdleController _idleController;
+
+		public Clutch(IVehicleContainer container, CombustionEngineData engineData) : base(container)
+		{
+			_idleSpeed = engineData.IdleSpeed;
+			_ratedSpeed = engineData.FullLoadCurves[0].RatedSpeed;
+			_clutchSpeedSlippingFactor = Constants.SimulationSettings.ClutchClosingSpeedNorm * (_ratedSpeed - _idleSpeed) /
+										(_idleSpeed + Constants.SimulationSettings.ClutchClosingSpeedNorm * (_ratedSpeed - _idleSpeed));
+		}
+
+		public IResponse Initialize(NewtonMeter outTorque, PerSecond outAngularVelocity)
+		{
+			NewtonMeter torqueIn;
+			PerSecond engineSpeedIn;
+			if (DataBus.DriverBehavior == DrivingBehavior.Halted /*DataBus.VehicleStopped*/) {
+				engineSpeedIn = _idleSpeed;
+				torqueIn = 0.SI<NewtonMeter>();
+			} else {
+				AddClutchLoss(outTorque, outAngularVelocity, true, out torqueIn, out engineSpeedIn);
+			}
+			PreviousState.SetState(torqueIn, outAngularVelocity, outTorque, outAngularVelocity);
+
+			var retVal = NextComponent.Initialize(torqueIn, engineSpeedIn);
+			retVal.ClutchPowerRequest = outTorque * outAngularVelocity;
+			return retVal;
+		}
+
+		public IResponse Request(Second absTime, Second dt, NewtonMeter outTorque, PerSecond outAngularVelocity,
+			bool dryRun = false)
+		{
+			var startClutch = DataBus.VehicleStopped || !PreviousState.ClutchLoss.IsEqual(0);
+			if (!DataBus.ClutchClosed(absTime) && !dryRun) {
+				Log.Debug("Invoking IdleController...");
+				var retval = IdleController.Request(absTime, dt, outTorque, null, dryRun);
+				retval.ClutchPowerRequest = 0.SI<Watt>();
+				CurrentState.SetState(0.SI<NewtonMeter>(), retval.EngineSpeed, outTorque, outAngularVelocity);
+				CurrentState.ClutchLoss = 0.SI<Watt>();
+				return retval;
+			}
+			if (IdleController != null) {
+				IdleController.Reset();
+			}
+
+			Log.Debug("from Wheels: torque: {0}, angularVelocity: {1}, power {2}", outTorque, outAngularVelocity,
+				Formulas.TorqueToPower(outTorque, outAngularVelocity));
+
+			NewtonMeter torqueIn;
+			PerSecond angularVelocityIn;
+
+			AddClutchLoss(outTorque, outAngularVelocity,
+				(DataBus.Gear == 1 && outTorque > 0) || startClutch || outAngularVelocity.IsEqual(0), out torqueIn,
+				out angularVelocityIn);
+
+			Log.Debug("to Engine:   torque: {0}, angularVelocity: {1}, power {2}", torqueIn, angularVelocityIn,
+				Formulas.TorqueToPower(torqueIn, angularVelocityIn));
+
+			var avgOutAngularVelocity = (PreviousState.OutAngularVelocity + outAngularVelocity) / 2.0;
+			var avgInAngularVelocity = (PreviousState.InAngularVelocity + angularVelocityIn) / 2.0;
+			var clutchLoss = torqueIn * avgInAngularVelocity - outTorque * avgOutAngularVelocity;
+			if (!startClutch && !clutchLoss.IsEqual(0)) {
+				// we don't want to have negative clutch losses, so adapt input torque to match the average output power
+				torqueIn = outTorque * avgOutAngularVelocity / avgInAngularVelocity;
+			}
+
+			var retVal = NextComponent.Request(absTime, dt, torqueIn, angularVelocityIn, dryRun);
+			if (!dryRun) {
+				CurrentState.SetState(torqueIn, angularVelocityIn, outTorque, outAngularVelocity);
+				CurrentState.ClutchLoss = torqueIn * avgInAngularVelocity - outTorque * avgOutAngularVelocity;
+			}
+			retVal.ClutchPowerRequest = outTorque *
+										((PreviousState.OutAngularVelocity ?? 0.SI<PerSecond>()) + CurrentState.OutAngularVelocity) / 2.0;
+			return retVal;
+		}
+
+		private void AddClutchLoss(NewtonMeter torque, PerSecond angularVelocity, bool startClutch, out NewtonMeter torqueIn,
+			out PerSecond angularVelocityIn)
+		{
+			if (DataBus.DriverBehavior == DrivingBehavior.Halted) {
+				angularVelocityIn = _idleSpeed;
+				torqueIn = 0.SI<NewtonMeter>();
+				return;
+			}
+
+			torqueIn = torque;
+			angularVelocityIn = angularVelocity;
+
+			var engineSpeedNorm = (angularVelocity - _idleSpeed) / (_ratedSpeed - _idleSpeed);
+			if (startClutch && engineSpeedNorm < Constants.SimulationSettings.ClutchClosingSpeedNorm) {
+				// MQ: 27.5.2016: when angularVelocity is 0 (at the end of the simulation interval) don't use the 
+				//     angularVelocity but average angular velocity
+				//     Reason: if angularVelocity = 0 also the power (torque * angularVelocity) is 0 and then
+				//             the torque demand for the engine is 0. no drag torque although vehicle has to decelerate
+				//             "the clutch" eats up the whole torque
+				var engineSpeed = VectoMath.Max(_idleSpeed, angularVelocity);
+
+				angularVelocityIn = _clutchSpeedSlippingFactor * engineSpeed + _idleSpeed;
+			}
+		}
+
+		protected override void DoWriteModalResults(IModalDataContainer container)
+		{
+			if (PreviousState.InAngularVelocity == null || CurrentState.InAngularVelocity == null) {
+				container[ModalResultField.P_clutch_out] = 0.SI<Watt>();
+				container[ModalResultField.P_clutch_loss] = 0.SI<Watt>();
+			} else {
+				var avgOutAngularVelocity = (PreviousState.OutAngularVelocity + CurrentState.OutAngularVelocity) / 2.0;
+				var avgInAngularVelocity = (PreviousState.InAngularVelocity + CurrentState.InAngularVelocity) / 2.0;
+				container[ModalResultField.P_clutch_out] = CurrentState.OutTorque * avgOutAngularVelocity;
+				container[ModalResultField.P_clutch_loss] = CurrentState.InTorque * avgInAngularVelocity -
+															CurrentState.OutTorque * avgOutAngularVelocity;
+			}
+		}
+
+		public class ClutchState : SimpleComponentState
+		{
+			public Watt ClutchLoss = 0.SI<Watt>();
+		}
+	}
 }
\ No newline at end of file
diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/CombustionEngine.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/CombustionEngine.cs
index 2e17f9602e86bcbc7916ad2014d5dc44e21f13f1..02152d10f148ffa1f50bd06011d4a593f7cb2c18 100644
--- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/CombustionEngine.cs
+++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/CombustionEngine.cs
@@ -175,9 +175,9 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 				// if the clutch disengages the idle controller should take over!
 				throw new VectoSimulationException("angular velocity is null! Clutch open without IdleController?");
 			}
-			if (angularVelocity < ModelData.IdleSpeed.Value() - EngineIdleSpeedStopThreshold) {
-				CurrentState.OperationMode = EngineOperationMode.Stopped;
-			}
+			//if (angularVelocity < ModelData.IdleSpeed.Value() - EngineIdleSpeedStopThreshold) {
+			//	CurrentState.OperationMode = EngineOperationMode.Stopped;
+			//}
 
 			var avgEngineSpeed = (PreviousState.EngineSpeed + angularVelocity) / 2.0;
 
@@ -192,9 +192,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 
 			var fullDragTorque = ModelData.FullLoadCurves[DataBus.Gear].DragLoadStationaryTorque(avgEngineSpeed);
 			var dynamicFullLoadPower = ComputeFullLoadPower(avgEngineSpeed, dt, dryRun);
-			if (dynamicFullLoadPower < 0) {
-				dynamicFullLoadPower = 0.SI<Watt>();
-			}
+
 			var dynamicFullLoadTorque = dynamicFullLoadPower / avgEngineSpeed;
 			var inertiaTorqueLoss =
 				Formulas.InertiaPower(angularVelocity, PreviousState.EngineSpeed, ModelData.Inertia, dt) /
@@ -459,6 +457,9 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 				dynFullPowerCalculated = stationaryFullLoadPower;
 			}
 
+			if (dynFullPowerCalculated < 0) {
+				return 0.SI<Watt>();
+			}
 			return dynFullPowerCalculated;
 		}
 
@@ -589,7 +590,9 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 						angularSpeed = angularSpeed.LimitTo(_engine.ModelData.IdleSpeed, _engine.EngineRatedSpeed);
 						retVal = RequestPort.Request(absTime, dt, 0.SI<NewtonMeter>(), angularSpeed);
 					}).
-					Default(r => { throw new UnexpectedResponseException("searching Idling point", r); });
+					Default(r => {
+						throw new UnexpectedResponseException("searching Idling point", r);
+					});
 
 				return retVal;
 			}
@@ -646,7 +649,9 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 							0.SI<NewtonMeter>(), angularSpeed);
 						retVal = RequestPort.Request(absTime, dt, 0.SI<NewtonMeter>(), angularSpeed);
 					}).
-					Default(r => { throw new UnexpectedResponseException("searching Idling point", r); });
+					Default(r => {
+						throw new UnexpectedResponseException("searching Idling point", r);
+					});
 
 				return retVal;
 			}
diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/CycleGearbox.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/CycleGearbox.cs
index b9feedcce9587ad15a0acee60327982bcf34377b..e3d6c3420179a779cf08ff9a5b570211edf9add7 100644
--- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/CycleGearbox.cs
+++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/CycleGearbox.cs
@@ -39,6 +39,7 @@ using TUGraz.VectoCore.Models.Simulation;
 using TUGraz.VectoCore.Models.Simulation.Data;
 using TUGraz.VectoCore.Models.Simulation.DataBus;
 using TUGraz.VectoCore.Models.SimulationComponent.Data;
+using TUGraz.VectoCore.Models.SimulationComponent.Data.Gearbox;
 using TUGraz.VectoCore.OutputData;
 using TUGraz.VectoCore.Utils;
 
@@ -189,32 +190,20 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 				effectiveLossMap = ModelData.Gears[Gear].TorqueConverterGearLossMap;
 			}
 
-			if (effectiveLossMap == null || double.IsNaN(effectiveRatio)) {
-				throw new VectoSimulationException("Ratio or loss-map for gear {0}{1} invalid. Please check input data", Gear,
-					torqueConverterLocked ? "L" : "C");
-			}
+			CheckModelData(effectiveLossMap, effectiveRatio, torqueConverterLocked);
 
 			var avgOutAngularVelocity = (PreviousState.OutAngularVelocity + outAngularVelocity) / 2.0;
 			var inTorqueLossResult = effectiveLossMap.GetTorqueLoss(avgOutAngularVelocity, outTorque);
 			CurrentState.TorqueLossResult = inTorqueLossResult;
 			var inTorque = outTorque / effectiveRatio + inTorqueLossResult.Value;
 			CurrentState.TorqueLossResult = inTorqueLossResult;
-
-			if (!torqueConverterLocked && !ModelData.Gears[Gear].HasTorqueConverter) {
-				throw new VectoSimulationException("Torque converter requested by cycle for gear without torque converter!");
-			}
-
 			var inAngularVelocity = outAngularVelocity * effectiveRatio;
 
-			if (!inAngularVelocity.IsEqual(0)) {
-				// MQ 19.2.2016: check! inertia is related to output side, torque loss accounts to input side
-				CurrentState.InertiaTorqueLossOut =
-					Formulas.InertiaPower(outAngularVelocity, PreviousState.OutAngularVelocity, ModelData.Inertia, dt) /
-					avgOutAngularVelocity;
-				inTorque += CurrentState.InertiaTorqueLossOut / effectiveRatio;
-			} else {
-				CurrentState.InertiaTorqueLossOut = 0.SI<NewtonMeter>();
-			}
+			CurrentState.InertiaTorqueLossOut = !inAngularVelocity.IsEqual(0)
+				? Formulas.InertiaPower(outAngularVelocity, PreviousState.OutAngularVelocity, ModelData.Inertia, dt) /
+				avgOutAngularVelocity
+				: 0.SI<NewtonMeter>();
+			inTorque += CurrentState.InertiaTorqueLossOut / effectiveRatio;
 			if (Gear != PreviousState.Gear &&
 				ConsiderShiftLosses(new GearInfo(Gear, torqueConverterLocked), outTorque)) {
 				CurrentState.PowershiftLosses = ComputeShiftLosses(outTorque, outAngularVelocity);
@@ -224,11 +213,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 				inTorque += CurrentState.PowershiftLosses / dt / averageEngineSpeed;
 			}
 			if (dryRun) {
-				if (TorqueConverter != null && !torqueConverterLocked) {
-					return TorqueConverter.Request(absTime, dt, inTorque, inAngularVelocity, true);
-				}
-
-				var dryRunResponse = NextComponent.Request(absTime, dt, inTorque, inAngularVelocity, true);
+				var dryRunResponse = HandleDryRunRequest(absTime, dt, torqueConverterLocked, inTorque, inAngularVelocity);
 				dryRunResponse.GearboxPowerRequest = outTorque * avgOutAngularVelocity;
 				return dryRunResponse;
 			}
@@ -253,6 +238,33 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 			return response;
 		}
 
+		private void CheckModelData(TransmissionLossMap effectiveLossMap, double effectiveRatio, bool torqueConverterLocked)
+		{
+			if (effectiveLossMap == null || double.IsNaN(effectiveRatio)) {
+				throw new VectoSimulationException("Ratio or loss-map for gear {0}{1} invalid. Please check input data", Gear,
+					torqueConverterLocked ? "L" : "C");
+			}
+			if (!torqueConverterLocked && !ModelData.Gears[Gear].HasTorqueConverter) {
+				throw new VectoSimulationException("Torque converter requested by cycle for gear without torque converter!");
+			}
+		}
+
+		private IResponse HandleDryRunRequest(Second absTime, Second dt, bool torqueConverterLocked, NewtonMeter inTorque,
+			PerSecond inAngularVelocity)
+		{
+			if (TorqueConverter != null && !torqueConverterLocked) {
+				return TorqueConverter.Request(absTime, dt, inTorque, inAngularVelocity, true);
+			}
+			// mk 2016-12-13
+			//if (outTorque.IsSmaller(0) && inAngularVelocity.IsSmaller(DataBus.EngineIdleSpeed)) {
+			//	//Log.Warn("engine speed would fall below idle speed - disengage! gear from cycle: {0}, vehicle speed: {1}", Gear,
+			//	//	DataBus.VehicleSpeed);
+			//	Gear = 0;
+			//	return RequestDisengaged(absTime, dt, outTorque, outAngularVelocity, dryRun);
+			//}
+			return NextComponent.Request(absTime, dt, inTorque, inAngularVelocity, true);
+		}
+
 		/// <summary>
 		/// Handles Requests when no gear is disengaged
 		/// </summary>
@@ -388,7 +400,8 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 
 		public override GearInfo NextGear
 		{
-			get {
+			get
+			{
 				if (Disengaged == null) {
 					return new GearInfo(Gear, !TorqueConverterActive ?? true);
 				}
@@ -417,7 +430,8 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 
 		public override Second TractionInterruption
 		{
-			get {
+			get
+			{
 				if (Disengaged == null) {
 					return ModelData.TractionInterruption;
 				}
diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/DefaultDriverStrategy.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/DefaultDriverStrategy.cs
index 1145e04f6ee00cd3978352618cf2db0f19f0d332..ef9a330dd311e476ccfb5f151d7e5331f3416a22 100644
--- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/DefaultDriverStrategy.cs
+++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/DefaultDriverStrategy.cs
@@ -33,6 +33,7 @@ using System;
 using System.Collections.Generic;
 using System.Diagnostics;
 using System.Linq;
+using TUGraz.VectoCommon.Exceptions;
 using TUGraz.VectoCommon.Models;
 using TUGraz.VectoCommon.Utils;
 using TUGraz.VectoCore.Configuration;
@@ -130,42 +131,52 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 				}
 			} else {
 				// update action distance for current 'next action'
-				if (Driver.DataBus.VehicleSpeed > NextDrivingAction.NextTargetSpeed) {
-					var brakingDistance = Driver.ComputeDecelerationDistance(NextDrivingAction.NextTargetSpeed) + BrakingSafetyMargin;
-					switch (NextDrivingAction.Action) {
-						case DrivingBehavior.Coasting:
-							//var coastingDistance = ComputeCoastingDistance(Driver.DataBus.VehicleSpeed, NextDrivingAction.NextTargetSpeed);
-							var coastingDistance = ComputeCoastingDistance(Driver.DataBus.VehicleSpeed, NextDrivingAction.CycleEntry);
-							NextDrivingAction.CoastingStartDistance = NextDrivingAction.TriggerDistance - coastingDistance;
-							NextDrivingAction.BrakingStartDistance = NextDrivingAction.TriggerDistance - brakingDistance;
-							break;
-						case DrivingBehavior.Braking:
-							NextDrivingAction.BrakingStartDistance = NextDrivingAction.TriggerDistance - brakingDistance;
-							NextDrivingAction.CoastingStartDistance = double.MaxValue.SI<Meter>();
-							break;
-						default:
-							throw new ArgumentOutOfRangeException();
-					}
-				}
+				UpdateDistancesForCurrentNextAction();
 
-				if (nextAction != null) {
-					if (nextAction.HasEqualTrigger(NextDrivingAction)) {
-						// if the action changes and the vehicle has not yet exceeded the action distance => update the action
-						// otherwise do nothing, NextDrivingAction's action distance has already been updated
-						if (nextAction.Action != NextDrivingAction.Action && nextAction.ActionDistance > currentDistance) {
-							NextDrivingAction = nextAction;
-						}
-					} else {
-						// hmm, we've got a new action that is closer to what we got before?
-						if (nextAction.ActionDistance < NextDrivingAction.ActionDistance) {
-							NextDrivingAction = nextAction;
-						}
+				SetNextDrivingAction(currentDistance, nextAction);
+			}
+			Log.Debug("Next Driving Action: {0}", NextDrivingAction);
+		}
+
+		private void SetNextDrivingAction(Meter currentDistance, DrivingBehaviorEntry nextAction)
+		{
+			if (nextAction != null) {
+				if (nextAction.HasEqualTrigger(NextDrivingAction)) {
+					// if the action changes and the vehicle has not yet exceeded the action distance => update the action
+					// otherwise do nothing, NextDrivingAction's action distance has already been updated
+					if (nextAction.Action != NextDrivingAction.Action && nextAction.ActionDistance > currentDistance) {
+						NextDrivingAction = nextAction;
 					}
 				} else {
-					NextDrivingAction = null;
+					// hmm, we've got a new action that is closer to what we got before?
+					if (nextAction.ActionDistance < NextDrivingAction.ActionDistance) {
+						NextDrivingAction = nextAction;
+					}
+				}
+			} else {
+				NextDrivingAction = null;
+			}
+		}
+
+		private void UpdateDistancesForCurrentNextAction()
+		{
+			if (Driver.DataBus.VehicleSpeed > NextDrivingAction.NextTargetSpeed) {
+				var brakingDistance = Driver.ComputeDecelerationDistance(NextDrivingAction.NextTargetSpeed) + BrakingSafetyMargin;
+				switch (NextDrivingAction.Action) {
+					case DrivingBehavior.Coasting:
+						//var coastingDistance = ComputeCoastingDistance(Driver.DataBus.VehicleSpeed, NextDrivingAction.NextTargetSpeed);
+						var coastingDistance = ComputeCoastingDistance(Driver.DataBus.VehicleSpeed, NextDrivingAction.CycleEntry);
+						NextDrivingAction.CoastingStartDistance = NextDrivingAction.TriggerDistance - coastingDistance;
+						NextDrivingAction.BrakingStartDistance = NextDrivingAction.TriggerDistance - brakingDistance;
+						break;
+					case DrivingBehavior.Braking:
+						NextDrivingAction.BrakingStartDistance = NextDrivingAction.TriggerDistance - brakingDistance;
+						NextDrivingAction.CoastingStartDistance = double.MaxValue.SI<Meter>();
+						break;
+					default:
+						throw new ArgumentOutOfRangeException();
 				}
 			}
-			Log.Debug("Next Driving Action: {0}", NextDrivingAction);
 		}
 
 		protected internal DrivingBehaviorEntry GetNextDrivingAction(Meter ds)
@@ -184,51 +195,58 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 				var nextTargetSpeed = OverspeedAllowed(entry.VehicleTargetSpeed)
 					? entry.VehicleTargetSpeed + Driver.DriverData.OverSpeedEcoRoll.OverSpeed
 					: entry.VehicleTargetSpeed;
-				if (nextTargetSpeed < currentSpeed) {
-					var action = DrivingBehavior.Braking;
-					var coastingDistance = ComputeCoastingDistance(currentSpeed, entry);
-					var brakingDistance = Driver.ComputeDecelerationDistance(nextTargetSpeed) + BrakingSafetyMargin;
-
-					if (!Driver.DriverData.LookAheadCoasting.Enabled || coastingDistance < 0) {
-						Log.Debug(
-							"adding 'Braking' starting at distance {0}. brakingDistance: {1}, triggerDistance: {2}, nextTargetSpeed: {3}",
-							entry.Distance - brakingDistance, brakingDistance, entry.Distance, nextTargetSpeed);
-						coastingDistance = brakingDistance;
-					} else {
-						//var coastingDistance = ComputeCoastingDistance(currentSpeed, nextTargetSpeed);
-						if (currentSpeed > Driver.DriverData.LookAheadCoasting.MinSpeed) {
-							action = DrivingBehavior.Coasting;
-
-							Log.Debug(
-								"adding 'Coasting' starting at distance {0}. coastingDistance: {1}, triggerDistance: {2}, nextTargetSpeed: {3}",
-								entry.Distance - coastingDistance, coastingDistance, entry.Distance, nextTargetSpeed);
-						} else {
-							coastingDistance = -1.SI<Meter>();
-						}
-					}
-					nextActions.Add(
-						new DrivingBehaviorEntry {
-							Action = action,
-							CoastingStartDistance = entry.Distance - coastingDistance,
-							BrakingStartDistance = entry.Distance - brakingDistance,
-							TriggerDistance = entry.Distance,
-							NextTargetSpeed = nextTargetSpeed,
-							CycleEntry = entry,
-						});
+				if (nextTargetSpeed >= currentSpeed) {
+					// acceleration is not relevant
+					continue;
 				}
+				nextActions.Add(GetDrivingBehaviorEntry(nextTargetSpeed, currentSpeed, entry));
 			}
 			if (!nextActions.Any()) {
 				return null;
 			}
 			var nextBrakingAction = nextActions.OrderBy(x => x.BrakingStartDistance).First();
 			var nextCoastingAction = nextActions.OrderBy(x => x.CoastingStartDistance).First();
-			if (nextBrakingAction.TriggerDistance.IsEqual(nextCoastingAction.TriggerDistance)) {
-				// its the same trigger, use it
-				return nextCoastingAction;
-			}
+
+			return nextBrakingAction.TriggerDistance.IsEqual(nextCoastingAction.TriggerDistance)
+				? nextCoastingAction
+				: nextBrakingAction;
 
 			// MQ: 27.5.2016 remark: one could set the coasting distance to the closest coasting distance as found above to start coasting a little bit earlier.
-			return nextBrakingAction;
+		}
+
+		private DrivingBehaviorEntry GetDrivingBehaviorEntry(MeterPerSecond nextTargetSpeed, MeterPerSecond currentSpeed,
+			DrivingCycleData.DrivingCycleEntry entry)
+		{
+			var action = DrivingBehavior.Braking;
+
+			var brakingDistance = Driver.ComputeDecelerationDistance(nextTargetSpeed) + BrakingSafetyMargin;
+			var coastingDistance = ComputeCoastingDistance(currentSpeed, entry);
+			if (!Driver.DriverData.LookAheadCoasting.Enabled || coastingDistance < 0) {
+				Log.Debug(
+					"adding 'Braking' starting at distance {0}. brakingDistance: {1}, triggerDistance: {2}, nextTargetSpeed: {3}",
+					entry.Distance - brakingDistance, brakingDistance, entry.Distance, nextTargetSpeed);
+				coastingDistance = brakingDistance;
+			} else {
+				//var coastingDistance = ComputeCoastingDistance(currentSpeed, nextTargetSpeed);
+				if (currentSpeed > Driver.DriverData.LookAheadCoasting.MinSpeed) {
+					action = DrivingBehavior.Coasting;
+
+					Log.Debug(
+						"adding 'Coasting' starting at distance {0}. coastingDistance: {1}, triggerDistance: {2}, nextTargetSpeed: {3}",
+						entry.Distance - coastingDistance, coastingDistance, entry.Distance, nextTargetSpeed);
+				} else {
+					coastingDistance = -1.SI<Meter>();
+				}
+			}
+			var nextEntry = new DrivingBehaviorEntry {
+				Action = action,
+				CoastingStartDistance = entry.Distance - coastingDistance,
+				BrakingStartDistance = entry.Distance - brakingDistance,
+				TriggerDistance = entry.Distance,
+				NextTargetSpeed = nextTargetSpeed,
+				CycleEntry = entry,
+			};
+			return nextEntry;
 		}
 
 		protected internal virtual Meter ComputeCoastingDistance(MeterPerSecond vehicleSpeed,
@@ -383,95 +401,122 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 				velocity += DriverData.OverSpeedEcoRoll.OverSpeed;
 			}
 			if (DataBus.GearboxType.AutomaticTransmission() || DataBus.ClutchClosed(absTime)) {
-				// drive along
-				IResponse first;
-				if (DriverStrategy.OverspeedAllowed(targetVelocity, prohibitOverspeed) &&
-					DataBus.VehicleSpeed.IsEqual(targetVelocity)) {
-					first = Driver.DrivingActionCoast(absTime, ds, velocity, gradient);
-					debug.Add(new { action = "Coast", first });
-					if (first is ResponseSuccess && first.Acceleration < 0) {
-						first = Driver.DrivingActionAccelerate(absTime, ds, targetVelocity, gradient);
-						debug.Add(new { action = "Coast:(Success & Acc<0) -> Accelerate", first });
-					}
-				} else {
-					first = Driver.DrivingActionAccelerate(absTime, ds, targetVelocity, gradient);
-					debug.Add(new { action = "Accelerate", first });
-				}
+				return HandleRequestEngaged(absTime, ds, targetVelocity, gradient, prohibitOverspeed, velocity, debug);
+			} else {
+				return HandleRequestDisengaged(absTime, ds, gradient, velocity, debug);
+			}
+		}
 
-				var second = first;
-				first.Switch().
-					Case<ResponseUnderload>(r => {
-						if (DataBus.VehicleSpeed.IsGreater(0) && DriverStrategy.OverspeedAllowed(targetVelocity, prohibitOverspeed)) {
-							second = Driver.DrivingActionCoast(absTime, ds, velocity, gradient);
-							debug.Add(new { action = "first:(Underload & Overspeed)-> Coast", second });
-							if (second is ResponseUnderload || second is ResponseSpeedLimitExceeded) {
-								second = Driver.DrivingActionBrake(absTime, ds, velocity, gradient);
-								debug.Add(new {
-									action = "second:(Underload|SpeedLimitExceeded) -> Brake",
-									second
-								});
-							}
-							if (second is ResponseEngineSpeedTooHigh) {
-								second = Driver.DrivingActionBrake(absTime, ds, velocity, gradient, second);
-								debug.Add(new {
-									action = "second:(EngineSpeedTooHigh|SpeedLimitExceeded) -> Brake with reduced acceleration",
-									second
-								});
-							}
-						} else {
-							second = Driver.DrivingActionBrake(absTime, ds, velocity, gradient);
-							debug.Add(new { action = "first:(Underload & !Overspeed) -> Brake", second });
-						}
-					});
-
-				var third = second;
-
-				second.Switch().
-					Case<ResponseGearShift>(r => {
-						third = Driver.DrivingActionRoll(absTime, ds, velocity, gradient);
-						debug.Add(new { action = "second: GearShift -> Roll", third });
-						third.Switch().
-							Case<ResponseUnderload>(() => {
-								// overload may happen if driver limits acceleration when rolling downhill
-								third = Driver.DrivingActionBrake(absTime, ds, velocity, gradient);
-								debug.Add(new { action = "third:Underload -> Brake", third });
-							}).
-							Case<ResponseSpeedLimitExceeded>(() => {
-								third = Driver.DrivingActionBrake(absTime, ds, velocity, gradient);
-								debug.Add(new { action = "third:SpeedLimitExceeded -> Brake", third });
-							});
-					}).
-					Case<ResponseOverload>(r => {
-						third = Driver.DrivingActionCoast(absTime, ds, velocity, gradient);
-						debug.Add(new { action = "second:Overload -> Coast", third });
-					});
+		private IResponse HandleRequestDisengaged(Second absTime, Meter ds, Radian gradient, MeterPerSecond velocity,
+			DebugData debug)
+		{
+			if (DataBus.VehicleSpeed.IsSmallerOrEqual(0.SI<MeterPerSecond>())) {
+				// the clutch is disengaged, and the vehicle stopped - we can't perform a roll action. wait for the clutch to be engaged
+				// todo mk 2016-08-23: is this still needed?
+				var remainingShiftTime = Constants.SimulationSettings.TargetTimeInterval;
+				while (!DataBus.ClutchClosed(absTime + remainingShiftTime)) {
+					remainingShiftTime += Constants.SimulationSettings.TargetTimeInterval;
+				}
+				return new ResponseFailTimeInterval {
+					Source = this,
+					DeltaT = remainingShiftTime,
+				};
+			}
+			var response = Driver.DrivingActionRoll(absTime, ds, velocity, gradient);
+			debug.Add(new { action = "ClutchOpen -> Roll", response });
+			response.Switch().
+				Case<ResponseUnderload>(r => {
+					response = Driver.DrivingActionBrake(absTime, ds, velocity, gradient, r);
+					debug.Add(new { action = "Roll:Underload -> Brake", response });
+				})
+				.Case<ResponseSpeedLimitExceeded>(() => {
+					response = Driver.DrivingActionBrake(absTime, ds, velocity, gradient);
+					debug.Add(new { action = "Roll:SpeedLimitExceeded -> Brake", response });
+				});
+			return response;
+		}
 
-				return third;
-			} else {
-				if (DataBus.VehicleSpeed.IsSmallerOrEqual(0.SI<MeterPerSecond>())) {
-					// the clutch is disengaged, and the vehicle stopped - we can't perform a roll action. wait for the clutch to be engaged
-					var remainingShiftTime = Constants.SimulationSettings.TargetTimeInterval;
-					while (!DataBus.ClutchClosed(absTime + remainingShiftTime)) {
-						remainingShiftTime += Constants.SimulationSettings.TargetTimeInterval;
+		private IResponse HandleRequestEngaged(Second absTime, Meter ds, MeterPerSecond targetVelocity, Radian gradient,
+			bool prohibitOverspeed, MeterPerSecond velocity, DebugData debug)
+		{
+			// drive along
+			var first = FirstAccelerateOrCoast(absTime, ds, targetVelocity, gradient, prohibitOverspeed, velocity, debug);
+
+			var second = first;
+			first.Switch().
+				Case<ResponseUnderload>(r => {
+					if (DataBus.VehicleSpeed.IsGreater(0) && DriverStrategy.OverspeedAllowed(targetVelocity, prohibitOverspeed)) {
+						second = Driver.DrivingActionCoast(absTime, ds, velocity, gradient);
+						debug.Add(new { action = "first:(Underload & Overspeed)-> Coast", second });
+						second = HandleCoastAfterUnderloadWithOverspeed(absTime, ds, gradient, velocity, debug, second);
+					} else {
+						second = Driver.DrivingActionBrake(absTime, ds, velocity, gradient);
+						debug.Add(new { action = "first:(Underload & !Overspeed) -> Brake", second });
 					}
-					return new ResponseFailTimeInterval {
-						Source = this,
-						DeltaT = remainingShiftTime,
-					};
+				});
+
+			var third = second;
+
+			second.Switch().
+				Case<ResponseGearShift>(r => {
+					third = Driver.DrivingActionRoll(absTime, ds, velocity, gradient);
+					debug.Add(new { action = "second: GearShift -> Roll", third });
+					third.Switch().
+						Case<ResponseUnderload>(() => {
+							// overload may happen if driver limits acceleration when rolling downhill
+							third = Driver.DrivingActionBrake(absTime, ds, velocity, gradient);
+							debug.Add(new { action = "third:Underload -> Brake", third });
+						}).
+						Case<ResponseSpeedLimitExceeded>(() => {
+							third = Driver.DrivingActionBrake(absTime, ds, velocity, gradient);
+							debug.Add(new { action = "third:SpeedLimitExceeded -> Brake", third });
+						});
+				}).
+				Case<ResponseOverload>(r => {
+					third = Driver.DrivingActionCoast(absTime, ds, velocity, gradient);
+					debug.Add(new { action = "second:Overload -> Coast", third });
+				});
+
+			return third;
+		}
+
+		private IResponse HandleCoastAfterUnderloadWithOverspeed(Second absTime, Meter ds, Radian gradient,
+			MeterPerSecond velocity, DebugData debug, IResponse second)
+		{
+			if (second is ResponseUnderload || second is ResponseSpeedLimitExceeded) {
+				second = Driver.DrivingActionBrake(absTime, ds, velocity, gradient);
+				debug.Add(new {
+					action = "second:(Underload|SpeedLimitExceeded) -> Brake",
+					second
+				});
+			}
+			if (second is ResponseEngineSpeedTooHigh) {
+				second = Driver.DrivingActionBrake(absTime, ds, velocity, gradient, second);
+				debug.Add(new {
+					action = "second:(EngineSpeedTooHigh|SpeedLimitExceeded) -> Brake with reduced acceleration",
+					second
+				});
+			}
+			return second;
+		}
+
+		private IResponse FirstAccelerateOrCoast(Second absTime, Meter ds, MeterPerSecond targetVelocity, Radian gradient,
+			bool prohibitOverspeed, MeterPerSecond velocity, DebugData debug)
+		{
+			IResponse first;
+			if (DriverStrategy.OverspeedAllowed(targetVelocity, prohibitOverspeed) &&
+				DataBus.VehicleSpeed.IsEqual(targetVelocity)) {
+				first = Driver.DrivingActionCoast(absTime, ds, velocity, gradient);
+				debug.Add(new { action = "Coast", first });
+				if (first is ResponseSuccess && first.Acceleration < 0) {
+					first = Driver.DrivingActionAccelerate(absTime, ds, targetVelocity, gradient);
+					debug.Add(new { action = "Coast:(Success & Acc<0) -> Accelerate", first });
 				}
-				var response = Driver.DrivingActionRoll(absTime, ds, velocity, gradient);
-				debug.Add(new { action = "ClutchOpen -> Roll", response });
-				response.Switch().
-					Case<ResponseUnderload>(r => {
-						response = Driver.DrivingActionBrake(absTime, ds, velocity, gradient, r);
-						debug.Add(new { action = "Roll:Underload -> Brake", response });
-					})
-					.Case<ResponseSpeedLimitExceeded>(() => {
-						response = Driver.DrivingActionBrake(absTime, ds, velocity, gradient);
-						debug.Add(new { action = "Roll:SpeedLimitExceeded -> Brake", response });
-					});
-				return response;
+			} else {
+				first = Driver.DrivingActionAccelerate(absTime, ds, targetVelocity, gradient);
+				debug.Add(new { action = "Accelerate", first });
 			}
+			return first;
 		}
 
 		protected override IResponse CheckRequestDoesNotExceedNextAction(Second absTime, Meter ds,
@@ -535,7 +580,6 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 		protected override IResponse DoHandleRequest(Second absTime, Meter ds, MeterPerSecond targetVelocity, Radian gradient,
 			bool prohibitOverspeed = false)
 		{
-			IResponse response = null;
 			if (DataBus.VehicleSpeed <= DriverStrategy.BrakeTrigger.NextTargetSpeed) {
 				return HandleTargetspeedReached(absTime, ds, targetVelocity, gradient);
 			}
@@ -545,136 +589,218 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 								DefaultDriverStrategy.BrakingSafetyMargin;
 			DriverStrategy.BrakeTrigger.BrakingStartDistance = DriverStrategy.BrakeTrigger.TriggerDistance - brakingDistance;
 			if (Phase == BrakingPhase.Coast) {
-				var nextBrakeAction = DriverStrategy.GetNextDrivingAction(ds);
-				if (nextBrakeAction != null && !DriverStrategy.BrakeTrigger.TriggerDistance.IsEqual(nextBrakeAction.TriggerDistance) &&
-					nextBrakeAction.BrakingStartDistance.IsSmaller(DriverStrategy.BrakeTrigger.BrakingStartDistance)) {
-					DriverStrategy.BrakeTrigger = nextBrakeAction;
-					Log.Debug("setting brake trigger to new trigger: trigger distance: {0}, start braking @ {1}",
-						nextBrakeAction.TriggerDistance, nextBrakeAction.BrakingStartDistance);
-				}
-
-				Log.Debug("start braking @ {0}", DriverStrategy.BrakeTrigger.BrakingStartDistance);
-				var remainingDistanceToBrake = DriverStrategy.BrakeTrigger.BrakingStartDistance - currentDistance;
-				var estimatedTimeInterval = remainingDistanceToBrake / DataBus.VehicleSpeed;
-				if (estimatedTimeInterval.IsSmaller(Constants.SimulationSettings.LowerBoundTimeInterval) ||
-					currentDistance + Constants.SimulationSettings.DriverActionDistanceTolerance >
-					DriverStrategy.BrakeTrigger.BrakingStartDistance) {
-					Phase = BrakingPhase.Brake;
-					Log.Debug("Switching to BRAKE Phase. currentDistance: {0}", currentDistance);
-				} else {
-					if ((currentDistance + ds).IsGreater(DriverStrategy.BrakeTrigger.BrakingStartDistance)) {
-						return new ResponseDrivingCycleDistanceExceeded() {
-							//Source = this,
-							MaxDistance = DriverStrategy.BrakeTrigger.BrakingStartDistance - currentDistance
-						};
-					}
-				}
-				if (DataBus.VehicleSpeed < Constants.SimulationSettings.MinVelocityForCoast) {
-					Phase = BrakingPhase.Brake;
-					Log.Debug("Switching to BRAKE Phase. currentDistance: {0}  v: {1}", currentDistance,
-						DataBus.VehicleSpeed);
+				var resp = CheckSwitchingToBraking(ds, currentDistance);
+				if (resp != null) {
+					return resp;
 				}
 			}
 			switch (Phase) {
 				case BrakingPhase.Coast:
-					Driver.DriverBehavior = DrivingBehavior.Coasting;
+					return DoCoast(absTime, ds, targetVelocity, gradient, currentDistance);
+				case BrakingPhase.Brake:
+					return DoBrake(absTime, ds, targetVelocity, gradient, brakingDistance, currentDistance);
+				default:
+					throw new VectoException("Invalid Phase in DriverModeBrake");
+			}
+		}
+
+		private IResponse DoBrake(Second absTime, Meter ds, MeterPerSecond targetVelocity, Radian gradient,
+			Meter brakingDistance, Meter currentDistance)
+		{
+			IResponse response;
+			Log.Debug("Phase: BRAKE. breaking distance: {0} start braking @ {1}", brakingDistance,
+				DriverStrategy.BrakeTrigger.BrakingStartDistance);
+			if (DriverStrategy.BrakeTrigger.BrakingStartDistance.IsSmaller(currentDistance,
+				Constants.SimulationSettings.DriverActionDistanceTolerance / 2)) {
+				Log.Info("Expected Braking Deceleration could not be reached! {0}",
+					DriverStrategy.BrakeTrigger.BrakingStartDistance - currentDistance);
+			}
+			var targetDistance = DataBus.VehicleSpeed < Constants.SimulationSettings.MinVelocityForCoast
+				? DriverStrategy.BrakeTrigger.TriggerDistance
+				: null;
+			if (targetDistance == null && DriverStrategy.BrakeTrigger.NextTargetSpeed.IsEqual(0.SI<MeterPerSecond>())) {
+				targetDistance = DriverStrategy.BrakeTrigger.TriggerDistance - DefaultDriverStrategy.BrakingSafetyMargin;
+			}
+			Driver.DriverBehavior = DrivingBehavior.Braking;
+			response = Driver.DrivingActionBrake(absTime, ds, DriverStrategy.BrakeTrigger.NextTargetSpeed,
+				gradient, targetDistance: targetDistance);
+			response.Switch().
+				Case<ResponseOverload>(r => {
+					Log.Info(
+						"Brake -> Got OverloadResponse during brake action - desired deceleration could not be reached! response: {0}",
+						r);
+					if (!DataBus.ClutchClosed(absTime)) {
+						Log.Info("Brake -> Overload -> Clutch is open - Trying roll action");
+						response = Driver.DrivingActionRoll(absTime, ds, targetVelocity, gradient);
+					} else {
+						Log.Info("Brake -> Overload -> Clutch is closed - Trying brake action again");
+						DataBus.BrakePower = 0.SI<Watt>();
+						response = Driver.DrivingActionBrake(absTime, ds, DriverStrategy.BrakeTrigger.NextTargetSpeed, gradient,
+							targetDistance: targetDistance);
+						response.Switch().
+							Case<ResponseOverload>(r1 => {
+								Log.Info("Brake -> Overload -> 2nd Brake -> Overload -> Trying accelerate action");
+								response = Driver.DrivingActionAccelerate(absTime, ds, DriverStrategy.BrakeTrigger.NextTargetSpeed, gradient);
+								response.Switch().Case<ResponseGearShift>(
+									rs => {
+										Log.Info("Brake -> Overload -> 2nd Brake -> Accelerate -> Got GearShift response, performing roll action");
+										response = Driver.DrivingActionRoll(absTime, ds, DriverStrategy.BrakeTrigger.NextTargetSpeed, gradient);
+									});
+							});
+					}
+				}).
+				Case<ResponseGearShift>(r => {
+					Log.Info("Brake -> Got GearShift response, performing roll action + brakes");
+					//response = Driver.DrivingActionRoll(absTime, ds, DriverStrategy.BrakeTrigger.NextTargetSpeed, gradient);
+					DataBus.BrakePower = 0.SI<Watt>();
+					response = Driver.DrivingActionBrake(absTime, ds, DriverStrategy.BrakeTrigger.NextTargetSpeed,
+						gradient, targetDistance: targetDistance);
+				});
+			return response;
+		}
+
+		private IResponse DoCoast(Second absTime, Meter ds, MeterPerSecond targetVelocity, Radian gradient,
+			Meter currentDistance)
+		{
+			IResponse response;
+			Driver.DriverBehavior = DrivingBehavior.Coasting;
+			response = DataBus.ClutchClosed(absTime)
+				? Driver.DrivingActionCoast(absTime, ds, VectoMath.Max(targetVelocity, DataBus.VehicleSpeed), gradient)
+				: Driver.DrivingActionRoll(absTime, ds, VectoMath.Max(targetVelocity, DataBus.VehicleSpeed), gradient);
+			response.Switch().
+				Case<ResponseUnderload>(r => {
+					// coast would decelerate more than driver's max deceleration => issue brakes to decelerate with driver's max deceleration
+					response = Driver.DrivingActionBrake(absTime, ds, DriverStrategy.BrakeTrigger.NextTargetSpeed,
+						gradient, r);
+					if ((DriverStrategy.BrakeTrigger.BrakingStartDistance - currentDistance).IsSmallerOrEqual(
+						Constants.SimulationSettings.DriverActionDistanceTolerance)) {
+						Phase = BrakingPhase.Brake;
+					}
+				}).
+				Case<ResponseOverload>(r => {
+					// limiting deceleration while coast may result in an overload => issue brakes to decelerate with driver's max deceleration
 					response = DataBus.ClutchClosed(absTime)
-						? Driver.DrivingActionCoast(absTime, ds, VectoMath.Max(targetVelocity, DataBus.VehicleSpeed), gradient)
-						: Driver.DrivingActionRoll(absTime, ds, VectoMath.Max(targetVelocity, DataBus.VehicleSpeed), gradient);
+						? Driver.DrivingActionAccelerate(absTime, ds, targetVelocity, gradient)
+						: Driver.DrivingActionRoll(absTime, ds, targetVelocity, gradient);
+					//Phase = BrakingPhase.Brake;
+				}).
+				Case<ResponseDrivingCycleDistanceExceeded>(r => {
+					if (!ds.IsEqual(r.MaxDistance)) {
+						// distance has been reduced due to vehicle stop in coast/roll action => use brake action to get exactly to the stop-distance
+						// TODO what if no gear is enaged (and we need driveline power to get to the stop-distance?
+						response = Driver.DrivingActionBrake(absTime, ds, DriverStrategy.BrakeTrigger.NextTargetSpeed, gradient);
+					}
+				}).
+				Case<ResponseGearShift>(r => {
+					response = Driver.DrivingActionRoll(absTime, ds, targetVelocity, gradient);
+				}).
+				Case<ResponseEngineSpeedTooHigh>(r => {
+					response = Driver.DrivingActionBrake(absTime, ds, targetVelocity, gradient, r);
+				});
+			// handle the SpeedLimitExceeded Response separately in case it occurs in one of the requests in the second try
+			response.Switch().
+				Case<ResponseSpeedLimitExceeded>(() => {
+					response = Driver.DrivingActionBrake(absTime, ds, DataBus.VehicleSpeed,
+						gradient);
+					if (response is ResponseOverload && !DataBus.ClutchClosed(absTime)) {
+						response = Driver.DrivingActionRoll(absTime, ds, DataBus.VehicleSpeed, gradient);
+					}
+				});
+			return response;
+		}
+
+		private IResponse CheckSwitchingToBraking(Meter ds, Meter currentDistance)
+		{
+			var nextBrakeAction = DriverStrategy.GetNextDrivingAction(ds);
+			if (nextBrakeAction != null && !DriverStrategy.BrakeTrigger.TriggerDistance.IsEqual(nextBrakeAction.TriggerDistance) &&
+				nextBrakeAction.BrakingStartDistance.IsSmaller(DriverStrategy.BrakeTrigger.BrakingStartDistance)) {
+				DriverStrategy.BrakeTrigger = nextBrakeAction;
+				Log.Debug("setting brake trigger to new trigger: trigger distance: {0}, start braking @ {1}",
+					nextBrakeAction.TriggerDistance, nextBrakeAction.BrakingStartDistance);
+			}
+
+			Log.Debug("start braking @ {0}", DriverStrategy.BrakeTrigger.BrakingStartDistance);
+			var remainingDistanceToBrake = DriverStrategy.BrakeTrigger.BrakingStartDistance - currentDistance;
+			var estimatedTimeInterval = remainingDistanceToBrake / DataBus.VehicleSpeed;
+			if (estimatedTimeInterval.IsSmaller(Constants.SimulationSettings.LowerBoundTimeInterval) ||
+				currentDistance + Constants.SimulationSettings.DriverActionDistanceTolerance >
+				DriverStrategy.BrakeTrigger.BrakingStartDistance) {
+				Phase = BrakingPhase.Brake;
+				Log.Debug("Switching to BRAKE Phase. currentDistance: {0}", currentDistance);
+			} else {
+				if ((currentDistance + ds).IsGreater(DriverStrategy.BrakeTrigger.BrakingStartDistance)) {
+					return new ResponseDrivingCycleDistanceExceeded() {
+						//Source = this,
+						MaxDistance = DriverStrategy.BrakeTrigger.BrakingStartDistance - currentDistance
+					};
+				}
+			}
+			if (DataBus.VehicleSpeed < Constants.SimulationSettings.MinVelocityForCoast) {
+				Phase = BrakingPhase.Brake;
+				Log.Debug("Switching to BRAKE Phase. currentDistance: {0}  v: {1}", currentDistance,
+					DataBus.VehicleSpeed);
+			}
+			return null;
+		}
+
+		private IResponse HandleTargetspeedReached(Second absTime, Meter ds, MeterPerSecond targetVelocity, Radian gradient)
+		{
+			var response = TargetSpeedReachedDriveAlong(absTime, ds, targetVelocity, gradient);
+			//var i = 0;
+			//do {
+			response.Switch().
+				Case<ResponseGearShift>(() => {
+					response = Driver.DrivingActionRoll(absTime, ds, targetVelocity, gradient);
 					response.Switch().
 						Case<ResponseUnderload>(r => {
-							// coast would decelerate more than driver's max deceleration => issue brakes to decelerate with driver's max deceleration
+							// under-load may happen if driver limits acceleration when rolling downhill
 							response = Driver.DrivingActionBrake(absTime, ds, DriverStrategy.BrakeTrigger.NextTargetSpeed,
 								gradient, r);
-							if ((DriverStrategy.BrakeTrigger.BrakingStartDistance - currentDistance).IsSmallerOrEqual(
-								Constants.SimulationSettings.DriverActionDistanceTolerance)) {
-								Phase = BrakingPhase.Brake;
-							}
-						}).
-						Case<ResponseOverload>(r => {
-							// limiting deceleration while coast may result in an overload => issue brakes to decelerate with driver's max deceleration
-							response = DataBus.ClutchClosed(absTime)
-								? Driver.DrivingActionAccelerate(absTime, ds, targetVelocity, gradient)
-								: Driver.DrivingActionRoll(absTime, ds, targetVelocity, gradient);
-							//Phase = BrakingPhase.Brake;
 						}).
-						Case<ResponseDrivingCycleDistanceExceeded>(r => {
-							if (!ds.IsEqual(r.MaxDistance)) {
-								// distance has been reduced due to vehicle stop in coast/roll action => use brake action to get exactly to the stop-distance
-								response = Driver.DrivingActionBrake(absTime, ds, DriverStrategy.BrakeTrigger.NextTargetSpeed, gradient);
-							}
-						}).
-						Case<ResponseGearShift>(r => { response = Driver.DrivingActionRoll(absTime, ds, targetVelocity, gradient); }).
-						Case<ResponseEngineSpeedTooHigh>(r => {
-							response = Driver.DrivingActionBrake(absTime, ds, targetVelocity, gradient, r);
-						});
-					// handle the SpeedLimitExceeded Response separately in case it occurs in one of the requests in the second try
-					response.Switch().
 						Case<ResponseSpeedLimitExceeded>(() => {
 							response = Driver.DrivingActionBrake(absTime, ds, DataBus.VehicleSpeed,
 								gradient);
-							if (response is ResponseOverload && !DataBus.ClutchClosed(absTime)) {
-								response = Driver.DrivingActionRoll(absTime, ds, DataBus.VehicleSpeed, gradient);
-							}
 						});
-					break;
-				case BrakingPhase.Brake:
-
-					Log.Debug("Phase: BRAKE. breaking distance: {0} start braking @ {1}", brakingDistance,
-						DriverStrategy.BrakeTrigger.BrakingStartDistance);
-					if (DriverStrategy.BrakeTrigger.BrakingStartDistance.IsSmaller(currentDistance,
-						Constants.SimulationSettings.DriverActionDistanceTolerance / 2)) {
-						Log.Info("Expected Braking Deceleration could not be reached! {0}",
-							DriverStrategy.BrakeTrigger.BrakingStartDistance - currentDistance);
-					}
-					var targetDistance = DataBus.VehicleSpeed < Constants.SimulationSettings.MinVelocityForCoast
-						? DriverStrategy.BrakeTrigger.TriggerDistance
-						: null;
-					if (targetDistance == null && DriverStrategy.BrakeTrigger.NextTargetSpeed.IsEqual(0.SI<MeterPerSecond>())) {
-						targetDistance = DriverStrategy.BrakeTrigger.TriggerDistance - DefaultDriverStrategy.BrakingSafetyMargin;
-					}
-					Driver.DriverBehavior = DrivingBehavior.Braking;
-					response = Driver.DrivingActionBrake(absTime, ds, DriverStrategy.BrakeTrigger.NextTargetSpeed,
-						gradient, targetDistance: targetDistance);
+				}).
+				Case<ResponseSpeedLimitExceeded>(() => {
+					response = Driver.DrivingActionBrake(absTime, ds, DataBus.VehicleSpeed,
+						gradient);
+				}).
+				Case<ResponseUnderload>(r => {
+					//response = Driver.DrivingActionBrake(absTime, ds, DriverStrategy.BrakeTrigger.NextTargetSpeed,
+					//	gradient, r);
+					response = Driver.DrivingActionBrake(absTime, ds, DataBus.VehicleSpeed + r.Acceleration * r.SimulationInterval,
+						gradient, r);
 					response.Switch().
-						Case<ResponseOverload>(r => {
-							Log.Info(
-								"Brake -> Got OverloadResponse during brake action - desired deceleration could not be reached! response: {0}",
-								r);
-							if (!DataBus.ClutchClosed(absTime)) {
-								Log.Info("Brake -> Overload -> Clutch is open - Trying roll action");
-								response = Driver.DrivingActionRoll(absTime, ds, targetVelocity, gradient);
-							} else {
-								Log.Info("Brake -> Overload -> Clutch is closed - Trying brake action again");
-								DataBus.BrakePower = 0.SI<Watt>();
-								response = Driver.DrivingActionBrake(absTime, ds, DriverStrategy.BrakeTrigger.NextTargetSpeed, gradient,
-									targetDistance: targetDistance);
-								response.Switch().
-									Case<ResponseOverload>(r1 => {
-										Log.Info("Brake -> Overload -> 2nd Brake -> Overload -> Trying accelerate action");
-										response = Driver.DrivingActionAccelerate(absTime, ds, DriverStrategy.BrakeTrigger.NextTargetSpeed, gradient);
-										response.Switch().Case<ResponseGearShift>(
-											rs => {
-												Log.Info("Brake -> Overload -> 2nd Brake -> Accelerate -> Got GearShift response, performing roll action");
-												response = Driver.DrivingActionRoll(absTime, ds, DriverStrategy.BrakeTrigger.NextTargetSpeed, gradient);
-											});
-									});
-							}
-						}).
-						Case<ResponseGearShift>(r => {
-							Log.Info("Brake -> Got GearShift response, performing roll action + brakes");
-							//response = Driver.DrivingActionRoll(absTime, ds, DriverStrategy.BrakeTrigger.NextTargetSpeed, gradient);
+						Case<ResponseGearShift>(() => {
 							DataBus.BrakePower = 0.SI<Watt>();
 							response = Driver.DrivingActionBrake(absTime, ds, DriverStrategy.BrakeTrigger.NextTargetSpeed,
-								gradient, targetDistance: targetDistance);
+								gradient, r);
+						}).
+						Case<ResponseOverload>(() => {
+							DataBus.BrakePower = 0.SI<Watt>();
+							if (DataBus.GearboxType.AutomaticTransmission() || DataBus.ClutchClosed(absTime)) {
+								if (DataBus.VehicleSpeed.IsGreater(0)) {
+									response = Driver.DrivingActionAccelerate(absTime, ds, DriverStrategy.BrakeTrigger.NextTargetSpeed, gradient);
+								} else {
+									if (RetryDistanceExceeded) {
+										response = Driver.DrivingActionAccelerate(absTime, ds, targetVelocity, gradient);
+									} else {
+										RetryDistanceExceeded = true;
+										response = new ResponseDrivingCycleDistanceExceeded() { MaxDistance = ds / 2 };
+									}
+								}
+							} else {
+								response = Driver.DrivingActionRoll(absTime, ds, DriverStrategy.BrakeTrigger.NextTargetSpeed, gradient);
+							}
 						});
-					break;
-			}
-
+				});
+			//} while (!(response is ResponseSuccess) && i++ < 3);
 			return response;
 		}
 
-		private IResponse HandleTargetspeedReached(Second absTime, Meter ds, MeterPerSecond targetVelocity, Radian gradient)
+		private IResponse TargetSpeedReachedDriveAlong(Second absTime, Meter ds, MeterPerSecond targetVelocity,
+			Radian gradient)
 		{
 			IResponse response;
 			if (DataBus.GearboxType.AutomaticTransmission() || DataBus.ClutchClosed(absTime)) {
@@ -685,62 +811,12 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 						response = Driver.DrivingActionAccelerate(absTime, ds, targetVelocity, gradient);
 					} else {
 						RetryDistanceExceeded = true;
-						return new ResponseDrivingCycleDistanceExceeded() { MaxDistance = ds / 2 };
+						response = new ResponseDrivingCycleDistanceExceeded() { MaxDistance = ds / 2 };
 					}
 				}
 			} else {
 				response = Driver.DrivingActionRoll(absTime, ds, DriverStrategy.BrakeTrigger.NextTargetSpeed, gradient);
 			}
-			var i = 0;
-			do {
-				response.Switch().
-					Case<ResponseGearShift>(() => {
-						response = Driver.DrivingActionRoll(absTime, ds, targetVelocity, gradient);
-						response.Switch().
-							Case<ResponseUnderload>(r => {
-								// under-load may happen if driver limits acceleration when rolling downhill
-								response = Driver.DrivingActionBrake(absTime, ds, DriverStrategy.BrakeTrigger.NextTargetSpeed,
-									gradient, r);
-							}).
-							Case<ResponseSpeedLimitExceeded>(() => {
-								response = Driver.DrivingActionBrake(absTime, ds, DataBus.VehicleSpeed,
-									gradient);
-							});
-					}).
-					Case<ResponseSpeedLimitExceeded>(() => {
-						response = Driver.DrivingActionBrake(absTime, ds, DataBus.VehicleSpeed,
-							gradient);
-					}).
-					Case<ResponseUnderload>(r => {
-						//response = Driver.DrivingActionBrake(absTime, ds, DriverStrategy.BrakeTrigger.NextTargetSpeed,
-						//	gradient, r);
-						response = Driver.DrivingActionBrake(absTime, ds, DataBus.VehicleSpeed + r.Acceleration * r.SimulationInterval,
-							gradient, r);
-						response.Switch().
-							Case<ResponseGearShift>(() => {
-								DataBus.BrakePower = 0.SI<Watt>();
-								response = Driver.DrivingActionBrake(absTime, ds, DriverStrategy.BrakeTrigger.NextTargetSpeed,
-									gradient, r);
-							}).
-							Case<ResponseOverload>(() => {
-								DataBus.BrakePower = 0.SI<Watt>();
-								if (DataBus.GearboxType.AutomaticTransmission() || DataBus.ClutchClosed(absTime)) {
-									if (DataBus.VehicleSpeed.IsGreater(0)) {
-										response = Driver.DrivingActionAccelerate(absTime, ds, DriverStrategy.BrakeTrigger.NextTargetSpeed, gradient);
-									} else {
-										if (RetryDistanceExceeded) {
-											response = Driver.DrivingActionAccelerate(absTime, ds, targetVelocity, gradient);
-										} else {
-											RetryDistanceExceeded = true;
-											response = new ResponseDrivingCycleDistanceExceeded() { MaxDistance = ds / 2 };
-										}
-									}
-								} else {
-									response = Driver.DrivingActionRoll(absTime, ds, DriverStrategy.BrakeTrigger.NextTargetSpeed, gradient);
-								}
-							});
-					});
-			} while (!(response is ResponseSuccess) && i++ < 3); 
 			return response;
 		}
 
@@ -788,7 +864,8 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 
 		public Meter ActionDistance
 		{
-			get {
+			get
+			{
 				return VectoMath.Min(CoastingStartDistance ?? double.MaxValue.SI<Meter>(),
 					BrakingStartDistance ?? double.MaxValue.SI<Meter>());
 			}
diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/DistanceBasedDrivingCycle.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/DistanceBasedDrivingCycle.cs
index 5ef7c018e3e3a1d472b5b76b296da1fe215ec3f5..f077fefc392a8c938032d8c729544493c8417a43 100644
--- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/DistanceBasedDrivingCycle.cs
+++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/DistanceBasedDrivingCycle.cs
@@ -107,27 +107,9 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 		public IResponse Request(Second absTime, Meter ds)
 		{
 			if (Left.Distance.IsEqual(PreviousState.Distance.Value())) {
-				// we are exactly on an entry in the cycle.
-				var stopTime = Left.PTOActive && IdleController != null
-					? Left.StoppingTime + IdleController.Duration
-					: Left.StoppingTime;
-
-				if (stopTime.IsGreater(0) && PreviousState.WaitTime.IsSmaller(stopTime)) {
-					// stop for certain time unless we've already waited long enough ...
-
-					// we are stopping: ensure that velocity is 0.
-					if (!Left.VehicleTargetSpeed.IsEqual(0)) {
-						Log.Warn("Stopping Time requested in cycle but target-velocity not zero. distance: {0}, target speed: {1}",
-							Left.StoppingTime, Left.VehicleTargetSpeed);
-						throw new VectoSimulationException("Stopping Time only allowed when target speed is zero!");
-					}
-					var dt = GetStopTimeInterval();
-					if (dt == null) {
-						CurrentState.WaitPhase++;
-						dt = GetStopTimeInterval();
-					}
-					CurrentState.Response = DriveTimeInterval(absTime, dt);
-					return CurrentState.Response;
+				var response = DoFirstSimulationInterval(absTime);
+				if (response != null) {
+					return response;
 				}
 			}
 			if (CycleIntervalIterator.LastEntry && PreviousState.Distance.IsEqual(Right.Distance)) {
@@ -167,6 +149,33 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 			return CurrentState.Response;
 		}
 
+		private IResponse DoFirstSimulationInterval(Second absTime)
+		{
+// we are exactly on an entry in the cycle.
+			var stopTime = Left.PTOActive && IdleController != null
+				? Left.StoppingTime + IdleController.Duration
+				: Left.StoppingTime;
+
+			if (stopTime.IsGreater(0) && PreviousState.WaitTime.IsSmaller(stopTime)) {
+				// stop for certain time unless we've already waited long enough ...
+
+				// we are stopping: ensure that velocity is 0.
+				if (!Left.VehicleTargetSpeed.IsEqual(0)) {
+					Log.Warn("Stopping Time requested in cycle but target-velocity not zero. distance: {0}, target speed: {1}",
+						Left.StoppingTime, Left.VehicleTargetSpeed);
+					throw new VectoSimulationException("Stopping Time only allowed when target speed is zero!");
+				}
+				var dt = GetStopTimeInterval();
+				if (dt == null) {
+					CurrentState.WaitPhase++;
+					dt = GetStopTimeInterval();
+				}
+				CurrentState.Response = DriveTimeInterval(absTime, dt);
+				return CurrentState.Response;
+			}
+			return null;
+		}
+
 		private Second GetStopTimeInterval()
 		{
 			if (!Left.PTOActive || IdleController == null) {
@@ -309,17 +318,6 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 			CurrentState = CurrentState.Clone();
 			_intervalProlonged = false;
 
-			//var stopTime = Left.PTOActive && IdleController != null
-			//	? Left.StoppingTime + IdleController.Duration
-			//	: Left.StoppingTime;
-
-			//if (!stopTime.IsEqual(0) && stopTime.IsEqual(PreviousState.WaitTime)) {
-			//	// we needed to stop at the current interval in the cycle and have already waited enough time, move on..
-			//	if (IdleController != null) {
-			//		IdleController.ActivateIdle();
-			//	}
-			//	CycleIntervalIterator.MoveNext();
-			//}
 
 			var stopTime = Left.PTOActive && IdleController != null
 				? Left.StoppingTime + IdleController.Duration
@@ -392,7 +390,8 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 		/// </summary>
 		public double Progress
 		{
-			get {
+			get
+			{
 				return Data.Entries.Count > 0
 					? (CurrentState.Distance.Value() - Data.Entries.First().Distance.Value()) /
 					(Data.Entries.Last().Distance.Value() - Data.Entries.First().Distance.Value())
@@ -449,7 +448,8 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 
 		public CycleData CycleData
 		{
-			get {
+			get
+			{
 				return new CycleData {
 					AbsTime = CurrentState.AbsTime,
 					AbsDistance = CurrentState.Distance,
diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/Driver.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/Driver.cs
index d6427262a92f48cca756403e27ea624d13a4fe1f..894dd1b7096ba7193d40314f607a597d65863c86 100644
--- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/Driver.cs
+++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/Driver.cs
@@ -29,907 +29,943 @@
 *   Martin Rexeis, rexeis@ivt.tugraz.at, IVT, Graz University of Technology
 */
 
-using System;
-using TUGraz.VectoCommon.Exceptions;
-using TUGraz.VectoCommon.Models;
-using TUGraz.VectoCommon.Utils;
-using TUGraz.VectoCore.Configuration;
-using TUGraz.VectoCore.Models.Connector.Ports;
-using TUGraz.VectoCore.Models.Connector.Ports.Impl;
-using TUGraz.VectoCore.Models.Simulation;
-using TUGraz.VectoCore.Models.Simulation.Data;
-using TUGraz.VectoCore.Models.Simulation.DataBus;
-using TUGraz.VectoCore.OutputData;
-using TUGraz.VectoCore.Utils;
-using DriverData = TUGraz.VectoCore.Models.SimulationComponent.Data.DriverData;
-
-namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
-{
-	public class Driver :
-		StatefulProviderComponent<Driver.DriverState, IDrivingCycleOutPort, IDriverDemandInPort, IDriverDemandOutPort>,
-		IDriver, IDrivingCycleOutPort, IDriverDemandInPort, IDriverActions, IDriverInfo
-	{
-		public DriverData DriverData { get; protected set; }
-
-		protected readonly IDriverStrategy DriverStrategy;
-		public string CurrentAction = "";
-
-		public Driver(IVehicleContainer container, DriverData driverData, IDriverStrategy strategy) : base(container)
-		{
-			DriverData = driverData;
-			DriverStrategy = strategy;
-			strategy.Driver = this;
-			DriverAcceleration = 0.SI<MeterPerSquareSecond>();
-		}
-
-		public IResponse Initialize(MeterPerSecond vehicleSpeed, Radian roadGradient)
-		{
-			DriverBehavior = vehicleSpeed.IsEqual(0) ? DrivingBehavior.Halted : DrivingBehavior.Driving;
-			return NextComponent.Initialize(vehicleSpeed, roadGradient);
-		}
-
-		public IResponse Initialize(MeterPerSecond vehicleSpeed, Radian roadGradient,
-			MeterPerSquareSecond startAcceleration)
-		{
-			DriverBehavior = vehicleSpeed.IsEqual(0) ? DrivingBehavior.Halted : DrivingBehavior.Driving;
-			var retVal = NextComponent.Initialize(vehicleSpeed, roadGradient, startAcceleration);
-
-			return retVal;
-		}
-
-		public IResponse Request(Second absTime, Meter ds, MeterPerSecond targetVelocity, Radian gradient)
-		{
-			IterationStatistics.Increment(this, "Requests");
-
-			Log.Debug("==== DRIVER Request (distance) ====");
-			Log.Debug(
-				"Request: absTime: {0},  ds: {1}, targetVelocity: {2}, gradient: {3} | distance: {4}, velocity: {5}, vehicle stopped: {6}",
-				absTime, ds, targetVelocity, gradient, DataBus.Distance, DataBus.VehicleSpeed, DataBus.VehicleStopped);
-
-			var retVal = DriverStrategy.Request(absTime, ds, targetVelocity, gradient);
-
-			CurrentState.Response = retVal;
-			retVal.SimulationInterval = CurrentState.dt;
-			retVal.Acceleration = CurrentState.Acceleration;
-
-			return retVal;
-		}
-
-		public IResponse Request(Second absTime, Second dt, MeterPerSecond targetVelocity, Radian gradient)
-		{
-			IterationStatistics.Increment(this, "Requests");
-
-			Log.Debug("==== DRIVER Request (time) ====");
-			Log.Debug(
-				"Request: absTime: {0},  dt: {1}, targetVelocity: {2}, gradient: {3} | distance: {4}, velocity: {5} gear: {6}: vehicle stopped: {7}",
-				absTime, dt, targetVelocity, gradient, DataBus.Distance, DataBus.VehicleSpeed, DataBus.Gear,
-				DataBus.VehicleStopped);
-
-			var retVal = DriverStrategy.Request(absTime, dt, targetVelocity, gradient);
-
-			CurrentState.Response = retVal;
-			retVal.SimulationInterval = CurrentState.dt;
-			retVal.Acceleration = CurrentState.Acceleration;
-
-			return retVal;
-		}
-
-		public new IDataBus DataBus
-		{
-			get { return base.DataBus; }
-		}
-
-		/// <summary>
-		/// see documentation of IDriverActions
-		/// </summary>
-		/// <param name="absTime"></param>
-		/// <param name="ds"></param>
-		/// <param name="targetVelocity"></param>
-		/// <param name="gradient"></param>
-		/// <param name="previousResponse"></param>
-		/// <returns></returns>
-		public IResponse DrivingActionAccelerate(Second absTime, Meter ds, MeterPerSecond targetVelocity,
-			Radian gradient,
-			IResponse previousResponse = null)
-		{
-			CurrentAction = "ACCELERATE";
-			IterationStatistics.Increment(this, "Accelerate");
-			Log.Debug("DrivingAction Accelerate");
-			var operatingPoint = ComputeAcceleration(ds, targetVelocity);
-
-			IResponse retVal = null;
-			DriverAcceleration = operatingPoint.Acceleration;
-			var response = previousResponse ??
-							NextComponent.Request(absTime, operatingPoint.SimulationInterval, operatingPoint.Acceleration,
-								gradient);
-			response.Acceleration = operatingPoint.Acceleration;
-
-			response.Switch().
-				Case<ResponseSuccess>(r => { retVal = r; // => return
-				}).
-				Case<ResponseOverload>(). // do nothing, searchOperatingPoint is called later on
-				Case<ResponseEngineSpeedTooHigh>(). // do nothing, searchOperatingPoint is called later on
-				Case<ResponseUnderload>(r => {
-					// Delta is negative we are already below the Drag-load curve. activate brakes
-					retVal = r; // => return, strategy should brake
-				}).
-				Case<ResponseFailTimeInterval>(r => {
-					// occurs only with AT gearboxes - extend time interval after gearshift!
-					retVal = new ResponseDrivingCycleDistanceExceeded {
-						Source = this,
-						MaxDistance = r.Acceleration / 2 * r.DeltaT * r.DeltaT + DataBus.VehicleSpeed * r.DeltaT
-					};
-				}).
-				Case<ResponseGearShift>(r => { retVal = r; }).
-				Default(r => { throw new UnexpectedResponseException("DrivingAction Accelerate.", r); });
-
-			if (retVal == null) {
-				// unhandled response (overload, delta > 0) - we need to search for a valid operating point..	
-
-				OperatingPoint nextOperatingPoint;
-				try {
-					nextOperatingPoint = SearchOperatingPoint(absTime, ds, gradient, operatingPoint.Acceleration,
-						response);
-				} catch (VectoEngineSpeedTooLowException) {
-					// in case of an exception during search the engine-speed got too low - gear disengaged, try roll action.
-					nextOperatingPoint = SearchOperatingPoint(absTime, ds, gradient, operatingPoint.Acceleration,
-						response);
-				}
-
-				var limitedOperatingPoint = nextOperatingPoint;
-				if (!(retVal is ResponseEngineSpeedTooHigh || DataBus.ClutchClosed(absTime))) {
-					limitedOperatingPoint = LimitAccelerationByDriverModel(nextOperatingPoint,
-						LimitationMode.LimitDecelerationDriver);
-					Log.Debug("Found operating point for Drive/Accelerate. dt: {0}, acceleration: {1}",
-						limitedOperatingPoint.SimulationInterval, limitedOperatingPoint.Acceleration);
-				}
-				DriverAcceleration = limitedOperatingPoint.Acceleration;
-				retVal = NextComponent.Request(absTime, limitedOperatingPoint.SimulationInterval,
-					limitedOperatingPoint.Acceleration,
-					gradient);
-				if (retVal != null) {
-					retVal.Acceleration = limitedOperatingPoint.Acceleration;
-				}
-				retVal.Switch().
-					Case<ResponseUnderload>(() => operatingPoint = limitedOperatingPoint)
-					. // acceleration is limited by driver model, operating point moves below drag curve
-					Case<ResponseOverload>(() => {
-						// deceleration is limited by driver model, operating point moves above full load (e.g., steep uphill)
-						// the vehicle/driver can't achieve an acceleration higher than deceleration curve, try again with higher deceleration
-						if (DataBus.GearboxType.AutomaticTransmission()) {
-							Log.Info("AT Gearbox - Operating point resulted in an overload, searching again...");
-							// search again for operating point, transmission may have shifted inbetween
-							nextOperatingPoint = SearchOperatingPoint(absTime, ds, gradient, operatingPoint.Acceleration,
-								response);
-							DriverAcceleration = nextOperatingPoint.Acceleration;
-							retVal = NextComponent.Request(absTime, nextOperatingPoint.SimulationInterval,
-								nextOperatingPoint.Acceleration, gradient);
-						} else {
-							if (absTime > 0 && DataBus.VehicleStopped) {
-								Log.Info(
-									"Operating point with limited acceleration resulted in an overload! Vehicle stopped! trying HALT action {0}",
-									nextOperatingPoint.Acceleration);
-								DataBus.BrakePower = 1.SI<Watt>();
-								retVal = DrivingActionHalt(absTime, nextOperatingPoint.SimulationInterval, 0.SI<MeterPerSecond>(), gradient);
-								ds = 0.SI<Meter>();
-								//retVal.Acceleration = 0.SI<MeterPerSquareSecond>();
-							} else {
-								if (response is ResponseEngineSpeedTooHigh) {
-									Log.Info(
-										"Operating point with limited acceleration due to high engine speed resulted in an overload, searching again...");
-									nextOperatingPoint = SearchOperatingPoint(absTime, ds, gradient, operatingPoint.Acceleration,
-										retVal);
-									DriverAcceleration = nextOperatingPoint.Acceleration;
-									retVal = NextComponent.Request(absTime, nextOperatingPoint.SimulationInterval,
-										nextOperatingPoint.Acceleration, gradient);
-								} else {
-									Log.Info(
-										"Operating point with limited acceleration resulted in an overload! trying again with original acceleration {0}",
-										nextOperatingPoint.Acceleration);
-									DriverAcceleration = nextOperatingPoint.Acceleration;
-									retVal = NextComponent.Request(absTime, nextOperatingPoint.SimulationInterval,
-										nextOperatingPoint.Acceleration,
-										gradient);
-								}
-							}
-						}
-						retVal.Switch().
-							Case<ResponseSuccess>(() => operatingPoint = nextOperatingPoint).
-							Case<ResponseGearShift>(() => operatingPoint = nextOperatingPoint).
-							Default(
-								r => { throw new UnexpectedResponseException("DrivingAction Accelerate after Overload", r); });
-					}).
-					Case<ResponseGearShift>(() => operatingPoint = limitedOperatingPoint).
-					Case<ResponseFailTimeInterval>(r => {
-						// occurs only with AT gearboxes - extend time interval after gearshift!
-						retVal = new ResponseDrivingCycleDistanceExceeded {
-							Source = this,
-							MaxDistance = r.Acceleration / 2 * r.DeltaT * r.DeltaT + DataBus.VehicleSpeed * r.DeltaT
-						};
-					}).
-					Case<ResponseSuccess>(() => operatingPoint = limitedOperatingPoint).
-					Default(
-						r => {
-							throw new UnexpectedResponseException(
-								"DrivingAction Accelerate after SearchOperatingPoint.", r);
-						});
-			}
-			CurrentState.Acceleration = operatingPoint.Acceleration;
-			CurrentState.dt = operatingPoint.SimulationInterval;
-			CurrentState.Response = retVal;
-
-			retVal.Acceleration = operatingPoint.Acceleration;
-			retVal.SimulationInterval = operatingPoint.SimulationInterval;
-			retVal.SimulationDistance = ds;
-			retVal.OperatingPoint = operatingPoint;
-
-			return retVal;
-		}
-
-		/// <summary>
-		/// see documentation of IDriverActions
-		/// </summary>
-		/// <param name="absTime"></param>
-		/// <param name="ds"></param>
-		/// <param name="maxVelocity"></param>
-		/// <param name="gradient"></param>
-		/// <returns></returns>
-		public IResponse DrivingActionCoast(Second absTime, Meter ds, MeterPerSecond maxVelocity, Radian gradient)
-		{
-			CurrentAction = "COAST";
-			IterationStatistics.Increment(this, "Coast");
-			Log.Debug("DrivingAction Coast");
-
-			return CoastOrRollAction(absTime, ds, maxVelocity, gradient, false);
-		}
-
-		/// <summary>
-		/// see documentation of IDriverActions
-		/// </summary>
-		/// <param name="absTime"></param>
-		/// <param name="ds"></param>
-		/// <param name="maxVelocity"></param>
-		/// <param name="gradient"></param>
-		/// <returns></returns>
-		public IResponse DrivingActionRoll(Second absTime, Meter ds, MeterPerSecond maxVelocity, Radian gradient)
-		{
-			CurrentAction = "ROLL";
-			IterationStatistics.Increment(this, "Roll");
-
-			Log.Debug("DrivingAction Roll");
-
-			var retVal = CoastOrRollAction(absTime, ds, maxVelocity, gradient, true);
-			retVal.Switch().
-				Case<ResponseGearShift>(
-					() => {
-						throw new UnexpectedResponseException("DrivingAction Roll: Gearshift during Roll action.",
-							retVal);
-					});
-
-			return retVal;
-		}
-
-		/// <summary>
-		/// 
-		/// </summary>
-		/// <param name="absTime"></param>
-		/// <param name="ds"></param>
-		/// <param name="maxVelocity"></param>
-		/// <param name="gradient"></param>
-		/// <param name="rollAction"></param>
-		/// <returns>
-		/// * ResponseSuccess
-		/// * ResponseDrivingCycleDistanceExceeded: vehicle is at low speed, coasting would lead to stop before ds is reached.
-		/// * ResponseSpeedLimitExceeded: vehicle accelerates during coasting which would lead to exceeding the given maxVelocity (e.g., driving downhill, engine's drag load is not sufficient)
-		/// * ResponseUnderload: engine's operating point is below drag curve (vehicle accelerates more than driver model allows; engine's drag load is not sufficient for limited acceleration
-		/// * ResponseGearShift: gearbox needs to shift gears, vehicle can not accelerate (traction interruption)
-		/// * ResponseFailTimeInterval: 
-		/// </returns>
-		protected IResponse CoastOrRollAction(Second absTime, Meter ds, MeterPerSecond maxVelocity, Radian gradient,
-			bool rollAction)
-		{
-			var requestedOperatingPoint = ComputeAcceleration(ds, DataBus.VehicleSpeed);
-			DriverAcceleration = requestedOperatingPoint.Acceleration;
-			var initialResponse = NextComponent.Request(absTime, requestedOperatingPoint.SimulationInterval,
-				requestedOperatingPoint.Acceleration, gradient, dryRun: true);
-
-			OperatingPoint searchedOperatingPoint;
-			try {
-				searchedOperatingPoint = SearchOperatingPoint(absTime, requestedOperatingPoint.SimulationDistance,
-					gradient,
-					requestedOperatingPoint.Acceleration, initialResponse, coastingOrRoll: true);
-			} catch (VectoEngineSpeedTooLowException) {
-				// in case of an exception during search the engine-speed got too low - gear disengaged --> try again with disengaged gear.
-				searchedOperatingPoint = SearchOperatingPoint(absTime, requestedOperatingPoint.SimulationDistance,
-					gradient,
-					requestedOperatingPoint.Acceleration, initialResponse, coastingOrRoll: true);
-			}
-
-			if (!ds.IsEqual(searchedOperatingPoint.SimulationDistance)) {
-				// vehicle is at low speed, coasting would lead to stop before ds is reached: reduce simulated distance to stop distance.
-				Log.Debug(
-					"SearchOperatingPoint reduced the max. distance: {0} -> {1}. Issue new request from driving cycle!",
-					searchedOperatingPoint.SimulationDistance, ds);
-				CurrentState.Response = new ResponseDrivingCycleDistanceExceeded {
-					Source = this,
-					MaxDistance = searchedOperatingPoint.SimulationDistance,
-					Acceleration = searchedOperatingPoint.Acceleration,
-					SimulationInterval = searchedOperatingPoint.SimulationInterval,
-					OperatingPoint = searchedOperatingPoint
-				};
-				return CurrentState.Response;
-			}
-
-			Log.Debug("Found operating point for {2}. dt: {0}, acceleration: {1}",
-				searchedOperatingPoint.SimulationInterval,
-				searchedOperatingPoint.Acceleration, rollAction ? "ROLL" : "COAST");
-
-			var limitedOperatingPoint = LimitAccelerationByDriverModel(searchedOperatingPoint,
-				rollAction ? LimitationMode.NoLimitation : LimitationMode.LimitDecelerationDriver);
-
-			// compute speed at the end of the simulation interval. if it exceeds the limit -> return
-			var v2 = DataBus.VehicleSpeed +
-					limitedOperatingPoint.Acceleration * limitedOperatingPoint.SimulationInterval;
-			if (v2 > maxVelocity && limitedOperatingPoint.Acceleration.IsGreaterOrEqual(0)) {
-				Log.Debug("vehicle's velocity would exceed given max speed. v2: {0}, max speed: {1}", v2, maxVelocity);
-				return new ResponseSpeedLimitExceeded() { Source = this };
-			}
-
-			DriverAcceleration = limitedOperatingPoint.Acceleration;
-			var response = NextComponent.Request(absTime, limitedOperatingPoint.SimulationInterval,
-				limitedOperatingPoint.Acceleration, gradient);
-
-			response.SimulationInterval = limitedOperatingPoint.SimulationInterval;
-			response.SimulationDistance = ds;
-			response.Acceleration = limitedOperatingPoint.Acceleration;
-			response.OperatingPoint = limitedOperatingPoint;
-
-			response.Switch().
-				Case<ResponseSuccess>().
-				Case<ResponseUnderload>(). // driver limits acceleration, operating point may be below engine's 
-				//drag load resp. below 0
-				Case<ResponseOverload>(). // driver limits acceleration, operating point may be above 0 (GBX), use brakes
-				Case<ResponseEngineSpeedTooHigh>(). // reduce acceleration/vehicle speed
-				Case<ResponseGearShift>().
-				Case<ResponseFailTimeInterval>(r => {
-					response = new ResponseDrivingCycleDistanceExceeded {
-						Source = this,
-						MaxDistance = r.Acceleration / 2 * r.DeltaT * r.DeltaT + DataBus.VehicleSpeed * r.DeltaT
-					};
-				}).
-				Default(
-					() => {
-						throw new UnexpectedResponseException(
-							"CoastOrRoll Action: unhandled response from powertrain.", response);
-					});
-
-			CurrentState.Response = response;
-			CurrentState.Acceleration = response.Acceleration;
-			CurrentState.dt = response.SimulationInterval;
-			return response;
-		}
-
-		public IResponse DrivingActionBrake(Second absTime, Meter ds, MeterPerSecond nextTargetSpeed, Radian gradient,
-			IResponse previousResponse = null, Meter targetDistance = null)
-		{
-			CurrentAction = "BRAKE";
-			IterationStatistics.Increment(this, "Brake");
-			Log.Debug("DrivingAction Brake");
-
-			IResponse retVal = null;
-
-			var operatingPoint = ComputeAcceleration(ds, nextTargetSpeed);
-
-			//if (operatingPoint.Acceleration.IsSmaller(0)) {
-			// if we should brake with the max. deceleration and the deceleration changes within the current interval, take the larger deceleration...
-			if (
-				operatingPoint.Acceleration.IsEqual(
-					DriverData.AccelerationCurve.Lookup(DataBus.VehicleSpeed).Deceleration)) {
-				var v2 = DataBus.VehicleSpeed + operatingPoint.Acceleration * operatingPoint.SimulationInterval;
-				var nextAcceleration = DriverData.AccelerationCurve.Lookup(v2).Deceleration;
-				var tmp = ComputeTimeInterval(VectoMath.Min(operatingPoint.Acceleration, nextAcceleration),
-					operatingPoint.SimulationDistance);
-				if (!operatingPoint.Acceleration.IsEqual(nextAcceleration) &&
-					operatingPoint.SimulationDistance.IsEqual(tmp.SimulationDistance)) {
-					// only adjust operating point if the acceleration is different but the simulation distance is not modified
-					// i.e., braking to the next sample point (but a little bit slower)
-					Log.Debug("adjusting acceleration from {0} to {1}", operatingPoint.Acceleration, tmp.Acceleration);
-					operatingPoint = tmp;
-					// ComputeTimeInterval((operatingPoint.Acceleration + tmp.Acceleration) / 2, operatingPoint.SimulationDistance);
-				}
-			}
-			if (targetDistance != null && targetDistance > DataBus.Distance) {
-				var tmp = ComputeAcceleration(targetDistance - DataBus.Distance, nextTargetSpeed, false);
-				if (tmp.Acceleration.IsGreater(operatingPoint.Acceleration)) {
-					operatingPoint = ComputeTimeInterval(tmp.Acceleration, ds);
-					if (!ds.IsEqual(operatingPoint.SimulationDistance)) {
-						Log.Error(
-							"Unexpected Condition: Distance has been adjusted from {0} to {1}, currentVelocity: {2} acceleration: {3}, targetVelocity: {4}",
-							operatingPoint.SimulationDistance, ds, DataBus.VehicleSpeed, operatingPoint.Acceleration,
-							nextTargetSpeed);
-						throw new VectoSimulationException("Simulation distance unexpectedly adjusted! {0} -> {1}", ds,
-							operatingPoint.SimulationDistance);
-					}
-				}
-			}
-
-			DriverAcceleration = operatingPoint.Acceleration;
-			var response = previousResponse ??
-							NextComponent.Request(absTime, operatingPoint.SimulationInterval, operatingPoint.Acceleration,
-								gradient);
-
-			var point = operatingPoint;
-			response.Switch().
-				Case<ResponseSuccess>(r => retVal = r).
-				Case<ResponseOverload>(r => retVal = r)
-				. // i.e., driving uphill, clutch open, deceleration higher than desired deceleration
-				Case<ResponseUnderload>(). // will be handled in SearchBrakingPower
-				Case<ResponseEngineSpeedTooHigh>(r => {
-					Log.Debug("Engine speeed was too high, search for appropriate acceleration first.");
-					operatingPoint = SearchOperatingPoint(absTime, ds, gradient, point.Acceleration,
-						response);
-				}). // will be handled in SearchBrakingPower
-				Case<ResponseGearShift>(). // will be handled in SearchBrakingPower
-				Case<ResponseFailTimeInterval>(r =>
-					retVal = new ResponseDrivingCycleDistanceExceeded() {
-						Source = this,
-						MaxDistance = DataBus.VehicleSpeed * r.DeltaT + point.Acceleration / 2 * r.DeltaT * r.DeltaT
-					}).
-				Default(r => { throw new UnexpectedResponseException("DrivingAction Brake: first request.", r); });
-
-			if (retVal != null) {
-				CurrentState.Acceleration = operatingPoint.Acceleration;
-				CurrentState.dt = operatingPoint.SimulationInterval;
-				CurrentState.Response = retVal;
-				retVal.Acceleration = operatingPoint.Acceleration;
-				retVal.SimulationInterval = operatingPoint.SimulationInterval;
-				retVal.SimulationDistance = ds;
-				retVal.OperatingPoint = operatingPoint;
-				return retVal;
-			}
-
-			operatingPoint = SearchBrakingPower(absTime, operatingPoint.SimulationDistance, gradient,
-				operatingPoint.Acceleration, response);
-
-			if (!ds.IsEqual(operatingPoint.SimulationDistance, 1E-15.SI<Meter>())) {
-				Log.Info(
-					"SearchOperatingPoint Braking reduced the max. distance: {0} -> {1}. Issue new request from driving cycle!",
-					operatingPoint.SimulationDistance, ds);
-				return new ResponseDrivingCycleDistanceExceeded {
-					Source = this,
-					MaxDistance = operatingPoint.SimulationDistance
-				};
-			}
-
-			Log.Debug("Found operating point for braking. dt: {0}, acceleration: {1} brakingPower: {2}",
-				operatingPoint.SimulationInterval,
-				operatingPoint.Acceleration, DataBus.BrakePower);
-			if (DataBus.BrakePower < 0) {
-				var overload = new ResponseOverload {
-					Source = this,
-					BrakePower = DataBus.BrakePower,
-					Acceleration = operatingPoint.Acceleration
-				};
-				DataBus.BrakePower = 0.SI<Watt>();
-				return overload;
-			}
-
-			DriverAcceleration = operatingPoint.Acceleration;
-			retVal = NextComponent.Request(absTime, operatingPoint.SimulationInterval, operatingPoint.Acceleration,
-				gradient);
-
-			retVal.Switch().
-				Case<ResponseSuccess>().
-				Case<ResponseGearShift>().
-				Case<ResponseFailTimeInterval>(r =>
-					retVal = new ResponseDrivingCycleDistanceExceeded() {
-						Source = this,
-						MaxDistance =
-							DataBus.VehicleSpeed * r.DeltaT + operatingPoint.Acceleration / 2 * r.DeltaT * r.DeltaT
-					}).
-				Case<ResponseUnderload>(r => {
-					if (DataBus.GearboxType.AutomaticTransmission()) {
-						operatingPoint = SearchBrakingPower(absTime, operatingPoint.SimulationDistance, gradient,
-							operatingPoint.Acceleration, response);
-						DriverAcceleration = operatingPoint.Acceleration;
-						retVal = NextComponent.Request(absTime, operatingPoint.SimulationInterval,
-							operatingPoint.Acceleration, gradient);
-					}
-				}).
-				Case<ResponseOverload>(r => {
-					if (DataBus.GearboxType.AutomaticTransmission()) {
-						// overload may happen because of gearshift between search and actual request, search again
-						var i = 5;
-						while (i-- > 0 && !(retVal is ResponseSuccess)) {
-							DataBus.BrakePower = 0.SI<Watt>();
-							operatingPoint = SearchBrakingPower(absTime, operatingPoint.SimulationDistance, gradient,
-								operatingPoint.Acceleration, response);
-							DriverAcceleration = operatingPoint.Acceleration;
-							if (DataBus.BrakePower.IsSmaller(0)) {
-								DataBus.BrakePower = 0.SI<Watt>();
-
-								operatingPoint = SearchOperatingPoint(absTime, ds, gradient, 0.SI<MeterPerSquareSecond>(), r);
-							}
-							retVal = NextComponent.Request(absTime, operatingPoint.SimulationInterval,
-								operatingPoint.Acceleration, gradient);
-						}
-					} else {
-						throw new UnexpectedResponseException(
-							"DrivingAction Brake: request failed after braking power was found.", r);
-					}
-				}).
-				Default(
-					r => {
-						throw new UnexpectedResponseException(
-							"DrivingAction Brake: request failed after braking power was found.", r);
-					});
-			CurrentState.Acceleration = operatingPoint.Acceleration;
-			CurrentState.dt = operatingPoint.SimulationInterval;
-			CurrentState.Response = retVal;
-			retVal.Acceleration = operatingPoint.Acceleration;
-			retVal.SimulationInterval = operatingPoint.SimulationInterval;
-			retVal.SimulationDistance = ds;
-			retVal.OperatingPoint = operatingPoint;
-
-			return retVal;
-		}
-
-		// ================================================
-
-		/// <summary>
-		/// 
-		/// </summary>
-		/// <param name="operatingPoint"></param>
-		/// <param name="limits"></param>
-		/// <returns></returns>
-		private OperatingPoint LimitAccelerationByDriverModel(OperatingPoint operatingPoint,
-			LimitationMode limits)
-		{
-			var limitApplied = false;
-			var originalAcceleration = operatingPoint.Acceleration;
-			//if (((limits & LimitationMode.LimitDecelerationLookahead) != 0) &&
-			//	operatingPoint.Acceleration < DriverData.LookAheadCoasting.Deceleration) {
-			//	operatingPoint.Acceleration = DriverData.LookAheadCoasting.Deceleration;
-			//	limitApplied = true;
-			//}
-			var accelerationLimits = DriverData.AccelerationCurve.Lookup(DataBus.VehicleSpeed);
-			if (operatingPoint.Acceleration > accelerationLimits.Acceleration) {
-				operatingPoint.Acceleration = accelerationLimits.Acceleration;
-				limitApplied = true;
-			}
-			if (((limits & LimitationMode.LimitDecelerationDriver) != 0) &&
-				operatingPoint.Acceleration < accelerationLimits.Deceleration) {
-				operatingPoint.Acceleration = accelerationLimits.Deceleration;
-				limitApplied = true;
-			}
-			if (limitApplied) {
-				operatingPoint.SimulationInterval =
-					ComputeTimeInterval(operatingPoint.Acceleration, operatingPoint.SimulationDistance)
-						.SimulationInterval;
-				Log.Debug("Limiting acceleration from {0} to {1}, dt: {2}", originalAcceleration,
-					operatingPoint.Acceleration, operatingPoint.SimulationInterval);
-			}
-			return operatingPoint;
-		}
-
-		/// <summary>
-		/// Performs a search for the required braking power such that the vehicle accelerates with the given acceleration.
-		/// Returns a new operating point (a, ds, dt) where ds may be shorter due to vehicle stopping
-		/// </summary>
-		/// <returns>operating point (a, ds, dt) such that the vehicle accelerates with the given acceleration.</returns>
-		private OperatingPoint SearchBrakingPower(Second absTime, Meter ds, Radian gradient,
-			MeterPerSquareSecond acceleration, IResponse initialResponse)
-		{
-			IterationStatistics.Increment(this, "SearchBrakingPower", 0);
-
-			var operatingPoint = new OperatingPoint { SimulationDistance = ds, Acceleration = acceleration };
-			operatingPoint = ComputeTimeInterval(operatingPoint.Acceleration, ds);
-			Watt deltaPower = null;
-			initialResponse.Switch().
-				Case<ResponseGearShift>(r => {
-					IterationStatistics.Increment(this, "SearchBrakingPower");
-					DriverAcceleration = operatingPoint.Acceleration;
-					var nextResp = NextComponent.Request(absTime, operatingPoint.SimulationInterval,
-						operatingPoint.Acceleration,
-						gradient, true);
-					deltaPower = nextResp.GearboxPowerRequest;
-				}).
-				Case<ResponseEngineSpeedTooHigh>(r => {
-					IterationStatistics.Increment(this, "SearchBrakingPower");
-					DriverAcceleration = operatingPoint.Acceleration;
-					var nextResp = NextComponent.Request(absTime, operatingPoint.SimulationInterval,
-						operatingPoint.Acceleration,
-						gradient, true);
-					deltaPower = nextResp.GearboxPowerRequest;
-				}).
-				Case<ResponseUnderload>(r =>
-					deltaPower = DataBus.ClutchClosed(absTime) ? r.Delta : r.GearboxPowerRequest).
-				Default(
-					r => { throw new UnexpectedResponseException("cannot use response for searching braking power!", r); });
-
-			try {
-				DataBus.BrakePower = SearchAlgorithm.Search(DataBus.BrakePower, deltaPower,
-					deltaPower.Abs() * (DataBus.GearboxType.AutomaticTransmission() ? 0.5 : 1),
-					getYValue: result => {
-						var response = (ResponseDryRun)result;
-						return DataBus.ClutchClosed(absTime) ? response.DeltaDragLoad : response.GearboxPowerRequest;
-					},
-					evaluateFunction: x => {
-						DataBus.BrakePower = x;
-						operatingPoint = ComputeTimeInterval(operatingPoint.Acceleration, ds);
-
-						IterationStatistics.Increment(this, "SearchBrakingPower");
-						DriverAcceleration = operatingPoint.Acceleration;
-						return NextComponent.Request(absTime, operatingPoint.SimulationInterval,
-							operatingPoint.Acceleration, gradient,
-							true);
-					},
-					criterion: result => {
-						var response = (ResponseDryRun)result;
-						var delta = DataBus.ClutchClosed(absTime)
-							? response.DeltaDragLoad
-							: response.GearboxPowerRequest;
-						return delta.Value();
-					});
-
-				return operatingPoint;
-			} catch (Exception) {
-				Log.Error("Failed to find operating point for braking power! absTime: {0}", absTime);
-				throw;
-			}
-		}
-
-		protected OperatingPoint SearchOperatingPoint(Second absTime, Meter ds, Radian gradient,
-			MeterPerSquareSecond acceleration, IResponse initialResponse, bool coastingOrRoll = false)
-		{
-			IterationStatistics.Increment(this, "SearchOperatingPoint", 0);
-
-			var retVal = new OperatingPoint { Acceleration = acceleration, SimulationDistance = ds };
-
-			var actionRoll = !DataBus.ClutchClosed(absTime);
-			var searchEngineSpeed = false;
-
-			Watt origDelta = null;
-			if (actionRoll) {
-				initialResponse.Switch().
-					Case<ResponseDryRun>(r => origDelta = r.GearboxPowerRequest).
-					Case<ResponseFailTimeInterval>(r => origDelta = r.GearboxPowerRequest).
-					Default(r => { throw new UnexpectedResponseException("SearchOperatingPoint: Unknown response type.", r); });
-			} else {
-				initialResponse.Switch().
-					Case<ResponseOverload>(r => origDelta = r.Delta).
-					Case<ResponseEngineSpeedTooHigh>(r => {
-						searchEngineSpeed = true;
-						origDelta = r.DeltaEngineSpeed * 1.SI<NewtonMeter>();
-					}). // search operating point in drive action after overload
-					Case<ResponseDryRun>(r => origDelta = coastingOrRoll ? r.DeltaDragLoad : r.DeltaFullLoad).
-					Default(r => { throw new UnexpectedResponseException("SearchOperatingPoint: Unknown response type.", r); });
-			}
-			var delta = origDelta;
-			try {
-				retVal.Acceleration = SearchAlgorithm.Search(acceleration, delta,
-					Constants.SimulationSettings.OperatingPointInitialSearchIntervalAccelerating,
-					getYValue: response => {
-						var r = (ResponseDryRun)response;
-						if (searchEngineSpeed) {
-							return r.DeltaEngineSpeed * 1.SI<NewtonMeter>();
-						}
-						return actionRoll ? r.GearboxPowerRequest : (coastingOrRoll ? r.DeltaDragLoad : r.DeltaFullLoad);
-					},
-					evaluateFunction:
-						acc => {
-							// calculate new time interval only when vehiclespeed and acceleration are != 0
-							// else: use same timeinterval as before.
-							if (!(acc.IsEqual(0) && DataBus.VehicleSpeed.IsEqual(0))) {
-								var tmp = ComputeTimeInterval(acc, ds);
-								if (tmp.SimulationInterval.IsEqual(0.SI<Second>(), 1e-9.SI<Second>())) {
-									throw new VectoSearchAbortedException(
-										"next TimeInterval is 0. a: {0}, v: {1}, dt: {2}", acc,
-										DataBus.VehicleSpeed, tmp.SimulationInterval);
-								}
-								retVal.Acceleration = tmp.Acceleration;
-								retVal.SimulationInterval = tmp.SimulationInterval;
-								retVal.SimulationDistance = tmp.SimulationDistance;
-							}
-							IterationStatistics.Increment(this, "SearchOperatingPoint");
-							DriverAcceleration = acc;
-							var response = NextComponent.Request(absTime, retVal.SimulationInterval, acc, gradient, true);
-							response.OperatingPoint = retVal;
-							return response;
-						},
-					criterion: response => {
-						var r = (ResponseDryRun)response;
-						if (searchEngineSpeed) {
-							return r.DeltaEngineSpeed.Value();
-						}
-						delta = actionRoll
-							? r.GearboxPowerRequest
-							: (coastingOrRoll ? r.DeltaDragLoad : r.DeltaFullLoad);
-						return delta.Value();
-					},
-					abortCriterion:
-						(response, cnt) => {
-							var r = (ResponseDryRun)response;
-							if (r == null) {
-								return false;
-							}
-
-							return !actionRoll && !ds.IsEqual(r.OperatingPoint.SimulationDistance);
-						});
-			} catch (VectoSearchAbortedException) {
-				// search aborted, try to go ahead with the last acceleration
-			} catch (Exception) {
-				Log.Error("Failed to find operating point! absTime: {0}", absTime);
-				throw;
-			}
-
-			if (!retVal.Acceleration.IsBetween(DriverData.AccelerationCurve.MaxDeceleration(),
-				DriverData.AccelerationCurve.MaxAcceleration())) {
-				Log.Info("Operating Point outside driver acceleration limits: a: {0}", retVal.Acceleration);
-			}
-			return ComputeTimeInterval(retVal.Acceleration, retVal.SimulationDistance);
-		}
-
-		/// <summary>
-		/// compute the acceleration and time-interval such that the vehicle's velocity approaches the given target velocity
-		/// - first compute the acceleration to reach the targetVelocity within the given distance
-		/// - limit the acceleration/deceleration by the driver's acceleration curve
-		/// - compute the time interval required to drive the given distance with the computed acceleration
-		/// computed acceleration and time interval are stored in CurrentState!
-		/// </summary>
-		/// <param name="ds">distance to reach the next target speed</param>
-		/// <param name="targetVelocity">next vehicle speed to decelerate to</param>
-		/// <param name="limitByDriverModel">if set to false the required acceleration will be computed, regardless of the driver's acceleration curve</param>
-		public OperatingPoint ComputeAcceleration(Meter ds, MeterPerSecond targetVelocity,
-			bool limitByDriverModel = true)
-		{
-			var currentSpeed = DataBus.VehicleSpeed;
-			var retVal = new OperatingPoint() { SimulationDistance = ds };
-
-			// Δx = (v0+v1)/2 * Δt
-			// => Δt = 2*Δx/(v0+v1) 
-			var dt = 2 * ds / (currentSpeed + targetVelocity);
-
-			// a = Δv / Δt
-			var requiredAcceleration = (targetVelocity - currentSpeed) / dt;
-
-			if (!limitByDriverModel) {
-				return ComputeTimeInterval(requiredAcceleration, ds);
-			}
-
-			var maxAcceleration = DriverData.AccelerationCurve.Lookup(currentSpeed);
-
-			if (requiredAcceleration > maxAcceleration.Acceleration) {
-				requiredAcceleration = maxAcceleration.Acceleration;
-			}
-			if (requiredAcceleration < maxAcceleration.Deceleration) {
-				requiredAcceleration = maxAcceleration.Deceleration;
-			}
-
-			retVal.Acceleration = requiredAcceleration;
-			retVal = ComputeTimeInterval(retVal.Acceleration, ds);
-
-			if (ds.IsEqual(retVal.SimulationDistance)) {
-				return retVal;
-			}
-
-			// this case should not happen, acceleration has been computed such that the target speed
-			// can be reached within ds.
-			Log.Error(
-				"Unexpected Condition: Distance has been adjusted from {0} to {1}, currentVelocity: {2} acceleration: {3}, targetVelocity: {4}",
-				retVal.SimulationDistance, ds, currentSpeed, CurrentState.Acceleration, targetVelocity);
-			throw new VectoSimulationException("Simulation distance unexpectedly adjusted! {0} -> {1}", ds,
-				retVal.SimulationDistance);
-		}
-
-		/// <summary>
-		/// computes the distance required to decelerate from the current velocity to the given target velocity considering
-		/// the drivers acceleration/deceleration curve.
-		/// </summary>
-		/// <param name="targetSpeed"></param>
-		/// <returns></returns>
-		public Meter ComputeDecelerationDistance(MeterPerSecond targetSpeed)
-		{
-			return DriverData.AccelerationCurve.ComputeAccelerationDistance(DataBus.VehicleSpeed, targetSpeed);
-		}
-
-		/// <summary>
-		/// Computes the time interval for driving the given distance ds with the vehicle's current speed and the given acceleration.
-		/// If the distance ds can not be reached (i.e., the vehicle would halt before ds is reached) then the distance parameter is adjusted.
-		/// Returns a new operating point (a, ds, dt)
-		/// </summary>
-		/// <param name="acceleration"></param>
-		/// <param name="ds"></param>
-		/// <returns>Operating point (a, ds, dt)</returns>
-		private OperatingPoint ComputeTimeInterval(MeterPerSquareSecond acceleration, Meter ds)
-		{
-			return VectoMath.ComputeTimeInterval(DataBus.VehicleSpeed, acceleration, DataBus.Distance, ds);
-		}
-
-		/// <summary>
-		/// simulate a certain time interval where the vehicle is stopped.
-		/// </summary>
-		/// <param name="absTime"></param>
-		/// <param name="dt"></param>
-		/// <param name="targetVelocity"></param>
-		/// <param name="gradient"></param>
-		/// <returns></returns>
-		public IResponse DrivingActionHalt(Second absTime, Second dt, MeterPerSecond targetVelocity, Radian gradient)
-		{
-			CurrentAction = "HALT";
-			if (!targetVelocity.IsEqual(0) || !DataBus.VehicleStopped) {
-				Log.Error("TargetVelocity ({0}) and VehicleVelocity ({1}) must be zero when vehicle is halting!",
-					targetVelocity,
-					DataBus.VehicleSpeed);
-				throw new VectoSimulationException(
-					"TargetVelocity ({0}) and VehicleVelocity ({1}) must be zero when vehicle is halting!",
-					targetVelocity,
-					DataBus.VehicleSpeed);
-			}
-
-			DriverAcceleration = 0.SI<MeterPerSquareSecond>();
-			var retVal = NextComponent.Request(absTime, dt, 0.SI<MeterPerSquareSecond>(), gradient);
-
-			retVal.Switch().
-				Case<ResponseGearShift>(r => {
-					DriverAcceleration = 0.SI<MeterPerSquareSecond>();
-					retVal = NextComponent.Request(absTime, dt, 0.SI<MeterPerSquareSecond>(), gradient);
-				});
-			CurrentState.dt = dt;
-			CurrentState.Acceleration = 0.SI<MeterPerSquareSecond>();
-			return retVal;
-		}
-
-		protected override void DoWriteModalResults(IModalDataContainer container)
-		{
-			container[ModalResultField.acc] = CurrentState.Acceleration;
-			container.SetDataValue("DriverAction", ActionToNumber(CurrentAction));
-		}
-
-		private int ActionToNumber(string currentAction)
-		{
-			switch (currentAction.ToUpper()) {
-				case "HALT":
-					return 0;
-				case "ROLL":
-					return 2;
-				case "COAST":
-					return 4;
-				case "ACCELERATE":
-					return 6;
-				case "BRAKE":
-					return -5;
-				default:
-					return -10;
-			}
-		}
-
-		protected override void DoCommitSimulationStep()
-		{
-			if (!(CurrentState.Response is ResponseSuccess)) {
-				throw new VectoSimulationException("Previous request did not succeed!");
-			}
-			CurrentState.Response = null;
-		}
-
-		public class DriverState
-		{
-			// ReSharper disable once InconsistentNaming
-			public Second dt;
-			public MeterPerSquareSecond Acceleration;
-			public IResponse Response;
-		}
-
-		[Flags]
-		protected enum LimitationMode
-		{
-			NoLimitation = 0x0,
-			LimitDecelerationDriver = 0x2,
-			//LimitDecelerationLookahead = 0x4
-		}
-
-		public DrivingBehavior DriverBehavior { get; set; }
-
-		public MeterPerSquareSecond DriverAcceleration { get; protected set; }
-	}
+using System;
+using TUGraz.VectoCommon.Exceptions;
+using TUGraz.VectoCommon.Models;
+using TUGraz.VectoCommon.Utils;
+using TUGraz.VectoCore.Configuration;
+using TUGraz.VectoCore.Models.Connector.Ports;
+using TUGraz.VectoCore.Models.Connector.Ports.Impl;
+using TUGraz.VectoCore.Models.Simulation;
+using TUGraz.VectoCore.Models.Simulation.Data;
+using TUGraz.VectoCore.Models.Simulation.DataBus;
+using TUGraz.VectoCore.OutputData;
+using TUGraz.VectoCore.Utils;
+using DriverData = TUGraz.VectoCore.Models.SimulationComponent.Data.DriverData;
+
+namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
+{
+	public class Driver :
+		StatefulProviderComponent<Driver.DriverState, IDrivingCycleOutPort, IDriverDemandInPort, IDriverDemandOutPort>,
+		IDriver, IDrivingCycleOutPort, IDriverDemandInPort, IDriverActions, IDriverInfo
+	{
+		public DriverData DriverData { get; protected set; }
+
+		protected readonly IDriverStrategy DriverStrategy;
+		public string CurrentAction = "";
+
+		public Driver(IVehicleContainer container, DriverData driverData, IDriverStrategy strategy) : base(container)
+		{
+			DriverData = driverData;
+			DriverStrategy = strategy;
+			strategy.Driver = this;
+			DriverAcceleration = 0.SI<MeterPerSquareSecond>();
+		}
+
+		public IResponse Initialize(MeterPerSecond vehicleSpeed, Radian roadGradient)
+		{
+			DriverBehavior = vehicleSpeed.IsEqual(0) ? DrivingBehavior.Halted : DrivingBehavior.Driving;
+			return NextComponent.Initialize(vehicleSpeed, roadGradient);
+		}
+
+		public IResponse Initialize(MeterPerSecond vehicleSpeed, Radian roadGradient,
+			MeterPerSquareSecond startAcceleration)
+		{
+			DriverBehavior = vehicleSpeed.IsEqual(0) ? DrivingBehavior.Halted : DrivingBehavior.Driving;
+			var retVal = NextComponent.Initialize(vehicleSpeed, roadGradient, startAcceleration);
+
+			return retVal;
+		}
+
+		public IResponse Request(Second absTime, Meter ds, MeterPerSecond targetVelocity, Radian gradient)
+		{
+			IterationStatistics.Increment(this, "Requests");
+
+			Log.Debug("==== DRIVER Request (distance) ====");
+			Log.Debug(
+				"Request: absTime: {0},  ds: {1}, targetVelocity: {2}, gradient: {3} | distance: {4}, velocity: {5}, vehicle stopped: {6}",
+				absTime, ds, targetVelocity, gradient, DataBus.Distance, DataBus.VehicleSpeed, DataBus.VehicleStopped);
+
+			var retVal = DriverStrategy.Request(absTime, ds, targetVelocity, gradient);
+
+			CurrentState.Response = retVal;
+			retVal.SimulationInterval = CurrentState.dt;
+			retVal.Acceleration = CurrentState.Acceleration;
+
+			return retVal;
+		}
+
+		public IResponse Request(Second absTime, Second dt, MeterPerSecond targetVelocity, Radian gradient)
+		{
+			IterationStatistics.Increment(this, "Requests");
+
+			Log.Debug("==== DRIVER Request (time) ====");
+			Log.Debug(
+				"Request: absTime: {0},  dt: {1}, targetVelocity: {2}, gradient: {3} | distance: {4}, velocity: {5} gear: {6}: vehicle stopped: {7}",
+				absTime, dt, targetVelocity, gradient, DataBus.Distance, DataBus.VehicleSpeed, DataBus.Gear,
+				DataBus.VehicleStopped);
+
+			var retVal = DriverStrategy.Request(absTime, dt, targetVelocity, gradient);
+
+			CurrentState.Response = retVal;
+			retVal.SimulationInterval = CurrentState.dt;
+			retVal.Acceleration = CurrentState.Acceleration;
+
+			return retVal;
+		}
+
+		public new IDataBus DataBus
+		{
+			get { return base.DataBus; }
+		}
+
+		/// <summary>
+		/// see documentation of IDriverActions
+		/// </summary>
+		/// <param name="absTime"></param>
+		/// <param name="ds"></param>
+		/// <param name="targetVelocity"></param>
+		/// <param name="gradient"></param>
+		/// <param name="previousResponse"></param>
+		/// <returns></returns>
+		public IResponse DrivingActionAccelerate(Second absTime, Meter ds, MeterPerSecond targetVelocity,
+			Radian gradient,
+			IResponse previousResponse = null)
+		{
+			CurrentAction = "ACCELERATE";
+			IterationStatistics.Increment(this, "Accelerate");
+			Log.Debug("DrivingAction Accelerate");
+			var operatingPoint = ComputeAcceleration(ds, targetVelocity);
+
+			IResponse retVal = null;
+			DriverAcceleration = operatingPoint.Acceleration;
+			var response = previousResponse ??
+							NextComponent.Request(absTime, operatingPoint.SimulationInterval, operatingPoint.Acceleration,
+								gradient);
+			response.Acceleration = operatingPoint.Acceleration;
+
+			response.Switch().
+				Case<ResponseSuccess>(r => {
+					retVal = r; // => return
+				}).
+				Case<ResponseOverload>(). // do nothing, searchOperatingPoint is called later on
+				Case<ResponseEngineSpeedTooHigh>(). // do nothing, searchOperatingPoint is called later on
+				Case<ResponseUnderload>(r => {
+					// Delta is negative we are already below the Drag-load curve. activate brakes
+					retVal = r; // => return, strategy should brake
+				}).
+				Case<ResponseFailTimeInterval>(r => {
+					// occurs only with AT gearboxes - extend time interval after gearshift!
+					retVal = new ResponseDrivingCycleDistanceExceeded {
+						Source = this,
+						MaxDistance = r.Acceleration / 2 * r.DeltaT * r.DeltaT + DataBus.VehicleSpeed * r.DeltaT
+					};
+				}).
+				Case<ResponseGearShift>(r => {
+					retVal = r;
+				}).
+				Default(r => {
+					throw new UnexpectedResponseException("DrivingAction Accelerate.", r);
+				});
+
+			if (retVal == null) {
+				// unhandled response (overload, delta > 0) - we need to search for a valid operating point..	
+
+				OperatingPoint nextOperatingPoint;
+				try {
+					nextOperatingPoint = SearchOperatingPoint(absTime, ds, gradient, operatingPoint.Acceleration,
+						response);
+				} catch (VectoEngineSpeedTooLowException) {
+					// in case of an exception during search the engine-speed got too low - gear disengaged, try roll action.
+					nextOperatingPoint = SearchOperatingPoint(absTime, ds, gradient, operatingPoint.Acceleration,
+						response);
+				}
+
+				var limitedOperatingPoint = nextOperatingPoint;
+				if (!(retVal is ResponseEngineSpeedTooHigh || DataBus.ClutchClosed(absTime))) {
+					limitedOperatingPoint = LimitAccelerationByDriverModel(nextOperatingPoint,
+						LimitationMode.LimitDecelerationDriver);
+					Log.Debug("Found operating point for Drive/Accelerate. dt: {0}, acceleration: {1}",
+						limitedOperatingPoint.SimulationInterval, limitedOperatingPoint.Acceleration);
+				}
+				DriverAcceleration = limitedOperatingPoint.Acceleration;
+				retVal = NextComponent.Request(absTime, limitedOperatingPoint.SimulationInterval,
+					limitedOperatingPoint.Acceleration,
+					gradient);
+				if (retVal != null) {
+					retVal.Acceleration = limitedOperatingPoint.Acceleration;
+				}
+				retVal.Switch().
+					Case<ResponseUnderload>(() => operatingPoint = limitedOperatingPoint)
+					. // acceleration is limited by driver model, operating point moves below drag curve
+					Case<ResponseOverload>(() => {
+						// deceleration is limited by driver model, operating point moves above full load (e.g., steep uphill)
+						// the vehicle/driver can't achieve an acceleration higher than deceleration curve, try again with higher deceleration
+						if (DataBus.GearboxType.AutomaticTransmission()) {
+							Log.Info("AT Gearbox - Operating point resulted in an overload, searching again...");
+							// search again for operating point, transmission may have shifted inbetween
+							nextOperatingPoint = SearchOperatingPoint(absTime, ds, gradient, operatingPoint.Acceleration,
+								response);
+							DriverAcceleration = nextOperatingPoint.Acceleration;
+							retVal = NextComponent.Request(absTime, nextOperatingPoint.SimulationInterval,
+								nextOperatingPoint.Acceleration, gradient);
+						} else {
+							if (absTime > 0 && DataBus.VehicleStopped) {
+								Log.Info(
+									"Operating point with limited acceleration resulted in an overload! Vehicle stopped! trying HALT action {0}",
+									nextOperatingPoint.Acceleration);
+								DataBus.BrakePower = 1.SI<Watt>();
+								retVal = DrivingActionHalt(absTime, nextOperatingPoint.SimulationInterval, 0.SI<MeterPerSecond>(), gradient);
+								ds = 0.SI<Meter>();
+								//retVal.Acceleration = 0.SI<MeterPerSquareSecond>();
+							} else {
+								if (response is ResponseEngineSpeedTooHigh) {
+									Log.Info(
+										"Operating point with limited acceleration due to high engine speed resulted in an overload, searching again...");
+									nextOperatingPoint = SearchOperatingPoint(absTime, ds, gradient, operatingPoint.Acceleration,
+										retVal);
+									DriverAcceleration = nextOperatingPoint.Acceleration;
+									retVal = NextComponent.Request(absTime, nextOperatingPoint.SimulationInterval,
+										nextOperatingPoint.Acceleration, gradient);
+								} else {
+									Log.Info(
+										"Operating point with limited acceleration resulted in an overload! trying again with original acceleration {0}",
+										nextOperatingPoint.Acceleration);
+									DriverAcceleration = nextOperatingPoint.Acceleration;
+									retVal = NextComponent.Request(absTime, nextOperatingPoint.SimulationInterval,
+										nextOperatingPoint.Acceleration,
+										gradient);
+								}
+							}
+						}
+						retVal.Switch().
+							Case<ResponseSuccess>(() => operatingPoint = nextOperatingPoint).
+							Case<ResponseGearShift>(() => operatingPoint = nextOperatingPoint).
+							Default(
+								r => {
+									throw new UnexpectedResponseException("DrivingAction Accelerate after Overload", r);
+								});
+					}).
+					Case<ResponseGearShift>(() => operatingPoint = limitedOperatingPoint).
+					Case<ResponseFailTimeInterval>(r => {
+						// occurs only with AT gearboxes - extend time interval after gearshift!
+						retVal = new ResponseDrivingCycleDistanceExceeded {
+							Source = this,
+							MaxDistance = r.Acceleration / 2 * r.DeltaT * r.DeltaT + DataBus.VehicleSpeed * r.DeltaT
+						};
+					}).
+					Case<ResponseSuccess>(() => operatingPoint = limitedOperatingPoint).
+					Default(
+						r => {
+							throw new UnexpectedResponseException(
+								"DrivingAction Accelerate after SearchOperatingPoint.", r);
+						});
+			}
+			CurrentState.Acceleration = operatingPoint.Acceleration;
+			CurrentState.dt = operatingPoint.SimulationInterval;
+			CurrentState.Response = retVal;
+
+			retVal.Acceleration = operatingPoint.Acceleration;
+			retVal.SimulationInterval = operatingPoint.SimulationInterval;
+			retVal.SimulationDistance = ds;
+			retVal.OperatingPoint = operatingPoint;
+
+			return retVal;
+		}
+
+		/// <summary>
+		/// see documentation of IDriverActions
+		/// </summary>
+		/// <param name="absTime"></param>
+		/// <param name="ds"></param>
+		/// <param name="maxVelocity"></param>
+		/// <param name="gradient"></param>
+		/// <returns></returns>
+		public IResponse DrivingActionCoast(Second absTime, Meter ds, MeterPerSecond maxVelocity, Radian gradient)
+		{
+			CurrentAction = "COAST";
+			IterationStatistics.Increment(this, "Coast");
+			Log.Debug("DrivingAction Coast");
+
+			return CoastOrRollAction(absTime, ds, maxVelocity, gradient, false);
+		}
+
+		/// <summary>
+		/// see documentation of IDriverActions
+		/// </summary>
+		/// <param name="absTime"></param>
+		/// <param name="ds"></param>
+		/// <param name="maxVelocity"></param>
+		/// <param name="gradient"></param>
+		/// <returns></returns>
+		public IResponse DrivingActionRoll(Second absTime, Meter ds, MeterPerSecond maxVelocity, Radian gradient)
+		{
+			CurrentAction = "ROLL";
+			IterationStatistics.Increment(this, "Roll");
+
+			Log.Debug("DrivingAction Roll");
+
+			var retVal = CoastOrRollAction(absTime, ds, maxVelocity, gradient, true);
+			retVal.Switch().
+				Case<ResponseGearShift>(
+					() => {
+						throw new UnexpectedResponseException("DrivingAction Roll: Gearshift during Roll action.",
+							retVal);
+					});
+
+			return retVal;
+		}
+
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="absTime"></param>
+		/// <param name="ds"></param>
+		/// <param name="maxVelocity"></param>
+		/// <param name="gradient"></param>
+		/// <param name="rollAction"></param>
+		/// <returns>
+		/// * ResponseSuccess
+		/// * ResponseDrivingCycleDistanceExceeded: vehicle is at low speed, coasting would lead to stop before ds is reached.
+		/// * ResponseSpeedLimitExceeded: vehicle accelerates during coasting which would lead to exceeding the given maxVelocity (e.g., driving downhill, engine's drag load is not sufficient)
+		/// * ResponseUnderload: engine's operating point is below drag curve (vehicle accelerates more than driver model allows; engine's drag load is not sufficient for limited acceleration
+		/// * ResponseGearShift: gearbox needs to shift gears, vehicle can not accelerate (traction interruption)
+		/// * ResponseFailTimeInterval: 
+		/// </returns>
+		protected IResponse CoastOrRollAction(Second absTime, Meter ds, MeterPerSecond maxVelocity, Radian gradient,
+			bool rollAction)
+		{
+			var requestedOperatingPoint = ComputeAcceleration(ds, DataBus.VehicleSpeed);
+			DriverAcceleration = requestedOperatingPoint.Acceleration;
+			var initialResponse = NextComponent.Request(absTime, requestedOperatingPoint.SimulationInterval,
+				requestedOperatingPoint.Acceleration, gradient, dryRun: true);
+
+			OperatingPoint searchedOperatingPoint;
+			try {
+				searchedOperatingPoint = SearchOperatingPoint(absTime, requestedOperatingPoint.SimulationDistance,
+					gradient,
+					requestedOperatingPoint.Acceleration, initialResponse, coastingOrRoll: true);
+			} catch (VectoEngineSpeedTooLowException) {
+				// in case of an exception during search the engine-speed got too low - gear disengaged --> try again with disengaged gear.
+				searchedOperatingPoint = SearchOperatingPoint(absTime, requestedOperatingPoint.SimulationDistance,
+					gradient,
+					requestedOperatingPoint.Acceleration, initialResponse, coastingOrRoll: true);
+			}
+
+			if (!ds.IsEqual(searchedOperatingPoint.SimulationDistance)) {
+				// vehicle is at low speed, coasting would lead to stop before ds is reached: reduce simulated distance to stop distance.
+				Log.Debug(
+					"SearchOperatingPoint reduced the max. distance: {0} -> {1}. Issue new request from driving cycle!",
+					searchedOperatingPoint.SimulationDistance, ds);
+				CurrentState.Response = new ResponseDrivingCycleDistanceExceeded {
+					Source = this,
+					MaxDistance = searchedOperatingPoint.SimulationDistance,
+					Acceleration = searchedOperatingPoint.Acceleration,
+					SimulationInterval = searchedOperatingPoint.SimulationInterval,
+					OperatingPoint = searchedOperatingPoint
+				};
+				return CurrentState.Response;
+			}
+
+			Log.Debug("Found operating point for {2}. dt: {0}, acceleration: {1}",
+				searchedOperatingPoint.SimulationInterval,
+				searchedOperatingPoint.Acceleration, rollAction ? "ROLL" : "COAST");
+
+			var limitedOperatingPoint = LimitAccelerationByDriverModel(searchedOperatingPoint,
+				rollAction ? LimitationMode.NoLimitation : LimitationMode.LimitDecelerationDriver);
+
+			// compute speed at the end of the simulation interval. if it exceeds the limit -> return
+			var v2 = DataBus.VehicleSpeed +
+					limitedOperatingPoint.Acceleration * limitedOperatingPoint.SimulationInterval;
+			if (v2 > maxVelocity && limitedOperatingPoint.Acceleration.IsGreaterOrEqual(0)) {
+				Log.Debug("vehicle's velocity would exceed given max speed. v2: {0}, max speed: {1}", v2, maxVelocity);
+				return new ResponseSpeedLimitExceeded() { Source = this };
+			}
+
+			DriverAcceleration = limitedOperatingPoint.Acceleration;
+			var response = NextComponent.Request(absTime, limitedOperatingPoint.SimulationInterval,
+				limitedOperatingPoint.Acceleration, gradient);
+
+			response.SimulationInterval = limitedOperatingPoint.SimulationInterval;
+			response.SimulationDistance = ds;
+			response.Acceleration = limitedOperatingPoint.Acceleration;
+			response.OperatingPoint = limitedOperatingPoint;
+
+			response.Switch().
+				Case<ResponseSuccess>().
+				Case<ResponseUnderload>(). // driver limits acceleration, operating point may be below engine's 
+				//drag load resp. below 0
+				Case<ResponseOverload>(). // driver limits acceleration, operating point may be above 0 (GBX), use brakes
+				Case<ResponseEngineSpeedTooHigh>(). // reduce acceleration/vehicle speed
+				Case<ResponseGearShift>().
+				Case<ResponseFailTimeInterval>(r => {
+					response = new ResponseDrivingCycleDistanceExceeded {
+						Source = this,
+						MaxDistance = r.Acceleration / 2 * r.DeltaT * r.DeltaT + DataBus.VehicleSpeed * r.DeltaT
+					};
+				}).
+				Default(
+					() => {
+						throw new UnexpectedResponseException(
+							"CoastOrRoll Action: unhandled response from powertrain.", response);
+					});
+
+			CurrentState.Response = response;
+			CurrentState.Acceleration = response.Acceleration;
+			CurrentState.dt = response.SimulationInterval;
+			return response;
+		}
+
+		public IResponse DrivingActionBrake(Second absTime, Meter ds, MeterPerSecond nextTargetSpeed, Radian gradient,
+			IResponse previousResponse = null, Meter targetDistance = null)
+		{
+			CurrentAction = "BRAKE";
+			IterationStatistics.Increment(this, "Brake");
+			Log.Debug("DrivingAction Brake");
+
+			IResponse retVal = null;
+
+			var operatingPoint = ComputeAcceleration(ds, nextTargetSpeed);
+
+			//if (operatingPoint.Acceleration.IsSmaller(0)) {
+			operatingPoint = IncreaseDecelerationToMaxWithinSpeedRange(operatingPoint);
+
+			operatingPoint =
+				AdaptDecelerationToTargetDistance(ds, nextTargetSpeed, targetDistance, operatingPoint.Acceleration) ??
+				operatingPoint;
+
+			DriverAcceleration = operatingPoint.Acceleration;
+			var response = previousResponse ??
+							NextComponent.Request(absTime, operatingPoint.SimulationInterval, operatingPoint.Acceleration,
+								gradient);
+
+			var point = operatingPoint;
+			response.Switch().
+				Case<ResponseSuccess>(r => retVal = r).
+				Case<ResponseOverload>(r => retVal = r)
+				. // i.e., driving uphill, clutch open, deceleration higher than desired deceleration
+				Case<ResponseUnderload>(). // will be handled in SearchBrakingPower
+				Case<ResponseEngineSpeedTooHigh>(r => {
+					Log.Debug("Engine speeed was too high, search for appropriate acceleration first.");
+					operatingPoint = SearchOperatingPoint(absTime, ds, gradient, point.Acceleration,
+						response);
+				}). // will be handled in SearchBrakingPower
+				Case<ResponseGearShift>(). // will be handled in SearchBrakingPower
+				Case<ResponseFailTimeInterval>(r =>
+					retVal = new ResponseDrivingCycleDistanceExceeded() {
+						Source = this,
+						MaxDistance = DataBus.VehicleSpeed * r.DeltaT + point.Acceleration / 2 * r.DeltaT * r.DeltaT
+					}).
+				Default(r => {
+					throw new UnexpectedResponseException("DrivingAction Brake: first request.", r);
+				});
+
+			if (retVal != null) {
+				CurrentState.Acceleration = operatingPoint.Acceleration;
+				CurrentState.dt = operatingPoint.SimulationInterval;
+				CurrentState.Response = retVal;
+				retVal.Acceleration = operatingPoint.Acceleration;
+				retVal.SimulationInterval = operatingPoint.SimulationInterval;
+				retVal.SimulationDistance = ds;
+				retVal.OperatingPoint = operatingPoint;
+				return retVal;
+			}
+
+			operatingPoint = SearchBrakingPower(absTime, operatingPoint.SimulationDistance, gradient,
+				operatingPoint.Acceleration, response);
+
+			if (!ds.IsEqual(operatingPoint.SimulationDistance, 1E-15.SI<Meter>())) {
+				Log.Info(
+					"SearchOperatingPoint Braking reduced the max. distance: {0} -> {1}. Issue new request from driving cycle!",
+					operatingPoint.SimulationDistance, ds);
+				return new ResponseDrivingCycleDistanceExceeded {
+					Source = this,
+					MaxDistance = operatingPoint.SimulationDistance
+				};
+			}
+
+			Log.Debug("Found operating point for braking. dt: {0}, acceleration: {1} brakingPower: {2}",
+				operatingPoint.SimulationInterval,
+				operatingPoint.Acceleration, DataBus.BrakePower);
+			if (DataBus.BrakePower < 0) {
+				var overload = new ResponseOverload {
+					Source = this,
+					BrakePower = DataBus.BrakePower,
+					Acceleration = operatingPoint.Acceleration
+				};
+				DataBus.BrakePower = 0.SI<Watt>();
+				return overload;
+			}
+
+			DriverAcceleration = operatingPoint.Acceleration;
+			retVal = NextComponent.Request(absTime, operatingPoint.SimulationInterval, operatingPoint.Acceleration,
+				gradient);
+
+			retVal.Switch().
+				Case<ResponseSuccess>().
+				Case<ResponseGearShift>().
+				Case<ResponseFailTimeInterval>(r =>
+					retVal = new ResponseDrivingCycleDistanceExceeded() {
+						Source = this,
+						MaxDistance =
+							DataBus.VehicleSpeed * r.DeltaT + operatingPoint.Acceleration / 2 * r.DeltaT * r.DeltaT
+					}).
+				Case<ResponseUnderload>(r => {
+					if (DataBus.GearboxType.AutomaticTransmission()) {
+						operatingPoint = SearchBrakingPower(absTime, operatingPoint.SimulationDistance, gradient,
+							operatingPoint.Acceleration, response);
+						DriverAcceleration = operatingPoint.Acceleration;
+						retVal = NextComponent.Request(absTime, operatingPoint.SimulationInterval,
+							operatingPoint.Acceleration, gradient);
+					}
+				}).
+				Case<ResponseOverload>(r => {
+					if (DataBus.GearboxType.AutomaticTransmission()) {
+						// overload may happen because of gearshift between search and actual request, search again
+						var i = 5;
+						while (i-- > 0 && !(retVal is ResponseSuccess)) {
+							DataBus.BrakePower = 0.SI<Watt>();
+							operatingPoint = SearchBrakingPower(absTime, operatingPoint.SimulationDistance, gradient,
+								operatingPoint.Acceleration, response);
+							DriverAcceleration = operatingPoint.Acceleration;
+							if (DataBus.BrakePower.IsSmaller(0)) {
+								DataBus.BrakePower = 0.SI<Watt>();
+
+								operatingPoint = SearchOperatingPoint(absTime, ds, gradient, 0.SI<MeterPerSquareSecond>(), r);
+							}
+							retVal = NextComponent.Request(absTime, operatingPoint.SimulationInterval,
+								operatingPoint.Acceleration, gradient);
+						}
+					} else {
+						throw new UnexpectedResponseException(
+							"DrivingAction Brake: request failed after braking power was found.", r);
+					}
+				}).
+				Default(
+					r => {
+						throw new UnexpectedResponseException(
+							"DrivingAction Brake: request failed after braking power was found.", r);
+					});
+			CurrentState.Acceleration = operatingPoint.Acceleration;
+			CurrentState.dt = operatingPoint.SimulationInterval;
+			CurrentState.Response = retVal;
+			retVal.Acceleration = operatingPoint.Acceleration;
+			retVal.SimulationInterval = operatingPoint.SimulationInterval;
+			retVal.SimulationDistance = ds;
+			retVal.OperatingPoint = operatingPoint;
+
+			return retVal;
+		}
+
+		private OperatingPoint AdaptDecelerationToTargetDistance(Meter ds, MeterPerSecond nextTargetSpeed,
+			Meter targetDistance, MeterPerSquareSecond acceleration)
+		{
+			if (targetDistance != null && targetDistance > DataBus.Distance) {
+				var tmp = ComputeAcceleration(targetDistance - DataBus.Distance, nextTargetSpeed, false);
+				if (tmp.Acceleration.IsGreater(acceleration)) {
+					var operatingPoint = ComputeTimeInterval(tmp.Acceleration, ds);
+					if (!ds.IsEqual(operatingPoint.SimulationDistance)) {
+						Log.Error(
+							"Unexpected Condition: Distance has been adjusted from {0} to {1}, currentVelocity: {2} acceleration: {3}, targetVelocity: {4}",
+							operatingPoint.SimulationDistance, ds, DataBus.VehicleSpeed, operatingPoint.Acceleration,
+							nextTargetSpeed);
+						throw new VectoSimulationException("Simulation distance unexpectedly adjusted! {0} -> {1}", ds,
+							operatingPoint.SimulationDistance);
+					}
+					return operatingPoint;
+				}
+			}
+			return null;
+		}
+
+		private OperatingPoint IncreaseDecelerationToMaxWithinSpeedRange(OperatingPoint operatingPoint)
+		{
+			// if we should brake with the max. deceleration and the deceleration changes within the current interval, take the larger deceleration...
+			if (
+				operatingPoint.Acceleration.IsEqual(
+					DriverData.AccelerationCurve.Lookup(DataBus.VehicleSpeed).Deceleration)) {
+				var v2 = DataBus.VehicleSpeed + operatingPoint.Acceleration * operatingPoint.SimulationInterval;
+				var nextAcceleration = DriverData.AccelerationCurve.Lookup(v2).Deceleration;
+				var tmp = ComputeTimeInterval(VectoMath.Min(operatingPoint.Acceleration, nextAcceleration),
+					operatingPoint.SimulationDistance);
+				if (!operatingPoint.Acceleration.IsEqual(nextAcceleration) &&
+					operatingPoint.SimulationDistance.IsEqual(tmp.SimulationDistance)) {
+					// only adjust operating point if the acceleration is different but the simulation distance is not modified
+					// i.e., braking to the next sample point (but a little bit slower)
+					Log.Debug("adjusting acceleration from {0} to {1}", operatingPoint.Acceleration, tmp.Acceleration);
+					operatingPoint = tmp;
+					// ComputeTimeInterval((operatingPoint.Acceleration + tmp.Acceleration) / 2, operatingPoint.SimulationDistance);
+				}
+			}
+			return operatingPoint;
+		}
+
+		// ================================================
+
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="operatingPoint"></param>
+		/// <param name="limits"></param>
+		/// <returns></returns>
+		private OperatingPoint LimitAccelerationByDriverModel(OperatingPoint operatingPoint,
+			LimitationMode limits)
+		{
+			var limitApplied = false;
+			var originalAcceleration = operatingPoint.Acceleration;
+			//if (((limits & LimitationMode.LimitDecelerationLookahead) != 0) &&
+			//	operatingPoint.Acceleration < DriverData.LookAheadCoasting.Deceleration) {
+			//	operatingPoint.Acceleration = DriverData.LookAheadCoasting.Deceleration;
+			//	limitApplied = true;
+			//}
+			var accelerationLimits = DriverData.AccelerationCurve.Lookup(DataBus.VehicleSpeed);
+			if (operatingPoint.Acceleration > accelerationLimits.Acceleration) {
+				operatingPoint.Acceleration = accelerationLimits.Acceleration;
+				limitApplied = true;
+			}
+			if (((limits & LimitationMode.LimitDecelerationDriver) != 0) &&
+				operatingPoint.Acceleration < accelerationLimits.Deceleration) {
+				operatingPoint.Acceleration = accelerationLimits.Deceleration;
+				limitApplied = true;
+			}
+			if (limitApplied) {
+				operatingPoint.SimulationInterval =
+					ComputeTimeInterval(operatingPoint.Acceleration, operatingPoint.SimulationDistance)
+						.SimulationInterval;
+				Log.Debug("Limiting acceleration from {0} to {1}, dt: {2}", originalAcceleration,
+					operatingPoint.Acceleration, operatingPoint.SimulationInterval);
+			}
+			return operatingPoint;
+		}
+
+		/// <summary>
+		/// Performs a search for the required braking power such that the vehicle accelerates with the given acceleration.
+		/// Returns a new operating point (a, ds, dt) where ds may be shorter due to vehicle stopping
+		/// </summary>
+		/// <returns>operating point (a, ds, dt) such that the vehicle accelerates with the given acceleration.</returns>
+		private OperatingPoint SearchBrakingPower(Second absTime, Meter ds, Radian gradient,
+			MeterPerSquareSecond acceleration, IResponse initialResponse)
+		{
+			IterationStatistics.Increment(this, "SearchBrakingPower", 0);
+
+			var operatingPoint = new OperatingPoint { SimulationDistance = ds, Acceleration = acceleration };
+			operatingPoint = ComputeTimeInterval(operatingPoint.Acceleration, ds);
+			Watt deltaPower = null;
+			initialResponse.Switch().
+				Case<ResponseGearShift>(r => {
+					IterationStatistics.Increment(this, "SearchBrakingPower");
+					DriverAcceleration = operatingPoint.Acceleration;
+					var nextResp = NextComponent.Request(absTime, operatingPoint.SimulationInterval,
+						operatingPoint.Acceleration,
+						gradient, true);
+					deltaPower = nextResp.GearboxPowerRequest;
+				}).
+				Case<ResponseEngineSpeedTooHigh>(r => {
+					IterationStatistics.Increment(this, "SearchBrakingPower");
+					DriverAcceleration = operatingPoint.Acceleration;
+					var nextResp = NextComponent.Request(absTime, operatingPoint.SimulationInterval,
+						operatingPoint.Acceleration,
+						gradient, true);
+					deltaPower = nextResp.GearboxPowerRequest;
+				}).
+				Case<ResponseUnderload>(r =>
+					deltaPower = DataBus.ClutchClosed(absTime) ? r.Delta : r.GearboxPowerRequest).
+				Default(
+					r => {
+						throw new UnexpectedResponseException("cannot use response for searching braking power!", r);
+					});
+
+			try {
+				DataBus.BrakePower = SearchAlgorithm.Search(DataBus.BrakePower, deltaPower,
+					deltaPower.Abs() * (DataBus.GearboxType.AutomaticTransmission() ? 0.5 : 1),
+					getYValue: result => {
+						var response = (ResponseDryRun)result;
+						return DataBus.ClutchClosed(absTime) ? response.DeltaDragLoad : response.GearboxPowerRequest;
+					},
+					evaluateFunction: x => {
+						DataBus.BrakePower = x;
+						operatingPoint = ComputeTimeInterval(operatingPoint.Acceleration, ds);
+
+						IterationStatistics.Increment(this, "SearchBrakingPower");
+						DriverAcceleration = operatingPoint.Acceleration;
+						return NextComponent.Request(absTime, operatingPoint.SimulationInterval,
+							operatingPoint.Acceleration, gradient,
+							true);
+					},
+					criterion: result => {
+						var response = (ResponseDryRun)result;
+						var delta = DataBus.ClutchClosed(absTime)
+							? response.DeltaDragLoad
+							: response.GearboxPowerRequest;
+						return delta.Value();
+					});
+
+				return operatingPoint;
+			} catch (Exception) {
+				Log.Error("Failed to find operating point for braking power! absTime: {0}", absTime);
+				throw;
+			}
+		}
+
+		protected OperatingPoint SearchOperatingPoint(Second absTime, Meter ds, Radian gradient,
+			MeterPerSquareSecond acceleration, IResponse initialResponse, bool coastingOrRoll = false)
+		{
+			IterationStatistics.Increment(this, "SearchOperatingPoint", 0);
+
+			var retVal = new OperatingPoint { Acceleration = acceleration, SimulationDistance = ds };
+
+			var actionRoll = !DataBus.ClutchClosed(absTime);
+
+			var origDelta = GetOrigDelta(initialResponse, coastingOrRoll, actionRoll);
+
+			var searchEngineSpeed = initialResponse is ResponseEngineSpeedTooHigh;
+
+			var delta = origDelta;
+			try {
+				retVal.Acceleration = SearchAlgorithm.Search(acceleration, delta,
+					Constants.SimulationSettings.OperatingPointInitialSearchIntervalAccelerating,
+					getYValue: response => {
+						var r = (ResponseDryRun)response;
+						if (searchEngineSpeed) {
+							return r.DeltaEngineSpeed * 1.SI<NewtonMeter>();
+						}
+						return actionRoll ? r.GearboxPowerRequest : (coastingOrRoll ? r.DeltaDragLoad : r.DeltaFullLoad);
+					},
+					evaluateFunction:
+						acc => {
+							// calculate new time interval only when vehiclespeed and acceleration are != 0
+							// else: use same timeinterval as before.
+							var vehicleDrivesAndAccelerates = !(acc.IsEqual(0) && DataBus.VehicleSpeed.IsEqual(0));
+							if (vehicleDrivesAndAccelerates) {
+								var tmp = ComputeTimeInterval(acc, ds);
+								if (tmp.SimulationInterval.IsEqual(0.SI<Second>(), 1e-9.SI<Second>())) {
+									throw new VectoSearchAbortedException(
+										"next TimeInterval is 0. a: {0}, v: {1}, dt: {2}", acc,
+										DataBus.VehicleSpeed, tmp.SimulationInterval);
+								}
+								retVal.Acceleration = tmp.Acceleration;
+								retVal.SimulationInterval = tmp.SimulationInterval;
+								retVal.SimulationDistance = tmp.SimulationDistance;
+							}
+							IterationStatistics.Increment(this, "SearchOperatingPoint");
+							DriverAcceleration = acc;
+							var response = NextComponent.Request(absTime, retVal.SimulationInterval, acc, gradient, true);
+							response.OperatingPoint = retVal;
+							return response;
+						},
+					criterion: response => {
+						var r = (ResponseDryRun)response;
+						if (searchEngineSpeed) {
+							return r.DeltaEngineSpeed.Value();
+						}
+						delta = actionRoll
+							? r.GearboxPowerRequest
+							: (coastingOrRoll ? r.DeltaDragLoad : r.DeltaFullLoad);
+						return delta.Value();
+					},
+					abortCriterion:
+						(response, cnt) => {
+							var r = (ResponseDryRun)response;
+							return r != null && !actionRoll && !ds.IsEqual(r.OperatingPoint.SimulationDistance);
+						});
+			} catch (VectoSearchAbortedException) {
+				// search aborted, try to go ahead with the last acceleration
+			} catch (Exception) {
+				Log.Error("Failed to find operating point! absTime: {0}", absTime);
+				throw;
+			}
+
+			if (!retVal.Acceleration.IsBetween(DriverData.AccelerationCurve.MaxDeceleration(),
+				DriverData.AccelerationCurve.MaxAcceleration())) {
+				Log.Info("Operating Point outside driver acceleration limits: a: {0}", retVal.Acceleration);
+			}
+			return ComputeTimeInterval(retVal.Acceleration, retVal.SimulationDistance);
+		}
+
+		private static Watt GetOrigDelta(IResponse initialResponse, bool coastingOrRoll, bool actionRoll)
+		{
+			Watt origDelta = null;
+			if (actionRoll) {
+				initialResponse.Switch().
+					Case<ResponseDryRun>(r => origDelta = r.GearboxPowerRequest).
+					Case<ResponseFailTimeInterval>(r => origDelta = r.GearboxPowerRequest).
+					Default(r => {
+						throw new UnexpectedResponseException("SearchOperatingPoint: Unknown response type.", r);
+					});
+			} else {
+				initialResponse.Switch().
+					Case<ResponseOverload>(r => origDelta = r.Delta).
+					Case<ResponseEngineSpeedTooHigh>(r => {
+						origDelta = r.DeltaEngineSpeed * 1.SI<NewtonMeter>();
+					}). // search operating point in drive action after overload
+					Case<ResponseDryRun>(r => origDelta = coastingOrRoll ? r.DeltaDragLoad : r.DeltaFullLoad).
+					Default(r => {
+						throw new UnexpectedResponseException("SearchOperatingPoint: Unknown response type.", r);
+					});
+			}
+			return origDelta;
+		}
+
+		/// <summary>
+		/// compute the acceleration and time-interval such that the vehicle's velocity approaches the given target velocity
+		/// - first compute the acceleration to reach the targetVelocity within the given distance
+		/// - limit the acceleration/deceleration by the driver's acceleration curve
+		/// - compute the time interval required to drive the given distance with the computed acceleration
+		/// computed acceleration and time interval are stored in CurrentState!
+		/// </summary>
+		/// <param name="ds">distance to reach the next target speed</param>
+		/// <param name="targetVelocity">next vehicle speed to decelerate to</param>
+		/// <param name="limitByDriverModel">if set to false the required acceleration will be computed, regardless of the driver's acceleration curve</param>
+		public OperatingPoint ComputeAcceleration(Meter ds, MeterPerSecond targetVelocity,
+			bool limitByDriverModel = true)
+		{
+			var currentSpeed = DataBus.VehicleSpeed;
+			var retVal = new OperatingPoint() { SimulationDistance = ds };
+
+			// Δx = (v0+v1)/2 * Δt
+			// => Δt = 2*Δx/(v0+v1) 
+			var dt = 2 * ds / (currentSpeed + targetVelocity);
+
+			// a = Δv / Δt
+			var requiredAcceleration = (targetVelocity - currentSpeed) / dt;
+
+			if (!limitByDriverModel) {
+				return ComputeTimeInterval(requiredAcceleration, ds);
+			}
+
+			var maxAcceleration = DriverData.AccelerationCurve.Lookup(currentSpeed);
+
+			if (requiredAcceleration > maxAcceleration.Acceleration) {
+				requiredAcceleration = maxAcceleration.Acceleration;
+			}
+			if (requiredAcceleration < maxAcceleration.Deceleration) {
+				requiredAcceleration = maxAcceleration.Deceleration;
+			}
+
+			retVal.Acceleration = requiredAcceleration;
+			retVal = ComputeTimeInterval(retVal.Acceleration, ds);
+
+			if (ds.IsEqual(retVal.SimulationDistance)) {
+				return retVal;
+			}
+
+			// this case should not happen, acceleration has been computed such that the target speed
+			// can be reached within ds.
+			Log.Error(
+				"Unexpected Condition: Distance has been adjusted from {0} to {1}, currentVelocity: {2} acceleration: {3}, targetVelocity: {4}",
+				retVal.SimulationDistance, ds, currentSpeed, CurrentState.Acceleration, targetVelocity);
+			throw new VectoSimulationException("Simulation distance unexpectedly adjusted! {0} -> {1}", ds,
+				retVal.SimulationDistance);
+		}
+
+		/// <summary>
+		/// computes the distance required to decelerate from the current velocity to the given target velocity considering
+		/// the drivers acceleration/deceleration curve.
+		/// </summary>
+		/// <param name="targetSpeed"></param>
+		/// <returns></returns>
+		public Meter ComputeDecelerationDistance(MeterPerSecond targetSpeed)
+		{
+			return DriverData.AccelerationCurve.ComputeAccelerationDistance(DataBus.VehicleSpeed, targetSpeed);
+		}
+
+		/// <summary>
+		/// Computes the time interval for driving the given distance ds with the vehicle's current speed and the given acceleration.
+		/// If the distance ds can not be reached (i.e., the vehicle would halt before ds is reached) then the distance parameter is adjusted.
+		/// Returns a new operating point (a, ds, dt)
+		/// </summary>
+		/// <param name="acceleration"></param>
+		/// <param name="ds"></param>
+		/// <returns>Operating point (a, ds, dt)</returns>
+		private OperatingPoint ComputeTimeInterval(MeterPerSquareSecond acceleration, Meter ds)
+		{
+			return VectoMath.ComputeTimeInterval(DataBus.VehicleSpeed, acceleration, DataBus.Distance, ds);
+		}
+
+		/// <summary>
+		/// simulate a certain time interval where the vehicle is stopped.
+		/// </summary>
+		/// <param name="absTime"></param>
+		/// <param name="dt"></param>
+		/// <param name="targetVelocity"></param>
+		/// <param name="gradient"></param>
+		/// <returns></returns>
+		public IResponse DrivingActionHalt(Second absTime, Second dt, MeterPerSecond targetVelocity, Radian gradient)
+		{
+			CurrentAction = "HALT";
+			if (!targetVelocity.IsEqual(0) || !DataBus.VehicleStopped) {
+				Log.Error("TargetVelocity ({0}) and VehicleVelocity ({1}) must be zero when vehicle is halting!",
+					targetVelocity,
+					DataBus.VehicleSpeed);
+				throw new VectoSimulationException(
+					"TargetVelocity ({0}) and VehicleVelocity ({1}) must be zero when vehicle is halting!",
+					targetVelocity,
+					DataBus.VehicleSpeed);
+			}
+
+			DriverAcceleration = 0.SI<MeterPerSquareSecond>();
+			var retVal = NextComponent.Request(absTime, dt, 0.SI<MeterPerSquareSecond>(), gradient);
+
+			retVal.Switch().
+				Case<ResponseGearShift>(r => {
+					DriverAcceleration = 0.SI<MeterPerSquareSecond>();
+					retVal = NextComponent.Request(absTime, dt, 0.SI<MeterPerSquareSecond>(), gradient);
+				});
+			CurrentState.dt = dt;
+			CurrentState.Acceleration = 0.SI<MeterPerSquareSecond>();
+			return retVal;
+		}
+
+		protected override void DoWriteModalResults(IModalDataContainer container)
+		{
+			container[ModalResultField.acc] = CurrentState.Acceleration;
+			container.SetDataValue("DriverAction", ActionToNumber(CurrentAction));
+		}
+
+		private int ActionToNumber(string currentAction)
+		{
+			switch (currentAction.ToUpper()) {
+				case "HALT":
+					return 0;
+				case "ROLL":
+					return 2;
+				case "COAST":
+					return 4;
+				case "ACCELERATE":
+					return 6;
+				case "BRAKE":
+					return -5;
+				default:
+					return -10;
+			}
+		}
+
+		protected override void DoCommitSimulationStep()
+		{
+			if (!(CurrentState.Response is ResponseSuccess)) {
+				throw new VectoSimulationException("Previous request did not succeed!");
+			}
+			CurrentState.Response = null;
+		}
+
+		public class DriverState
+		{
+			// ReSharper disable once InconsistentNaming
+			public Second dt;
+			public MeterPerSquareSecond Acceleration;
+			public IResponse Response;
+		}
+
+		[Flags]
+		protected enum LimitationMode
+		{
+			NoLimitation = 0x0,
+			LimitDecelerationDriver = 0x2,
+			//LimitDecelerationLookahead = 0x4
+		}
+
+		public DrivingBehavior DriverBehavior { get; set; }
+
+		public MeterPerSquareSecond DriverAcceleration { get; protected set; }
+	}
 }
\ No newline at end of file
diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/Gearbox.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/Gearbox.cs
index 8ea0d270916aada48966c3ae5065d1389cab16e3..6682c9725aa171e603600d371a8581beb71bbca1 100644
--- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/Gearbox.cs
+++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/Gearbox.cs
@@ -29,401 +29,406 @@
 *   Martin Rexeis, rexeis@ivt.tugraz.at, IVT, Graz University of Technology
 */
 
-using TUGraz.VectoCommon.Exceptions;
-using TUGraz.VectoCommon.Models;
-using TUGraz.VectoCommon.Utils;
-using TUGraz.VectoCore.Configuration;
-using TUGraz.VectoCore.Models.Connector.Ports.Impl;
-using TUGraz.VectoCore.Models.Simulation;
-using TUGraz.VectoCore.Models.Simulation.Data;
-using TUGraz.VectoCore.Models.Simulation.DataBus;
-using TUGraz.VectoCore.OutputData;
-using TUGraz.VectoCore.Utils;
-
-namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
-{
-	public class Gearbox : AbstractGearbox<GearboxState>
-	{
-		/// <summary>
-		/// The shift strategy.
-		/// </summary>
-		private readonly IShiftStrategy _strategy;
-
-		/// <summary>
-		/// Time when a gearbox shift engages a new gear (shift is finished). Is set when shifting is needed.
-		/// </summary>
-		private Second _engageTime = 0.SI<Second>();
-
-		/// <summary>
-		/// True if gearbox is disengaged (no gear is set).
-		/// </summary>
-		protected internal bool Disengaged = true;
-
-		public Second LastUpshift { get; protected internal set; }
-
-		public Second LastDownshift { get; protected internal set; }
-
-		public override GearInfo NextGear
-		{
-			get { return _strategy.NextGear; }
-		}
-
-		public override bool ClutchClosed(Second absTime)
-		{
-			return _engageTime.IsSmallerOrEqual(absTime);
-		}
-
-		public Gearbox(IVehicleContainer container, IShiftStrategy strategy, VectoRunData runData) : base(container, runData)
-		{
-			_strategy = strategy;
-			_strategy.Gearbox = this;
-
-			LastDownshift = -double.MaxValue.SI<Second>();
-			LastUpshift = -double.MaxValue.SI<Second>();
-		}
-
-		public override IResponse Initialize(NewtonMeter outTorque, PerSecond outAngularVelocity)
-		{
-			var absTime = 0.SI<Second>();
-			var dt = Constants.SimulationSettings.TargetTimeInterval;
-
-			_engageTime = -double.MaxValue.SI<Second>();
-
-			if (Disengaged) {
-				Gear = _strategy.InitGear(absTime, dt, outTorque, outAngularVelocity);
-			}
-
-			var inAngularVelocity = outAngularVelocity * ModelData.Gears[Gear].Ratio;
-			var gearboxTorqueLoss = ModelData.Gears[Gear].LossMap.GetTorqueLoss(outAngularVelocity, outTorque);
-			CurrentState.TorqueLossResult = gearboxTorqueLoss;
-
-			var inTorque = outTorque / ModelData.Gears[Gear].Ratio
-							+ gearboxTorqueLoss.Value;
-
-			PreviousState.SetState(inTorque, inAngularVelocity, outTorque, outAngularVelocity);
-			PreviousState.InertiaTorqueLossOut = 0.SI<NewtonMeter>();
-			PreviousState.Gear = Gear;
-			Disengaged = false;
-
-			var response = NextComponent.Initialize(inTorque, inAngularVelocity);
-
-			return response;
-		}
-
-		internal ResponseDryRun Initialize(uint gear, NewtonMeter outTorque, PerSecond outAngularVelocity)
-		{
-			var oldGear = Gear;
-			Gear = gear;
-			var inAngularVelocity = outAngularVelocity * ModelData.Gears[gear].Ratio;
-			var torqueLossResult = ModelData.Gears[gear].LossMap.GetTorqueLoss(outAngularVelocity, outTorque);
-			CurrentState.TorqueLossResult = torqueLossResult;
-			var inTorque = outTorque / ModelData.Gears[gear].Ratio + torqueLossResult.Value;
-
-			if (!inAngularVelocity.IsEqual(0)) {
-				var alpha = ModelData.Inertia.IsEqual(0)
-					? 0.SI<PerSquareSecond>()
-					: outTorque / ModelData.Inertia;
-
-				var inertiaPowerLoss = Formulas.InertiaPower(inAngularVelocity, alpha, ModelData.Inertia,
-					Constants.SimulationSettings.TargetTimeInterval);
-				inTorque += inertiaPowerLoss / inAngularVelocity;
-			}
-
-			var response =
-				(ResponseDryRun)
-					NextComponent.Request(0.SI<Second>(), Constants.SimulationSettings.TargetTimeInterval, inTorque,
-						inAngularVelocity, true); //NextComponent.Initialize(inTorque, inAngularVelocity);
-			//response.Switch().
-			//	Case<ResponseSuccess>().
-			//	Case<ResponseOverload>().
-			//	Case<ResponseUnderload>().
-			//	Default(r => { throw new UnexpectedResponseException("Gearbox.Initialize", r); });
-
-			var fullLoad = DataBus.EngineStationaryFullPower(inAngularVelocity);
-
-			Gear = oldGear;
-			return new ResponseDryRun {
-				Source = this,
-				EnginePowerRequest = response.EnginePowerRequest,
-				EngineSpeed = response.EngineSpeed,
-				DynamicFullLoadPower = response.DynamicFullLoadPower,
-				ClutchPowerRequest = response.ClutchPowerRequest,
-				GearboxPowerRequest = outTorque * outAngularVelocity,
-				DeltaFullLoad = response.EnginePowerRequest - fullLoad
-			};
-		}
-
-		/// <summary>
-		/// Requests the Gearbox to deliver torque and angularVelocity
-		/// </summary>
-		/// <returns>
-		/// <list type="bullet">
-		/// <item><description>ResponseDryRun</description></item>
-		/// <item><description>ResponseOverload</description></item>
-		/// <item><description>ResponseGearshift</description></item>
-		/// </list>
-		/// </returns>
-		public override IResponse Request(Second absTime, Second dt, NewtonMeter outTorque, PerSecond outAngularVelocity,
-			bool dryRun = false)
-		{
-			IterationStatistics.Increment(this, "Requests");
-
-			Log.Debug("Gearbox Power Request: torque: {0}, angularVelocity: {1}", outTorque, outAngularVelocity);
-			if (DataBus.VehicleStopped) {
-				_engageTime = absTime;
-				LastDownshift = -double.MaxValue.SI<Second>();
-				LastUpshift = -double.MaxValue.SI<Second>();
-			}
-			if (DataBus.DriverBehavior == DrivingBehavior.Halted) {
-				_engageTime = absTime + dt;
-			}
-
-			if (DataBus.DriverBehavior == DrivingBehavior.Braking && (DataBus.BrakePower.IsGreater(0) || outTorque < 0) &&
-				DataBus.VehicleSpeed.IsSmaller(Constants.SimulationSettings.ClutchDisengageWhenHaltingSpeed)) {
-				_engageTime = VectoMath.Max(_engageTime, absTime + dt);
-
-				return RequestGearDisengaged(absTime, dt, outTorque, outAngularVelocity, dryRun);
-			}
-
-			return ClutchClosed(absTime)
-				? RequestGearEngaged(absTime, dt, outTorque, outAngularVelocity, dryRun)
-				: RequestGearDisengaged(absTime, dt, outTorque, outAngularVelocity, dryRun);
-		}
-
-		/// <summary>
-		/// Requests the Gearbox in Disengaged mode
-		/// </summary>
-		/// <returns>
-		/// <list type="bullet">
-		/// <item><term>ResponseDryRun</term><description>if dryRun, immediate return!</description></item>
-		/// <item><term>ResponseFailTimeInterval</term><description>if shiftTime would be exceeded by current step</description></item>
-		/// <item><term>ResponseOverload</term><description>if torque &gt; 0</description></item>
-		/// <item><term>ResponseUnderload</term><description>if torque &lt; 0</description></item>
-		/// <item><term>else</term><description>Response from NextComponent</description></item>
-		/// </list>
-		/// </returns>
-		private IResponse RequestGearDisengaged(Second absTime, Second dt, NewtonMeter outTorque, PerSecond outAngularVelocity,
-			bool dryRun)
-		{
-			Disengaged = true;
-			Log.Debug("Current Gear: Neutral");
-
-			var avgAngularVelocity = (PreviousState.OutAngularVelocity + outAngularVelocity) / 2.0;
-
-			var gear = NextGear.Gear;
-
-			var avgOutAngularVelocity = (PreviousState.OutAngularVelocity + outAngularVelocity) / 2.0;
-			var inTorqueLossResult = ModelData.Gears[gear].LossMap.GetTorqueLoss(avgOutAngularVelocity, outTorque);
-			var inTorque = outTorque / ModelData.Gears[gear].Ratio + inTorqueLossResult.Value;
-
-			var inAngularVelocity = outAngularVelocity * ModelData.Gears[gear].Ratio;
-			var inertiaTorqueLossOut = !inAngularVelocity.IsEqual(0)
-				? Formulas.InertiaPower(outAngularVelocity, PreviousState.OutAngularVelocity, ModelData.Inertia, dt) /
-				avgOutAngularVelocity
-				: 0.SI<NewtonMeter>();
-			inTorque += inertiaTorqueLossOut / ModelData.Gears[gear].Ratio;
-			var avgInAngularVelocity = (PreviousState.InAngularVelocity + inAngularVelocity) / 2.0;
-
-			if (dryRun) {
-				// if gearbox is disengaged the 0[W]-line is the limit for drag and full load.
-				var delta = inTorque * avgInAngularVelocity;
-				return new ResponseDryRun {
-					Source = this,
-					GearboxPowerRequest = delta,
-					DeltaDragLoad = delta,
-					DeltaFullLoad = delta,
-				};
-			}
-
-			var shiftTimeExceeded = absTime.IsSmaller(_engageTime) &&
-									_engageTime.IsSmaller(absTime + dt, Constants.SimulationSettings.LowerBoundTimeInterval);
-			// allow 5% tolerance of shift time
-			if (shiftTimeExceeded && _engageTime - absTime > Constants.SimulationSettings.LowerBoundTimeInterval / 2) {
-				return new ResponseFailTimeInterval {
-					Source = this,
-					DeltaT = _engageTime - absTime,
-					GearboxPowerRequest = outTorque * (PreviousState.OutAngularVelocity + outAngularVelocity) / 2.0
-				};
-			}
-
-			if ((inTorque * avgInAngularVelocity).IsGreater(0.SI<Watt>(), Constants.SimulationSettings.LineSearchTolerance)) {
-				return new ResponseOverload {
-					Source = this,
-					Delta = inTorque * avgInAngularVelocity,
-					GearboxPowerRequest = inTorque * avgInAngularVelocity
-				};
-			}
-
-			if ((inTorque * avgInAngularVelocity).IsSmaller(0.SI<Watt>(), Constants.SimulationSettings.LineSearchTolerance)) {
-				return new ResponseUnderload {
-					Source = this,
-					Delta = inTorque * avgInAngularVelocity,
-					GearboxPowerRequest = inTorque * avgInAngularVelocity
-				};
-			}
-
-			//var inTorque = 0.SI<NewtonMeter>();
-			if (avgInAngularVelocity.Equals(0.SI<PerSecond>())) {
-				inTorque = 0.SI<NewtonMeter>();
-			}
-
-			CurrentState.SetState(inTorque, inAngularVelocity, outTorque,
-				outAngularVelocity);
-			CurrentState.Gear = gear;
-			CurrentState.TransmissionTorqueLoss = inTorque * ModelData.Gears[gear].Ratio - outTorque;
-
-			var response = NextComponent.Request(absTime, dt, 0.SI<NewtonMeter>(), inAngularVelocity);
-
-			//CurrentState.InAngularVelocity = response.EngineSpeed;
-
-			response.GearboxPowerRequest = outTorque * avgAngularVelocity;
-
-			return response;
-		}
-
-		/// <summary>
-		/// Requests the gearbox in engaged mode. Sets the gear if no gear was set previously.
-		/// </summary>
-		/// <returns>
-		/// <list type="bullet">
-		/// <item><term>ResponseGearShift</term><description>if a shift is needed.</description></item>
-		/// <item><term>else</term><description>Response from NextComponent.</description></item>
-		/// </list>
-		/// </returns>
-		private IResponse RequestGearEngaged(Second absTime, Second dt, NewtonMeter outTorque, PerSecond outAngularVelocity,
-			bool dryRun)
-		{
-			// Set a Gear if no gear was set and engineSpeed is not zero
-			//if (!Disengaged && DataBus.VehicleStopped && !outAngularVelocity.IsEqual(0))
-			//{
-			//	Gear = _strategy.InitGear(absTime, dt, outTorque, outAngularVelocity);
-			//}
-			if (Disengaged && !outAngularVelocity.IsEqual(0)) {
-				Disengaged = false;
-				var lastGear = Gear;
-				Gear = DataBus.VehicleStopped
-					? _strategy.InitGear(absTime, dt, outTorque, outAngularVelocity)
-					: _strategy.Engage(absTime, dt, outTorque, outAngularVelocity);
-				if (!DataBus.VehicleStopped) {
-					if (Gear > lastGear) {
-						LastUpshift = absTime;
-					}
-					if (Gear < lastGear) {
-						LastDownshift = absTime;
-					}
-				}
-				Log.Debug("Gearbox engaged gear {0}", Gear);
-			}
-
-			var inAngularVelocity = outAngularVelocity * ModelData.Gears[Gear].Ratio;
-			var avgInAngularVelocity = (PreviousState.InAngularVelocity + inAngularVelocity) / 2.0;
-			var avgOutAngularVelocity = (PreviousState.OutAngularVelocity + outAngularVelocity) / 2.0;
-			var inTorqueLossResult = ModelData.Gears[Gear].LossMap.GetTorqueLoss(avgOutAngularVelocity, outTorque);
-			var inTorque = !avgInAngularVelocity.IsEqual(0)
-				? outTorque * (avgOutAngularVelocity / avgInAngularVelocity)
-				: outTorque / ModelData.Gears[Gear].Ratio;
-			inTorque += inTorqueLossResult.Value;
-
-			var inertiaTorqueLossOut = !inAngularVelocity.IsEqual(0)
-				? Formulas.InertiaPower(outAngularVelocity, PreviousState.OutAngularVelocity, ModelData.Inertia, dt) /
-				avgOutAngularVelocity
-				: 0.SI<NewtonMeter>();
-			inTorque += inertiaTorqueLossOut / ModelData.Gears[Gear].Ratio;
-
-			if (dryRun) {
-				var inertiaTorqueLossIn = avgOutAngularVelocity.IsEqual(0, 1e-9)
-					? 0.SI<NewtonMeter>()
-					: Formulas.InertiaPower(outAngularVelocity, PreviousState.OutAngularVelocity, ModelData.Inertia, dt) /
-					avgOutAngularVelocity / ModelData.Gears[Gear].Ratio;
-				var dryRunResponse = NextComponent.Request(absTime, dt, inTorque + inertiaTorqueLossIn, inAngularVelocity, true);
-				dryRunResponse.GearboxPowerRequest = outTorque * (PreviousState.OutAngularVelocity + outAngularVelocity) / 2.0;
-				return dryRunResponse;
-			}
-
-			var response = NextComponent.Request(absTime, dt, inTorque, inAngularVelocity);
-			var shiftAllowed = !inAngularVelocity.IsEqual(0) && !DataBus.VehicleSpeed.IsEqual(0);
-
-			if (response is ResponseSuccess && shiftAllowed) {
-				var shiftRequired = _strategy.ShiftRequired(absTime, dt, outTorque, outAngularVelocity, inTorque,
-					response.EngineSpeed, Gear, _engageTime);
-
-				if (shiftRequired) {
-					_engageTime = absTime + ModelData.TractionInterruption;
-
-					Log.Debug("Gearbox is shifting. absTime: {0}, dt: {1}, interuptionTime: {2}, out: ({3}, {4}), in: ({5}, {6})",
-						absTime,
-						dt, _engageTime, outTorque, outAngularVelocity, inTorque, inAngularVelocity);
-
-					Disengaged = true;
-					_strategy.Disengage(absTime, dt, outTorque, outAngularVelocity);
-					Log.Info("Gearbox disengaged");
-
-					return new ResponseGearShift {
-						Source = this,
-						SimulationInterval = ModelData.TractionInterruption,
-						GearboxPowerRequest = outTorque * (PreviousState.OutAngularVelocity + outAngularVelocity) / 2.0
-					};
-				}
-			}
-
-			// this code has to be _after_ the check for a potential gear-shift!
-			// (the above block issues dry-run requests and thus may update the CurrentState!)
-			// begin critical section
-			CurrentState.TransmissionTorqueLoss = inTorque * ModelData.Gears[Gear].Ratio - outTorque;
-			// MQ 19.2.2016: check! inertia is related to output side, torque loss accounts to input side
-			CurrentState.InertiaTorqueLossOut = inertiaTorqueLossOut;
-
-
-			CurrentState.TorqueLossResult = inTorqueLossResult;
-			CurrentState.SetState(inTorque, inAngularVelocity, outTorque, outAngularVelocity);
-			CurrentState.Gear = Gear;
-			// end critical section
-
-
-			response.GearboxPowerRequest = outTorque * (PreviousState.OutAngularVelocity + CurrentState.OutAngularVelocity) / 2.0;
-
-			return response;
-		}
-
-		protected override void DoWriteModalResults(IModalDataContainer container)
-		{
-			var avgInAngularSpeed = (PreviousState.InAngularVelocity + CurrentState.InAngularVelocity) / 2.0;
-			var avgOutAngularSpeed = (PreviousState.OutAngularVelocity + CurrentState.OutAngularVelocity) / 2.0;
-			// (PreviousState.OutAngularVelocity +
-			//CurrentState.OutAngularVelocity) / 2.0 * ModelData.Gears[Gear].Ratio;
-			var inPower = CurrentState.InTorque * avgInAngularSpeed;
-			var outPower = CurrentState.OutTorque * avgOutAngularSpeed;
-			container[ModalResultField.Gear] = Disengaged || DataBus.VehicleStopped ? 0 : Gear;
-			container[ModalResultField.P_gbx_loss] = inPower - outPower;
-			//CurrentState.TransmissionTorqueLoss * avgOutAngularSpeed;
-			container[ModalResultField.P_gbx_inertia] = CurrentState.InertiaTorqueLossOut * avgOutAngularSpeed;
-			container[ModalResultField.P_gbx_in] = inPower;
-			container[ModalResultField.n_gbx_out_avg] = (PreviousState.OutAngularVelocity +
-														CurrentState.OutAngularVelocity) / 2.0;
-			container[ModalResultField.T_gbx_out] = CurrentState.OutTorque;
-		}
-
-		protected override void DoCommitSimulationStep()
-		{
-			if (!Disengaged) {
-				if (CurrentState.TorqueLossResult != null && CurrentState.TorqueLossResult.Extrapolated) {
-					Log.Warn(
-						"Gear {0} LossMap data was extrapolated: range for loss map is not sufficient: n:{1}, torque:{2}, ratio:{3}",
-						Gear, CurrentState.OutAngularVelocity.ConvertTo().Rounds.Per.Minute, CurrentState.OutTorque,
-						ModelData.Gears[Gear].Ratio);
-					if (DataBus.ExecutionMode == ExecutionMode.Declaration) {
-						throw new VectoException(
-							"Gear {0} LossMap data was extrapolated in Declaration Mode: range for loss map is not sufficient: n:{1}, torque:{2}, ratio:{3}",
-							Gear, CurrentState.InAngularVelocity.ConvertTo().Rounds.Per.Minute, CurrentState.InTorque,
-							ModelData.Gears[Gear].Ratio);
-					}
-				}
-			}
-			if (DataBus.VehicleStopped) {
-				Disengaged = true;
-				_engageTime = -double.MaxValue.SI<Second>();
-			}
-			base.DoCommitSimulationStep();
-		}
-	}
+using TUGraz.VectoCommon.Exceptions;
+using TUGraz.VectoCommon.Models;
+using TUGraz.VectoCommon.Utils;
+using TUGraz.VectoCore.Configuration;
+using TUGraz.VectoCore.Models.Connector.Ports.Impl;
+using TUGraz.VectoCore.Models.Simulation;
+using TUGraz.VectoCore.Models.Simulation.Data;
+using TUGraz.VectoCore.Models.Simulation.DataBus;
+using TUGraz.VectoCore.OutputData;
+using TUGraz.VectoCore.Utils;
+
+namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
+{
+	public class Gearbox : AbstractGearbox<GearboxState>
+	{
+		/// <summary>
+		/// The shift strategy.
+		/// </summary>
+		private readonly IShiftStrategy _strategy;
+
+		/// <summary>
+		/// Time when a gearbox shift engages a new gear (shift is finished). Is set when shifting is needed.
+		/// </summary>
+		private Second _engageTime = 0.SI<Second>();
+
+		/// <summary>
+		/// True if gearbox is disengaged (no gear is set).
+		/// </summary>
+		protected internal bool Disengaged = true;
+
+		public Second LastUpshift { get; protected internal set; }
+
+		public Second LastDownshift { get; protected internal set; }
+
+		public override GearInfo NextGear
+		{
+			get { return _strategy.NextGear; }
+		}
+
+		public override bool ClutchClosed(Second absTime)
+		{
+			return _engageTime.IsSmallerOrEqual(absTime);
+		}
+
+		public Gearbox(IVehicleContainer container, IShiftStrategy strategy, VectoRunData runData) : base(container, runData)
+		{
+			_strategy = strategy;
+			_strategy.Gearbox = this;
+
+			LastDownshift = -double.MaxValue.SI<Second>();
+			LastUpshift = -double.MaxValue.SI<Second>();
+		}
+
+		public override IResponse Initialize(NewtonMeter outTorque, PerSecond outAngularVelocity)
+		{
+			var absTime = 0.SI<Second>();
+			var dt = Constants.SimulationSettings.TargetTimeInterval;
+
+			_engageTime = -double.MaxValue.SI<Second>();
+
+			if (Disengaged) {
+				Gear = _strategy.InitGear(absTime, dt, outTorque, outAngularVelocity);
+			}
+
+			var inAngularVelocity = outAngularVelocity * ModelData.Gears[Gear].Ratio;
+			var gearboxTorqueLoss = ModelData.Gears[Gear].LossMap.GetTorqueLoss(outAngularVelocity, outTorque);
+			CurrentState.TorqueLossResult = gearboxTorqueLoss;
+
+			var inTorque = outTorque / ModelData.Gears[Gear].Ratio
+							+ gearboxTorqueLoss.Value;
+
+			PreviousState.SetState(inTorque, inAngularVelocity, outTorque, outAngularVelocity);
+			PreviousState.InertiaTorqueLossOut = 0.SI<NewtonMeter>();
+			PreviousState.Gear = Gear;
+			Disengaged = false;
+
+			var response = NextComponent.Initialize(inTorque, inAngularVelocity);
+
+			return response;
+		}
+
+		internal ResponseDryRun Initialize(uint gear, NewtonMeter outTorque, PerSecond outAngularVelocity)
+		{
+			var oldGear = Gear;
+			Gear = gear;
+			var inAngularVelocity = outAngularVelocity * ModelData.Gears[gear].Ratio;
+			var torqueLossResult = ModelData.Gears[gear].LossMap.GetTorqueLoss(outAngularVelocity, outTorque);
+			CurrentState.TorqueLossResult = torqueLossResult;
+			var inTorque = outTorque / ModelData.Gears[gear].Ratio + torqueLossResult.Value;
+
+			if (!inAngularVelocity.IsEqual(0)) {
+				var alpha = ModelData.Inertia.IsEqual(0)
+					? 0.SI<PerSquareSecond>()
+					: outTorque / ModelData.Inertia;
+
+				var inertiaPowerLoss = Formulas.InertiaPower(inAngularVelocity, alpha, ModelData.Inertia,
+					Constants.SimulationSettings.TargetTimeInterval);
+				inTorque += inertiaPowerLoss / inAngularVelocity;
+			}
+
+			var response =
+				(ResponseDryRun)
+					NextComponent.Request(0.SI<Second>(), Constants.SimulationSettings.TargetTimeInterval, inTorque,
+						inAngularVelocity, true); //NextComponent.Initialize(inTorque, inAngularVelocity);
+			//response.Switch().
+			//	Case<ResponseSuccess>().
+			//	Case<ResponseOverload>().
+			//	Case<ResponseUnderload>().
+			//	Default(r => { throw new UnexpectedResponseException("Gearbox.Initialize", r); });
+
+			var fullLoad = DataBus.EngineStationaryFullPower(inAngularVelocity);
+
+			Gear = oldGear;
+			return new ResponseDryRun {
+				Source = this,
+				EnginePowerRequest = response.EnginePowerRequest,
+				EngineSpeed = response.EngineSpeed,
+				DynamicFullLoadPower = response.DynamicFullLoadPower,
+				ClutchPowerRequest = response.ClutchPowerRequest,
+				GearboxPowerRequest = outTorque * outAngularVelocity,
+				DeltaFullLoad = response.EnginePowerRequest - fullLoad
+			};
+		}
+
+		/// <summary>
+		/// Requests the Gearbox to deliver torque and angularVelocity
+		/// </summary>
+		/// <returns>
+		/// <list type="bullet">
+		/// <item><description>ResponseDryRun</description></item>
+		/// <item><description>ResponseOverload</description></item>
+		/// <item><description>ResponseGearshift</description></item>
+		/// </list>
+		/// </returns>
+		public override IResponse Request(Second absTime, Second dt, NewtonMeter outTorque, PerSecond outAngularVelocity,
+			bool dryRun = false)
+		{
+			IterationStatistics.Increment(this, "Requests");
+
+			Log.Debug("Gearbox Power Request: torque: {0}, angularVelocity: {1}", outTorque, outAngularVelocity);
+			if (DataBus.VehicleStopped) {
+				_engageTime = absTime;
+				LastDownshift = -double.MaxValue.SI<Second>();
+				LastUpshift = -double.MaxValue.SI<Second>();
+			}
+			if (DataBus.DriverBehavior == DrivingBehavior.Halted) {
+				_engageTime = absTime + dt;
+			}
+
+			if (DataBus.DriverBehavior == DrivingBehavior.Braking && (DataBus.BrakePower.IsGreater(0) || outTorque < 0) &&
+				DataBus.VehicleSpeed.IsSmaller(Constants.SimulationSettings.ClutchDisengageWhenHaltingSpeed)) {
+				_engageTime = VectoMath.Max(_engageTime, absTime + dt);
+
+				return RequestGearDisengaged(absTime, dt, outTorque, outAngularVelocity, dryRun);
+			}
+
+			return ClutchClosed(absTime)
+				? RequestGearEngaged(absTime, dt, outTorque, outAngularVelocity, dryRun)
+				: RequestGearDisengaged(absTime, dt, outTorque, outAngularVelocity, dryRun);
+		}
+
+		/// <summary>
+		/// Requests the Gearbox in Disengaged mode
+		/// </summary>
+		/// <returns>
+		/// <list type="bullet">
+		/// <item><term>ResponseDryRun</term><description>if dryRun, immediate return!</description></item>
+		/// <item><term>ResponseFailTimeInterval</term><description>if shiftTime would be exceeded by current step</description></item>
+		/// <item><term>ResponseOverload</term><description>if torque &gt; 0</description></item>
+		/// <item><term>ResponseUnderload</term><description>if torque &lt; 0</description></item>
+		/// <item><term>else</term><description>Response from NextComponent</description></item>
+		/// </list>
+		/// </returns>
+		private IResponse RequestGearDisengaged(Second absTime, Second dt, NewtonMeter outTorque, PerSecond outAngularVelocity,
+			bool dryRun)
+		{
+			Disengaged = true;
+			Log.Debug("Current Gear: Neutral");
+
+			var avgAngularVelocity = (PreviousState.OutAngularVelocity + outAngularVelocity) / 2.0;
+
+			var gear = NextGear.Gear;
+
+			var avgOutAngularVelocity = (PreviousState.OutAngularVelocity + outAngularVelocity) / 2.0;
+			var inTorqueLossResult = ModelData.Gears[gear].LossMap.GetTorqueLoss(avgOutAngularVelocity, outTorque);
+			var inTorque = outTorque / ModelData.Gears[gear].Ratio + inTorqueLossResult.Value;
+
+			var inAngularVelocity = outAngularVelocity * ModelData.Gears[gear].Ratio;
+			var inertiaTorqueLossOut = !inAngularVelocity.IsEqual(0)
+				? Formulas.InertiaPower(outAngularVelocity, PreviousState.OutAngularVelocity, ModelData.Inertia, dt) /
+				avgOutAngularVelocity
+				: 0.SI<NewtonMeter>();
+			inTorque += inertiaTorqueLossOut / ModelData.Gears[gear].Ratio;
+			var avgInAngularVelocity = (PreviousState.InAngularVelocity + inAngularVelocity) / 2.0;
+
+			if (dryRun) {
+				// if gearbox is disengaged the 0[W]-line is the limit for drag and full load.
+				var delta = inTorque * avgInAngularVelocity;
+				return new ResponseDryRun {
+					Source = this,
+					GearboxPowerRequest = delta,
+					DeltaDragLoad = delta,
+					DeltaFullLoad = delta,
+				};
+			}
+
+			var shiftTimeExceeded = absTime.IsSmaller(_engageTime) &&
+									_engageTime.IsSmaller(absTime + dt, Constants.SimulationSettings.LowerBoundTimeInterval);
+			// allow 5% tolerance of shift time
+			if (shiftTimeExceeded && _engageTime - absTime > Constants.SimulationSettings.LowerBoundTimeInterval / 2) {
+				return new ResponseFailTimeInterval {
+					Source = this,
+					DeltaT = _engageTime - absTime,
+					GearboxPowerRequest = outTorque * (PreviousState.OutAngularVelocity + outAngularVelocity) / 2.0
+				};
+			}
+
+			if ((inTorque * avgInAngularVelocity).IsGreater(0.SI<Watt>(), Constants.SimulationSettings.LineSearchTolerance)) {
+				return new ResponseOverload {
+					Source = this,
+					Delta = inTorque * avgInAngularVelocity,
+					GearboxPowerRequest = inTorque * avgInAngularVelocity
+				};
+			}
+
+			if ((inTorque * avgInAngularVelocity).IsSmaller(0.SI<Watt>(), Constants.SimulationSettings.LineSearchTolerance)) {
+				return new ResponseUnderload {
+					Source = this,
+					Delta = inTorque * avgInAngularVelocity,
+					GearboxPowerRequest = inTorque * avgInAngularVelocity
+				};
+			}
+
+			//var inTorque = 0.SI<NewtonMeter>();
+			if (avgInAngularVelocity.Equals(0.SI<PerSecond>())) {
+				inTorque = 0.SI<NewtonMeter>();
+			}
+
+			CurrentState.SetState(inTorque, inAngularVelocity, outTorque,
+				outAngularVelocity);
+			CurrentState.Gear = gear;
+			CurrentState.TransmissionTorqueLoss = inTorque * ModelData.Gears[gear].Ratio - outTorque;
+
+			var response = NextComponent.Request(absTime, dt, 0.SI<NewtonMeter>(), inAngularVelocity);
+
+			//CurrentState.InAngularVelocity = response.EngineSpeed;
+
+			response.GearboxPowerRequest = outTorque * avgAngularVelocity;
+
+			return response;
+		}
+
+		/// <summary>
+		/// Requests the gearbox in engaged mode. Sets the gear if no gear was set previously.
+		/// </summary>
+		/// <returns>
+		/// <list type="bullet">
+		/// <item><term>ResponseGearShift</term><description>if a shift is needed.</description></item>
+		/// <item><term>else</term><description>Response from NextComponent.</description></item>
+		/// </list>
+		/// </returns>
+		private IResponse RequestGearEngaged(Second absTime, Second dt, NewtonMeter outTorque, PerSecond outAngularVelocity,
+			bool dryRun)
+		{
+			// Set a Gear if no gear was set and engineSpeed is not zero
+			//if (!Disengaged && DataBus.VehicleStopped && !outAngularVelocity.IsEqual(0))
+			//{
+			//	Gear = _strategy.InitGear(absTime, dt, outTorque, outAngularVelocity);
+			//}
+			if (Disengaged && !outAngularVelocity.IsEqual(0)) {
+				ReEngageGear(absTime, dt, outTorque, outAngularVelocity);
+				Log.Debug("Gearbox engaged gear {0}", Gear);
+			}
+
+			var inAngularVelocity = outAngularVelocity * ModelData.Gears[Gear].Ratio;
+			var avgInAngularVelocity = (PreviousState.InAngularVelocity + inAngularVelocity) / 2.0;
+			var avgOutAngularVelocity = (PreviousState.OutAngularVelocity + outAngularVelocity) / 2.0;
+			var inTorqueLossResult = ModelData.Gears[Gear].LossMap.GetTorqueLoss(avgOutAngularVelocity, outTorque);
+			var inTorque = !avgInAngularVelocity.IsEqual(0)
+				? outTorque * (avgOutAngularVelocity / avgInAngularVelocity)
+				: outTorque / ModelData.Gears[Gear].Ratio;
+			inTorque += inTorqueLossResult.Value;
+
+			var inertiaTorqueLossOut = !inAngularVelocity.IsEqual(0)
+				? Formulas.InertiaPower(outAngularVelocity, PreviousState.OutAngularVelocity, ModelData.Inertia, dt) /
+				avgOutAngularVelocity
+				: 0.SI<NewtonMeter>();
+			inTorque += inertiaTorqueLossOut / ModelData.Gears[Gear].Ratio;
+
+			if (dryRun) {
+				var inertiaTorqueLossIn = avgOutAngularVelocity.IsEqual(0, 1e-9)
+					? 0.SI<NewtonMeter>()
+					: Formulas.InertiaPower(outAngularVelocity, PreviousState.OutAngularVelocity, ModelData.Inertia, dt) /
+					avgOutAngularVelocity / ModelData.Gears[Gear].Ratio;
+				var dryRunResponse = NextComponent.Request(absTime, dt, inTorque + inertiaTorqueLossIn, inAngularVelocity, true);
+				dryRunResponse.GearboxPowerRequest = outTorque * (PreviousState.OutAngularVelocity + outAngularVelocity) / 2.0;
+				return dryRunResponse;
+			}
+
+			var response = NextComponent.Request(absTime, dt, inTorque, inAngularVelocity);
+			var shiftAllowed = !inAngularVelocity.IsEqual(0) && !DataBus.VehicleSpeed.IsEqual(0);
+
+			if (response is ResponseSuccess && shiftAllowed) {
+				var shiftRequired = _strategy.ShiftRequired(absTime, dt, outTorque, outAngularVelocity, inTorque,
+					response.EngineSpeed, Gear, _engageTime);
+
+				if (shiftRequired) {
+					_engageTime = absTime + ModelData.TractionInterruption;
+
+					Log.Debug("Gearbox is shifting. absTime: {0}, dt: {1}, interuptionTime: {2}, out: ({3}, {4}), in: ({5}, {6})",
+						absTime,
+						dt, _engageTime, outTorque, outAngularVelocity, inTorque, inAngularVelocity);
+
+					Disengaged = true;
+					_strategy.Disengage(absTime, dt, outTorque, outAngularVelocity);
+					Log.Info("Gearbox disengaged");
+
+					return new ResponseGearShift {
+						Source = this,
+						SimulationInterval = ModelData.TractionInterruption,
+						GearboxPowerRequest = outTorque * (PreviousState.OutAngularVelocity + outAngularVelocity) / 2.0
+					};
+				}
+			}
+
+			// this code has to be _after_ the check for a potential gear-shift!
+			// (the above block issues dry-run requests and thus may update the CurrentState!)
+			// begin critical section
+			CurrentState.TransmissionTorqueLoss = inTorque * ModelData.Gears[Gear].Ratio - outTorque;
+			// MQ 19.2.2016: check! inertia is related to output side, torque loss accounts to input side
+			CurrentState.InertiaTorqueLossOut = inertiaTorqueLossOut;
+
+
+			CurrentState.TorqueLossResult = inTorqueLossResult;
+			CurrentState.SetState(inTorque, inAngularVelocity, outTorque, outAngularVelocity);
+			CurrentState.Gear = Gear;
+			// end critical section
+
+
+			response.GearboxPowerRequest = outTorque * (PreviousState.OutAngularVelocity + CurrentState.OutAngularVelocity) / 2.0;
+
+			return response;
+		}
+
+		private void ReEngageGear(Second absTime, Second dt, NewtonMeter outTorque, PerSecond outAngularVelocity)
+		{
+			Disengaged = false;
+			var lastGear = Gear;
+			Gear = DataBus.VehicleStopped
+				? _strategy.InitGear(absTime, dt, outTorque, outAngularVelocity)
+				: _strategy.Engage(absTime, dt, outTorque, outAngularVelocity);
+			if (!DataBus.VehicleStopped) {
+				if (Gear > lastGear) {
+					LastUpshift = absTime;
+				}
+				if (Gear < lastGear) {
+					LastDownshift = absTime;
+				}
+			}
+		}
+
+		protected override void DoWriteModalResults(IModalDataContainer container)
+		{
+			var avgInAngularSpeed = (PreviousState.InAngularVelocity + CurrentState.InAngularVelocity) / 2.0;
+			var avgOutAngularSpeed = (PreviousState.OutAngularVelocity + CurrentState.OutAngularVelocity) / 2.0;
+			// (PreviousState.OutAngularVelocity +
+			//CurrentState.OutAngularVelocity) / 2.0 * ModelData.Gears[Gear].Ratio;
+			var inPower = CurrentState.InTorque * avgInAngularSpeed;
+			var outPower = CurrentState.OutTorque * avgOutAngularSpeed;
+			container[ModalResultField.Gear] = Disengaged || DataBus.VehicleStopped ? 0 : Gear;
+			container[ModalResultField.P_gbx_loss] = inPower - outPower;
+			//CurrentState.TransmissionTorqueLoss * avgOutAngularSpeed;
+			container[ModalResultField.P_gbx_inertia] = CurrentState.InertiaTorqueLossOut * avgOutAngularSpeed;
+			container[ModalResultField.P_gbx_in] = inPower;
+			container[ModalResultField.n_gbx_out_avg] = (PreviousState.OutAngularVelocity +
+														CurrentState.OutAngularVelocity) / 2.0;
+			container[ModalResultField.T_gbx_out] = CurrentState.OutTorque;
+		}
+
+		protected override void DoCommitSimulationStep()
+		{
+			if (!Disengaged) {
+				if (CurrentState.TorqueLossResult != null && CurrentState.TorqueLossResult.Extrapolated) {
+					Log.Warn(
+						"Gear {0} LossMap data was extrapolated: range for loss map is not sufficient: n:{1}, torque:{2}, ratio:{3}",
+						Gear, CurrentState.OutAngularVelocity.ConvertTo().Rounds.Per.Minute, CurrentState.OutTorque,
+						ModelData.Gears[Gear].Ratio);
+					if (DataBus.ExecutionMode == ExecutionMode.Declaration) {
+						throw new VectoException(
+							"Gear {0} LossMap data was extrapolated in Declaration Mode: range for loss map is not sufficient: n:{1}, torque:{2}, ratio:{3}",
+							Gear, CurrentState.InAngularVelocity.ConvertTo().Rounds.Per.Minute, CurrentState.InTorque,
+							ModelData.Gears[Gear].Ratio);
+					}
+				}
+			}
+			if (DataBus.VehicleStopped) {
+				Disengaged = true;
+				_engageTime = -double.MaxValue.SI<Second>();
+			}
+			base.DoCommitSimulationStep();
+		}
+	}
 }
\ No newline at end of file
diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/MeasuredSpeedDrivingCycle.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/MeasuredSpeedDrivingCycle.cs
index cecf32836f9773c7399efb08d54627d8efbc3888..424e42675af0b118fa62556b85e7a1cc3d86777b 100644
--- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/MeasuredSpeedDrivingCycle.cs
+++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/MeasuredSpeedDrivingCycle.cs
@@ -29,337 +29,358 @@
 *   Martin Rexeis, rexeis@ivt.tugraz.at, IVT, Graz University of Technology
 */
 
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using TUGraz.VectoCommon.Exceptions;
-using TUGraz.VectoCommon.Models;
-using TUGraz.VectoCommon.Utils;
-using TUGraz.VectoCore.Configuration;
-using TUGraz.VectoCore.Models.Connector.Ports;
-using TUGraz.VectoCore.Models.Connector.Ports.Impl;
-using TUGraz.VectoCore.Models.Simulation;
-using TUGraz.VectoCore.Models.Simulation.Data;
-using TUGraz.VectoCore.Models.Simulation.DataBus;
-using TUGraz.VectoCore.Models.SimulationComponent.Data;
-using TUGraz.VectoCore.OutputData;
-using TUGraz.VectoCore.Utils;
-
-namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
-{
-	/// <summary>
-	/// Driving Cycle for the Measured Speed Gear driving cycle.
-	/// </summary>
-	public class MeasuredSpeedDrivingCycle :
-		StatefulProviderComponent
-			<MeasuredSpeedDrivingCycle.DrivingCycleState, ISimulationOutPort, IDriverDemandInPort, IDriverDemandOutPort>,
-		IDriverInfo, IDrivingCycleInfo, IMileageCounter, IDriverDemandInProvider, IDriverDemandInPort, ISimulationOutProvider,
-		ISimulationOutPort
-	{
-		public class DrivingCycleState
-		{
-			public DrivingCycleState Clone()
-			{
-				return new DrivingCycleState {
-					Distance = Distance,
-				};
-			}
-
-			public Meter Distance;
-			public Meter SimulationDistance;
-			public MeterPerSquareSecond Acceleration;
-		}
-
-		protected readonly IDrivingCycleData Data;
-
-		protected internal readonly DrivingCycleEnumerator CycleIterator;
-
-		protected Second AbsTime { get; set; }
-
-		/// <summary>
-		/// Initializes a new instance of the <see cref="PowertrainDrivingCycle"/> class.
-		/// </summary>
-		/// <param name="container">The container.</param>
-		/// <param name="cycle">The cycle.</param>
-		public MeasuredSpeedDrivingCycle(IVehicleContainer container, IDrivingCycleData cycle)
-			: base(container)
-		{
-			Data = cycle;
-			CycleIterator = new DrivingCycleEnumerator(cycle);
-
-			PreviousState = new DrivingCycleState {
-				Distance = 0.SI<Meter>(),
-			};
-			CurrentState = PreviousState.Clone();
-		}
-
-		public IResponse Initialize()
-		{
-			var first = Data.Entries.First();
-
-			AbsTime = first.Time;
-
-			var response = NextComponent.Initialize(first.VehicleTargetSpeed, first.RoadGradient);
-			if (!(response is ResponseSuccess)) {
-				throw new UnexpectedResponseException("MeasuredSpeedDrivingCycle: Couldn't find start gear.", response);
-			}
-
-			response.AbsTime = AbsTime;
-			return response;
-		}
-
-		public IResponse Request(Second absTime, Meter ds)
-		{
-			Log.Fatal("MeasuredSpeed Cycle can not handle distance request.");
-			throw new VectoSimulationException("MeasuredSpeed Cycle can not handle distance request.");
-		}
-
-		public virtual IResponse Request(Second absTime, Second dt)
-		{
-			var debug = new DebugData();
-
-			// cycle finished
-			if (CycleIterator.LastEntry && absTime >= CycleIterator.RightSample.Time) {
-				return new ResponseCycleFinished { AbsTime = absTime, Source = this };
-			}
-
-			if (CycleIterator.RightSample == null) {
-				throw new VectoException("Exceeding cycle!");
-			}
-			// interval exceeded
-			if ((absTime + dt).IsGreater(CycleIterator.RightSample.Time)) {
-				return new ResponseFailTimeInterval {
-					AbsTime = absTime,
-					Source = this,
-					DeltaT = CycleIterator.RightSample.Time - absTime
-				};
-			}
-
-			// calc acceleration from speed diff vehicle to cycle
-			var targetSpeed = CycleIterator.RightSample.VehicleTargetSpeed;
-			if (targetSpeed.IsEqual(0.KMPHtoMeterPerSecond(), 0.5.KMPHtoMeterPerSecond())) {
-				targetSpeed = 0.KMPHtoMeterPerSecond();
-			}
-			var deltaV = targetSpeed - DataBus.VehicleSpeed;
-			var deltaT = CycleIterator.RightSample.Time - CycleIterator.LeftSample.Time;
-
-			if (DataBus.VehicleSpeed.IsSmaller(0)) {
-				throw new VectoSimulationException("vehicle velocity is smaller than zero");
-			}
-
-			if (deltaT.IsSmaller(0)) {
-				throw new VectoSimulationException("deltaT is smaller than zero");
-			}
-
-			var acceleration = deltaV / deltaT;
-			var gradient = CycleIterator.LeftSample.RoadGradient;
-			DriverAcceleration = acceleration;
-			DriverBehavior = acceleration < 0
-				? DriverBehavior = DrivingBehavior.Braking
-				: DriverBehavior = DrivingBehavior.Driving;
-			if (DataBus.VehicleStopped && acceleration.IsEqual(0)) {
-				DriverBehavior = DrivingBehavior.Halted;
-			}
-
-			IResponse response;
-			var responseCount = 0;
-			do {
-				response = NextComponent.Request(absTime, dt, acceleration, gradient);
-				debug.Add(response);
-				response.Switch()
-					.Case<ResponseGearShift>(() => response = NextComponent.Request(absTime, dt, acceleration, gradient))
-					.Case<ResponseUnderload>(r => {
-						var acceleration1 = acceleration;
-						DataBus.BrakePower = SearchAlgorithm.Search(DataBus.BrakePower, r.Delta, -r.Delta,
-							getYValue: result => DataBus.ClutchClosed(absTime)
-								? ((ResponseDryRun)result).DeltaDragLoad
-								: ((ResponseDryRun)result).GearboxPowerRequest,
-							evaluateFunction: x => {
-								DataBus.BrakePower = x;
-								return NextComponent.Request(absTime, dt, acceleration1, gradient, true);
-							},
-							criterion: y => DataBus.ClutchClosed(absTime)
-								? ((ResponseDryRun)y).DeltaDragLoad.Value()
-								: ((ResponseDryRun)y).GearboxPowerRequest.Value());
-						Log.Info(
-							"Found operating point for braking. absTime: {0}, dt: {1}, acceleration: {2}, gradient: {3}, BrakePower: {4}",
-							absTime, dt, acceleration, gradient, DataBus.BrakePower);
-
-						if (DataBus.BrakePower.IsSmaller(0)) {
-							Log.Info(
-								"BrakePower was negative: {4}. Setting to 0 and searching for acceleration operating point. absTime: {0}, dt: {1}, acceleration: {2}, gradient: {3}",
-								absTime, dt, acceleration, gradient, DataBus.BrakePower);
-							DataBus.BrakePower = 0.SI<Watt>();
-							acceleration = SearchAlgorithm.Search(acceleration, r.Delta,
-								Constants.SimulationSettings.OperatingPointInitialSearchIntervalAccelerating,
-								getYValue: result => ((ResponseDryRun)result).DeltaFullLoad,
-								evaluateFunction: x => NextComponent.Request(absTime, dt, x, gradient, true),
-								criterion: y => ((ResponseDryRun)y).DeltaFullLoad.Value());
-						}
-
-						response = NextComponent.Request(absTime, dt, acceleration, gradient);
-					})
-					.Case<ResponseOverload>(r => {
-						if (DataBus.ClutchClosed(absTime)) {
-							acceleration = SearchAlgorithm.Search(acceleration, r.Delta,
-								Constants.SimulationSettings.OperatingPointInitialSearchIntervalAccelerating,
-								getYValue: result => ((ResponseDryRun)result).DeltaFullLoad,
-								evaluateFunction: x => NextComponent.Request(absTime, dt, x, gradient, true),
-								criterion:
-									y => ((ResponseDryRun)y).DeltaFullLoad.Value());
-							Log.Info(
-								"Found operating point for driver acceleration. absTime: {0}, dt: {1}, acceleration: {2}, gradient: {3}",
-								absTime, dt, acceleration, gradient);
-						} else {
-							DataBus.BrakePower = SearchAlgorithm.Search(DataBus.BrakePower, r.Delta, -r.Delta,
-								getYValue: result => DataBus.ClutchClosed(absTime)
-									? ((ResponseDryRun)result).DeltaDragLoad
-									: ((ResponseDryRun)result).GearboxPowerRequest,
-								evaluateFunction: x => {
-									DataBus.BrakePower = x;
-									return NextComponent.Request(absTime, dt, acceleration, gradient, true);
-								},
-								criterion: y => DataBus.ClutchClosed(absTime)
-									? ((ResponseDryRun)y).DeltaDragLoad.Value()
-									: ((ResponseDryRun)y).GearboxPowerRequest.Value());
-							Log.Info(
-								"Found operating point for braking. absTime: {0}, dt: {1}, acceleration: {2}, gradient: {3}, BrakePower: {4}",
-								absTime, dt, acceleration, gradient, DataBus.BrakePower);
-
-							if (DataBus.BrakePower.IsSmaller(0)) {
-								Log.Info(
-									"BrakePower was negative: {4}. Setting to 0 and searching for acceleration operating point. absTime: {0}, dt: {1}, acceleration: {2}, gradient: {3}",
-									absTime, dt, acceleration, gradient, DataBus.BrakePower);
-								DataBus.BrakePower = 0.SI<Watt>();
-								acceleration = SearchAlgorithm.Search(acceleration, r.Delta,
-									Constants.SimulationSettings.OperatingPointInitialSearchIntervalAccelerating,
-									getYValue: result => ((ResponseDryRun)result).DeltaFullLoad,
-									evaluateFunction: x => NextComponent.Request(absTime, dt, x, gradient, true),
-									criterion: y => ((ResponseDryRun)y).DeltaFullLoad.Value());
-							}
-						}
-						response = NextComponent.Request(absTime, dt, acceleration, gradient);
-					})
-					.Case<ResponseEngineSpeedTooHigh>(r => {
-						acceleration = SearchAlgorithm.Search(acceleration, r.DeltaEngineSpeed,
-							Constants.SimulationSettings.OperatingPointInitialSearchIntervalAccelerating,
-							getYValue: result => ((ResponseDryRun)result).DeltaEngineSpeed,
-							evaluateFunction: x => NextComponent.Request(absTime, dt, x, gradient, true),
-							criterion:
-								y => ((ResponseDryRun)y).DeltaEngineSpeed.Value());
-						Log.Info(
-							"Found operating point for driver acceleration. absTime: {0}, dt: {1}, acceleration: {2}, gradient: {3}",
-							absTime, dt, acceleration, gradient);
-					})
-					.Case<ResponseFailTimeInterval>(r => { dt = r.DeltaT; })
-					.Case<ResponseSuccess>()
-					.Default(
-						r => { throw new UnexpectedResponseException("MeasuredSpeedDrivingCycle received an unexpected response.", r); });
-			} while (!(response is ResponseSuccess || response is ResponseFailTimeInterval) && (++responseCount < 10));
-
-			AbsTime = absTime + dt;
-
-			response.SimulationInterval = dt;
-			response.Acceleration = acceleration;
-			debug.Add(response);
-
-			CurrentState.SimulationDistance = acceleration / 2 * dt * dt + DataBus.VehicleSpeed * dt;
-			if (CurrentState.SimulationDistance.IsSmaller(0)) {
-				throw new VectoSimulationException(
-					"MeasuredSpeed: Simulation Distance must not be negative. Driving Backward is not allowed.");
-			}
-
-			CurrentState.Distance = CurrentState.SimulationDistance + PreviousState.Distance;
-			CurrentState.Acceleration = acceleration;
-
-			return response;
-		}
-
-		protected override void DoWriteModalResults(IModalDataContainer container)
-		{
-			container[ModalResultField.dist] = CurrentState.Distance;
-			container[ModalResultField.simulationDistance] = CurrentState.SimulationDistance;
-			container[ModalResultField.v_targ] = CycleIterator.LeftSample.VehicleTargetSpeed;
-			container[ModalResultField.grad] = CycleIterator.LeftSample.RoadGradientPercent;
-			container[ModalResultField.altitude] = CycleIterator.LeftSample.Altitude;
-			container[ModalResultField.acc] = CurrentState.Acceleration;
-		}
-
-		protected override void DoCommitSimulationStep()
-		{
-			if ((CycleIterator.RightSample == null) || AbsTime.IsGreaterOrEqual(CycleIterator.RightSample.Time)) {
-				CycleIterator.MoveNext();
-			}
-			AdvanceState();
-		}
-
-		public double Progress
-		{
-			get { return AbsTime == null ? 0 : AbsTime.Value() / Data.Entries.Last().Time.Value(); }
-		}
-
-		public CycleData CycleData
-		{
-			get {
-				return new CycleData {
-					AbsTime = CycleIterator.LeftSample.Time,
-					AbsDistance = null,
-					LeftSample = CycleIterator.LeftSample,
-					RightSample = CycleIterator.RightSample,
-				};
-			}
-		}
-
-		public bool PTOActive
-		{
-			get { return false; }
-		}
-
-		public DrivingCycleData.DrivingCycleEntry CycleLookAhead(Meter distance)
-		{
-			return new DrivingCycleData.DrivingCycleEntry(CycleIterator.RightSample);
-			//throw new System.NotImplementedException();
-		}
-
-		public Meter Altitude
-		{
-			get { return CycleIterator.LeftSample.Altitude; }
-		}
-
-		public Meter CycleStartDistance
-		{
-			get { return 0.SI<Meter>(); }
-		}
-
-		public IReadOnlyList<DrivingCycleData.DrivingCycleEntry> LookAhead(Meter lookaheadDistance)
-		{
-			throw new NotImplementedException();
-		}
-
-		public IReadOnlyList<DrivingCycleData.DrivingCycleEntry> LookAhead(Second time)
-		{
-			var retVal = new List<DrivingCycleData.DrivingCycleEntry>();
-
-			var iterator = CycleIterator.Clone();
-			do {
-				retVal.Add(iterator.RightSample);
-			} while (iterator.MoveNext() && iterator.RightSample.Time < AbsTime + time);
-
-			return retVal;
-		}
-
-		public void FinishSimulation()
-		{
-			Data.Finish();
-		}
-
-		public DrivingBehavior DriverBehavior { get; internal set; }
-
-		public MeterPerSquareSecond DriverAcceleration { get; protected set; }
-
-		public Meter Distance
-		{
-			get { return CurrentState.Distance; }
-		}
-	}
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using TUGraz.VectoCommon.Exceptions;
+using TUGraz.VectoCommon.Models;
+using TUGraz.VectoCommon.Utils;
+using TUGraz.VectoCore.Configuration;
+using TUGraz.VectoCore.Models.Connector.Ports;
+using TUGraz.VectoCore.Models.Connector.Ports.Impl;
+using TUGraz.VectoCore.Models.Simulation;
+using TUGraz.VectoCore.Models.Simulation.Data;
+using TUGraz.VectoCore.Models.Simulation.DataBus;
+using TUGraz.VectoCore.Models.SimulationComponent.Data;
+using TUGraz.VectoCore.OutputData;
+using TUGraz.VectoCore.Utils;
+
+namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
+{
+	/// <summary>
+	/// Driving Cycle for the Measured Speed Gear driving cycle.
+	/// </summary>
+	public class MeasuredSpeedDrivingCycle :
+		StatefulProviderComponent
+			<MeasuredSpeedDrivingCycle.DrivingCycleState, ISimulationOutPort, IDriverDemandInPort, IDriverDemandOutPort>,
+		IDriverInfo, IDrivingCycleInfo, IMileageCounter, IDriverDemandInProvider, IDriverDemandInPort, ISimulationOutProvider,
+		ISimulationOutPort
+	{
+		public class DrivingCycleState
+		{
+			public DrivingCycleState Clone()
+			{
+				return new DrivingCycleState {
+					Distance = Distance,
+				};
+			}
+
+			public Meter Distance;
+			public Meter SimulationDistance;
+			public MeterPerSquareSecond Acceleration;
+		}
+
+		protected readonly IDrivingCycleData Data;
+
+		protected internal readonly DrivingCycleEnumerator CycleIterator;
+
+		protected Second AbsTime { get; set; }
+
+		/// <summary>
+		/// Initializes a new instance of the <see cref="PowertrainDrivingCycle"/> class.
+		/// </summary>
+		/// <param name="container">The container.</param>
+		/// <param name="cycle">The cycle.</param>
+		public MeasuredSpeedDrivingCycle(IVehicleContainer container, IDrivingCycleData cycle)
+			: base(container)
+		{
+			Data = cycle;
+			CycleIterator = new DrivingCycleEnumerator(cycle);
+
+			PreviousState = new DrivingCycleState {
+				Distance = 0.SI<Meter>(),
+			};
+			CurrentState = PreviousState.Clone();
+		}
+
+		public IResponse Initialize()
+		{
+			var first = Data.Entries.First();
+
+			AbsTime = first.Time;
+
+			var response = NextComponent.Initialize(first.VehicleTargetSpeed, first.RoadGradient);
+			if (!(response is ResponseSuccess)) {
+				throw new UnexpectedResponseException("MeasuredSpeedDrivingCycle: Couldn't find start gear.", response);
+			}
+
+			response.AbsTime = AbsTime;
+			return response;
+		}
+
+		public IResponse Request(Second absTime, Meter ds)
+		{
+			Log.Fatal("MeasuredSpeed Cycle can not handle distance request.");
+			throw new VectoSimulationException("MeasuredSpeed Cycle can not handle distance request.");
+		}
+
+		public virtual IResponse Request(Second absTime, Second dt)
+		{
+			var debug = new DebugData();
+
+			// cycle finished
+			if (CycleIterator.LastEntry && absTime >= CycleIterator.RightSample.Time) {
+				return new ResponseCycleFinished { AbsTime = absTime, Source = this };
+			}
+
+			if (CycleIterator.RightSample == null) {
+				throw new VectoException("Exceeding cycle!");
+			}
+			// interval exceeded
+			if ((absTime + dt).IsGreater(CycleIterator.RightSample.Time)) {
+				return new ResponseFailTimeInterval {
+					AbsTime = absTime,
+					Source = this,
+					DeltaT = CycleIterator.RightSample.Time - absTime
+				};
+			}
+
+			// calc acceleration from speed diff vehicle to cycle
+			var targetSpeed = CycleIterator.RightSample.VehicleTargetSpeed;
+			if (targetSpeed.IsEqual(0.KMPHtoMeterPerSecond(), 0.5.KMPHtoMeterPerSecond())) {
+				targetSpeed = 0.KMPHtoMeterPerSecond();
+			}
+			var deltaV = targetSpeed - DataBus.VehicleSpeed;
+			var deltaT = CycleIterator.RightSample.Time - CycleIterator.LeftSample.Time;
+
+			if (DataBus.VehicleSpeed.IsSmaller(0)) {
+				throw new VectoSimulationException("vehicle velocity is smaller than zero");
+			}
+
+			if (deltaT.IsSmaller(0)) {
+				throw new VectoSimulationException("deltaT is smaller than zero");
+			}
+
+			var acceleration = deltaV / deltaT;
+			var gradient = CycleIterator.LeftSample.RoadGradient;
+			DriverAcceleration = acceleration;
+			DriverBehavior = acceleration < 0
+				? DriverBehavior = DrivingBehavior.Braking
+				: DriverBehavior = DrivingBehavior.Driving;
+			if (DataBus.VehicleStopped && acceleration.IsEqual(0)) {
+				DriverBehavior = DrivingBehavior.Halted;
+			}
+
+			IResponse response;
+			var responseCount = 0;
+			do {
+				response = NextComponent.Request(absTime, dt, acceleration, gradient);
+				debug.Add(response);
+				response.Switch()
+					.Case<ResponseGearShift>(() => response = NextComponent.Request(absTime, dt, acceleration, gradient))
+					.Case<ResponseUnderload>(r => {
+						response = HandleUnderload(absTime, dt, r, gradient, ref acceleration);
+					})
+					.Case<ResponseOverload>(r => {
+						response = HandleOverload(absTime, dt, r, gradient, ref acceleration);
+					})
+					.Case<ResponseEngineSpeedTooHigh>(r => {
+						acceleration = SearchAlgorithm.Search(acceleration, r.DeltaEngineSpeed,
+							Constants.SimulationSettings.OperatingPointInitialSearchIntervalAccelerating,
+							getYValue: result => ((ResponseDryRun)result).DeltaEngineSpeed,
+							evaluateFunction: x => NextComponent.Request(absTime, dt, x, gradient, true),
+							criterion:
+								y => ((ResponseDryRun)y).DeltaEngineSpeed.Value());
+						Log.Info(
+							"Found operating point for driver acceleration. absTime: {0}, dt: {1}, acceleration: {2}, gradient: {3}",
+							absTime, dt, acceleration, gradient);
+					})
+					.Case<ResponseFailTimeInterval>(r => {
+						dt = r.DeltaT;
+					})
+					.Case<ResponseSuccess>()
+					.Default(
+						r => {
+							throw new UnexpectedResponseException("MeasuredSpeedDrivingCycle received an unexpected response.", r);
+						});
+			} while (!(response is ResponseSuccess || response is ResponseFailTimeInterval) && (++responseCount < 10));
+
+			AbsTime = absTime + dt;
+
+			response.SimulationInterval = dt;
+			response.Acceleration = acceleration;
+			debug.Add(response);
+
+			CurrentState.SimulationDistance = acceleration / 2 * dt * dt + DataBus.VehicleSpeed * dt;
+			if (CurrentState.SimulationDistance.IsSmaller(0)) {
+				throw new VectoSimulationException(
+					"MeasuredSpeed: Simulation Distance must not be negative. Driving Backward is not allowed.");
+			}
+
+			CurrentState.Distance = CurrentState.SimulationDistance + PreviousState.Distance;
+			CurrentState.Acceleration = acceleration;
+
+			return response;
+		}
+
+		private IResponse HandleUnderload(Second absTime, Second dt, ResponseUnderload r,
+			Radian gradient, ref MeterPerSquareSecond acceleration)
+		{
+			MeterPerSquareSecond acc = acceleration;
+			DataBus.BrakePower = SearchAlgorithm.Search(DataBus.BrakePower, r.Delta, -r.Delta,
+				getYValue: result => DataBus.ClutchClosed(absTime)
+					? ((ResponseDryRun)result).DeltaDragLoad
+					: ((ResponseDryRun)result).GearboxPowerRequest,
+				evaluateFunction: x => {
+					DataBus.BrakePower = x;
+					return NextComponent.Request(absTime, dt, acc, gradient, true);
+				},
+				criterion: y => DataBus.ClutchClosed(absTime)
+					? ((ResponseDryRun)y).DeltaDragLoad.Value()
+					: ((ResponseDryRun)y).GearboxPowerRequest.Value());
+			Log.Info(
+				"Found operating point for braking. absTime: {0}, dt: {1}, acceleration: {2}, gradient: {3}, BrakePower: {4}",
+				absTime, dt, acceleration, gradient, DataBus.BrakePower);
+
+			if (DataBus.BrakePower.IsSmaller(0)) {
+				Log.Info(
+					"BrakePower was negative: {4}. Setting to 0 and searching for acceleration operating point. absTime: {0}, dt: {1}, acceleration: {2}, gradient: {3}",
+					absTime, dt, acceleration, gradient, DataBus.BrakePower);
+				DataBus.BrakePower = 0.SI<Watt>();
+				acceleration = SearchAlgorithm.Search(acceleration, r.Delta,
+					Constants.SimulationSettings.OperatingPointInitialSearchIntervalAccelerating,
+					getYValue: result => ((ResponseDryRun)result).DeltaFullLoad,
+					evaluateFunction: x => NextComponent.Request(absTime, dt, x, gradient, true),
+					criterion: y => ((ResponseDryRun)y).DeltaFullLoad.Value());
+			}
+
+			var response = NextComponent.Request(absTime, dt, acceleration, gradient);
+			return response;
+		}
+
+		private IResponse HandleOverload(Second absTime, Second dt, ResponseOverload r, Radian gradient,
+			ref MeterPerSquareSecond acceleration)
+		{
+			IResponse response;
+			if (DataBus.ClutchClosed(absTime)) {
+				acceleration = SearchAlgorithm.Search(acceleration, r.Delta,
+					Constants.SimulationSettings.OperatingPointInitialSearchIntervalAccelerating,
+					getYValue: result => ((ResponseDryRun)result).DeltaFullLoad,
+					evaluateFunction: x => NextComponent.Request(absTime, dt, x, gradient, true),
+					criterion:
+						y => ((ResponseDryRun)y).DeltaFullLoad.Value());
+				Log.Info(
+					"Found operating point for driver acceleration. absTime: {0}, dt: {1}, acceleration: {2}, gradient: {3}",
+					absTime, dt, acceleration, gradient);
+			} else {
+				var acc = acceleration;
+				DataBus.BrakePower = SearchAlgorithm.Search(DataBus.BrakePower, r.Delta, -r.Delta,
+					getYValue: result => DataBus.ClutchClosed(absTime)
+						? ((ResponseDryRun)result).DeltaDragLoad
+						: ((ResponseDryRun)result).GearboxPowerRequest,
+					evaluateFunction: x => {
+						DataBus.BrakePower = x;
+						return NextComponent.Request(absTime, dt, acc, gradient, true);
+					},
+					criterion: y => DataBus.ClutchClosed(absTime)
+						? ((ResponseDryRun)y).DeltaDragLoad.Value()
+						: ((ResponseDryRun)y).GearboxPowerRequest.Value());
+				Log.Info(
+					"Found operating point for braking. absTime: {0}, dt: {1}, acceleration: {2}, gradient: {3}, BrakePower: {4}",
+					absTime, dt, acceleration, gradient, DataBus.BrakePower);
+
+				if (DataBus.BrakePower.IsSmaller(0)) {
+					Log.Info(
+						"BrakePower was negative: {4}. Setting to 0 and searching for acceleration operating point. absTime: {0}, dt: {1}, acceleration: {2}, gradient: {3}",
+						absTime, dt, acceleration, gradient, DataBus.BrakePower);
+					DataBus.BrakePower = 0.SI<Watt>();
+					acceleration = SearchAlgorithm.Search(acceleration, r.Delta,
+						Constants.SimulationSettings.OperatingPointInitialSearchIntervalAccelerating,
+						getYValue: result => ((ResponseDryRun)result).DeltaFullLoad,
+						evaluateFunction: x => NextComponent.Request(absTime, dt, x, gradient, true),
+						criterion: y => ((ResponseDryRun)y).DeltaFullLoad.Value());
+				}
+			}
+			response = NextComponent.Request(absTime, dt, acceleration, gradient);
+			return response;
+		}
+
+		protected override void DoWriteModalResults(IModalDataContainer container)
+		{
+			container[ModalResultField.dist] = CurrentState.Distance;
+			container[ModalResultField.simulationDistance] = CurrentState.SimulationDistance;
+			container[ModalResultField.v_targ] = CycleIterator.LeftSample.VehicleTargetSpeed;
+			container[ModalResultField.grad] = CycleIterator.LeftSample.RoadGradientPercent;
+			container[ModalResultField.altitude] = CycleIterator.LeftSample.Altitude;
+			container[ModalResultField.acc] = CurrentState.Acceleration;
+		}
+
+		protected override void DoCommitSimulationStep()
+		{
+			if ((CycleIterator.RightSample == null) || AbsTime.IsGreaterOrEqual(CycleIterator.RightSample.Time)) {
+				CycleIterator.MoveNext();
+			}
+			AdvanceState();
+		}
+
+		public double Progress
+		{
+			get { return AbsTime == null ? 0 : AbsTime.Value() / Data.Entries.Last().Time.Value(); }
+		}
+
+		public CycleData CycleData
+		{
+			get
+			{
+				return new CycleData {
+					AbsTime = CycleIterator.LeftSample.Time,
+					AbsDistance = null,
+					LeftSample = CycleIterator.LeftSample,
+					RightSample = CycleIterator.RightSample,
+				};
+			}
+		}
+
+		public bool PTOActive
+		{
+			get { return false; }
+		}
+
+		public DrivingCycleData.DrivingCycleEntry CycleLookAhead(Meter distance)
+		{
+			return new DrivingCycleData.DrivingCycleEntry(CycleIterator.RightSample);
+			//throw new System.NotImplementedException();
+		}
+
+		public Meter Altitude
+		{
+			get { return CycleIterator.LeftSample.Altitude; }
+		}
+
+		public Meter CycleStartDistance
+		{
+			get { return 0.SI<Meter>(); }
+		}
+
+		public IReadOnlyList<DrivingCycleData.DrivingCycleEntry> LookAhead(Meter lookaheadDistance)
+		{
+			throw new NotImplementedException();
+		}
+
+		public IReadOnlyList<DrivingCycleData.DrivingCycleEntry> LookAhead(Second time)
+		{
+			var retVal = new List<DrivingCycleData.DrivingCycleEntry>();
+
+			var iterator = CycleIterator.Clone();
+			do {
+				retVal.Add(iterator.RightSample);
+			} while (iterator.MoveNext() && iterator.RightSample.Time < AbsTime + time);
+
+			return retVal;
+		}
+
+		public void FinishSimulation()
+		{
+			Data.Finish();
+		}
+
+		public DrivingBehavior DriverBehavior { get; internal set; }
+
+		public MeterPerSquareSecond DriverAcceleration { get; protected set; }
+
+		public Meter Distance
+		{
+			get { return CurrentState.Distance; }
+		}
+	}
 }
\ No newline at end of file
diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/TorqueConverter.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/TorqueConverter.cs
index 8a5db4a93a9e679c06d9acde320d7c7e6c109328..0e5eb487fad515148cd93b1824c8e383d72179ac 100644
--- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/TorqueConverter.cs
+++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/TorqueConverter.cs
@@ -29,265 +29,270 @@
 *   Martin Rexeis, rexeis@ivt.tugraz.at, IVT, Graz University of Technology
 */
 
-using System.Collections.Generic;
-using TUGraz.VectoCommon.Exceptions;
-using TUGraz.VectoCommon.Models;
-using TUGraz.VectoCommon.Utils;
-using TUGraz.VectoCore.Configuration;
-using TUGraz.VectoCore.Models.Connector.Ports;
-using TUGraz.VectoCore.Models.Connector.Ports.Impl;
-using TUGraz.VectoCore.Models.Simulation;
-using TUGraz.VectoCore.Models.Simulation.Data;
-using TUGraz.VectoCore.Models.Simulation.DataBus;
-using TUGraz.VectoCore.Models.SimulationComponent.Data.Gearbox;
-using TUGraz.VectoCore.OutputData;
-
-namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
-{
-	public class TorqueConverter : StatefulVectoSimulationComponent<TorqueConverter.TorqueConverterComponentState>,
-		ITnInPort, ITnOutPort
-	{
-		protected readonly IGearboxInfo Gearbox;
-		protected readonly IShiftStrategy ShiftStrategy;
-		protected readonly TorqueConverterData ModelData;
-		private readonly KilogramSquareMeter _engineInertia;
-
-		public ITnOutPort NextComponent { protected internal get; set; }
-
-		public TorqueConverter(IGearboxInfo gearbox, IShiftStrategy shiftStrategy, IVehicleContainer container,
-			TorqueConverterData tcData, VectoRunData runData) : base(container)
-		{
-			Gearbox = gearbox;
-			ShiftStrategy = shiftStrategy;
-			ModelData = tcData;
-			_engineInertia = runData != null && runData.EngineData != null
-				? runData.EngineData.Inertia
-				: 0.SI<KilogramSquareMeter>();
-		}
-
-		public void Connect(ITnOutPort other)
-		{
-			NextComponent = other;
-		}
-
-		public IResponse Initialize(NewtonMeter outTorque, PerSecond outAngularVelocity)
-		{
-			var operatingPointList = ModelData.FindOperatingPoint(outTorque, outAngularVelocity, DataBus.EngineIdleSpeed);
-			TorqueConverterOperatingPoint operatingPoint;
-			if (operatingPointList.Count > 0) {
-				operatingPoint = SelectOperatingPoint(operatingPointList);
-			} else {
-				Log.Warn(
-					"TorqueConverter Initialize: No operating point found. Using output as input values as fallback for initialize.");
-				var inAngularVelocity = outAngularVelocity.LimitTo(DataBus.EngineIdleSpeed, DataBus.EngineN95hSpeed);
-				operatingPoint = new TorqueConverterOperatingPoint {
-					OutAngularVelocity = outAngularVelocity,
-					OutTorque = outTorque,
-					InAngularVelocity = inAngularVelocity,
-					InTorque = outTorque * (outAngularVelocity / inAngularVelocity)
-				};
-			}
-			var retVal = NextComponent.Initialize(operatingPoint.InTorque, operatingPoint.InAngularVelocity);
-			PreviousState.SetState(operatingPoint.InTorque, operatingPoint.InAngularVelocity, operatingPoint.OutTorque,
-				operatingPoint.OutAngularVelocity);
-			return retVal;
-		}
-
-		public IResponse Request(Second absTime, Second dt, NewtonMeter outTorque, PerSecond outAngularVelocity,
-			bool dryRun = false)
-		{
-			var operatingPoint = FindOperatingPoint(outTorque, outAngularVelocity);
-			var avgEngineSpeed = (PreviousState.InAngularVelocity + operatingPoint.InAngularVelocity) / 2;
-			var avgPower = (PreviousState.InAngularVelocity * PreviousState.InTorque +
-							operatingPoint.InAngularVelocity * operatingPoint.InTorque) / 2;
-			var inTorque = avgPower / avgEngineSpeed;
-
-			if (dryRun) {
-				// dry run request
-				var engineResponse = (ResponseDryRun)
-					NextComponent.Request(absTime, dt, inTorque, operatingPoint.InAngularVelocity, true);
-
-				var engineOK = engineResponse.DeltaDragLoad.IsGreaterOrEqual(0) && engineResponse.DeltaFullLoad.IsSmallerOrEqual(0);
-				if (DataBus.DriverBehavior != DrivingBehavior.Braking && engineOK && operatingPoint.Creeping) {
-					var delta = (outTorque - operatingPoint.OutTorque) *
-								(PreviousState.OutAngularVelocity + operatingPoint.OutAngularVelocity) / 2.0;
-					return new ResponseDryRun() {
-						Source = this,
-						DeltaFullLoad = delta,
-						DeltaDragLoad = delta,
-						TorqueConverterOperatingPoint = operatingPoint
-					};
-				}
-
-				var dryOperatingPointMax = GetMaxPowerOperatingPoint(dt, outAngularVelocity, engineResponse,
-					PreviousState.InTorque * PreviousState.InAngularVelocity);
-				var avgOutSpeedMax = (PreviousState.OutAngularVelocity + dryOperatingPointMax.OutAngularVelocity) / 2.0;
-				var deltaMax = (outTorque - dryOperatingPointMax.OutTorque) * avgOutSpeedMax;
-
-				var dryOperatingPointMin = GetDragPowerOperatingPoint(dt, outAngularVelocity, engineResponse,
-					PreviousState.InTorque * PreviousState.InAngularVelocity);
-				var avgOutSpeedMin = (PreviousState.OutAngularVelocity + dryOperatingPointMin.OutAngularVelocity) / 2.0;
-				var deltaMin = (outTorque - dryOperatingPointMin.OutTorque) * avgOutSpeedMin;
-
-				return new ResponseDryRun {
-					Source = this,
-					DeltaFullLoad = 2 * deltaMax,
-					DeltaDragLoad = 2 * deltaMin,
-					TorqueConverterOperatingPoint = dryOperatingPointMax
-				};
-			}
-
-			// normal request
-
-			// check if out-side of the operating point is equal to requested values
-			if (!outAngularVelocity.IsEqual(operatingPoint.OutAngularVelocity) || !outTorque.IsEqual(operatingPoint.OutTorque)) {
-				var delta = (outTorque - operatingPoint.OutTorque) *
-							(PreviousState.OutAngularVelocity + operatingPoint.OutAngularVelocity) / 2.0;
-				if (!delta.IsEqual(0, Constants.SimulationSettings.LineSearchTolerance)) {
-					if (delta > 0) {
-						return new ResponseOverload { Source = this, Delta = delta, TorqueConverterOperatingPoint = operatingPoint };
-					} else {
-						return new ResponseUnderload { Source = this, Delta = delta, TorqueConverterOperatingPoint = operatingPoint };
-					}
-				}
-			}
-
-			CurrentState.SetState(inTorque, operatingPoint.InAngularVelocity, outTorque, outAngularVelocity);
-			CurrentState.OperatingPoint = operatingPoint;
-
-			var retVal = NextComponent.Request(absTime, dt, inTorque, operatingPoint.InAngularVelocity);
-
-			// check if shift is required
-			var ratio = Gearbox.GetGearData(Gearbox.Gear).TorqueConverterRatio;
-			if (retVal is ResponseSuccess &&
-				ShiftStrategy.ShiftRequired(absTime, dt, outTorque * ratio, outAngularVelocity / ratio, inTorque,
-					operatingPoint.InAngularVelocity, Gearbox.Gear, Gearbox.LastShift)) {
-				return new ResponseGearShift { Source = this };
-			}
-			return retVal;
-		}
-
-		private TorqueConverterOperatingPoint GetDragPowerOperatingPoint(Second dt, PerSecond outAngularVelocity,
-			ResponseDryRun engineResponse, Watt previousPower)
-		{
-			try {
-				var operatingPoint = ModelData.FindOperatingPointForPowerDemand(
-					engineResponse.DragPower - engineResponse.AuxiliariesPowerDemand,
-					DataBus.EngineSpeed, outAngularVelocity, _engineInertia, dt, previousPower);
-				var maxInputSpeed = VectoMath.Min(ModelData.TorqueConverterSpeedLimit, DataBus.EngineRatedSpeed);
-				if (operatingPoint.InAngularVelocity.IsGreater(maxInputSpeed)) {
-					operatingPoint = ModelData.FindOperatingPoint(maxInputSpeed, outAngularVelocity);
-				}
-				if (operatingPoint.InAngularVelocity.IsSmaller(DataBus.EngineIdleSpeed)) {
-					operatingPoint = ModelData.FindOperatingPoint(DataBus.EngineIdleSpeed, outAngularVelocity);
-				}
-				return operatingPoint;
-			} catch (VectoException ve) {
-				Log.Error(ve, "TorqueConverter: Failed to find operating point for DragPower {0}", engineResponse.DragPower);
-				var retVal = ModelData.FindOperatingPoint(engineResponse.EngineSpeed, outAngularVelocity);
-				retVal.Creeping = true;
-				return retVal;
-			}
-		}
-
-		private TorqueConverterOperatingPoint GetMaxPowerOperatingPoint(Second dt, PerSecond outAngularVelocity,
-			ResponseDryRun engineResponse, Watt previousPower)
-		{
-			try {
-				var operatingPoint = ModelData.FindOperatingPointForPowerDemand(
-					engineResponse.DynamicFullLoadPower - engineResponse.AuxiliariesPowerDemand,
-					DataBus.EngineSpeed, outAngularVelocity, _engineInertia, dt, previousPower);
-				var maxInputSpeed = VectoMath.Min(ModelData.TorqueConverterSpeedLimit, DataBus.EngineRatedSpeed);
-				if (operatingPoint.InAngularVelocity.IsGreater(maxInputSpeed)) {
-					operatingPoint = ModelData.FindOperatingPoint(maxInputSpeed, outAngularVelocity);
-				}
-				return operatingPoint;
-			} catch (VectoException ve) {
-				Log.Error(ve, "TorqueConverter: Failed to find operating point for MaxPower {0}",
-					engineResponse.DynamicFullLoadPower);
-				var tqOperatingPoint = ModelData.FindOperatingPoint(DataBus.EngineIdleSpeed, outAngularVelocity);
-				tqOperatingPoint.Creeping = true;
-				return tqOperatingPoint;
-			}
-		}
-
-		protected internal TorqueConverterOperatingPoint FindOperatingPoint(NewtonMeter outTorque,
-			PerSecond outAngularVelocity)
-		{
-			var operatingPointList = ModelData.FindOperatingPoint(outTorque, outAngularVelocity, DataBus.EngineIdleSpeed);
-			if (operatingPointList.Count == 0) {
-				Log.Debug("TorqueConverter: Failed to find torque converter operating point, fallback: creeping");
-				var tqOperatingPoint = ModelData.FindOperatingPoint(DataBus.EngineIdleSpeed, outAngularVelocity);
-				tqOperatingPoint.Creeping = true;
-				return tqOperatingPoint;
-			}
-
-			var operatingPoint = SelectOperatingPoint(operatingPointList);
-			if (operatingPoint.InAngularVelocity.IsSmaller(DataBus.EngineIdleSpeed)) {
-				throw new VectoException(
-					"TorqueConverter: Invalid operating point, inAngularVelocity would be below engine's idle speed: {0}",
-					operatingPoint.InAngularVelocity);
-			}
-			var maxInputSpeed = VectoMath.Min(ModelData.TorqueConverterSpeedLimit, DataBus.EngineRatedSpeed);
-			if (operatingPoint.InAngularVelocity.IsGreater(maxInputSpeed)) {
-				operatingPoint = ModelData.FindOperatingPoint(maxInputSpeed, outAngularVelocity);
-			}
-			return operatingPoint;
-		}
-
-		private TorqueConverterOperatingPoint SelectOperatingPoint(IList<TorqueConverterOperatingPoint> operatingPointList)
-		{
-			if (operatingPointList.Count == 1) {
-				return operatingPointList[0];
-			}
-
-			foreach (var x in operatingPointList) {
-				if ((x.InTorque * x.InAngularVelocity).IsSmallerOrEqual(DataBus.EngineStationaryFullPower(x.InAngularVelocity),
-					Constants.SimulationSettings.LineSearchTolerance.SI<Watt>()) &&
-					(x.InTorque * x.InAngularVelocity).IsGreaterOrEqual(DataBus.EngineDragPower(x.InAngularVelocity),
-						Constants.SimulationSettings.LineSearchTolerance.SI<Watt>())) {
-					return x;
-				}
-			}
-
-			return operatingPointList[0];
-		}
-
-		protected override void DoWriteModalResults(IModalDataContainer container)
-		{
-			if (CurrentState.OperatingPoint == null) {
-				container[ModalResultField.TorqueConverterTorqueRatio] = 1.0;
-				container[ModalResultField.TorqueConverterSpeedRatio] = 1.0;
-			} else {
-				container[ModalResultField.TorqueConverterTorqueRatio] = CurrentState.OperatingPoint.TorqueRatio;
-				container[ModalResultField.TorqueConverterSpeedRatio] = CurrentState.OperatingPoint.SpeedRatio;
-			}
-			container[ModalResultField.TC_TorqueIn] = CurrentState.InTorque;
-			container[ModalResultField.TC_TorqueOut] = CurrentState.OutTorque;
-			container[ModalResultField.TC_angularSpeedIn] = CurrentState.InAngularVelocity;
-			container[ModalResultField.TC_angularSpeedOut] = CurrentState.OutAngularVelocity;
-
-			var avgOutVelocity = (PreviousState.OutAngularVelocity + CurrentState.OutAngularVelocity) / 2.0;
-			var avgInVelocity = (PreviousState.InAngularVelocity + CurrentState.InAngularVelocity) / 2.0;
-			container[ModalResultField.P_TC_out] = CurrentState.OutTorque * avgOutVelocity;
-			container[ModalResultField.P_TC_loss] = CurrentState.InTorque * avgInVelocity -
-													CurrentState.OutTorque * avgOutVelocity;
-		}
-
-		protected override void DoCommitSimulationStep()
-		{
-			AdvanceState();
-		}
-
-		public void Locked(NewtonMeter inTorque, PerSecond inAngularVelocity, NewtonMeter outTorque,
-			PerSecond outAngularVelocity)
-		{
-			CurrentState.SetState(inTorque, inAngularVelocity, outTorque, outAngularVelocity);
-		}
-
-		public class TorqueConverterComponentState : SimpleComponentState
-		{
-			public TorqueConverterOperatingPoint OperatingPoint;
-		}
-	}
+using System.Collections.Generic;
+using TUGraz.VectoCommon.Exceptions;
+using TUGraz.VectoCommon.Models;
+using TUGraz.VectoCommon.Utils;
+using TUGraz.VectoCore.Configuration;
+using TUGraz.VectoCore.Models.Connector.Ports;
+using TUGraz.VectoCore.Models.Connector.Ports.Impl;
+using TUGraz.VectoCore.Models.Simulation;
+using TUGraz.VectoCore.Models.Simulation.Data;
+using TUGraz.VectoCore.Models.Simulation.DataBus;
+using TUGraz.VectoCore.Models.SimulationComponent.Data.Gearbox;
+using TUGraz.VectoCore.OutputData;
+
+namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
+{
+	public class TorqueConverter : StatefulVectoSimulationComponent<TorqueConverter.TorqueConverterComponentState>,
+		ITnInPort, ITnOutPort
+	{
+		protected readonly IGearboxInfo Gearbox;
+		protected readonly IShiftStrategy ShiftStrategy;
+		protected readonly TorqueConverterData ModelData;
+		private readonly KilogramSquareMeter _engineInertia;
+
+		public ITnOutPort NextComponent { protected internal get; set; }
+
+		public TorqueConverter(IGearboxInfo gearbox, IShiftStrategy shiftStrategy, IVehicleContainer container,
+			TorqueConverterData tcData, VectoRunData runData) : base(container)
+		{
+			Gearbox = gearbox;
+			ShiftStrategy = shiftStrategy;
+			ModelData = tcData;
+			_engineInertia = runData != null && runData.EngineData != null
+				? runData.EngineData.Inertia
+				: 0.SI<KilogramSquareMeter>();
+		}
+
+		public void Connect(ITnOutPort other)
+		{
+			NextComponent = other;
+		}
+
+		public IResponse Initialize(NewtonMeter outTorque, PerSecond outAngularVelocity)
+		{
+			var operatingPointList = ModelData.FindOperatingPoint(outTorque, outAngularVelocity, DataBus.EngineIdleSpeed);
+			TorqueConverterOperatingPoint operatingPoint;
+			if (operatingPointList.Count > 0) {
+				operatingPoint = SelectOperatingPoint(operatingPointList);
+			} else {
+				Log.Warn(
+					"TorqueConverter Initialize: No operating point found. Using output as input values as fallback for initialize.");
+				var inAngularVelocity = outAngularVelocity.LimitTo(DataBus.EngineIdleSpeed, DataBus.EngineN95hSpeed);
+				operatingPoint = new TorqueConverterOperatingPoint {
+					OutAngularVelocity = outAngularVelocity,
+					OutTorque = outTorque,
+					InAngularVelocity = inAngularVelocity,
+					InTorque = outTorque * (outAngularVelocity / inAngularVelocity)
+				};
+			}
+			var retVal = NextComponent.Initialize(operatingPoint.InTorque, operatingPoint.InAngularVelocity);
+			PreviousState.SetState(operatingPoint.InTorque, operatingPoint.InAngularVelocity, operatingPoint.OutTorque,
+				operatingPoint.OutAngularVelocity);
+			return retVal;
+		}
+
+		public IResponse Request(Second absTime, Second dt, NewtonMeter outTorque, PerSecond outAngularVelocity,
+			bool dryRun = false)
+		{
+			var operatingPoint = FindOperatingPoint(outTorque, outAngularVelocity);
+			var avgEngineSpeed = (PreviousState.InAngularVelocity + operatingPoint.InAngularVelocity) / 2;
+			var avgPower = (PreviousState.InAngularVelocity * PreviousState.InTorque +
+							operatingPoint.InAngularVelocity * operatingPoint.InTorque) / 2;
+			var inTorque = avgPower / avgEngineSpeed;
+
+			if (dryRun) {
+				return HandleDryRun(absTime, dt, outTorque, outAngularVelocity, inTorque, operatingPoint);
+			}
+
+			// normal request
+
+			// check if out-side of the operating point is equal to requested values
+			if (!outAngularVelocity.IsEqual(operatingPoint.OutAngularVelocity) || !outTorque.IsEqual(operatingPoint.OutTorque)) {
+				var delta = (outTorque - operatingPoint.OutTorque) *
+							(PreviousState.OutAngularVelocity + operatingPoint.OutAngularVelocity) / 2.0;
+				if (!delta.IsEqual(0, Constants.SimulationSettings.LineSearchTolerance)) {
+					return delta > 0
+						? new ResponseOverload { Source = this, Delta = delta, TorqueConverterOperatingPoint = operatingPoint }
+						: (IResponse)
+							new ResponseUnderload { Source = this, Delta = delta, TorqueConverterOperatingPoint = operatingPoint };
+				}
+			}
+
+			CurrentState.SetState(inTorque, operatingPoint.InAngularVelocity, outTorque, outAngularVelocity);
+			CurrentState.OperatingPoint = operatingPoint;
+
+			var retVal = NextComponent.Request(absTime, dt, inTorque, operatingPoint.InAngularVelocity);
+
+			// check if shift is required
+			var ratio = Gearbox.GetGearData(Gearbox.Gear).TorqueConverterRatio;
+			if (retVal is ResponseSuccess &&
+				ShiftStrategy.ShiftRequired(absTime, dt, outTorque * ratio, outAngularVelocity / ratio, inTorque,
+					operatingPoint.InAngularVelocity, Gearbox.Gear, Gearbox.LastShift)) {
+				return new ResponseGearShift { Source = this };
+			}
+			return retVal;
+		}
+
+		private IResponse HandleDryRun(Second absTime, Second dt, NewtonMeter outTorque, PerSecond outAngularVelocity,
+			NewtonMeter inTorque, TorqueConverterOperatingPoint operatingPoint)
+		{
+// dry run request
+			var engineResponse = (ResponseDryRun)
+				NextComponent.Request(absTime, dt, inTorque, operatingPoint.InAngularVelocity, true);
+
+			var engineOK = engineResponse.DeltaDragLoad.IsGreaterOrEqual(0) && engineResponse.DeltaFullLoad.IsSmallerOrEqual(0);
+			if (DataBus.DriverBehavior != DrivingBehavior.Braking && engineOK && operatingPoint.Creeping) {
+				var delta = (outTorque - operatingPoint.OutTorque) *
+							(PreviousState.OutAngularVelocity + operatingPoint.OutAngularVelocity) / 2.0;
+				return new ResponseDryRun() {
+					Source = this,
+					DeltaFullLoad = delta,
+					DeltaDragLoad = delta,
+					TorqueConverterOperatingPoint = operatingPoint
+				};
+			}
+
+			var dryOperatingPointMax = GetMaxPowerOperatingPoint(dt, outAngularVelocity, engineResponse,
+				PreviousState.InTorque * PreviousState.InAngularVelocity);
+			var avgOutSpeedMax = (PreviousState.OutAngularVelocity + dryOperatingPointMax.OutAngularVelocity) / 2.0;
+			var deltaMax = (outTorque - dryOperatingPointMax.OutTorque) * avgOutSpeedMax;
+
+			var dryOperatingPointMin = GetDragPowerOperatingPoint(dt, outAngularVelocity, engineResponse,
+				PreviousState.InTorque * PreviousState.InAngularVelocity);
+			var avgOutSpeedMin = (PreviousState.OutAngularVelocity + dryOperatingPointMin.OutAngularVelocity) / 2.0;
+			var deltaMin = (outTorque - dryOperatingPointMin.OutTorque) * avgOutSpeedMin;
+
+			return new ResponseDryRun {
+				Source = this,
+				DeltaFullLoad = 2 * deltaMax,
+				DeltaDragLoad = 2 * deltaMin,
+				TorqueConverterOperatingPoint = dryOperatingPointMax
+			};
+		}
+
+		private TorqueConverterOperatingPoint GetDragPowerOperatingPoint(Second dt, PerSecond outAngularVelocity,
+			ResponseDryRun engineResponse, Watt previousPower)
+		{
+			try {
+				var operatingPoint = ModelData.FindOperatingPointForPowerDemand(
+					engineResponse.DragPower - engineResponse.AuxiliariesPowerDemand,
+					DataBus.EngineSpeed, outAngularVelocity, _engineInertia, dt, previousPower);
+				var maxInputSpeed = VectoMath.Min(ModelData.TorqueConverterSpeedLimit, DataBus.EngineRatedSpeed);
+				if (operatingPoint.InAngularVelocity.IsGreater(maxInputSpeed)) {
+					operatingPoint = ModelData.FindOperatingPoint(maxInputSpeed, outAngularVelocity);
+				}
+				if (operatingPoint.InAngularVelocity.IsSmaller(DataBus.EngineIdleSpeed)) {
+					operatingPoint = ModelData.FindOperatingPoint(DataBus.EngineIdleSpeed, outAngularVelocity);
+				}
+				return operatingPoint;
+			} catch (VectoException ve) {
+				Log.Error(ve, "TorqueConverter: Failed to find operating point for DragPower {0}", engineResponse.DragPower);
+				var retVal = ModelData.FindOperatingPoint(engineResponse.EngineSpeed, outAngularVelocity);
+				retVal.Creeping = true;
+				return retVal;
+			}
+		}
+
+		private TorqueConverterOperatingPoint GetMaxPowerOperatingPoint(Second dt, PerSecond outAngularVelocity,
+			ResponseDryRun engineResponse, Watt previousPower)
+		{
+			try {
+				var operatingPoint = ModelData.FindOperatingPointForPowerDemand(
+					engineResponse.DynamicFullLoadPower - engineResponse.AuxiliariesPowerDemand,
+					DataBus.EngineSpeed, outAngularVelocity, _engineInertia, dt, previousPower);
+				var maxInputSpeed = VectoMath.Min(ModelData.TorqueConverterSpeedLimit, DataBus.EngineRatedSpeed);
+				if (operatingPoint.InAngularVelocity.IsGreater(maxInputSpeed)) {
+					operatingPoint = ModelData.FindOperatingPoint(maxInputSpeed, outAngularVelocity);
+				}
+				return operatingPoint;
+			} catch (VectoException ve) {
+				Log.Error(ve, "TorqueConverter: Failed to find operating point for MaxPower {0}",
+					engineResponse.DynamicFullLoadPower);
+				var tqOperatingPoint = ModelData.FindOperatingPoint(DataBus.EngineIdleSpeed, outAngularVelocity);
+				tqOperatingPoint.Creeping = true;
+				return tqOperatingPoint;
+			}
+		}
+
+		protected internal TorqueConverterOperatingPoint FindOperatingPoint(NewtonMeter outTorque,
+			PerSecond outAngularVelocity)
+		{
+			var operatingPointList = ModelData.FindOperatingPoint(outTorque, outAngularVelocity, DataBus.EngineIdleSpeed);
+			if (operatingPointList.Count == 0) {
+				Log.Debug("TorqueConverter: Failed to find torque converter operating point, fallback: creeping");
+				var tqOperatingPoint = ModelData.FindOperatingPoint(DataBus.EngineIdleSpeed, outAngularVelocity);
+				tqOperatingPoint.Creeping = true;
+				return tqOperatingPoint;
+			}
+
+			var operatingPoint = SelectOperatingPoint(operatingPointList);
+			if (operatingPoint.InAngularVelocity.IsSmaller(DataBus.EngineIdleSpeed)) {
+				throw new VectoException(
+					"TorqueConverter: Invalid operating point, inAngularVelocity would be below engine's idle speed: {0}",
+					operatingPoint.InAngularVelocity);
+			}
+			var maxInputSpeed = VectoMath.Min(ModelData.TorqueConverterSpeedLimit, DataBus.EngineRatedSpeed);
+			if (operatingPoint.InAngularVelocity.IsGreater(maxInputSpeed)) {
+				operatingPoint = ModelData.FindOperatingPoint(maxInputSpeed, outAngularVelocity);
+			}
+			return operatingPoint;
+		}
+
+		private TorqueConverterOperatingPoint SelectOperatingPoint(IList<TorqueConverterOperatingPoint> operatingPointList)
+		{
+			if (operatingPointList.Count == 1) {
+				return operatingPointList[0];
+			}
+
+			foreach (var x in operatingPointList) {
+				if ((x.InTorque * x.InAngularVelocity).IsSmallerOrEqual(DataBus.EngineStationaryFullPower(x.InAngularVelocity),
+					Constants.SimulationSettings.LineSearchTolerance.SI<Watt>()) &&
+					(x.InTorque * x.InAngularVelocity).IsGreaterOrEqual(DataBus.EngineDragPower(x.InAngularVelocity),
+						Constants.SimulationSettings.LineSearchTolerance.SI<Watt>())) {
+					return x;
+				}
+			}
+
+			return operatingPointList[0];
+		}
+
+		protected override void DoWriteModalResults(IModalDataContainer container)
+		{
+			if (CurrentState.OperatingPoint == null) {
+				container[ModalResultField.TorqueConverterTorqueRatio] = 1.0;
+				container[ModalResultField.TorqueConverterSpeedRatio] = 1.0;
+			} else {
+				container[ModalResultField.TorqueConverterTorqueRatio] = CurrentState.OperatingPoint.TorqueRatio;
+				container[ModalResultField.TorqueConverterSpeedRatio] = CurrentState.OperatingPoint.SpeedRatio;
+			}
+			container[ModalResultField.TC_TorqueIn] = CurrentState.InTorque;
+			container[ModalResultField.TC_TorqueOut] = CurrentState.OutTorque;
+			container[ModalResultField.TC_angularSpeedIn] = CurrentState.InAngularVelocity;
+			container[ModalResultField.TC_angularSpeedOut] = CurrentState.OutAngularVelocity;
+
+			var avgOutVelocity = (PreviousState.OutAngularVelocity + CurrentState.OutAngularVelocity) / 2.0;
+			var avgInVelocity = (PreviousState.InAngularVelocity + CurrentState.InAngularVelocity) / 2.0;
+			container[ModalResultField.P_TC_out] = CurrentState.OutTorque * avgOutVelocity;
+			container[ModalResultField.P_TC_loss] = CurrentState.InTorque * avgInVelocity -
+													CurrentState.OutTorque * avgOutVelocity;
+		}
+
+		protected override void DoCommitSimulationStep()
+		{
+			AdvanceState();
+		}
+
+		public void Locked(NewtonMeter inTorque, PerSecond inAngularVelocity, NewtonMeter outTorque,
+			PerSecond outAngularVelocity)
+		{
+			CurrentState.SetState(inTorque, inAngularVelocity, outTorque, outAngularVelocity);
+		}
+
+		public class TorqueConverterComponentState : SimpleComponentState
+		{
+			public TorqueConverterOperatingPoint OperatingPoint;
+		}
+	}
 }
\ No newline at end of file
diff --git a/VectoCore/VectoCore/OutputData/DeclarationReport.cs b/VectoCore/VectoCore/OutputData/DeclarationReport.cs
index 3ebf64a5186d0987ad6eb90ba3f3d25d3c429998..1167eee4a5069514f9a6e12fc19c8e3ef17ac702 100644
--- a/VectoCore/VectoCore/OutputData/DeclarationReport.cs
+++ b/VectoCore/VectoCore/OutputData/DeclarationReport.cs
@@ -29,134 +29,134 @@
 *   Martin Rexeis, rexeis@ivt.tugraz.at, IVT, Graz University of Technology
 */
 
-using System.Collections.Generic;
-using System.Runtime.CompilerServices;
-using TUGraz.VectoCommon.Exceptions;
-using TUGraz.VectoCore.Models.Declaration;
-using TUGraz.VectoCore.Models.Simulation.Data;
-using TUGraz.VectoCore.Models.Simulation.Impl;
-using TUGraz.VectoCore.Models.SimulationComponent.Data.Engine;
-
-namespace TUGraz.VectoCore.OutputData
-{
-	public interface IDeclarationReport
-	{
-		void PrepareResult(LoadingType loading, Mission mission, VectoRunData runData);
-		void AddResult(LoadingType loadingType, Mission mission, VectoRunData runData, IModalDataContainer modData);
-		void InitializeReport(VectoRunData modelData, Segment segment);
-	}
-
-	/// <summary>
-	/// Class for creating a declaration report.
-	/// </summary>
-	public abstract class DeclarationReport<T> : IDeclarationReport where T : new()
-	{
-		public class ResultContainer<TEntry>
-		{
-			public MissionType Mission;
-
-			public Dictionary<LoadingType, TEntry> ModData;
-		}
-
-		//public class MissionProfile
-		//{
-		//	public readonly IList<double> DistanceKm;
-		//	public readonly IList<double> TargetSpeed;
-		//	public readonly IList<double> Altitude;
-
-		//	public MissionProfile(IModalDataContainer m)
-		//	{
-		//		DistanceKm = m.GetValues<Meter>(ModalResultField.dist).Select(v => v.ConvertTo().Kilo.Meter).ToDouble();
-		//		TargetSpeed =
-		//			m.GetValues<MeterPerSecond>(ModalResultField.v_targ).Select(v => v.ConvertTo().Kilo.Meter.Per.Hour).ToDouble();
-		//		Altitude = m.GetValues<Meter>(ModalResultField.altitude).ToDouble();
-		//	}
-		//}
-
-		/// <summary>
-		/// Dictionary of MissionTypes and their corresponding results.
-		/// </summary>
-		protected readonly Dictionary<MissionType, ResultContainer<T>> Missions =
-			new Dictionary<MissionType, ResultContainer<T>>();
-
-		/// <summary>
-		/// The full load curve.
-		/// </summary>
-		internal Dictionary<uint, EngineFullLoadCurve> Flc { get; set; }
-
-		/// <summary>
-		/// The declaration segment from the segment table
-		/// </summary>
-		internal Segment Segment { get; set; }
-
-
-		/// <summary>
-		/// The result count determines how many results must be given before the report gets written.
-		/// </summary>
-		private int _resultCount;
-
-		[MethodImpl(MethodImplOptions.Synchronized)]
-		public void PrepareResult(LoadingType loading, Mission mission, VectoRunData runData)
-		{
-			if (!Missions.ContainsKey(mission.MissionType)) {
-				Missions[mission.MissionType] = new ResultContainer<T>() {
-					Mission = mission.MissionType,
-					ModData = new Dictionary<LoadingType, T>(),
-				};
-			}
-			Missions[mission.MissionType].ModData[loading] = new T();
-			_resultCount++;
-		}
-
-
-		[MethodImpl(MethodImplOptions.Synchronized)]
-		public void AddResult(LoadingType loadingType, Mission mission, VectoRunData runData,
-			IModalDataContainer modData)
-		{
-			if (modData.RunStatus != VectoRun.Status.Success) {
-				//Missions.Clear();
-				return;
-			}
-			if (!Missions.ContainsKey(mission.MissionType)) {
-				throw new VectoException("Unknown mission type {0} for generating declaration report", mission.MissionType);
-			}
-			if (!Missions[mission.MissionType].ModData.ContainsKey(loadingType)) {
-				throw new VectoException("Unknown loading type {0} for mission {1}", loadingType, mission.MissionType);
-			}
-			//if (Missions[mission.MissionType].MissionProfile == null) {
-			//	Missions[mission.MissionType].MissionProfile = new MissionProfile(modData);
-			//}
-			_resultCount--;
-
-			DoAddResult(Missions[mission.MissionType].ModData[loadingType], runData, modData);
-
-			if (_resultCount == 0) {
-				DoWriteReport();
-				Flc = null;
-				Segment = null;
-			}
-		}
-
-		/// <summary>
-		/// Adds the result of one run for the specific mission and loading. If all runs finished (given by the resultCount) the report will be written.
-		/// </summary>
-		/// <param name="entry"></param>
-		/// <param name="runData"></param>
-		/// <param name="modData">The mod data.</param>
-		[MethodImpl(MethodImplOptions.Synchronized)]
-		protected abstract void DoAddResult(T entry, VectoRunData runData, IModalDataContainer modData);
-
-
-		protected internal abstract void DoWriteReport();
-
-
-		public void InitializeReport(VectoRunData modelData, Segment segment)
-		{
-			Segment = segment;
-
-			DoInitializeReport(modelData, segment);
-		}
-
-		protected abstract void DoInitializeReport(VectoRunData modelData, Segment segment);
-	}
+using System.Collections.Generic;
+using System.Runtime.CompilerServices;
+using TUGraz.VectoCommon.Exceptions;
+using TUGraz.VectoCore.Models.Declaration;
+using TUGraz.VectoCore.Models.Simulation.Data;
+using TUGraz.VectoCore.Models.Simulation.Impl;
+using TUGraz.VectoCore.Models.SimulationComponent.Data.Engine;
+
+namespace TUGraz.VectoCore.OutputData
+{
+	public interface IDeclarationReport
+	{
+		void PrepareResult(LoadingType loading, Mission mission, VectoRunData runData);
+		void AddResult(LoadingType loadingType, Mission mission, VectoRunData runData, IModalDataContainer modData);
+		void InitializeReport(VectoRunData modelData, Segment segment);
+	}
+
+	/// <summary>
+	/// Class for creating a declaration report.
+	/// </summary>
+	public abstract class DeclarationReport<T> : IDeclarationReport where T : new()
+	{
+		public class ResultContainer<TEntry>
+		{
+			public MissionType Mission;
+
+			public Dictionary<LoadingType, TEntry> ModData;
+		}
+
+		//public class MissionProfile
+		//{
+		//	public readonly IList<double> DistanceKm;
+		//	public readonly IList<double> TargetSpeed;
+		//	public readonly IList<double> Altitude;
+
+		//	public MissionProfile(IModalDataContainer m)
+		//	{
+		//		DistanceKm = m.GetValues<Meter>(ModalResultField.dist).Select(v => v.ConvertTo().Kilo.Meter).ToDouble();
+		//		TargetSpeed =
+		//			m.GetValues<MeterPerSecond>(ModalResultField.v_targ).Select(v => v.ConvertTo().Kilo.Meter.Per.Hour).ToDouble();
+		//		Altitude = m.GetValues<Meter>(ModalResultField.altitude).ToDouble();
+		//	}
+		//}
+
+		/// <summary>
+		/// Dictionary of MissionTypes and their corresponding results.
+		/// </summary>
+		protected readonly Dictionary<MissionType, ResultContainer<T>> Missions =
+			new Dictionary<MissionType, ResultContainer<T>>();
+
+		/// <summary>
+		/// The full load curve.
+		/// </summary>
+		internal Dictionary<uint, EngineFullLoadCurve> Flc { get; set; }
+
+		/// <summary>
+		/// The declaration segment from the segment table
+		/// </summary>
+		internal Segment? Segment { get; set; }
+
+
+		/// <summary>
+		/// The result count determines how many results must be given before the report gets written.
+		/// </summary>
+		private int _resultCount;
+
+		[MethodImpl(MethodImplOptions.Synchronized)]
+		public void PrepareResult(LoadingType loading, Mission mission, VectoRunData runData)
+		{
+			if (!Missions.ContainsKey(mission.MissionType)) {
+				Missions[mission.MissionType] = new ResultContainer<T>() {
+					Mission = mission.MissionType,
+					ModData = new Dictionary<LoadingType, T>(),
+				};
+			}
+			Missions[mission.MissionType].ModData[loading] = new T();
+			_resultCount++;
+		}
+
+
+		[MethodImpl(MethodImplOptions.Synchronized)]
+		public void AddResult(LoadingType loadingType, Mission mission, VectoRunData runData,
+			IModalDataContainer modData)
+		{
+			if (modData.RunStatus != VectoRun.Status.Success) {
+				//Missions.Clear();
+				return;
+			}
+			if (!Missions.ContainsKey(mission.MissionType)) {
+				throw new VectoException("Unknown mission type {0} for generating declaration report", mission.MissionType);
+			}
+			if (!Missions[mission.MissionType].ModData.ContainsKey(loadingType)) {
+				throw new VectoException("Unknown loading type {0} for mission {1}", loadingType, mission.MissionType);
+			}
+			//if (Missions[mission.MissionType].MissionProfile == null) {
+			//	Missions[mission.MissionType].MissionProfile = new MissionProfile(modData);
+			//}
+			_resultCount--;
+
+			DoAddResult(Missions[mission.MissionType].ModData[loadingType], runData, modData);
+
+			if (_resultCount == 0) {
+				DoWriteReport();
+				Flc = null;
+				Segment = null;
+			}
+		}
+
+		/// <summary>
+		/// Adds the result of one run for the specific mission and loading. If all runs finished (given by the resultCount) the report will be written.
+		/// </summary>
+		/// <param name="entry"></param>
+		/// <param name="runData"></param>
+		/// <param name="modData">The mod data.</param>
+		[MethodImpl(MethodImplOptions.Synchronized)]
+		protected abstract void DoAddResult(T entry, VectoRunData runData, IModalDataContainer modData);
+
+
+		protected internal abstract void DoWriteReport();
+
+
+		public void InitializeReport(VectoRunData modelData, Segment segment)
+		{
+			Segment = segment;
+
+			DoInitializeReport(modelData, segment);
+		}
+
+		protected abstract void DoInitializeReport(VectoRunData modelData, Segment segment);
+	}
 }
\ No newline at end of file
diff --git a/VectoCore/VectoCore/OutputData/SummaryDataContainer.cs b/VectoCore/VectoCore/OutputData/SummaryDataContainer.cs
index 10c29e57190056f883d4a4147a85447b36f5b292..1e514478daf2189cb6adeb5e73b36615ed3faff7 100644
--- a/VectoCore/VectoCore/OutputData/SummaryDataContainer.cs
+++ b/VectoCore/VectoCore/OutputData/SummaryDataContainer.cs
@@ -58,7 +58,7 @@ namespace TUGraz.VectoCore.OutputData
 		public const string INPUTFILE = "Input File [-]";
 		public const string CYCLE = "Cycle [-]";
 		public const string STATUS = "Status";
-		public const string CURB_MASS = "Chassis curb mass [kg]";
+		public const string CURB_MASS = "Corrected Actual Curb Mass [kg]";
 		public const string LOADING = "Loading [kg]";
 
 		public const string VEHICLE_MANUFACTURER = "Vehicle manufacturer [-]";
@@ -168,7 +168,7 @@ namespace TUGraz.VectoCore.OutputData
 		public const string CRUISE_TIMESHARE = "CruiseTimeShare [%]";
 		public const string STOP_TIMESHARE = "StopTimeShare [%]";
 
-		public const string MAX_SPEED = "max. speed [km/h";
+		public const string MAX_SPEED = "max. speed [km/h]";
 		public const string MAX_ACCELERATION = "max. acc [m/s²]";
 		public const string MAX_DECELERATION = "max. dec [m/s²]";
 		public const string AVG_ENGINE_SPEED = "n_eng_avg [rpm]";
@@ -180,6 +180,10 @@ namespace TUGraz.VectoCore.OutputData
 
 		public const string TIME_SHARE_PER_GEAR_FORMAT = "Gear {0} TimeShare [%]";
 
+		public const string NUM_AXLES_DRIVEN = "Number axles vehicle driven [-]";
+		public const string NUM_AXLES_NON_DRIVEN = "Number axles vehicle non-driven [-]";
+		public const string NUM_AXLES_TRAILER = "Number axles trailer [-]";
+
 		// ReSharper restore InconsistentNaming
 
 		internal readonly DataTable Table;
@@ -228,6 +232,9 @@ namespace TUGraz.VectoCore.OutputData
 				Tuple.Create(ROLLING_RESISTANCE_COEFFICIENT_W_TRAILER, typeof(double)),
 				Tuple.Create(ROLLING_RESISTANCE_COEFFICIENT_WO_TRAILER, typeof(double)),
 				Tuple.Create(R_DYN, typeof(SI)),
+				Tuple.Create(NUM_AXLES_DRIVEN, typeof(int)),
+				Tuple.Create(NUM_AXLES_NON_DRIVEN, typeof(int)),
+				Tuple.Create(NUM_AXLES_TRAILER, typeof(int)),
 				Tuple.Create(GEARBOX_MANUFACTURER, typeof(string)),
 				Tuple.Create(GEARBOX_MODEL, typeof(string)),
 				Tuple.Create(GEARBOX_TYPE, typeof(string)),
@@ -267,15 +274,16 @@ namespace TUGraz.VectoCore.OutputData
 				E_FCMAP_POS, E_FCMAP_NEG, E_POWERTRAIN_INERTIA,
 				E_AUX, E_CLUTCH_LOSS, E_TC_LOSS, E_SHIFT_LOSS, E_GBX_LOSS,
 				E_RET_LOSS, E_ANGLE_LOSS, E_AXL_LOSS, E_BRAKE, E_VEHICLE_INERTIA, E_AIR, E_ROLL, E_GRAD,
-				ACC, ACC_POS, ACC_NEG, ACC_TIMESHARE, DEC_TIMESHARE, CRUISE_TIMESHARE, STOP_TIMESHARE,
+				ACC, ACC_POS, ACC_NEG, ACC_TIMESHARE, DEC_TIMESHARE, CRUISE_TIMESHARE,
 				MAX_SPEED, MAX_ACCELERATION, MAX_DECELERATION, AVG_ENGINE_SPEED, MAX_ENGINE_SPEED, NUM_GEARSHIFTS,
-				ENGINE_FULL_LOAD_TIME_SHARE, COASTING_TIME_SHARE, BRAKING_TIME_SHARE
+				STOP_TIMESHARE, ENGINE_FULL_LOAD_TIME_SHARE, COASTING_TIME_SHARE, BRAKING_TIME_SHARE
 			}.Select(x => new DataColumn(x, typeof(SI))).ToArray());
 		}
 
 		/// <summary>
 		/// Finishes the summary data container (writes the data to the sumWriter).
 		/// </summary>
+		[MethodImpl(MethodImplOptions.Synchronized)]
 		public virtual void Finish()
 		{
 			if (_sumWriter != null) {
@@ -293,8 +301,6 @@ namespace TUGraz.VectoCore.OutputData
 		/// Writes the result of one run into the summary data container.
 		/// </summary>
 		[MethodImpl(MethodImplOptions.Synchronized)]
-		//public virtual void Write(IModalDataContainer modData, string jobFileName, string jobName, string cycleFileName,
-		//	Kilogram vehicleMass, Kilogram vehicleLoading, CubicMeter cargoVolume, uint gearCount)
 		public virtual void Write(IModalDataContainer modData, int jobNr, int runNr, VectoRunData runData)
 		{
 			var row = Table.NewRow();
@@ -309,108 +315,9 @@ namespace TUGraz.VectoCore.OutputData
 
 			var vehicleLoading = 0.SI<Kilogram>();
 			var cargoVolume = 0.SI<CubicMeter>();
-			uint gearCount = 0u;
+			var gearCount = 0u;
 			if (runData.Cycle.CycleType != CycleType.EngineOnly) {
-				row[VEHICLE_MANUFACTURER] = runData.VehicleData.Manufacturer;
-				row[VIN_NUMBER] = runData.VehicleData.VIN;
-				row[VEHICLE_MODEL] = runData.VehicleData.ModelName;
-
-				row[HDV_CO2_VEHICLE_CLASS] = runData.VehicleData.VehicleClass.GetClassNumber();
-				row[CURB_MASS] = runData.VehicleData.CurbWeight;
-				// - (runData.VehicleData.BodyAndTrailerWeight ?? 0.SI<Kilogram>());
-				row[LOADING] = runData.VehicleData.Loading;
-				row[CARGO_VOLUME] = runData.VehicleData.CargoVolume;
-
-				row[TOTAL_VEHICLE_MASS] = runData.VehicleData.TotalVehicleWeight;
-				row[ENGINE_MANUFACTURER] = runData.EngineData.Manufacturer;
-				row[ENGINE_MODEL] = runData.EngineData.ModelName;
-				row[ENGINE_FUEL_TYPE] = runData.EngineData.FuelType.GetLabel();
-				row[ENGINE_RATED_POWER] = runData.EngineData.RatedPowerDeclared != null
-					? runData.EngineData.RatedPowerDeclared.ConvertTo().Kilo.Watt
-					: runData.EngineData.FullLoadCurves[0].MaxPower.ConvertTo().Kilo.Watt;
-				row[ENGINE_IDLING_SPEED] = runData.EngineData.IdleSpeed.AsRPM.SI<Scalar>();
-				row[ENGINE_RATED_SPEED] = runData.EngineData.RatedSpeedDeclared != null
-					? runData.EngineData.RatedSpeedDeclared.AsRPM.SI<Scalar>()
-					: runData.EngineData.FullLoadCurves[0].RatedSpeed.AsRPM.SI<Scalar>();
-				row[ENGINE_DISPLACEMENT] = runData.EngineData.Displacement.ConvertTo().Cubic.Centi.Meter;
-
-				row[ENGINE_WHTC_URBAN] = runData.EngineData.WHTCUrban;
-				row[ENGINE_WHTC_RURAL] = runData.EngineData.WHTCRural;
-				row[ENGINE_WHTC_MOTORWAY] = runData.EngineData.WHTCMotorway;
-				row[ENGINE_BF_COLD_HOT] = runData.EngineData.ColdHotCorrectionFactor;
-				row[ENGINE_CF_REG_PER] = runData.EngineData.CorrectionFactorRegPer;
-				row[ENGINE_ACTUAL_CORRECTION_FACTOR] = runData.EngineData.FuelConsumptionCorrectionFactor;
-
-				row[CD_x_A] = runData.AirdragData.CrossWindCorrectionCurve.AirDragArea;
-
-				row[ROLLING_RESISTANCE_COEFFICIENT_WO_TRAILER] =
-					runData.VehicleData.RollResistanceCoefficientWithoutTrailer;
-				row[ROLLING_RESISTANCE_COEFFICIENT_W_TRAILER] =
-					runData.VehicleData.TotalRollResistanceCoefficient;
-
-				row[R_DYN] = runData.VehicleData.DynamicTyreRadius;
-
-				row[GEARBOX_MANUFACTURER] = runData.GearboxData.Manufacturer;
-				row[GEARBOX_MODEL] = runData.GearboxData.ModelName;
-				row[GEARBOX_TYPE] = runData.GearboxData.Type;
-				if (runData.GearboxData.Type.AutomaticTransmission()) {
-					row[GEAR_RATIO_FIRST_GEAR] = runData.GearboxData.Gears.Count > 0
-						? (double.IsNaN(runData.GearboxData.Gears.First().Value.Ratio)
-							? runData.GearboxData.Gears.First().Value.TorqueConverterRatio.SI<Scalar>()
-							: runData.GearboxData.Gears.First().Value.Ratio.SI<Scalar>())
-						: 0.SI<Scalar>();
-					row[GEAR_RATIO_LAST_GEAR] = runData.GearboxData.Gears.Count > 0
-						? runData.GearboxData.Gears.Last().Value.Ratio.SI<Scalar>()
-						: 0.SI<Scalar>();
-					row[TORQUECONVERTER_MANUFACTURER] = runData.GearboxData.TorqueConverterData.Manufacturer;
-					row[TORQUECONVERTER_MODEL] = runData.GearboxData.TorqueConverterData.ModelName;
-				} else {
-					row[GEAR_RATIO_FIRST_GEAR] = runData.GearboxData.Gears.Count > 0
-						? runData.GearboxData.Gears.First().Value.Ratio.SI<Scalar>()
-						: 0.SI<Scalar>();
-					row[GEAR_RATIO_LAST_GEAR] = runData.GearboxData.Gears.Count > 0
-						? runData.GearboxData.Gears.Last().Value.Ratio.SI<Scalar>()
-						: 0.SI<Scalar>();
-					row[TORQUECONVERTER_MANUFACTURER] = "n.a.";
-					row[TORQUECONVERTER_MODEL] = "n.a.";
-				}
-				row[RETARDER_TYPE] = runData.Retarder.Type.GetLabel();
-				if (runData.Retarder.Type.IsDedicatedComponent()) {
-					row[RETARDER_MANUFACTURER] = runData.Retarder.Manufacturer;
-					row[RETARDER_MODEL] = runData.Retarder.ModelName;
-				} else {
-					row[RETARDER_MANUFACTURER] = "n.a.";
-					row[RETARDER_MODEL] = "n.a.";
-				}
-
-				if (runData.AngledriveData != null) {
-					row[ANGLEDRIVE_MANUFACTURER] = runData.AngledriveData.Manufacturer;
-					row[ANGLEDRIVE_MODEL] = runData.AngledriveData.ModelName;
-					row[ANGLEDRIVE_RATIO] = runData.AngledriveData.Angledrive.Ratio;
-				} else {
-					row[ANGLEDRIVE_MANUFACTURER] = "n.a.";
-					row[ANGLEDRIVE_MODEL] = "n.a.";
-					row[ANGLEDRIVE_RATIO] = "n.a.";
-				}
-
-				row[AXLE_MANUFACTURER] = runData.AxleGearData.Manufacturer;
-				row[AXLE_MODEL] = runData.AxleGearData.ModelName;
-				row[AXLE_RATIO] = runData.AxleGearData.AxleGear.Ratio.SI<Scalar>();
-
-				foreach (var aux in runData.Aux) {
-					if (aux.ID == Constants.Auxiliaries.IDs.PTOConsumer || aux.ID == Constants.Auxiliaries.IDs.PTOTransmission) {
-						continue;
-					}
-					var colName = string.Format(AUX_TECH_FORMAT, aux.ID);
-
-					if (!Table.Columns.Contains(colName)) {
-						var col = Table.Columns.Add(colName, typeof(string));
-						// move the new column to correct position
-						col.SetOrdinal(Table.Columns[CARGO_VOLUME].Ordinal);
-					}
-
-					row[colName] = aux.Technology == null ? "" : string.Join("; ", aux.Technology);
-				}
+				WriteFullPowertrain(runData, row);
 
 				cargoVolume = runData.VehicleData.CargoVolume;
 				vehicleLoading = runData.VehicleData.Loading;
@@ -433,6 +340,43 @@ namespace TUGraz.VectoCore.OutputData
 
 			row[ALTITUDE_DELTA] = modData.AltitudeDelta();
 
+			WriteFuelconsumptionEntries(modData, row, vehicleLoading, cargoVolume);
+
+			var kilogramPerMeter = modData.CO2PerMeter();
+			if (kilogramPerMeter != null) {
+				row[CO2_KM] = kilogramPerMeter.ConvertTo().Gramm.Per.Kilo.Meter;
+				if (vehicleLoading != null && !vehicleLoading.IsEqual(0)) {
+					row[CO2_TKM] = kilogramPerMeter.ConvertTo().Gramm.Per.Kilo.Meter / vehicleLoading.ConvertTo().Ton;
+				}
+				if (cargoVolume > 0) {
+					row[CO2_M3KM] = kilogramPerMeter.ConvertTo().Gramm.Per.Kilo.Meter / cargoVolume;
+				}
+			}
+
+			row[P_WHEEL_POS] = modData.PowerWheelPositive().ConvertTo().Kilo.Watt;
+
+			row[P_FCMAP_POS] = modData.TotalPowerEnginePositiveAverage().ConvertTo().Kilo.Watt;
+
+			WriteAuxiliaries(modData, row);
+
+			WriteWorkEntries(modData, row);
+
+			WritePerformanceEntries(modData, row);
+
+			row[ENGINE_FULL_LOAD_TIME_SHARE] = modData.EngineMaxLoadTimeShare();
+			row[COASTING_TIME_SHARE] = modData.CoastingTimeShare();
+			row[BRAKING_TIME_SHARE] = modData.BrakingTimeShare();
+
+			if (gearCount <= 0) {
+				return;
+			}
+
+			WriteGearshiftStats(modData, row, gearCount);
+		}
+
+		private static void WriteFuelconsumptionEntries(IModalDataContainer modData, DataRow row, Kilogram vehicleLoading,
+			CubicMeter cargoVolume)
+		{
 			row[FCMAP_H] = modData.FCMapPerSecond().ConvertTo().Gramm.Per.Hour;
 			var fcMapPerMeter = modData.FCMapPerMeter();
 			if (fcMapPerMeter != null) {
@@ -441,27 +385,19 @@ namespace TUGraz.VectoCore.OutputData
 
 			row[FCAUXC_H] = modData.FuelConsumptionAuxStartStopPerSecond().ConvertTo().Gramm.Per.Hour;
 			var fuelConsumptionAuxStartStopCorrected = modData.FuelConsumptionAuxStartStop();
-			if (fuelConsumptionAuxStartStopCorrected != null) {
-				row[FCAUXC_KM] = fuelConsumptionAuxStartStopCorrected.ConvertTo().Gramm.Per.Kilo.Meter;
-			}
+			row[FCAUXC_KM] = FuelConsumptionAsGrammPerKiloMeter(fuelConsumptionAuxStartStopCorrected);
 
 			row[FCWHTCC_H] = modData.FuelConsumptionWHTCPerSecond().ConvertTo().Gramm.Per.Hour;
 			var fuelConsumptionWHTCCorrected = modData.FuelConsumptionWHTC();
-			if (fuelConsumptionWHTCCorrected != null) {
-				row[FCWHTCC_KM] = fuelConsumptionWHTCCorrected.ConvertTo().Gramm.Per.Kilo.Meter;
-			}
+			row[FCWHTCC_KM] = FuelConsumptionAsGrammPerKiloMeter(fuelConsumptionWHTCCorrected);
 
 			row[FCAAUX_H] = modData.FuelConsumptionAAUXPerSecond().ConvertTo().Gramm.Per.Hour;
 			var fuelConsumptionAaux = modData.FuelConsumptionAAUX();
-			if (fuelConsumptionAaux != null) {
-				row[FCAAUX_KM] = fuelConsumptionAaux.ConvertTo().Gramm.Per.Kilo.Meter;
-			}
+			row[FCAAUX_KM] = FuelConsumptionAsGrammPerKiloMeter(fuelConsumptionAaux);
 
 			row[FCFINAL_H] = modData.FuelConsumptionFinalPerSecond().ConvertTo().Gramm.Per.Hour;
 			var fcfinal = modData.FuelConsumptionFinal();
-			if (fcfinal != null) {
-				row[FCFINAL_KM] = fcfinal.ConvertTo().Gramm.Per.Kilo.Meter;
-			}
+			row[FCFINAL_KM] = FuelConsumptionAsGrammPerKiloMeter(fcfinal);
 
 			var fcPer100lkm = modData.FuelConsumptionFinalLiterPer100Kilometer();
 			row[FCFINAL_LITERPER100KM] = fcPer100lkm;
@@ -472,22 +408,18 @@ namespace TUGraz.VectoCore.OutputData
 			if (cargoVolume > 0 && fcPer100lkm != null) {
 				row[FCFINAL_LiterPer100M3KM] = fcPer100lkm / cargoVolume;
 			}
+		}
 
-			var kilogramPerMeter = modData.CO2PerMeter();
-			if (kilogramPerMeter != null) {
-				row[CO2_KM] = kilogramPerMeter.ConvertTo().Gramm.Per.Kilo.Meter;
-				if (vehicleLoading != null && !vehicleLoading.IsEqual(0)) {
-					row[CO2_TKM] = kilogramPerMeter.ConvertTo().Gramm.Per.Kilo.Meter / vehicleLoading.ConvertTo().Ton;
-				}
-				if (cargoVolume > 0) {
-					row[CO2_M3KM] = kilogramPerMeter.ConvertTo().Gramm.Per.Kilo.Meter / cargoVolume;
-				}
+		private static SI FuelConsumptionAsGrammPerKiloMeter(SI fc)
+		{
+			if (fc == null) {
+				return null;
 			}
+			return fc.ConvertTo().Gramm.Per.Kilo.Meter;
+		}
 
-			row[P_WHEEL_POS] = modData.PowerWheelPositive().ConvertTo().Kilo.Watt;
-
-			row[P_FCMAP_POS] = modData.TotalPowerEnginePositiveAverage().ConvertTo().Kilo.Watt;
-
+		private void WriteAuxiliaries(IModalDataContainer modData, DataRow row)
+		{
 			foreach (var aux in modData.Auxiliaries) {
 				string colName;
 				if (aux.Key == Constants.Auxiliaries.IDs.PTOConsumer || aux.Key == Constants.Auxiliaries.IDs.PTOTransmission) {
@@ -504,27 +436,24 @@ namespace TUGraz.VectoCore.OutputData
 
 				row[colName] = modData.AuxiliaryWork(aux.Value).ConvertTo().Kilo.Watt.Hour;
 			}
+		}
 
-			row[E_FCMAP_POS] = modData.TotalEngineWorkPositive().ConvertTo().Kilo.Watt.Hour;
-			row[E_FCMAP_NEG] = -modData.TotalEngineWorkNegative().ConvertTo().Kilo.Watt.Hour;
-			row[E_POWERTRAIN_INERTIA] = modData.PowerAccelerations().ConvertTo().Kilo.Watt.Hour;
-			row[E_AUX] = modData.WorkAuxiliaries().ConvertTo().Kilo.Watt.Hour;
-			row[E_CLUTCH_LOSS] = modData.WorkClutch().ConvertTo().Kilo.Watt.Hour;
-			row[E_TC_LOSS] = modData.WorkTorqueConverter().ConvertTo().Kilo.Watt.Hour;
-			row[E_SHIFT_LOSS] = modData.WorkGearshift().ConvertTo().Kilo.Watt.Hour;
-			row[E_GBX_LOSS] = modData.WorkGearbox().ConvertTo().Kilo.Watt.Hour;
-			row[E_RET_LOSS] = modData.WorkRetarder().ConvertTo().Kilo.Watt.Hour;
-			row[E_AXL_LOSS] = modData.WorkAxlegear().ConvertTo().Kilo.Watt.Hour;
-			row[E_ANGLE_LOSS] = modData.WorkAngledrive().ConvertTo().Kilo.Watt.Hour;
-			row[E_BRAKE] = modData.WorkTotalMechanicalBrake().ConvertTo().Kilo.Watt.Hour;
-			row[E_VEHICLE_INERTIA] = modData.WorkVehicleInertia().ConvertTo().Kilo.Watt.Hour;
-			row[E_AIR] = modData.WorkAirResistance().ConvertTo().Kilo.Watt.Hour;
-			row[E_ROLL] = modData.WorkRollingResistance().ConvertTo().Kilo.Watt.Hour;
-			row[E_GRAD] = modData.WorkRoadGradientResistance().ConvertTo().Kilo.Watt.Hour;
-
-			//var acc = modData.AccelerationPer3Seconds();
+		private void WriteGearshiftStats(IModalDataContainer modData, DataRow row, uint gearCount)
+		{
+			row[NUM_GEARSHIFTS] = modData.GearshiftCount();
+			var timeSharePerGear = modData.TimeSharePerGear(gearCount);
 
+			for (uint i = 0; i <= gearCount; i++) {
+				var colName = string.Format(TIME_SHARE_PER_GEAR_FORMAT, i);
+				if (!Table.Columns.Contains(colName)) {
+					Table.Columns.Add(colName, typeof(SI));
+				}
+				row[colName] = timeSharePerGear[i];
+			}
+		}
 
+		private void WritePerformanceEntries(IModalDataContainer modData, DataRow row)
+		{
 			row[ACC] = modData.AccelerationAverage();
 			row[ACC_POS] = modData.AccelerationsPositive();
 			row[ACC_NEG] = modData.AccelerationsNegative();
@@ -542,25 +471,6 @@ namespace TUGraz.VectoCore.OutputData
 			row[MAX_DECELERATION] = modData.MaxDeceleration();
 			row[AVG_ENGINE_SPEED] = modData.AvgEngineSpeed().AsRPM.SI<Scalar>();
 			row[MAX_ENGINE_SPEED] = modData.MaxEngineSpeed().AsRPM.SI<Scalar>();
-
-			row[ENGINE_FULL_LOAD_TIME_SHARE] = modData.EngineMaxLoadTimeShare();
-			row[COASTING_TIME_SHARE] = modData.CoastingTimeShare();
-			row[BRAKING_TIME_SHARE] = modData.BrakingTimeShare();
-
-			if (gearCount <= 0) {
-				return;
-			}
-
-			row[NUM_GEARSHIFTS] = modData.GearshiftCount();
-			var timeSharePerGear = modData.TimeSharePerGear(gearCount);
-
-			for (uint i = 0; i <= gearCount; i++) {
-				var colName = string.Format(TIME_SHARE_PER_GEAR_FORMAT, i);
-				if (!Table.Columns.Contains(colName)) {
-					Table.Columns.Add(colName, typeof(SI));
-				}
-				row[colName] = timeSharePerGear[i];
-			}
 			if (accTimeShare != null && decTimeShare != null && cruiseTimeShare != null) {
 				var shareSum = accTimeShare + decTimeShare + cruiseTimeShare + stopTimeShare;
 				if (!shareSum.IsEqual(100)) {
@@ -573,6 +483,155 @@ namespace TUGraz.VectoCore.OutputData
 			}
 		}
 
+		private static void WriteWorkEntries(IModalDataContainer modData, DataRow row)
+		{
+			row[E_FCMAP_POS] = modData.TotalEngineWorkPositive().ConvertTo().Kilo.Watt.Hour;
+			row[E_FCMAP_NEG] = -modData.TotalEngineWorkNegative().ConvertTo().Kilo.Watt.Hour;
+			row[E_POWERTRAIN_INERTIA] = modData.PowerAccelerations().ConvertTo().Kilo.Watt.Hour;
+			row[E_AUX] = modData.WorkAuxiliaries().ConvertTo().Kilo.Watt.Hour;
+			row[E_CLUTCH_LOSS] = modData.WorkClutch().ConvertTo().Kilo.Watt.Hour;
+			row[E_TC_LOSS] = modData.WorkTorqueConverter().ConvertTo().Kilo.Watt.Hour;
+			row[E_SHIFT_LOSS] = modData.WorkGearshift().ConvertTo().Kilo.Watt.Hour;
+			row[E_GBX_LOSS] = modData.WorkGearbox().ConvertTo().Kilo.Watt.Hour;
+			row[E_RET_LOSS] = modData.WorkRetarder().ConvertTo().Kilo.Watt.Hour;
+			row[E_AXL_LOSS] = modData.WorkAxlegear().ConvertTo().Kilo.Watt.Hour;
+			row[E_ANGLE_LOSS] = modData.WorkAngledrive().ConvertTo().Kilo.Watt.Hour;
+			row[E_BRAKE] = modData.WorkTotalMechanicalBrake().ConvertTo().Kilo.Watt.Hour;
+			row[E_VEHICLE_INERTIA] = modData.WorkVehicleInertia().ConvertTo().Kilo.Watt.Hour;
+			row[E_AIR] = modData.WorkAirResistance().ConvertTo().Kilo.Watt.Hour;
+			row[E_ROLL] = modData.WorkRollingResistance().ConvertTo().Kilo.Watt.Hour;
+			row[E_GRAD] = modData.WorkRoadGradientResistance().ConvertTo().Kilo.Watt.Hour;
+		}
+
+		private void WriteFullPowertrain(VectoRunData runData, DataRow row)
+		{
+			row[VEHICLE_MANUFACTURER] = runData.VehicleData.Manufacturer;
+			row[VIN_NUMBER] = runData.VehicleData.VIN;
+			row[VEHICLE_MODEL] = runData.VehicleData.ModelName;
+
+			row[HDV_CO2_VEHICLE_CLASS] = runData.VehicleData.VehicleClass.GetClassNumber();
+			row[CURB_MASS] = runData.VehicleData.CurbWeight;
+			// - (runData.VehicleData.BodyAndTrailerWeight ?? 0.SI<Kilogram>());
+			row[LOADING] = runData.VehicleData.Loading;
+			row[CARGO_VOLUME] = runData.VehicleData.CargoVolume;
+
+			row[TOTAL_VEHICLE_MASS] = runData.VehicleData.TotalVehicleWeight;
+			row[ENGINE_MANUFACTURER] = runData.EngineData.Manufacturer;
+			row[ENGINE_MODEL] = runData.EngineData.ModelName;
+			row[ENGINE_FUEL_TYPE] = runData.EngineData.FuelType.GetLabel();
+			row[ENGINE_RATED_POWER] = runData.EngineData.RatedPowerDeclared != null
+				? runData.EngineData.RatedPowerDeclared.ConvertTo().Kilo.Watt
+				: runData.EngineData.FullLoadCurves[0].MaxPower.ConvertTo().Kilo.Watt;
+			row[ENGINE_IDLING_SPEED] = runData.EngineData.IdleSpeed.AsRPM.SI<Scalar>();
+			row[ENGINE_RATED_SPEED] = runData.EngineData.RatedSpeedDeclared != null
+				? runData.EngineData.RatedSpeedDeclared.AsRPM.SI<Scalar>()
+				: runData.EngineData.FullLoadCurves[0].RatedSpeed.AsRPM.SI<Scalar>();
+			row[ENGINE_DISPLACEMENT] = runData.EngineData.Displacement.ConvertTo().Cubic.Centi.Meter;
+
+			row[ENGINE_WHTC_URBAN] = runData.EngineData.WHTCUrban;
+			row[ENGINE_WHTC_RURAL] = runData.EngineData.WHTCRural;
+			row[ENGINE_WHTC_MOTORWAY] = runData.EngineData.WHTCMotorway;
+			row[ENGINE_BF_COLD_HOT] = runData.EngineData.ColdHotCorrectionFactor;
+			row[ENGINE_CF_REG_PER] = runData.EngineData.CorrectionFactorRegPer;
+			row[ENGINE_ACTUAL_CORRECTION_FACTOR] = runData.EngineData.FuelConsumptionCorrectionFactor;
+
+			row[CD_x_A] = runData.AirdragData.CrossWindCorrectionCurve.AirDragArea;
+
+			row[ROLLING_RESISTANCE_COEFFICIENT_WO_TRAILER] =
+				runData.VehicleData.RollResistanceCoefficientWithoutTrailer;
+			row[ROLLING_RESISTANCE_COEFFICIENT_W_TRAILER] =
+				runData.VehicleData.TotalRollResistanceCoefficient;
+
+			row[R_DYN] = runData.VehicleData.DynamicTyreRadius;
+
+			row[NUM_AXLES_DRIVEN] = runData.VehicleData.AxleData.Count(x => x.AxleType == AxleType.VehicleDriven);
+			row[NUM_AXLES_NON_DRIVEN] = runData.VehicleData.AxleData.Count(x => x.AxleType == AxleType.VehicleNonDriven);
+			row[NUM_AXLES_TRAILER] = runData.VehicleData.AxleData.Count(x => x.AxleType == AxleType.Trailer);
+
+			row[GEARBOX_MANUFACTURER] = runData.GearboxData.Manufacturer;
+			row[GEARBOX_MODEL] = runData.GearboxData.ModelName;
+			row[GEARBOX_TYPE] = runData.GearboxData.Type;
+			WriteGearboxData(runData, row);
+
+			row[RETARDER_TYPE] = runData.Retarder.Type.GetLabel();
+			WriteRetarderData(runData, row);
+
+			WriteAngledriveData(runData, row);
+
+			row[AXLE_MANUFACTURER] = runData.AxleGearData.Manufacturer;
+			row[AXLE_MODEL] = runData.AxleGearData.ModelName;
+			row[AXLE_RATIO] = runData.AxleGearData.AxleGear.Ratio.SI<Scalar>();
+
+			WriteAuxTechnologies(runData, row);
+		}
+
+		private void WriteAuxTechnologies(VectoRunData runData, DataRow row)
+		{
+			foreach (var aux in runData.Aux) {
+				if (aux.ID == Constants.Auxiliaries.IDs.PTOConsumer || aux.ID == Constants.Auxiliaries.IDs.PTOTransmission) {
+					continue;
+				}
+				var colName = string.Format(AUX_TECH_FORMAT, aux.ID);
+
+				if (!Table.Columns.Contains(colName)) {
+					var col = Table.Columns.Add(colName, typeof(string));
+					// move the new column to correct position
+					col.SetOrdinal(Table.Columns[CARGO_VOLUME].Ordinal);
+				}
+
+				row[colName] = aux.Technology == null ? "" : string.Join("; ", aux.Technology);
+			}
+		}
+
+		private static void WriteAngledriveData(VectoRunData runData, DataRow row)
+		{
+			if (runData.AngledriveData != null) {
+				row[ANGLEDRIVE_MANUFACTURER] = runData.AngledriveData.Manufacturer;
+				row[ANGLEDRIVE_MODEL] = runData.AngledriveData.ModelName;
+				row[ANGLEDRIVE_RATIO] = runData.AngledriveData.Angledrive.Ratio;
+			} else {
+				row[ANGLEDRIVE_MANUFACTURER] = "n.a.";
+				row[ANGLEDRIVE_MODEL] = "n.a.";
+				row[ANGLEDRIVE_RATIO] = "n.a.";
+			}
+		}
+
+		private static void WriteRetarderData(VectoRunData runData, DataRow row)
+		{
+			if (runData.Retarder.Type.IsDedicatedComponent()) {
+				row[RETARDER_MANUFACTURER] = runData.Retarder.Manufacturer;
+				row[RETARDER_MODEL] = runData.Retarder.ModelName;
+			} else {
+				row[RETARDER_MANUFACTURER] = "n.a.";
+				row[RETARDER_MODEL] = "n.a.";
+			}
+		}
+
+		private static void WriteGearboxData(VectoRunData runData, DataRow row)
+		{
+			if (runData.GearboxData.Type.AutomaticTransmission()) {
+				row[GEAR_RATIO_FIRST_GEAR] = runData.GearboxData.Gears.Count > 0
+					? (double.IsNaN(runData.GearboxData.Gears.First().Value.Ratio)
+						? runData.GearboxData.Gears.First().Value.TorqueConverterRatio.SI<Scalar>()
+						: runData.GearboxData.Gears.First().Value.Ratio.SI<Scalar>())
+					: 0.SI<Scalar>();
+				row[GEAR_RATIO_LAST_GEAR] = runData.GearboxData.Gears.Count > 0
+					? runData.GearboxData.Gears.Last().Value.Ratio.SI<Scalar>()
+					: 0.SI<Scalar>();
+				row[TORQUECONVERTER_MANUFACTURER] = runData.GearboxData.TorqueConverterData.Manufacturer;
+				row[TORQUECONVERTER_MODEL] = runData.GearboxData.TorqueConverterData.ModelName;
+			} else {
+				row[GEAR_RATIO_FIRST_GEAR] = runData.GearboxData.Gears.Count > 0
+					? runData.GearboxData.Gears.First().Value.Ratio.SI<Scalar>()
+					: 0.SI<Scalar>();
+				row[GEAR_RATIO_LAST_GEAR] = runData.GearboxData.Gears.Count > 0
+					? runData.GearboxData.Gears.Last().Value.Ratio.SI<Scalar>()
+					: 0.SI<Scalar>();
+				row[TORQUECONVERTER_MANUFACTURER] = "n.a.";
+				row[TORQUECONVERTER_MODEL] = "n.a.";
+			}
+		}
+
 		private static string ReplaceNotAllowedCharacters(string text)
 		{
 			return text.Replace('#', '_').Replace(',', '_').Replace('\n', '_').Replace('\r', '_');
diff --git a/VectoCore/VectoCore/OutputData/XML/XMLCustomerReport.cs b/VectoCore/VectoCore/OutputData/XML/XMLCustomerReport.cs
index 8742c8467be3c5437720170033726828683d3488..49a9821d455d6642223baa89463a2e5c5ceb6b64 100644
--- a/VectoCore/VectoCore/OutputData/XML/XMLCustomerReport.cs
+++ b/VectoCore/VectoCore/OutputData/XML/XMLCustomerReport.cs
@@ -74,7 +74,7 @@ namespace TUGraz.VectoCore.OutputData.XML
 				new XElement(tns + XMLNames.Component_Manufacturer, modelData.VehicleData.Manufacturer),
 				new XElement(tns + XMLNames.Component_ManufacturerAddress, modelData.VehicleData.ManufacturerAddress),
 				new XElement(tns + XMLNames.Vehicle_VIN, modelData.VehicleData.VIN),
-				new XElement(tns + XMLNames.Vehicle_VehicleCategory, modelData.VehicleData.LegislativeClass),
+				new XElement(tns + XMLNames.Vehicle_VehicleCategory, modelData.VehicleData.LegislativeClass.ToXMLFormat()),
 				new XElement(tns + "VehicleGroup", segment.VehicleClass.GetClassNumber()),
 				new XElement(tns + XMLNames.Vehicle_AxleConfiguration, modelData.VehicleData.AxleConfiguration.GetName()),
 				new XElement(tns + XMLNames.Vehicle_GrossVehicleMass, modelData.VehicleData.GrossVehicleWeight.ToXMLFormat(0)),
diff --git a/VectoCore/VectoCore/OutputData/XML/XMLDeclarationReport.cs b/VectoCore/VectoCore/OutputData/XML/XMLDeclarationReport.cs
index 65d3a0821cdbf6ba4c82b6014dea707ca390c833..cd8e02123c5fcfd9655c3b31ce0041886c57b222 100644
--- a/VectoCore/VectoCore/OutputData/XML/XMLDeclarationReport.cs
+++ b/VectoCore/VectoCore/OutputData/XML/XMLDeclarationReport.cs
@@ -29,204 +29,213 @@
 *   Martin Rexeis, rexeis@ivt.tugraz.at, IVT, Graz University of Technology
 */
 
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Xml;
-using System.Xml.Linq;
-using System.Xml.XPath;
-using TUGraz.VectoCommon.Models;
-using TUGraz.VectoCommon.Utils;
-using TUGraz.VectoCore.Models.Declaration;
-using TUGraz.VectoCore.Models.Simulation.Data;
-using TUGraz.VectoCore.Models.Simulation.Impl;
-
-namespace TUGraz.VectoCore.OutputData.XML
-{
-	public class XMLDeclarationReport : DeclarationReport<XMLDeclarationReport.ResultEntry>
-	{
-		private readonly XMLFullReport _fullReport;
-		private readonly XMLCustomerReport _customerReport;
-
-		private readonly IOutputDataWriter _writer;
-
-		public class ResultEntry
-		{
-			public MeterPerSecond AverageSpeed { get; private set; }
-
-			public Joule EnergyConsumptionTotal { get; private set; }
-
-			public Kilogram CO2Total { get; private set; }
-
-			public Kilogram FuelConsumptionTotal { get; private set; }
-
-			public Meter Distance { get; private set; }
-
-			public Scalar GearshiftCount { get; private set; }
-
-			public Scalar FullLoadPercentage { get; private set; }
-
-			public MeterPerSquareSecond MaxDeceleration { get; private set; }
-
-			public MeterPerSquareSecond MaxAcceleration { get; private set; }
-
-			public MeterPerSecond MaxSpeed { get; private set; }
-
-			public MeterPerSecond MinSpeed { get; private set; }
-
-			public string Error { get; private set; }
-
-			public VectoRun.Status Status { get; private set; }
-
-			public string StackTrace { get; private set; }
-
-			public FuelType FuelType { get; private set; }
-
-			public Kilogram Payload { get; private set; }
-
-			public Kilogram TotalVehicleWeight { get; private set; }
-
-			public CubicMeter CargoVolume { get; private set; }
-
-
-			public void SetResultData(VectoRunData runData, IModalDataContainer data)
-			{
-				FuelType = data.FuelData.FuelType;
-				Payload = runData.VehicleData.Loading;
-				CargoVolume = runData.VehicleData.CargoVolume;
-				TotalVehicleWeight = runData.VehicleData.TotalVehicleWeight;
-				Status = data.RunStatus;
-				Error = data.Error;
-				StackTrace = data.StackTrace;
-				AverageSpeed = data.Speed();
-				MinSpeed = data.MinSpeed();
-				MaxSpeed = data.MaxSpeed();
-				MaxAcceleration = data.MaxAcceleration();
-				MaxDeceleration = data.MaxDeceleration();
-				FullLoadPercentage = data.EngineMaxLoadTimeShare();
-				GearshiftCount = data.GearshiftCount();
-
-				Distance = data.Distance();
-
-				FuelConsumptionTotal = data.TimeIntegral<Kilogram>(ModalResultField.FCFinal);
-				CO2Total = FuelConsumptionTotal * data.FuelData.CO2PerFuelWeight;
-				EnergyConsumptionTotal = FuelConsumptionTotal * data.FuelData.LowerHeatingValue;
-			}
-		}
-
-		public XMLDeclarationReport(IOutputDataWriter writer = null)
-		{
-			_fullReport = new XMLFullReport(); //new XDocument(new XDeclaration("1.0", "utf-8", "yes"));
-			_customerReport = new XMLCustomerReport();
-			//CustomerReport = new XDocument(new XDeclaration("1.0", "utf-8", "yes"));
-
-			_writer = writer;
-		}
-
-		public XDocument FullReport
-		{
-			get { return _fullReport.Report; }
-		}
-
-		public XDocument CustomerReport
-		{
-			get { return _customerReport.Report; }
-		}
-
-
-		protected override void DoAddResult(ResultEntry entry, VectoRunData runData, IModalDataContainer modData)
-		{
-			entry.SetResultData(runData, modData);
-		}
-
-		protected internal override void DoWriteReport()
-		{
-			foreach (var result in Missions.OrderBy(m => m.Key)) {
-				_fullReport.AddResult(result.Value);
-				_customerReport.AddResult(result.Value);
-			}
-
-			_fullReport.GenerateReport();
-			var fullReportHash = GetSignature(_fullReport.Report);
-			_customerReport.GenerateReport(fullReportHash);
-
-			if (_writer != null) {
-				using (var xmlWriter = new XmlTextWriter(_writer.WriteStream(ReportType.DeclarationReportXMLFulll), Encoding.UTF8)) {
-					xmlWriter.Formatting = Formatting.Indented;
-					_fullReport.Report.WriteTo(xmlWriter);
-					xmlWriter.Flush();
-					xmlWriter.Close();
-				}
-
-				using (var xmlWriter = new XmlTextWriter(_writer.WriteStream(ReportType.DeclarationReportXMLCOC), Encoding.UTF8)) {
-					xmlWriter.Formatting = Formatting.Indented;
-					_customerReport.Report.WriteTo(xmlWriter);
-					xmlWriter.Flush();
-					xmlWriter.Close();
-				}
-			}
-		}
-
-		private XElement GetSignature(XDocument report)
-		{
-			return report.XPathSelectElement("/*[local-name()='VectoOutput']/*[local-name()='Signature']/*");
-		}
-
-
-		protected override void DoInitializeReport(VectoRunData modelData, Segment segment)
-		{
-			_fullReport.Initialize(modelData, segment);
-			_customerReport.Initialize(modelData, segment);
-		}
-
-
-		public static IEnumerable<XElement> GetResults(ResultEntry result, XNamespace tns, bool fullOutput)
-		{
-			var fuel = FuelData.Instance().Lookup(result.FuelType);
-			var retVal = new List<XElement> {
-				new XElement(tns + "FuelConsumption", new XAttribute("unit", "g/km"),
-					(result.FuelConsumptionTotal.ConvertTo().Gramm / result.Distance.ConvertTo().Kilo.Meter).Value()
-						.ToMinSignificantDigits(3, 1)),
-				new XElement(tns + "FuelConsumption", new XAttribute("unit", "g/t-km"),
-					(result.FuelConsumptionTotal.ConvertTo().Gramm / result.Distance.ConvertTo().Kilo.Meter /
-					result.Payload.ConvertTo().Ton).Value().ToMinSignificantDigits(3, 1)),
-				new XElement(tns + "FuelConsumption", new XAttribute("unit", "g/m³-km"),
-					(result.FuelConsumptionTotal.ConvertTo().Gramm / result.Distance.ConvertTo().Kilo.Meter / result.CargoVolume).Value
-						().ToMinSignificantDigits(3, 1))
-			};
-			//FC
-			if (fullOutput) {
-				retVal.Add(new XElement(tns + "FuelConsumption", new XAttribute("unit", "MJ/km"),
-					(result.EnergyConsumptionTotal / result.Distance.ConvertTo().Kilo.Meter / 1e6).Value().ToMinSignificantDigits(3, 1)));
-				retVal.Add(new XElement(tns + "FuelConsumption", new XAttribute("unit", "MJ/t-km"),
-					(result.EnergyConsumptionTotal / result.Distance.ConvertTo().Kilo.Meter / result.Payload.ConvertTo().Ton / 1e6)
-						.Value().ToMinSignificantDigits(3, 1)));
-				retVal.Add(new XElement(tns + "FuelConsumption", new XAttribute("unit", "MJ/m³-km"),
-					(result.EnergyConsumptionTotal / result.Distance.ConvertTo().Kilo.Meter / result.CargoVolume / 1e6).Value()
-						.ToMinSignificantDigits(3, 1)));
-			}
-			if (fuel.FuelDensity != null) {
-				retVal.Add(new XElement(tns + "FuelConsumption", new XAttribute("unit", "l/100km"),
-					(result.FuelConsumptionTotal.ConvertTo().Gramm / fuel.FuelDensity / result.Distance.ConvertTo().Kilo.Meter * 100)
-						.Value().ToMinSignificantDigits(3, 1)));
-				retVal.Add(new XElement(tns + "FuelConsumption", new XAttribute("unit", "l/t-km"),
-					(result.FuelConsumptionTotal.ConvertTo().Gramm / fuel.FuelDensity / result.Distance.ConvertTo().Kilo.Meter /
-					result.Payload.ConvertTo().Ton).Value().ToMinSignificantDigits(3, 1)));
-				retVal.Add(new XElement(tns + "FuelConsumption", new XAttribute("unit", "l/m³-km"),
-					(result.FuelConsumptionTotal.ConvertTo().Gramm / fuel.FuelDensity / result.Distance.ConvertTo().Kilo.Meter /
-					result.CargoVolume).Value().ToMinSignificantDigits(3, 1)));
-			}
-			//CO2
-			retVal.Add(new XElement(tns + "CO2", new XAttribute("unit", "g/km"),
-				(result.CO2Total.ConvertTo().Gramm / result.Distance.ConvertTo().Kilo.Meter).Value().ToMinSignificantDigits(3, 1)));
-			retVal.Add(new XElement(tns + "CO2", new XAttribute("unit", "g/t-km"),
-				(result.CO2Total.ConvertTo().Gramm / result.Distance.ConvertTo().Kilo.Meter /
-				result.Payload.ConvertTo().Ton).Value().ToMinSignificantDigits(3, 1)));
-			retVal.Add(new XElement(tns + "CO2", new XAttribute("unit", "g/m³-km"),
-				(result.CO2Total.ConvertTo().Gramm / result.Distance.ConvertTo().Kilo.Meter / result.CargoVolume).Value()
-					.ToMinSignificantDigits(3, 1)));
-
-			return retVal;
-		}
-	}
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Xml;
+using System.Xml.Linq;
+using System.Xml.XPath;
+using TUGraz.VectoCommon.Models;
+using TUGraz.VectoCommon.Utils;
+using TUGraz.VectoCore.Models.Declaration;
+using TUGraz.VectoCore.Models.Simulation.Data;
+using TUGraz.VectoCore.Models.Simulation.Impl;
+
+namespace TUGraz.VectoCore.OutputData.XML
+{
+	public class XMLDeclarationReport : DeclarationReport<XMLDeclarationReport.ResultEntry>
+	{
+		private readonly XMLFullReport _fullReport;
+		private readonly XMLCustomerReport _customerReport;
+
+		private readonly IOutputDataWriter _writer;
+
+		public class ResultEntry
+		{
+			public MeterPerSecond AverageSpeed { get; private set; }
+
+			public Joule EnergyConsumptionTotal { get; private set; }
+
+			public Kilogram CO2Total { get; private set; }
+
+			public Kilogram FuelConsumptionTotal { get; private set; }
+
+			public Meter Distance { get; private set; }
+
+			public Scalar GearshiftCount { get; private set; }
+
+			public Scalar FullLoadPercentage { get; private set; }
+
+			public MeterPerSquareSecond MaxDeceleration { get; private set; }
+
+			public MeterPerSquareSecond MaxAcceleration { get; private set; }
+
+			public MeterPerSecond MaxSpeed { get; private set; }
+
+			public MeterPerSecond MinSpeed { get; private set; }
+
+			public string Error { get; private set; }
+
+			public VectoRun.Status Status { get; private set; }
+
+			public string StackTrace { get; private set; }
+
+			public FuelType FuelType { get; private set; }
+
+			public Kilogram Payload { get; private set; }
+
+			public Kilogram TotalVehicleWeight { get; private set; }
+
+			public CubicMeter CargoVolume { get; private set; }
+
+
+			public void SetResultData(VectoRunData runData, IModalDataContainer data)
+			{
+				FuelType = data.FuelData.FuelType;
+				Payload = runData.VehicleData.Loading;
+				CargoVolume = runData.VehicleData.CargoVolume;
+				TotalVehicleWeight = runData.VehicleData.TotalVehicleWeight;
+				Status = data.RunStatus;
+				Error = data.Error;
+				StackTrace = data.StackTrace;
+				AverageSpeed = data.Speed();
+				MinSpeed = data.MinSpeed();
+				MaxSpeed = data.MaxSpeed();
+				MaxAcceleration = data.MaxAcceleration();
+				MaxDeceleration = data.MaxDeceleration();
+				FullLoadPercentage = data.EngineMaxLoadTimeShare();
+				GearshiftCount = data.GearshiftCount();
+
+				Distance = data.Distance();
+
+				FuelConsumptionTotal = data.TimeIntegral<Kilogram>(ModalResultField.FCFinal);
+				CO2Total = FuelConsumptionTotal * data.FuelData.CO2PerFuelWeight;
+				EnergyConsumptionTotal = FuelConsumptionTotal * data.FuelData.LowerHeatingValue;
+			}
+		}
+
+		public XMLDeclarationReport(IOutputDataWriter writer = null)
+		{
+			_fullReport = new XMLFullReport(); //new XDocument(new XDeclaration("1.0", "utf-8", "yes"));
+			_customerReport = new XMLCustomerReport();
+			//CustomerReport = new XDocument(new XDeclaration("1.0", "utf-8", "yes"));
+
+			_writer = writer;
+		}
+
+		public XDocument FullReport
+		{
+			get { return _fullReport.Report; }
+		}
+
+		public XDocument CustomerReport
+		{
+			get { return _customerReport.Report; }
+		}
+
+
+		protected override void DoAddResult(ResultEntry entry, VectoRunData runData, IModalDataContainer modData)
+		{
+			entry.SetResultData(runData, modData);
+		}
+
+		protected internal override void DoWriteReport()
+		{
+			foreach (var result in Missions.OrderBy(m => m.Key)) {
+				_fullReport.AddResult(result.Value);
+				_customerReport.AddResult(result.Value);
+			}
+
+			_fullReport.GenerateReport();
+			var fullReportHash = GetSignature(_fullReport.Report);
+			_customerReport.GenerateReport(fullReportHash);
+
+			if (_writer != null) {
+				using (var xmlWriter = new XmlTextWriter(_writer.WriteStream(ReportType.DeclarationReportXMLFulll), Encoding.UTF8)) {
+					xmlWriter.Formatting = Formatting.Indented;
+					_fullReport.Report.WriteTo(xmlWriter);
+					xmlWriter.Flush();
+					xmlWriter.Close();
+				}
+
+				using (var xmlWriter = new XmlTextWriter(_writer.WriteStream(ReportType.DeclarationReportXMLCOC), Encoding.UTF8)) {
+					xmlWriter.Formatting = Formatting.Indented;
+					_customerReport.Report.WriteTo(xmlWriter);
+					xmlWriter.Flush();
+					xmlWriter.Close();
+				}
+			}
+		}
+
+		private XElement GetSignature(XDocument report)
+		{
+			return report.XPathSelectElement("/*[local-name()='VectoOutput']/*[local-name()='Signature']/*");
+		}
+
+
+		protected override void DoInitializeReport(VectoRunData modelData, Segment segment)
+		{
+			_fullReport.Initialize(modelData, segment);
+			_customerReport.Initialize(modelData, segment);
+		}
+
+
+		public static IEnumerable<XElement> GetResults(ResultEntry result, XNamespace tns, bool fullOutput)
+		{
+			var fuel = FuelData.Instance().Lookup(result.FuelType);
+			var retVal = new List<XElement> {
+				new XElement(tns + "FuelConsumption", new XAttribute("unit", "g/km"),
+					(result.FuelConsumptionTotal.ConvertTo().Gramm / result.Distance.ConvertTo().Kilo.Meter).Value()
+						.ToMinSignificantDigits(3, 1)),
+				new XElement(tns + "FuelConsumption", new XAttribute("unit", "g/t-km"),
+					(result.FuelConsumptionTotal.ConvertTo().Gramm / result.Distance.ConvertTo().Kilo.Meter /
+					result.Payload.ConvertTo().Ton).Value().ToMinSignificantDigits(3, 1)),
+				result.CargoVolume > 0
+					? new XElement(tns + "FuelConsumption", new XAttribute("unit", "g/m³-km"),
+						(result.FuelConsumptionTotal.ConvertTo().Gramm / result.Distance.ConvertTo().Kilo.Meter / result.CargoVolume)
+							.Value
+							().ToMinSignificantDigits(3, 1))
+					: null
+			};
+			//FC
+			if (fullOutput) {
+				retVal.Add(new XElement(tns + "FuelConsumption", new XAttribute("unit", "MJ/km"),
+					(result.EnergyConsumptionTotal / result.Distance.ConvertTo().Kilo.Meter / 1e6).Value().ToMinSignificantDigits(3, 1)));
+				retVal.Add(new XElement(tns + "FuelConsumption", new XAttribute("unit", "MJ/t-km"),
+					(result.EnergyConsumptionTotal / result.Distance.ConvertTo().Kilo.Meter / result.Payload.ConvertTo().Ton / 1e6)
+						.Value().ToMinSignificantDigits(3, 1)));
+				if (result.CargoVolume > 0) {
+					retVal.Add(new XElement(tns + "FuelConsumption", new XAttribute("unit", "MJ/m³-km"),
+						(result.EnergyConsumptionTotal / result.Distance.ConvertTo().Kilo.Meter / result.CargoVolume / 1e6).Value()
+							.ToMinSignificantDigits(3, 1)));
+				}
+			}
+			if (fuel.FuelDensity != null) {
+				retVal.Add(new XElement(tns + "FuelConsumption", new XAttribute("unit", "l/100km"),
+					(result.FuelConsumptionTotal.ConvertTo().Gramm / fuel.FuelDensity / result.Distance.ConvertTo().Kilo.Meter * 100)
+						.Value().ToMinSignificantDigits(3, 1)));
+				retVal.Add(new XElement(tns + "FuelConsumption", new XAttribute("unit", "l/t-km"),
+					(result.FuelConsumptionTotal.ConvertTo().Gramm / fuel.FuelDensity / result.Distance.ConvertTo().Kilo.Meter /
+					result.Payload.ConvertTo().Ton).Value().ToMinSignificantDigits(3, 1)));
+				if (result.CargoVolume > 0) {
+					retVal.Add(new XElement(tns + "FuelConsumption", new XAttribute("unit", "l/m³-km"),
+						(result.FuelConsumptionTotal.ConvertTo().Gramm / fuel.FuelDensity / result.Distance.ConvertTo().Kilo.Meter /
+						result.CargoVolume).Value().ToMinSignificantDigits(3, 1)));
+				}
+			}
+			//CO2
+			retVal.Add(new XElement(tns + "CO2", new XAttribute("unit", "g/km"),
+				(result.CO2Total.ConvertTo().Gramm / result.Distance.ConvertTo().Kilo.Meter).Value().ToMinSignificantDigits(3, 1)));
+			retVal.Add(new XElement(tns + "CO2", new XAttribute("unit", "g/t-km"),
+				(result.CO2Total.ConvertTo().Gramm / result.Distance.ConvertTo().Kilo.Meter /
+				result.Payload.ConvertTo().Ton).Value().ToMinSignificantDigits(3, 1)));
+			if (result.CargoVolume > 0) {
+				retVal.Add(new XElement(tns + "CO2", new XAttribute("unit", "g/m³-km"),
+					(result.CO2Total.ConvertTo().Gramm / result.Distance.ConvertTo().Kilo.Meter / result.CargoVolume).Value()
+						.ToMinSignificantDigits(3, 1)));
+			}
+
+			return retVal;
+		}
+	}
 }
\ No newline at end of file
diff --git a/VectoCore/VectoCore/OutputData/XML/XMLFullReport.cs b/VectoCore/VectoCore/OutputData/XML/XMLFullReport.cs
index e1706b0b50ec110af1abc5b57d8538d22dfb80bf..2a1503b998a9b1dd17f244dee84956d5eee9f13d 100644
--- a/VectoCore/VectoCore/OutputData/XML/XMLFullReport.cs
+++ b/VectoCore/VectoCore/OutputData/XML/XMLFullReport.cs
@@ -73,7 +73,7 @@ namespace TUGraz.VectoCore.OutputData.XML
 		{
 			VehiclePart.Add(
 				new XElement(tns + XMLNames.Vehicle_VIN, modelData.VehicleData.VIN),
-				new XElement(tns + XMLNames.Vehicle_VehicleCategory, modelData.VehicleData.LegislativeClass),
+				new XElement(tns + XMLNames.Vehicle_VehicleCategory, modelData.VehicleData.LegislativeClass.ToXMLFormat()),
 				new XElement(tns + "VehicleGroup", segment.VehicleClass.GetClassNumber()),
 				new XElement(tns + XMLNames.Vehicle_AxleConfiguration, modelData.VehicleData.AxleConfiguration.GetName()),
 				new XElement(tns + XMLNames.Vehicle_GrossVehicleMass, modelData.VehicleData.GrossVehicleWeight.ToXMLFormat(0)),
diff --git a/VectoCore/VectoCore/Resources/Declaration/MissionCycles/Suburban.vdri b/VectoCore/VectoCore/Resources/Declaration/MissionCycles/Suburban.vdri
index e68e2bc849833934473885802a7e2e96a421a0ea..3c2a796becfe9acff1eb7b99b7a1f29b4426c692 100644
--- a/VectoCore/VectoCore/Resources/Declaration/MissionCycles/Suburban.vdri
+++ b/VectoCore/VectoCore/Resources/Declaration/MissionCycles/Suburban.vdri
@@ -1,3695 +1,3665 @@
 <s>,<v>,<grad>,<stop>
-0,0,-3.3,3.2
+0,0,-3.3,0.1
 1,32.3,-3.3,0
-2,32.3,-3.1,0
-3,32.3,-2.9,0
-4,32.3,-2.8,0
-6,32.3,-2.7,0
-8,32.3,-2.6,0
-11,32.3,-2.5,0
-14,32.3,-2.4,0
-16,32.3,-2.3,0
-19,32.3,-2.2,0
-21,32.3,-2.1,0
-24,32.3,-2,0
-25,32.3,-1.9,0
-28,32.3,-1.8,0
-29,32.3,-1.7,0
-32,32.3,-1.6,0
-33,32.3,-1.5,0
-35,32.3,-1.4,0
-36,32.3,-1.3,0
-39,32.3,-1.2,0
-41,32.3,-1.1,0
-42,32.3,-1,0
-45,32.3,-0.9,0
-47,32.3,-0.8,0
-48,32.3,-0.7,0
-51,32.3,-0.6,0
-53,32.3,-0.5,0
-56,32.3,-0.4,0
-60,32.3,-0.3,0
-63,32.3,-0.2,0
-66,32.3,-0.1,0
-85,32.3,-0.2,0
-91,32.3,-0.3,0
-94,32.3,-0.4,0
-96,52.3,-0.4,0
-98,52.3,-0.5,0
-102,52.3,-0.6,0
-105,52.3,-0.7,0
-109,52.3,-0.8,0
-113,52.3,-0.9,0
-115,52.3,-1,0
-121,52.3,-1.1,0
-125,52.3,-1.2,0
-151,52.3,-1.1,0
-156,52.3,-1,0
-161,52.3,-0.9,0
-166,52.3,-0.8,0
-172,52.3,-0.7,0
-177,52.3,-0.6,0
-183,52.3,-0.5,0
-203,52.3,-0.6,0
-209,52.3,-0.7,0
-215,52.3,-0.8,0
-217,52.3,-0.9,0
-220,52.3,-1,0
-223,52.3,-1.1,0
-226,52.3,-1.2,0
-228,52.3,-1.3,0
-233,52.3,-1.4,0
-236,52.3,-1.5,0
-238,52.3,-1.6,0
-240,52.3,-1.7,0
-244,52.3,-1.8,0
-247,52.3,-1.9,0
-252,52.3,-2,0
-258,52.3,-2.1,0
-271,52.3,-2.3,0
-273,52.3,-2.4,0
-274,52.3,-2.6,0
-275,0,-2.5,2
-276,18.5,-2.5,0
-277,18.5,-2,0
-278,18.5,-1.9,0
-280,18.5,-1.8,0
-281,18.5,-1.7,0
-283,18.5,-1.6,0
-285,18.5,-1.5,0
-287,18.5,-1.4,0
-289,18.5,-1.3,0
-291,18.5,-1.2,0
-293,18.5,-1.1,0
-296,18.5,-1,0
-298,18.5,-0.9,0
-300,18.5,-0.8,0
-302,18.5,-0.7,0
-305,18.5,-0.6,0
-307,18.5,-0.5,0
-309,18.5,-0.4,0
-312,11.3,-0.3,0
-313,37,-0.3,0
-314,37,-0.2,0
-317,37,-0.1,0
-318,37,0,0
-321,37,0.1,0
-323,37,0.2,0
-326,37,0.3,0
-331,37,0.4,0
-334,37,0.5,0
-340,37,0.6,0
-347,37,0.7,0
-363,37,0.8,0
-385,37,0.7,0
-397,37,0.6,0
-403,37,0.5,0
-408,37,0.4,0
-413,37,0.3,0
-417,37,0.2,0
-420,37,0.1,0
-422,37,0,0
-423,37,-0.1,0
-424,37,-0.3,0
-425,0,-0.8,12.4
-426,55.2,-0.8,0
-427,55.2,-0.3,0
-428,55.2,-0.2,0
-439,55.2,-0.3,0
-445,55.2,-0.4,0
-457,55.2,-0.5,0
-462,55.2,-0.4,0
-473,55.2,-0.3,0
-479,55.2,-0.2,0
-484,55.2,-0.1,0
-486,55.2,0,0
-490,55.2,0.1,0
-493,55.2,0.2,0
-497,55.2,0.3,0
-499,55.2,0.4,0
-502,55.2,0.5,0
-507,55.2,0.6,0
-509,55.2,0.7,0
-514,55.2,0.8,0
-517,55.2,0.9,0
-522,55.2,1,0
-527,55.2,1.1,0
-532,55.2,1.2,0
-543,55.2,1.3,0
-584,55.2,1.2,0
-599,55.2,1.1,0
-605,55.2,1,0
-612,55.2,0.9,0
-615,55.2,0.8,0
-621,55.2,0.7,0
-624,55.2,0.6,0
-627,55.2,0.5,0
-630,55.2,0.4,0
-633,55.2,0.3,0
-636,55.2,0.2,0
-639,55.2,0.1,0
-645,55.2,0,0
-648,55.2,-0.1,0
-650,55.2,-0.2,0
-653,55.2,-0.3,0
-659,55.2,-0.4,0
-662,55.2,-0.5,0
-670,55.2,-0.6,0
-680,55.2,-0.7,0
-685,55.2,-0.6,0
-692,43.6,-0.6,0
-699,43.6,-0.5,0
-706,43.6,-0.4,0
-711,43.6,-0.3,0
-718,43.6,-0.2,0
-723,43.6,-0.1,0
-730,43.6,0,0
-754,43.6,-0.1,0
-761,43.6,-0.2,0
-766,43.6,-0.3,0
-768,43.6,-0.4,0
-773,43.6,-0.5,0
-775,43.6,-0.6,0
-777,43.6,-0.7,0
-779,43.6,-0.8,0
-783,43.6,-0.9,0
-785,43.6,-1,0
-787,43.6,-1.1,0
-789,43.6,-1.2,0
-792,43.6,-1.3,0
-794,43.6,-1.4,0
-795,43.6,-1.5,0
-799,43.6,-1.6,0
-801,43.6,-1.7,0
-804,43.6,-1.8,0
-806,43.6,-1.9,0
-809,43.6,-2,0
-811,43.6,-2.1,0
-812,43.6,-2.2,0
-813,43.6,-2.5,0
-814,43.6,-1.9,0
-815,0,-2.7,3.6
-816,39.6,-2.7,0
-817,39.6,-2.2,0
-822,39.6,-2.1,0
-830,39.6,-2,0
-835,39.6,-1.9,0
-838,39.6,-1.8,0
-841,39.6,-1.7,0
-844,39.6,-1.6,0
-846,39.6,-1.5,0
-849,39.6,-1.4,0
-852,39.6,-1.3,0
-854,39.6,-1.2,0
-857,39.6,-1.1,0
-861,39.6,-1,0
-864,39.6,-0.9,0
-868,39.6,-0.8,0
-873,39.6,-0.7,0
-878,39.6,-0.6,0
-883,39.6,-0.5,0
-891,39.6,-0.4,0
-901,39.6,-0.3,0
-909,39.6,-0.2,0
-918,39.6,-0.1,0
-927,39.6,0,0
-933,39.6,0.1,0
-939,39.6,0.2,0
-946,39.6,0.3,0
-952,39.6,0.4,0
-958,39.6,0.5,0
-967,39.6,0.6,0
-998,42.2,0.5,0
-1004,42.2,0.4,0
-1011,42.2,0.3,0
-1016,42.2,0.2,0
-1023,42.2,0.1,0
-1030,42.2,0,0
-1058,42.2,0.1,0
-1065,39.6,0.2,0
-1072,39.6,0.3,0
-1078,39.6,0.4,0
-1085,39.6,0.5,0
-1109,39.6,0.4,0
-1116,39.6,0.3,0
-1120,39.6,0.2,0
-1125,39.6,0.1,0
-1129,39.6,0,0
-1134,39.6,-0.1,0
-1138,39.6,-0.2,0
-1142,39.6,-0.3,0
-1147,39.6,-0.4,0
-1153,39.6,-0.5,0
-1163,39.6,-0.6,0
-1174,39.6,-0.5,0
-1187,39.6,-0.4,0
-1189,44.8,-0.4,0
-1193,44.8,-0.3,0
-1200,44.8,-0.2,0
-1204,44.8,-0.1,0
-1209,44.8,0,0
-1211,44.8,0.1,0
-1216,44.8,0.2,0
-1221,44.8,0.3,0
-1226,44.8,0.4,0
-1228,44.8,0.5,0
-1233,44.8,0.6,0
-1238,44.8,0.7,0
-1242,44.8,0.8,0
-1250,44.8,0.9,0
-1262,44.8,1,0
-1265,44.8,0.9,0
-1280,44.8,0.8,0
-1287,44.8,0.7,0
-1292,44.8,0.6,0
-1297,44.8,0.5,0
-1302,44.8,0.4,0
-1307,44.8,0.3,0
-1312,44.8,0.2,0
-1317,44.8,0.1,0
-1322,44.8,0,0
-1327,44.8,-0.1,0
-1334,42,-0.2,0
-1365,42,-0.1,0
-1372,42,0,0
-1379,42,0.1,0
-1384,42,0.2,0
-1391,42,0.3,0
-1395,46,0.3,0
-1400,46,0.4,0
-1422,46,0.3,0
-1432,46,0.2,0
-1439,46,0.1,0
-1444,46,0,0
-1452,46,-0.1,0
-1462,46,-0.2,0
-1502,46,-0.1,0
-1519,46,-0.2,0
-1533,46,-0.3,0
-1539,46,-0.4,0
-1545,46,-0.5,0
-1551,46,-0.6,0
-1558,46,-0.7,0
-1564,46,-0.8,0
-1573,46,-0.9,0
-1583,46,-1,0
-1586,46,-1.2,0
-1587,46,-1.3,0
-1588,0,-0.7,32.4
-1589,15.8,-0.7,0
-1590,15.8,-1,0
-1591,15.8,-0.9,0
-1593,15.8,-0.8,0
-1597,15.8,-0.7,0
-1603,15.8,-0.6,0
-1609,15.8,-0.5,0
-1614,15.8,-0.4,0
-1617,42.2,-0.4,0
-1620,42.2,-0.3,0
-1625,42.2,-0.2,0
-1631,42.2,-0.1,0
-1656,42.2,-0.2,0
-1665,42.2,-0.3,0
-1673,42.2,-0.4,0
-1684,42.2,-0.5,0
-1700,42.2,-0.4,0
-1707,42.2,-0.3,0
-1711,42.2,-0.2,0
-1716,42.2,-0.1,0
-1721,42.2,0,0
-1723,42.2,0.1,0
-1727,42.2,0.2,0
-1732,42.2,0.3,0
-1734,42.2,0.4,0
-1738,42.2,0.5,0
-1742,42.2,0.6,0
-1746,42.2,0.7,0
-1752,42.2,0.8,0
-1768,42.2,0.7,0
-1770,42.2,0.6,0
-1771,42.2,0.5,0
-1772,42.2,0.4,0
-1773,42.2,0,0
-1774,0,0.1,12
-1775,16.7,0.1,0
-1776,16.7,0.5,0
-1777,16.7,0.6,0
-1779,16.7,0.7,0
-1783,16.7,0.6,0
-1790,16.7,0.5,0
-1791,32,0.5,0
-1799,32,0.4,0
-1807,32,0.3,0
-1814,32,0.2,0
-1821,32,0.1,0
-1826,32,0,0
-1829,32,-0.1,0
-1835,32,-0.2,0
-1838,32,-0.3,0
-1842,32,-0.4,0
-1845,32,-0.5,0
-1850,32,-0.6,0
-1853,32,-0.7,0
-1858,32,-0.8,0
-1861,32,-0.9,0
-1863,32,-1,0
-1864,32,-1.2,0
-1865,0,-0.7,23.8
-1866,41.3,-0.7,0
-1867,41.3,-1.1,0
-1869,41.3,-1,0
-1873,41.3,-0.9,0
-1881,41.3,-0.8,0
-1886,41.3,-0.7,0
-1890,41.3,-0.6,0
-1895,41.3,-0.5,0
-1898,41.3,-0.4,0
-1901,41.3,-0.3,0
-1904,41.3,-0.2,0
-1910,41.3,-0.1,0
-1913,41.3,0,0
-1917,41.3,0.1,0
-1923,41.3,0.2,0
-1952,41.3,0.1,0
-1961,41.3,0,0
-1969,41.3,-0.1,0
-1975,41.3,-0.2,0
-1982,41.3,-0.3,0
-1988,41.3,-0.4,0
-1991,41.3,-0.5,0
-1993,41.3,-0.6,0
-1994,10,-0.6,0
-1995,42.1,-0.6,0
-2000,42.1,-0.5,0
-2015,42.1,-0.6,0
-2035,42.1,-0.5,0
-2049,42.1,-0.4,0
-2055,42.1,-0.3,0
-2062,42.1,-0.2,0
-2068,42.1,-0.1,0
-2073,42.1,0,0
-2077,42.1,0.1,0
-2084,42.1,0.2,0
-2091,42.1,0.3,0
-2101,42.1,0.4,0
-2120,42.1,0.3,0
-2130,42.1,0.2,0
-2136,42.1,0.1,0
-2137,24,0.1,0
-2138,41.1,0.1,0
-2141,41.1,0,0
-2147,41.1,-0.1,0
-2151,41.1,-0.2,0
-2156,41.1,-0.3,0
-2161,41.1,-0.4,0
-2168,41.1,-0.5,0
-2186,41.1,-0.4,0
-2192,41.1,-0.3,0
-2196,41.1,-0.2,0
-2201,41.1,-0.1,0
-2205,41.1,0,0
-2208,41.1,0.1,0
-2212,41.1,0.2,0
-2217,41.1,0.3,0
-2219,41.1,0.4,0
-2226,41.1,0.5,0
-2232,41.1,0.6,0
-2248,41.1,0.5,0
-2256,41.1,0.4,0
-2263,41.1,0.3,0
-2266,41.1,0.2,0
-2270,12.3,0.2,0
-2271,12.3,0.1,0
-2280,12.3,0,0
-2285,12.3,-0.1,0
-2290,12.3,-0.2,0
-2297,12.3,-0.4,0
-2298,12.3,-0.6,0
-2299,12.3,-0.8,0
-2300,0,-0.5,2
-2301,12.3,-0.5,0
-2302,12.3,-0.3,0
-2304,12.3,-0.2,0
-2309,12.3,-0.3,0
-2315,12.3,-0.4,0
-2316,12.3,-0.5,0
-2322,0,-0.6,1.2
-2323,10.6,-0.6,0
-2324,10.6,-0.4,0
-2325,10.6,-0.3,0
-2326,10.6,-0.2,0
-2332,10.6,-0.1,0
-2337,27,-0.1,0
-2338,27,0,0
-2341,27,0.1,0
-2343,27,0.2,0
-2346,27,0.3,0
-2349,27,0.4,0
-2354,27,0.5,0
-2357,27,0.6,0
-2362,27,0.7,0
-2369,27,0.8,0
-2384,27,0.7,0
-2391,27,0.6,0
-2397,27,0.5,0
-2402,27,0.4,0
-2407,27,0.3,0
-2410,27,0.2,0
-2412,27,0.1,0
-2413,27,-0.1,0
-2414,0,0.4,9.6
-2415,23.9,0.4,0
-2416,23.9,-0.1,0
-2417,23.9,0,0
-2418,23.9,0.1,0
-2424,23.9,0.2,0
-2444,23.9,0.3,0
-2481,23.9,0.2,0
-2497,23.9,0.1,0
-2499,23.9,0,0
-2500,23.9,-0.3,0
-2501,0,0.1,6.8
+2,32.3,-2.9,0
+3,32.3,-2.8,0
+5,32.3,-2.7,0
+7,32.3,-2.6,0
+10,32.3,-2.5,0
+13,32.3,-2.4,0
+15,32.3,-2.3,0
+18,32.3,-2.2,0
+20,32.3,-2.1,0
+23,32.3,-2,0
+24,32.3,-1.9,0
+27,32.3,-1.8,0
+28,32.3,-1.7,0
+31,32.3,-1.6,0
+32,32.3,-1.5,0
+34,32.3,-1.4,0
+35,32.3,-1.3,0
+38,32.3,-1.2,0
+40,32.3,-1.1,0
+41,32.3,-1,0
+44,32.3,-0.9,0
+46,32.3,-0.8,0
+47,32.3,-0.7,0
+50,32.3,-0.6,0
+52,32.3,-0.5,0
+55,32.3,-0.4,0
+59,32.3,-0.3,0
+62,32.3,-0.2,0
+65,32.3,-0.1,0
+84,32.3,-0.2,0
+90,32.3,-0.3,0
+93,32.3,-0.4,0
+95,52.3,-0.4,0
+97,52.3,-0.5,0
+101,52.3,-0.6,0
+104,52.3,-0.7,0
+108,52.3,-0.8,0
+112,52.3,-0.9,0
+114,52.3,-1,0
+120,52.3,-1.1,0
+124,52.3,-1.2,0
+150,52.3,-1.1,0
+155,52.3,-1,0
+160,52.3,-0.9,0
+165,52.3,-0.8,0
+171,52.3,-0.7,0
+176,52.3,-0.6,0
+182,52.3,-0.5,0
+202,52.3,-0.6,0
+208,52.3,-0.7,0
+214,52.3,-0.8,0
+216,52.3,-0.9,0
+219,52.3,-1,0
+222,52.3,-1.1,0
+225,52.3,-1.2,0
+227,52.3,-1.3,0
+232,52.3,-1.4,0
+235,52.3,-1.5,0
+237,52.3,-1.6,0
+239,52.3,-1.7,0
+243,52.3,-1.8,0
+246,52.3,-1.9,0
+251,52.3,-2,0
+257,52.3,-2.1,0
+270,52.3,-2.3,0
+272,52.3,-2.4,0
+273,52.3,-2.6,0
+274,52.3,-2.5,0
+275,18.5,-2.1,0
+276,18.5,-2,0
+277,18.5,-1.9,0
+279,18.5,-1.8,0
+280,18.5,-1.7,0
+282,18.5,-1.6,0
+284,18.5,-1.5,0
+286,18.5,-1.4,0
+288,18.5,-1.3,0
+290,18.5,-1.2,0
+292,18.5,-1.1,0
+295,18.5,-1,0
+297,18.5,-0.9,0
+299,18.5,-0.8,0
+301,18.5,-0.7,0
+304,18.5,-0.6,0
+306,18.5,-0.5,0
+308,18.5,-0.4,0
+311,11.3,-0.3,0
+312,37,-0.3,0
+313,37,-0.2,0
+316,37,-0.1,0
+317,37,0,0
+320,37,0.1,0
+322,37,0.2,0
+325,37,0.3,0
+330,37,0.4,0
+333,37,0.5,0
+339,37,0.6,0
+346,37,0.7,0
+362,37,0.8,0
+384,37,0.7,0
+396,37,0.6,0
+402,37,0.5,0
+407,37,0.4,0
+412,37,0.3,0
+416,37,0.2,0
+419,37,0.1,0
+421,37,0,0
+422,37,-0.1,0
+423,37,-0.3,0
+424,0,-0.8,12.4
+425,55.2,-0.8,0
+426,55.2,-0.3,0
+427,55.2,-0.2,0
+438,55.2,-0.3,0
+444,55.2,-0.4,0
+456,55.2,-0.5,0
+461,55.2,-0.4,0
+472,55.2,-0.3,0
+478,55.2,-0.2,0
+483,55.2,-0.1,0
+485,55.2,0,0
+489,55.2,0.1,0
+492,55.2,0.2,0
+496,55.2,0.3,0
+498,55.2,0.4,0
+501,55.2,0.5,0
+506,55.2,0.6,0
+508,55.2,0.7,0
+513,55.2,0.8,0
+516,55.2,0.9,0
+521,55.2,1,0
+526,55.2,1.1,0
+531,55.2,1.2,0
+542,55.2,1.3,0
+583,55.2,1.2,0
+598,55.2,1.1,0
+604,55.2,1,0
+611,55.2,0.9,0
+614,55.2,0.8,0
+620,55.2,0.7,0
+623,55.2,0.6,0
+626,55.2,0.5,0
+629,55.2,0.4,0
+632,55.2,0.3,0
+635,55.2,0.2,0
+638,55.2,0.1,0
+644,55.2,0,0
+647,55.2,-0.1,0
+649,55.2,-0.2,0
+652,55.2,-0.3,0
+658,55.2,-0.4,0
+661,55.2,-0.5,0
+669,55.2,-0.6,0
+679,55.2,-0.7,0
+684,55.2,-0.6,0
+691,43.6,-0.6,0
+698,43.6,-0.5,0
+705,43.6,-0.4,0
+710,43.6,-0.3,0
+717,43.6,-0.2,0
+722,43.6,-0.1,0
+729,43.6,0,0
+753,43.6,-0.1,0
+760,43.6,-0.2,0
+765,43.6,-0.3,0
+767,43.6,-0.4,0
+772,43.6,-0.5,0
+774,43.6,-0.6,0
+776,43.6,-0.7,0
+778,43.6,-0.8,0
+782,43.6,-0.9,0
+784,43.6,-1,0
+786,43.6,-1.1,0
+788,43.6,-1.2,0
+791,43.6,-1.3,0
+793,43.6,-1.4,0
+794,43.6,-1.5,0
+798,43.6,-1.6,0
+800,43.6,-1.7,0
+803,43.6,-1.8,0
+805,43.6,-1.9,0
+808,43.6,-2,0
+810,43.6,-2.1,0
+811,43.6,-2.2,0
+812,43.6,-2.5,0
+813,43.6,-1.9,0
+814,0,-2.7,3.6
+815,39.6,-2.7,0
+816,39.6,-2.2,0
+821,39.6,-2.1,0
+829,39.6,-2,0
+834,39.6,-1.9,0
+837,39.6,-1.8,0
+840,39.6,-1.7,0
+843,39.6,-1.6,0
+845,39.6,-1.5,0
+848,39.6,-1.4,0
+851,39.6,-1.3,0
+853,39.6,-1.2,0
+856,39.6,-1.1,0
+860,39.6,-1,0
+863,39.6,-0.9,0
+867,39.6,-0.8,0
+872,39.6,-0.7,0
+877,39.6,-0.6,0
+882,39.6,-0.5,0
+890,39.6,-0.4,0
+900,39.6,-0.3,0
+908,39.6,-0.2,0
+917,39.6,-0.1,0
+926,39.6,0,0
+932,39.6,0.1,0
+938,39.6,0.2,0
+945,39.6,0.3,0
+951,39.6,0.4,0
+957,39.6,0.5,0
+966,39.6,0.6,0
+997,42.2,0.5,0
+1003,42.2,0.4,0
+1010,42.2,0.3,0
+1015,42.2,0.2,0
+1022,42.2,0.1,0
+1029,42.2,0,0
+1057,42.2,0.1,0
+1064,39.6,0.2,0
+1071,39.6,0.3,0
+1077,39.6,0.4,0
+1084,39.6,0.5,0
+1108,39.6,0.4,0
+1115,39.6,0.3,0
+1119,39.6,0.2,0
+1124,39.6,0.1,0
+1128,39.6,0,0
+1133,39.6,-0.1,0
+1137,39.6,-0.2,0
+1141,39.6,-0.3,0
+1146,39.6,-0.4,0
+1152,39.6,-0.5,0
+1162,39.6,-0.6,0
+1173,39.6,-0.5,0
+1186,39.6,-0.4,0
+1188,44.8,-0.4,0
+1192,44.8,-0.3,0
+1199,44.8,-0.2,0
+1203,44.8,-0.1,0
+1208,44.8,0,0
+1210,44.8,0.1,0
+1215,44.8,0.2,0
+1220,44.8,0.3,0
+1225,44.8,0.4,0
+1227,44.8,0.5,0
+1232,44.8,0.6,0
+1237,44.8,0.7,0
+1241,44.8,0.8,0
+1249,44.8,0.9,0
+1261,44.8,1,0
+1264,44.8,0.9,0
+1279,44.8,0.8,0
+1286,44.8,0.7,0
+1291,44.8,0.6,0
+1296,44.8,0.5,0
+1301,44.8,0.4,0
+1306,44.8,0.3,0
+1311,44.8,0.2,0
+1316,44.8,0.1,0
+1321,44.8,0,0
+1326,44.8,-0.1,0
+1333,42,-0.2,0
+1364,42,-0.1,0
+1371,42,0,0
+1378,42,0.1,0
+1383,42,0.2,0
+1390,42,0.3,0
+1394,46,0.3,0
+1399,46,0.4,0
+1421,46,0.3,0
+1431,46,0.2,0
+1438,46,0.1,0
+1443,46,0,0
+1451,46,-0.1,0
+1461,46,-0.2,0
+1501,46,-0.1,0
+1518,46,-0.2,0
+1532,46,-0.3,0
+1538,46,-0.4,0
+1544,46,-0.5,0
+1550,46,-0.6,0
+1557,46,-0.7,0
+1563,46,-0.8,0
+1572,46,-0.9,0
+1582,46,-1,0
+1585,46,-1.2,0
+1586,46,-1.3,0
+1587,0,-0.7,32.4
+1588,15.8,-0.7,0
+1589,15.8,-1,0
+1590,15.8,-0.9,0
+1592,15.8,-0.8,0
+1596,15.8,-0.7,0
+1602,15.8,-0.6,0
+1608,15.8,-0.5,0
+1613,15.8,-0.4,0
+1616,42.2,-0.4,0
+1619,42.2,-0.3,0
+1624,42.2,-0.2,0
+1630,42.2,-0.1,0
+1655,42.2,-0.2,0
+1664,42.2,-0.3,0
+1672,42.2,-0.4,0
+1683,42.2,-0.5,0
+1699,42.2,-0.4,0
+1706,42.2,-0.3,0
+1710,42.2,-0.2,0
+1715,42.2,-0.1,0
+1720,42.2,0,0
+1722,42.2,0.1,0
+1726,42.2,0.2,0
+1731,42.2,0.3,0
+1733,42.2,0.4,0
+1737,42.2,0.5,0
+1741,42.2,0.6,0
+1745,42.2,0.7,0
+1751,42.2,0.8,0
+1767,42.2,0.7,0
+1769,42.2,0.6,0
+1770,42.2,0.5,0
+1771,42.2,0.4,0
+1772,42.2,0,0
+1773,0,0.1,12
+1774,16.7,0.1,0
+1775,16.7,0.5,0
+1776,16.7,0.6,0
+1778,16.7,0.7,0
+1782,16.7,0.6,0
+1789,16.7,0.5,0
+1790,32,0.5,0
+1798,32,0.4,0
+1806,32,0.3,0
+1813,32,0.2,0
+1820,32,0.1,0
+1825,32,0,0
+1828,32,-0.1,0
+1834,32,-0.2,0
+1837,32,-0.3,0
+1841,32,-0.4,0
+1844,32,-0.5,0
+1849,32,-0.6,0
+1852,32,-0.7,0
+1857,32,-0.8,0
+1860,32,-0.9,0
+1862,32,-1,0
+1863,32,-1.2,0
+1864,0,-0.7,23.8
+1865,41.3,-0.7,0
+1866,41.3,-1.1,0
+1868,41.3,-1,0
+1872,41.3,-0.9,0
+1880,41.3,-0.8,0
+1885,41.3,-0.7,0
+1889,41.3,-0.6,0
+1894,41.3,-0.5,0
+1897,41.3,-0.4,0
+1900,41.3,-0.3,0
+1903,41.3,-0.2,0
+1909,41.3,-0.1,0
+1912,41.3,0,0
+1916,41.3,0.1,0
+1922,41.3,0.2,0
+1951,41.3,0.1,0
+1960,41.3,0,0
+1968,41.3,-0.1,0
+1974,41.3,-0.2,0
+1981,41.3,-0.3,0
+1987,41.3,-0.4,0
+1990,41.3,-0.5,0
+1992,41.3,-0.6,0
+1994,42.1,-0.6,0
+1999,42.1,-0.5,0
+2014,42.1,-0.6,0
+2034,42.1,-0.5,0
+2048,42.1,-0.4,0
+2054,42.1,-0.3,0
+2061,42.1,-0.2,0
+2067,42.1,-0.1,0
+2072,42.1,0,0
+2076,42.1,0.1,0
+2083,42.1,0.2,0
+2090,42.1,0.3,0
+2100,42.1,0.4,0
+2119,42.1,0.3,0
+2129,42.1,0.2,0
+2135,42.1,0.1,0
+2136,41.1,0.1,0
+2140,41.1,0,0
+2146,41.1,-0.1,0
+2150,41.1,-0.2,0
+2155,41.1,-0.3,0
+2160,41.1,-0.4,0
+2167,41.1,-0.5,0
+2185,41.1,-0.4,0
+2191,41.1,-0.3,0
+2195,41.1,-0.2,0
+2200,41.1,-0.1,0
+2204,41.1,0,0
+2207,41.1,0.1,0
+2211,41.1,0.2,0
+2216,41.1,0.3,0
+2218,41.1,0.4,0
+2225,41.1,0.5,0
+2231,41.1,0.6,0
+2247,41.1,0.5,0
+2255,41.1,0.4,0
+2262,41.1,0.3,0
+2265,41.1,0.2,0
+2269,12.3,0.2,0
+2270,12.3,0.1,0
+2279,12.3,0,0
+2284,12.3,-0.1,0
+2289,12.3,-0.2,0
+2296,12.3,-0.4,0
+2297,12.3,-0.6,0
+2298,12.3,-0.8,0
+2299,12.3,-0.5,0
+2300,12.3,-0.4,0
+2301,12.3,-0.3,0
+2303,12.3,-0.2,0
+2308,12.3,-0.3,0
+2314,12.3,-0.4,0
+2315,12.3,-0.5,0
+2321,0,-0.6,1.2
+2322,10.6,-0.6,0
+2323,10.6,-0.4,0
+2324,10.6,-0.3,0
+2325,10.6,-0.2,0
+2331,10.6,-0.1,0
+2336,27,-0.1,0
+2337,27,0,0
+2340,27,0.1,0
+2342,27,0.2,0
+2345,27,0.3,0
+2348,27,0.4,0
+2353,27,0.5,0
+2356,27,0.6,0
+2361,27,0.7,0
+2368,27,0.8,0
+2383,27,0.7,0
+2390,27,0.6,0
+2396,27,0.5,0
+2401,27,0.4,0
+2406,27,0.3,0
+2409,27,0.2,0
+2411,27,0.1,0
+2412,27,-0.1,0
+2413,0,0.4,9.6
+2414,23.9,0.4,0
+2415,23.9,-0.1,0
+2416,23.9,0,0
+2417,23.9,0.1,0
+2423,23.9,0.2,0
+2443,23.9,0.3,0
+2480,23.9,0.2,0
+2496,23.9,0.1,0
+2498,23.9,0,0
+2499,23.9,-0.3,0
+2500,0,0.1,6.8
+2501,30.7,0.1,0
 2502,30.7,0.1,0
-2503,30.7,0.1,0
-2505,30.7,0.2,0
-2506,30.7,0.3,0
-2508,30.7,0.4,0
-2512,30.7,0.5,0
-2516,30.7,0.6,0
-2522,30.7,0.7,0
-2525,30.7,0.8,0
-2529,30.7,0.9,0
-2534,30.7,1,0
-2538,30.7,1.1,0
-2541,30.7,1.2,0
-2546,30.7,1.3,0
-2550,30.7,1.4,0
-2555,30.7,1.5,0
-2561,30.7,1.6,0
-2575,30.7,1.5,0
-2580,30.7,1.4,0
-2582,30.7,1.3,0
-2585,30.7,1.2,0
-2586,30.7,1,0
-2587,30.7,0.8,0
-2588,30.7,0.5,0
-2589,0,1.4,7.6
-2590,50.1,1.4,0
-2591,50.1,1,0
-2599,50.1,0.9,0
-2603,50.1,0.8,0
-2607,50.1,0.7,0
-2613,50.1,0.6,0
-2636,50.1,0.7,0
-2642,50.1,0.8,0
-2648,50.1,0.9,0
-2654,50.1,1,0
-2663,50.1,1.1,0
-2673,50.1,1,0
-2682,50.1,0.9,0
-2689,50.1,0.8,0
-2693,50.1,0.7,0
-2698,50.1,0.6,0
-2701,50.1,0.5,0
-2706,50.1,0.4,0
-2711,50.1,0.3,0
-2713,50.1,0.2,0
-2719,50.1,0.1,0
-2724,50.1,0,0
-2733,50.1,-0.1,0
-2744,50.1,-0.2,0
-2758,50.1,-0.3,0
-2772,50.1,-0.4,0
-2860,50.1,-0.5,0
-2865,50.1,-0.6,0
-2870,50.1,-0.7,0
-2875,50.1,-0.8,0
-2878,50.1,-0.9,0
-2882,50.1,-1,0
-2885,50.1,-1.1,0
-2887,50.1,-1.2,0
-2889,50.1,-1.3,0
-2893,50.1,-1.4,0
-2895,50.1,-1.5,0
-2899,50.1,-1.6,0
-2901,50.1,-1.7,0
-2906,50.1,-1.8,0
-2910,50.1,-1.9,0
-2915,50.1,-2,0
-2917,50.1,-2.1,0
-2918,50.1,-2.5,0
-2919,0,-3,21.4
-2920,48.7,-3,0
-2921,48.7,-2.1,0
-2922,48.7,-2,0
-2924,48.7,-1.9,0
-2927,48.7,-1.8,0
-2929,48.7,-1.7,0
-2933,48.7,-1.6,0
-2935,48.7,-1.5,0
-2937,48.7,-1.4,0
-2940,48.7,-1.3,0
-2941,48.7,-1.2,0
-2944,48.7,-1.1,0
-2945,48.7,-1,0
-2947,48.7,-0.9,0
-2950,48.7,-0.8,0
-2951,48.7,-0.7,0
-2953,48.7,-0.6,0
-2955,48.7,-0.5,0
-2958,48.7,-0.4,0
-2960,48.7,-0.3,0
-2962,48.7,-0.2,0
-2966,48.7,-0.1,0
-2968,48.7,0,0
-2972,48.7,0.1,0
-2978,48.7,0.2,0
-2984,48.7,0.3,0
-3010,48.7,0.2,0
-3094,48.7,0.3,0
-3099,48.7,0.4,0
-3104,48.7,0.5,0
-3109,48.7,0.6,0
-3111,48.7,0.7,0
-3116,48.7,0.8,0
-3118,48.7,0.9,0
-3122,48.7,1,0
-3126,48.7,1.1,0
-3130,48.7,1.2,0
-3134,35.1,1.3,0
-3142,35.1,1.4,0
-3144,35.1,1.3,0
-3154,35.1,1.2,0
-3156,35.1,1.1,0
-3159,35.1,1,0
-3161,35.1,0.9,0
-3163,35.1,0.8,0
-3165,35.1,0.7,0
-3167,35.1,0.6,0
-3169,35.1,0.4,0
-3171,35.1,0.2,0
-3173,35.1,0.1,0
-3174,35.1,0,0
-3176,35.1,-0.2,0
-3178,35.1,-0.3,0
-3180,35.1,-0.5,0
-3182,35.1,-0.6,0
-3183,35.1,-0.8,0
-3185,35.1,-1,0
-3187,35.1,-1.1,0
-3188,35.1,-1.3,0
-3190,35.1,-1.4,0
-3191,35.1,-1.5,0
-3192,35.1,-1.6,0
-3194,35.1,-1.7,0
-3195,35.1,-1.9,0
-3196,35.1,-2,0
-3197,35.1,-2.1,0
-3199,35.1,-2.2,0
-3200,35.1,-2.3,0
-3201,35.1,-2.4,0
-3202,35.1,-2.5,0
-3203,35.1,-2.7,0
-3204,35.1,-2.8,0
-3205,35.1,-3.2,0
-3206,0,-2.6,10.4
-3207,19,-2.6,0
-3208,19,-3.3,0
-3209,19,-3.4,0
-3210,19,-3.3,0
-3211,19,-3.4,0
-3213,19,-3.5,0
-3215,19,-3.6,0
-3216,19,-3.4,0
-3217,19,-3.3,0
-3219,19,-3.2,0
-3226,19,-3.1,0
-3229,19,-3,0
-3233,19,-2.9,0
-3235,19,-2.8,0
-3237,19,-2.7,0
-3239,19,-2.6,0
-3241,19,-2.5,0
-3242,19,-2.4,0
-3244,19,-2.3,0
-3245,19,-2.2,0
-3246,19,-2.1,0
-3248,19,-2,0
-3249,19,-1.9,0
-3250,19,-1.8,0
-3252,19,-1.7,0
-3253,19,-1.6,0
-3254,19,-1.5,0
-3256,19,-1.4,0
-3257,19,-1.3,0
-3259,19,-1.2,0
-3260,19,-1.1,0
-3261,19,-1,0
-3263,19,-0.9,0
-3264,19,-0.8,0
-3266,19,-0.7,0
-3267,19,-0.6,0
-3269,19,-0.5,0
-3272,19,-0.4,0
-3273,19,-0.3,0
-3275,35.5,-0.2,0
-3277,35.5,-0.1,0
-3281,35.5,0,0
-3284,35.5,0.1,0
-3291,35.5,0.2,0
-3297,35.5,0.1,0
-3305,35.5,0,0
-3310,35.5,-0.1,0
-3315,35.5,-0.2,0
-3318,35.5,-0.3,0
-3321,35.5,-0.4,0
-3327,35.5,-0.5,0
-3331,35.5,-0.6,0
-3338,35.5,-0.7,0
-3348,35.5,-0.8,0
-3374,35.5,-0.7,0
-3387,35.5,-0.6,0
-3395,35.5,-0.5,0
-3399,35.5,-0.4,0
-3403,35.5,-0.3,0
-3405,35.5,-0.2,0
-3408,35.5,-0.1,0
-3410,35.5,0,0
-3412,35.5,0.1,0
-3414,35.5,0.2,0
-3417,35.5,0.3,0
-3419,35.5,0.4,0
-3421,35.5,0.5,0
-3422,35.5,0.6,0
-3423,35.5,0.7,0
-3426,35.5,0.8,0
-3427,35.5,0.9,0
-3429,35.5,1,0
-3430,35.5,1.1,0
-3433,35.5,1.2,0
-3436,35.5,1.3,0
-3441,10,1.5,0
-3442,12.3,1.6,0
-3443,12.3,1.7,0
-3444,12.3,1.8,0
-3445,12.3,1.9,0
-3446,12.3,2,0
-3448,12.3,2.1,0
-3450,12.3,2.2,0
-3459,0,2,21.2
+2504,30.7,0.2,0
+2505,30.7,0.3,0
+2507,30.7,0.4,0
+2511,30.7,0.5,0
+2515,30.7,0.6,0
+2521,30.7,0.7,0
+2524,30.7,0.8,0
+2528,30.7,0.9,0
+2533,30.7,1,0
+2537,30.7,1.1,0
+2540,30.7,1.2,0
+2545,30.7,1.3,0
+2549,30.7,1.4,0
+2554,30.7,1.5,0
+2560,30.7,1.6,0
+2574,30.7,1.5,0
+2579,30.7,1.4,0
+2581,30.7,1.3,0
+2584,30.7,1.2,0
+2585,30.7,1,0
+2586,30.7,0.8,0
+2587,30.7,0.5,0
+2588,0,1.4,7.6
+2589,50.1,1.4,0
+2590,50.1,1,0
+2598,50.1,0.9,0
+2602,50.1,0.8,0
+2606,50.1,0.7,0
+2612,50.1,0.6,0
+2635,50.1,0.7,0
+2641,50.1,0.8,0
+2647,50.1,0.9,0
+2653,50.1,1,0
+2662,50.1,1.1,0
+2672,50.1,1,0
+2681,50.1,0.9,0
+2688,50.1,0.8,0
+2692,50.1,0.7,0
+2697,50.1,0.6,0
+2700,50.1,0.5,0
+2705,50.1,0.4,0
+2710,50.1,0.3,0
+2712,50.1,0.2,0
+2718,50.1,0.1,0
+2723,50.1,0,0
+2732,50.1,-0.1,0
+2743,50.1,-0.2,0
+2757,50.1,-0.3,0
+2771,50.1,-0.4,0
+2859,50.1,-0.5,0
+2864,50.1,-0.6,0
+2869,50.1,-0.7,0
+2874,50.1,-0.8,0
+2877,50.1,-0.9,0
+2881,50.1,-1,0
+2884,50.1,-1.1,0
+2886,50.1,-1.2,0
+2888,50.1,-1.3,0
+2892,50.1,-1.4,0
+2894,50.1,-1.5,0
+2898,50.1,-1.6,0
+2900,50.1,-1.7,0
+2905,50.1,-1.8,0
+2909,50.1,-1.9,0
+2914,50.1,-2,0
+2916,50.1,-2.1,0
+2917,50.1,-2.5,0
+2918,0,-3,21.4
+2919,48.7,-3,0
+2920,48.7,-2.1,0
+2921,48.7,-2,0
+2923,48.7,-1.9,0
+2926,48.7,-1.8,0
+2928,48.7,-1.7,0
+2932,48.7,-1.6,0
+2934,48.7,-1.5,0
+2936,48.7,-1.4,0
+2939,48.7,-1.3,0
+2940,48.7,-1.2,0
+2943,48.7,-1.1,0
+2944,48.7,-1,0
+2946,48.7,-0.9,0
+2949,48.7,-0.8,0
+2950,48.7,-0.7,0
+2952,48.7,-0.6,0
+2954,48.7,-0.5,0
+2957,48.7,-0.4,0
+2959,48.7,-0.3,0
+2961,48.7,-0.2,0
+2965,48.7,-0.1,0
+2967,48.7,0,0
+2971,48.7,0.1,0
+2977,48.7,0.2,0
+2983,48.7,0.3,0
+3009,48.7,0.2,0
+3093,48.7,0.3,0
+3098,48.7,0.4,0
+3103,48.7,0.5,0
+3108,48.7,0.6,0
+3110,48.7,0.7,0
+3115,48.7,0.8,0
+3117,48.7,0.9,0
+3121,48.7,1,0
+3125,48.7,1.1,0
+3129,48.7,1.2,0
+3133,35.1,1.3,0
+3141,35.1,1.4,0
+3143,35.1,1.3,0
+3153,35.1,1.2,0
+3155,35.1,1.1,0
+3158,35.1,1,0
+3160,35.1,0.9,0
+3162,35.1,0.8,0
+3164,35.1,0.7,0
+3166,35.1,0.6,0
+3168,35.1,0.4,0
+3170,35.1,0.2,0
+3172,35.1,0.1,0
+3173,35.1,0,0
+3175,35.1,-0.2,0
+3177,35.1,-0.3,0
+3179,35.1,-0.5,0
+3181,35.1,-0.6,0
+3182,35.1,-0.8,0
+3184,35.1,-1,0
+3186,35.1,-1.1,0
+3187,35.1,-1.3,0
+3189,35.1,-1.4,0
+3190,35.1,-1.5,0
+3191,35.1,-1.6,0
+3193,35.1,-1.7,0
+3194,35.1,-1.9,0
+3195,35.1,-2,0
+3196,35.1,-2.1,0
+3198,35.1,-2.2,0
+3199,35.1,-2.3,0
+3200,35.1,-2.4,0
+3201,35.1,-2.5,0
+3202,35.1,-2.7,0
+3203,35.1,-2.8,0
+3204,35.1,-3.2,0
+3205,0,-2.6,10.4
+3206,19,-2.6,0
+3207,19,-3.3,0
+3208,19,-3.4,0
+3209,19,-3.3,0
+3210,19,-3.4,0
+3212,19,-3.5,0
+3214,19,-3.6,0
+3215,19,-3.4,0
+3216,19,-3.3,0
+3218,19,-3.2,0
+3225,19,-3.1,0
+3228,19,-3,0
+3232,19,-2.9,0
+3234,19,-2.8,0
+3236,19,-2.7,0
+3238,19,-2.6,0
+3240,19,-2.5,0
+3241,19,-2.4,0
+3243,19,-2.3,0
+3244,19,-2.2,0
+3245,19,-2.1,0
+3247,19,-2,0
+3248,19,-1.9,0
+3249,19,-1.8,0
+3251,19,-1.7,0
+3252,19,-1.6,0
+3253,19,-1.5,0
+3255,19,-1.4,0
+3256,19,-1.3,0
+3258,19,-1.2,0
+3259,19,-1.1,0
+3260,19,-1,0
+3262,19,-0.9,0
+3263,19,-0.8,0
+3265,19,-0.7,0
+3266,19,-0.6,0
+3268,19,-0.5,0
+3271,19,-0.4,0
+3272,19,-0.3,0
+3274,35.5,-0.2,0
+3276,35.5,-0.1,0
+3280,35.5,0,0
+3283,35.5,0.1,0
+3290,35.5,0.2,0
+3296,35.5,0.1,0
+3304,35.5,0,0
+3309,35.5,-0.1,0
+3314,35.5,-0.2,0
+3317,35.5,-0.3,0
+3320,35.5,-0.4,0
+3326,35.5,-0.5,0
+3330,35.5,-0.6,0
+3337,35.5,-0.7,0
+3347,35.5,-0.8,0
+3373,35.5,-0.7,0
+3386,35.5,-0.6,0
+3394,35.5,-0.5,0
+3398,35.5,-0.4,0
+3402,35.5,-0.3,0
+3404,35.5,-0.2,0
+3407,35.5,-0.1,0
+3409,35.5,0,0
+3411,35.5,0.1,0
+3413,35.5,0.2,0
+3416,35.5,0.3,0
+3418,35.5,0.4,0
+3420,35.5,0.5,0
+3421,35.5,0.6,0
+3422,35.5,0.7,0
+3425,35.5,0.8,0
+3426,35.5,0.9,0
+3428,35.5,1,0
+3429,35.5,1.1,0
+3432,35.5,1.2,0
+3435,35.5,1.3,0
+3440,10,1.5,0
+3441,12.3,1.6,0
+3442,12.3,1.7,0
+3443,12.3,1.8,0
+3444,12.3,1.9,0
+3445,12.3,2,0
+3447,12.3,2.1,0
+3449,12.3,2.2,0
+3458,0,2,21.2
+3459,32,2,0
 3460,32,2,0
-3461,32,2,0
-3462,32,2.2,0
-3463,32,2.4,0
-3465,32,2.5,0
-3473,32,2.4,0
-3478,32,2.3,0
-3481,32,2.2,0
-3484,32,2.1,0
-3486,32,2,0
-3489,32,1.9,0
-3492,32,1.8,0
-3494,32,1.7,0
-3497,32,1.6,0
-3498,32,1.5,0
-3500,32,1.4,0
-3503,32,1.3,0
-3505,32,1.2,0
-3509,32,1.1,0
-3510,32,1,0
-3514,32,0.9,0
-3516,32,0.8,0
-3519,32,0.7,0
-3521,32,0.6,0
-3524,32,0.5,0
-3528,32,0.4,0
-3530,32,0.3,0
-3533,32,0.2,0
-3536,32,0.1,0
-3540,32,0,0
-3543,32,-0.1,0
-3546,32,-0.2,0
-3551,32,-0.3,0
-3555,32,-0.4,0
-3558,32,-0.5,0
-3562,32,-0.6,0
-3567,32,-0.7,0
-3572,32,-0.8,0
-3577,13.2,-0.8,0
-3578,21.3,-0.8,0
-3579,21.3,-0.9,0
-3595,26.1,-0.9,0
-3606,26.1,-1,0
-3615,26.1,-1.1,0
-3622,26.1,-1.2,0
-3630,26.1,-1.3,0
-3656,26.1,-1.2,0
-3661,26.1,-1.1,0
-3666,26.1,-1,0
-3672,26.1,-0.9,0
-3674,26.1,-1,0
-3677,26.1,-1.2,0
-3678,26.1,-1.1,0
-3679,26.1,-1,0
-3680,26.1,-1.1,0
-3681,26.1,-1.2,0
-3682,0,-1,16.2
-3683,29.3,-1,0
-3684,29.3,-0.5,0
-3685,29.3,-0.4,0
-3686,29.3,-0.3,0
-3689,29.3,-0.2,0
-3694,29.3,-0.1,0
-3695,29.3,0,0
-3700,29.3,0.1,0
-3720,29.3,0,0
-3730,29.3,-0.1,0
-3732,26,-0.1,0
-3733,30.7,-0.1,0
-3743,30.7,-0.2,0
-3758,30.7,-0.3,0
-3770,30.7,-0.4,0
-3777,30.7,-0.5,0
-3782,30.7,-0.6,0
-3787,30.7,-0.7,0
-3794,30.7,-0.8,0
-3802,17.9,-0.9,0
-3806,36.4,-0.9,0
-3814,36.4,-0.8,0
-3821,36.4,-0.7,0
-3825,36.4,-0.6,0
-3829,36.4,-0.5,0
-3833,36.4,-0.4,0
-3836,36.4,-0.3,0
-3839,36.4,-0.2,0
-3842,36.4,-0.1,0
-3845,36.4,0,0
-3847,36.4,0.1,0
-3851,36.4,0.2,0
-3854,36.4,0.3,0
-3857,36.4,0.4,0
-3863,36.4,0.5,0
-3870,36.4,0.6,0
-3883,36.4,0.5,0
-3891,36.4,0.4,0
-3896,36.4,0.3,0
-3902,36.4,0.2,0
-3908,36.4,0.1,0
-3920,36.4,0,0
-3928,36.4,0.1,0
-3932,32.6,0.1,0
-3942,32.6,0.2,0
-3943,27.5,0.2,0
-3951,27.5,0.3,0
-3958,39.6,0.3,0
-3960,39.6,0.4,0
-3974,39.6,0.3,0
-3983,39.6,0.2,0
-3989,39.6,0.1,0
-3993,39.6,0,0
-4000,39.6,-0.1,0
-4004,39.6,-0.2,0
-4010,39.6,-0.3,0
-4017,30,-0.3,0
-4022,32.1,-0.4,0
-4042,32.1,-0.3,0
-4057,32.1,-0.4,0
-4069,32.1,-0.5,0
-4072,32.1,-0.6,0
-4073,0,-0.9,9.6
+3461,32,2.2,0
+3462,32,2.4,0
+3464,32,2.5,0
+3472,32,2.4,0
+3477,32,2.3,0
+3480,32,2.2,0
+3483,32,2.1,0
+3485,32,2,0
+3488,32,1.9,0
+3491,32,1.8,0
+3493,32,1.7,0
+3496,32,1.6,0
+3497,32,1.5,0
+3499,32,1.4,0
+3502,32,1.3,0
+3504,32,1.2,0
+3508,32,1.1,0
+3509,32,1,0
+3513,32,0.9,0
+3515,32,0.8,0
+3518,32,0.7,0
+3520,32,0.6,0
+3523,32,0.5,0
+3527,32,0.4,0
+3529,32,0.3,0
+3532,32,0.2,0
+3535,32,0.1,0
+3539,32,0,0
+3542,32,-0.1,0
+3545,32,-0.2,0
+3550,32,-0.3,0
+3554,32,-0.4,0
+3557,32,-0.5,0
+3561,32,-0.6,0
+3566,32,-0.7,0
+3571,32,-0.8,0
+3576,26.1,-0.8,0
+3578,26.1,-0.9,0
+3605,26.1,-1,0
+3614,26.1,-1.1,0
+3621,26.1,-1.2,0
+3629,26.1,-1.3,0
+3655,26.1,-1.2,0
+3660,26.1,-1.1,0
+3665,26.1,-1,0
+3671,26.1,-0.9,0
+3673,26.1,-1,0
+3676,26.1,-1.2,0
+3677,26.1,-1.1,0
+3678,26.1,-1,0
+3679,26.1,-1.1,0
+3680,26.1,-1.2,0
+3681,0,-1,16.2
+3682,29.3,-1,0
+3683,29.3,-0.5,0
+3684,29.3,-0.4,0
+3685,29.3,-0.3,0
+3688,29.3,-0.2,0
+3693,29.3,-0.1,0
+3694,29.3,0,0
+3699,29.3,0.1,0
+3719,29.3,0,0
+3729,29.3,-0.1,0
+3731,26,-0.1,0
+3732,30.7,-0.1,0
+3742,30.7,-0.2,0
+3757,30.7,-0.3,0
+3769,30.7,-0.4,0
+3776,30.7,-0.5,0
+3781,30.7,-0.6,0
+3786,30.7,-0.7,0
+3793,30.7,-0.8,0
+3801,30.7,-0.9,0
+3805,36.4,-0.9,0
+3813,36.4,-0.8,0
+3820,36.4,-0.7,0
+3824,36.4,-0.6,0
+3828,36.4,-0.5,0
+3832,36.4,-0.4,0
+3835,36.4,-0.3,0
+3838,36.4,-0.2,0
+3841,36.4,-0.1,0
+3844,36.4,0,0
+3846,36.4,0.1,0
+3850,36.4,0.2,0
+3853,36.4,0.3,0
+3856,36.4,0.4,0
+3862,36.4,0.5,0
+3869,36.4,0.6,0
+3882,36.4,0.5,0
+3890,36.4,0.4,0
+3895,36.4,0.3,0
+3901,36.4,0.2,0
+3907,36.4,0.1,0
+3919,36.4,0,0
+3927,36.4,0.1,0
+3931,32.6,0.1,0
+3941,32.6,0.2,0
+3942,27.5,0.2,0
+3950,27.5,0.3,0
+3957,39.6,0.3,0
+3959,39.6,0.4,0
+3973,39.6,0.3,0
+3982,39.6,0.2,0
+3988,39.6,0.1,0
+3992,39.6,0,0
+3999,39.6,-0.1,0
+4003,39.6,-0.2,0
+4009,39.6,-0.3,0
+4016,30,-0.3,0
+4021,32.1,-0.4,0
+4041,32.1,-0.3,0
+4056,32.1,-0.4,0
+4068,32.1,-0.5,0
+4071,32.1,-0.6,0
+4072,0,-0.9,9.6
+4073,23.1,-0.9,0
 4074,23.1,-0.9,0
-4075,23.1,-0.9,0
-4076,23.1,-0.7,0
-4077,23.1,-0.6,0
-4079,23.1,-0.5,0
-4123,23.1,-0.6,0
-4124,23.1,-0.8,0
-4125,23.1,-1.1,0
-4126,0,-0.3,3.8
-4127,35.7,-0.3,0
-4128,35.7,-0.7,0
-4129,35.7,-0.6,0
-4131,35.7,-0.5,0
-4139,35.7,-0.4,0
-4144,35.7,-0.5,0
-4158,35.7,-0.6,0
-4166,35.7,-0.7,0
-4174,35.7,-0.8,0
-4187,35.7,-0.9,0
-4193,35.7,-0.8,0
-4205,35.7,-0.7,0
-4212,35.7,-0.6,0
-4216,35.7,-0.5,0
-4220,35.7,-0.4,0
-4226,35.7,-0.3,0
-4229,35.7,-0.2,0
-4233,35.7,-0.1,0
-4237,35.7,0,0
-4241,35.7,0.1,0
-4244,35.7,0.2,0
-4250,35.7,0.3,0
-4253,35.7,0.4,0
-4257,30.7,0.4,0
-4259,30.7,0.5,0
-4264,30.7,0.6,0
-4269,30.7,0.7,0
-4275,30.7,0.8,0
-4280,30.7,0.9,0
-4289,30.7,1,0
-4307,30.7,0.9,0
-4309,0,0.6,2
-4310,32.5,0.6,0
-4311,32.5,0.7,0
-4312,32.5,0.8,0
-4313,32.5,0.9,0
-4316,32.5,1,0
-4325,32.5,0.9,0
-4332,32.5,0.8,0
-4338,32.5,0.7,0
-4342,32.5,0.6,0
-4346,32.5,0.5,0
-4349,32.5,0.4,0
-4354,32.5,0.3,0
-4358,32.5,0.2,0
-4363,32.5,0.1,0
-4368,32.5,0,0
-4373,32.5,-0.1,0
-4382,32.5,-0.2,0
-4416,32.5,-0.1,0
-4431,32.5,0,0
-4459,32.5,-0.1,0
-4460,20.5,-0.1,0
-4468,20.5,-0.2,0
-4479,22.4,-0.3,0
-4490,22.4,-0.4,0
-4491,42.1,-0.4,0
-4512,42.1,-0.3,0
-4530,42.1,-0.2,0
-4544,42.1,-0.3,0
-4556,42.1,-0.4,0
-4564,42.1,-0.5,0
-4570,42.1,-0.6,0
-4576,42.1,-0.7,0
-4582,42.1,-0.8,0
-4589,42.1,-0.9,0
-4597,42.1,-1,0
-4606,42.1,-1.1,0
-4620,42.1,-1.2,0
-4654,42.1,-1.1,0
-4665,42.1,-1,0
-4672,42.1,-0.9,0
-4681,42.1,-0.8,0
-4691,42.1,-0.7,0
-4721,42.1,-0.8,0
-4727,42.1,-0.9,0
-4734,42.1,-1,0
-4739,42.1,-1.1,0
-4743,42.1,-1.2,0
-4748,42.1,-1.3,0
-4752,42.1,-1.4,0
-4757,42.1,-1.5,0
-4761,42.1,-1.6,0
-4765,42.1,-1.7,0
-4769,42.1,-1.8,0
-4773,42.1,-1.9,0
-4777,42.1,-2,0
-4781,42.1,-2.1,0
-4785,42.1,-2.2,0
-4789,42.1,-2.3,0
-4795,42.1,-2.4,0
-4805,42.1,-2.5,0
-4814,42.1,-2.4,0
-4820,42.1,-2.3,0
-4824,42.1,-2.2,0
-4827,42.1,-2.1,0
-4830,42.1,-2,0
-4832,42.1,-1.9,0
-4835,42.1,-1.8,0
-4837,42.1,-1.7,0
-4839,42.1,-1.6,0
-4842,42.1,-1.5,0
-4844,42.1,-1.4,0
-4846,42.1,-1.3,0
-4849,10,-1.2,0
-4850,39.3,-1.1,0
-4852,39.3,-1,0
-4853,39.3,-0.9,0
-4855,39.3,-0.8,0
-4856,39.3,-0.7,0
-4858,39.3,-0.6,0
-4859,39.3,-0.5,0
-4860,39.3,-0.4,0
-4862,39.3,-0.3,0
-4864,39.3,-0.2,0
-4866,39.3,-0.1,0
-4867,39.3,0,0
-4868,39.3,0.2,0
-4872,39.3,0.3,0
-4875,39.3,0.4,0
-4877,39.3,0.5,0
-4880,39.3,0.6,0
-4884,39.3,0.7,0
-4903,39.3,0.6,0
-4908,39.3,0.5,0
-4912,39.3,0.4,0
-4918,39.3,0.3,0
-4922,39.3,0.2,0
-4928,39.3,0.1,0
-4947,39.3,0.2,0
-4954,39.3,0.3,0
-4960,39.3,0.4,0
-4965,39.3,0.5,0
-4969,39.3,0.6,0
-4975,39.3,0.7,0
-4982,39.3,0.8,0
-5000,39.3,0.7,0
-5008,39.3,0.6,0
-5012,39.3,0.5,0
-5017,39.3,0.4,0
-5021,28.4,0.3,0
-5022,45.1,0.3,0
-5024,45.1,0.2,0
-5029,45.1,0.1,0
-5032,45.1,0,0
-5036,45.1,-0.1,0
-5042,45.1,-0.2,0
-5048,45.1,-0.3,0
-5077,45.1,-0.2,0
-5084,45.1,-0.1,0
-5090,45.1,0,0
-5095,45.1,0.1,0
-5099,45.1,0.2,0
-5104,45.1,0.3,0
-5109,45.1,0.4,0
-5114,45.1,0.5,0
-5121,45.1,0.6,0
-5146,45.1,0.5,0
-5153,45.1,0.4,0
-5161,45.1,0.3,0
-5165,45.1,0.2,0
-5170,45.1,0.1,0
-5175,45.1,0,0
-5197,45.1,0.1,0
-5203,45.1,0.2,0
-5206,45.1,0.3,0
-5208,45.1,0.4,0
-5211,45.1,0.5,0
-5214,45.1,0.6,0
-5215,45.1,0.7,0
-5218,45.1,0.8,0
-5219,45.1,0.9,0
-5222,45.1,1,0
-5223,45.1,1.1,0
-5226,45.1,1.2,0
-5228,45.1,1.3,0
-5230,45.1,1.4,0
-5233,45.1,1.5,0
-5236,45.1,1.6,0
-5239,45.1,1.5,0
-5240,45.1,1.3,0
-5241,0,0.9,14.8
-5242,35.4,0.9,0
-5243,35.4,1.6,0
-5244,35.4,1.7,0
-5245,35.4,1.8,0
-5246,35.4,1.9,0
-5249,35.4,2,0
-5254,35.4,2.1,0
-5271,35.4,2,0
-5278,35.4,1.9,0
-5285,35.4,1.8,0
-5290,35.4,1.7,0
-5298,35.4,1.6,0
-5304,35.4,1.5,0
-5310,35.4,1.4,0
-5313,35.4,1.3,0
-5319,35.4,1.2,0
-5323,35.4,1.1,0
-5328,35.4,1,0
-5332,35.4,0.9,0
-5335,35.4,0.8,0
-5340,35.4,0.7,0
-5343,35.4,0.6,0
-5348,35.4,0.5,0
-5352,35.4,0.4,0
-5356,10,0.3,0
-5364,40.1,0.3,0
-5367,40.1,0.4,0
-5374,40.1,0.5,0
-5382,40.1,0.6,0
-5391,40.1,0.7,0
-5401,40.1,0.8,0
-5416,40.1,0.7,0
-5424,40.1,0.6,0
-5431,40.1,0.5,0
-5435,40.1,0.4,0
-5440,40.1,0.3,0
-5444,40.1,0.2,0
-5449,40.1,0.1,0
-5453,40.1,0,0
-5460,40.1,-0.1,0
-5466,40.1,-0.2,0
-5484,40.1,-0.1,0
-5493,40.1,0,0
-5498,40.1,0.1,0
-5504,40.1,0.2,0
-5512,40.1,0.3,0
-5517,24.3,0.3,0
-5519,54.9,0.3,0
-5539,54.9,0.2,0
-5546,54.9,0.1,0
-5554,54.9,0,0
-5559,54.9,-0.1,0
-5566,54.9,-0.2,0
-5572,54.9,-0.3,0
-5610,54.9,-0.2,0
-5617,54.9,-0.1,0
-5625,54.9,0,0
-5630,54.9,0.1,0
-5639,54.9,0.2,0
-5644,54.9,0.3,0
-5656,54.9,0.4,0
-5676,54.9,0.3,0
-5686,54.9,0.2,0
-5691,54.9,0.1,0
-5698,54.9,0,0
-5701,54.9,-0.1,0
-5707,54.9,-0.2,0
-5710,54.9,-0.3,0
-5713,54.9,-0.4,0
-5716,54.9,-0.5,0
-5722,54.9,-0.6,0
-5725,54.9,-0.7,0
-5728,54.9,-0.8,0
-5734,54.9,-0.9,0
-5737,54.9,-1,0
-5743,54.9,-1.1,0
-5774,54.9,-1,0
-5782,54.9,-0.9,0
-5789,54.9,-0.8,0
-5814,54.9,-0.9,0
-5820,54.9,-1,0
-5825,54.9,-1.1,0
-5830,54.9,-1.2,0
-5834,54.9,-1.3,0
-5837,54.9,-1.4,0
-5842,54.9,-1.5,0
-5852,54.9,-1.6,0
-5855,54.9,-1.9,0
-5856,0,-2.3,4.2
-5857,47.2,-2.3,0
-5858,47.2,-1.6,0
-5859,47.2,-1.5,0
-5860,47.2,-1.4,0
-5862,47.2,-1.3,0
-5865,47.2,-1.2,0
-5868,47.2,-1.1,0
-5870,47.2,-1,0
-5872,47.2,-0.9,0
-5875,47.2,-0.8,0
-5878,47.2,-0.7,0
-5879,47.2,-0.6,0
-5882,47.2,-0.5,0
-5884,47.2,-0.4,0
-5885,47.2,-0.3,0
-5888,47.2,-0.2,0
-5890,47.2,-0.1,0
-5892,47.2,0,0
-5894,47.2,0.1,0
-5895,47.2,0.2,0
-5899,47.2,0.3,0
-5901,47.2,0.4,0
-5903,47.2,0.5,0
-5907,47.2,0.6,0
-5909,47.2,0.7,0
-5913,47.2,0.8,0
-5917,47.2,0.9,0
-5921,47.2,1,0
-5948,47.2,0.9,0
-5956,47.2,0.8,0
-5963,47.2,0.7,0
-5971,47.2,0.6,0
-5978,47.2,0.5,0
-5986,47.2,0.4,0
-5991,49.9,0.4,0
-6005,57.8,0.4,0
-6038,57.8,0.3,0
-6053,57.8,0.2,0
-6059,57.8,0.1,0
-6068,57.8,0,0
-6075,57.8,-0.1,0
-6084,57.8,-0.2,0
-6113,57.8,-0.1,0
-6125,57.8,0,0
-6138,57.8,0.1,0
-6151,57.8,0.2,0
-6163,57.8,0.3,0
-6174,57.8,0.4,0
-6185,46.5,0.5,0
-6190,46.5,0.6,0
-6198,46.5,0.7,0
-6203,46.5,0.8,0
-6208,46.5,0.9,0
-6213,46.5,1,0
-6218,46.5,1.1,0
-6226,48.4,1.2,0
-6242,59.2,1.2,0
-6250,59.2,1.1,0
-6259,59.2,1,0
-6265,59.2,0.9,0
-6271,59.2,0.8,0
-6276,59.2,0.7,0
-6282,59.2,0.6,0
-6297,59.2,0.5,0
-6310,59.2,0.6,0
-6343,59.2,0.5,0
-6352,59.2,0.4,0
-6362,59.2,0.3,0
-6368,59.2,0.2,0
-6376,59.2,0.1,0
-6400,59.2,0.2,0
-6403,46.5,0.2,0
-6408,48.4,0.3,0
-6413,48.4,0.4,0
-6418,48.4,0.5,0
-6421,48.4,0.6,0
-6426,48.4,0.7,0
-6429,48.4,0.8,0
-6434,48.4,0.9,0
-6437,48.4,1,0
-6440,48.4,1.1,0
-6442,59,1.2,0
-6448,59,1.3,0
-6450,59,1.4,0
-6456,59,1.5,0
-6462,59,1.6,0
-6473,59,1.7,0
-6479,59,1.6,0
-6491,59,1.5,0
-6497,59,1.4,0
-6500,59,1.3,0
-6503,59,1.2,0
-6510,59,1.1,0
-6513,59,1,0
-6516,59,0.9,0
-6519,59,0.8,0
-6522,59,0.7,0
-6525,59,0.6,0
-6528,59,0.5,0
-6532,59,0.4,0
-6535,59,0.3,0
-6538,59,0.2,0
-6545,59,0.1,0
-6548,59,0,0
-6555,59,-0.1,0
-6582,59,0,0
-6589,59,0.1,0
-6592,59,0.2,0
-6599,59,0.3,0
-6602,59,0.4,0
-6606,59,0.5,0
-6612,59,0.6,0
-6616,59,0.7,0
-6623,59,0.8,0
-6629,59,0.9,0
-6659,59,0.8,0
-6669,59,0.7,0
-6688,59,0.6,0
-6739,59,0.5,0
-6749,67,0.4,0
-6755,67,0.3,0
-6762,67,0.2,0
-6768,67,0.1,0
-6775,67,0,0
-6782,67,-0.1,0
-6789,67,-0.2,0
-6796,67,-0.3,0
-6838,67,-0.2,0
-6852,67,-0.1,0
-6867,67,0,0
-6885,67,0.1,0
-6896,67,0.2,0
-6907,67,0.3,0
-6918,67,0.4,0
-6925,67,0.5,0
-6959,67,0.4,0
-6966,67,0.3,0
-6970,67,0.2,0
-6978,67,0.1,0
-6981,67,0,0
-6985,67,-0.1,0
-6993,67,-0.2,0
-6996,67,-0.3,0
-7004,67,-0.4,0
-7015,67,-0.5,0
-7034,67,-0.4,0
-7053,67,-0.3,0
-7068,67,-0.2,0
-7106,67,-0.1,0
-7128,67,0,0
-7147,67,0.1,0
-7161,67,0.2,0
-7186,67,0.3,0
-7206,67,0.2,0
-7227,67,0.1,0
-7233,52,0.1,0
-7242,52,0,0
-7250,58.4,-0.1,0
-7259,58.4,-0.2,0
-7265,58.4,-0.3,0
-7274,58.4,-0.4,0
-7280,58.4,-0.5,0
-7289,58.4,-0.6,0
-7295,58.4,-0.7,0
-7308,58.4,-0.8,0
-7320,58.4,-0.9,0
-7340,58.4,-0.8,0
-7352,58.4,-0.7,0
-7359,58.4,-0.6,0
-7369,58.4,-0.5,0
-7397,58.4,-0.6,0
-7403,58.4,-0.7,0
-7409,58.4,-0.8,0
-7412,58.4,-0.9,0
-7417,58.4,-1,0
-7422,58.4,-1.1,0
-7424,58.4,-1.2,0
-7429,58.4,-1.3,0
-7436,58.4,-1.4,0
-7442,58.4,-1.5,0
-7451,58.4,-1.6,0
-7470,58.4,-1.7,0
-7478,18.4,-1.7,0
-7491,18.4,-1.8,0
-7503,18.4,-1.9,0
-7519,52,-1.9,0
-7525,52,-1.8,0
-7532,52,-1.7,0
-7538,52,-1.6,0
-7542,52,-1.5,0
-7546,52,-1.4,0
-7551,52,-1.3,0
-7556,52,-1.2,0
-7562,52,-1.1,0
-7567,52,-1,0
-7587,52,-1.1,0
-7594,52,-1.2,0
-7599,52,-1.3,0
-7604,52,-1.4,0
-7607,52,-1.5,0
-7612,52,-1.6,0
-7615,52,-1.7,0
-7621,52,-1.8,0
-7626,52,-1.9,0
-7632,52,-2,0
-7643,52,-2.1,0
-7666,52,-2,0
-7693,52,-1.9,0
-7702,52,-2,0
-7740,24.2,-2,0
-7743,30,-1.9,0
-7748,30,-1.8,0
-7753,30,-1.7,0
-7757,30,-1.6,0
-7760,30,-1.5,0
-7763,30,-1.4,0
-7764,30,-1.3,0
-7768,30,-1.2,0
-7771,30,-1.1,0
-7772,30,-1,0
-7774,30,-0.9,0
-7775,30,-0.8,0
-7778,30,-0.7,0
-7780,30,-0.6,0
-7781,30,-0.5,0
-7783,30,-0.4,0
-7784,30,-0.3,0
-7786,30,-0.2,0
-7787,30,-0.1,0
-7789,30,0,0
-7791,30,0.1,0
-7792,30,0.2,0
-7794,30,0.3,0
-7795,30,0.4,0
-7797,30,0.5,0
-7799,30,0.6,0
-7800,30,0.7,0
-7802,30,0.8,0
-7804,30,0.9,0
-7806,30,1,0
-7809,39.2,1.1,0
-7811,39.2,1.2,0
-7812,39.2,1.3,0
-7814,39.2,1.4,0
-7816,39.2,1.5,0
-7818,39.2,1.6,0
-7822,39.2,1.7,0
-7824,39.2,1.8,0
-7827,39.2,1.9,0
-7831,39.2,2,0
-7835,39.2,2.1,0
-7854,39.2,2,0
-7863,39.2,1.9,0
-7867,39.2,1.8,0
-7872,39.2,1.7,0
-7878,39.2,1.6,0
-7882,39.2,1.5,0
-7890,39.2,1.4,0
-7915,39.2,1.5,0
-7925,39.2,1.6,0
-7937,39.2,1.7,0
-7956,39.2,1.6,0
-7967,39.2,1.5,0
-7976,55.5,1.4,0
-7983,55.5,1.3,0
-7988,55.5,1.2,0
-7995,55.5,1.1,0
-8003,55.5,1,0
-8008,55.5,0.9,0
-8016,55.5,0.8,0
-8024,55.5,0.7,0
-8032,55.5,0.6,0
-8044,55.5,0.5,0
-8082,55.5,0.6,0
-8097,55.5,0.7,0
-8122,55.5,0.6,0
-8134,55.5,0.5,0
-8140,55.5,0.4,0
-8146,55.5,0.3,0
-8152,55.5,0.2,0
-8158,55.5,0.1,0
-8164,55.5,0,0
-8170,55.5,-0.1,0
-8176,55.5,-0.2,0
-8182,55.5,-0.3,0
-8191,55.5,-0.4,0
-8223,55.5,-0.3,0
-8233,55.5,-0.2,0
-8241,55.5,-0.1,0
-8246,55.5,0,0
-8248,32.6,0,0
-8253,32.6,0.1,0
-8255,44.9,0.1,0
-8263,44.9,0.2,0
-8287,44.9,0.1,0
-8301,44.9,0,0
-8316,44.9,-0.1,0
-8343,44.9,-0.2,0
-8359,44.9,-0.3,0
-8377,26.6,-0.3,0
-8379,42.5,-0.3,0
-8414,42.5,-0.4,0
-8424,42.5,-0.5,0
-8433,42.5,-0.6,0
-8439,42.5,-0.7,0
-8446,42.5,-0.8,0
-8470,42.5,-0.7,0
-8474,42.5,-0.6,0
-8476,42.5,-0.5,0
-8479,42.5,-0.4,0
-8481,42.5,-0.3,0
-8483,42.5,-0.2,0
-8485,42.5,-0.1,0
-8487,42.5,0,0
-8489,42.5,0.1,0
-8491,42.5,0.2,0
-8493,42.5,0.3,0
-8495,42.5,0.4,0
-8497,42.5,0.5,0
-8499,42.5,0.6,0
-8500,42.5,0.7,0
-8502,42.5,0.8,0
-8504,42.5,0.9,0
-8507,42.5,1,0
-8508,42.5,1.1,0
-8511,42.5,1.2,0
-8513,42.5,1.3,0
-8515,42.5,1.4,0
-8523,42.5,1.2,0
-8524,0,0.8,10.8
-8525,36.3,0.8,0
-8526,36.3,1.2,0
-8527,36.3,1.3,0
-8528,36.3,1.4,0
-8529,36.3,1.5,0
-8531,36.3,1.6,0
-8541,36.3,1.5,0
-8545,36.3,1.4,0
-8549,36.3,1.3,0
-8552,36.3,1.2,0
-8555,36.3,1.1,0
-8558,36.3,1,0
-8560,36.3,0.9,0
-8563,36.3,0.8,0
-8566,36.3,0.7,0
-8568,36.3,0.6,0
-8572,36.3,0.5,0
-8575,36.3,0.4,0
-8579,36.3,0.3,0
-8585,36.3,0.2,0
-8597,36.3,0.1,0
-8605,36.3,0.2,0
-8627,36.3,0.3,0
-8648,30,0.2,0
-8661,30,0.1,0
-8670,30,0,0
-8680,30,-0.1,0
-8690,36.3,-0.2,0
-8724,36.3,-0.1,0
-8735,36.3,0,0
-8744,36.3,0.1,0
-8754,36.3,0.2,0
-8765,36.3,0.3,0
-8775,36.3,0.4,0
-8776,27.4,0.4,0
-8786,27.4,0.5,0
-8794,27.4,0.6,0
-8801,27.4,0.7,0
-8811,27.4,0.8,0
-8826,27.4,0.9,0
-8834,27.4,0.8,0
-8840,27.4,0.7,0
-8842,27.4,0.6,0
-8843,27.4,0.2,0
-8844,0,0.2,21.2
-8845,33.8,0.2,0
-8846,33.8,0.6,0
-8847,33.8,0.7,0
-8849,33.8,0.8,0
-8861,33.8,0.7,0
-8878,33.8,0.6,0
-8905,33.8,0.7,0
-8934,33.8,0.6,0
-8938,28,0.6,0
-8940,28,0.5,0
-8945,28,0.4,0
-8948,28,0.3,0
-8951,28,0.2,0
-8954,28,0.1,0
-8957,28,0,0
-8958,28,-0.1,0
-8962,28,-0.2,0
-8963,28,-0.3,0
-8965,28,-0.4,0
-8968,28,-0.5,0
-8969,28,-0.6,0
-8971,28,-0.7,0
-8974,28,-0.8,0
-8975,28,-0.9,0
-8977,28,-1,0
-8979,35.4,-1,0
-8980,35.4,-1.1,0
-8982,35.4,-1.2,0
-8985,35.4,-1.3,0
-8988,35.4,-1.4,0
-8990,35.4,-1.5,0
-8994,35.4,-1.6,0
-8999,35.4,-1.7,0
-9021,35.4,-1.6,0
-9026,35.4,-1.5,0
-9032,35.4,-1.4,0
-9036,35.4,-1.3,0
-9040,35.4,-1.2,0
-9042,35.4,-1.1,0
-9046,35.4,-1,0
-9050,35.4,-0.9,0
-9053,35.4,-0.8,0
-9057,35.4,-0.7,0
-9061,35.4,-0.6,0
-9065,38.9,-0.5,0
-9069,38.9,-0.4,0
-9075,38.9,-0.3,0
-9081,38.9,-0.2,0
-9105,38.9,-0.3,0
-9117,38.9,-0.4,0
-9150,38.9,-0.3,0
-9156,38.9,-0.2,0
-9162,38.9,-0.1,0
-9166,38.9,0,0
-9170,38.9,0.1,0
-9172,38.9,0.2,0
-9176,38.9,0.3,0
-9180,43.5,0.4,0
-9184,43.5,0.5,0
-9186,43.5,0.6,0
-9192,43.5,0.7,0
-9197,43.5,0.8,0
-9217,43.5,0.7,0
-9222,43.5,0.6,0
-9226,43.5,0.5,0
-9229,43.5,0.4,0
-9231,43.5,0.3,0
-9236,43.5,0.2,0
-9238,43.5,0.1,0
-9241,43.5,0,0
-9243,43.5,-0.1,0
-9245,43.5,-0.2,0
-9248,43.5,-0.3,0
-9250,43.5,-0.4,0
-9252,43.5,-0.5,0
-9257,43.5,-0.6,0
-9259,43.5,-0.7,0
-9262,43.5,-0.8,0
-9266,43.5,-0.9,0
-9270,43.5,-1,0
-9277,43.5,-1.1,0
-9303,43.5,-1,0
-9309,34.2,-1,0
-9311,34.2,-0.9,0
-9317,34.2,-0.8,0
-9322,34.2,-0.7,0
-9328,34.2,-0.6,0
-9333,34.2,-0.5,0
-9338,34.2,-0.4,0
-9343,34.2,-0.3,0
-9350,34.2,-0.2,0
-9357,34.2,-0.4,0
-9359,34.2,-0.7,0
-9360,0,-0.5,8.8
-9361,34.2,-0.5,0
-9362,34.2,-0.2,0
-9364,34.2,-0.1,0
-9367,34.2,0,0
-9372,34.2,0.1,0
-9381,34.2,0.2,0
-9453,34.2,0.1,0
-9463,34.2,0,0
-9470,34.2,-0.1,0
-9473,34.2,-0.2,0
-9475,37.3,-0.2,0
-9479,37.3,-0.3,0
-9482,37.3,-0.4,0
-9486,37.3,-0.5,0
-9490,37.3,-0.6,0
-9494,37.3,-0.7,0
-9498,37.3,-0.8,0
-9500,37.3,-0.9,0
-9504,37.3,-1,0
-9508,37.3,-1.1,0
-9512,37.3,-1.2,0
-9516,37.3,-1.3,0
-9520,37.3,-1.4,0
-9524,37.3,-1.5,0
-9530,37.3,-1.6,0
-9535,37.3,-1.7,0
-9541,37.3,-1.8,0
-9547,37.3,-1.9,0
-9551,37.3,-2.1,0
-9553,37.3,-2.2,0
-9554,37.3,-2.3,0
-9555,10,-2.3,0
-9556,26.9,-2.3,0
-9557,26.9,-2.2,0
-9558,26.9,-2.1,0
-9559,26.9,-2,0
-9561,26.9,-1.9,0
-9563,26.9,-1.8,0
-9569,26.9,-1.7,0
-9575,26.9,-1.6,0
-9580,26.9,-1.5,0
-9584,26.9,-1.4,0
-9589,26.9,-1.3,0
-9593,26.9,-1.2,0
-9599,26.9,-1.1,0
-9603,26.9,-1,0
-9609,26.9,-0.9,0
-9615,26.9,-0.8,0
-9624,26.9,-0.7,0
-9637,26.9,-0.6,0
-9643,41.5,-0.6,0
-9655,41.5,-0.5,0
-9667,41.5,-0.4,0
-9676,41.5,-0.3,0
-9687,41.5,-0.2,0
-9693,41.5,-0.1,0
-9702,41.5,0,0
-9718,41.5,0.1,0
-9725,41.5,0,0
-9740,41.5,-0.1,0
-9749,41.5,-0.2,0
-9751,31.5,-0.2,0
-9753,35.9,-0.2,0
-9760,35.9,-0.3,0
-9777,35.9,-0.2,0
-9785,35.9,-0.1,0
-9791,35.9,0,0
-9797,35.9,0.1,0
-9801,35.9,0.2,0
-9805,35.9,0.3,0
-9810,35.9,0.4,0
-9816,35.9,0.5,0
-9823,35.9,0.6,0
-9843,26.5,0.6,0
-9845,37.7,0.6,0
-9852,37.7,0.5,0
-9866,37.7,0.4,0
-9906,37.7,0.5,0
-9918,37.7,0.6,0
-9944,37.7,0.5,0
-9948,37.7,0.4,0
-9949,37.7,0.3,0
-9950,37.7,0,0
-9951,0,-0.1,7.4
-9952,37,-0.1,0
-9953,37,0.3,0
-9963,37,0.2,0
-9968,37,0.1,0
-9973,37,0,0
-9978,37,-0.1,0
-9982,37,-0.2,0
-9987,37,-0.3,0
-9992,37,-0.4,0
-10004,37,-0.5,0
-10008,37,-0.4,0
-10018,37,-0.3,0
-10024,37,-0.2,0
-10028,37,-0.1,0
-10034,37,0,0
-10037,37,0.1,0
-10041,37,0.2,0
-10045,37,0.3,0
-10051,37,0.4,0
-10059,19.2,0.5,0
-10060,37.8,0.5,0
-10075,37.8,0.4,0
-10081,37.8,0.3,0
-10084,37.8,0.2,0
-10088,37.8,0.1,0
-10092,37.8,0,0
-10095,37.8,-0.1,0
-10098,37.8,-0.2,0
-10101,37.8,-0.3,0
-10105,37.8,-0.4,0
-10108,37.8,-0.5,0
-10114,37.8,-0.6,0
-10119,37.8,-0.7,0
-10138,37.8,-0.6,0
-10148,37.8,-0.5,0
-10158,37.8,-0.4,0
-10184,28.4,-0.4,0
-10187,28.4,-0.5,0
-10223,28.4,-0.4,0
-10231,28.4,-0.3,0
-10236,28.4,-0.2,0
-10237,20.8,-0.2,0
-10239,20.8,-0.1,0
-10244,24.6,0,0
-10247,24.6,0.1,0
-10251,24.6,0.2,0
-10253,24.6,0.3,0
-10257,24.6,0.4,0
-10260,24.6,0.5,0
-10264,24.6,0.6,0
-10269,24.6,0.7,0
-10275,24.6,0.8,0
-10288,36.4,0.8,0
-10302,36.4,0.7,0
-10310,36.4,0.6,0
-10316,36.4,0.5,0
-10324,36.4,0.4,0
-10332,36.4,0.3,0
-10340,36.4,0.2,0
-10348,36.4,0.1,0
-10361,36.4,0,0
-10391,36.4,-0.1,0
-10396,36.4,-0.2,0
-10397,36.4,-0.6,0
-10398,0,-0.5,8.8
-10399,29.1,-0.5,0
-10400,29.1,-0.2,0
-10401,29.1,-0.1,0
-10404,29.1,0,0
-10436,29.1,-0.1,0
-10452,29.1,-0.2,0
-10467,12.8,-0.2,0
-10471,56.5,-0.1,0
-10476,56.5,0,0
-10480,56.5,0.1,0
-10483,56.5,0.2,0
-10487,56.5,0.3,0
-10491,56.5,0.4,0
-10495,56.5,0.5,0
-10498,56.5,0.6,0
-10503,56.5,0.7,0
-10506,56.5,0.8,0
-10510,56.5,0.9,0
-10516,56.5,1,0
-10524,56.5,1.1,0
-10558,56.5,1,0
-10593,56.5,0.9,0
-10602,56.5,0.8,0
-10611,56.5,0.7,0
-10614,56.5,0.6,0
-10620,56.5,0.5,0
-10623,56.5,0.4,0
-10626,56.5,0.3,0
-10629,56.5,0.2,0
-10632,56.5,0.1,0
-10635,56.5,0,0
-10641,56.5,-0.1,0
-10644,56.5,-0.2,0
-10647,56.5,-0.3,0
-10651,56.5,-0.4,0
-10657,56.5,-0.5,0
-10660,56.5,-0.6,0
-10666,56.5,-0.7,0
-10676,56.5,-0.8,0
-10702,56.5,-0.9,0
-10707,56.5,-0.8,0
-10735,56.5,-0.7,0
-10746,56.5,-0.6,0
-10749,26,-0.6,0
-10751,26,-0.5,0
-10757,57,-0.4,0
-10763,57,-0.3,0
-10768,57,-0.2,0
-10771,57,-0.1,0
-10776,57,0,0
-10780,57,0.1,0
-10785,57,0.2,0
-10789,57,0.3,0
-10794,57,0.4,0
-10800,57,0.5,0
-10804,57,0.6,0
-10811,57,0.7,0
-10818,57,0.8,0
-10852,57,0.7,0
-10860,57,0.6,0
-10869,57,0.5,0
-10878,57,0.4,0
-10887,57,0.3,0
-10896,57,0.2,0
-10902,57,0.1,0
-10912,57,0,0
-10918,57,-0.1,0
-10921,57,-0.2,0
-10927,57,-0.3,0
-10934,57,-0.4,0
-10937,57,-0.5,0
-10943,57,-0.6,0
-10949,57,-0.7,0
-10955,57,-0.8,0
-10966,57,-0.9,0
-10997,57,-0.8,0
-11005,25.3,-0.8,0
-11008,25.3,-0.7,0
-11013,28,-0.7,0
-11015,28,-0.6,0
-11022,28,-0.5,0
-11028,28,-0.4,0
-11034,28,-0.3,0
-11038,49.6,-0.3,0
-11040,49.6,-0.2,0
-11048,49.6,-0.1,0
-11057,49.6,0,0
-11070,49.6,0.1,0
-11090,49.6,0.2,0
-11107,49.6,0.3,0
-11120,49.6,0.4,0
-11144,49.6,0.3,0
-11147,53.7,0.3,0
-11155,53.7,0.2,0
-11160,53.7,0.1,0
-11169,53.7,0,0
-11175,53.7,-0.1,0
-11181,53.7,-0.2,0
-11187,53.7,-0.3,0
-11196,53.7,-0.4,0
-11204,53.7,-0.5,0
-11213,53.7,-0.6,0
-11251,53.7,-0.5,0
-11259,53.7,-0.4,0
-11264,45.3,-0.3,0
-11269,45.3,-0.2,0
-11272,45.3,-0.1,0
-11277,45.3,0,0
-11282,45.3,0.1,0
-11284,45.3,0.2,0
-11289,45.3,0.3,0
-11294,45.3,0.4,0
-11299,45.3,0.5,0
-11307,45.3,0.6,0
-11309,54.4,0.6,0
-11324,54.4,0.5,0
-11335,54.4,0.4,0
-11340,54.4,0.3,0
-11346,54.4,0.2,0
-11351,54.4,0.1,0
-11357,54.4,0,0
-11386,54.4,0.1,0
-11395,54.4,0.2,0
-11404,54.4,0.3,0
-11419,54.4,0.4,0
-11428,54.4,0.3,0
-11444,54.4,0.2,0
-11450,46.5,0.2,0
-11455,46.5,0.1,0
-11470,46.5,0,0
-11481,46.5,0.1,0
-11494,46.5,0.2,0
-11502,46.5,0.3,0
-11509,46.5,0.4,0
-11514,46.5,0.5,0
-11522,46.5,0.6,0
-11529,46.5,0.7,0
-11539,46.5,0.8,0
-11597,46.5,0.9,0
-11604,46.5,1,0
-11611,46.5,1.1,0
-11615,46.5,1.2,0
-11619,46.5,1.3,0
-11623,46.5,1.4,0
-11627,46.5,1.5,0
-11632,46.5,1.6,0
-11639,46.5,1.7,0
-11649,46.5,1.6,0
-11653,46.5,1.5,0
-11655,46.5,1.4,0
-11656,46.5,1.3,0
-11657,10,1.3,0
-11660,16.7,1.4,0
-11662,16.7,1.3,0
-11667,16.7,1.2,0
-11671,16.7,1.1,0
-11673,16.7,1,0
-11675,16.7,0.9,0
-11678,16.7,0.8,0
-11681,16.7,0.7,0
-11682,16.7,0.6,0
-11685,16.7,0.5,0
-11687,16.7,0.4,0
-11689,35.1,0.4,0
-11690,35.1,0.3,0
-11692,35.1,0.2,0
-11695,35.1,0.1,0
-11697,35.1,0,0
-11700,35.1,-0.1,0
-11702,35.1,-0.2,0
-11706,35.1,-0.3,0
-11709,35.1,-0.4,0
-11712,35.1,-0.5,0
-11715,35.1,-0.6,0
-11720,35.1,-0.7,0
-11723,35.1,-0.8,0
-11728,35.1,-0.9,0
-11734,35.1,-1,0
-11759,35.1,-0.9,0
-11767,35.1,-0.8,0
-11777,35.1,-0.9,0
-11778,35.1,-1.2,0
-11779,0,-1.3,12.2
-11780,26.6,-1.3,0
-11781,26.6,-0.8,0
-11782,26.6,-0.7,0
-11783,26.6,-0.6,0
-11785,26.6,-0.5,0
-11788,26.6,-0.4,0
-11792,26.6,-0.3,0
-11797,26.6,-0.2,0
-11806,26.6,-0.1,0
-11817,26.6,0,0
-11827,22.2,0,0
-11830,22.2,0.1,0
-11836,66.5,0.1,0
-11837,66.5,0.2,0
-11842,66.5,0.3,0
-11848,66.5,0.4,0
-11850,66.5,0.5,0
-11855,66.5,0.6,0
-11858,66.5,0.7,0
-11864,66.5,0.8,0
-11867,66.5,0.9,0
-11873,66.5,1,0
-11880,66.5,1.1,0
-11904,66.5,1,0
-11912,66.5,0.9,0
-11919,66.5,0.8,0
-11925,66.5,0.7,0
-11933,66.5,0.6,0
-11944,66.5,0.5,0
-11967,66.5,0.6,0
-11976,66.5,0.7,0
-11982,66.5,0.8,0
-11988,66.5,0.9,0
-11994,66.5,1,0
-12001,66.5,1.1,0
-12007,66.5,1.2,0
-12014,66.5,1.3,0
-12021,66.5,1.4,0
-12055,66.5,1.3,0
-12065,66.5,1.2,0
-12072,66.5,1.1,0
-12083,66.5,1,0
-12094,66.5,0.9,0
-12104,66.5,0.8,0
-12119,66.5,0.7,0
-12130,66.5,0.6,0
-12141,66.5,0.5,0
-12152,66.5,0.4,0
-12159,66.5,0.3,0
-12170,66.5,0.2,0
-12181,66.5,0.1,0
-12217,66.5,0.2,0
-12224,66.5,0.3,0
-12231,66.5,0.4,0
-12235,66.5,0.5,0
-12241,66.5,0.6,0
-12245,66.5,0.7,0
-12251,66.5,0.8,0
-12258,66.5,0.9,0
-12273,66.5,1,0
-12284,66.5,0.9,0
-12305,66.5,0.8,0
-12321,33.8,0.8,0
-12347,33.8,0.9,0
-12362,33.8,1,0
-12375,33.8,1.1,0
-12409,33.8,1,0
-12414,50,1,0
-12416,50,0.9,0
-12419,50,0.8,0
-12423,50,0.7,0
-12427,50,0.6,0
-12430,50,0.5,0
-12434,50,0.4,0
-12436,50,0.3,0
-12440,50,0.2,0
-12442,50,0.1,0
-12446,50,0,0
-12448,50,-0.1,0
-12453,50,-0.2,0
-12455,50,-0.3,0
-12459,50,-0.4,0
-12464,50,-0.5,0
-12468,50,-0.6,0
-12492,50,-0.5,0
-12497,50,-0.4,0
-12502,50,-0.3,0
-12508,50,-0.2,0
-12513,50,-0.1,0
-12516,50,0,0
-12521,50,0.1,0
-12526,50,0.2,0
-12532,50,0.3,0
-12537,50,0.4,0
-12545,50,0.5,0
-12595,50,0.4,0
-12614,50,0.3,0
-12628,50,0.2,0
-12639,50,0.1,0
-12647,50,0,0
-12659,50,-0.1,0
-12700,56.6,0,0
-12709,56.6,0.1,0
-12724,56.6,0.2,0
-12739,56.6,0.1,0
-12757,56.6,0,0
-12794,56.6,0.1,0
-12815,56.6,0,0
-12833,56.6,-0.1,0
-12855,56.6,-0.2,0
-12858,56.6,-0.1,0
-12876,56.6,0,0
-12882,56.6,0.1,0
-12889,56.6,0.2,0
-12895,56.6,0.3,0
-12898,56.6,0.4,0
-12904,56.6,0.5,0
-12911,56.6,0.6,0
-12917,56.6,0.7,0
-12926,56.6,0.8,0
-12955,56.6,0.7,0
-12970,56.6,0.6,0
-13005,56.6,0.7,0
-13034,56.6,0.6,0
-13040,61.3,0.6,0
-13043,61.3,0.5,0
-13050,61.3,0.4,0
-13053,61.3,0.3,0
-13060,61.3,0.2,0
-13066,61.3,0.1,0
-13070,61.3,0,0
-13076,61.3,-0.1,0
-13083,61.3,-0.2,0
-13090,61.3,-0.3,0
-13124,61.3,-0.2,0
-13157,61.3,-0.3,0
-13167,61.3,-0.4,0
-13170,61.3,-0.5,0
-13176,61.3,-0.6,0
-13179,61.3,-0.7,0
-13185,61.3,-0.8,0
-13188,61.3,-0.9,0
-13193,61.3,-1,0
-13196,61.3,-1.1,0
-13201,61.3,-1.2,0
-13206,61.3,-1.3,0
-13213,61.3,-1.4,0
-13235,61.3,-1.3,0
-13240,61.3,-1.2,0
-13244,61.3,-1.1,0
-13250,61.3,-1,0
-13253,61.3,-1.1,0
-13254,61.3,-1.3,0
-13255,0,-1.8,13.6
-13256,57.5,-1.8,0
-13257,57.5,-0.9,0
-13258,57.5,-0.8,0
-13259,57.5,-0.7,0
-13260,57.5,-0.6,0
-13262,57.5,-0.5,0
-13264,57.5,-0.4,0
-13266,57.5,-0.3,0
-13269,57.5,-0.2,0
-13271,57.5,-0.1,0
-13275,57.5,0,0
-13278,57.5,0.1,0
-13281,57.5,0.2,0
-13284,57.5,0.3,0
-13289,57.5,0.4,0
-13292,57.5,0.5,0
-13296,57.5,0.6,0
-13302,57.5,0.7,0
-13308,57.5,0.8,0
-13312,57.5,0.9,0
-13316,57.5,1,0
-13323,57.5,1.1,0
-13328,57.5,1.2,0
-13335,57.5,1.3,0
-13361,57.5,1.2,0
-13366,57.5,1.1,0
-13369,57.5,1,0
-13374,57.5,0.9,0
-13377,57.5,0.8,0
-13380,57.5,0.7,0
-13383,57.5,0.6,0
-13386,57.5,0.5,0
-13389,57.5,0.4,0
-13395,57.5,0.3,0
-13398,57.5,0.2,0
-13401,57.5,0.1,0
-13407,57.5,0,0
-13413,57.5,-0.1,0
-13419,57.5,-0.2,0
-13432,57.5,-0.3,0
-13451,57.5,-0.4,0
-13464,57.5,-0.5,0
-13473,57.5,-0.6,0
-13489,57.5,-0.7,0
-13508,57.5,-0.8,0
-13529,57.5,-0.9,0
-13538,57.5,-1,0
-13544,57.5,-1.1,0
-13549,57.5,-1.2,0
-13555,57.5,-1.3,0
-13557,57.5,-1.4,0
-13560,57.5,-1.5,0
-13565,57.5,-1.6,0
-13567,57.5,-1.7,0
-13570,57.5,-1.8,0
-13572,57.5,-1.9,0
-13576,57.5,-2,0
-13578,57.5,-2.1,0
-13580,57.5,-2.2,0
-13584,57.5,-2.3,0
-13588,57.5,-2.4,0
-13591,57.5,-2.5,0
-13597,57.5,-2.6,0
-13608,57.5,-2.5,0
-13618,57.5,-2.7,0
-13619,0,-2.1,6
-13620,25,-2.1,0
-13621,25,-2.3,0
-13622,25,-2.2,0
-13623,25,-2.1,0
-13624,25,-2,0
-13626,25,-1.9,0
-13627,25,-1.8,0
-13629,25,-1.7,0
-13630,25,-1.6,0
-13632,25,-1.5,0
-13633,25,-1.4,0
-13634,25,-1.3,0
-13636,25,-1.2,0
-13637,25,-1.1,0
-13638,25,-1,0
-13639,25,-0.9,0
-13642,25,-0.8,0
-13643,25,-0.7,0
-13644,25,-0.6,0
-13645,25,-0.5,0
-13646,25,-0.4,0
-13648,25,-0.3,0
-13650,25,-0.2,0
-13651,25,-0.1,0
-13652,25,0,0
-13653,25,0.1,0
-13655,25,0.2,0
-13656,25,0.3,0
-13657,25,0.4,0
-13660,25,0.5,0
-13661,25,0.6,0
-13662,25,0.7,0
-13664,25,0.8,0
-13667,25,0.9,0
-13668,25,1,0
-13671,25,1.1,0
-13674,25,1.2,0
-13678,25,1.3,0
-13685,25,1.4,0
-13688,25,1.3,0
-13690,15.3,1.3,0
-13691,41.8,1.3,0
-13704,41.8,1.2,0
-13710,41.8,1.1,0
-13714,41.8,1,0
-13719,41.8,0.9,0
-13725,41.8,0.8,0
-13732,41.8,0.7,0
-13743,41.8,0.6,0
-13770,41.8,0.7,0
-13795,41.8,0.8,0
-13821,48,0.8,0
-13827,48,0.7,0
-13838,48,0.6,0
-13845,48,0.5,0
-13852,48,0.4,0
-13857,48,0.3,0
-13862,48,0.2,0
-13867,48,0.1,0
-13872,48,0,0
-13877,48,-0.1,0
-13885,48,-0.2,0
-13890,48,-0.3,0
-13898,48,-0.4,0
-13906,48,-0.5,0
-13914,48,-0.6,0
-13922,48,-0.7,0
-13930,48,-0.8,0
-13935,48,-0.9,0
-13940,48,-1,0
-13945,48,-1.1,0
-13949,48,-1.2,0
-13954,48,-1.3,0
-13956,48,-1.4,0
-13960,48,-1.5,0
-13964,48,-1.6,0
-13968,48,-1.7,0
-13972,48,-1.8,0
-13977,48,-1.9,0
-13981,48,-2,0
-13999,18.9,-2,0
-14000,30.4,-2,0
-14006,30.4,-1.9,0
-14011,30.4,-1.8,0
-14016,30.4,-1.7,0
-14020,30.4,-1.6,0
-14025,30.4,-1.5,0
-14032,30.4,-1.4,0
-14042,30.4,-1.3,0
-14050,30.4,-1.4,0
-14064,30.4,-1.5,0
-14069,30.4,-1.6,0
-14071,30.4,-1.7,0
-14072,30.4,-1.9,0
-14073,0,-2.5,12.4
-14074,42.7,-2.5,0
-14075,42.7,-1.7,0
-14076,42.7,-1.6,0
-14078,42.7,-1.5,0
-14083,42.7,-1.4,0
-14088,42.7,-1.3,0
-14094,42.7,-1.2,0
-14098,42.7,-1.1,0
-14102,42.7,-1,0
-14105,42.7,-0.9,0
-14109,42.7,-0.8,0
-14112,42.7,-0.7,0
-14118,42.7,-0.6,0
-14121,42.7,-0.5,0
-14127,42.7,-0.4,0
-14135,42.7,-0.3,0
-14151,42.7,-0.4,0
-14162,42.7,-0.5,0
-14171,42.7,-0.6,0
-14185,42.7,-0.7,0
-14197,42.7,-0.6,0
-14210,42.7,-0.5,0
-14220,42.7,-0.4,0
-14229,42.7,-0.3,0
-14231,30,-0.3,0
-14241,30,-0.2,0
-14246,33.1,-0.2,0
-14254,33.1,-0.3,0
-14263,33.1,-0.4,0
-14269,33.1,-0.5,0
-14274,33.1,-0.6,0
-14278,33.1,-0.7,0
-14281,33.1,-0.8,0
-14285,33.1,-0.9,0
-14290,33.1,-1,0
-14295,33.1,-1.1,0
-14303,33.1,-1.2,0
-14315,33.1,-1.1,0
-14323,33.1,-1.2,0
-14325,10,-1.3,0
-14326,41.1,-1.3,0
-14327,41.1,-1.2,0
-14328,41.1,-1.1,0
-14329,41.1,-1,0
-14330,41.1,-0.9,0
-14332,41.1,-0.8,0
-14334,41.1,-0.7,0
-14337,41.1,-0.6,0
-14341,41.1,-0.5,0
-14345,41.1,-0.4,0
-14349,41.1,-0.3,0
-14357,41.1,-0.2,0
-14379,41.1,-0.3,0
-14389,41.1,-0.4,0
-14402,41.1,-0.5,0
-14425,41.1,-0.6,0
-14470,41.1,-0.5,0
-14479,41.1,-0.4,0
-14484,32.8,-0.3,0
-14489,32.8,-0.2,0
-14493,32.8,-0.1,0
-14498,32.8,0,0
-14501,32.8,0.1,0
-14505,32.8,0.2,0
-14509,32.8,0.3,0
-14510,47,0.3,0
-14512,47,0.4,0
-14516,47,0.5,0
-14522,47,0.6,0
-14529,47,0.7,0
-14542,47,0.6,0
-14550,47,0.5,0
-14557,47,0.4,0
-14561,47,0.3,0
-14566,47,0.2,0
-14573,47,0.1,0
-14581,47,0,0
-14627,47,-0.1,0
-14637,47,-0.2,0
-14647,47,-0.3,0
-14655,47,-0.4,0
-14691,47,-0.3,0
-14704,47,-0.2,0
-14717,47,-0.1,0
-14729,47,0,0
-14739,47,0.1,0
-14745,10.9,0.1,0
-14746,19.2,0.1,0
-14748,19.2,0.2,0
-14752,19.2,0.3,0
-14755,19.2,0.4,0
-14760,19.2,0.5,0
-14770,35.2,0.6,0
-14784,35.2,0.5,0
-14792,35.2,0.4,0
-14797,35.2,0.3,0
-14800,35.2,0.2,0
-14804,35.2,0.1,0
-14808,35.2,0,0
-14811,35.2,-0.1,0
-14817,35.2,-0.2,0
-14823,35.2,-0.3,0
-14843,35.2,-0.2,0
-14849,35.2,-0.1,0
-14854,35.2,0,0
-14858,22.1,0,0
-14859,22.1,0.1,0
-14863,22.1,0.2,0
-14866,39.2,0.3,0
-14869,39.2,0.4,0
-14873,39.2,0.5,0
-14877,39.2,0.6,0
-14883,39.2,0.7,0
-14892,39.2,0.8,0
-14902,39.2,0.7,0
-14910,39.2,0.6,0
-14917,39.2,0.5,0
-14921,39.2,0.4,0
-14926,39.2,0.3,0
-14930,39.2,0.2,0
-14933,39.2,0.1,0
-14937,39.2,0,0
-14941,39.2,-0.1,0
-14944,39.2,-0.2,0
-14948,39.2,-0.3,0
-14952,39.2,-0.4,0
-14956,39.2,-0.5,0
-14958,39.2,-0.6,0
-14962,39.2,-0.7,0
-14966,39.2,-0.8,0
-14970,39.2,-0.9,0
-14975,39.2,-1,0
-14979,39.2,-1.1,0
-14984,39.2,-1.2,0
-14988,39.2,-1.3,0
-14992,39.2,-1.4,0
-14996,39.2,-1.5,0
-15003,39.2,-1.6,0
-15011,39.2,-1.7,0
-15027,26.5,-1.7,0
-15031,26.5,-1.6,0
-15038,26.5,-1.5,0
-15044,26.5,-1.4,0
-15048,32.6,-1.3,0
-15054,32.6,-1.2,0
-15058,32.6,-1.1,0
-15063,32.6,-1,0
-15066,32.6,-0.9,0
-15071,32.6,-0.8,0
-15078,32.6,-0.7,0
-15084,32.6,-0.6,0
-15091,32.6,-0.5,0
-15101,32.6,-0.4,0
-15114,32.6,-0.3,0
-15121,26.2,-0.3,0
-15129,32.9,-0.3,0
-15136,32.9,-0.4,0
-15150,32.9,-0.5,0
-15163,32.9,-0.6,0
-15196,32.9,-0.5,0
-15205,32.9,-0.4,0
-15209,32.9,-0.3,0
-15214,32.9,-0.2,0
-15219,32.9,-0.1,0
-15223,32.9,0,0
-15228,32.9,0.1,0
-15232,32.9,0.2,0
-15236,32.9,0.3,0
-15238,24.4,0.3,0
-15241,24.4,0.4,0
-15247,24.4,0.5,0
-15262,24.4,0.3,0
-15263,24.4,0,0
-15264,0,0.1,11
-15265,31.4,0.1,0
-15266,31.4,0.4,0
-15267,31.4,0.5,0
-15269,31.4,0.6,0
-15332,31.4,0.7,0
-15367,31.4,0.6,0
-15376,45.1,0.6,0
-15405,45.1,0.7,0
-15417,45.1,0.8,0
-15450,45.1,0.7,0
-15458,45.1,0.6,0
-15465,45.1,0.5,0
-15470,45.1,0.4,0
-15480,45.1,0.3,0
-15494,45.1,0.4,0
-15503,45.1,0.5,0
-15507,45.1,0.6,0
-15511,45.1,0.7,0
-15516,45.1,0.8,0
-15520,45.1,0.9,0
-15523,45.1,1,0
-15528,45.1,1.1,0
-15533,45.1,1.2,0
-15539,45.1,1.3,0
-15558,45.1,1.2,0
-15563,45.1,1.1,0
-15566,45.1,1,0
-15569,45.1,0.9,0
-15570,12.5,0.9,0
-15573,12.5,0.8,0
-15576,12.5,0.7,0
-15577,28.4,0.7,0
-15581,28.4,0.6,0
-15585,28.4,0.5,0
-15588,28.4,0.4,0
-15592,28.4,0.3,0
-15594,28.4,0.2,0
-15597,28.4,0.1,0
-15601,28.4,0,0
-15604,28.4,-0.1,0
-15607,28.4,-0.2,0
-15610,28.4,-0.3,0
-15613,28.4,-0.4,0
-15616,28.4,-0.5,0
-15619,28.4,-0.6,0
-15622,28.4,-0.7,0
-15626,28.4,-0.8,0
-15631,28.4,-0.9,0
-15635,28.4,-1,0
-15640,28.4,-1.1,0
-15645,28.4,-1.2,0
-15648,28.4,-1.3,0
-15649,28.4,-1.4,0
-15650,28.4,-1.6,0
-15651,0,-2.3,7.6
-15652,22.5,-2.3,0
-15653,22.5,-1.8,0
-15654,22.5,-1.5,0
-15655,22.5,-1.4,0
-15656,22.5,-1.3,0
-15659,22.5,-1.2,0
-15667,22.5,-1.1,0
-15676,22.5,-1,0
-15682,22.5,-0.9,0
-15688,22.5,-0.8,0
-15692,22.5,-0.7,0
-15696,22.5,-0.6,0
-15700,22.5,-0.5,0
-15704,22.5,-0.3,0
-15708,13.4,-0.3,0
-15709,45.5,-0.3,0
-15711,45.5,-0.2,0
-15713,45.5,-0.1,0
-15716,45.5,0,0
-15718,45.5,0.1,0
-15720,45.5,0.2,0
-15722,45.5,0.3,0
-15724,45.5,0.4,0
-15727,45.5,0.5,0
-15730,45.5,0.6,0
-15733,45.5,0.7,0
-15736,45.5,0.8,0
-15739,45.5,0.9,0
-15742,45.5,1,0
-15746,45.5,1.1,0
-15751,45.5,1.2,0
-15757,45.5,1.3,0
-15775,45.5,1.2,0
-15784,45.5,1.1,0
-15789,45.5,1,0
-15793,45.5,0.9,0
-15800,45.5,0.8,0
-15805,45.5,0.7,0
-15809,45.5,0.6,0
-15814,45.5,0.5,0
-15821,45.5,0.4,0
-15831,45.5,0.3,0
-15846,45.5,0.2,0
-15897,45.5,0.3,0
-15918,45.5,0.4,0
-15930,45.5,0.3,0
-15945,45.5,0.2,0
-15954,45.5,0.1,0
-15961,45.5,0,0
-15968,45.5,-0.1,0
-15975,45.5,-0.2,0
-15987,45.5,-0.3,0
-16009,45.5,-0.2,0
-16019,45.5,-0.1,0
-16027,45.5,0,0
-16032,45.5,0.1,0
-16037,45.5,0.2,0
-16042,45.5,0.3,0
-16049,45.5,0.4,0
-16077,45.5,0.3,0
-16084,45.5,0.2,0
-16089,45.5,0.1,0
-16094,45.5,0,0
-16099,45.5,-0.1,0
-16104,45.5,-0.2,0
-16112,45.5,-0.3,0
-16120,45.5,-0.4,0
-16143,45.5,-0.3,0
-16153,45.5,-0.2,0
-16163,45.5,-0.1,0
-16178,45.5,0,0
-16196,45.5,-0.1,0
-16213,45.5,-0.2,0
-16227,45.5,-0.3,0
-16249,45.5,-0.2,0
-16263,45.5,-0.1,0
-16270,45.5,0,0
-16276,45.5,0.1,0
-16283,45.5,0.2,0
-16289,45.5,0.3,0
-16296,45.5,0.4,0
-16304,45.5,0.5,0
-16311,45.5,0.6,0
-16319,45.5,0.7,0
-16322,25.2,0.7,0
-16327,25.2,0.8,0
-16338,25.2,0.9,0
-16359,21,0.9,0
-16371,21,0.8,0
-16376,14.6,0.8,0
-16380,14.6,0.7,0
-16389,27.9,0.7,0
-16395,27.9,0.6,0
-16408,27.9,0.5,0
-16419,27.9,0.4,0
-16434,27.9,0.3,0
-16447,27.9,0.2,0
-16449,10,0.2,0
-16452,26.1,0.2,0
-16453,26.1,0.3,0
-16456,26.1,0.4,0
-16460,26.1,0.5,0
-16464,26.1,0.6,0
-16468,26.1,0.7,0
-16473,26.1,0.8,0
-16480,26.1,0.9,0
-16491,26.1,1,0
-16493,26.1,0.9,0
-16502,26.1,0.8,0
-16503,26.1,0.7,0
-16504,0,-0.1,11.4
-16505,32.4,-0.1,0
-16506,32.4,0.5,0
-16507,32.4,0.6,0
-16508,32.4,0.7,0
-16509,32.4,0.8,0
-16510,32.4,0.9,0
-16563,32.4,0.8,0
-16571,32.4,0.7,0
-16576,32.4,0.6,0
-16582,32.4,0.5,0
-16585,32.4,0.4,0
-16589,32.4,0.3,0
-16594,32.4,0.2,0
-16597,32.4,0.1,0
-16602,32.4,0,0
-16608,28,-0.1,0
-16625,28,0,0
-16631,28,0.1,0
-16636,34.7,0.2,0
-16639,34.7,0.3,0
-16644,34.7,0.4,0
-16647,34.7,0.5,0
-16651,34.7,0.6,0
-16654,34.7,0.7,0
-16658,34.7,0.8,0
-16661,34.7,0.9,0
-16665,34.7,1,0
-16670,34.7,1.1,0
-16680,34.7,1.2,0
-16691,34.7,1.1,0
-16699,34.7,1,0
-16704,34.7,0.9,0
-16708,34.7,0.8,0
-16712,34.7,0.7,0
-16716,34.7,0.6,0
-16720,34.7,0.5,0
-16723,34.7,0.4,0
-16727,34.7,0.3,0
-16731,34.7,0.2,0
-16737,34.7,0.1,0
-16741,34.7,0,0
-16747,34.7,-0.1,0
-16776,34.7,0,0
-16784,34.7,0.1,0
-16791,34.7,0.2,0
-16798,34.7,0.3,0
-16804,34.7,0.4,0
-16812,34.7,0.5,0
-16823,34.7,0.4,0
-16825,34.7,0.2,0
-16826,0,-0.3,6
-16827,35.6,-0.3,0
-16828,35.6,0.4,0
-16829,35.6,0.5,0
-16832,35.6,0.6,0
-16849,35.6,0.5,0
-16856,35.6,0.4,0
-16861,35.6,0.3,0
-16867,35.6,0.2,0
-16872,35.6,0.1,0
-16878,35.6,0,0
-16882,35.6,-0.1,0
-16888,35.6,-0.2,0
-16896,35.6,-0.3,0
-16904,35.6,-0.4,0
-16912,35.6,-0.5,0
-16917,35.6,-0.6,0
-16925,35.6,-0.7,0
-16930,35.6,-0.8,0
-16936,35.6,-0.9,0
-16941,35.6,-1,0
-16946,35.6,-1.1,0
-16952,35.6,-1.2,0
-16957,35.6,-1.3,0
-16967,35.6,-1.4,0
-16980,35.6,-1.3,0
-16987,35.6,-1.2,0
-16991,35.6,-1.1,0
-16994,35.6,-1,0
-16998,35.6,-0.9,0
-17002,35.6,-0.8,0
-17003,35.6,-0.7,0
-17007,35.6,-0.6,0
-17009,35.6,-0.5,0
-17012,35.6,-0.4,0
-17013,35.6,-0.3,0
-17016,35.6,-0.2,0
-17019,35.6,-0.1,0
-17024,35.6,0,0
-17027,35.6,0.1,0
-17039,13.9,0.1,0
-17040,22.9,0.1,0
-17054,22.9,0,0
-17058,22.9,-0.1,0
-17064,22.9,-0.2,0
-17069,22.9,-0.3,0
-17078,22.9,-0.4,0
-17083,22.9,-0.3,0
-17092,22.9,-0.2,0
-17096,22.9,-0.1,0
-17101,22.9,-0.2,0
-17102,22.9,-0.5,0
-17103,0,0,11
-17104,21.8,0,0
-17105,21.8,0.1,0
-17106,21.8,0.2,0
-17107,21.8,0.3,0
-17109,21.8,0.4,0
-17110,21.8,0.5,0
-17111,21.8,0.6,0
-17113,21.8,0.7,0
-17115,21.8,0.8,0
-17116,21.8,0.9,0
-17118,21.8,1,0
-17119,21.8,1.1,0
-17122,21.8,1.2,0
-17124,21.8,1.3,0
-17125,21.8,1.4,0
-17127,21.8,1.5,0
-17128,21.8,1.6,0
-17131,21.8,1.7,0
-17132,21.8,1.8,0
-17134,21.8,1.9,0
-17137,21.8,2,0
-17139,21.8,2.1,0
-17142,21.8,2.2,0
-17144,21.8,2.3,0
-17148,21.8,2.4,0
-17152,50.8,2.5,0
-17158,50.8,2.6,0
-17170,50.8,2.5,0
-17176,50.8,2.4,0
-17182,50.8,2.3,0
-17187,50.8,2.2,0
-17189,50.8,2.1,0
-17193,50.8,2,0
-17197,50.8,1.9,0
-17201,50.8,1.8,0
-17203,50.8,1.7,0
-17208,50.8,1.6,0
-17212,50.8,1.5,0
-17214,50.8,1.4,0
-17219,50.8,1.3,0
-17221,50.8,1.2,0
-17226,50.8,1.1,0
-17231,50.8,1,0
-17233,50.8,0.9,0
-17238,50.8,0.8,0
-17243,50.8,0.7,0
-17246,50.8,0.6,0
-17251,50.8,0.5,0
-17257,50.8,0.4,0
-17262,50.8,0.3,0
-17270,50.8,0.2,0
-17279,50.8,0.1,0
-17296,50.8,0,0
-17348,50.8,-0.1,0
-17361,50.8,-0.2,0
-17368,50.8,-0.3,0
-17376,50.8,-0.4,0
-17381,50.8,-0.5,0
-17389,50.8,-0.6,0
-17397,50.8,-0.7,0
-17427,50.8,-0.6,0
-17438,50.8,-0.5,0
-17446,50.8,-0.4,0
-17454,50.8,-0.3,0
-17466,50.8,-0.2,0
-17480,50.8,-0.1,0
-17519,50.8,-0.2,0
-17527,50.8,-0.3,0
-17532,50.8,-0.4,0
-17538,50.8,-0.5,0
-17540,50.8,-0.6,0
-17546,50.8,-0.7,0
-17551,50.8,-0.8,0
-17553,50.8,-0.9,0
-17558,50.8,-1,0
-17565,50.8,-1.1,0
-17576,50.8,-1.2,0
-17590,50.8,-1.1,0
-17605,50.8,-1,0
-17613,14.2,-1,0
-17618,32.8,-1,0
-17621,32.8,-0.9,0
-17666,32.8,-0.8,0
-17676,32.8,-0.7,0
-17684,32.8,-0.6,0
-17691,32.8,-0.5,0
-17697,32.8,-0.4,0
-17704,32.8,-0.3,0
-17709,32.8,-0.2,0
-17715,32.8,-0.1,0
-17721,32.8,0,0
-17728,32.8,0.1,0
-17734,32.8,0,0
-17735,32.8,-0.3,0
-17736,0,-0.8,13.6
-17737,30.9,-0.8,0
-17738,30.9,0.1,0
-17739,30.9,0.2,0
-17741,30.9,0.3,0
-17744,30.9,0.4,0
-17747,30.9,0.5,0
-17753,30.9,0.6,0
-17782,30.9,0.5,0
-17789,30.9,0.4,0
-17795,30.9,0.3,0
-17800,30.9,0.2,0
-17806,30.9,0.1,0
-17810,30.9,0,0
-17814,30.9,-0.1,0
-17818,30.9,-0.2,0
-17821,30.9,-0.3,0
-17824,30.9,-0.4,0
-17827,10,-0.5,0
-17832,10,-0.6,0
-17837,10,-0.7,0
-17839,10,-0.8,0
-17840,10,-1.1,0
-17841,0,-0.4,19
-17842,33.5,-0.4,0
-17843,33.5,-0.9,0
-17844,33.5,-0.8,0
-17846,33.5,-0.7,0
-17854,33.5,-0.8,0
-17863,33.5,-0.9,0
-17872,33.5,-1,0
-17891,33.5,-0.9,0
-17898,33.5,-0.8,0
-17904,33.5,-0.7,0
-17907,33.5,-0.6,0
-17911,33.5,-0.5,0
-17913,33.5,-0.4,0
-17916,33.5,-0.3,0
-17920,33.5,-0.2,0
-17923,33.5,-0.1,0
-17926,33.5,0,0
-17929,33.5,0.1,0
-17932,33.5,0.2,0
-17936,33.5,0.3,0
-17938,23.6,0.3,0
-17939,39.8,0.3,0
-17940,39.8,0.4,0
-17946,39.8,0.5,0
-17960,39.8,0.4,0
-17967,39.8,0.3,0
-17970,39.8,0.2,0
-17974,39.8,0.1,0
-17976,39.8,0,0
-17978,39.8,-0.1,0
-17983,39.8,-0.2,0
-17985,39.8,-0.3,0
-17987,39.8,-0.4,0
-17989,39.8,-0.5,0
-17991,39.8,-0.6,0
-17993,39.8,-0.7,0
-17998,39.8,-0.8,0
-18000,39.8,-0.9,0
-18002,39.8,-1,0
-18004,39.8,-1.1,0
-18007,39.8,-1.2,0
-18011,39.8,-1.3,0
-18013,39.8,-1.4,0
-18017,39.8,-1.5,0
-18024,39.8,-1.6,0
-18031,39.8,-1.7,0
-18044,25.4,-1.6,0
-18053,35.1,-1.5,0
-18058,35.1,-1.4,0
-18063,35.1,-1.3,0
-18067,35.1,-1.2,0
-18072,35.1,-1.1,0
-18077,35.1,-1,0
-18082,35.1,-0.9,0
-18094,35.1,-0.8,0
-18105,35.1,-0.9,0
-18117,35.1,-1,0
-18122,43.8,-1,0
-18124,43.8,-1.1,0
-18132,43.8,-1.2,0
-18146,43.8,-1.3,0
-18150,43.8,-1.2,0
-18161,43.8,-1.1,0
-18166,43.8,-1,0
-18171,43.8,-0.9,0
-18173,43.8,-0.8,0
-18176,43.8,-0.7,0
-18178,43.8,-0.6,0
-18181,43.8,-0.5,0
-18183,43.8,-0.4,0
-18185,43.8,-0.3,0
-18188,43.8,-0.2,0
-18190,43.8,-0.1,0
-18193,43.8,0,0
-18195,43.8,0.1,0
-18197,43.8,0.2,0
-18200,43.8,0.3,0
-18202,43.8,0.4,0
-18204,43.8,0.5,0
-18207,43.8,0.6,0
-18209,43.8,0.7,0
-18213,43.8,0.8,0
-18215,43.8,0.9,0
-18219,43.8,1,0
-18227,43.8,1.1,0
-18237,29.3,1.1,0
-18241,29.3,1,0
-18248,29.3,0.9,0
-18251,40.1,0.9,0
-18253,40.1,0.8,0
-18258,40.1,0.7,0
-18261,40.1,0.6,0
-18265,40.1,0.5,0
-18267,40.1,0.4,0
-18270,40.1,0.3,0
-18274,40.1,0.2,0
-18278,40.1,0.1,0
-18282,40.1,0,0
-18289,40.1,-0.1,0
-18304,40.1,0,0
-18311,40.1,0.1,0
-18315,40.1,0.2,0
-18317,40.1,0.3,0
-18321,40.1,0.4,0
-18324,40.1,0.5,0
-18328,40.1,0.6,0
-18332,40.1,0.7,0
-18335,40.1,0.8,0
-18339,40.1,0.9,0
-18354,40.1,0.8,0
-18355,40.1,0.6,0
-18356,0,0.2,12.8
-18357,45.7,0.2,0
-18358,45.7,0.6,0
-18359,45.7,0.7,0
-18360,45.7,0.8,0
-18366,45.7,0.7,0
-18371,45.7,0.6,0
-18375,45.7,0.5,0
-18379,45.7,0.4,0
-18382,45.7,0.3,0
-18387,45.7,0.2,0
-18390,45.7,0.1,0
-18395,45.7,0,0
-18420,45.7,0.1,0
-18427,45.7,0.2,0
-18431,45.7,0.3,0
-18439,45.7,0.4,0
-18446,45.7,0.5,0
-18466,45.7,0.4,0
-18474,45.7,0.3,0
-18479,45.7,0.2,0
-18484,45.7,0.1,0
-18491,45.7,0,0
-18496,45.7,-0.1,0
-18505,45.7,-0.2,0
-18522,30.7,-0.2,0
-18524,49,-0.2,0
-18527,49,-0.1,0
-18536,49,0,0
-18548,49,0.1,0
-18582,49,0,0
-18598,49,-0.1,0
-18603,57.3,-0.1,0
-18628,57.4,-0.1,0
-18662,57.4,-0.2,0
-18681,57.4,-0.3,0
-18721,57.4,-0.2,0
-18736,57.4,-0.1,0
-18746,57.4,0,0
-18751,46.8,0,0
-18757,46.8,0.1,0
-18770,46.8,0.2,0
-18793,46.8,0.3,0
-18817,46.8,0.4,0
-18826,46.8,0.5,0
-18832,46.8,0.6,0
-18837,46.8,0.7,0
-18842,46.8,0.8,0
-18846,28.7,0.8,0
-18847,28.7,0.9,0
-18852,28.7,1,0
-18860,28.7,1.1,0
-18879,35.2,1,0
-18885,35.2,0.9,0
-18892,35.2,0.8,0
-18897,35.2,0.7,0
-18900,35.2,0.6,0
-18906,35.2,0.5,0
-18909,35.2,0.4,0
-18915,35.2,0.3,0
-18921,35.2,0.2,0
-18931,35.2,0.1,0
-18956,35.2,0.2,0
-18964,35.2,0.3,0
-18971,35.2,0.4,0
-18977,35.2,0.5,0
-18985,35.2,0.4,0
-18986,35.2,0.1,0
-18987,0,0.9,13
-18988,63.5,0.9,0
-18989,63.5,0.5,0
-18990,63.5,0.6,0
-18991,63.5,0.7,0
-18993,63.5,0.8,0
-18995,63.5,0.9,0
-19001,63.5,1,0
-19010,63.5,1.1,0
-19023,63.5,1,0
-19034,63.5,0.9,0
-19043,63.5,0.8,0
-19052,63.5,0.7,0
-19085,63.5,0.8,0
-19102,63.5,0.9,0
-19149,63.5,0.8,0
-19158,63.5,0.7,0
-19165,63.5,0.6,0
-19172,63.5,0.5,0
-19175,63.5,0.4,0
-19179,63.5,0.3,0
-19186,63.5,0.2,0
-19189,63.5,0.1,0
-19193,63.5,0,0
-19200,63.5,-0.1,0
-19203,63.5,-0.2,0
-19207,63.5,-0.3,0
-19214,63.5,-0.4,0
-19218,63.5,-0.5,0
-19224,63.5,-0.6,0
-19228,63.5,-0.7,0
-19235,63.5,-0.8,0
-19245,63.5,-0.9,0
-19255,63.5,-1,0
-19297,63.5,-0.9,0
-19309,63.5,-1,0
-19347,63.5,-0.9,0
-19359,63.5,-0.8,0
-19366,63.5,-1,0
-19369,63.5,-1.1,0
-19370,63.5,-1.7,0
-19371,0,-1.1,27
-19372,27.8,-1.1,0
-19373,27.8,-0.8,0
-19374,27.8,-0.7,0
-19376,27.8,-0.6,0
-19379,27.8,-0.5,0
-19382,27.8,-0.4,0
-19388,27.8,-0.3,0
-19400,27.8,-0.2,0
-19427,27.8,-0.1,0
-19437,27.8,0,0
-19447,27.8,0.1,0
-19455,27.8,0,0
-19456,27.8,-0.4,0
-19457,0,-0.5,9.4
-19458,49.8,-0.5,0
-19459,49.8,0.1,0
-19460,49.8,0.2,0
-19461,49.8,0.3,0
-19464,49.8,0.4,0
-19469,49.8,0.5,0
-19474,49.8,0.6,0
-19483,49.8,0.7,0
-19509,49.8,0.6,0
-19550,49.8,0.7,0
-19557,49.8,0.8,0
-19565,49.8,0.9,0
-19572,49.8,1,0
-19577,49.8,1.1,0
-19585,49.8,1.2,0
-19598,49.8,1.3,0
-19607,49.8,1.2,0
-19620,49.8,1.1,0
-19628,49.8,1,0
-19636,49.8,0.9,0
-19642,49.8,0.8,0
-19650,49.8,0.7,0
-19658,49.8,0.6,0
-19664,54.4,0.6,0
-19670,54.4,0.5,0
-19678,54.4,0.4,0
-19690,54.4,0.3,0
-19699,54.4,0.2,0
-19711,54.4,0.1,0
-19717,54.4,0,0
-19726,54.4,-0.1,0
-19732,54.4,-0.2,0
-19741,54.4,-0.3,0
-19750,54.4,-0.4,0
-19759,54.4,-0.5,0
-19770,54.4,-0.6,0
-19779,54.4,-0.7,0
-19787,54.4,-0.8,0
-19792,54.4,-0.9,0
-19798,54.4,-1,0
-19805,54.4,-1.1,0
-19810,54.4,-1.2,0
-19815,54.4,-1.3,0
-19821,54.4,-1.4,0
-19832,54.4,-1.5,0
-19840,54.4,-1.4,0
-19856,54.4,-1.5,0
-19857,54.4,-1.7,0
-19858,54.4,-2.3,0
-19859,0,-2,22.2
-19860,20.4,-2,0
-19861,20.4,-1.2,0
-19862,20.4,-1.1,0
-19863,20.4,-1,0
-19865,20.4,-0.9,0
-19866,20.4,-0.8,0
-19869,20.4,-0.7,0
-19872,20.4,-0.6,0
-19874,20.4,-0.5,0
-19878,20.4,-0.4,0
-19881,20.4,-0.3,0
-19884,20.4,-0.2,0
-19888,20.4,-0.1,0
-19892,44.7,0,0
-19897,44.7,0.1,0
-19904,44.7,0.2,0
-19953,44.7,0.3,0
-19963,44.7,0.4,0
-19970,44.7,0.5,0
-19978,44.7,0.6,0
-20002,44.7,0.5,0
-20010,44.7,0.4,0
-20017,44.7,0.3,0
-20021,44.7,0.2,0
-20026,44.7,0.1,0
-20030,44.7,0,0
-20035,44.7,-0.1,0
-20039,44.7,-0.2,0
-20046,44.7,-0.3,0
-20054,44.7,-0.4,0
-20073,44.7,-0.3,0
-20083,44.7,-0.2,0
-20088,22.6,-0.1,0
-20089,44.1,-0.1,0
-20093,44.1,0,0
-20098,44.1,0.1,0
-20102,44.1,0.2,0
-20107,44.1,0.3,0
-20112,44.1,0.4,0
-20120,44.1,0.5,0
-20128,44.1,0.6,0
-20152,44.1,0.5,0
-20159,44.1,0.4,0
-20164,44.1,0.3,0
-20169,44.1,0.2,0
-20174,44.1,0.1,0
-20179,44.1,0,0
-20181,44.1,-0.1,0
-20186,44.1,-0.2,0
-20191,44.1,-0.3,0
-20195,44.1,-0.4,0
-20206,44.1,-0.5,0
-20210,44.1,-0.4,0
-20219,44.1,-0.3,0
-20225,44.1,-0.2,0
-20229,32.2,-0.1,0
-20232,32.2,0,0
-20236,32.2,0.1,0
-20239,32.2,0.2,0
-20243,32.2,0.3,0
-20246,32.2,0.4,0
-20251,32.2,0.5,0
-20255,36.2,0.5,0
-20258,36.2,0.6,0
-20269,36.2,0.5,0
-20276,36.2,0.4,0
-20280,36.2,0.3,0
-20284,36.2,0.2,0
-20288,36.2,0.1,0
-20290,36.2,0,0
-20294,36.2,-0.1,0
-20298,36.2,-0.2,0
-20300,36.2,-0.3,0
-20304,36.2,-0.4,0
-20308,36.2,-0.5,0
-20312,36.2,-0.6,0
-20322,36.2,-0.7,0
-20329,36.5,-0.6,0
-20335,48.5,-0.6,0
-20339,48.5,-0.5,0
-20342,48.5,-0.4,0
-20346,48.5,-0.3,0
-20350,48.5,-0.2,0
-20354,48.5,-0.1,0
-20356,48.5,0,0
-20360,48.5,0.1,0
-20362,48.5,0.2,0
-20366,48.5,0.3,0
-20368,48.5,0.4,0
-20372,48.5,0.5,0
-20376,48.5,0.6,0
-20378,48.5,0.7,0
-20385,48.5,0.8,0
-20392,48.5,0.9,0
-20406,48.5,0.8,0
-20414,48.5,0.7,0
-20419,48.5,0.6,0
-20422,48.5,0.5,0
-20427,48.5,0.4,0
-20429,48.5,0.3,0
-20435,48.5,0.2,0
-20437,48.5,0.1,0
-20440,48.5,0,0
-20446,48.5,-0.1,0
-20451,48.5,-0.2,0
-20456,48.5,-0.3,0
-20462,48.5,-0.4,0
-20486,48.5,-0.3,0
-20494,48.5,-0.2,0
-20502,48.5,-0.1,0
-20507,48.5,0,0
-20515,48.5,0.1,0
-20529,48.5,0.2,0
-20539,48.5,0.1,0
-20550,48.5,0,0
-20555,48.5,-0.1,0
-20560,48.5,-0.2,0
-20565,48.5,-0.3,0
-20568,48.5,-0.4,0
-20573,48.5,-0.5,0
-20575,48.5,-0.6,0
-20577,48.5,-0.7,0
-20580,48.5,-0.8,0
-20582,48.5,-0.9,0
-20587,48.5,-1,0
-20589,48.5,-1.1,0
-20591,48.5,-1.2,0
-20593,48.5,-1.3,0
-20597,48.5,-1.4,0
-20599,48.5,-1.5,0
-20603,48.5,-1.6,0
-20607,48.5,-1.7,0
-20610,48.5,-1.8,0
-20619,48.5,-1.9,0
-20624,48.5,-1.8,0
-20631,16.5,-1.8,0
-20632,16.5,-1.7,0
-20636,16.5,-1.6,0
-20638,50.6,-1.6,0
-20640,50.6,-1.5,0
-20641,50.6,-1.4,0
-20644,50.6,-1.3,0
-20646,50.6,-1.2,0
-20649,50.6,-1.1,0
-20650,50.6,-1,0
-20652,50.6,-0.9,0
-20655,50.6,-0.8,0
-20656,50.6,-0.7,0
-20659,50.6,-0.6,0
-20661,50.6,-0.5,0
-20662,50.6,-0.4,0
-20665,50.6,-0.3,0
-20667,50.6,-0.2,0
-20670,50.6,-0.1,0
-20672,50.6,0,0
-20676,50.6,0.1,0
-20679,50.6,0.2,0
-20681,50.6,0.3,0
-20687,50.6,0.4,0
-20694,50.6,0.5,0
-20721,50.6,0.4,0
-20745,50.6,0.5,0
-20756,50.6,0.6,0
-20761,50.6,0.7,0
-20770,50.6,0.8,0
-20775,50.6,0.9,0
-20781,50.6,1,0
-20786,50.6,1.1,0
-20795,54.8,1.1,0
-20797,54.8,1.2,0
-20817,54.8,1.1,0
-20832,54.8,1,0
-20846,54.8,0.9,0
-20867,54.8,1,0
-20885,54.8,1.1,0
-20909,54.8,1,0
-20922,54.8,0.9,0
-20928,54.8,0.8,0
-20934,54.8,0.7,0
-20939,54.8,0.6,0
-20948,54.8,0.5,0
-20954,54.8,0.4,0
-20964,54.8,0.3,0
-20967,48.2,0.3,0
-20978,48.2,0.2,0
-20999,48.2,0.1,0
-21015,48.2,0,0
-21028,48.2,-0.1,0
-21036,48.2,-0.2,0
-21042,48.2,-0.3,0
-21050,48.2,-0.4,0
-21055,48.2,-0.5,0
-21060,48.2,-0.6,0
-21066,48.2,-0.7,0
-21071,48.2,-0.8,0
-21076,48.2,-0.9,0
-21082,48.2,-1,0
-21089,48.2,-1.1,0
-21111,48.2,-1,0
-21119,48.2,-0.9,0
-21124,48.2,-0.8,0
-21127,23.7,-0.8,0
-21128,23.7,-0.7,0
-21131,23.7,-0.6,0
-21134,23.7,-0.5,0
-21136,23.7,-0.4,0
-21140,54.6,-0.3,0
-21143,54.6,-0.2,0
-21146,54.6,-0.1,0
-21149,54.6,0,0
-21152,54.6,0.1,0
-21155,54.6,0.2,0
-21156,54.6,0.3,0
-21160,54.6,0.4,0
-21163,54.6,0.5,0
-21167,54.6,0.6,0
-21171,54.6,0.7,0
-21175,54.6,0.8,0
-21181,54.6,0.9,0
-21209,54.6,0.8,0
-21215,54.6,0.7,0
-21220,54.6,0.6,0
-21226,54.6,0.5,0
-21228,54.6,0.4,0
-21234,54.6,0.3,0
-21237,54.6,0.2,0
-21240,54.6,0.1,0
-21245,54.6,0,0
-21251,54.6,-0.1,0
-21254,54.6,-0.2,0
-21263,54.6,-0.3,0
-21269,60.3,-0.3,0
-21279,60.3,-0.2,0
-21288,60.3,-0.1,0
-21298,60.3,0,0
-21301,60.3,0.1,0
-21308,60.3,0.2,0
-21315,60.3,0.3,0
-21325,60.3,0.4,0
-21331,60.3,0.5,0
-21341,60.3,0.6,0
-21374,60.3,0.5,0
-21380,60.3,0.4,0
-21383,56.4,0.3,0
-21390,56.4,0.2,0
-21393,56.4,0.1,0
-21396,56.4,0,0
-21399,56.4,-0.1,0
-21402,56.4,-0.2,0
-21405,56.4,-0.3,0
-21408,56.4,-0.4,0
-21412,56.4,-0.6,0
-21415,56.4,-0.7,0
-21418,56.4,-0.8,0
-21424,56.4,-0.9,0
-21427,56.4,-1,0
-21430,56.4,-1.1,0
-21436,56.4,-1.2,0
-21442,56.4,-1.3,0
-21463,56.4,-1.2,0
-21468,56.4,-1.1,0
-21474,56.4,-1,0
-21479,56.4,-0.9,0
-21484,56.4,-0.8,0
-21489,56.4,-0.7,0
-21493,56.4,-0.6,0
-21498,56.4,-0.5,0
-21503,56.4,-0.4,0
-21508,56.4,-0.3,0
-21521,56.4,-0.5,0
-21522,0,-1.2,8
-21523,49.3,-1.2,0
-21524,49.3,-0.3,0
-21526,49.3,-0.2,0
-21527,49.3,-0.1,0
-21533,49.3,0,0
-21541,49.3,0.1,0
-21554,49.3,0.2,0
-21563,49.3,0.3,0
-21571,49.3,0.4,0
-21575,49.3,0.5,0
-21581,49.3,0.6,0
-21586,49.3,0.7,0
-21588,49.3,0.8,0
-21593,49.3,0.9,0
-21597,49.3,1,0
-21600,49.3,1.1,0
-21605,49.3,1.2,0
-21609,49.3,1.3,0
-21614,49.3,1.4,0
-21644,49.3,1.3,0
-21652,49.3,1.2,0
-21657,49.3,1.1,0
-21668,49.3,1,0
-21687,49.3,1.1,0
-21700,49.3,1.2,0
-21705,51.6,1.2,0
-21733,51.6,1.1,0
-21738,51.6,1,0
-21744,51.6,0.9,0
-21747,51.6,0.8,0
-21753,51.6,0.7,0
-21755,51.6,0.6,0
-21761,51.6,0.5,0
-21764,51.6,0.4,0
-21770,51.6,0.3,0
-21775,51.5,0.2,0
-21784,48.3,0.1,0
-21807,48.3,0.2,0
-21815,48.3,0.3,0
-21822,48.3,0.4,0
-21829,48.3,0.5,0
-21836,48.3,0.6,0
-21843,48.3,0.7,0
-21856,48.3,0.8,0
-21873,27,0.8,0
-21874,30.8,0.8,0
-21883,30.8,0.7,0
-21896,30.8,0.6,0
-21903,30.8,0.5,0
-21908,30.8,0.4,0
-21913,30.8,0.3,0
-21916,30.8,0.2,0
-21919,30.8,0.1,0
-21922,30.8,0,0
-21924,30.8,-0.1,0
-21926,30.8,-0.2,0
-21928,30.8,-0.3,0
-21930,30.8,-0.4,0
-21931,30.8,-0.5,0
-21932,30.8,-0.7,0
-21933,0,-1.6,10.8
-21934,28.1,-1.6,0
-21935,28.1,-0.8,0
-21936,28.1,-0.7,0
-21939,28.1,-0.8,0
-21941,28.1,-0.9,0
-21944,28.1,-1,0
-21946,28.1,-1.1,0
-21948,28.1,-1.2,0
-21950,28.1,-1.3,0
-21952,28.1,-1.4,0
-21954,28.1,-1.5,0
-21955,28.1,-1.6,0
-21958,28.1,-1.7,0
-21960,28.1,-1.8,0
-21962,28.1,-1.9,0
-21964,28.1,-2,0
-21968,28.1,-2.1,0
-21971,28.1,-2.2,0
-21974,28.1,-2.3,0
-21978,28.1,-2.4,0
-21998,28.1,-2.3,0
-22002,28.1,-2.2,0
-22006,28.1,-2.1,0
-22009,28.1,-2,0
-22013,28.1,-1.9,0
-22014,18.9,-1.9,0
-22015,46.7,-1.9,0
-22016,46.7,-1.8,0
-22018,46.7,-1.7,0
-22020,46.7,-1.6,0
-22023,46.7,-1.5,0
-22024,46.7,-1.4,0
-22027,46.7,-1.3,0
-22030,46.7,-1.2,0
-22031,46.7,-1.1,0
-22034,46.7,-1,0
-22038,46.7,-0.9,0
-22039,46.7,-0.8,0
-22043,46.7,-0.7,0
-22046,46.7,-0.6,0
-22050,46.7,-0.5,0
-22054,46.7,-0.4,0
-22058,46.7,-0.3,0
-22062,46.7,-0.2,0
-22067,46.7,-0.1,0
-22074,46.7,0,0
-22079,46.7,0.1,0
-22084,46.7,0.2,0
-22089,46.7,0.3,0
-22094,46.7,0.4,0
-22102,46.7,0.5,0
-22107,46.7,0.6,0
-22112,46.7,0.7,0
-22119,46.7,0.8,0
-22130,46.7,0.9,0
-22138,46.7,0.8,0
-22148,46.7,0.7,0
-22154,33.7,0.6,0
-22156,50.6,0.6,0
-22159,50.6,0.5,0
-22163,50.6,0.4,0
-22165,50.6,0.3,0
-22169,50.6,0.2,0
-22171,50.6,0.1,0
-22175,50.6,0,0
-22177,50.6,-0.1,0
-22181,50.6,-0.2,0
-22183,50.6,-0.3,0
-22187,50.6,-0.4,0
-22191,50.6,-0.5,0
-22194,50.6,-0.6,0
-22198,50.6,-0.7,0
-22207,50.6,-0.8,0
-22219,50.6,-0.7,0
-22227,50.6,-0.6,0
-22233,50.6,-0.5,0
-22238,50.6,-0.4,0
-22241,50.6,-0.3,0
-22246,50.6,-0.2,0
-22249,50.6,-0.1,0
-22252,50.6,0,0
-22257,50.6,0.1,0
-22260,50.6,0.2,0
-22266,50.6,0.3,0
-22271,50.6,0.4,0
-22274,50.6,0.5,0
-22279,50.6,0.6,0
-22285,50.6,0.7,0
-22287,50.6,0.8,0
-22293,50.6,0.9,0
-22298,50.6,1,0
-22300,50.6,1.1,0
-22305,44,1.2,0
-22308,44,1.3,0
-22313,44,1.4,0
-22318,44,1.5,0
-22320,44,1.6,0
-22322,55.7,1.6,0
-22325,55.7,1.7,0
-22330,55.7,1.8,0
-22335,55.7,1.9,0
-22342,55.7,2,0
-22354,55.7,1.9,0
-22362,55.7,1.8,0
-22367,55.7,1.7,0
-22370,55.7,1.6,0
-22373,55.7,1.5,0
-22375,55.7,1.4,0
-22378,55.7,1.3,0
-22381,55.7,1.2,0
-22384,55.7,1.1,0
-22386,55.7,1,0
-22389,55.7,0.9,0
-22392,55.7,0.8,0
-22395,55.7,0.6,0
-22398,55.7,0.5,0
-22401,55.7,0.4,0
-22403,55.7,0.3,0
-22406,55.7,0.2,0
-22409,55.7,0.1,0
-22412,55.7,0,0
-22418,55.7,-0.1,0
-22421,55.7,-0.2,0
-22427,55.7,-0.3,0
-22434,55.7,-0.4,0
-22443,55.7,-0.5,0
-22452,55.7,-0.6,0
-22458,55.7,-0.7,0
-22467,55.7,-0.8,0
-22473,55.7,-0.9,0
-22479,55.7,-1,0
-22482,55.7,-1.1,0
-22488,55.7,-1.2,0
-22496,55.7,-1.3,0
-22517,55.7,-1.2,0
-22523,55.7,-1.1,0
-22528,55.7,-1,0
-22532,55.7,-1.1,0
-22533,0,-1.7,21.6
-22534,26.6,-1.7,0
-22535,26.6,-0.8,0
-22536,26.6,-0.7,0
-22537,26.6,-0.6,0
-22538,26.6,-0.5,0
-22539,26.6,-0.4,0
-22541,26.6,-0.3,0
-22542,26.6,-0.2,0
-22543,26.6,-0.1,0
-22545,26.6,0,0
-22547,26.6,0.1,0
-22548,26.6,0.2,0
-22550,26.6,0.3,0
-22551,26.6,0.4,0
-22553,26.6,0.5,0
-22555,26.6,0.6,0
-22557,26.6,0.7,0
-22558,26.6,0.8,0
-22560,26.6,0.9,0
-22563,26.6,1,0
-22564,26.6,1.1,0
-22567,26.6,1.2,0
-22568,26.6,1.3,0
-22571,26.6,1.4,0
-22574,26.6,1.5,0
-22577,26.6,1.6,0
-22580,26.6,1.7,0
-22587,26.6,1.8,0
-22591,18.5,1.8,0
-22594,39.3,1.8,0
-22610,39.3,1.7,0
-22618,39.3,1.6,0
-22625,39.3,1.5,0
-22632,39.3,1.4,0
-22641,39.3,1.3,0
-22649,50.6,1.3,0
-22654,50.6,1.2,0
-22668,50.6,1.1,0
-22678,50.6,1,0
-22686,50.6,0.9,0
-22691,50.6,0.8,0
-22696,50.6,0.7,0
-22702,50.6,0.6,0
-22705,50.6,0.5,0
-22710,50.6,0.4,0
-22713,50.6,0.3,0
-22719,50.6,0.2,0
-22722,50.6,0.1,0
-22727,50.6,0,0
-22730,50.6,-0.1,0
-22736,50.6,-0.2,0
-22741,50.6,-0.3,0
-22744,50.6,-0.4,0
-22750,50.6,-0.5,0
-22758,50.6,-0.6,0
-22766,50.6,-0.7,0
-22800,50.6,-0.6,0
-22814,50.6,-0.5,0
-22822,50.6,-0.4,0
-22829,50.6,-0.3,0
-22835,50.6,-0.2,0
-22840,50.6,-0.1,0
-22845,50.6,-0.2,0
-22846,50.6,-0.4,0
-22847,0,-0.7,17.2
-22848,60.2,-0.7,0
-22849,60.2,0.1,0
-22851,60.2,0.2,0
-22852,60.2,0.3,0
-22855,60.2,0.4,0
-22858,60.2,0.5,0
-22861,60.2,0.6,0
-22863,60.2,0.7,0
-22867,60.2,0.8,0
-22870,60.2,0.9,0
-22873,60.2,1,0
-22878,60.2,1.1,0
-22883,60.2,1.2,0
-22889,60.2,1.3,0
-22919,60.2,1.2,0
-22923,60.2,1.1,0
-22931,60.2,1,0
-22933,60.2,0.9,0
-22938,60.2,0.8,0
-22941,60.2,0.7,0
-22946,60.2,0.6,0
-22949,60.2,0.5,0
-22954,60.2,0.4,0
-22957,60.2,0.3,0
-22963,60.2,0.2,0
-22971,60.2,0.1,0
-22983,60.2,0.2,0
-22992,60.2,0.3,0
-22995,60.2,0.4,0
-23002,60.2,0.5,0
-23005,60.2,0.6,0
-23008,60.2,0.7,0
-23014,60.2,0.8,0
-23017,60.2,0.9,0
-23021,60.2,1,0
-23027,60.2,1.1,0
-23034,60.2,1.2,0
-23060,60.2,1.1,0
-23066,60.2,1,0
-23073,60.2,0.9,0
-23079,60.2,0.8,0
-23086,60.2,0.7,0
-23093,60.2,0.6,0
-23096,60.2,0.5,0
-23103,60.2,0.4,0
-23106,60.2,0.3,0
-23113,60.2,0.2,0
-23116,60.2,0.1,0
-23123,60.2,0,0
-23129,60.2,-0.1,0
-23133,60.2,-0.2,0
-23140,60.2,-0.3,0
-23143,60.2,-0.4,0
-23150,60.2,-0.5,0
-23159,60.2,-0.6,0
-23169,60.2,-0.7,0
-23182,60.2,-0.8,0
-23208,60.2,-0.9,0
-23231,60.2,-1,0
-23249,55.1,-1,0
-23252,55.1,-1.1,0
-23264,55.1,-1.2,0
-23273,55.1,-1.3,0
-23278,55.1,-1.4,0
-23283,55.1,-1.5,0
-23291,55.1,-1.6,0
-23295,55.1,-1.7,0
-23301,55.1,-1.8,0
-23303,33.7,-1.8,0
-23312,33.7,-1.9,0
-23323,33.7,-1.8,0
-23332,33.7,-1.7,0
-23339,33.7,-1.6,0
-23343,33.7,-1.5,0
-23348,33.7,-1.4,0
-23351,33.7,-1.3,0
-23356,33.7,-1.2,0
-23362,33.7,-1.1,0
-23367,33.7,-1,0
-23378,18.4,-1,0
-23379,18.4,-0.9,0
-23384,33.3,-0.9,0
-23393,33.3,-1,0
-23403,33.3,-1.1,0
-23411,33.3,-1.2,0
-23421,33.3,-1.3,0
-23438,33.3,-1.2,0
-23445,33.3,-1.1,0
-23450,33.3,-1,0
-23455,33.3,-0.9,0
-23460,33.3,-0.8,0
-23464,33.3,-0.7,0
-23468,33.3,-0.6,0
-23472,33.3,-0.5,0
-23477,33.3,-0.4,0
-23481,33.3,-0.3,0
-23502,33.3,-0.5,0
-23504,0,-1.2,2
+4075,23.1,-0.7,0
+4076,23.1,-0.6,0
+4078,23.1,-0.5,0
+4122,23.1,-0.6,0
+4123,23.1,-0.8,0
+4124,23.1,-1.1,0
+4125,0,-0.3,3.8
+4126,35.7,-0.3,0
+4127,35.7,-0.7,0
+4128,35.7,-0.6,0
+4130,35.7,-0.5,0
+4138,35.7,-0.4,0
+4143,35.7,-0.5,0
+4157,35.7,-0.6,0
+4165,35.7,-0.7,0
+4173,35.7,-0.8,0
+4186,35.7,-0.9,0
+4192,35.7,-0.8,0
+4204,35.7,-0.7,0
+4211,35.7,-0.6,0
+4215,35.7,-0.5,0
+4219,35.7,-0.4,0
+4225,35.7,-0.3,0
+4228,35.7,-0.2,0
+4232,35.7,-0.1,0
+4236,35.7,0,0
+4240,35.7,0.1,0
+4243,35.7,0.2,0
+4249,35.7,0.3,0
+4252,35.7,0.4,0
+4256,30.7,0.4,0
+4258,30.7,0.5,0
+4263,30.7,0.6,0
+4268,30.7,0.7,0
+4274,30.7,0.8,0
+4279,30.7,0.9,0
+4288,30.7,1,0
+4306,30.7,0.9,0
+4308,30.7,0.6,0
+4309,32.5,0.3,0
+4310,32.5,0.7,0
+4311,32.5,0.8,0
+4312,32.5,0.9,0
+4315,32.5,1,0
+4324,32.5,0.9,0
+4331,32.5,0.8,0
+4337,32.5,0.7,0
+4341,32.5,0.6,0
+4345,32.5,0.5,0
+4348,32.5,0.4,0
+4353,32.5,0.3,0
+4357,32.5,0.2,0
+4362,32.5,0.1,0
+4367,32.5,0,0
+4372,32.5,-0.1,0
+4381,32.5,-0.2,0
+4415,32.5,-0.1,0
+4430,32.5,0,0
+4458,32.5,-0.1,0
+4467,32.5,-0.2,0
+4478,32.5,-0.3,0
+4489,32.5,-0.4,0
+4490,42.1,-0.4,0
+4511,42.1,-0.3,0
+4529,42.1,-0.2,0
+4543,42.1,-0.3,0
+4555,42.1,-0.4,0
+4563,42.1,-0.5,0
+4569,42.1,-0.6,0
+4575,42.1,-0.7,0
+4581,42.1,-0.8,0
+4588,42.1,-0.9,0
+4596,42.1,-1,0
+4605,42.1,-1.1,0
+4619,42.1,-1.2,0
+4653,42.1,-1.1,0
+4664,42.1,-1,0
+4671,42.1,-0.9,0
+4680,42.1,-0.8,0
+4690,42.1,-0.7,0
+4720,42.1,-0.8,0
+4726,42.1,-0.9,0
+4733,42.1,-1,0
+4738,42.1,-1.1,0
+4742,42.1,-1.2,0
+4747,42.1,-1.3,0
+4751,42.1,-1.4,0
+4756,42.1,-1.5,0
+4760,42.1,-1.6,0
+4764,42.1,-1.7,0
+4768,42.1,-1.8,0
+4772,42.1,-1.9,0
+4776,42.1,-2,0
+4780,42.1,-2.1,0
+4784,42.1,-2.2,0
+4788,42.1,-2.3,0
+4794,42.1,-2.4,0
+4804,42.1,-2.5,0
+4813,42.1,-2.4,0
+4819,42.1,-2.3,0
+4823,42.1,-2.2,0
+4826,42.1,-2.1,0
+4829,42.1,-2,0
+4831,42.1,-1.9,0
+4834,42.1,-1.8,0
+4836,42.1,-1.7,0
+4838,42.1,-1.6,0
+4841,42.1,-1.5,0
+4843,42.1,-1.4,0
+4845,42.1,-1.3,0
+4848,39.3,-1.2,0
+4849,39.3,-1.1,0
+4851,39.3,-1,0
+4852,39.3,-0.9,0
+4854,39.3,-0.8,0
+4855,39.3,-0.7,0
+4857,39.3,-0.6,0
+4858,39.3,-0.5,0
+4859,39.3,-0.4,0
+4861,39.3,-0.3,0
+4863,39.3,-0.2,0
+4865,39.3,-0.1,0
+4866,39.3,0,0
+4867,39.3,0.2,0
+4871,39.3,0.3,0
+4874,39.3,0.4,0
+4876,39.3,0.5,0
+4879,39.3,0.6,0
+4883,39.3,0.7,0
+4902,39.3,0.6,0
+4907,39.3,0.5,0
+4911,39.3,0.4,0
+4917,39.3,0.3,0
+4921,39.3,0.2,0
+4927,39.3,0.1,0
+4946,39.3,0.2,0
+4953,39.3,0.3,0
+4959,39.3,0.4,0
+4964,39.3,0.5,0
+4968,39.3,0.6,0
+4974,39.3,0.7,0
+4981,39.3,0.8,0
+4999,39.3,0.7,0
+5007,39.3,0.6,0
+5011,39.3,0.5,0
+5016,39.3,0.4,0
+5020,28.4,0.3,0
+5021,45.1,0.3,0
+5023,45.1,0.2,0
+5028,45.1,0.1,0
+5031,45.1,0,0
+5035,45.1,-0.1,0
+5041,45.1,-0.2,0
+5047,45.1,-0.3,0
+5076,45.1,-0.2,0
+5083,45.1,-0.1,0
+5089,45.1,0,0
+5094,45.1,0.1,0
+5098,45.1,0.2,0
+5103,45.1,0.3,0
+5108,45.1,0.4,0
+5113,45.1,0.5,0
+5120,45.1,0.6,0
+5145,45.1,0.5,0
+5152,45.1,0.4,0
+5160,45.1,0.3,0
+5164,45.1,0.2,0
+5169,45.1,0.1,0
+5174,45.1,0,0
+5196,45.1,0.1,0
+5202,45.1,0.2,0
+5205,45.1,0.3,0
+5207,45.1,0.4,0
+5210,45.1,0.5,0
+5213,45.1,0.6,0
+5214,45.1,0.7,0
+5217,45.1,0.8,0
+5218,45.1,0.9,0
+5221,45.1,1,0
+5222,45.1,1.1,0
+5225,45.1,1.2,0
+5227,45.1,1.3,0
+5229,45.1,1.4,0
+5232,45.1,1.5,0
+5235,45.1,1.6,0
+5238,45.1,1.5,0
+5239,45.1,1.3,0
+5240,0,0.9,14.8
+5241,35.4,0.9,0
+5242,35.4,1.6,0
+5243,35.4,1.7,0
+5244,35.4,1.8,0
+5245,35.4,1.9,0
+5248,35.4,2,0
+5253,35.4,2.1,0
+5270,35.4,2,0
+5277,35.4,1.9,0
+5284,35.4,1.8,0
+5289,35.4,1.7,0
+5297,35.4,1.6,0
+5303,35.4,1.5,0
+5309,35.4,1.4,0
+5312,35.4,1.3,0
+5318,35.4,1.2,0
+5322,35.4,1.1,0
+5327,35.4,1,0
+5331,35.4,0.9,0
+5334,35.4,0.8,0
+5339,35.4,0.7,0
+5342,35.4,0.6,0
+5347,35.4,0.5,0
+5351,35.4,0.4,0
+5355,35.4,0.3,0
+5363,40.1,0.3,0
+5366,40.1,0.4,0
+5373,40.1,0.5,0
+5381,40.1,0.6,0
+5390,40.1,0.7,0
+5400,40.1,0.8,0
+5415,40.1,0.7,0
+5423,40.1,0.6,0
+5430,40.1,0.5,0
+5434,40.1,0.4,0
+5439,40.1,0.3,0
+5443,40.1,0.2,0
+5448,40.1,0.1,0
+5452,40.1,0,0
+5459,40.1,-0.1,0
+5465,40.1,-0.2,0
+5483,40.1,-0.1,0
+5492,40.1,0,0
+5497,40.1,0.1,0
+5503,40.1,0.2,0
+5511,40.1,0.3,0
+5518,54.9,0.3,0
+5538,54.9,0.2,0
+5545,54.9,0.1,0
+5553,54.9,0,0
+5558,54.9,-0.1,0
+5565,54.9,-0.2,0
+5571,54.9,-0.3,0
+5609,54.9,-0.2,0
+5616,54.9,-0.1,0
+5624,54.9,0,0
+5629,54.9,0.1,0
+5638,54.9,0.2,0
+5643,54.9,0.3,0
+5655,54.9,0.4,0
+5675,54.9,0.3,0
+5685,54.9,0.2,0
+5690,54.9,0.1,0
+5697,54.9,0,0
+5700,54.9,-0.1,0
+5706,54.9,-0.2,0
+5709,54.9,-0.3,0
+5712,54.9,-0.4,0
+5715,54.9,-0.5,0
+5721,54.9,-0.6,0
+5724,54.9,-0.7,0
+5727,54.9,-0.8,0
+5733,54.9,-0.9,0
+5736,54.9,-1,0
+5742,54.9,-1.1,0
+5773,54.9,-1,0
+5781,54.9,-0.9,0
+5788,54.9,-0.8,0
+5813,54.9,-0.9,0
+5819,54.9,-1,0
+5824,54.9,-1.1,0
+5829,54.9,-1.2,0
+5833,54.9,-1.3,0
+5836,54.9,-1.4,0
+5841,54.9,-1.5,0
+5851,54.9,-1.6,0
+5854,54.9,-1.9,0
+5855,0,-2.3,4.2
+5856,47.2,-2.3,0
+5857,47.2,-1.6,0
+5858,47.2,-1.5,0
+5859,47.2,-1.4,0
+5861,47.2,-1.3,0
+5864,47.2,-1.2,0
+5867,47.2,-1.1,0
+5869,47.2,-1,0
+5871,47.2,-0.9,0
+5874,47.2,-0.8,0
+5877,47.2,-0.7,0
+5878,47.2,-0.6,0
+5881,47.2,-0.5,0
+5883,47.2,-0.4,0
+5884,47.2,-0.3,0
+5887,47.2,-0.2,0
+5889,47.2,-0.1,0
+5891,47.2,0,0
+5893,47.2,0.1,0
+5894,47.2,0.2,0
+5898,47.2,0.3,0
+5900,47.2,0.4,0
+5902,47.2,0.5,0
+5906,47.2,0.6,0
+5908,47.2,0.7,0
+5912,47.2,0.8,0
+5916,47.2,0.9,0
+5920,47.2,1,0
+5947,47.2,0.9,0
+5955,47.2,0.8,0
+5962,47.2,0.7,0
+5970,47.2,0.6,0
+5977,47.2,0.5,0
+5985,47.2,0.4,0
+5990,49.9,0.4,0
+6004,57.8,0.4,0
+6037,57.8,0.3,0
+6052,57.8,0.2,0
+6058,57.8,0.1,0
+6067,57.8,0,0
+6074,57.8,-0.1,0
+6083,57.8,-0.2,0
+6112,57.8,-0.1,0
+6124,57.8,0,0
+6137,57.8,0.1,0
+6150,57.8,0.2,0
+6162,57.8,0.3,0
+6173,57.8,0.4,0
+6184,57.8,0.5,0
+6189,57.8,0.6,0
+6197,57.8,0.7,0
+6202,57.8,0.8,0
+6207,57.8,0.9,0
+6212,57.8,1,0
+6217,57.8,1.1,0
+6225,57.8,1.2,0
+6241,59.2,1.2,0
+6249,59.2,1.1,0
+6258,59.2,1,0
+6264,59.2,0.9,0
+6270,59.2,0.8,0
+6275,59.2,0.7,0
+6281,59.2,0.6,0
+6296,59.2,0.5,0
+6309,59.2,0.6,0
+6342,59.2,0.5,0
+6351,59.2,0.4,0
+6361,59.2,0.3,0
+6367,59.2,0.2,0
+6375,59.2,0.1,0
+6399,59.2,0.2,0
+6402,46.5,0.2,0
+6407,48.4,0.3,0
+6412,48.4,0.4,0
+6417,48.4,0.5,0
+6420,48.4,0.6,0
+6425,48.4,0.7,0
+6428,48.4,0.8,0
+6433,48.4,0.9,0
+6436,48.4,1,0
+6439,48.4,1.1,0
+6441,59,1.2,0
+6447,59,1.3,0
+6449,59,1.4,0
+6455,59,1.5,0
+6461,59,1.6,0
+6472,59,1.7,0
+6478,59,1.6,0
+6490,59,1.5,0
+6496,59,1.4,0
+6499,59,1.3,0
+6502,59,1.2,0
+6509,59,1.1,0
+6512,59,1,0
+6515,59,0.9,0
+6518,59,0.8,0
+6521,59,0.7,0
+6524,59,0.6,0
+6527,59,0.5,0
+6531,59,0.4,0
+6534,59,0.3,0
+6537,59,0.2,0
+6544,59,0.1,0
+6547,59,0,0
+6554,59,-0.1,0
+6581,59,0,0
+6588,59,0.1,0
+6591,59,0.2,0
+6598,59,0.3,0
+6601,59,0.4,0
+6605,59,0.5,0
+6611,59,0.6,0
+6615,59,0.7,0
+6622,59,0.8,0
+6628,59,0.9,0
+6658,59,0.8,0
+6668,59,0.7,0
+6687,59,0.6,0
+6738,59,0.5,0
+6748,67,0.4,0
+6754,67,0.3,0
+6761,67,0.2,0
+6767,67,0.1,0
+6774,67,0,0
+6781,67,-0.1,0
+6788,67,-0.2,0
+6795,67,-0.3,0
+6837,67,-0.2,0
+6851,67,-0.1,0
+6866,67,0,0
+6884,67,0.1,0
+6895,67,0.2,0
+6906,67,0.3,0
+6917,67,0.4,0
+6924,67,0.5,0
+6958,67,0.4,0
+6965,67,0.3,0
+6969,67,0.2,0
+6977,67,0.1,0
+6980,67,0,0
+6984,67,-0.1,0
+6992,67,-0.2,0
+6995,67,-0.3,0
+7003,67,-0.4,0
+7014,67,-0.5,0
+7033,67,-0.4,0
+7052,67,-0.3,0
+7067,67,-0.2,0
+7105,67,-0.1,0
+7127,67,0,0
+7146,67,0.1,0
+7160,67,0.2,0
+7185,67,0.3,0
+7205,67,0.2,0
+7226,67,0.1,0
+7232,52,0.1,0
+7241,52,0,0
+7249,58.4,-0.1,0
+7258,58.4,-0.2,0
+7264,58.4,-0.3,0
+7273,58.4,-0.4,0
+7279,58.4,-0.5,0
+7288,58.4,-0.6,0
+7294,58.4,-0.7,0
+7307,58.4,-0.8,0
+7319,58.4,-0.9,0
+7339,58.4,-0.8,0
+7351,58.4,-0.7,0
+7358,58.4,-0.6,0
+7368,58.4,-0.5,0
+7396,58.4,-0.6,0
+7402,58.4,-0.7,0
+7408,58.4,-0.8,0
+7411,58.4,-0.9,0
+7416,58.4,-1,0
+7421,58.4,-1.1,0
+7423,58.4,-1.2,0
+7428,58.4,-1.3,0
+7435,58.4,-1.4,0
+7441,58.4,-1.5,0
+7450,58.4,-1.6,0
+7469,58.4,-1.7,0
+7477,52,-1.7,0
+7490,52,-1.8,0
+7502,52,-1.9,0
+7524,52,-1.8,0
+7531,52,-1.7,0
+7537,52,-1.6,0
+7541,52,-1.5,0
+7545,52,-1.4,0
+7550,52,-1.3,0
+7555,52,-1.2,0
+7561,52,-1.1,0
+7566,52,-1,0
+7586,52,-1.1,0
+7593,52,-1.2,0
+7598,52,-1.3,0
+7603,52,-1.4,0
+7606,52,-1.5,0
+7611,52,-1.6,0
+7614,52,-1.7,0
+7620,52,-1.8,0
+7625,52,-1.9,0
+7631,52,-2,0
+7642,52,-2.1,0
+7665,52,-2,0
+7692,52,-1.9,0
+7701,52,-2,0
+7739,24.2,-2,0
+7742,30,-1.9,0
+7747,30,-1.8,0
+7752,30,-1.7,0
+7756,30,-1.6,0
+7759,30,-1.5,0
+7762,30,-1.4,0
+7763,30,-1.3,0
+7767,30,-1.2,0
+7770,30,-1.1,0
+7771,30,-1,0
+7773,30,-0.9,0
+7774,30,-0.8,0
+7777,30,-0.7,0
+7779,30,-0.6,0
+7780,30,-0.5,0
+7782,30,-0.4,0
+7783,30,-0.3,0
+7785,30,-0.2,0
+7786,30,-0.1,0
+7788,30,0,0
+7790,30,0.1,0
+7791,30,0.2,0
+7793,30,0.3,0
+7794,30,0.4,0
+7796,30,0.5,0
+7798,30,0.6,0
+7799,30,0.7,0
+7801,30,0.8,0
+7803,30,0.9,0
+7805,30,1,0
+7808,39.2,1.1,0
+7810,39.2,1.2,0
+7811,39.2,1.3,0
+7813,39.2,1.4,0
+7815,39.2,1.5,0
+7817,39.2,1.6,0
+7821,39.2,1.7,0
+7823,39.2,1.8,0
+7826,39.2,1.9,0
+7830,39.2,2,0
+7834,39.2,2.1,0
+7853,39.2,2,0
+7862,39.2,1.9,0
+7866,39.2,1.8,0
+7871,39.2,1.7,0
+7877,39.2,1.6,0
+7881,39.2,1.5,0
+7889,39.2,1.4,0
+7914,39.2,1.5,0
+7924,39.2,1.6,0
+7936,39.2,1.7,0
+7955,39.2,1.6,0
+7966,39.2,1.5,0
+7975,55.5,1.4,0
+7982,55.5,1.3,0
+7987,55.5,1.2,0
+7994,55.5,1.1,0
+8002,55.5,1,0
+8007,55.5,0.9,0
+8015,55.5,0.8,0
+8023,55.5,0.7,0
+8031,55.5,0.6,0
+8043,55.5,0.5,0
+8081,55.5,0.6,0
+8096,55.5,0.7,0
+8121,55.5,0.6,0
+8133,55.5,0.5,0
+8139,55.5,0.4,0
+8145,55.5,0.3,0
+8151,55.5,0.2,0
+8157,55.5,0.1,0
+8163,55.5,0,0
+8169,55.5,-0.1,0
+8175,55.5,-0.2,0
+8181,55.5,-0.3,0
+8190,55.5,-0.4,0
+8222,55.5,-0.3,0
+8232,55.5,-0.2,0
+8240,55.5,-0.1,0
+8245,55.5,0,0
+8247,44.9,0,0
+8252,44.9,0.1,0
+8262,44.9,0.2,0
+8286,44.9,0.1,0
+8300,44.9,0,0
+8315,44.9,-0.1,0
+8342,44.9,-0.2,0
+8358,44.9,-0.3,0
+8376,26.6,-0.3,0
+8378,42.5,-0.3,0
+8413,42.5,-0.4,0
+8423,42.5,-0.5,0
+8432,42.5,-0.6,0
+8438,42.5,-0.7,0
+8445,42.5,-0.8,0
+8469,42.5,-0.7,0
+8473,42.5,-0.6,0
+8475,42.5,-0.5,0
+8478,42.5,-0.4,0
+8480,42.5,-0.3,0
+8482,42.5,-0.2,0
+8484,42.5,-0.1,0
+8486,42.5,0,0
+8488,42.5,0.1,0
+8490,42.5,0.2,0
+8492,42.5,0.3,0
+8494,42.5,0.4,0
+8496,42.5,0.5,0
+8498,42.5,0.6,0
+8499,42.5,0.7,0
+8501,42.5,0.8,0
+8503,42.5,0.9,0
+8506,42.5,1,0
+8507,42.5,1.1,0
+8510,42.5,1.2,0
+8512,42.5,1.3,0
+8514,42.5,1.4,0
+8522,42.5,1.2,0
+8523,0,0.8,10.8
+8524,36.3,0.8,0
+8525,36.3,1.2,0
+8526,36.3,1.3,0
+8527,36.3,1.4,0
+8528,36.3,1.5,0
+8530,36.3,1.6,0
+8540,36.3,1.5,0
+8544,36.3,1.4,0
+8548,36.3,1.3,0
+8551,36.3,1.2,0
+8554,36.3,1.1,0
+8557,36.3,1,0
+8559,36.3,0.9,0
+8562,36.3,0.8,0
+8565,36.3,0.7,0
+8567,36.3,0.6,0
+8571,36.3,0.5,0
+8574,36.3,0.4,0
+8578,36.3,0.3,0
+8584,36.3,0.2,0
+8596,36.3,0.1,0
+8604,36.3,0.2,0
+8626,36.3,0.3,0
+8647,30,0.2,0
+8660,30,0.1,0
+8669,30,0,0
+8679,30,-0.1,0
+8689,36.3,-0.2,0
+8723,36.3,-0.1,0
+8734,36.3,0,0
+8743,36.3,0.1,0
+8753,36.3,0.2,0
+8764,36.3,0.3,0
+8774,36.3,0.4,0
+8775,27.4,0.4,0
+8785,27.4,0.5,0
+8793,27.4,0.6,0
+8800,27.4,0.7,0
+8810,27.4,0.8,0
+8825,27.4,0.9,0
+8833,27.4,0.8,0
+8839,27.4,0.7,0
+8841,27.4,0.6,0
+8842,27.4,0.2,0
+8843,0,0.2,21.2
+8844,33.8,0.2,0
+8845,33.8,0.6,0
+8846,33.8,0.7,0
+8848,33.8,0.8,0
+8860,33.8,0.7,0
+8877,33.8,0.6,0
+8904,33.8,0.7,0
+8933,33.8,0.6,0
+8937,28,0.6,0
+8939,28,0.5,0
+8944,28,0.4,0
+8947,28,0.3,0
+8950,28,0.2,0
+8953,28,0.1,0
+8956,28,0,0
+8957,28,-0.1,0
+8961,28,-0.2,0
+8962,28,-0.3,0
+8964,28,-0.4,0
+8967,28,-0.5,0
+8968,28,-0.6,0
+8970,28,-0.7,0
+8973,28,-0.8,0
+8974,28,-0.9,0
+8976,28,-1,0
+8978,35.4,-1,0
+8979,35.4,-1.1,0
+8981,35.4,-1.2,0
+8984,35.4,-1.3,0
+8987,35.4,-1.4,0
+8989,35.4,-1.5,0
+8993,35.4,-1.6,0
+8998,35.4,-1.7,0
+9020,35.4,-1.6,0
+9025,35.4,-1.5,0
+9031,35.4,-1.4,0
+9035,35.4,-1.3,0
+9039,35.4,-1.2,0
+9041,35.4,-1.1,0
+9045,35.4,-1,0
+9049,35.4,-0.9,0
+9052,35.4,-0.8,0
+9056,35.4,-0.7,0
+9060,35.4,-0.6,0
+9064,38.9,-0.5,0
+9068,38.9,-0.4,0
+9074,38.9,-0.3,0
+9080,38.9,-0.2,0
+9104,38.9,-0.3,0
+9116,38.9,-0.4,0
+9149,38.9,-0.3,0
+9155,38.9,-0.2,0
+9161,38.9,-0.1,0
+9165,38.9,0,0
+9169,38.9,0.1,0
+9171,38.9,0.2,0
+9175,38.9,0.3,0
+9179,43.5,0.4,0
+9183,43.5,0.5,0
+9185,43.5,0.6,0
+9191,43.5,0.7,0
+9196,43.5,0.8,0
+9216,43.5,0.7,0
+9221,43.5,0.6,0
+9225,43.5,0.5,0
+9228,43.5,0.4,0
+9230,43.5,0.3,0
+9235,43.5,0.2,0
+9237,43.5,0.1,0
+9240,43.5,0,0
+9242,43.5,-0.1,0
+9244,43.5,-0.2,0
+9247,43.5,-0.3,0
+9249,43.5,-0.4,0
+9251,43.5,-0.5,0
+9256,43.5,-0.6,0
+9258,43.5,-0.7,0
+9261,43.5,-0.8,0
+9265,43.5,-0.9,0
+9269,43.5,-1,0
+9276,43.5,-1.1,0
+9302,43.5,-1,0
+9308,34.2,-1,0
+9310,34.2,-0.9,0
+9316,34.2,-0.8,0
+9321,34.2,-0.7,0
+9327,34.2,-0.6,0
+9332,34.2,-0.5,0
+9337,34.2,-0.4,0
+9342,34.2,-0.3,0
+9349,34.2,-0.2,0
+9356,34.2,-0.4,0
+9358,34.2,-0.7,0
+9359,0,-0.5,8.8
+9360,34.2,-0.5,0
+9361,34.2,-0.2,0
+9363,34.2,-0.1,0
+9366,34.2,0,0
+9371,34.2,0.1,0
+9380,34.2,0.2,0
+9452,34.2,0.1,0
+9462,34.2,0,0
+9469,34.2,-0.1,0
+9472,34.2,-0.2,0
+9474,37.3,-0.2,0
+9478,37.3,-0.3,0
+9481,37.3,-0.4,0
+9485,37.3,-0.5,0
+9489,37.3,-0.6,0
+9493,37.3,-0.7,0
+9497,37.3,-0.8,0
+9499,37.3,-0.9,0
+9503,37.3,-1,0
+9507,37.3,-1.1,0
+9511,37.3,-1.2,0
+9515,37.3,-1.3,0
+9519,37.3,-1.4,0
+9523,37.3,-1.5,0
+9529,37.3,-1.6,0
+9534,37.3,-1.7,0
+9540,37.3,-1.8,0
+9546,37.3,-1.9,0
+9550,37.3,-2.1,0
+9552,37.3,-2.2,0
+9553,37.3,-2.3,0
+9554,26.9,-2.3,0
+9556,26.9,-2.2,0
+9557,26.9,-2.1,0
+9558,26.9,-2,0
+9560,26.9,-1.9,0
+9562,26.9,-1.8,0
+9568,26.9,-1.7,0
+9574,26.9,-1.6,0
+9579,26.9,-1.5,0
+9583,26.9,-1.4,0
+9588,26.9,-1.3,0
+9592,26.9,-1.2,0
+9598,26.9,-1.1,0
+9602,26.9,-1,0
+9608,26.9,-0.9,0
+9614,26.9,-0.8,0
+9623,26.9,-0.7,0
+9636,26.9,-0.6,0
+9642,41.5,-0.6,0
+9654,41.5,-0.5,0
+9666,41.5,-0.4,0
+9675,41.5,-0.3,0
+9686,41.5,-0.2,0
+9692,41.5,-0.1,0
+9701,41.5,0,0
+9717,41.5,0.1,0
+9724,41.5,0,0
+9739,41.5,-0.1,0
+9748,41.5,-0.2,0
+9750,31.5,-0.2,0
+9752,35.9,-0.2,0
+9759,35.9,-0.3,0
+9776,35.9,-0.2,0
+9784,35.9,-0.1,0
+9790,35.9,0,0
+9796,35.9,0.1,0
+9800,35.9,0.2,0
+9804,35.9,0.3,0
+9809,35.9,0.4,0
+9815,35.9,0.5,0
+9822,35.9,0.6,0
+9842,26.5,0.6,0
+9844,37.7,0.6,0
+9851,37.7,0.5,0
+9865,37.7,0.4,0
+9905,37.7,0.5,0
+9917,37.7,0.6,0
+9943,37.7,0.5,0
+9947,37.7,0.4,0
+9948,37.7,0.3,0
+9949,37.7,0,0
+9950,0,-0.1,7.4
+9951,37,-0.1,0
+9952,37,0.3,0
+9962,37,0.2,0
+9967,37,0.1,0
+9972,37,0,0
+9977,37,-0.1,0
+9981,37,-0.2,0
+9986,37,-0.3,0
+9991,37,-0.4,0
+10003,37,-0.5,0
+10007,37,-0.4,0
+10017,37,-0.3,0
+10023,37,-0.2,0
+10027,37,-0.1,0
+10033,37,0,0
+10036,37,0.1,0
+10040,37,0.2,0
+10044,37,0.3,0
+10050,37,0.4,0
+10058,37,0.5,0
+10059,37.8,0.5,0
+10074,37.8,0.4,0
+10080,37.8,0.3,0
+10083,37.8,0.2,0
+10087,37.8,0.1,0
+10091,37.8,0,0
+10094,37.8,-0.1,0
+10097,37.8,-0.2,0
+10100,37.8,-0.3,0
+10104,37.8,-0.4,0
+10107,37.8,-0.5,0
+10113,37.8,-0.6,0
+10118,37.8,-0.7,0
+10137,37.8,-0.6,0
+10147,37.8,-0.5,0
+10157,37.8,-0.4,0
+10183,36.4,-0.4,0
+10186,36.4,-0.5,0
+10222,36.4,-0.4,0
+10230,36.4,-0.3,0
+10235,36.4,-0.2,0
+10238,36.4,-0.1,0
+10243,36.4,0,0
+10246,36.4,0.1,0
+10250,36.4,0.2,0
+10252,36.4,0.3,0
+10256,36.4,0.4,0
+10259,36.4,0.5,0
+10263,36.4,0.6,0
+10268,36.4,0.7,0
+10274,36.4,0.8,0
+10301,36.4,0.7,0
+10309,36.4,0.6,0
+10315,36.4,0.5,0
+10323,36.4,0.4,0
+10331,36.4,0.3,0
+10339,36.4,0.2,0
+10347,36.4,0.1,0
+10360,36.4,0,0
+10390,36.4,-0.1,0
+10395,36.4,-0.2,0
+10396,36.4,-0.6,0
+10397,0,-0.5,8.8
+10398,29.1,-0.5,0
+10399,29.1,-0.2,0
+10400,29.1,-0.1,0
+10403,29.1,0,0
+10435,29.1,-0.1,0
+10451,29.1,-0.2,0
+10466,12.8,-0.2,0
+10470,56.5,-0.1,0
+10475,56.5,0,0
+10479,56.5,0.1,0
+10482,56.5,0.2,0
+10486,56.5,0.3,0
+10490,56.5,0.4,0
+10494,56.5,0.5,0
+10497,56.5,0.6,0
+10502,56.5,0.7,0
+10505,56.5,0.8,0
+10509,56.5,0.9,0
+10515,56.5,1,0
+10523,56.5,1.1,0
+10557,56.5,1,0
+10592,56.5,0.9,0
+10601,56.5,0.8,0
+10610,56.5,0.7,0
+10613,56.5,0.6,0
+10619,56.5,0.5,0
+10622,56.5,0.4,0
+10625,56.5,0.3,0
+10628,56.5,0.2,0
+10631,56.5,0.1,0
+10634,56.5,0,0
+10640,56.5,-0.1,0
+10643,56.5,-0.2,0
+10646,56.5,-0.3,0
+10650,56.5,-0.4,0
+10656,56.5,-0.5,0
+10659,56.5,-0.6,0
+10665,56.5,-0.7,0
+10675,56.5,-0.8,0
+10701,56.5,-0.9,0
+10706,56.5,-0.8,0
+10734,56.5,-0.7,0
+10745,56.5,-0.6,0
+10750,56.5,-0.5,0
+10756,57,-0.4,0
+10762,57,-0.3,0
+10767,57,-0.2,0
+10770,57,-0.1,0
+10775,57,0,0
+10779,57,0.1,0
+10784,57,0.2,0
+10788,57,0.3,0
+10793,57,0.4,0
+10799,57,0.5,0
+10803,57,0.6,0
+10810,57,0.7,0
+10817,57,0.8,0
+10851,57,0.7,0
+10859,57,0.6,0
+10868,57,0.5,0
+10877,57,0.4,0
+10886,57,0.3,0
+10895,57,0.2,0
+10901,57,0.1,0
+10911,57,0,0
+10917,57,-0.1,0
+10920,57,-0.2,0
+10926,57,-0.3,0
+10933,57,-0.4,0
+10936,57,-0.5,0
+10942,57,-0.6,0
+10948,57,-0.7,0
+10954,57,-0.8,0
+10965,57,-0.9,0
+10996,57,-0.8,0
+11004,49.6,-0.8,0
+11007,49.6,-0.7,0
+11014,49.6,-0.6,0
+11021,49.6,-0.5,0
+11027,49.6,-0.4,0
+11033,49.6,-0.3,0
+11039,49.6,-0.2,0
+11047,49.6,-0.1,0
+11056,49.6,0,0
+11069,49.6,0.1,0
+11089,49.6,0.2,0
+11106,49.6,0.3,0
+11119,49.6,0.4,0
+11143,49.6,0.3,0
+11146,53.7,0.3,0
+11154,53.7,0.2,0
+11159,53.7,0.1,0
+11168,53.7,0,0
+11174,53.7,-0.1,0
+11180,53.7,-0.2,0
+11186,53.7,-0.3,0
+11195,53.7,-0.4,0
+11203,53.7,-0.5,0
+11212,53.7,-0.6,0
+11250,53.7,-0.5,0
+11258,53.7,-0.4,0
+11263,45.3,-0.3,0
+11268,45.3,-0.2,0
+11271,45.3,-0.1,0
+11276,45.3,0,0
+11281,45.3,0.1,0
+11283,45.3,0.2,0
+11288,45.3,0.3,0
+11293,45.3,0.4,0
+11298,45.3,0.5,0
+11306,45.3,0.6,0
+11308,54.4,0.6,0
+11323,54.4,0.5,0
+11334,54.4,0.4,0
+11339,54.4,0.3,0
+11345,54.4,0.2,0
+11350,54.4,0.1,0
+11356,54.4,0,0
+11385,54.4,0.1,0
+11394,54.4,0.2,0
+11403,54.4,0.3,0
+11418,54.4,0.4,0
+11427,54.4,0.3,0
+11443,54.4,0.2,0
+11449,46.5,0.2,0
+11454,46.5,0.1,0
+11469,46.5,0,0
+11480,46.5,0.1,0
+11493,46.5,0.2,0
+11501,46.5,0.3,0
+11508,46.5,0.4,0
+11513,46.5,0.5,0
+11521,46.5,0.6,0
+11528,46.5,0.7,0
+11538,46.5,0.8,0
+11596,46.5,0.9,0
+11603,46.5,1,0
+11610,46.5,1.1,0
+11614,46.5,1.2,0
+11618,46.5,1.3,0
+11622,46.5,1.4,0
+11626,46.5,1.5,0
+11631,46.5,1.6,0
+11638,46.5,1.7,0
+11648,46.5,1.6,0
+11652,46.5,1.5,0
+11654,46.5,1.4,0
+11655,46.5,1.3,0
+11656,35.1,1.3,0
+11659,35.1,1.4,0
+11661,35.1,1.3,0
+11666,35.1,1.2,0
+11670,35.1,1.1,0
+11672,35.1,1,0
+11674,35.1,0.9,0
+11677,35.1,0.8,0
+11680,35.1,0.7,0
+11681,35.1,0.6,0
+11684,35.1,0.5,0
+11686,35.1,0.4,0
+11689,35.1,0.3,0
+11691,35.1,0.2,0
+11694,35.1,0.1,0
+11696,35.1,0,0
+11699,35.1,-0.1,0
+11701,35.1,-0.2,0
+11705,35.1,-0.3,0
+11708,35.1,-0.4,0
+11711,35.1,-0.5,0
+11714,35.1,-0.6,0
+11719,35.1,-0.7,0
+11722,35.1,-0.8,0
+11727,35.1,-0.9,0
+11733,35.1,-1,0
+11758,35.1,-0.9,0
+11766,35.1,-0.8,0
+11776,35.1,-0.9,0
+11777,35.1,-1.2,0
+11778,0,-1.3,12.2
+11779,26.6,-1.3,0
+11780,26.6,-0.8,0
+11781,26.6,-0.7,0
+11782,26.6,-0.6,0
+11784,26.6,-0.5,0
+11787,26.6,-0.4,0
+11791,26.6,-0.3,0
+11796,26.6,-0.2,0
+11805,26.6,-0.1,0
+11816,26.6,0,0
+11826,22.2,0,0
+11829,22.2,0.1,0
+11835,66.5,0.1,0
+11836,66.5,0.2,0
+11841,66.5,0.3,0
+11847,66.5,0.4,0
+11849,66.5,0.5,0
+11854,66.5,0.6,0
+11857,66.5,0.7,0
+11863,66.5,0.8,0
+11866,66.5,0.9,0
+11872,66.5,1,0
+11879,66.5,1.1,0
+11903,66.5,1,0
+11911,66.5,0.9,0
+11918,66.5,0.8,0
+11924,66.5,0.7,0
+11932,66.5,0.6,0
+11943,66.5,0.5,0
+11966,66.5,0.6,0
+11975,66.5,0.7,0
+11981,66.5,0.8,0
+11987,66.5,0.9,0
+11993,66.5,1,0
+12000,66.5,1.1,0
+12006,66.5,1.2,0
+12013,66.5,1.3,0
+12020,66.5,1.4,0
+12054,66.5,1.3,0
+12064,66.5,1.2,0
+12071,66.5,1.1,0
+12082,66.5,1,0
+12093,66.5,0.9,0
+12103,66.5,0.8,0
+12118,66.5,0.7,0
+12129,66.5,0.6,0
+12140,66.5,0.5,0
+12151,66.5,0.4,0
+12158,66.5,0.3,0
+12169,66.5,0.2,0
+12180,66.5,0.1,0
+12216,66.5,0.2,0
+12223,66.5,0.3,0
+12230,66.5,0.4,0
+12234,66.5,0.5,0
+12240,66.5,0.6,0
+12244,66.5,0.7,0
+12250,66.5,0.8,0
+12257,66.5,0.9,0
+12272,66.5,1,0
+12283,66.5,0.9,0
+12304,66.5,0.8,0
+12320,50,0.8,0
+12346,50,0.9,0
+12361,50,1,0
+12374,50,1.1,0
+12408,50,1,0
+12415,50,0.9,0
+12418,50,0.8,0
+12422,50,0.7,0
+12426,50,0.6,0
+12429,50,0.5,0
+12433,50,0.4,0
+12435,50,0.3,0
+12439,50,0.2,0
+12441,50,0.1,0
+12445,50,0,0
+12447,50,-0.1,0
+12452,50,-0.2,0
+12454,50,-0.3,0
+12458,50,-0.4,0
+12463,50,-0.5,0
+12467,50,-0.6,0
+12491,50,-0.5,0
+12496,50,-0.4,0
+12501,50,-0.3,0
+12507,50,-0.2,0
+12512,50,-0.1,0
+12515,50,0,0
+12520,50,0.1,0
+12525,50,0.2,0
+12531,50,0.3,0
+12536,50,0.4,0
+12544,50,0.5,0
+12594,50,0.4,0
+12613,50,0.3,0
+12627,50,0.2,0
+12638,50,0.1,0
+12646,50,0,0
+12658,50,-0.1,0
+12699,56.6,0,0
+12708,56.6,0.1,0
+12723,56.6,0.2,0
+12738,56.6,0.1,0
+12756,56.6,0,0
+12793,56.6,0.1,0
+12814,56.6,0,0
+12832,56.6,-0.1,0
+12854,56.6,-0.2,0
+12857,56.6,-0.1,0
+12875,56.6,0,0
+12881,56.6,0.1,0
+12888,56.6,0.2,0
+12894,56.6,0.3,0
+12897,56.6,0.4,0
+12903,56.6,0.5,0
+12910,56.6,0.6,0
+12916,56.6,0.7,0
+12925,56.6,0.8,0
+12954,56.6,0.7,0
+12969,56.6,0.6,0
+13004,56.6,0.7,0
+13033,56.6,0.6,0
+13039,61.3,0.6,0
+13042,61.3,0.5,0
+13049,61.3,0.4,0
+13052,61.3,0.3,0
+13059,61.3,0.2,0
+13065,61.3,0.1,0
+13069,61.3,0,0
+13075,61.3,-0.1,0
+13082,61.3,-0.2,0
+13089,61.3,-0.3,0
+13123,61.3,-0.2,0
+13156,61.3,-0.3,0
+13166,61.3,-0.4,0
+13169,61.3,-0.5,0
+13175,61.3,-0.6,0
+13178,61.3,-0.7,0
+13184,61.3,-0.8,0
+13187,61.3,-0.9,0
+13192,61.3,-1,0
+13195,61.3,-1.1,0
+13200,61.3,-1.2,0
+13205,61.3,-1.3,0
+13212,61.3,-1.4,0
+13234,61.3,-1.3,0
+13239,61.3,-1.2,0
+13243,61.3,-1.1,0
+13249,61.3,-1,0
+13252,61.3,-1.1,0
+13253,61.3,-1.3,0
+13254,0,-1.8,13.6
+13255,57.5,-1.8,0
+13256,57.5,-0.9,0
+13257,57.5,-0.8,0
+13258,57.5,-0.7,0
+13259,57.5,-0.6,0
+13261,57.5,-0.5,0
+13263,57.5,-0.4,0
+13265,57.5,-0.3,0
+13268,57.5,-0.2,0
+13270,57.5,-0.1,0
+13274,57.5,0,0
+13277,57.5,0.1,0
+13280,57.5,0.2,0
+13283,57.5,0.3,0
+13288,57.5,0.4,0
+13291,57.5,0.5,0
+13295,57.5,0.6,0
+13301,57.5,0.7,0
+13307,57.5,0.8,0
+13311,57.5,0.9,0
+13315,57.5,1,0
+13322,57.5,1.1,0
+13327,57.5,1.2,0
+13334,57.5,1.3,0
+13360,57.5,1.2,0
+13365,57.5,1.1,0
+13368,57.5,1,0
+13373,57.5,0.9,0
+13376,57.5,0.8,0
+13379,57.5,0.7,0
+13382,57.5,0.6,0
+13385,57.5,0.5,0
+13388,57.5,0.4,0
+13394,57.5,0.3,0
+13397,57.5,0.2,0
+13400,57.5,0.1,0
+13406,57.5,0,0
+13412,57.5,-0.1,0
+13418,57.5,-0.2,0
+13431,57.5,-0.3,0
+13450,57.5,-0.4,0
+13463,57.5,-0.5,0
+13472,57.5,-0.6,0
+13488,57.5,-0.7,0
+13507,57.5,-0.8,0
+13528,57.5,-0.9,0
+13537,57.5,-1,0
+13543,57.5,-1.1,0
+13548,57.5,-1.2,0
+13554,57.5,-1.3,0
+13556,57.5,-1.4,0
+13559,57.5,-1.5,0
+13564,57.5,-1.6,0
+13566,57.5,-1.7,0
+13569,57.5,-1.8,0
+13571,57.5,-1.9,0
+13575,57.5,-2,0
+13577,57.5,-2.1,0
+13579,57.5,-2.2,0
+13583,57.5,-2.3,0
+13587,57.5,-2.4,0
+13590,57.5,-2.5,0
+13596,57.5,-2.6,0
+13607,57.5,-2.5,0
+13617,57.5,-2.7,0
+13618,0,-2.1,6
+13619,25,-2.1,0
+13620,25,-2.3,0
+13621,25,-2.2,0
+13622,25,-2.1,0
+13623,25,-2,0
+13625,25,-1.9,0
+13626,25,-1.8,0
+13628,25,-1.7,0
+13629,25,-1.6,0
+13631,25,-1.5,0
+13632,25,-1.4,0
+13633,25,-1.3,0
+13635,25,-1.2,0
+13636,25,-1.1,0
+13637,25,-1,0
+13638,25,-0.9,0
+13641,25,-0.8,0
+13642,25,-0.7,0
+13643,25,-0.6,0
+13644,25,-0.5,0
+13645,25,-0.4,0
+13647,25,-0.3,0
+13649,25,-0.2,0
+13650,25,-0.1,0
+13651,25,0,0
+13652,25,0.1,0
+13654,25,0.2,0
+13655,25,0.3,0
+13656,25,0.4,0
+13659,25,0.5,0
+13660,25,0.6,0
+13661,25,0.7,0
+13663,25,0.8,0
+13666,25,0.9,0
+13667,25,1,0
+13670,25,1.1,0
+13673,25,1.2,0
+13677,25,1.3,0
+13684,25,1.4,0
+13687,25,1.3,0
+13689,15.3,1.3,0
+13690,41.8,1.3,0
+13703,41.8,1.2,0
+13709,41.8,1.1,0
+13713,41.8,1,0
+13718,41.8,0.9,0
+13724,41.8,0.8,0
+13731,41.8,0.7,0
+13742,41.8,0.6,0
+13769,41.8,0.7,0
+13794,41.8,0.8,0
+13820,48,0.8,0
+13826,48,0.7,0
+13837,48,0.6,0
+13844,48,0.5,0
+13851,48,0.4,0
+13856,48,0.3,0
+13861,48,0.2,0
+13866,48,0.1,0
+13871,48,0,0
+13876,48,-0.1,0
+13884,48,-0.2,0
+13889,48,-0.3,0
+13897,48,-0.4,0
+13905,48,-0.5,0
+13913,48,-0.6,0
+13921,48,-0.7,0
+13929,48,-0.8,0
+13934,48,-0.9,0
+13939,48,-1,0
+13944,48,-1.1,0
+13948,48,-1.2,0
+13953,48,-1.3,0
+13955,48,-1.4,0
+13959,48,-1.5,0
+13963,48,-1.6,0
+13967,48,-1.7,0
+13971,48,-1.8,0
+13976,48,-1.9,0
+13980,48,-2,0
+13998,30.4,-2,0
+14005,30.4,-1.9,0
+14010,30.4,-1.8,0
+14015,30.4,-1.7,0
+14019,30.4,-1.6,0
+14024,30.4,-1.5,0
+14031,30.4,-1.4,0
+14041,30.4,-1.3,0
+14049,30.4,-1.4,0
+14063,30.4,-1.5,0
+14068,30.4,-1.6,0
+14070,30.4,-1.7,0
+14071,30.4,-1.9,0
+14072,0,-2.5,12.4
+14073,42.7,-2.5,0
+14074,42.7,-1.7,0
+14075,42.7,-1.6,0
+14077,42.7,-1.5,0
+14082,42.7,-1.4,0
+14087,42.7,-1.3,0
+14093,42.7,-1.2,0
+14097,42.7,-1.1,0
+14101,42.7,-1,0
+14104,42.7,-0.9,0
+14108,42.7,-0.8,0
+14111,42.7,-0.7,0
+14117,42.7,-0.6,0
+14120,42.7,-0.5,0
+14126,42.7,-0.4,0
+14134,42.7,-0.3,0
+14150,42.7,-0.4,0
+14161,42.7,-0.5,0
+14170,42.7,-0.6,0
+14184,42.7,-0.7,0
+14196,42.7,-0.6,0
+14209,42.7,-0.5,0
+14219,42.7,-0.4,0
+14228,42.7,-0.3,0
+14230,30,-0.3,0
+14240,30,-0.2,0
+14245,33.1,-0.2,0
+14253,33.1,-0.3,0
+14262,33.1,-0.4,0
+14268,33.1,-0.5,0
+14273,33.1,-0.6,0
+14277,33.1,-0.7,0
+14280,33.1,-0.8,0
+14284,33.1,-0.9,0
+14289,33.1,-1,0
+14294,33.1,-1.1,0
+14302,33.1,-1.2,0
+14314,33.1,-1.1,0
+14322,33.1,-1.2,0
+14324,33.1,-1.3,0
+14325,41.1,-1.3,0
+14326,41.1,-1.2,0
+14327,41.1,-1.1,0
+14328,41.1,-1,0
+14329,41.1,-0.9,0
+14331,41.1,-0.8,0
+14333,41.1,-0.7,0
+14336,41.1,-0.6,0
+14340,41.1,-0.5,0
+14344,41.1,-0.4,0
+14348,41.1,-0.3,0
+14356,41.1,-0.2,0
+14378,41.1,-0.3,0
+14388,41.1,-0.4,0
+14401,41.1,-0.5,0
+14424,41.1,-0.6,0
+14469,41.1,-0.5,0
+14478,41.1,-0.4,0
+14483,32.8,-0.3,0
+14488,32.8,-0.2,0
+14492,32.8,-0.1,0
+14497,32.8,0,0
+14500,32.8,0.1,0
+14504,32.8,0.2,0
+14508,32.8,0.3,0
+14509,47,0.3,0
+14511,47,0.4,0
+14515,47,0.5,0
+14521,47,0.6,0
+14528,47,0.7,0
+14541,47,0.6,0
+14549,47,0.5,0
+14556,47,0.4,0
+14560,47,0.3,0
+14565,47,0.2,0
+14572,47,0.1,0
+14580,47,0,0
+14626,47,-0.1,0
+14636,47,-0.2,0
+14646,47,-0.3,0
+14654,47,-0.4,0
+14690,47,-0.3,0
+14703,47,-0.2,0
+14716,47,-0.1,0
+14728,47,0,0
+14738,47,0.1,0
+14744,35.2,0.1,0
+14747,35.2,0.2,0
+14751,35.2,0.3,0
+14754,35.2,0.4,0
+14759,35.2,0.5,0
+14769,35.2,0.6,0
+14783,35.2,0.5,0
+14791,35.2,0.4,0
+14796,35.2,0.3,0
+14799,35.2,0.2,0
+14803,35.2,0.1,0
+14807,35.2,0,0
+14810,35.2,-0.1,0
+14816,35.2,-0.2,0
+14822,35.2,-0.3,0
+14842,35.2,-0.2,0
+14848,35.2,-0.1,0
+14853,35.2,0,0
+14858,35.2,0.1,0
+14862,35.2,0.2,0
+14865,39.2,0.3,0
+14868,39.2,0.4,0
+14872,39.2,0.5,0
+14876,39.2,0.6,0
+14882,39.2,0.7,0
+14891,39.2,0.8,0
+14901,39.2,0.7,0
+14909,39.2,0.6,0
+14916,39.2,0.5,0
+14920,39.2,0.4,0
+14925,39.2,0.3,0
+14929,39.2,0.2,0
+14932,39.2,0.1,0
+14936,39.2,0,0
+14940,39.2,-0.1,0
+14943,39.2,-0.2,0
+14947,39.2,-0.3,0
+14951,39.2,-0.4,0
+14955,39.2,-0.5,0
+14957,39.2,-0.6,0
+14961,39.2,-0.7,0
+14965,39.2,-0.8,0
+14969,39.2,-0.9,0
+14974,39.2,-1,0
+14978,39.2,-1.1,0
+14983,39.2,-1.2,0
+14987,39.2,-1.3,0
+14991,39.2,-1.4,0
+14995,39.2,-1.5,0
+15002,39.2,-1.6,0
+15010,39.2,-1.7,0
+15026,26.5,-1.7,0
+15030,26.5,-1.6,0
+15037,26.5,-1.5,0
+15043,26.5,-1.4,0
+15047,32.6,-1.3,0
+15053,32.6,-1.2,0
+15057,32.6,-1.1,0
+15062,32.6,-1,0
+15065,32.6,-0.9,0
+15070,32.6,-0.8,0
+15077,32.6,-0.7,0
+15083,32.6,-0.6,0
+15090,32.6,-0.5,0
+15100,32.6,-0.4,0
+15113,32.6,-0.3,0
+15120,26.2,-0.3,0
+15128,32.9,-0.3,0
+15135,32.9,-0.4,0
+15149,32.9,-0.5,0
+15162,32.9,-0.6,0
+15195,32.9,-0.5,0
+15204,32.9,-0.4,0
+15208,32.9,-0.3,0
+15213,32.9,-0.2,0
+15218,32.9,-0.1,0
+15222,32.9,0,0
+15227,32.9,0.1,0
+15231,32.9,0.2,0
+15235,32.9,0.3,0
+15237,24.4,0.3,0
+15240,24.4,0.4,0
+15246,24.4,0.5,0
+15261,24.4,0.3,0
+15262,24.4,0,0
+15263,0,0.1,11
+15264,31.4,0.1,0
+15265,31.4,0.4,0
+15266,31.4,0.5,0
+15268,31.4,0.6,0
+15331,31.4,0.7,0
+15366,31.4,0.6,0
+15375,45.1,0.6,0
+15404,45.1,0.7,0
+15416,45.1,0.8,0
+15449,45.1,0.7,0
+15457,45.1,0.6,0
+15464,45.1,0.5,0
+15469,45.1,0.4,0
+15479,45.1,0.3,0
+15493,45.1,0.4,0
+15502,45.1,0.5,0
+15506,45.1,0.6,0
+15510,45.1,0.7,0
+15515,45.1,0.8,0
+15519,45.1,0.9,0
+15522,45.1,1,0
+15527,45.1,1.1,0
+15532,45.1,1.2,0
+15538,45.1,1.3,0
+15557,45.1,1.2,0
+15562,45.1,1.1,0
+15565,45.1,1,0
+15568,45.1,0.9,0
+15569,28.4,0.9,0
+15572,28.4,0.8,0
+15575,28.4,0.7,0
+15580,28.4,0.6,0
+15584,28.4,0.5,0
+15587,28.4,0.4,0
+15591,28.4,0.3,0
+15593,28.4,0.2,0
+15596,28.4,0.1,0
+15600,28.4,0,0
+15603,28.4,-0.1,0
+15606,28.4,-0.2,0
+15609,28.4,-0.3,0
+15612,28.4,-0.4,0
+15615,28.4,-0.5,0
+15618,28.4,-0.6,0
+15621,28.4,-0.7,0
+15625,28.4,-0.8,0
+15630,28.4,-0.9,0
+15634,28.4,-1,0
+15639,28.4,-1.1,0
+15644,28.4,-1.2,0
+15647,28.4,-1.3,0
+15648,28.4,-1.4,0
+15649,28.4,-1.6,0
+15650,0,-2.3,7.6
+15651,22.5,-2.3,0
+15652,22.5,-1.8,0
+15653,22.5,-1.5,0
+15654,22.5,-1.4,0
+15655,22.5,-1.3,0
+15658,22.5,-1.2,0
+15666,22.5,-1.1,0
+15675,22.5,-1,0
+15681,22.5,-0.9,0
+15687,22.5,-0.8,0
+15691,22.5,-0.7,0
+15695,22.5,-0.6,0
+15699,22.5,-0.5,0
+15703,22.5,-0.3,0
+15707,13.4,-0.3,0
+15708,45.5,-0.3,0
+15710,45.5,-0.2,0
+15712,45.5,-0.1,0
+15715,45.5,0,0
+15717,45.5,0.1,0
+15719,45.5,0.2,0
+15721,45.5,0.3,0
+15723,45.5,0.4,0
+15726,45.5,0.5,0
+15729,45.5,0.6,0
+15732,45.5,0.7,0
+15735,45.5,0.8,0
+15738,45.5,0.9,0
+15741,45.5,1,0
+15745,45.5,1.1,0
+15750,45.5,1.2,0
+15756,45.5,1.3,0
+15774,45.5,1.2,0
+15783,45.5,1.1,0
+15788,45.5,1,0
+15792,45.5,0.9,0
+15799,45.5,0.8,0
+15804,45.5,0.7,0
+15808,45.5,0.6,0
+15813,45.5,0.5,0
+15820,45.5,0.4,0
+15830,45.5,0.3,0
+15845,45.5,0.2,0
+15896,45.5,0.3,0
+15917,45.5,0.4,0
+15929,45.5,0.3,0
+15944,45.5,0.2,0
+15953,45.5,0.1,0
+15960,45.5,0,0
+15967,45.5,-0.1,0
+15974,45.5,-0.2,0
+15986,45.5,-0.3,0
+16008,45.5,-0.2,0
+16018,45.5,-0.1,0
+16026,45.5,0,0
+16031,45.5,0.1,0
+16036,45.5,0.2,0
+16041,45.5,0.3,0
+16048,45.5,0.4,0
+16076,45.5,0.3,0
+16083,45.5,0.2,0
+16088,45.5,0.1,0
+16093,45.5,0,0
+16098,45.5,-0.1,0
+16103,45.5,-0.2,0
+16111,45.5,-0.3,0
+16119,45.5,-0.4,0
+16142,45.5,-0.3,0
+16152,45.5,-0.2,0
+16162,45.5,-0.1,0
+16177,45.5,0,0
+16195,45.5,-0.1,0
+16212,45.5,-0.2,0
+16226,45.5,-0.3,0
+16248,45.5,-0.2,0
+16262,45.5,-0.1,0
+16269,45.5,0,0
+16275,45.5,0.1,0
+16282,45.5,0.2,0
+16288,45.5,0.3,0
+16295,45.5,0.4,0
+16303,45.5,0.5,0
+16310,45.5,0.6,0
+16318,45.5,0.7,0
+16321,26.1,0.7,0
+16326,26.1,0.8,0
+16337,26.1,0.9,0
+16370,26.1,0.8,0
+16379,26.1,0.7,0
+16388,27.9,0.7,0
+16394,27.9,0.6,0
+16407,27.9,0.5,0
+16418,27.9,0.4,0
+16433,27.9,0.3,0
+16446,27.9,0.2,0
+16448,26.1,0.2,0
+16452,26.1,0.3,0
+16455,26.1,0.4,0
+16459,26.1,0.5,0
+16463,26.1,0.6,0
+16467,26.1,0.7,0
+16472,26.1,0.8,0
+16479,26.1,0.9,0
+16490,26.1,1,0
+16492,26.1,0.9,0
+16501,26.1,0.8,0
+16502,26.1,0.7,0
+16503,0,-0.1,11.4
+16504,32.4,-0.1,0
+16505,32.4,0.5,0
+16506,32.4,0.6,0
+16507,32.4,0.7,0
+16508,32.4,0.8,0
+16509,32.4,0.9,0
+16562,32.4,0.8,0
+16570,32.4,0.7,0
+16575,32.4,0.6,0
+16581,32.4,0.5,0
+16584,32.4,0.4,0
+16588,32.4,0.3,0
+16593,32.4,0.2,0
+16596,32.4,0.1,0
+16601,32.4,0,0
+16607,28,-0.1,0
+16624,28,0,0
+16630,28,0.1,0
+16635,34.7,0.2,0
+16638,34.7,0.3,0
+16643,34.7,0.4,0
+16646,34.7,0.5,0
+16650,34.7,0.6,0
+16653,34.7,0.7,0
+16657,34.7,0.8,0
+16660,34.7,0.9,0
+16664,34.7,1,0
+16669,34.7,1.1,0
+16679,34.7,1.2,0
+16690,34.7,1.1,0
+16698,34.7,1,0
+16703,34.7,0.9,0
+16707,34.7,0.8,0
+16711,34.7,0.7,0
+16715,34.7,0.6,0
+16719,34.7,0.5,0
+16722,34.7,0.4,0
+16726,34.7,0.3,0
+16730,34.7,0.2,0
+16736,34.7,0.1,0
+16740,34.7,0,0
+16746,34.7,-0.1,0
+16775,34.7,0,0
+16783,34.7,0.1,0
+16790,34.7,0.2,0
+16797,34.7,0.3,0
+16803,34.7,0.4,0
+16811,34.7,0.5,0
+16822,34.7,0.4,0
+16824,34.7,0.2,0
+16825,0,-0.3,6
+16826,35.6,-0.3,0
+16827,35.6,0.4,0
+16828,35.6,0.5,0
+16831,35.6,0.6,0
+16848,35.6,0.5,0
+16855,35.6,0.4,0
+16860,35.6,0.3,0
+16866,35.6,0.2,0
+16871,35.6,0.1,0
+16877,35.6,0,0
+16881,35.6,-0.1,0
+16887,35.6,-0.2,0
+16895,35.6,-0.3,0
+16903,35.6,-0.4,0
+16911,35.6,-0.5,0
+16916,35.6,-0.6,0
+16924,35.6,-0.7,0
+16929,35.6,-0.8,0
+16935,35.6,-0.9,0
+16940,35.6,-1,0
+16945,35.6,-1.1,0
+16951,35.6,-1.2,0
+16956,35.6,-1.3,0
+16966,35.6,-1.4,0
+16979,35.6,-1.3,0
+16986,35.6,-1.2,0
+16990,35.6,-1.1,0
+16993,35.6,-1,0
+16997,35.6,-0.9,0
+17001,35.6,-0.8,0
+17002,35.6,-0.7,0
+17006,35.6,-0.6,0
+17008,35.6,-0.5,0
+17011,35.6,-0.4,0
+17012,35.6,-0.3,0
+17015,35.6,-0.2,0
+17018,35.6,-0.1,0
+17023,35.6,0,0
+17026,35.6,0.1,0
+17038,13.9,0.1,0
+17039,22.9,0.1,0
+17053,22.9,0,0
+17057,22.9,-0.1,0
+17063,22.9,-0.2,0
+17068,22.9,-0.3,0
+17077,22.9,-0.4,0
+17082,22.9,-0.3,0
+17091,22.9,-0.2,0
+17095,22.9,-0.1,0
+17100,22.9,-0.2,0
+17101,22.9,-0.5,0
+17102,0,0,11
+17103,21.8,0,0
+17104,21.8,0.1,0
+17105,21.8,0.2,0
+17106,21.8,0.3,0
+17108,21.8,0.4,0
+17109,21.8,0.5,0
+17110,21.8,0.6,0
+17112,21.8,0.7,0
+17114,21.8,0.8,0
+17115,21.8,0.9,0
+17117,21.8,1,0
+17118,21.8,1.1,0
+17121,21.8,1.2,0
+17123,21.8,1.3,0
+17124,21.8,1.4,0
+17126,21.8,1.5,0
+17127,21.8,1.6,0
+17130,21.8,1.7,0
+17131,21.8,1.8,0
+17133,21.8,1.9,0
+17136,21.8,2,0
+17138,21.8,2.1,0
+17141,21.8,2.2,0
+17143,21.8,2.3,0
+17147,21.8,2.4,0
+17151,50.8,2.5,0
+17157,50.8,2.6,0
+17169,50.8,2.5,0
+17175,50.8,2.4,0
+17181,50.8,2.3,0
+17186,50.8,2.2,0
+17188,50.8,2.1,0
+17192,50.8,2,0
+17196,50.8,1.9,0
+17200,50.8,1.8,0
+17202,50.8,1.7,0
+17207,50.8,1.6,0
+17211,50.8,1.5,0
+17213,50.8,1.4,0
+17218,50.8,1.3,0
+17220,50.8,1.2,0
+17225,50.8,1.1,0
+17230,50.8,1,0
+17232,50.8,0.9,0
+17237,50.8,0.8,0
+17242,50.8,0.7,0
+17245,50.8,0.6,0
+17250,50.8,0.5,0
+17256,50.8,0.4,0
+17261,50.8,0.3,0
+17269,50.8,0.2,0
+17278,50.8,0.1,0
+17295,50.8,0,0
+17347,50.8,-0.1,0
+17360,50.8,-0.2,0
+17367,50.8,-0.3,0
+17375,50.8,-0.4,0
+17380,50.8,-0.5,0
+17388,50.8,-0.6,0
+17396,50.8,-0.7,0
+17426,50.8,-0.6,0
+17437,50.8,-0.5,0
+17445,50.8,-0.4,0
+17453,50.8,-0.3,0
+17465,50.8,-0.2,0
+17479,50.8,-0.1,0
+17518,50.8,-0.2,0
+17526,50.8,-0.3,0
+17531,50.8,-0.4,0
+17537,50.8,-0.5,0
+17539,50.8,-0.6,0
+17545,50.8,-0.7,0
+17550,50.8,-0.8,0
+17552,50.8,-0.9,0
+17557,50.8,-1,0
+17564,50.8,-1.1,0
+17575,50.8,-1.2,0
+17589,50.8,-1.1,0
+17604,50.8,-1,0
+17612,32.8,-1,0
+17620,32.8,-0.9,0
+17665,32.8,-0.8,0
+17675,32.8,-0.7,0
+17683,32.8,-0.6,0
+17690,32.8,-0.5,0
+17696,32.8,-0.4,0
+17703,32.8,-0.3,0
+17708,32.8,-0.2,0
+17714,32.8,-0.1,0
+17720,32.8,0,0
+17727,32.8,0.1,0
+17733,32.8,0,0
+17734,32.8,-0.3,0
+17735,0,-0.8,13.6
+17736,30.9,-0.8,0
+17737,30.9,0.1,0
+17738,30.9,0.2,0
+17740,30.9,0.3,0
+17743,30.9,0.4,0
+17746,30.9,0.5,0
+17752,30.9,0.6,0
+17781,30.9,0.5,0
+17788,30.9,0.4,0
+17794,30.9,0.3,0
+17799,30.9,0.2,0
+17805,30.9,0.1,0
+17809,30.9,0,0
+17813,30.9,-0.1,0
+17817,30.9,-0.2,0
+17820,30.9,-0.3,0
+17823,30.9,-0.4,0
+17826,10,-0.5,0
+17831,10,-0.6,0
+17836,10,-0.7,0
+17838,10,-0.8,0
+17839,10,-1.1,0
+17840,0,-0.4,19
+17841,33.5,-0.4,0
+17842,33.5,-0.9,0
+17843,33.5,-0.8,0
+17845,33.5,-0.7,0
+17853,33.5,-0.8,0
+17862,33.5,-0.9,0
+17871,33.5,-1,0
+17890,33.5,-0.9,0
+17897,33.5,-0.8,0
+17903,33.5,-0.7,0
+17906,33.5,-0.6,0
+17910,33.5,-0.5,0
+17912,33.5,-0.4,0
+17915,33.5,-0.3,0
+17919,33.5,-0.2,0
+17922,33.5,-0.1,0
+17925,33.5,0,0
+17928,33.5,0.1,0
+17931,33.5,0.2,0
+17935,33.5,0.3,0
+17937,23.6,0.3,0
+17938,39.8,0.3,0
+17939,39.8,0.4,0
+17945,39.8,0.5,0
+17959,39.8,0.4,0
+17966,39.8,0.3,0
+17969,39.8,0.2,0
+17973,39.8,0.1,0
+17975,39.8,0,0
+17977,39.8,-0.1,0
+17982,39.8,-0.2,0
+17984,39.8,-0.3,0
+17986,39.8,-0.4,0
+17988,39.8,-0.5,0
+17990,39.8,-0.6,0
+17992,39.8,-0.7,0
+17997,39.8,-0.8,0
+17999,39.8,-0.9,0
+18001,39.8,-1,0
+18003,39.8,-1.1,0
+18006,39.8,-1.2,0
+18010,39.8,-1.3,0
+18012,39.8,-1.4,0
+18016,39.8,-1.5,0
+18023,39.8,-1.6,0
+18030,39.8,-1.7,0
+18043,25.4,-1.6,0
+18052,35.1,-1.5,0
+18057,35.1,-1.4,0
+18062,35.1,-1.3,0
+18066,35.1,-1.2,0
+18071,35.1,-1.1,0
+18076,35.1,-1,0
+18081,35.1,-0.9,0
+18093,35.1,-0.8,0
+18104,35.1,-0.9,0
+18116,35.1,-1,0
+18121,43.8,-1,0
+18123,43.8,-1.1,0
+18131,43.8,-1.2,0
+18145,43.8,-1.3,0
+18149,43.8,-1.2,0
+18160,43.8,-1.1,0
+18165,43.8,-1,0
+18170,43.8,-0.9,0
+18172,43.8,-0.8,0
+18175,43.8,-0.7,0
+18177,43.8,-0.6,0
+18180,43.8,-0.5,0
+18182,43.8,-0.4,0
+18184,43.8,-0.3,0
+18187,43.8,-0.2,0
+18189,43.8,-0.1,0
+18192,43.8,0,0
+18194,43.8,0.1,0
+18196,43.8,0.2,0
+18199,43.8,0.3,0
+18201,43.8,0.4,0
+18203,43.8,0.5,0
+18206,43.8,0.6,0
+18208,43.8,0.7,0
+18212,43.8,0.8,0
+18214,43.8,0.9,0
+18218,43.8,1,0
+18226,43.8,1.1,0
+18236,29.3,1.1,0
+18240,29.3,1,0
+18247,29.3,0.9,0
+18250,40.1,0.9,0
+18252,40.1,0.8,0
+18257,40.1,0.7,0
+18260,40.1,0.6,0
+18264,40.1,0.5,0
+18266,40.1,0.4,0
+18269,40.1,0.3,0
+18273,40.1,0.2,0
+18277,40.1,0.1,0
+18281,40.1,0,0
+18288,40.1,-0.1,0
+18303,40.1,0,0
+18310,40.1,0.1,0
+18314,40.1,0.2,0
+18316,40.1,0.3,0
+18320,40.1,0.4,0
+18323,40.1,0.5,0
+18327,40.1,0.6,0
+18331,40.1,0.7,0
+18334,40.1,0.8,0
+18338,40.1,0.9,0
+18353,40.1,0.8,0
+18354,40.1,0.6,0
+18355,0,0.2,12.8
+18356,45.7,0.2,0
+18357,45.7,0.6,0
+18358,45.7,0.7,0
+18359,45.7,0.8,0
+18365,45.7,0.7,0
+18370,45.7,0.6,0
+18374,45.7,0.5,0
+18378,45.7,0.4,0
+18381,45.7,0.3,0
+18386,45.7,0.2,0
+18389,45.7,0.1,0
+18394,45.7,0,0
+18419,45.7,0.1,0
+18426,45.7,0.2,0
+18430,45.7,0.3,0
+18438,45.7,0.4,0
+18445,45.7,0.5,0
+18465,45.7,0.4,0
+18473,45.7,0.3,0
+18478,45.7,0.2,0
+18483,45.7,0.1,0
+18490,45.7,0,0
+18495,45.7,-0.1,0
+18504,45.7,-0.2,0
+18523,49,-0.2,0
+18526,49,-0.1,0
+18535,49,0,0
+18547,49,0.1,0
+18581,49,0,0
+18597,49,-0.1,0
+18602,57.3,-0.1,0
+18627,57.4,-0.1,0
+18661,57.4,-0.2,0
+18680,57.4,-0.3,0
+18720,57.4,-0.2,0
+18735,57.4,-0.1,0
+18745,57.4,0,0
+18750,46.8,0,0
+18756,46.8,0.1,0
+18769,46.8,0.2,0
+18792,46.8,0.3,0
+18816,46.8,0.4,0
+18825,46.8,0.5,0
+18831,46.8,0.6,0
+18836,46.8,0.7,0
+18841,46.8,0.8,0
+18845,28.7,0.8,0
+18846,28.7,0.9,0
+18851,28.7,1,0
+18859,28.7,1.1,0
+18878,35.2,1,0
+18884,35.2,0.9,0
+18891,35.2,0.8,0
+18896,35.2,0.7,0
+18899,35.2,0.6,0
+18905,35.2,0.5,0
+18908,35.2,0.4,0
+18914,35.2,0.3,0
+18920,35.2,0.2,0
+18930,35.2,0.1,0
+18955,35.2,0.2,0
+18963,35.2,0.3,0
+18970,35.2,0.4,0
+18976,35.2,0.5,0
+18984,35.2,0.4,0
+18985,35.2,0.1,0
+18986,0,0.9,13
+18987,63.5,0.9,0
+18988,63.5,0.5,0
+18989,63.5,0.6,0
+18990,63.5,0.7,0
+18992,63.5,0.8,0
+18994,63.5,0.9,0
+19000,63.5,1,0
+19009,63.5,1.1,0
+19022,63.5,1,0
+19033,63.5,0.9,0
+19042,63.5,0.8,0
+19051,63.5,0.7,0
+19084,63.5,0.8,0
+19101,63.5,0.9,0
+19148,63.5,0.8,0
+19157,63.5,0.7,0
+19164,63.5,0.6,0
+19171,63.5,0.5,0
+19174,63.5,0.4,0
+19178,63.5,0.3,0
+19185,63.5,0.2,0
+19188,63.5,0.1,0
+19192,63.5,0,0
+19199,63.5,-0.1,0
+19202,63.5,-0.2,0
+19206,63.5,-0.3,0
+19213,63.5,-0.4,0
+19217,63.5,-0.5,0
+19223,63.5,-0.6,0
+19227,63.5,-0.7,0
+19234,63.5,-0.8,0
+19244,63.5,-0.9,0
+19254,63.5,-1,0
+19296,63.5,-0.9,0
+19308,63.5,-1,0
+19346,63.5,-0.9,0
+19358,63.5,-0.8,0
+19365,63.5,-1,0
+19368,63.5,-1.1,0
+19369,63.5,-1.7,0
+19370,0,-1.1,27
+19371,27.8,-1.1,0
+19372,27.8,-0.8,0
+19373,27.8,-0.7,0
+19375,27.8,-0.6,0
+19378,27.8,-0.5,0
+19381,27.8,-0.4,0
+19387,27.8,-0.3,0
+19399,27.8,-0.2,0
+19426,27.8,-0.1,0
+19436,27.8,0,0
+19446,27.8,0.1,0
+19454,27.8,0,0
+19455,27.8,-0.4,0
+19456,0,-0.5,9.4
+19457,49.8,-0.5,0
+19458,49.8,0.1,0
+19459,49.8,0.2,0
+19460,49.8,0.3,0
+19463,49.8,0.4,0
+19468,49.8,0.5,0
+19473,49.8,0.6,0
+19482,49.8,0.7,0
+19508,49.8,0.6,0
+19549,49.8,0.7,0
+19556,49.8,0.8,0
+19564,49.8,0.9,0
+19571,49.8,1,0
+19576,49.8,1.1,0
+19584,49.8,1.2,0
+19597,49.8,1.3,0
+19606,49.8,1.2,0
+19619,49.8,1.1,0
+19627,49.8,1,0
+19635,49.8,0.9,0
+19641,49.8,0.8,0
+19649,49.8,0.7,0
+19657,49.8,0.6,0
+19663,54.4,0.6,0
+19669,54.4,0.5,0
+19677,54.4,0.4,0
+19689,54.4,0.3,0
+19698,54.4,0.2,0
+19710,54.4,0.1,0
+19716,54.4,0,0
+19725,54.4,-0.1,0
+19731,54.4,-0.2,0
+19740,54.4,-0.3,0
+19749,54.4,-0.4,0
+19758,54.4,-0.5,0
+19769,54.4,-0.6,0
+19778,54.4,-0.7,0
+19786,54.4,-0.8,0
+19791,54.4,-0.9,0
+19797,54.4,-1,0
+19804,54.4,-1.1,0
+19809,54.4,-1.2,0
+19814,54.4,-1.3,0
+19820,54.4,-1.4,0
+19831,54.4,-1.5,0
+19839,54.4,-1.4,0
+19855,54.4,-1.5,0
+19856,54.4,-1.7,0
+19857,54.4,-2.3,0
+19858,0,-2,22.2
+19859,20.4,-2,0
+19860,20.4,-1.2,0
+19861,20.4,-1.1,0
+19862,20.4,-1,0
+19864,20.4,-0.9,0
+19865,20.4,-0.8,0
+19868,20.4,-0.7,0
+19871,20.4,-0.6,0
+19873,20.4,-0.5,0
+19877,20.4,-0.4,0
+19880,20.4,-0.3,0
+19883,20.4,-0.2,0
+19887,20.4,-0.1,0
+19891,44.7,0,0
+19896,44.7,0.1,0
+19903,44.7,0.2,0
+19952,44.7,0.3,0
+19962,44.7,0.4,0
+19969,44.7,0.5,0
+19977,44.7,0.6,0
+20001,44.7,0.5,0
+20009,44.7,0.4,0
+20016,44.7,0.3,0
+20020,44.7,0.2,0
+20025,44.7,0.1,0
+20029,44.7,0,0
+20034,44.7,-0.1,0
+20038,44.7,-0.2,0
+20045,44.7,-0.3,0
+20053,44.7,-0.4,0
+20072,44.7,-0.3,0
+20082,44.7,-0.2,0
+20087,44.1,-0.1,0
+20092,44.1,0,0
+20097,44.1,0.1,0
+20101,44.1,0.2,0
+20106,44.1,0.3,0
+20111,44.1,0.4,0
+20119,44.1,0.5,0
+20127,44.1,0.6,0
+20151,44.1,0.5,0
+20158,44.1,0.4,0
+20163,44.1,0.3,0
+20168,44.1,0.2,0
+20173,44.1,0.1,0
+20178,44.1,0,0
+20180,44.1,-0.1,0
+20185,44.1,-0.2,0
+20190,44.1,-0.3,0
+20194,44.1,-0.4,0
+20205,44.1,-0.5,0
+20209,44.1,-0.4,0
+20218,44.1,-0.3,0
+20224,44.1,-0.2,0
+20228,32.2,-0.1,0
+20231,32.2,0,0
+20235,32.2,0.1,0
+20238,32.2,0.2,0
+20242,32.2,0.3,0
+20245,32.2,0.4,0
+20250,32.2,0.5,0
+20254,36.2,0.5,0
+20257,36.2,0.6,0
+20268,36.2,0.5,0
+20275,36.2,0.4,0
+20279,36.2,0.3,0
+20283,36.2,0.2,0
+20287,36.2,0.1,0
+20289,36.2,0,0
+20293,36.2,-0.1,0
+20297,36.2,-0.2,0
+20299,36.2,-0.3,0
+20303,36.2,-0.4,0
+20307,36.2,-0.5,0
+20311,36.2,-0.6,0
+20321,36.2,-0.7,0
+20328,36.5,-0.6,0
+20334,48.5,-0.6,0
+20338,48.5,-0.5,0
+20341,48.5,-0.4,0
+20345,48.5,-0.3,0
+20349,48.5,-0.2,0
+20353,48.5,-0.1,0
+20355,48.5,0,0
+20359,48.5,0.1,0
+20361,48.5,0.2,0
+20365,48.5,0.3,0
+20367,48.5,0.4,0
+20371,48.5,0.5,0
+20375,48.5,0.6,0
+20377,48.5,0.7,0
+20384,48.5,0.8,0
+20391,48.5,0.9,0
+20405,48.5,0.8,0
+20413,48.5,0.7,0
+20418,48.5,0.6,0
+20421,48.5,0.5,0
+20426,48.5,0.4,0
+20428,48.5,0.3,0
+20434,48.5,0.2,0
+20436,48.5,0.1,0
+20439,48.5,0,0
+20445,48.5,-0.1,0
+20450,48.5,-0.2,0
+20455,48.5,-0.3,0
+20461,48.5,-0.4,0
+20485,48.5,-0.3,0
+20493,48.5,-0.2,0
+20501,48.5,-0.1,0
+20506,48.5,0,0
+20514,48.5,0.1,0
+20528,48.5,0.2,0
+20538,48.5,0.1,0
+20549,48.5,0,0
+20554,48.5,-0.1,0
+20559,48.5,-0.2,0
+20564,48.5,-0.3,0
+20567,48.5,-0.4,0
+20572,48.5,-0.5,0
+20574,48.5,-0.6,0
+20576,48.5,-0.7,0
+20579,48.5,-0.8,0
+20581,48.5,-0.9,0
+20586,48.5,-1,0
+20588,48.5,-1.1,0
+20590,48.5,-1.2,0
+20592,48.5,-1.3,0
+20596,48.5,-1.4,0
+20598,48.5,-1.5,0
+20602,48.5,-1.6,0
+20606,48.5,-1.7,0
+20609,48.5,-1.8,0
+20618,48.5,-1.9,0
+20623,48.5,-1.8,0
+20631,48.5,-1.7,0
+20635,48.5,-1.6,0
+20637,50.6,-1.6,0
+20639,50.6,-1.5,0
+20640,50.6,-1.4,0
+20643,50.6,-1.3,0
+20645,50.6,-1.2,0
+20648,50.6,-1.1,0
+20649,50.6,-1,0
+20651,50.6,-0.9,0
+20654,50.6,-0.8,0
+20655,50.6,-0.7,0
+20658,50.6,-0.6,0
+20660,50.6,-0.5,0
+20661,50.6,-0.4,0
+20664,50.6,-0.3,0
+20666,50.6,-0.2,0
+20669,50.6,-0.1,0
+20671,50.6,0,0
+20675,50.6,0.1,0
+20678,50.6,0.2,0
+20680,50.6,0.3,0
+20686,50.6,0.4,0
+20693,50.6,0.5,0
+20720,50.6,0.4,0
+20744,50.6,0.5,0
+20755,50.6,0.6,0
+20760,50.6,0.7,0
+20769,50.6,0.8,0
+20774,50.6,0.9,0
+20780,50.6,1,0
+20785,50.6,1.1,0
+20794,54.8,1.1,0
+20796,54.8,1.2,0
+20816,54.8,1.1,0
+20831,54.8,1,0
+20845,54.8,0.9,0
+20866,54.8,1,0
+20884,54.8,1.1,0
+20908,54.8,1,0
+20921,54.8,0.9,0
+20927,54.8,0.8,0
+20933,54.8,0.7,0
+20938,54.8,0.6,0
+20947,54.8,0.5,0
+20953,54.8,0.4,0
+20963,54.8,0.3,0
+20966,48.2,0.3,0
+20977,48.2,0.2,0
+20998,48.2,0.1,0
+21014,48.2,0,0
+21027,48.2,-0.1,0
+21035,48.2,-0.2,0
+21041,48.2,-0.3,0
+21049,48.2,-0.4,0
+21054,48.2,-0.5,0
+21059,48.2,-0.6,0
+21065,48.2,-0.7,0
+21070,48.2,-0.8,0
+21075,48.2,-0.9,0
+21081,48.2,-1,0
+21088,48.2,-1.1,0
+21110,48.2,-1,0
+21118,48.2,-0.9,0
+21123,48.2,-0.8,0
+21127,48.2,-0.7,0
+21130,48.2,-0.6,0
+21133,48.2,-0.5,0
+21135,48.2,-0.4,0
+21139,54.6,-0.3,0
+21142,54.6,-0.2,0
+21145,54.6,-0.1,0
+21148,54.6,0,0
+21151,54.6,0.1,0
+21154,54.6,0.2,0
+21155,54.6,0.3,0
+21159,54.6,0.4,0
+21162,54.6,0.5,0
+21166,54.6,0.6,0
+21170,54.6,0.7,0
+21174,54.6,0.8,0
+21180,54.6,0.9,0
+21208,54.6,0.8,0
+21214,54.6,0.7,0
+21219,54.6,0.6,0
+21225,54.6,0.5,0
+21227,54.6,0.4,0
+21233,54.6,0.3,0
+21236,54.6,0.2,0
+21239,54.6,0.1,0
+21244,54.6,0,0
+21250,54.6,-0.1,0
+21253,54.6,-0.2,0
+21262,54.6,-0.3,0
+21268,60.3,-0.3,0
+21278,60.3,-0.2,0
+21287,60.3,-0.1,0
+21297,60.3,0,0
+21300,60.3,0.1,0
+21307,60.3,0.2,0
+21314,60.3,0.3,0
+21324,60.3,0.4,0
+21330,60.3,0.5,0
+21340,60.3,0.6,0
+21373,60.3,0.5,0
+21379,60.3,0.4,0
+21382,56.4,0.3,0
+21389,56.4,0.2,0
+21392,56.4,0.1,0
+21395,56.4,0,0
+21398,56.4,-0.1,0
+21401,56.4,-0.2,0
+21404,56.4,-0.3,0
+21407,56.4,-0.4,0
+21411,56.4,-0.6,0
+21414,56.4,-0.7,0
+21417,56.4,-0.8,0
+21423,56.4,-0.9,0
+21426,56.4,-1,0
+21429,56.4,-1.1,0
+21435,56.4,-1.2,0
+21441,56.4,-1.3,0
+21462,56.4,-1.2,0
+21467,56.4,-1.1,0
+21473,56.4,-1,0
+21478,56.4,-0.9,0
+21483,56.4,-0.8,0
+21488,56.4,-0.7,0
+21492,56.4,-0.6,0
+21497,56.4,-0.5,0
+21502,56.4,-0.4,0
+21507,56.4,-0.3,0
+21520,56.4,-0.5,0
+21521,0,-1.2,8
+21522,49.3,-1.2,0
+21523,49.3,-0.3,0
+21525,49.3,-0.2,0
+21526,49.3,-0.1,0
+21532,49.3,0,0
+21540,49.3,0.1,0
+21553,49.3,0.2,0
+21562,49.3,0.3,0
+21570,49.3,0.4,0
+21574,49.3,0.5,0
+21580,49.3,0.6,0
+21585,49.3,0.7,0
+21587,49.3,0.8,0
+21592,49.3,0.9,0
+21596,49.3,1,0
+21599,49.3,1.1,0
+21604,49.3,1.2,0
+21608,49.3,1.3,0
+21613,49.3,1.4,0
+21643,49.3,1.3,0
+21651,49.3,1.2,0
+21656,49.3,1.1,0
+21667,49.3,1,0
+21686,49.3,1.1,0
+21699,49.3,1.2,0
+21704,51.6,1.2,0
+21732,51.6,1.1,0
+21737,51.6,1,0
+21743,51.6,0.9,0
+21746,51.6,0.8,0
+21752,51.6,0.7,0
+21754,51.6,0.6,0
+21760,51.6,0.5,0
+21763,51.6,0.4,0
+21769,51.6,0.3,0
+21774,51.5,0.2,0
+21783,48.3,0.1,0
+21806,48.3,0.2,0
+21814,48.3,0.3,0
+21821,48.3,0.4,0
+21828,48.3,0.5,0
+21835,48.3,0.6,0
+21842,48.3,0.7,0
+21855,48.3,0.8,0
+21872,27,0.8,0
+21873,30.8,0.8,0
+21882,30.8,0.7,0
+21895,30.8,0.6,0
+21902,30.8,0.5,0
+21907,30.8,0.4,0
+21912,30.8,0.3,0
+21915,30.8,0.2,0
+21918,30.8,0.1,0
+21921,30.8,0,0
+21923,30.8,-0.1,0
+21925,30.8,-0.2,0
+21927,30.8,-0.3,0
+21929,30.8,-0.4,0
+21930,30.8,-0.5,0
+21931,30.8,-0.7,0
+21932,0,-1.6,10.8
+21933,28.1,-1.6,0
+21934,28.1,-0.8,0
+21935,28.1,-0.7,0
+21938,28.1,-0.8,0
+21940,28.1,-0.9,0
+21943,28.1,-1,0
+21945,28.1,-1.1,0
+21947,28.1,-1.2,0
+21949,28.1,-1.3,0
+21951,28.1,-1.4,0
+21953,28.1,-1.5,0
+21954,28.1,-1.6,0
+21957,28.1,-1.7,0
+21959,28.1,-1.8,0
+21961,28.1,-1.9,0
+21963,28.1,-2,0
+21967,28.1,-2.1,0
+21970,28.1,-2.2,0
+21973,28.1,-2.3,0
+21977,28.1,-2.4,0
+21997,28.1,-2.3,0
+22001,28.1,-2.2,0
+22005,28.1,-2.1,0
+22008,28.1,-2,0
+22012,28.1,-1.9,0
+22013,18.9,-1.9,0
+22014,46.7,-1.9,0
+22015,46.7,-1.8,0
+22017,46.7,-1.7,0
+22019,46.7,-1.6,0
+22022,46.7,-1.5,0
+22023,46.7,-1.4,0
+22026,46.7,-1.3,0
+22029,46.7,-1.2,0
+22030,46.7,-1.1,0
+22033,46.7,-1,0
+22037,46.7,-0.9,0
+22038,46.7,-0.8,0
+22042,46.7,-0.7,0
+22045,46.7,-0.6,0
+22049,46.7,-0.5,0
+22053,46.7,-0.4,0
+22057,46.7,-0.3,0
+22061,46.7,-0.2,0
+22066,46.7,-0.1,0
+22073,46.7,0,0
+22078,46.7,0.1,0
+22083,46.7,0.2,0
+22088,46.7,0.3,0
+22093,46.7,0.4,0
+22101,46.7,0.5,0
+22106,46.7,0.6,0
+22111,46.7,0.7,0
+22118,46.7,0.8,0
+22129,46.7,0.9,0
+22137,46.7,0.8,0
+22147,46.7,0.7,0
+22153,46.7,0.6,0
+22155,50.6,0.6,0
+22158,50.6,0.5,0
+22162,50.6,0.4,0
+22164,50.6,0.3,0
+22168,50.6,0.2,0
+22170,50.6,0.1,0
+22174,50.6,0,0
+22176,50.6,-0.1,0
+22180,50.6,-0.2,0
+22182,50.6,-0.3,0
+22186,50.6,-0.4,0
+22190,50.6,-0.5,0
+22193,50.6,-0.6,0
+22197,50.6,-0.7,0
+22206,50.6,-0.8,0
+22218,50.6,-0.7,0
+22226,50.6,-0.6,0
+22232,50.6,-0.5,0
+22237,50.6,-0.4,0
+22240,50.6,-0.3,0
+22245,50.6,-0.2,0
+22248,50.6,-0.1,0
+22251,50.6,0,0
+22256,50.6,0.1,0
+22259,50.6,0.2,0
+22265,50.6,0.3,0
+22270,50.6,0.4,0
+22273,50.6,0.5,0
+22278,50.6,0.6,0
+22284,50.6,0.7,0
+22286,50.6,0.8,0
+22292,50.6,0.9,0
+22297,50.6,1,0
+22299,50.6,1.1,0
+22304,44,1.2,0
+22307,44,1.3,0
+22312,44,1.4,0
+22317,44,1.5,0
+22319,44,1.6,0
+22321,55.7,1.6,0
+22324,55.7,1.7,0
+22329,55.7,1.8,0
+22334,55.7,1.9,0
+22341,55.7,2,0
+22353,55.7,1.9,0
+22361,55.7,1.8,0
+22366,55.7,1.7,0
+22369,55.7,1.6,0
+22372,55.7,1.5,0
+22374,55.7,1.4,0
+22377,55.7,1.3,0
+22380,55.7,1.2,0
+22383,55.7,1.1,0
+22385,55.7,1,0
+22388,55.7,0.9,0
+22391,55.7,0.8,0
+22394,55.7,0.6,0
+22397,55.7,0.5,0
+22400,55.7,0.4,0
+22402,55.7,0.3,0
+22405,55.7,0.2,0
+22408,55.7,0.1,0
+22411,55.7,0,0
+22417,55.7,-0.1,0
+22420,55.7,-0.2,0
+22426,55.7,-0.3,0
+22433,55.7,-0.4,0
+22442,55.7,-0.5,0
+22451,55.7,-0.6,0
+22457,55.7,-0.7,0
+22466,55.7,-0.8,0
+22472,55.7,-0.9,0
+22478,55.7,-1,0
+22481,55.7,-1.1,0
+22487,55.7,-1.2,0
+22495,55.7,-1.3,0
+22516,55.7,-1.2,0
+22522,55.7,-1.1,0
+22527,55.7,-1,0
+22531,55.7,-1.1,0
+22532,0,-1.7,21.6
+22533,26.6,-1.7,0
+22534,26.6,-0.8,0
+22535,26.6,-0.7,0
+22536,26.6,-0.6,0
+22537,26.6,-0.5,0
+22538,26.6,-0.4,0
+22540,26.6,-0.3,0
+22541,26.6,-0.2,0
+22542,26.6,-0.1,0
+22544,26.6,0,0
+22546,26.6,0.1,0
+22547,26.6,0.2,0
+22549,26.6,0.3,0
+22550,26.6,0.4,0
+22552,26.6,0.5,0
+22554,26.6,0.6,0
+22556,26.6,0.7,0
+22557,26.6,0.8,0
+22559,26.6,0.9,0
+22562,26.6,1,0
+22563,26.6,1.1,0
+22566,26.6,1.2,0
+22567,26.6,1.3,0
+22570,26.6,1.4,0
+22573,26.6,1.5,0
+22576,26.6,1.6,0
+22579,26.6,1.7,0
+22586,26.6,1.8,0
+22590,18.5,1.8,0
+22593,39.3,1.8,0
+22609,39.3,1.7,0
+22617,39.3,1.6,0
+22624,39.3,1.5,0
+22631,39.3,1.4,0
+22640,39.3,1.3,0
+22648,50.6,1.3,0
+22653,50.6,1.2,0
+22667,50.6,1.1,0
+22677,50.6,1,0
+22685,50.6,0.9,0
+22690,50.6,0.8,0
+22695,50.6,0.7,0
+22701,50.6,0.6,0
+22704,50.6,0.5,0
+22709,50.6,0.4,0
+22712,50.6,0.3,0
+22718,50.6,0.2,0
+22721,50.6,0.1,0
+22726,50.6,0,0
+22729,50.6,-0.1,0
+22735,50.6,-0.2,0
+22740,50.6,-0.3,0
+22743,50.6,-0.4,0
+22749,50.6,-0.5,0
+22757,50.6,-0.6,0
+22765,50.6,-0.7,0
+22799,50.6,-0.6,0
+22813,50.6,-0.5,0
+22821,50.6,-0.4,0
+22828,50.6,-0.3,0
+22834,50.6,-0.2,0
+22839,50.6,-0.1,0
+22844,50.6,-0.2,0
+22845,50.6,-0.4,0
+22846,0,-0.7,17.2
+22847,60.2,-0.7,0
+22848,60.2,0.1,0
+22850,60.2,0.2,0
+22851,60.2,0.3,0
+22854,60.2,0.4,0
+22857,60.2,0.5,0
+22860,60.2,0.6,0
+22862,60.2,0.7,0
+22866,60.2,0.8,0
+22869,60.2,0.9,0
+22872,60.2,1,0
+22877,60.2,1.1,0
+22882,60.2,1.2,0
+22888,60.2,1.3,0
+22918,60.2,1.2,0
+22922,60.2,1.1,0
+22930,60.2,1,0
+22932,60.2,0.9,0
+22937,60.2,0.8,0
+22940,60.2,0.7,0
+22945,60.2,0.6,0
+22948,60.2,0.5,0
+22953,60.2,0.4,0
+22956,60.2,0.3,0
+22962,60.2,0.2,0
+22970,60.2,0.1,0
+22982,60.2,0.2,0
+22991,60.2,0.3,0
+22994,60.2,0.4,0
+23001,60.2,0.5,0
+23004,60.2,0.6,0
+23007,60.2,0.7,0
+23013,60.2,0.8,0
+23016,60.2,0.9,0
+23020,60.2,1,0
+23026,60.2,1.1,0
+23033,60.2,1.2,0
+23059,60.2,1.1,0
+23065,60.2,1,0
+23072,60.2,0.9,0
+23078,60.2,0.8,0
+23085,60.2,0.7,0
+23092,60.2,0.6,0
+23095,60.2,0.5,0
+23102,60.2,0.4,0
+23105,60.2,0.3,0
+23112,60.2,0.2,0
+23115,60.2,0.1,0
+23122,60.2,0,0
+23128,60.2,-0.1,0
+23132,60.2,-0.2,0
+23139,60.2,-0.3,0
+23142,60.2,-0.4,0
+23149,60.2,-0.5,0
+23158,60.2,-0.6,0
+23168,60.2,-0.7,0
+23181,60.2,-0.8,0
+23207,60.2,-0.9,0
+23230,60.2,-1,0
+23248,55.1,-1,0
+23251,55.1,-1.1,0
+23263,55.1,-1.2,0
+23272,55.1,-1.3,0
+23277,55.1,-1.4,0
+23282,55.1,-1.5,0
+23290,55.1,-1.6,0
+23294,55.1,-1.7,0
+23300,55.1,-1.8,0
+23302,33.7,-1.8,0
+23311,33.7,-1.9,0
+23322,33.7,-1.8,0
+23331,33.7,-1.7,0
+23338,33.7,-1.6,0
+23342,33.7,-1.5,0
+23347,33.7,-1.4,0
+23350,33.7,-1.3,0
+23355,33.7,-1.2,0
+23361,33.7,-1.1,0
+23366,33.7,-1,0
+23377,33.3,-1,0
+23378,33.3,-0.9,0
+23392,33.3,-1,0
+23402,33.3,-1.1,0
+23410,33.3,-1.2,0
+23420,33.3,-1.3,0
+23437,33.3,-1.2,0
+23444,33.3,-1.1,0
+23449,33.3,-1,0
+23454,33.3,-0.9,0
+23459,33.3,-0.8,0
+23463,33.3,-0.7,0
+23467,33.3,-0.6,0
+23471,33.3,-0.5,0
+23476,33.3,-0.4,0
+23480,33.3,-0.3,0
+23501,33.3,-0.5,0
+23503,0,-1.2,3.2
\ No newline at end of file
diff --git a/VectoCore/VectoCore/Resources/XSD/VectoDeclarationDefinitions.1.0.xsd b/VectoCore/VectoCore/Resources/XSD/VectoDeclarationDefinitions.1.0.xsd
index 9871aac1d6a1f527a3b3e8713fa7df721c29702d..c42a880d61856a8b937ee092ee0322164cc6e15a 100644
--- a/VectoCore/VectoCore/Resources/XSD/VectoDeclarationDefinitions.1.0.xsd
+++ b/VectoCore/VectoCore/Resources/XSD/VectoDeclarationDefinitions.1.0.xsd
@@ -1910,6 +1910,7 @@ ToDo: -0.00
 			<xs:documentation>P251 - enum</xs:documentation>
 		</xs:annotation>
 		<xs:restriction base="xs:string">
+			<xs:enumeration value="N2"/>
 			<xs:enumeration value="N3"/>
 		</xs:restriction>
 	</xs:simpleType>
diff --git a/VectoCore/VectoCore/Utils/DelaunayMap.cs b/VectoCore/VectoCore/Utils/DelaunayMap.cs
index 57a7739e6136db7e0ccba3d683fc4c3f74c18bd6..c91dc714f38f3d18b0f5b3c2a1f61135855e9c6e 100644
--- a/VectoCore/VectoCore/Utils/DelaunayMap.cs
+++ b/VectoCore/VectoCore/Utils/DelaunayMap.cs
@@ -29,315 +29,316 @@
 *   Martin Rexeis, rexeis@ivt.tugraz.at, IVT, Graz University of Technology
 */
 
-using System;
-using System.Collections.Generic;
-using System.Diagnostics;
-using System.Drawing;
-using System.IO;
-using System.Linq;
-using System.Runtime.CompilerServices;
-using System.Windows.Forms.DataVisualization.Charting;
-using TUGraz.VectoCommon.Exceptions;
-using TUGraz.VectoCommon.Models;
-using TUGraz.VectoCommon.Utils;
-using Point = TUGraz.VectoCommon.Utils.Point;
-
-namespace TUGraz.VectoCore.Utils
-{
-	public sealed class DelaunayMap : LoggingObject
-	{
-		private ICollection<Point> _points = new HashSet<Point>();
-		private Triangle[] _triangles;
-		private Edge[] _convexHull;
-
-		private readonly string _mapName;
-		private double _minY;
-		private double _minX;
-		private double _maxY;
-		private double _maxX;
-
-		public DelaunayMap(string name)
-		{
-			_mapName = name;
-		}
-
-		public void AddPoint(double x, double y, double z)
-		{
-			_points.Add(new Point(x, y, z));
-		}
-
-		public IReadOnlyCollection<Point> Entries
-		{
-			get {
-				var retVal = new Point[_points.Count];
-				var i = 0;
-				foreach (var pt in _points) {
-					retVal[i++] = new Point(pt.X * (_maxX - _minX) + _minX, pt.Y * (_maxY - _minY) + _minY, pt.Z);
-				}
-				return retVal;
-			}
-		}
-
-		/// <summary>
-		/// Triangulate the points.
-		/// </summary>
-		/// <remarks>
-		/// Triangulation with the Bowyer-Watson algorithm (iteratively insert points into a super triangle).
-		/// https://en.wikipedia.org/wiki/Bowyer%E2%80%93Watson_algorithm
-		/// </remarks>
-		public void Triangulate()
-		{
-			if (_points.Count < 3) {
-				throw new ArgumentException(string.Format("{0}: Triangulation needs at least 3 Points. Got {1} Points.", _mapName,
-					_points.Count));
-			}
-
-			SanitycheckInputPoints();
-
-			// The "supertriangle" encompasses all triangulation points.
-			// This is just a helper triangle which initializes the algorithm and will be removed in the end of the algorithm.
-			_maxX = _points.Max(p => p.X);
-			_maxY = _points.Max(p => p.Y);
-			_minX = _points.Min(p => p.X);
-			_minY = _points.Min(p => p.Y);
-			_points =
-				_points.Select(p => new Point((p.X - _minX) / (_maxX - _minX), (p.Y - _minY) / (_maxY - _minY), p.Z)).ToList();
-			var superTriangle = new Triangle(new Point(-1, -1), new Point(4, -1), new Point(-1, 4));
-			var triangles = new List<Triangle> { superTriangle };
-
-			var pointCount = 0;
-
-			var points = _points.ToArray();
-
-			// iteratively add each point into the correct triangle and split up the triangle
-			foreach (var point in points) {
-				// If the vertex lies inside the circumcircle of a triangle, the edges of this triangle are 
-				// added to the edge buffer and the triangle is removed from list.
-				// Remove duplicate edges. This leaves the convex hull of the edges.
-				// The edges in this convex hull are oriented counterclockwise!
-
-				var newTriangles = triangles.Select((t, i) => Tuple.Create(i, t, t.ContainsInCircumcircle(point)))
-					.Where(t => t.Item3)
-					.Reverse()
-					.SelectMany(t => {
-						triangles.RemoveAt(t.Item1);
-						return t.Item2.GetEdges();
-					})
-					.GroupBy(edge => edge)
-					.Where(group => group.Count() == 1)
-					.Select(group => new Triangle(group.Key.P1, group.Key.P2, point)).ToList();
-
-				triangles.AddRange(newTriangles);
-
-				//DrawGraph(pointCount, triangles, superTriangle, xmin, xmax, ymin, ymax, point);
-				pointCount++;
-
-				// check invariant: m = 2n-2-k
-				// m...triangle count
-				// n...point count (pointCount +3 points on the supertriangle)
-				// k...points on convex hull (exactly 3 --> supertriangle)
-				if (triangles.Count != 2 * (pointCount + 3) - 2 - 3) {
-					throw new VectoException(
-						"Delaunay-Triangulation invariant violated! Triangle count and point count doesn't fit together.");
-				}
-			}
-
-#if TRACE
-			DrawGraph(pointCount, triangles, superTriangle, points);
-#endif
-			_convexHull = triangles.FindAll(t => t.SharesVertexWith(superTriangle)).
-				SelectMany(t => t.GetEdges()).
-				Where(e => !(superTriangle.Contains(e.P1) || superTriangle.Contains(e.P2))).ToArray();
-
-			_triangles = triangles.FindAll(t => !t.SharesVertexWith(superTriangle)).ToArray();
-		}
-
-		private void SanitycheckInputPoints()
-		{
-			var duplicates = _points.GroupBy(pt => new { pt.X, pt.Y }, x => x).Where(g => g.Count() > 1).ToList();
-
-			foreach (var duplicate in duplicates) {
-				Log.Error("{0}: Input Point appears twice: x: {1}, y: {2}", duplicate.Key.X, duplicate.Key.Y);
-			}
-			if (duplicates.Any()) {
-				throw new VectoException("{0}: Input Data for Delaunay map contains duplicates! \n{1}", _mapName,
-					string.Join("\n", duplicates.Select(pt => string.Format("{0} / {1}", pt.Key.X, pt.Key.Y))));
-			}
-		}
-
-		public void DrawGraph()
-		{
-			var superTriangle = new Triangle(new Point(-1, -1), new Point(4, -1), new Point(-1, 4));
-			DrawGraph(0, _triangles, superTriangle, _points.ToArray());
-		}
-
-		/// <summary>
-		/// Draws the delaunay map (except supertriangle).
-		/// </summary>
-		private static void DrawGraph(int i, IEnumerable<Triangle> triangles, Triangle superTriangle, Point[] points,
-			Point lastPoint = null)
-		{
-			var xmin = Math.Min(points.Min(p => p.X), lastPoint != null ? lastPoint.X : double.NaN);
-			var xmax = Math.Max(points.Max(p => p.X), lastPoint != null ? lastPoint.X : double.NaN);
-			var ymin = Math.Min(points.Min(p => p.Y), lastPoint != null ? lastPoint.Y : double.NaN);
-			var ymax = Math.Max(points.Max(p => p.Y), lastPoint != null ? lastPoint.Y : double.NaN);
-
-			using (var chart = new Chart { Width = 1000, Height = 1000 }) {
-				chart.ChartAreas.Add(new ChartArea("main") {
-					AxisX = new Axis { Minimum = Math.Min(xmin, xmin), Maximum = Math.Max(xmax, xmax) },
-					AxisY = new Axis { Minimum = Math.Min(ymin, ymin), Maximum = Math.Max(ymax, ymax) }
-				});
-
-				foreach (var tr in triangles) {
-					if (tr.SharesVertexWith(superTriangle)) {
-						continue;
-					}
-
-					var series = new Series {
-						ChartType = SeriesChartType.FastLine,
-						Color = lastPoint != null && tr.Contains(lastPoint) ? Color.Red : Color.Blue
-					};
-					series.Points.AddXY(tr.P1.X, tr.P1.Y);
-					series.Points.AddXY(tr.P2.X, tr.P2.Y);
-					series.Points.AddXY(tr.P3.X, tr.P3.Y);
-					series.Points.AddXY(tr.P1.X, tr.P1.Y);
-					chart.Series.Add(series);
-				}
-
-				if (lastPoint != null) {
-					var series = new Series {
-						ChartType = SeriesChartType.Point,
-						Color = Color.Red,
-						MarkerSize = 5,
-						MarkerStyle = MarkerStyle.Circle
-					};
-					series.Points.AddXY(lastPoint.X, lastPoint.Y);
-					chart.Series.Add(series);
-				}
-
-				var frame = new StackFrame(2);
-				var method = frame.GetMethod();
-				System.Diagnostics.Debug.Assert(method.DeclaringType != null, "method.DeclaringType != null");
-				var type = string.Join("", method.DeclaringType.Name.Split(Path.GetInvalidFileNameChars()));
-				var methodName = string.Join("", method.Name.Split(Path.GetInvalidFileNameChars()));
-				Directory.CreateDirectory("delaunay");
-				chart.SaveImage(string.Format("delaunay\\{0}_{1}_{2}_{3}.png", type, methodName, superTriangle.GetHashCode(), i),
-					ChartImageFormat.Png);
-			}
-		}
-
-		public double? Interpolate(SI x, SI y)
-		{
-			return Interpolate(x.Value(), y.Value());
-		}
-
-		/// <summary>
-		/// Interpolates the value of an point in the delaunay map.
-		/// </summary>
-		/// <param name="x"></param>
-		/// <param name="y"></param>
-		/// <returns>a value if interpolation is successfull, 
-		///          null if interpolation has failed.</returns>
-		[MethodImpl(MethodImplOptions.AggressiveInlining)]
-		public double? Interpolate(double x, double y)
-		{
-			if (_triangles == null) {
-				throw new VectoException("Interpolation not possible. Call DelaunayMap.Triangulate first.");
-			}
-
-			x = (x - _minX) / (_maxX - _minX);
-			y = (y - _minY) / (_maxY - _minY);
-
-			var i = 0;
-			while (i < _triangles.Length && !_triangles[i].IsInside(x, y, true)) {
-				i++;
-			}
-			if (i == _triangles.Length) {
-				i = 0;
-				while (i < _triangles.Length && !_triangles[i].IsInside(x, y, false)) {
-					i++;
-				}
-			}
-
-			if (i == _triangles.Length) {
-				return null;
-			}
-
-			var tr = _triangles[i];
-			var plane = new Plane(tr);
-			return (plane.W - plane.X * x - plane.Y * y) / plane.Z;
-		}
-
-		public double Extrapolate(SI x, SI y)
-		{
-			return Extrapolate(x.Value(), y.Value());
-		}
-
-		/// <summary>
-		/// Extrapolates the value of an point on the edges of a delaunay map.
-		/// </summary>
-		/// <param name="x"></param>
-		/// <param name="y"></param>
-		/// <returns></returns>
-		public double Extrapolate(double x, double y)
-		{
-			x = (x - _minX) / (_maxX - _minX);
-			y = (y - _minY) / (_maxY - _minY);
-			var point = new Point(x, y);
-
-			// get nearest point on convex hull
-			var nearestPoint = _convexHull.Select(e => e.P1).MinBy(p => Math.Pow(p.X - x, 2) + Math.Pow(p.Y - y, 2));
-
-			// test if point is on left side of the perpendicular vector (to x,y coordinates) of edge1 in the nearest point
-			//                            ^
-			//                 (point)    |
-			//                            |
-			// (p1)--edge1-->(nearestPoint)
-			var edge1 = _convexHull.First(e => e.P2.Equals(nearestPoint));
-			if (point.IsLeftOf(new Edge(nearestPoint, edge1.Vector.Perpendicular() + nearestPoint))) {
-				return ExtrapolateOnEdge(x, y, edge1);
-			}
-
-			// test if point is on right side of the perpendicular vector of edge2 in the nearest point
-			// ^
-			// |   (point)
-			// |        
-			// (nearestPoint)--edge2-->(p2)
-			var edge2 = _convexHull.First(e => e.P1.Equals(nearestPoint));
-			if (!point.IsLeftOf(new Edge(nearestPoint, edge2.Vector.Perpendicular() + nearestPoint))) {
-				return ExtrapolateOnEdge(x, y, edge2);
-			}
-
-			// if point is right of perpendicular vector of edge1 and left of perpendicular vector of edge2: take the nearest point z-value
-			return nearestPoint.Z;
-		}
-
-		/// <summary>
-		/// Constant z-axis-extrapolation of a point from a line
-		/// </summary>
-		/// <remarks>
-		/// https://en.wikibooks.org/wiki/Linear_Algebra/Orthogonal_Projection_Onto_a_Line
-		/// </remarks>
-		/// <param name="x"></param>
-		/// <param name="y"></param>
-		/// <param name="edge"></param>
-		/// <returns></returns>
-		private static double ExtrapolateOnEdge(double x, double y, Edge edge)
-		{
-			// shortcut if edge end points have same Z values
-			if (edge.P1.Z.IsEqual(edge.P2.Z)) {
-				return edge.P1.Z;
-			}
-
-			// 2d vector of the edge:  A--->B
-			var ab = new Point(edge.Vector.X, edge.Vector.Y);
-
-			// 2d vector of the point: A---->P
-			var ap = new Point(x - edge.P1.X, y - edge.P1.Y);
-
-			// projection of point (x,y) onto the edge
-			var z = edge.P1.Z + edge.Vector.Z * (ap.Dot(ab) / ab.Dot(ab));
-			return z;
-		}
-	}
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.Drawing;
+using System.IO;
+using System.Linq;
+using System.Runtime.CompilerServices;
+using System.Windows.Forms.DataVisualization.Charting;
+using TUGraz.VectoCommon.Exceptions;
+using TUGraz.VectoCommon.Models;
+using TUGraz.VectoCommon.Utils;
+using Point = TUGraz.VectoCommon.Utils.Point;
+
+namespace TUGraz.VectoCore.Utils
+{
+	public sealed class DelaunayMap : LoggingObject
+	{
+		private ICollection<Point> _points = new HashSet<Point>();
+		private Triangle[] _triangles;
+		private Edge[] _convexHull;
+
+		private readonly string _mapName;
+		private double _minY;
+		private double _minX;
+		private double _maxY;
+		private double _maxX;
+
+		public DelaunayMap(string name)
+		{
+			_mapName = name;
+		}
+
+		public void AddPoint(double x, double y, double z)
+		{
+			_points.Add(new Point(x, y, z));
+		}
+
+		public IReadOnlyCollection<Point> Entries
+		{
+			get
+			{
+				var retVal = new Point[_points.Count];
+				var i = 0;
+				foreach (var pt in _points) {
+					retVal[i++] = new Point(pt.X * (_maxX - _minX) + _minX, pt.Y * (_maxY - _minY) + _minY, pt.Z);
+				}
+				return retVal;
+			}
+		}
+
+		/// <summary>
+		/// Triangulate the points.
+		/// </summary>
+		/// <remarks>
+		/// Triangulation with the Bowyer-Watson algorithm (iteratively insert points into a super triangle).
+		/// https://en.wikipedia.org/wiki/Bowyer%E2%80%93Watson_algorithm
+		/// </remarks>
+		public void Triangulate()
+		{
+			if (_points.Count < 3) {
+				throw new ArgumentException(string.Format("{0}: Triangulation needs at least 3 Points. Got {1} Points.", _mapName,
+					_points.Count));
+			}
+
+			SanitycheckInputPoints();
+
+			// The "supertriangle" encompasses all triangulation points.
+			// This is just a helper triangle which initializes the algorithm and will be removed in the end of the algorithm.
+			_maxX = _points.Max(p => p.X);
+			_maxY = _points.Max(p => p.Y);
+			_minX = _points.Min(p => p.X);
+			_minY = _points.Min(p => p.Y);
+			_points =
+				_points.Select(p => new Point((p.X - _minX) / (_maxX - _minX), (p.Y - _minY) / (_maxY - _minY), p.Z)).ToList();
+			var superTriangle = new Triangle(new Point(-1, -1), new Point(4, -1), new Point(-1, 4));
+			var triangles = new List<Triangle> { superTriangle };
+
+			var pointCount = 0;
+
+			var points = _points.ToArray();
+
+			// iteratively add each point into the correct triangle and split up the triangle
+			foreach (var point in points) {
+				// If the vertex lies inside the circumcircle of a triangle, the edges of this triangle are 
+				// added to the edge buffer and the triangle is removed from list.
+				// Remove duplicate edges. This leaves the convex hull of the edges.
+				// The edges in this convex hull are oriented counterclockwise!
+
+				var newTriangles = triangles.Select((t, i) => Tuple.Create(i, t, t.ContainsInCircumcircle(point)))
+					.Where(t => t.Item3)
+					.Reverse()
+					.SelectMany(t => {
+						triangles.RemoveAt(t.Item1);
+						return t.Item2.GetEdges();
+					})
+					.GroupBy(edge => edge)
+					.Where(group => group.Count() == 1)
+					.Select(group => new Triangle(group.Key.P1, group.Key.P2, point)).ToList();
+
+				triangles.AddRange(newTriangles);
+
+				//DrawGraph(pointCount, triangles, superTriangle, xmin, xmax, ymin, ymax, point);
+				pointCount++;
+
+				// check invariant: m = 2n-2-k
+				// m...triangle count
+				// n...point count (pointCount +3 points on the supertriangle)
+				// k...points on convex hull (exactly 3 --> supertriangle)
+				if (triangles.Count != 2 * (pointCount + 3) - 2 - 3) {
+					throw new VectoException(
+						"Delaunay-Triangulation invariant violated! Triangle count and point count doesn't fit together.");
+				}
+			}
+
+#if TRACE
+			DrawGraph(pointCount, triangles, superTriangle, points);
+#endif
+			_convexHull = triangles.FindAll(t => t.SharesVertexWith(superTriangle)).
+				SelectMany(t => t.GetEdges()).
+				Where(e => !(superTriangle.Contains(e.P1) || superTriangle.Contains(e.P2))).ToArray();
+
+			_triangles = triangles.FindAll(t => !t.SharesVertexWith(superTriangle)).ToArray();
+		}
+
+		private void SanitycheckInputPoints()
+		{
+			var duplicates = _points.GroupBy(pt => new { pt.X, pt.Y }, x => x).Where(g => g.Count() > 1).ToList();
+
+			foreach (var duplicate in duplicates) {
+				Log.Error("{0}: Input Point appears twice: x: {1}, y: {2}", duplicate.Key.X, duplicate.Key.Y);
+			}
+			if (duplicates.Any()) {
+				throw new VectoException("{0}: Input Data for Delaunay map contains duplicates! \n{1}", _mapName,
+					string.Join("\n", duplicates.Select(pt => string.Format("{0} / {1}", pt.Key.X, pt.Key.Y))));
+			}
+		}
+
+		public void DrawGraph()
+		{
+			var superTriangle = new Triangle(new Point(-1, -1), new Point(4, -1), new Point(-1, 4));
+			DrawGraph(0, _triangles, superTriangle, _points.ToArray());
+		}
+
+		/// <summary>
+		/// Draws the delaunay map (except supertriangle).
+		/// </summary>
+		private static void DrawGraph(int i, IEnumerable<Triangle> triangles, Triangle superTriangle, Point[] points,
+			Point lastPoint = null)
+		{
+			var xmin = Math.Min(points.Min(p => p.X), lastPoint != null ? lastPoint.X : double.NaN);
+			var xmax = Math.Max(points.Max(p => p.X), lastPoint != null ? lastPoint.X : double.NaN);
+			var ymin = Math.Min(points.Min(p => p.Y), lastPoint != null ? lastPoint.Y : double.NaN);
+			var ymax = Math.Max(points.Max(p => p.Y), lastPoint != null ? lastPoint.Y : double.NaN);
+
+			using (var chart = new Chart { Width = 1000, Height = 1000 }) {
+				chart.ChartAreas.Add(new ChartArea("main") {
+					AxisX = new Axis { Minimum = Math.Min(xmin, xmin), Maximum = Math.Max(xmax, xmax) },
+					AxisY = new Axis { Minimum = Math.Min(ymin, ymin), Maximum = Math.Max(ymax, ymax) }
+				});
+
+				foreach (var tr in triangles) {
+					if (tr.SharesVertexWith(superTriangle)) {
+						continue;
+					}
+
+					var series = new Series {
+						ChartType = SeriesChartType.FastLine,
+						Color = lastPoint != null && tr.Contains(lastPoint) ? Color.Red : Color.Blue
+					};
+					series.Points.AddXY(tr.P1.X, tr.P1.Y);
+					series.Points.AddXY(tr.P2.X, tr.P2.Y);
+					series.Points.AddXY(tr.P3.X, tr.P3.Y);
+					series.Points.AddXY(tr.P1.X, tr.P1.Y);
+					chart.Series.Add(series);
+				}
+
+				if (lastPoint != null) {
+					var series = new Series {
+						ChartType = SeriesChartType.Point,
+						Color = Color.Red,
+						MarkerSize = 5,
+						MarkerStyle = MarkerStyle.Circle
+					};
+					series.Points.AddXY(lastPoint.X, lastPoint.Y);
+					chart.Series.Add(series);
+				}
+
+				var frame = new StackFrame(2);
+				var method = frame.GetMethod();
+				System.Diagnostics.Debug.Assert(method.DeclaringType != null, "method.DeclaringType != null");
+				var type = string.Join("", method.DeclaringType.Name.Split(Path.GetInvalidFileNameChars()));
+				var methodName = string.Join("", method.Name.Split(Path.GetInvalidFileNameChars()));
+				Directory.CreateDirectory("delaunay");
+				chart.SaveImage(string.Format("delaunay\\{0}_{1}_{2}_{3}.png", type, methodName, superTriangle.GetHashCode(), i),
+					ChartImageFormat.Png);
+			}
+		}
+
+		public double? Interpolate(SI x, SI y)
+		{
+			return Interpolate(x.Value(), y.Value());
+		}
+
+		/// <summary>
+		/// Interpolates the value of an point in the delaunay map.
+		/// </summary>
+		/// <param name="x"></param>
+		/// <param name="y"></param>
+		/// <returns>a value if interpolation is successfull, 
+		///          null if interpolation has failed.</returns>
+		[MethodImpl(MethodImplOptions.AggressiveInlining)]
+		public double? Interpolate(double x, double y)
+		{
+			if (_triangles == null) {
+				throw new VectoException("Interpolation not possible. Call DelaunayMap.Triangulate first.");
+			}
+
+			x = (x - _minX) / (_maxX - _minX);
+			y = (y - _minY) / (_maxY - _minY);
+
+			var i = 0;
+			while (i < _triangles.Length && !_triangles[i].IsInside(x, y, true)) {
+				i++;
+			}
+			if (i == _triangles.Length) {
+				i = 0;
+				while (i < _triangles.Length && !_triangles[i].IsInside(x, y, false)) {
+					i++;
+				}
+			}
+
+			if (i == _triangles.Length) {
+				return null;
+			}
+
+			var tr = _triangles[i];
+			var plane = new Plane(tr);
+			return (plane.W - plane.X * x - plane.Y * y) / plane.Z;
+		}
+
+		public double Extrapolate(SI x, SI y)
+		{
+			return Extrapolate(x.Value(), y.Value());
+		}
+
+		/// <summary>
+		/// Extrapolates the value of an point on the edges of a delaunay map.
+		/// </summary>
+		/// <param name="x"></param>
+		/// <param name="y"></param>
+		/// <returns></returns>
+		public double Extrapolate(double x, double y)
+		{
+			x = (x - _minX) / (_maxX - _minX);
+			y = (y - _minY) / (_maxY - _minY);
+			var point = new Point(x, y);
+
+			// get nearest point on convex hull
+			var nearestPoint = _convexHull.Select(e => e.P1).MinBy(p => Math.Pow(p.X - x, 2) + Math.Pow(p.Y - y, 2));
+
+			// test if point is on left side of the perpendicular vector (to x,y coordinates) of edge1 in the nearest point
+			//                            ^
+			//                 (point)    |
+			//                            |
+			// (p1)--edge1-->(nearestPoint)
+			var edge1 = _convexHull.First(e => e.P2.Equals(nearestPoint));
+			if (point.IsLeftOf(new Edge(nearestPoint, edge1.Vector.Perpendicular() + nearestPoint))) {
+				return ExtrapolateOnEdge(x, y, edge1);
+			}
+
+			// test if point is on right side of the perpendicular vector of edge2 in the nearest point
+			// ^
+			// |   (point)
+			// |        
+			// (nearestPoint)--edge2-->(p2)
+			var edge2 = _convexHull.First(e => e.P1.Equals(nearestPoint));
+			if (!point.IsLeftOf(new Edge(nearestPoint, edge2.Vector.Perpendicular() + nearestPoint))) {
+				return ExtrapolateOnEdge(x, y, edge2);
+			}
+
+			// if point is right of perpendicular vector of edge1 and left of perpendicular vector of edge2: take the nearest point z-value
+			return nearestPoint.Z;
+		}
+
+		/// <summary>
+		/// Constant z-axis-extrapolation of a point from a line
+		/// </summary>
+		/// <remarks>
+		/// https://en.wikibooks.org/wiki/Linear_Algebra/Orthogonal_Projection_Onto_a_Line
+		/// </remarks>
+		/// <param name="x"></param>
+		/// <param name="y"></param>
+		/// <param name="edge"></param>
+		/// <returns></returns>
+		private static double ExtrapolateOnEdge(double x, double y, Edge edge)
+		{
+			// shortcut if edge end points have same Z values
+			if (edge.P1.Z.IsEqual(edge.P2.Z)) {
+				return edge.P1.Z;
+			}
+
+			// 2d vector of the edge:  A--->B
+			var ab = new Point(edge.Vector.X, edge.Vector.Y);
+
+			// 2d vector of the point: A---->P
+			var ap = new Point(x - edge.P1.X, y - edge.P1.Y);
+
+			// projection of point (x,y) onto the edge
+			var z = edge.P1.Z + edge.Vector.Z * (ap.Dot(ab) / ab.Dot(ab));
+			return z;
+		}
+	}
 }
\ No newline at end of file
diff --git a/VectoCore/VectoCore/Utils/SearchAlgorithm.cs b/VectoCore/VectoCore/Utils/SearchAlgorithm.cs
index 5b001a40783e26dc7beb1a341be2f2a1110bb8be..2316cded98f3764e921705622f54f83c5833aa01 100644
--- a/VectoCore/VectoCore/Utils/SearchAlgorithm.cs
+++ b/VectoCore/VectoCore/Utils/SearchAlgorithm.cs
@@ -97,8 +97,14 @@ namespace TUGraz.VectoCore.Utils
 					ref iterationCount);
 			} catch (VectoException ex) {
 				var log = LogManager.GetLogger(typeof(SearchAlgorithm).FullName);
-				log.Debug("Falling back to LineSearch. InterpolationSearch failed: " + ex.Message);
-				result = LineSearch(x, y, interval, getYValue, evaluateFunction, criterion, abortCriterion, ref iterationCount);
+				log.Debug("Falling back to InterpolationSearch in reverse. Normal InterpolationSearch failed: " + ex.Message);
+				try {
+					result = InterpolateSearch(x, y, -interval, getYValue, evaluateFunction, criterion, abortCriterion,
+						ref iterationCount);
+				} catch (VectoException ex1) {
+					log.Debug("Falling back to LineSearch. Reverse InterpolationSearch failed: " + ex1.Message);
+					result = LineSearch(x, y, interval, getYValue, evaluateFunction, criterion, abortCriterion, ref iterationCount);
+				}
 			}
 			return result;
 		}
diff --git a/VectoCore/VectoCore/Utils/VectoCSVFile.cs b/VectoCore/VectoCore/Utils/VectoCSVFile.cs
index e904ab0adeb9f252dca49b16d2d47476c175298d..72ad52041301e8e2e387014c0b517774a0383ec7 100644
--- a/VectoCore/VectoCore/Utils/VectoCSVFile.cs
+++ b/VectoCore/VectoCore/Utils/VectoCSVFile.cs
@@ -38,6 +38,7 @@ using System.Linq;
 using System.Reflection;
 using System.Text;
 using System.Text.RegularExpressions;
+using DocumentFormat.OpenXml.Spreadsheet;
 using TUGraz.VectoCommon.Exceptions;
 using TUGraz.VectoCommon.InputData;
 using TUGraz.VectoCommon.Models;
@@ -111,19 +112,13 @@ namespace TUGraz.VectoCore.Utils
 				TrimWhiteSpace = true
 			};
 
-			string[] colsWithoutComment = { };
-
-			try {
-				var fields = p.ReadFields();
-				if (fields == null) {
-					throw new CSVReadException("CSV Read Error: File was empty.");
-				}
-				colsWithoutComment = fields
-					.Select(l => l.Contains(Comment) ? l.Substring(0, l.IndexOf(Comment, StringComparison.Ordinal)) : l)
-					.ToArray();
-			} catch (ArgumentNullException) {
+			var hdrFields = p.ReadFields();
+			if (hdrFields == null) {
 				throw new CSVReadException("CSV Read Error: File was empty.");
 			}
+			var colsWithoutComment = hdrFields
+				.Select(l => l.Contains(Comment) ? l.Substring(0, l.IndexOf(Comment, StringComparison.Ordinal)) : l)
+				.ToArray();
 
 			double tmp;
 			var columns = colsWithoutComment
@@ -142,17 +137,10 @@ namespace TUGraz.VectoCore.Utils
 				columns = colsWithoutComment.Select((_, i) => i.ToString()).ToList();
 			}
 
-			//var table = new DataTable();
-			foreach (var col in columns) {
-				table.Columns.Add(col);
-			}
-
-			if (p.EndOfData) {
-				return;
-			}
+			columns.ForEach(col => table.Columns.Add(col));
 
 			var lineNumber = 1;
-			do {
+			while (!p.EndOfData) {
 				string[] cells = { };
 				if (firstLineIsData) {
 					cells = colsWithoutComment;
@@ -179,7 +167,7 @@ namespace TUGraz.VectoCore.Utils
 						string.Format("Line {0}: The data format of a value is not correct. {1}", lineNumber, e.Message), e);
 				}
 				lineNumber++;
-			} while (!p.EndOfData);
+			}
 		}
 
 		/// <summary>
diff --git a/VectoCore/VectoCore/VectoCore.csproj b/VectoCore/VectoCore/VectoCore.csproj
index aae00d06abb7382634365a52ac96303aa8ee38ce..72a0ccda5bb9b2d4c02324f48c836f848d279cab 100644
--- a/VectoCore/VectoCore/VectoCore.csproj
+++ b/VectoCore/VectoCore/VectoCore.csproj
@@ -155,6 +155,7 @@
     <Compile Include="InputData\Reader\Impl\EngineeringModeVectoRunDataFactory.cs" />
     <Compile Include="InputData\Reader\Impl\EngineOnlyVectoRunDataFactory.cs" />
     <Compile Include="InputData\Reader\ShiftPolygonReader.cs" />
+    <Compile Include="Models\Declaration\AuxDemandEntry.cs" />
     <Compile Include="Models\Declaration\AuxiliaryTypeHelper.cs" />
     <Compile Include="Models\Connector\Ports\IDriverDemandPort.cs" />
     <Compile Include="Models\Connector\Ports\IDrivingCyclePort.cs" />
diff --git a/VectoCore/VectoCoreTest/Integration/FuelTypesTest.cs b/VectoCore/VectoCoreTest/Integration/FuelTypesTest.cs
index e5ad5808e80bfa5589bd748d36f6603d706e6e71..4ef4625d9a5a9fca90deb7a9ba6dcc77868baacd 100644
--- a/VectoCore/VectoCoreTest/Integration/FuelTypesTest.cs
+++ b/VectoCore/VectoCoreTest/Integration/FuelTypesTest.cs
@@ -43,16 +43,16 @@ namespace TUGraz.VectoCore.Tests.Integration
 	public class FuelTypesTest
 	{
 		[TestCase(FuelType.DieselCI,
-			@"TestData\Integration\DeclarationMode\Class2_RigidTruck_4x2\Class2_RigidTruck_DECL.vecto", 0, 0.0006886, 9394.4751,
+			@"TestData\Integration\DeclarationMode\Class2_RigidTruck_4x2\Class2_RigidTruck_DECL.vecto", 0, 0.0006886, 9392.6020,
 			TestName = "Diesel LH Low"),
 		TestCase(FuelType.EthanolCI,
-			@"TestData\Integration\DeclarationMode\Class2_RigidTruck_4x2\Class2_RigidTruck_DECL.vecto", 0, 0.00040262, 5588.282,
+			@"TestData\Integration\DeclarationMode\Class2_RigidTruck_4x2\Class2_RigidTruck_DECL.vecto", 0, 0.00040262, 5587.1684,
 			TestName = "Ethanol LH Low"),
 		TestCase(FuelType.DieselCI,
-			@"TestData\Integration\DeclarationMode\Class2_RigidTruck_4x2\Class2_RigidTruck_DECL.vecto", 1, 0.0007971, 10875.0171,
+			@"TestData\Integration\DeclarationMode\Class2_RigidTruck_4x2\Class2_RigidTruck_DECL.vecto", 1, 0.0007971, 10871.1489,
 			TestName = "Diesel LH Ref"),
 		TestCase(FuelType.EthanolCI,
-			@"TestData\Integration\DeclarationMode\Class2_RigidTruck_4x2\Class2_RigidTruck_DECL.vecto", 1, 0.0004660, 6468.9797,
+			@"TestData\Integration\DeclarationMode\Class2_RigidTruck_4x2\Class2_RigidTruck_DECL.vecto", 1, 0.0004660, 6466.6787,
 			TestName = "Ethanol LH Ref"),]
 		public void TestFuelTypesCO2(FuelType fuelType, string jobName, int runIdx, double expectedCo2, double expectedMJ)
 		{
@@ -63,7 +63,10 @@ namespace TUGraz.VectoCore.Tests.Integration
 			var jobContainer = new JobContainer(sumData);
 			var inputData = JSONInputDataFactory.ReadJsonJob(jobName);
 
-			var runsFactory = new SimulatorFactory(ExecutionMode.Declaration, inputData, fileWriter) { WriteModalResults = true, Validate = false};
+			var runsFactory = new SimulatorFactory(ExecutionMode.Declaration, inputData, fileWriter) {
+				WriteModalResults = true,
+				Validate = false
+			};
 
 			jobContainer.AddRuns(runsFactory);
 
diff --git a/VectoCore/VectoCoreTest/Integration/SimulationRuns/MinimalPowertrain.cs b/VectoCore/VectoCoreTest/Integration/SimulationRuns/MinimalPowertrain.cs
index fff3f7d93b238c83a36577876a5727bad032b0fd..c2d71d2899c22398f022107134bbf745dd1975c5 100644
--- a/VectoCore/VectoCoreTest/Integration/SimulationRuns/MinimalPowertrain.cs
+++ b/VectoCore/VectoCoreTest/Integration/SimulationRuns/MinimalPowertrain.cs
@@ -29,284 +29,284 @@
 *   Martin Rexeis, rexeis@ivt.tugraz.at, IVT, Graz University of Technology
 */
 
-using System.Collections.Generic;
-using Microsoft.VisualStudio.TestTools.UnitTesting;
-using TUGraz.VectoCommon.Models;
-using TUGraz.VectoCommon.Utils;
-using TUGraz.VectoCore.Configuration;
-using TUGraz.VectoCore.InputData.Reader;
-using TUGraz.VectoCore.InputData.Reader.ComponentData;
-using TUGraz.VectoCore.Models.Connector.Ports.Impl;
-using TUGraz.VectoCore.Models.Declaration;
-using TUGraz.VectoCore.Models.Simulation.Data;
-using TUGraz.VectoCore.Models.Simulation.Impl;
-using TUGraz.VectoCore.Models.SimulationComponent.Data;
-using TUGraz.VectoCore.Models.SimulationComponent.Data.Gearbox;
-using TUGraz.VectoCore.Models.SimulationComponent.Impl;
-using TUGraz.VectoCore.OutputData;
-using TUGraz.VectoCore.OutputData.FileIO;
-using TUGraz.VectoCore.Tests.Utils;
-using TUGraz.VectoCore.Utils;
-using Wheels = TUGraz.VectoCore.Models.SimulationComponent.Impl.Wheels;
-
-namespace TUGraz.VectoCore.Tests.Integration.SimulationRuns
-{
-	[TestClass]
-	public class MinimalPowertrain
-	{
-		public const string CycleFile = @"TestData\Integration\MinimalPowerTrain\1-Gear-Test-dist.vdri";
-		public const string CycleFileStop = @"TestData\Integration\MinimalPowerTrain\1-Gear-StopTest-dist.vdri";
-		public const string EngineFile = @"TestData\Integration\MinimalPowerTrain\24t Coach.veng";
-		public const string GearboxFile = @"TestData\Integration\MinimalPowerTrain\24t Coach-1Gear.vgbx";
-		public const string GbxLossMap = @"TestData\Integration\MinimalPowerTrain\NoLossGbxMap.vtlm";
-		public const string AccelerationFile = @"TestData\Components\Coach.vacc";
-		public const string AccelerationFile2 = @"TestData\Components\Truck.vacc";
-		public const double Tolerance = 0.001;
-
-		[TestMethod]
-		public void TestWheelsAndEngineInitialize()
-		{
-			var engineData = MockSimulationDataFactory.CreateEngineDataFromFile(EngineFile, 1);
-
-			var vehicleData = CreateVehicleData(3300.SI<Kilogram>());
-
-			var axleGearData = CreateAxleGearData();
-
-			var driverData = CreateDriverData(AccelerationFile);
-
-			var fileWriter = new FileOutputWriter("Coach_MinimalPowertrainOverload");
-			var modData = new ModalDataContainer("Coach_MinimalPowertrainOverload", FuelType.DieselCI, fileWriter);
-			var container = new VehicleContainer(ExecutionMode.Engineering, modData);
-
-			var driver = new Driver(container, driverData, new DefaultDriverStrategy());
-			var engine = new CombustionEngine(container, engineData);
-			driver.AddComponent(new Vehicle(container, vehicleData, CreateAirdragData()))
-				.AddComponent(new Wheels(container, vehicleData.DynamicTyreRadius, vehicleData.WheelsInertia))
-				.AddComponent(new AxleGear(container, axleGearData))
-				.AddComponent(new Clutch(container, engineData))
-				.AddComponent(engine);
-
-			var gbx = new MockGearbox(container);
-
-			var driverPort = driver.OutPort();
-
-			gbx.Gear = 1;
-
-			var response = driverPort.Initialize(18.KMPHtoMeterPerSecond(),
-				VectoMath.InclinationToAngle(2.842372037 / 100));
-
-			Assert.IsInstanceOfType(response, typeof(ResponseSuccess));
-
-			//			time [s] , dist [m] , v_act [km/h] , v_targ [km/h] , acc [m/s²] , grad [%] , n_eng_avg [1/min] , T_eng_fcmap [Nm] , Tq_clutch [Nm] , Tq_full [Nm] , Tq_drag [Nm] , P_eng_out [kW] , P_eng_full [kW] , P_eng_drag [kW] , P_clutch_out [kW] , Pa Eng [kW] , P_aux [kW] , Gear [-] , Ploss GB [kW] , Ploss Diff [kW] , Ploss Retarder [kW] , Pa GB [kW] , Pa Veh [kW] , P_roll [kW] , P_air [kW] , P_slope [kW] , P_wheel_in [kW] , P_brake_loss [kW] , FC-Map [g/h] , FC-AUXc [g/h] , FC-WHTCc [g/h]
-			//			1.5      , 5        , 18           , 18            , 0          , 2.842372 , 964.1117  , 323.7562    , 323.7562       , 2208.664     , -158.0261    , 32.68693    , 222.9902     , -15.95456    , 32.68693       , 0           , 0         , 1        , 0             , 0               , 0                   , 0          , 0           , 5.965827   , 0.2423075 , 26.47879   , 32.68693    , 0           , 7574.113     , -             , -
-
-			AssertHelper.AreRelativeEqual(964.1117.RPMtoRad().Value(), container.Engine.EngineSpeed.Value());
-			Assert.AreEqual(2208.664, engine.PreviousState.StationaryFullLoadTorque.Value(), Tolerance);
-			Assert.AreEqual(-158.0261, engine.PreviousState.FullDragTorque.Value(), Tolerance);
-
-			Assert.AreEqual(323.6485, engine.PreviousState.EngineTorque.Value(), Tolerance);
-		}
-
-		[TestMethod, TestCategory("LongRunning")]
-		public void TestWheelsAndEngine()
-		{
-			NLog.LogManager.DisableLogging();
-			var engineData = MockSimulationDataFactory.CreateEngineDataFromFile(EngineFile, 1);
-			var cycleData = DrivingCycleDataReader.ReadFromFile(CycleFile, CycleType.DistanceBased, false);
-
-			var axleGearData = CreateAxleGearData();
-
-			var vehicleData = CreateVehicleData(3300.SI<Kilogram>());
-
-			var driverData = CreateDriverData(AccelerationFile);
-
-			var fileWriter = new FileOutputWriter("Coach_MinimalPowertrain");
-			var modData = new ModalDataContainer("Coach_MinimalPowertrain", FuelType.DieselCI, fileWriter);
-			var container = new VehicleContainer(ExecutionMode.Engineering, modData);
-
-			var cycle = new DistanceBasedDrivingCycle(container, cycleData);
-
-			cycle.AddComponent(new Driver(container, driverData, new DefaultDriverStrategy()))
-				.AddComponent(new Vehicle(container, vehicleData, CreateAirdragData()))
-				.AddComponent(new Wheels(container, vehicleData.DynamicTyreRadius, vehicleData.WheelsInertia))
-				.AddComponent(new Brakes(container))
-				.AddComponent(new AxleGear(container, axleGearData))
-				.AddComponent(new Clutch(container, engineData))
-				.AddComponent(new CombustionEngine(container, engineData));
-			//engine.IdleController.RequestPort = clutch.IdleControlPort;
-
-			var gbx = new MockGearbox(container);
-
-			var cyclePort = cycle.OutPort();
-
-			cyclePort.Initialize();
-
-			gbx.Gear = 0;
-
-			var absTime = 0.SI<Second>();
-			var ds = Constants.SimulationSettings.DriveOffDistance;
-			var response = cyclePort.Request(absTime, ds);
-			Assert.IsInstanceOfType(response, typeof(ResponseSuccess));
-			container.CommitSimulationStep(absTime, response.SimulationInterval);
-			absTime += response.SimulationInterval;
-
-			gbx.Gear = 1;
-			var cnt = 0;
-			while (!(response is ResponseCycleFinished) && container.Distance < 17000) {
-				response = cyclePort.Request(absTime, ds);
-				response.Switch().
-					Case<ResponseDrivingCycleDistanceExceeded>(r => ds = r.MaxDistance).
-					Case<ResponseCycleFinished>(r => { }).
-					Case<ResponseSuccess>(r => {
-						container.CommitSimulationStep(absTime, r.SimulationInterval);
-						absTime += r.SimulationInterval;
-
-						ds = container.VehicleSpeed.IsEqual(0)
-							? Constants.SimulationSettings.DriveOffDistance
-							: (Constants.SimulationSettings.TargetTimeInterval * container.VehicleSpeed)
-								.Cast<Meter>();
-
-						if (cnt++ % 100 == 0) {
-							modData.Finish(VectoRun.Status.Success);
-						}
-					}).
-					Default(r => Assert.Fail("Unexpected Response: {0}", r));
-			}
-
-			Assert.IsInstanceOfType(response, typeof(ResponseCycleFinished));
-
-			modData.Finish(VectoRun.Status.Success);
-
-			NLog.LogManager.EnableLogging();
-		}
-
-		[TestMethod]
-		public void TestWheelsAndEngineLookahead()
-		{
-			var engineData = MockSimulationDataFactory.CreateEngineDataFromFile(EngineFile, 1);
-			var cycleData = DrivingCycleDataReader.ReadFromFile(CycleFileStop, CycleType.DistanceBased, false);
-
-			var axleGearData = CreateAxleGearData();
-
-			var vehicleData = CreateVehicleData(3300.SI<Kilogram>());
-
-			var driverData = CreateDriverData(AccelerationFile2);
-
-			var fileWriter = new FileOutputWriter("Coach_MinimalPowertrainOverload");
-			var modData = new ModalDataContainer("Coach_MinimalPowertrainOverload", FuelType.DieselCI, fileWriter);
-			var container = new VehicleContainer(ExecutionMode.Engineering, modData);
-
-			var cycle = new DistanceBasedDrivingCycle(container, cycleData);
-			cycle.AddComponent(new Driver(container, driverData, new DefaultDriverStrategy()))
-				.AddComponent(new Vehicle(container, vehicleData, CreateAirdragData()))
-				.AddComponent(new Wheels(container, vehicleData.DynamicTyreRadius, vehicleData.WheelsInertia))
-				.AddComponent(new Brakes(container))
-				.AddComponent(new AxleGear(container, axleGearData))
-				.AddComponent(new Clutch(container, engineData))
-				.AddComponent(new CombustionEngine(container, engineData));
-			//engine.IdleController.RequestPort = clutch.IdleControlPort;
-
-			var gbx = new MockGearbox(container);
-
-			var cyclePort = cycle.OutPort();
-
-			cyclePort.Initialize();
-
-			gbx.Gear = 0;
-
-			var absTime = 0.SI<Second>();
-
-			gbx.Gear = 1;
-			var ds = Constants.SimulationSettings.DriveOffDistance;
-			while (container.Distance < 100) {
-				var response = cyclePort.Request(absTime, ds);
-				response.Switch().
-					Case<ResponseDrivingCycleDistanceExceeded>(r => ds = r.MaxDistance).
-					Case<ResponseSuccess>(r => {
-						container.CommitSimulationStep(absTime, r.SimulationInterval);
-						absTime += r.SimulationInterval;
-
-						ds = container.VehicleSpeed.IsEqual(0)
-							? Constants.SimulationSettings.DriveOffDistance
-							: (Constants.SimulationSettings.TargetTimeInterval * container.VehicleSpeed)
-								.Cast<Meter>();
-
-						modData.Finish(VectoRun.Status.Success);
-					});
-			}
-
-			modData.Finish(VectoRun.Status.Success);
-		}
-
-		private static AxleGearData CreateAxleGearData()
-		{
-			return new AxleGearData() {
-				AxleGear = new GearData {
-					Ratio = 3.0 * 3.5,
-					LossMap = TransmissionLossMapReader.ReadFromFile(GbxLossMap, 3.0 * 3.5, "AxleGear")
-				}
-			};
-		}
-
-		private static VehicleData CreateVehicleData(Kilogram loading)
-		{
-			var axles = new List<Axle> {
-				new Axle {
-					AxleWeightShare = 0.4375,
-					Inertia = 21.66667.SI<KilogramSquareMeter>(),
-					RollResistanceCoefficient = 0.0055,
-					TwinTyres = false,
-					TyreTestLoad = 62538.75.SI<Newton>()
-				},
-				new Axle {
-					AxleWeightShare = 0.375,
-					Inertia = 10.83333.SI<KilogramSquareMeter>(),
-					RollResistanceCoefficient = 0.0065,
-					TwinTyres = true,
-					TyreTestLoad = 52532.55.SI<Newton>()
-				},
-				new Axle {
-					AxleWeightShare = 0.1875,
-					Inertia = 21.66667.SI<KilogramSquareMeter>(),
-					RollResistanceCoefficient = 0.0055,
-					TwinTyres = false,
-					TyreTestLoad = 62538.75.SI<Newton>()
-				}
-			};
-			return new VehicleData {
-				AxleConfiguration = AxleConfiguration.AxleConfig_6x2,
-				
-				CurbWeight = 15700.SI<Kilogram>(),
-				Loading = loading,
-				DynamicTyreRadius = 0.52.SI<Meter>(),
-				AxleData = axles,
-				SavedInDeclarationMode = false
-			};
-		}
-
-		private static AirdragData CreateAirdragData()
-		{
-			return new AirdragData() {
-				CrossWindCorrectionCurve =
-					new CrosswindCorrectionCdxALookup(3.2634.SI<SquareMeter>(),
-						CrossWindCorrectionCurveReader.GetNoCorrectionCurve(3.2634.SI<SquareMeter>()),
-						CrossWindCorrectionMode.NoCorrection),
-			};
-		}
-
-		private static DriverData CreateDriverData(string accelerationFile)
-		{
-			return new DriverData {
-				AccelerationCurve = AccelerationCurveReader.ReadFromFile(accelerationFile),
-				LookAheadCoasting = new DriverData.LACData {
-					Enabled = false,
-					//Deceleration = -0.5.SI<MeterPerSquareSecond>()
-					LookAheadDecisionFactor = new LACDecisionFactor()
-				},
-				OverSpeedEcoRoll = new DriverData.OverSpeedEcoRollData {
-					Mode = DriverMode.Off
-				},
-			};
-		}
-	}
+using System.Collections.Generic;
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+using TUGraz.VectoCommon.Models;
+using TUGraz.VectoCommon.Utils;
+using TUGraz.VectoCore.Configuration;
+using TUGraz.VectoCore.InputData.Reader;
+using TUGraz.VectoCore.InputData.Reader.ComponentData;
+using TUGraz.VectoCore.Models.Connector.Ports.Impl;
+using TUGraz.VectoCore.Models.Declaration;
+using TUGraz.VectoCore.Models.Simulation.Data;
+using TUGraz.VectoCore.Models.Simulation.Impl;
+using TUGraz.VectoCore.Models.SimulationComponent.Data;
+using TUGraz.VectoCore.Models.SimulationComponent.Data.Gearbox;
+using TUGraz.VectoCore.Models.SimulationComponent.Impl;
+using TUGraz.VectoCore.OutputData;
+using TUGraz.VectoCore.OutputData.FileIO;
+using TUGraz.VectoCore.Tests.Utils;
+using TUGraz.VectoCore.Utils;
+using Wheels = TUGraz.VectoCore.Models.SimulationComponent.Impl.Wheels;
+
+namespace TUGraz.VectoCore.Tests.Integration.SimulationRuns
+{
+	[TestClass]
+	public class MinimalPowertrain
+	{
+		public const string CycleFile = @"TestData\Integration\MinimalPowerTrain\1-Gear-Test-dist.vdri";
+		public const string CycleFileStop = @"TestData\Integration\MinimalPowerTrain\1-Gear-StopTest-dist.vdri";
+		public const string EngineFile = @"TestData\Integration\MinimalPowerTrain\24t Coach.veng";
+		public const string GearboxFile = @"TestData\Integration\MinimalPowerTrain\24t Coach-1Gear.vgbx";
+		public const string GbxLossMap = @"TestData\Integration\MinimalPowerTrain\NoLossGbxMap.vtlm";
+		public const string AccelerationFile = @"TestData\Components\Coach.vacc";
+		public const string AccelerationFile2 = @"TestData\Components\Truck.vacc";
+		public const double Tolerance = 0.001;
+
+		[TestMethod]
+		public void TestWheelsAndEngineInitialize()
+		{
+			var engineData = MockSimulationDataFactory.CreateEngineDataFromFile(EngineFile, 1);
+
+			var vehicleData = CreateVehicleData(3300.SI<Kilogram>());
+
+			var axleGearData = CreateAxleGearData();
+
+			var driverData = CreateDriverData(AccelerationFile);
+
+			var fileWriter = new FileOutputWriter("Coach_MinimalPowertrainOverload");
+			var modData = new ModalDataContainer("Coach_MinimalPowertrainOverload", FuelType.DieselCI, fileWriter);
+			var container = new VehicleContainer(ExecutionMode.Engineering, modData);
+
+			var driver = new Driver(container, driverData, new DefaultDriverStrategy());
+			var engine = new CombustionEngine(container, engineData);
+			driver.AddComponent(new Vehicle(container, vehicleData, CreateAirdragData()))
+				.AddComponent(new Wheels(container, vehicleData.DynamicTyreRadius, vehicleData.WheelsInertia))
+				.AddComponent(new AxleGear(container, axleGearData))
+				.AddComponent(new Clutch(container, engineData))
+				.AddComponent(engine);
+
+			var gbx = new MockGearbox(container);
+
+			var driverPort = driver.OutPort();
+
+			gbx.Gear = 1;
+
+			var response = driverPort.Initialize(18.KMPHtoMeterPerSecond(),
+				VectoMath.InclinationToAngle(2.842372037 / 100));
+
+			Assert.IsInstanceOfType(response, typeof(ResponseSuccess));
+
+			//			time [s] , dist [m] , v_act [km/h] , v_targ [km/h] , acc [m/s²] , grad [%] , n_eng_avg [1/min] , T_eng_fcmap [Nm] , Tq_clutch [Nm] , Tq_full [Nm] , Tq_drag [Nm] , P_eng_out [kW] , P_eng_full [kW] , P_eng_drag [kW] , P_clutch_out [kW] , Pa Eng [kW] , P_aux [kW] , Gear [-] , Ploss GB [kW] , Ploss Diff [kW] , Ploss Retarder [kW] , Pa GB [kW] , Pa Veh [kW] , P_roll [kW] , P_air [kW] , P_slope [kW] , P_wheel_in [kW] , P_brake_loss [kW] , FC-Map [g/h] , FC-AUXc [g/h] , FC-WHTCc [g/h]
+			//			1.5      , 5        , 18           , 18            , 0          , 2.842372 , 964.1117  , 323.7562    , 323.7562       , 2208.664     , -158.0261    , 32.68693    , 222.9902     , -15.95456    , 32.68693       , 0           , 0         , 1        , 0             , 0               , 0                   , 0          , 0           , 5.965827   , 0.2423075 , 26.47879   , 32.68693    , 0           , 7574.113     , -             , -
+
+			AssertHelper.AreRelativeEqual(964.1117.RPMtoRad().Value(), container.Engine.EngineSpeed.Value());
+			Assert.AreEqual(2208.664, engine.PreviousState.StationaryFullLoadTorque.Value(), Tolerance);
+			Assert.AreEqual(-158.0261, engine.PreviousState.FullDragTorque.Value(), Tolerance);
+
+			Assert.AreEqual(323.6485, engine.PreviousState.EngineTorque.Value(), Tolerance);
+		}
+
+		[TestMethod, TestCategory("LongRunning")]
+		public void TestWheelsAndEngine()
+		{
+			NLog.LogManager.DisableLogging();
+			var engineData = MockSimulationDataFactory.CreateEngineDataFromFile(EngineFile, 1);
+			var cycleData = DrivingCycleDataReader.ReadFromFile(CycleFile, CycleType.DistanceBased, false);
+
+			var axleGearData = CreateAxleGearData();
+
+			var vehicleData = CreateVehicleData(3300.SI<Kilogram>());
+
+			var driverData = CreateDriverData(AccelerationFile);
+
+			var fileWriter = new FileOutputWriter("Coach_MinimalPowertrain");
+			var modData = new ModalDataContainer("Coach_MinimalPowertrain", FuelType.DieselCI, fileWriter);
+			var container = new VehicleContainer(ExecutionMode.Engineering, modData);
+
+			var cycle = new DistanceBasedDrivingCycle(container, cycleData);
+
+			cycle.AddComponent(new Driver(container, driverData, new DefaultDriverStrategy()))
+				.AddComponent(new Vehicle(container, vehicleData, CreateAirdragData()))
+				.AddComponent(new Wheels(container, vehicleData.DynamicTyreRadius, vehicleData.WheelsInertia))
+				.AddComponent(new Brakes(container))
+				.AddComponent(new AxleGear(container, axleGearData))
+				.AddComponent(new Clutch(container, engineData))
+				.AddComponent(new CombustionEngine(container, engineData));
+			//engine.IdleController.RequestPort = clutch.IdleControlPort;
+
+			var gbx = new MockGearbox(container);
+
+			var cyclePort = cycle.OutPort();
+
+			cyclePort.Initialize();
+
+			gbx.Gear = 0;
+
+			var absTime = 0.SI<Second>();
+			var ds = Constants.SimulationSettings.DriveOffDistance;
+			var response = cyclePort.Request(absTime, ds);
+			Assert.IsInstanceOfType(response, typeof(ResponseSuccess));
+			container.CommitSimulationStep(absTime, response.SimulationInterval);
+			absTime += response.SimulationInterval;
+
+			gbx.Gear = 1;
+			var cnt = 0;
+			while (!(response is ResponseCycleFinished) && container.Distance < 17000) {
+				response = cyclePort.Request(absTime, ds);
+				response.Switch().
+					Case<ResponseDrivingCycleDistanceExceeded>(r => ds = r.MaxDistance).
+					Case<ResponseCycleFinished>(r => { }).
+					Case<ResponseSuccess>(r => {
+						container.CommitSimulationStep(absTime, r.SimulationInterval);
+						absTime += r.SimulationInterval;
+
+						ds = container.VehicleSpeed.IsEqual(0)
+							? Constants.SimulationSettings.DriveOffDistance
+							: (Constants.SimulationSettings.TargetTimeInterval * container.VehicleSpeed)
+								.Cast<Meter>();
+
+						if (cnt++ % 100 == 0) {
+							modData.Finish(VectoRun.Status.Success);
+						}
+					}).
+					Default(r => Assert.Fail("Unexpected Response: {0}", r));
+			}
+
+			Assert.IsInstanceOfType(response, typeof(ResponseCycleFinished));
+
+			modData.Finish(VectoRun.Status.Success);
+
+			NLog.LogManager.EnableLogging();
+		}
+
+		[TestMethod]
+		public void TestWheelsAndEngineLookahead()
+		{
+			var engineData = MockSimulationDataFactory.CreateEngineDataFromFile(EngineFile, 1);
+			var cycleData = DrivingCycleDataReader.ReadFromFile(CycleFileStop, CycleType.DistanceBased, false);
+
+			var axleGearData = CreateAxleGearData();
+
+			var vehicleData = CreateVehicleData(3300.SI<Kilogram>());
+
+			var driverData = CreateDriverData(AccelerationFile2);
+
+			var fileWriter = new FileOutputWriter("Coach_MinimalPowertrainOverload");
+			var modData = new ModalDataContainer("Coach_MinimalPowertrainOverload", FuelType.DieselCI, fileWriter);
+			var container = new VehicleContainer(ExecutionMode.Engineering, modData);
+
+			var cycle = new DistanceBasedDrivingCycle(container, cycleData);
+			cycle.AddComponent(new Driver(container, driverData, new DefaultDriverStrategy()))
+				.AddComponent(new Vehicle(container, vehicleData, CreateAirdragData()))
+				.AddComponent(new Wheels(container, vehicleData.DynamicTyreRadius, vehicleData.WheelsInertia))
+				.AddComponent(new Brakes(container))
+				.AddComponent(new AxleGear(container, axleGearData))
+				.AddComponent(new Clutch(container, engineData))
+				.AddComponent(new CombustionEngine(container, engineData));
+			//engine.IdleController.RequestPort = clutch.IdleControlPort;
+
+			var gbx = new MockGearbox(container);
+
+			var cyclePort = cycle.OutPort();
+
+			cyclePort.Initialize();
+
+			gbx.Gear = 0;
+
+			var absTime = 0.SI<Second>();
+
+			gbx.Gear = 1;
+			var ds = Constants.SimulationSettings.DriveOffDistance;
+			while (container.Distance < 100) {
+				var response = cyclePort.Request(absTime, ds);
+				response.Switch().
+					Case<ResponseDrivingCycleDistanceExceeded>(r => ds = r.MaxDistance).
+					Case<ResponseSuccess>(r => {
+						container.CommitSimulationStep(absTime, r.SimulationInterval);
+						absTime += r.SimulationInterval;
+
+						ds = container.VehicleSpeed.IsEqual(0)
+							? Constants.SimulationSettings.DriveOffDistance
+							: (Constants.SimulationSettings.TargetTimeInterval * container.VehicleSpeed)
+								.Cast<Meter>();
+
+						modData.Finish(VectoRun.Status.Success);
+					});
+			}
+
+			modData.Finish(VectoRun.Status.Success);
+		}
+
+		private static AxleGearData CreateAxleGearData()
+		{
+			return new AxleGearData() {
+				AxleGear = new GearData {
+					Ratio = 3.0 * 3.5,
+					LossMap = TransmissionLossMapReader.ReadFromFile(GbxLossMap, 3.0 * 3.5, "AxleGear")
+				}
+			};
+		}
+
+		private static VehicleData CreateVehicleData(Kilogram loading)
+		{
+			var axles = new List<Axle> {
+				new Axle {
+					AxleWeightShare = 0.4375,
+					Inertia = 21.66667.SI<KilogramSquareMeter>(),
+					RollResistanceCoefficient = 0.0055,
+					TwinTyres = false,
+					TyreTestLoad = 62538.75.SI<Newton>()
+				},
+				new Axle {
+					AxleWeightShare = 0.375,
+					Inertia = 10.83333.SI<KilogramSquareMeter>(),
+					RollResistanceCoefficient = 0.0065,
+					TwinTyres = true,
+					TyreTestLoad = 52532.55.SI<Newton>()
+				},
+				new Axle {
+					AxleWeightShare = 0.1875,
+					Inertia = 21.66667.SI<KilogramSquareMeter>(),
+					RollResistanceCoefficient = 0.0055,
+					TwinTyres = false,
+					TyreTestLoad = 62538.75.SI<Newton>()
+				}
+			};
+			return new VehicleData {
+				AxleConfiguration = AxleConfiguration.AxleConfig_6x2,
+				
+				CurbWeight = 15700.SI<Kilogram>(),
+				Loading = loading,
+				DynamicTyreRadius = 0.52.SI<Meter>(),
+				AxleData = axles,
+				SavedInDeclarationMode = false
+			};
+		}
+
+		private static AirdragData CreateAirdragData()
+		{
+			return new AirdragData() {
+				CrossWindCorrectionCurve =
+					new CrosswindCorrectionCdxALookup(3.2634.SI<SquareMeter>(),
+						CrossWindCorrectionCurveReader.GetNoCorrectionCurve(3.2634.SI<SquareMeter>()),
+						CrossWindCorrectionMode.NoCorrection),
+			};
+		}
+
+		private static DriverData CreateDriverData(string accelerationFile)
+		{
+			return new DriverData {
+				AccelerationCurve = AccelerationCurveReader.ReadFromFile(accelerationFile),
+				LookAheadCoasting = new DriverData.LACData {
+					Enabled = false,
+					//Deceleration = -0.5.SI<MeterPerSquareSecond>()
+					LookAheadDecisionFactor = new LACDecisionFactor()
+				},
+				OverSpeedEcoRoll = new DriverData.OverSpeedEcoRollData {
+					Mode = DriverMode.Off
+				},
+			};
+		}
+	}
 }
\ No newline at end of file
diff --git a/VectoCore/VectoCoreTest/Integration/TestVehicleIdlingSpeed.cs b/VectoCore/VectoCoreTest/Integration/TestVehicleIdlingSpeed.cs
index f1191b9578a4c9904b762065ecc3c0a119a47f59..9064af1ace2c46e4b6fa88ade1c48fb1bad020f3 100644
--- a/VectoCore/VectoCoreTest/Integration/TestVehicleIdlingSpeed.cs
+++ b/VectoCore/VectoCoreTest/Integration/TestVehicleIdlingSpeed.cs
@@ -50,7 +50,7 @@ namespace TUGraz.VectoCore.Tests.Integration
 	{
 		const string SampleVehicleDecl = "TestData/XML/XMLReaderDeclaration/vecto_vehicle-sample.xml";
 
-		[TestMethod]
+		[TestMethod, TestCategory("LongRunning")]
 		public void VehicleIdlingSpeedTest()
 		{
 			var VehicleEngineIdleSpeed = 900.RPMtoRad();
diff --git a/VectoCore/VectoCoreTest/Integration/TorqueLimitsTest.cs b/VectoCore/VectoCoreTest/Integration/TorqueLimitsTest.cs
index b48ca55f2411ad6ff81ce60b2963588cf4b0ffad..32dfcb7c3e85c05a7eea80837d13cbfdf237f612 100644
--- a/VectoCore/VectoCoreTest/Integration/TorqueLimitsTest.cs
+++ b/VectoCore/VectoCoreTest/Integration/TorqueLimitsTest.cs
@@ -169,12 +169,12 @@ namespace TUGraz.VectoCore.Tests.Integration
 			// check last gear - limited by vehicle 
 			Assert.AreEqual(850, engineData.FullLoadCurves[6].MaxTorque.Value());
 			Assert.AreEqual(-115, engineData.FullLoadCurves[6].MaxDragTorque.Value());
-		}
-
-		[TestCase(GearboxLimitJobDecl_800),
-		TestCase(GearboxLimitJobDecl_865),
-		TestCase(VehicleLimitJobDecl_850),
-		TestCase(VehicleLimitJobDecl_910)]
+		}
+
+		[TestCase(GearboxLimitJobDecl_800),
+		TestCase(GearboxLimitJobDecl_865),
+		TestCase(VehicleLimitJobDecl_850),
+		TestCase(VehicleLimitJobDecl_910), Category("LongRunning")]
 		public void TestRunTorqueLimitedSimulations(string file)
 		{
 			var fileWriter = new FileOutputWriter(file);
@@ -194,7 +194,7 @@ namespace TUGraz.VectoCore.Tests.Integration
 			Assert.IsTrue(jobContainer.Runs.All(r => r.Success), string.Concat(jobContainer.Runs.Select(r => r.ExecException)));
 		}
 
-		[TestCase(GearboxSpeedLimitJobDecl)]
+		[TestCategory("LongRunning"), TestCase(GearboxSpeedLimitJobDecl)]
 		public void TestRunGbxSpeedLimitedSimulations(string file)
 		{
 			var fileWriter = new FileOutputWriter(file);
@@ -215,7 +215,7 @@ namespace TUGraz.VectoCore.Tests.Integration
 			Assert.IsTrue(jobContainer.Runs.All(r => r.Success), string.Concat(jobContainer.Runs.Select(r => r.ExecException)));
 		}
 
-		[TestCase(EngineSpeedLimitJobDecl)]
+		[TestCase(EngineSpeedLimitJobDecl), Category("LongRunning")]
 		public void TestRunEngineSpeedLimitedSimulations(string file)
 		{
 			var fileWriter = new FileOutputWriter(file);
diff --git a/VectoCore/VectoCoreTest/Models/Declaration/DataAdapter/DeclarationDataAdapterTest_Class2.cs b/VectoCore/VectoCoreTest/Models/Declaration/DataAdapter/DeclarationDataAdapterTest_Class2.cs
index 46a595b612fa110680a87a9dad37bc022de5cc38..d49e9214356a6bd6a69692529f04fa22c0606c12 100644
--- a/VectoCore/VectoCoreTest/Models/Declaration/DataAdapter/DeclarationDataAdapterTest_Class2.cs
+++ b/VectoCore/VectoCoreTest/Models/Declaration/DataAdapter/DeclarationDataAdapterTest_Class2.cs
@@ -29,124 +29,124 @@
 *   Martin Rexeis, rexeis@ivt.tugraz.at, IVT, Graz University of Technology
 */
 
-using System.Linq;
-using NUnit.Framework;
-using TUGraz.VectoCommon.InputData;
-using TUGraz.VectoCommon.Models;
-using TUGraz.VectoCore.InputData.FileIO.JSON;
-using TUGraz.VectoCore.InputData.Reader.Impl;
-using TUGraz.VectoCore.Models.Declaration;
-using TUGraz.VectoCore.Models.SimulationComponent.Data;
-using Assert = Microsoft.VisualStudio.TestTools.UnitTesting.Assert;
-
-namespace TUGraz.VectoCore.Tests.Models.Declaration.DataAdapter
-{
-	[TestFixture]
-	public class DeclarationDataAdapterTest_Class2
-	{
-		public const string Class2RigidTruckNoEMSJob =
-			@"TestData\Integration\DeclarationMode\Class2_RigidTruck_4x2\Class2_RigidTruck_DECL.vecto";
-
-		public const int CurbWeight = 4670;
-		public const double CdxA = 4.83;
-
-		[TestCase(Class2RigidTruckNoEMSJob, 0)]
-		public void TestClass2_Vehicle_LongHaul_LowLoad(string file, int runIdx)
-		{
-			var runData = DeclarationAdapterTestHelper.CreateVectoRunData(file);
-
-			Assert.AreEqual(6, runData.Length);
-
-			// long haul, min load
-			DeclarationAdapterTestHelper.AssertVehicleData(runData[runIdx].VehicleData, runData[runIdx].AirdragData,
-				vehicleCategory: VehicleCategory.RigidTruck,
-				vehicleClass: VehicleClass.Class2,
-				axleConfiguration: AxleConfiguration.AxleConfig_4x2,
-				wheelsInertia: 57,
-				totalVehicleWeight: CurbWeight + 1900 + 3400 + 603.917 + 710,
-				totalRollResistance: 0.006954,
-				aerodynamicDragArea: CdxA + 1.3);
-		}
-
-		[TestCase(Class2RigidTruckNoEMSJob, 1)]
-		public void TestClass2_Vehicle_LongHaul_RefLoad(string file, int runIdx)
-		{
-			var runData = DeclarationAdapterTestHelper.CreateVectoRunData(file);
-
-			// long haul, ref load
-			DeclarationAdapterTestHelper.AssertVehicleData(runData[runIdx].VehicleData, runData[runIdx].AirdragData,
-				vehicleCategory: VehicleCategory.RigidTruck,
-				vehicleClass: VehicleClass.Class2,
-				axleConfiguration: AxleConfiguration.AxleConfig_4x2,
-				wheelsInertia: 57,
-				totalVehicleWeight: CurbWeight + 1900 + 3400 + 4541.176 + 5325,
-				totalRollResistance: 0.0065733,
-				aerodynamicDragArea: CdxA + 1.3);
-		}
-
-
-		[TestCase(Class2RigidTruckNoEMSJob, 2)]
-		public void TestClass2_Vehicle_RegionalDel_LowLoad(string file, int runIdx)
-		{
-			var runData = DeclarationAdapterTestHelper.CreateVectoRunData(file);
-
-			// regional del., min load
-			DeclarationAdapterTestHelper.AssertVehicleData(runData[runIdx].VehicleData, runData[runIdx].AirdragData,
-				vehicleCategory: VehicleCategory.RigidTruck,
-				vehicleClass: VehicleClass.Class2,
-				axleConfiguration: AxleConfiguration.AxleConfig_4x2,
-				wheelsInertia: 39,
-				totalVehicleWeight: CurbWeight + 1900 + 603.917,
-				totalRollResistance: 0.007461,
-				aerodynamicDragArea: CdxA);
-		}
-
-		[TestCase(Class2RigidTruckNoEMSJob, 3)]
-		public void TestClass2_Vehicle_RegionalDel_RefLoad(string file, int runIdx)
-		{
-			var runData = DeclarationAdapterTestHelper.CreateVectoRunData(file);
-
-			// regional del., ref load
-			DeclarationAdapterTestHelper.AssertVehicleData(runData[runIdx].VehicleData, runData[runIdx].AirdragData,
-				vehicleCategory: VehicleCategory.RigidTruck,
-				vehicleClass: VehicleClass.Class2,
-				axleConfiguration: AxleConfiguration.AxleConfig_4x2,
-				wheelsInertia: 39,
-				totalVehicleWeight: CurbWeight + 1900 + 3019.588,
-				totalRollResistance: 0.007248,
-				aerodynamicDragArea: CdxA);
-		}
-
-
-		[TestCase(Class2RigidTruckNoEMSJob, 4)]
-		public void TestClass2_Vehicle_UrbanDel_LowLoad(string file, int runIdx)
-		{
-			var runData = DeclarationAdapterTestHelper.CreateVectoRunData(file);
-			// municipal, min load
-			DeclarationAdapterTestHelper.AssertVehicleData(runData[runIdx].VehicleData, runData[runIdx].AirdragData,
-				vehicleCategory: VehicleCategory.RigidTruck,
-				vehicleClass: VehicleClass.Class2,
-				axleConfiguration: AxleConfiguration.AxleConfig_4x2,
-				wheelsInertia: 39,
-				totalVehicleWeight: CurbWeight + 1900 + 603.917,
-				totalRollResistance: 0.007461,
-				aerodynamicDragArea: CdxA);
-		}
-
-		[TestCase(Class2RigidTruckNoEMSJob, 5)]
-		public void TestClass2_Vehicle_UrbanDel_RefLoad(string file, int runIdx)
-		{
-			var runData = DeclarationAdapterTestHelper.CreateVectoRunData(file);
-
-			// municipal, min load
-			DeclarationAdapterTestHelper.AssertVehicleData(runData[runIdx].VehicleData, runData[runIdx].AirdragData,
-				vehicleCategory: VehicleCategory.RigidTruck,
-				vehicleClass: VehicleClass.Class2,
-				axleConfiguration: AxleConfiguration.AxleConfig_4x2,
-				wheelsInertia: 39,
-				totalVehicleWeight: CurbWeight + 1900 + 3019.588,
-				totalRollResistance: 0.007248,
-				aerodynamicDragArea: CdxA);
-		}
-	}
+using System.Linq;
+using NUnit.Framework;
+using TUGraz.VectoCommon.InputData;
+using TUGraz.VectoCommon.Models;
+using TUGraz.VectoCore.InputData.FileIO.JSON;
+using TUGraz.VectoCore.InputData.Reader.Impl;
+using TUGraz.VectoCore.Models.Declaration;
+using TUGraz.VectoCore.Models.SimulationComponent.Data;
+using Assert = Microsoft.VisualStudio.TestTools.UnitTesting.Assert;
+
+namespace TUGraz.VectoCore.Tests.Models.Declaration.DataAdapter
+{
+	[TestFixture]
+	public class DeclarationDataAdapterTest_Class2
+	{
+		public const string Class2RigidTruckNoEMSJob =
+			@"TestData\Integration\DeclarationMode\Class2_RigidTruck_4x2\Class2_RigidTruck_DECL.vecto";
+
+		public const int CurbWeight = 4670;
+		public const double CdxA = 4.83;
+
+		[TestCase(Class2RigidTruckNoEMSJob, 0)]
+		public void TestClass2_Vehicle_LongHaul_LowLoad(string file, int runIdx)
+		{
+			var runData = DeclarationAdapterTestHelper.CreateVectoRunData(file);
+
+			Assert.AreEqual(6, runData.Length);
+
+			// long haul, min load
+			DeclarationAdapterTestHelper.AssertVehicleData(runData[runIdx].VehicleData, runData[runIdx].AirdragData,
+				vehicleCategory: VehicleCategory.RigidTruck,
+				vehicleClass: VehicleClass.Class2,
+				axleConfiguration: AxleConfiguration.AxleConfig_4x2,
+				wheelsInertia: 57,
+				totalVehicleWeight: CurbWeight + 1900 + 3400 + 603.917 + 700,
+				totalRollResistance: 0.0069554,
+				aerodynamicDragArea: CdxA + 1.3);
+		}
+
+		[TestCase(Class2RigidTruckNoEMSJob, 1)]
+		public void TestClass2_Vehicle_LongHaul_RefLoad(string file, int runIdx)
+		{
+			var runData = DeclarationAdapterTestHelper.CreateVectoRunData(file);
+
+			// long haul, ref load
+			DeclarationAdapterTestHelper.AssertVehicleData(runData[runIdx].VehicleData, runData[runIdx].AirdragData,
+				vehicleCategory: VehicleCategory.RigidTruck,
+				vehicleClass: VehicleClass.Class2,
+				axleConfiguration: AxleConfiguration.AxleConfig_4x2,
+				wheelsInertia: 57,
+				totalVehicleWeight: CurbWeight + 1900 + 3400 + 4541.176 + 5300,
+				totalRollResistance: 0.0065733,
+				aerodynamicDragArea: CdxA + 1.3);
+		}
+
+
+		[TestCase(Class2RigidTruckNoEMSJob, 2)]
+		public void TestClass2_Vehicle_RegionalDel_LowLoad(string file, int runIdx)
+		{
+			var runData = DeclarationAdapterTestHelper.CreateVectoRunData(file);
+
+			// regional del., min load
+			DeclarationAdapterTestHelper.AssertVehicleData(runData[runIdx].VehicleData, runData[runIdx].AirdragData,
+				vehicleCategory: VehicleCategory.RigidTruck,
+				vehicleClass: VehicleClass.Class2,
+				axleConfiguration: AxleConfiguration.AxleConfig_4x2,
+				wheelsInertia: 39,
+				totalVehicleWeight: CurbWeight + 1900 + 603.917,
+				totalRollResistance: 0.007461,
+				aerodynamicDragArea: CdxA);
+		}
+
+		[TestCase(Class2RigidTruckNoEMSJob, 3)]
+		public void TestClass2_Vehicle_RegionalDel_RefLoad(string file, int runIdx)
+		{
+			var runData = DeclarationAdapterTestHelper.CreateVectoRunData(file);
+
+			// regional del., ref load
+			DeclarationAdapterTestHelper.AssertVehicleData(runData[runIdx].VehicleData, runData[runIdx].AirdragData,
+				vehicleCategory: VehicleCategory.RigidTruck,
+				vehicleClass: VehicleClass.Class2,
+				axleConfiguration: AxleConfiguration.AxleConfig_4x2,
+				wheelsInertia: 39,
+				totalVehicleWeight: CurbWeight + 1900 + 3019.588,
+				totalRollResistance: 0.007248,
+				aerodynamicDragArea: CdxA);
+		}
+
+
+		[TestCase(Class2RigidTruckNoEMSJob, 4)]
+		public void TestClass2_Vehicle_UrbanDel_LowLoad(string file, int runIdx)
+		{
+			var runData = DeclarationAdapterTestHelper.CreateVectoRunData(file);
+			// municipal, min load
+			DeclarationAdapterTestHelper.AssertVehicleData(runData[runIdx].VehicleData, runData[runIdx].AirdragData,
+				vehicleCategory: VehicleCategory.RigidTruck,
+				vehicleClass: VehicleClass.Class2,
+				axleConfiguration: AxleConfiguration.AxleConfig_4x2,
+				wheelsInertia: 39,
+				totalVehicleWeight: CurbWeight + 1900 + 603.917,
+				totalRollResistance: 0.007461,
+				aerodynamicDragArea: CdxA);
+		}
+
+		[TestCase(Class2RigidTruckNoEMSJob, 5)]
+		public void TestClass2_Vehicle_UrbanDel_RefLoad(string file, int runIdx)
+		{
+			var runData = DeclarationAdapterTestHelper.CreateVectoRunData(file);
+
+			// municipal, min load
+			DeclarationAdapterTestHelper.AssertVehicleData(runData[runIdx].VehicleData, runData[runIdx].AirdragData,
+				vehicleCategory: VehicleCategory.RigidTruck,
+				vehicleClass: VehicleClass.Class2,
+				axleConfiguration: AxleConfiguration.AxleConfig_4x2,
+				wheelsInertia: 39,
+				totalVehicleWeight: CurbWeight + 1900 + 3019.588,
+				totalRollResistance: 0.007248,
+				aerodynamicDragArea: CdxA);
+		}
+	}
 }
\ No newline at end of file
diff --git a/VectoCore/VectoCoreTest/Models/Declaration/DeclarationDataTest.cs b/VectoCore/VectoCoreTest/Models/Declaration/DeclarationDataTest.cs
index ffb5f6d5dfca18bda17ec7e5907414defe6cc607..2cbefe109537a88b22d4cf587dfb82473826b293 100644
--- a/VectoCore/VectoCoreTest/Models/Declaration/DeclarationDataTest.cs
+++ b/VectoCore/VectoCoreTest/Models/Declaration/DeclarationDataTest.cs
@@ -269,8 +269,9 @@ namespace TUGraz.VectoCore.Tests.Models.Declaration
 		public void CrossWindAreaCdxANotSet_Other()
 		{
 			foreach (var correctionMode in EnumHelper.GetValues<CrossWindCorrectionMode>()) {
-				if (correctionMode == CrossWindCorrectionMode.DeclarationModeCorrection)
+				if (correctionMode == CrossWindCorrectionMode.DeclarationModeCorrection) {
 					continue;
+				}
 
 				var airDrag = new AirdragData {
 					CrossWindCorrectionMode = correctionMode,
@@ -295,7 +296,8 @@ namespace TUGraz.VectoCore.Tests.Models.Declaration
 		TestCase(MissionType.Construction, "Standard technology - LED headlights, all", 950, 0.7),]
 		public void AuxElectricSystemTest(MissionType mission, string technology, double value, double efficiency)
 		{
-			AssertHelper.AreRelativeEqual(value / efficiency, DeclarationData.ElectricSystem.Lookup(mission, technology));
+			AssertHelper.AreRelativeEqual(value / efficiency,
+				DeclarationData.ElectricSystem.Lookup(mission, technology).PowerDemand.Value());
 		}
 
 		[TestCase(MissionType.Interurban, "Standard technology"),
@@ -317,7 +319,7 @@ namespace TUGraz.VectoCore.Tests.Models.Declaration
 		TestCase("only one engaged gearwheel above oil level", 0)]
 		public void AuxPTOTransmissionTest(string technology, double value)
 		{
-			AssertHelper.AreRelativeEqual(value, DeclarationData.PTOTransmission.Lookup(technology));
+			AssertHelper.AreRelativeEqual(value, DeclarationData.PTOTransmission.Lookup(technology).PowerDemand.Value());
 		}
 
 		[TestCase("Superfluid")]
@@ -343,8 +345,8 @@ namespace TUGraz.VectoCore.Tests.Models.Declaration
 		public void AuxFanTechTest(string technology, int[] expected)
 		{
 			for (var i = 0; i < _missions.Length; i++) {
-				var value = DeclarationData.Fan.Lookup(_missions[i], technology);
-				Assert.AreEqual(expected[i], value.Value(), Tolerance);
+				var lookup = DeclarationData.Fan.Lookup(_missions[i], technology);
+				Assert.AreEqual(expected[i], lookup.PowerDemand.Value(), Tolerance);
 			}
 		}
 
@@ -372,7 +374,8 @@ namespace TUGraz.VectoCore.Tests.Models.Declaration
 			for (var i = 0; i < expected.Length; i++) {
 				if (expected[i] > 0) {
 					AssertHelper.AreRelativeEqual(expected[i],
-						DeclarationData.HeatingVentilationAirConditioning.Lookup(_missions[i], "Default", vehicleClass));
+						DeclarationData.HeatingVentilationAirConditioning.Lookup(_missions[i], "Default", vehicleClass)
+							.PowerDemand.Value());
 				} else {
 					var i1 = i;
 					AssertHelper.Exception<VectoException>(
@@ -395,7 +398,7 @@ namespace TUGraz.VectoCore.Tests.Models.Declaration
 		{
 			for (var i = 0; i < expected.Length; i++) {
 				AssertHelper.AreRelativeEqual(expected[i],
-					DeclarationData.HeatingVentilationAirConditioning.Lookup(_missions[i], "None", vehicleClass));
+					DeclarationData.HeatingVentilationAirConditioning.Lookup(_missions[i], "None", vehicleClass).PowerDemand.Value());
 			}
 		}
 
@@ -442,8 +445,8 @@ namespace TUGraz.VectoCore.Tests.Models.Declaration
 		public void AuxPneumaticSystemTest(string technology, int[] expected)
 		{
 			for (var i = 0; i < _missions.Length; i++) {
-				var value = DeclarationData.PneumaticSystem.Lookup(_missions[i], technology);
-				AssertHelper.AreRelativeEqual(expected[i], value);
+				var lookup = DeclarationData.PneumaticSystem.Lookup(_missions[i], technology);
+				AssertHelper.AreRelativeEqual(expected[i], lookup.PowerDemand.Value());
 			}
 		}
 
@@ -502,6 +505,27 @@ namespace TUGraz.VectoCore.Tests.Models.Declaration
 					new[] { axle1, axle2, axle3, axle4 }.TakeWhile(a => a != null).ToArray()));
 		}
 
+		[TestCase]
+		public void Aux_SteeringpumpMultipleLookups()
+		{
+			// testcase to illustrate modification of lookup-data for steering pump
+			const string axle1 = "Electric";
+			const MissionType mission = MissionType.LongHaul;
+			const VehicleClass hdvClass = VehicleClass.Class5;
+			var first = DeclarationData.SteeringPump.Lookup(mission, hdvClass,
+				new[] { axle1 }.TakeWhile(a => a != null).ToArray());
+
+			for (var i = 0; i < 10; i++) {
+				DeclarationData.SteeringPump.Lookup(mission, hdvClass,
+					new[] { axle1 }.TakeWhile(a => a != null).ToArray());
+			}
+
+			var last = DeclarationData.SteeringPump.Lookup(mission, hdvClass,
+				new[] { axle1 }.TakeWhile(a => a != null).ToArray());
+
+			Assert.AreEqual(first.Value(), last.Value(), 1e-3);
+		}
+
 		[TestCase(MissionType.LongHaul, VehicleClass.Class1, "Dual displacement",
 			TestName = "Aux_SteeringPumpLookupFail( No Value )"),
 		TestCase(MissionType.RegionalDelivery, VehicleClass.Class2, "Super displacement",
@@ -526,11 +550,11 @@ namespace TUGraz.VectoCore.Tests.Models.Declaration
 		public void SegmentWeightOutOfRange4X2(double weight)
 		{
 			AssertHelper.Exception<VectoException>(() =>
-					DeclarationData.Segments.Lookup(
-						VehicleCategory.RigidTruck,
-						AxleConfiguration.AxleConfig_4x2,
-						weight.SI<Kilogram>(),
-						0.SI<Kilogram>()),
+				DeclarationData.Segments.Lookup(
+					VehicleCategory.RigidTruck,
+					AxleConfiguration.AxleConfig_4x2,
+					weight.SI<Kilogram>(),
+					0.SI<Kilogram>()),
 				"Gross vehicle mass must be greater than 7.5 tons");
 		}
 
@@ -543,11 +567,11 @@ namespace TUGraz.VectoCore.Tests.Models.Declaration
 		public void SegmentWeightOutOfRange4X4(double weight)
 		{
 			AssertHelper.Exception<VectoException>(() =>
-					DeclarationData.Segments.Lookup(
-						VehicleCategory.RigidTruck,
-						AxleConfiguration.AxleConfig_4x4,
-						weight.SI<Kilogram>(),
-						0.SI<Kilogram>()),
+				DeclarationData.Segments.Lookup(
+					VehicleCategory.RigidTruck,
+					AxleConfiguration.AxleConfig_4x4,
+					weight.SI<Kilogram>(),
+					0.SI<Kilogram>()),
 				"Gross vehicle mass must be greater than 7.5 tons");
 		}
 
@@ -774,8 +798,8 @@ namespace TUGraz.VectoCore.Tests.Models.Declaration
 				bodyCurbWeight: 1900,
 				trailerCurbWeight: new[] { 3400.0 },
 				trailerType: new[] { TrailerType.T1 },
-				lowLoad: 1306.8235,
-				refLoad: 9813.2353,
+				lowLoad: 1296.8235,
+				refLoad: 9450,
 				trailerGrossVehicleWeight: new[] { 10500.0 },
 				deltaCdA: 1.3,
 				maxLoad: 11250);
@@ -813,6 +837,80 @@ namespace TUGraz.VectoCore.Tests.Models.Declaration
 				maxLoad: 4150);
 		}
 
+
+		/// <summary>
+		/// trailer in longhaul, always pc formula
+		/// </summary>
+		[TestCase]
+		public void Segment2TestHeavy()
+		{
+			var vehicleData = new {
+				VehicleCategory = VehicleCategory.RigidTruck,
+				AxleConfiguration = AxleConfiguration.AxleConfig_4x2,
+				GrossVehicleMassRating = 11990.SI<Kilogram>(),
+				CurbWeight = 9500.SI<Kilogram>()
+			};
+
+			var segment = DeclarationData.Segments.Lookup(vehicleData.VehicleCategory, vehicleData.AxleConfiguration,
+				vehicleData.GrossVehicleMassRating, vehicleData.CurbWeight);
+
+			Assert.AreEqual(VehicleClass.Class2, segment.VehicleClass);
+
+			var data = AccelerationCurveReader.ReadFromStream(segment.AccelerationFile);
+			TestAcceleration(data);
+
+			Assert.AreEqual(3, segment.Missions.Length);
+
+			AssertMission(segment.Missions[0],
+				vehicleData: vehicleData,
+				missionType: MissionType.LongHaul,
+				cosswindCorrection: "RigidTrailer",
+				axleWeightDistribution: new[] { 0.225, 0.325 },
+				trailerAxleWeightDistribution: new[] { 0.45 },
+				trailerAxleCount: new[] { 2 },
+				bodyCurbWeight: 1900,
+				trailerCurbWeight: new[] { 3400.0 },
+				trailerType: new[] { TrailerType.T1 },
+				lowLoad: 1290,
+				refLoad: 5890,
+				trailerGrossVehicleWeight: new[] { 10500.0 },
+				deltaCdA: 1.3,
+				maxLoad: 7690);
+
+			AssertMission(segment.Missions[1],
+				vehicleData: vehicleData,
+				missionType: MissionType.RegionalDelivery,
+				cosswindCorrection: "RigidSolo",
+				axleWeightDistribution: new[] { 0.45, 0.55 },
+				trailerAxleWeightDistribution: new double[] { },
+				trailerAxleCount: new int[] { },
+				bodyCurbWeight: 1900,
+				trailerCurbWeight: new double[] { },
+				trailerType: new TrailerType[] { },
+				lowLoad: 590,
+				refLoad: 590,
+				trailerGrossVehicleWeight: new double[] { },
+				deltaCdA: 0,
+				maxLoad: 590);
+
+			AssertMission(segment.Missions[2],
+				vehicleData: vehicleData,
+				missionType: MissionType.UrbanDelivery,
+				cosswindCorrection: "RigidSolo",
+				axleWeightDistribution: new[] { 0.45, 0.55 },
+				trailerAxleWeightDistribution: new double[] { },
+				trailerAxleCount: new int[] { },
+				bodyCurbWeight: 1900,
+				trailerCurbWeight: new double[] { },
+				trailerType: new TrailerType[] { },
+				lowLoad: 590,
+				refLoad: 590,
+				trailerGrossVehicleWeight: new double[] { },
+				deltaCdA: 0,
+				maxLoad: 590);
+		}
+
+
 		/// <summary>
 		/// normal pc formula, no trailer
 		/// </summary>
diff --git a/VectoCore/VectoCoreTest/Models/Simulation/AuxTests.cs b/VectoCore/VectoCoreTest/Models/Simulation/AuxTests.cs
index 8d73537a0b633d77c197010cf02d8adf3575159e..9ed4db1a20e1c62d758f7ba12878a87896ef56fb 100644
--- a/VectoCore/VectoCoreTest/Models/Simulation/AuxTests.cs
+++ b/VectoCore/VectoCoreTest/Models/Simulation/AuxTests.cs
@@ -29,345 +29,345 @@
 *   Martin Rexeis, rexeis@ivt.tugraz.at, IVT, Graz University of Technology
 */
 
-using System.Collections.Generic;
-using Microsoft.VisualStudio.TestTools.UnitTesting;
-using TUGraz.VectoCommon.Exceptions;
-using TUGraz.VectoCommon.InputData;
-using TUGraz.VectoCommon.Models;
-using TUGraz.VectoCommon.Utils;
-using TUGraz.VectoCore.InputData;
-using TUGraz.VectoCore.InputData.FileIO.JSON;
-using TUGraz.VectoCore.InputData.Impl;
-using TUGraz.VectoCore.InputData.Reader;
-using TUGraz.VectoCore.InputData.Reader.ComponentData;
-using TUGraz.VectoCore.Models.Declaration;
-using TUGraz.VectoCore.Models.Simulation.Data;
-using TUGraz.VectoCore.Models.Simulation.Impl;
-using TUGraz.VectoCore.Models.SimulationComponent.Data;
-using TUGraz.VectoCore.Models.SimulationComponent.Impl;
-using TUGraz.VectoCore.OutputData;
-using TUGraz.VectoCore.OutputData.FileIO;
-using TUGraz.VectoCore.Tests.Models.SimulationComponent;
-using TUGraz.VectoCore.Tests.Utils;
-
-// ReSharper disable ObjectCreationAsStatement
-
-namespace TUGraz.VectoCore.Tests.Models.Simulation
-{
-	[TestClass]
-	public class AuxTests
-	{
-		[TestMethod]
-		public void AuxWriteModFileSumFile()
-
-		{
-			var fileWriter = new FileOutputWriter("AuxWriteModFileSumFile");
-			var modData = new ModalDataContainer("AuxWriteModFileSumFile", FuelType.DieselCI, fileWriter) {
-				WriteModalResults = true
-			};
-			modData.AddAuxiliary("FAN");
-			modData.AddAuxiliary("PS");
-			modData.AddAuxiliary("STP");
-			modData.AddAuxiliary("ES");
-			modData.AddAuxiliary("AC");
-
-			var sumWriter = new SummaryDataContainer(fileWriter);
-			var container = new VehicleContainer(ExecutionMode.Declaration, modData,
-				(modalData) => sumWriter.Write(modalData, 0, 0, new MockRunData()));
-			var data = DrivingCycleDataReader.ReadFromFile(@"TestData\Cycles\LongHaul_short.vdri", CycleType.DistanceBased, false);
-			new MockDrivingCycle(container, data);
-
-			var aux = new EngineAuxiliary(container);
-
-			var hdvClass = VehicleClass.Class5;
-			var mission = MissionType.LongHaul;
-
-			aux.AddConstant("FAN",
-				DeclarationData.Fan.Lookup(MissionType.LongHaul, "Hydraulic driven - Constant displacement pump"));
-			aux.AddConstant("PS", DeclarationData.PneumaticSystem.Lookup(mission, "Medium Supply 1-stage"));
-			aux.AddConstant("STP",
-				DeclarationData.SteeringPump.Lookup(MissionType.LongHaul, hdvClass,
-					new[] { "Variable displacement mech. controlled" }));
-			aux.AddConstant("ES", DeclarationData.ElectricSystem.Lookup(mission));
-			aux.AddConstant("AC",
-				DeclarationData.HeatingVentilationAirConditioning.Lookup(mission, "Default", hdvClass));
-
-			var speed = 1400.RPMtoRad();
-			var torque = 500.SI<NewtonMeter>();
-			var t = 0.SI<Second>();
-			var dt = 1.SI<Second>();
-
-			new MockEngine(container);
-
-			aux.Initialize(torque, speed);
-			for (var i = 0; i < 11; i++) {
-				aux.TorqueDemand(t, dt, torque, torque, speed);
-				modData[ModalResultField.dist] = i.SI<Meter>();
-				modData[ModalResultField.P_eng_out] = 0.SI<Watt>();
-				modData[ModalResultField.acc] = 0.SI<MeterPerSquareSecond>();
-				container.CommitSimulationStep(t, dt);
-				t += dt;
-			}
-
-			container.FinishSimulationRun();
-			sumWriter.Finish();
-
-			var testColumns = new[] { "P_aux_FAN", "P_aux_STP", "P_aux_AC", "P_aux_ES", "P_aux_PS", "P_aux" };
-
-			ResultFileHelper.TestModFile(@"TestData\Results\EngineOnlyCycles\AuxWriteModFileSumFile.vmod",
-				@"AuxWriteModFileSumFile.vmod", testColumns);
-			ResultFileHelper.TestSumFile(@"TestData\Results\EngineOnlyCycles\AuxWriteModFileSumFile.vsum",
-				@"AuxWriteModFileSumFile.vsum");
-		}
-
-		[TestMethod]
-		public void AuxConstant()
-		{
-			var dataWriter = new MockModalDataContainer();
-			var container = new VehicleContainer(ExecutionMode.Engineering, dataWriter);
-			//var port = new MockTnOutPort();
-			var aux = new EngineAuxiliary(container);
-
-			var constPower = 1200.SI<Watt>();
-			aux.AddConstant("CONSTANT", constPower);
-
-			var speed = 2358.RPMtoRad();
-			var torque = 500.SI<NewtonMeter>();
-			var t = 0.SI<Second>();
-
-			aux.Initialize(torque, speed);
-			var auxDemand = aux.TorqueDemand(t, t, torque, torque, speed);
-			AssertHelper.AreRelativeEqual(constPower / speed, auxDemand);
-
-			speed = 2358.RPMtoRad();
-			torque = 1500.SI<NewtonMeter>();
-			aux.Initialize(torque, speed);
-			auxDemand = aux.TorqueDemand(t, t, torque, torque, speed);
-			AssertHelper.AreRelativeEqual(constPower / speed, auxDemand);
-
-			speed = 1500.RPMtoRad();
-			torque = 1500.SI<NewtonMeter>();
-			aux.Initialize(torque, speed);
-			auxDemand = aux.TorqueDemand(t, t, torque, torque, speed);
-			AssertHelper.AreRelativeEqual(constPower / speed, auxDemand);
-		}
-
-		[TestMethod]
-		public void AuxDirect()
-		{
-			var dataWriter = new MockModalDataContainer();
-			var container = new VehicleContainer(ExecutionMode.Engineering, dataWriter);
-			var data = DrivingCycleDataReader.ReadFromFile(@"TestData\Cycles\Coach time based short.vdri",
-				CycleType.MeasuredSpeed, false);
-			var cycle = new MockDrivingCycle(container, data);
-
-			var aux = new EngineAuxiliary(container);
-
-			aux.AddCycle("CYCLE");
-			container.ModalData.AddAuxiliary("CYCLE");
-
-			var speed = 2358.RPMtoRad();
-			var torque = 500.SI<NewtonMeter>();
-
-			var t = 0.SI<Second>();
-
-			var expected = new[] { 6100, 3100, 2300, 4500, 6100 };
-			foreach (var e in expected) {
-				aux.Initialize(torque, speed);
-				var auxDemand = aux.TorqueDemand(t, t, torque, torque, speed);
-
-				AssertHelper.AreRelativeEqual((e.SI<Watt>() / speed).Value(), auxDemand.Value());
-				cycle.CommitSimulationStep(null);
-			}
-		}
-
-		[TestMethod]
-		public void AuxAllCombined()
-		{
-			var dataWriter = new MockModalDataContainer();
-			dataWriter.AddAuxiliary("ALT1");
-			dataWriter.AddAuxiliary("CONSTANT");
-
-			var container = new VehicleContainer(ExecutionMode.Engineering, dataWriter);
-			var data = DrivingCycleDataReader.ReadFromFile(@"TestData\Cycles\Coach time based short.vdri",
-				CycleType.MeasuredSpeed, false);
-			// cycle ALT1 is set to values to equal the first few fixed points in the auxiliary file.
-			// ALT1.aux file: nAuxiliary speed 2358: 0, 0.38, 0.49, 0.64, ...
-			// ALT1 in cycle file: 0, 0.3724 (=0.38*0.96), 0.4802 (=0.49*0.96), 0.6272 (0.64*0.96), ...
-
-			var cycle = new MockDrivingCycle(container, data);
-
-			var aux = new EngineAuxiliary(container);
-
-			var auxDataInputData = new AuxiliaryDataInputData {
-				ID = "ALT1",
-				Type = AuxiliaryType.ElectricSystem,
-				Technology = new List<string>(),
-			};
-			AuxiliaryFileHelper.FillAuxiliaryDataInputData(auxDataInputData, @"TestData\Components\24t_Coach_ALT.vaux");
-			var auxData = AuxiliaryDataReader.Create(auxDataInputData);
-
-			// ratio = 4.078
-			// efficiency_engine = 0.96
-			// efficiency_supply = 0.98
-
-			aux.AddMapping("ALT1", auxData);
-			aux.AddCycle("CYCLE");
-			var constPower = 1200.SI<Watt>();
-			aux.AddConstant("CONSTANT", constPower);
-
-			var speed = 578.22461991.RPMtoRad(); // = 2358 (nAuxiliary) * ratio
-			var torque = 500.SI<NewtonMeter>();
-			var t = 0.SI<Second>();
-			var expected = new[] {
-				1200 + 6100 + 72.9166666666667,
-				// = 1000 * 0.07 (nAuxiliary=2358 and psupply=0) / 0.98 (efficiency_supply)
-				1200 + 3100 + 677.083333333333,
-				// = 1000 * 0.65 (nAuxiliary=2358 and psupply=0.38) / 0.98 (efficiency_supply)
-				1200 + 2300 + 822.916666666667,
-				// = 1000 * 0.79 (nAuxiliary=2358 and psupply=0.49) / 0.98 (efficiency_supply)
-				1200 + 4500 + 1031.25, // = ...
-				1200 + 6100 + 1166.66666666667,
-				1200 + 6100 + 1656.25,
-				1200 + 6100 + 2072.91666666667,
-				1200 + 6100 + 2510.41666666667,
-				1200 + 6100 + 2979.16666666667,
-				1200 + 6100 + 3322.91666666667,
-				1200 + 6100 + 3656.25
-			};
-
-			foreach (var e in expected) {
-				aux.Initialize(torque, speed);
-				var auxDemand = aux.TorqueDemand(t, t, torque, torque, speed);
-
-				AssertHelper.AreRelativeEqual((e.SI<Watt>() / speed).Value(), auxDemand.Value());
-
-				cycle.CommitSimulationStep(null);
-			}
-		}
-
-		[TestMethod]
-		public void AuxMapping()
-		{
-			var auxId = "ALT1";
-			var dataWriter = new MockModalDataContainer();
-			dataWriter.AddAuxiliary(auxId);
-
-			var container = new VehicleContainer(ExecutionMode.Engineering, dataWriter);
-			var data = DrivingCycleDataReader.ReadFromFile(@"TestData\Cycles\Coach time based short.vdri",
-				CycleType.MeasuredSpeed, false);
-			// cycle ALT1 is set to values to equal the first few fixed points in the auxiliary file.
-			// ALT1.aux file: nAuxiliary speed 2358: 0, 0.38, 0.49, 0.64, ...
-			// ALT1 in cycle file: 0, 0.3724 (=0.38*0.96), 0.4802 (=0.49*0.96), 0.6272 (0.64*0.96), ...
-
-			var cycle = new MockDrivingCycle(container, data);
-			new MockTnOutPort();
-
-			var aux = new EngineAuxiliary(container);
-
-			var auxDataInputData = new AuxiliaryDataInputData {
-				ID = "ALT1",
-				Type = AuxiliaryType.ElectricSystem,
-				Technology = new List<string>(),
-			};
-			AuxiliaryFileHelper.FillAuxiliaryDataInputData(auxDataInputData, @"TestData\Components\24t_Coach_ALT.vaux");
-			var auxData = AuxiliaryDataReader.Create(auxDataInputData);
-
-			// ratio = 4.078
-			// efficiency_engine = 0.96
-			// efficiency_supply = 0.98
-
-			aux.AddMapping(auxId, auxData);
-
-			var speed = 578.22461991.RPMtoRad(); // = 2358 (nAuxiliary) * ratio
-			var torque = 500.SI<NewtonMeter>();
-			var t = 0.SI<Second>();
-			var expected = new[] {
-				72.9166666666667,
-				// = 1000 * 0.07 (pmech from aux file at nAuxiliary=2358 and psupply=0) / 0.98 (efficiency_supply)
-				677.083333333333, // = 1000 * 0.65 (nAuxiliary=2358 and psupply=0.38) / 0.98
-				822.916666666667, // = 1000 * 0.79 (nAuxiliary=2358 and psupply=0.49) / 0.98
-				1031.25, // = ...
-				1166.66666666667,
-				1656.25,
-				2072.91666666667,
-				2510.41666666667,
-				2979.16666666667,
-				3322.91666666667,
-				3656.25
-			};
-
-			foreach (var e in expected) {
-				aux.Initialize(torque, speed);
-				var auxDemand = aux.TorqueDemand(t, t, torque, torque, speed);
-
-				AssertHelper.AreRelativeEqual((e.SI<Watt>() / speed).Value(), auxDemand);
-
-				cycle.CommitSimulationStep(null);
-			}
-		}
-
-		[TestMethod]
-		public void AuxColumnMissing()
-		{
-			var container = new VehicleContainer(ExecutionMode.Engineering);
-			var data = DrivingCycleDataReader.ReadFromFile(@"TestData\Cycles\Coach time based short.vdri",
-				CycleType.MeasuredSpeed, false);
-			new MockDrivingCycle(container, data);
-
-			var aux = new EngineAuxiliary(container);
-			AssertHelper.Exception<VectoException>(() => aux.AddMapping("NONEXISTING_AUX", null),
-				"driving cycle does not contain column for auxiliary: AUX_NONEXISTING_AUX");
-		}
-
-		[TestMethod]
-		public void AuxFileMissing()
-		{
-			AssertHelper.Exception<VectoException>(() => {
-				var auxDataInputData = new AuxiliaryDataInputData();
-				AuxiliaryFileHelper.FillAuxiliaryDataInputData(auxDataInputData, @"NOT_EXISTING_AUX_FILE.vaux");
-			}, "Auxiliary file not found: NOT_EXISTING_AUX_FILE.vaux");
-		}
-
-		[TestMethod]
-		public void AuxReadJobFileDeclarationMode()
-		{
-			var fileWriter = new FileOutputWriter("AuxReadJobFileDeclarationMode");
-			var sumData = new SummaryDataContainer(fileWriter);
-			var jobContainer = new JobContainer(sumData);
-
-			var inputData = JSONInputDataFactory.ReadJsonJob(
-				@"TestData\Generic Vehicles\Declaration Mode\40t Long Haul Truck\40t_Long_Haul_Truck.vecto");
-			var runsFactory = new SimulatorFactory(ExecutionMode.Declaration, inputData, fileWriter);
-
-			jobContainer.AddRuns(runsFactory);
-		}
-
-		[TestMethod]
-		public void AuxReadJobFileEngineeringMode()
-		{
-			var fileWriter = new FileOutputWriter("AuxReadJobFileEngineeringMode");
-			var sumData = new SummaryDataContainer(fileWriter);
-			var jobContainer = new JobContainer(sumData);
-
-			var inputData =
-				JSONInputDataFactory.ReadJsonJob(@"TestData\Generic Vehicles\Engineering Mode\24t Coach\24t Coach.vecto");
-			var runsFactory = new SimulatorFactory(ExecutionMode.Engineering, inputData, fileWriter);
-
-			jobContainer.AddRuns(runsFactory);
-		}
-
-		[TestMethod]
-		public void AuxDeclarationWrongConfiguration()
-		{
-			var fileWriter = new FileOutputWriter("AuxReadJobFileDeclarationMode");
-			var sumData = new SummaryDataContainer(fileWriter);
-			var jobContainer = new JobContainer(sumData);
-
-			var inputData = JSONInputDataFactory.ReadJsonJob(@"TestData\Jobs\40t_Long_Haul_Truck_wrong_AUX.vecto");
-			var runsFactory = new SimulatorFactory(ExecutionMode.Declaration, inputData, fileWriter);
-
-			AssertHelper.Exception<VectoException>(() => jobContainer.AddRuns(runsFactory));
-		}
-	}
+using System.Collections.Generic;
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+using TUGraz.VectoCommon.Exceptions;
+using TUGraz.VectoCommon.InputData;
+using TUGraz.VectoCommon.Models;
+using TUGraz.VectoCommon.Utils;
+using TUGraz.VectoCore.InputData;
+using TUGraz.VectoCore.InputData.FileIO.JSON;
+using TUGraz.VectoCore.InputData.Impl;
+using TUGraz.VectoCore.InputData.Reader;
+using TUGraz.VectoCore.InputData.Reader.ComponentData;
+using TUGraz.VectoCore.Models.Declaration;
+using TUGraz.VectoCore.Models.Simulation.Data;
+using TUGraz.VectoCore.Models.Simulation.Impl;
+using TUGraz.VectoCore.Models.SimulationComponent.Data;
+using TUGraz.VectoCore.Models.SimulationComponent.Impl;
+using TUGraz.VectoCore.OutputData;
+using TUGraz.VectoCore.OutputData.FileIO;
+using TUGraz.VectoCore.Tests.Models.SimulationComponent;
+using TUGraz.VectoCore.Tests.Utils;
+
+// ReSharper disable ObjectCreationAsStatement
+
+namespace TUGraz.VectoCore.Tests.Models.Simulation
+{
+	[TestClass]
+	public class AuxTests
+	{
+		[TestMethod]
+		public void AuxWriteModFileSumFile()
+
+		{
+			var fileWriter = new FileOutputWriter("AuxWriteModFileSumFile");
+			var modData = new ModalDataContainer("AuxWriteModFileSumFile", FuelType.DieselCI, fileWriter) {
+				WriteModalResults = true
+			};
+			modData.AddAuxiliary("FAN");
+			modData.AddAuxiliary("PS");
+			modData.AddAuxiliary("STP");
+			modData.AddAuxiliary("ES");
+			modData.AddAuxiliary("AC");
+
+			var sumWriter = new SummaryDataContainer(fileWriter);
+			var container = new VehicleContainer(ExecutionMode.Declaration, modData,
+				(modalData) => sumWriter.Write(modalData, 0, 0, new MockRunData()));
+			var data = DrivingCycleDataReader.ReadFromFile(@"TestData\Cycles\LongHaul_short.vdri", CycleType.DistanceBased, false);
+			new MockDrivingCycle(container, data);
+
+			var aux = new EngineAuxiliary(container);
+
+			var hdvClass = VehicleClass.Class5;
+			var mission = MissionType.LongHaul;
+
+			aux.AddConstant("FAN",
+				DeclarationData.Fan.Lookup(MissionType.LongHaul, "Hydraulic driven - Constant displacement pump").PowerDemand);
+			aux.AddConstant("PS", DeclarationData.PneumaticSystem.Lookup(mission, "Medium Supply 1-stage").PowerDemand);
+			aux.AddConstant("STP",
+				DeclarationData.SteeringPump.Lookup(MissionType.LongHaul, hdvClass,
+					new[] { "Variable displacement mech. controlled" }));
+			aux.AddConstant("ES", DeclarationData.ElectricSystem.Lookup(mission).PowerDemand);
+			aux.AddConstant("AC",
+				DeclarationData.HeatingVentilationAirConditioning.Lookup(mission, "Default", hdvClass).PowerDemand);
+
+			var speed = 1400.RPMtoRad();
+			var torque = 500.SI<NewtonMeter>();
+			var t = 0.SI<Second>();
+			var dt = 1.SI<Second>();
+
+			new MockEngine(container);
+
+			aux.Initialize(torque, speed);
+			for (var i = 0; i < 11; i++) {
+				aux.TorqueDemand(t, dt, torque, torque, speed);
+				modData[ModalResultField.dist] = i.SI<Meter>();
+				modData[ModalResultField.P_eng_out] = 0.SI<Watt>();
+				modData[ModalResultField.acc] = 0.SI<MeterPerSquareSecond>();
+				container.CommitSimulationStep(t, dt);
+				t += dt;
+			}
+
+			container.FinishSimulationRun();
+			sumWriter.Finish();
+
+			var testColumns = new[] { "P_aux_FAN", "P_aux_STP", "P_aux_AC", "P_aux_ES", "P_aux_PS", "P_aux" };
+
+			ResultFileHelper.TestModFile(@"TestData\Results\EngineOnlyCycles\AuxWriteModFileSumFile.vmod",
+				@"AuxWriteModFileSumFile.vmod", testColumns);
+			ResultFileHelper.TestSumFile(@"TestData\Results\EngineOnlyCycles\AuxWriteModFileSumFile.vsum",
+				@"AuxWriteModFileSumFile.vsum");
+		}
+
+		[TestMethod]
+		public void AuxConstant()
+		{
+			var dataWriter = new MockModalDataContainer();
+			var container = new VehicleContainer(ExecutionMode.Engineering, dataWriter);
+			//var port = new MockTnOutPort();
+			var aux = new EngineAuxiliary(container);
+
+			var constPower = 1200.SI<Watt>();
+			aux.AddConstant("CONSTANT", constPower);
+
+			var speed = 2358.RPMtoRad();
+			var torque = 500.SI<NewtonMeter>();
+			var t = 0.SI<Second>();
+
+			aux.Initialize(torque, speed);
+			var auxDemand = aux.TorqueDemand(t, t, torque, torque, speed);
+			AssertHelper.AreRelativeEqual(constPower / speed, auxDemand);
+
+			speed = 2358.RPMtoRad();
+			torque = 1500.SI<NewtonMeter>();
+			aux.Initialize(torque, speed);
+			auxDemand = aux.TorqueDemand(t, t, torque, torque, speed);
+			AssertHelper.AreRelativeEqual(constPower / speed, auxDemand);
+
+			speed = 1500.RPMtoRad();
+			torque = 1500.SI<NewtonMeter>();
+			aux.Initialize(torque, speed);
+			auxDemand = aux.TorqueDemand(t, t, torque, torque, speed);
+			AssertHelper.AreRelativeEqual(constPower / speed, auxDemand);
+		}
+
+		[TestMethod]
+		public void AuxDirect()
+		{
+			var dataWriter = new MockModalDataContainer();
+			var container = new VehicleContainer(ExecutionMode.Engineering, dataWriter);
+			var data = DrivingCycleDataReader.ReadFromFile(@"TestData\Cycles\Coach time based short.vdri",
+				CycleType.MeasuredSpeed, false);
+			var cycle = new MockDrivingCycle(container, data);
+
+			var aux = new EngineAuxiliary(container);
+
+			aux.AddCycle("CYCLE");
+			container.ModalData.AddAuxiliary("CYCLE");
+
+			var speed = 2358.RPMtoRad();
+			var torque = 500.SI<NewtonMeter>();
+
+			var t = 0.SI<Second>();
+
+			var expected = new[] { 6100, 3100, 2300, 4500, 6100 };
+			foreach (var e in expected) {
+				aux.Initialize(torque, speed);
+				var auxDemand = aux.TorqueDemand(t, t, torque, torque, speed);
+
+				AssertHelper.AreRelativeEqual((e.SI<Watt>() / speed).Value(), auxDemand.Value());
+				cycle.CommitSimulationStep(null);
+			}
+		}
+
+		[TestMethod]
+		public void AuxAllCombined()
+		{
+			var dataWriter = new MockModalDataContainer();
+			dataWriter.AddAuxiliary("ALT1");
+			dataWriter.AddAuxiliary("CONSTANT");
+
+			var container = new VehicleContainer(ExecutionMode.Engineering, dataWriter);
+			var data = DrivingCycleDataReader.ReadFromFile(@"TestData\Cycles\Coach time based short.vdri",
+				CycleType.MeasuredSpeed, false);
+			// cycle ALT1 is set to values to equal the first few fixed points in the auxiliary file.
+			// ALT1.aux file: nAuxiliary speed 2358: 0, 0.38, 0.49, 0.64, ...
+			// ALT1 in cycle file: 0, 0.3724 (=0.38*0.96), 0.4802 (=0.49*0.96), 0.6272 (0.64*0.96), ...
+
+			var cycle = new MockDrivingCycle(container, data);
+
+			var aux = new EngineAuxiliary(container);
+
+			var auxDataInputData = new AuxiliaryDataInputData {
+				ID = "ALT1",
+				Type = AuxiliaryType.ElectricSystem,
+				Technology = new List<string>(),
+			};
+			AuxiliaryFileHelper.FillAuxiliaryDataInputData(auxDataInputData, @"TestData\Components\24t_Coach_ALT.vaux");
+			var auxData = AuxiliaryDataReader.Create(auxDataInputData);
+
+			// ratio = 4.078
+			// efficiency_engine = 0.96
+			// efficiency_supply = 0.98
+
+			aux.AddMapping("ALT1", auxData);
+			aux.AddCycle("CYCLE");
+			var constPower = 1200.SI<Watt>();
+			aux.AddConstant("CONSTANT", constPower);
+
+			var speed = 578.22461991.RPMtoRad(); // = 2358 (nAuxiliary) * ratio
+			var torque = 500.SI<NewtonMeter>();
+			var t = 0.SI<Second>();
+			var expected = new[] {
+				1200 + 6100 + 72.9166666666667,
+				// = 1000 * 0.07 (nAuxiliary=2358 and psupply=0) / 0.98 (efficiency_supply)
+				1200 + 3100 + 677.083333333333,
+				// = 1000 * 0.65 (nAuxiliary=2358 and psupply=0.38) / 0.98 (efficiency_supply)
+				1200 + 2300 + 822.916666666667,
+				// = 1000 * 0.79 (nAuxiliary=2358 and psupply=0.49) / 0.98 (efficiency_supply)
+				1200 + 4500 + 1031.25, // = ...
+				1200 + 6100 + 1166.66666666667,
+				1200 + 6100 + 1656.25,
+				1200 + 6100 + 2072.91666666667,
+				1200 + 6100 + 2510.41666666667,
+				1200 + 6100 + 2979.16666666667,
+				1200 + 6100 + 3322.91666666667,
+				1200 + 6100 + 3656.25
+			};
+
+			foreach (var e in expected) {
+				aux.Initialize(torque, speed);
+				var auxDemand = aux.TorqueDemand(t, t, torque, torque, speed);
+
+				AssertHelper.AreRelativeEqual((e.SI<Watt>() / speed).Value(), auxDemand.Value());
+
+				cycle.CommitSimulationStep(null);
+			}
+		}
+
+		[TestMethod]
+		public void AuxMapping()
+		{
+			var auxId = "ALT1";
+			var dataWriter = new MockModalDataContainer();
+			dataWriter.AddAuxiliary(auxId);
+
+			var container = new VehicleContainer(ExecutionMode.Engineering, dataWriter);
+			var data = DrivingCycleDataReader.ReadFromFile(@"TestData\Cycles\Coach time based short.vdri",
+				CycleType.MeasuredSpeed, false);
+			// cycle ALT1 is set to values to equal the first few fixed points in the auxiliary file.
+			// ALT1.aux file: nAuxiliary speed 2358: 0, 0.38, 0.49, 0.64, ...
+			// ALT1 in cycle file: 0, 0.3724 (=0.38*0.96), 0.4802 (=0.49*0.96), 0.6272 (0.64*0.96), ...
+
+			var cycle = new MockDrivingCycle(container, data);
+			new MockTnOutPort();
+
+			var aux = new EngineAuxiliary(container);
+
+			var auxDataInputData = new AuxiliaryDataInputData {
+				ID = "ALT1",
+				Type = AuxiliaryType.ElectricSystem,
+				Technology = new List<string>(),
+			};
+			AuxiliaryFileHelper.FillAuxiliaryDataInputData(auxDataInputData, @"TestData\Components\24t_Coach_ALT.vaux");
+			var auxData = AuxiliaryDataReader.Create(auxDataInputData);
+
+			// ratio = 4.078
+			// efficiency_engine = 0.96
+			// efficiency_supply = 0.98
+
+			aux.AddMapping(auxId, auxData);
+
+			var speed = 578.22461991.RPMtoRad(); // = 2358 (nAuxiliary) * ratio
+			var torque = 500.SI<NewtonMeter>();
+			var t = 0.SI<Second>();
+			var expected = new[] {
+				72.9166666666667,
+				// = 1000 * 0.07 (pmech from aux file at nAuxiliary=2358 and psupply=0) / 0.98 (efficiency_supply)
+				677.083333333333, // = 1000 * 0.65 (nAuxiliary=2358 and psupply=0.38) / 0.98
+				822.916666666667, // = 1000 * 0.79 (nAuxiliary=2358 and psupply=0.49) / 0.98
+				1031.25, // = ...
+				1166.66666666667,
+				1656.25,
+				2072.91666666667,
+				2510.41666666667,
+				2979.16666666667,
+				3322.91666666667,
+				3656.25
+			};
+
+			foreach (var e in expected) {
+				aux.Initialize(torque, speed);
+				var auxDemand = aux.TorqueDemand(t, t, torque, torque, speed);
+
+				AssertHelper.AreRelativeEqual((e.SI<Watt>() / speed).Value(), auxDemand);
+
+				cycle.CommitSimulationStep(null);
+			}
+		}
+
+		[TestMethod]
+		public void AuxColumnMissing()
+		{
+			var container = new VehicleContainer(ExecutionMode.Engineering);
+			var data = DrivingCycleDataReader.ReadFromFile(@"TestData\Cycles\Coach time based short.vdri",
+				CycleType.MeasuredSpeed, false);
+			new MockDrivingCycle(container, data);
+
+			var aux = new EngineAuxiliary(container);
+			AssertHelper.Exception<VectoException>(() => aux.AddMapping("NONEXISTING_AUX", null),
+				"driving cycle does not contain column for auxiliary: AUX_NONEXISTING_AUX");
+		}
+
+		[TestMethod]
+		public void AuxFileMissing()
+		{
+			AssertHelper.Exception<VectoException>(() => {
+				var auxDataInputData = new AuxiliaryDataInputData();
+				AuxiliaryFileHelper.FillAuxiliaryDataInputData(auxDataInputData, @"NOT_EXISTING_AUX_FILE.vaux");
+			}, "Auxiliary file not found: NOT_EXISTING_AUX_FILE.vaux");
+		}
+
+		[TestMethod]
+		public void AuxReadJobFileDeclarationMode()
+		{
+			var fileWriter = new FileOutputWriter("AuxReadJobFileDeclarationMode");
+			var sumData = new SummaryDataContainer(fileWriter);
+			var jobContainer = new JobContainer(sumData);
+
+			var inputData = JSONInputDataFactory.ReadJsonJob(
+				@"TestData\Generic Vehicles\Declaration Mode\40t Long Haul Truck\40t_Long_Haul_Truck.vecto");
+			var runsFactory = new SimulatorFactory(ExecutionMode.Declaration, inputData, fileWriter);
+
+			jobContainer.AddRuns(runsFactory);
+		}
+
+		[TestMethod]
+		public void AuxReadJobFileEngineeringMode()
+		{
+			var fileWriter = new FileOutputWriter("AuxReadJobFileEngineeringMode");
+			var sumData = new SummaryDataContainer(fileWriter);
+			var jobContainer = new JobContainer(sumData);
+
+			var inputData =
+				JSONInputDataFactory.ReadJsonJob(@"TestData\Generic Vehicles\Engineering Mode\24t Coach\24t Coach.vecto");
+			var runsFactory = new SimulatorFactory(ExecutionMode.Engineering, inputData, fileWriter);
+
+			jobContainer.AddRuns(runsFactory);
+		}
+
+		[TestMethod]
+		public void AuxDeclarationWrongConfiguration()
+		{
+			var fileWriter = new FileOutputWriter("AuxReadJobFileDeclarationMode");
+			var sumData = new SummaryDataContainer(fileWriter);
+			var jobContainer = new JobContainer(sumData);
+
+			var inputData = JSONInputDataFactory.ReadJsonJob(@"TestData\Jobs\40t_Long_Haul_Truck_wrong_AUX.vecto");
+			var runsFactory = new SimulatorFactory(ExecutionMode.Declaration, inputData, fileWriter);
+
+			AssertHelper.Exception<VectoException>(() => jobContainer.AddRuns(runsFactory));
+		}
+	}
 }
\ No newline at end of file
diff --git a/VectoCore/VectoCoreTest/Models/SimulationComponentData/FullLoadCurveTest.cs b/VectoCore/VectoCoreTest/Models/SimulationComponentData/FullLoadCurveTest.cs
index 886e71bdac7041a357de56e0149cfc666e3e1f4e..925f6301b079eb7fc36f739b974a04ec27af2fb6 100644
--- a/VectoCore/VectoCoreTest/Models/SimulationComponentData/FullLoadCurveTest.cs
+++ b/VectoCore/VectoCoreTest/Models/SimulationComponentData/FullLoadCurveTest.cs
@@ -29,273 +29,273 @@
 *   Martin Rexeis, rexeis@ivt.tugraz.at, IVT, Graz University of Technology
 */
 
-using System.Collections.Generic;
-using Microsoft.VisualStudio.TestTools.UnitTesting;
-using NLog;
-using NLog.Config;
-using NLog.Targets;
-using TUGraz.VectoCommon.Exceptions;
-using TUGraz.VectoCommon.Utils;
-using TUGraz.VectoCore.InputData.Reader;
-using TUGraz.VectoCore.InputData.Reader.ComponentData;
-using TUGraz.VectoCore.Models.Simulation.Data;
-using TUGraz.VectoCore.Models.SimulationComponent.Data;
-using TUGraz.VectoCore.Models.SimulationComponent.Data.Engine;
-using TUGraz.VectoCore.Models.SimulationComponent.Data.Gearbox;
-using TUGraz.VectoCore.Tests.Utils;
-using TUGraz.VectoCore.Utils;
-
-namespace TUGraz.VectoCore.Tests.Models.SimulationComponentData
-{
-	[TestClass]
-	public class FullLoadCurveTest
-	{
-		private const string CoachEngineFLD = @"TestData\Components\24t Coach.vfld";
-		private const double Tolerance = 0.0001;
-
-		public static List<string> LogList = new List<string>();
-
-		[TestMethod]
-		public void TestFullLoadStaticTorque()
-		{
-			var fldCurve = FullLoadCurveReader.ReadFromFile(CoachEngineFLD);
-
-			Assert.AreEqual(1180, fldCurve.FullLoadStationaryTorque(560.RPMtoRad()).Value(), Tolerance);
-			Assert.AreEqual(1352, fldCurve.FullLoadStationaryTorque(2000.RPMtoRad()).Value(), Tolerance);
-			Assert.AreEqual(1231, fldCurve.FullLoadStationaryTorque(580.RPMtoRad()).Value(), Tolerance);
-		}
-
-		[TestMethod]
-		public void TestFullLoadEngineSpeedRated()
-		{
-			var fldCurve = FullLoadCurveReader.ReadFromFile(CoachEngineFLD);
-			Assert.AreEqual(181.8444, fldCurve.RatedSpeed.Value(), Tolerance);
-		}
-
-		[TestMethod]
-		public void TestFullLoadStaticPower()
-		{
-			var fldCurve = FullLoadCurveReader.ReadFromFile(CoachEngineFLD);
-
-			Assert.AreEqual(69198.814183, fldCurve.FullLoadStationaryPower(560.RPMtoRad()).Value(), Tolerance);
-			Assert.AreEqual(283162.218372, fldCurve.FullLoadStationaryPower(2000.RPMtoRad()).Value(), Tolerance);
-			Assert.AreEqual(74767.810760, fldCurve.FullLoadStationaryPower(580.RPMtoRad()).Value(), Tolerance);
-		}
-
-		[TestMethod]
-		public void TestDragLoadStaticTorque()
-		{
-			var fldCurve = FullLoadCurveReader.ReadFromFile(CoachEngineFLD);
-
-			Assert.AreEqual(-149, fldCurve.DragLoadStationaryTorque(560.RPMtoRad()).Value(), Tolerance);
-			Assert.AreEqual(-301, fldCurve.DragLoadStationaryTorque(2000.RPMtoRad()).Value(), Tolerance);
-			Assert.AreEqual(-148.5, fldCurve.DragLoadStationaryTorque(580.RPMtoRad()).Value(), Tolerance);
-			Assert.AreEqual(-150, fldCurve.DragLoadStationaryTorque(520.RPMtoRad()).Value(), Tolerance);
-			Assert.AreEqual(-339, fldCurve.DragLoadStationaryTorque(2200.RPMtoRad()).Value(), Tolerance);
-		}
-
-		[TestMethod]
-		public void TestDragLoadStaticPower()
-		{
-			var fldCurve = FullLoadCurveReader.ReadFromFile(CoachEngineFLD);
-
-			Assert.AreEqual(-8737.81636, fldCurve.DragLoadStationaryPower(560.RPMtoRad()).Value(), Tolerance);
-			Assert.AreEqual(-63041.29254, fldCurve.DragLoadStationaryPower(2000.RPMtoRad()).Value(), Tolerance);
-			Assert.AreEqual(-9019.51251, fldCurve.DragLoadStationaryPower(580.RPMtoRad()).Value(), Tolerance);
-		}
-
-		[TestMethod]
-		public void TestPT1()
-		{
-			var fldCurve = FullLoadCurveReader.ReadFromFile(CoachEngineFLD);
-
-			Assert.AreEqual(0.6, fldCurve.PT1(560.RPMtoRad()).Value.Value(), Tolerance);
-			Assert.AreEqual(0.25, fldCurve.PT1(2000.RPMtoRad()).Value.Value(), Tolerance);
-			Assert.AreEqual(0.37, fldCurve.PT1(1700.RPMtoRad()).Value.Value(), Tolerance);
-		}
-
-		[TestMethod]
-		public void TestPreferredSpeed()
-		{
-			var fldCurve = FullLoadCurveReader.ReadFromFile(CoachEngineFLD);
-			fldCurve.EngineData = new CombustionEngineData { IdleSpeed = 560.RPMtoRad() };
-			AssertHelper.AreRelativeEqual(130.691151551712.SI<PerSecond>(), fldCurve.PreferredSpeed);
-			var totalArea = fldCurve.ComputeArea(fldCurve.EngineData.IdleSpeed, fldCurve.N95hSpeed);
-			Assert.AreEqual((0.51 * totalArea).Value(),
-				fldCurve.ComputeArea(fldCurve.EngineData.IdleSpeed, fldCurve.PreferredSpeed).Value(), 1E-3);
-			AssertHelper.AreRelativeEqual(194.515816596908.SI<PerSecond>(), fldCurve.N95hSpeed);
-			AssertHelper.AreRelativeEqual(83.81645.SI<PerSecond>(), fldCurve.LoSpeed);
-			AssertHelper.AreRelativeEqual(219.084329211505.SI<PerSecond>(), fldCurve.HiSpeed);
-			AssertHelper.AreRelativeEqual(2300.SI<NewtonMeter>(), fldCurve.MaxTorque);
-			AssertHelper.AreRelativeEqual(-320.SI<NewtonMeter>(), fldCurve.MaxDragTorque);
-		}
-
-		[TestMethod]
-		public void TestPreferredSpeed2()
-		{
-			var fldData = new[] {
-				"560,1180,-149,0.6",
-				"600,1282,-148,0.6",
-				"800,1791,-149,0.6",
-				"1000,2300,-160,0.6",
-				"1200,2400,-179,0.6",
-				"1400,2300,-203,0.6",
-				"1600,2079,-235,0.49",
-				"1800,1857,-264,0.25",
-				"2000,1352,-301,0.25",
-				"2100,1100,-320,0.25",
-			};
-			var fldEntries = InputDataHelper.InputDataAsStream("n [U/min],Mfull [Nm],Mdrag [Nm],<PT1> [s] ", fldData);
-			var fldCurve = FullLoadCurveReader.Create(VectoCSVFile.ReadStream(fldEntries));
-			fldCurve.EngineData = new CombustionEngineData { IdleSpeed = 560.RPMtoRad() };
-
-			var totalArea = fldCurve.ComputeArea(fldCurve.EngineData.IdleSpeed, fldCurve.N95hSpeed);
-			Assert.AreEqual((0.51 * totalArea).Value(),
-				fldCurve.ComputeArea(fldCurve.EngineData.IdleSpeed, fldCurve.PreferredSpeed).Value(), 1E-3);
-			//AssertHelper.AreRelativeEqual(130.691151551712.SI<PerSecond>(), fldCurve.PreferredSpeed);
-		}
-
-		[TestMethod]
-		public void TestN95hSpeedInvalid()
-		{
-			var fldData = new[] {
-				"600,539.8228,-59.02274, 1.0",
-				"821,673.5694587,-62.77795, 1.0",
-				"1041,1102.461949,-68.37734, 1.0",
-				"1262,1112.899122,-76.0485, 1.0",
-				"1482,1098.632364,-85.00573, 1.0",
-				"1606,1093.403667,-90.9053, 1.0",
-				"1800,1058.081866,-100.937, 1.0",
-				"1995,992.0155535,-112.1166, 1.0",
-				"2189,926.7779212,-124.9432, 1.0",
-				"4000,811.7189964,-138.7132, 1.0",
-			};
-			var fldEntries = InputDataHelper.InputDataAsStream("n [U/min],Mfull [Nm],Mdrag [Nm],<PT1> [s] ", fldData);
-			var fldCurve = FullLoadCurveReader.Create(VectoCSVFile.ReadStream(fldEntries));
-			fldCurve.EngineData = new CombustionEngineData { IdleSpeed = 560.RPMtoRad() };
-
-			AssertHelper.Exception<VectoException>(() => { var tmp = fldCurve.N95hSpeed; });
-			//var totalArea = fldCurve.ComputeArea(fldCurve.EngineData.IdleSpeed, );
-			//Assert.AreEqual((0.51 * totalArea).Value(),
-			//	fldCurve.ComputeArea(fldCurve.EngineData.IdleSpeed, fldCurve.PreferredSpeed).Value(), 1E-3);
-			//AssertHelper.AreRelativeEqual(130.691151551712.SI<PerSecond>(), fldCurve.PreferredSpeed);
-		}
-
-		/// <summary>
-		///     [VECTO-78]
-		/// </summary>
-		[TestMethod]
-		public void Test_FileRead_WrongFileFormat_InsufficientColumns()
-		{
-			AssertHelper.Exception<VectoException>(
-				() => FullLoadCurveReader.ReadFromFile(@"TestData\Components\FullLoadCurve insufficient columns.vfld"),
-				"ERROR while reading FullLoadCurve File: Engine FullLoadCurve Data File must consist of at least 3 columns.");
-		}
-
-		/// <summary>
-		/// [VECTO-78]
-		/// </summary>
-		[TestMethod]
-		public void Test_FileRead_HeaderColumnsNotNamedCorrectly()
-		{
-			LogList.Clear();
-			var target = new MethodCallTarget {
-				ClassName = typeof(FullLoadCurveTest).AssemblyQualifiedName,
-				MethodName = "LogMethod_Test_FileRead_HeaderColumnsNotNamedCorrectly"
-			};
-			target.Parameters.Add(new MethodCallParameter("${level}"));
-			target.Parameters.Add(new MethodCallParameter("${message}"));
-			SimpleConfigurator.ConfigureForTargetLogging(target, LogLevel.Warn);
-			FullLoadCurveReader.ReadFromFile(@"TestData\Components\FullLoadCurve wrong header.vfld");
-			Assert.IsTrue(
-				LogList.Contains(
-					"FullLoadCurve: Header Line is not valid. Expected: \'engine speed, full load torque, motoring torque\', Got: \'n, Mfull, Mdrag, PT1\'. Falling back to column index."),
-				string.Join("\n", LogList));
-			LogList.Clear();
-		}
-
-		public static void LogMethod_Test_FileRead_HeaderColumnsNotNamedCorrectly(string level, string message)
-		{
-			LogList.Add(message);
-		}
-
-		/// <summary>
-		///     [VECTO-78]
-		/// </summary>
-		[TestMethod]
-		public void Test_FileRead_NoHeader()
-		{
-			var curve = FullLoadCurveReader.ReadFromFile(@"TestData\Components\FullLoadCurve no header.vfld");
-			var result = curve.FullLoadStationaryTorque(1.SI<PerSecond>());
-			Assert.AreNotEqual(result.Value(), 0.0);
-		}
-
-		/// <summary>
-		///     [VECTO-78]
-		/// </summary>
-		[TestMethod]
-		public void Test_FileRead_InsufficientEntries()
-		{
-			AssertHelper.Exception<VectoException>(
-				() => FullLoadCurveReader.ReadFromFile(@"TestData\Components\FullLoadCurve insufficient entries.vfld"),
-				"ERROR while reading FullLoadCurve File: FullLoadCurve must consist of at least two lines with numeric values (below file header)");
-		}
-
-		[TestMethod]
-		public void FullLoad_LossMap_Test()
-		{
-			var engineData = new CombustionEngineData {
-				FullLoadCurves =
-					new Dictionary<uint, EngineFullLoadCurve>() {
-						{ 0, FullLoadCurveReader.ReadFromFile(@"TestData\Components\12t Delivery Truck.vfld") },
-						{ 1, FullLoadCurveReader.ReadFromFile(@"TestData\Components\12t Delivery Truck.vfld") }
-					},
-				IdleSpeed = 560.RPMtoRad()
-			};
-
-			var gearboxData = new GearboxData();
-			gearboxData.Gears[1] = new GearData {
-				LossMap = TransmissionLossMapReader.ReadFromFile(@"TestData\Components\limited.vtlm", 1, "1"),
-				Ratio = 1
-			};
-
-			var axleGearData = new AxleGearData() {
-				AxleGear = new GearData {
-					Ratio = 1,
-					LossMap = TransmissionLossMapReader.ReadFromFile(@"TestData\Components\limited.vtlm", 1, "1"),
-				}
-			};
-
-			var runData = new VectoRunData { GearboxData = gearboxData, EngineData = engineData, AxleGearData = axleGearData };
-			Assert.IsFalse(runData.IsValid());
-		}
-
-		/// <summary>
-		///     [VECTO-190]
-		/// </summary>
-		[TestMethod]
-		public void TestSortingFullLoadEntries()
-		{
-			var fldEntries = new[] {
-				"600,1282,-148,0.6			 ",
-				"799.9999999,1791,-149,0.6	 ",
-				"560,1180,-149,0.6			 ",
-				"1000,2300,-160,0.6			 ",
-				"1599.999999,2079,-235,0.49	 ",
-				"1200,2300,-179,0.6			 ",
-				"1800,1857,-264,0.25		 ",
-				"1400,2300,-203,0.6			 ",
-				"2000.000001,1352,-301,0.25	 ",
-				"2100,1100,-320,0.25		 ",
-			};
-
-			var fldCurve =
-				FullLoadCurveReader.Create(
-					VectoCSVFile.ReadStream(InputDataHelper.InputDataAsStream("n [U/min],Mfull [Nm],Mdrag [Nm],<PT1> [s]", fldEntries)));
-
-			Assert.AreEqual(1180, fldCurve.FullLoadStationaryTorque(560.RPMtoRad()).Value(), Tolerance);
-			Assert.AreEqual(1352, fldCurve.FullLoadStationaryTorque(2000.RPMtoRad()).Value(), Tolerance);
-			Assert.AreEqual(1231, fldCurve.FullLoadStationaryTorque(580.RPMtoRad()).Value(), Tolerance);
-		}
-	}
+using System.Collections.Generic;
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+using NLog;
+using NLog.Config;
+using NLog.Targets;
+using TUGraz.VectoCommon.Exceptions;
+using TUGraz.VectoCommon.Utils;
+using TUGraz.VectoCore.InputData.Reader;
+using TUGraz.VectoCore.InputData.Reader.ComponentData;
+using TUGraz.VectoCore.Models.Simulation.Data;
+using TUGraz.VectoCore.Models.SimulationComponent.Data;
+using TUGraz.VectoCore.Models.SimulationComponent.Data.Engine;
+using TUGraz.VectoCore.Models.SimulationComponent.Data.Gearbox;
+using TUGraz.VectoCore.Tests.Utils;
+using TUGraz.VectoCore.Utils;
+
+namespace TUGraz.VectoCore.Tests.Models.SimulationComponentData
+{
+	[TestClass]
+	public class FullLoadCurveTest
+	{
+		private const string CoachEngineFLD = @"TestData\Components\24t Coach.vfld";
+		private const double Tolerance = 0.0001;
+
+		public static List<string> LogList = new List<string>();
+
+		[TestMethod]
+		public void TestFullLoadStaticTorque()
+		{
+			var fldCurve = FullLoadCurveReader.ReadFromFile(CoachEngineFLD);
+
+			Assert.AreEqual(1180, fldCurve.FullLoadStationaryTorque(560.RPMtoRad()).Value(), Tolerance);
+			Assert.AreEqual(1352, fldCurve.FullLoadStationaryTorque(2000.RPMtoRad()).Value(), Tolerance);
+			Assert.AreEqual(1231, fldCurve.FullLoadStationaryTorque(580.RPMtoRad()).Value(), Tolerance);
+		}
+
+		[TestMethod]
+		public void TestFullLoadEngineSpeedRated()
+		{
+			var fldCurve = FullLoadCurveReader.ReadFromFile(CoachEngineFLD);
+			Assert.AreEqual(181.8444, fldCurve.RatedSpeed.Value(), Tolerance);
+		}
+
+		[TestMethod]
+		public void TestFullLoadStaticPower()
+		{
+			var fldCurve = FullLoadCurveReader.ReadFromFile(CoachEngineFLD);
+
+			Assert.AreEqual(69198.814183, fldCurve.FullLoadStationaryPower(560.RPMtoRad()).Value(), Tolerance);
+			Assert.AreEqual(283162.218372, fldCurve.FullLoadStationaryPower(2000.RPMtoRad()).Value(), Tolerance);
+			Assert.AreEqual(74767.810760, fldCurve.FullLoadStationaryPower(580.RPMtoRad()).Value(), Tolerance);
+		}
+
+		[TestMethod]
+		public void TestDragLoadStaticTorque()
+		{
+			var fldCurve = FullLoadCurveReader.ReadFromFile(CoachEngineFLD);
+
+			Assert.AreEqual(-149, fldCurve.DragLoadStationaryTorque(560.RPMtoRad()).Value(), Tolerance);
+			Assert.AreEqual(-301, fldCurve.DragLoadStationaryTorque(2000.RPMtoRad()).Value(), Tolerance);
+			Assert.AreEqual(-148.5, fldCurve.DragLoadStationaryTorque(580.RPMtoRad()).Value(), Tolerance);
+			Assert.AreEqual(-150, fldCurve.DragLoadStationaryTorque(520.RPMtoRad()).Value(), Tolerance);
+			Assert.AreEqual(-339, fldCurve.DragLoadStationaryTorque(2200.RPMtoRad()).Value(), Tolerance);
+		}
+
+		[TestMethod]
+		public void TestDragLoadStaticPower()
+		{
+			var fldCurve = FullLoadCurveReader.ReadFromFile(CoachEngineFLD);
+
+			Assert.AreEqual(-8737.81636, fldCurve.DragLoadStationaryPower(560.RPMtoRad()).Value(), Tolerance);
+			Assert.AreEqual(-63041.29254, fldCurve.DragLoadStationaryPower(2000.RPMtoRad()).Value(), Tolerance);
+			Assert.AreEqual(-9019.51251, fldCurve.DragLoadStationaryPower(580.RPMtoRad()).Value(), Tolerance);
+		}
+
+		[TestMethod]
+		public void TestPT1()
+		{
+			var fldCurve = FullLoadCurveReader.ReadFromFile(CoachEngineFLD);
+
+			Assert.AreEqual(0.6, fldCurve.PT1(560.RPMtoRad()).Value.Value(), Tolerance);
+			Assert.AreEqual(0.25, fldCurve.PT1(2000.RPMtoRad()).Value.Value(), Tolerance);
+			Assert.AreEqual(0.37, fldCurve.PT1(1700.RPMtoRad()).Value.Value(), Tolerance);
+		}
+
+		[TestMethod]
+		public void TestPreferredSpeed()
+		{
+			var fldCurve = FullLoadCurveReader.ReadFromFile(CoachEngineFLD);
+			fldCurve.EngineData = new CombustionEngineData { IdleSpeed = 560.RPMtoRad() };
+			AssertHelper.AreRelativeEqual(130.691151551712.SI<PerSecond>(), fldCurve.PreferredSpeed);
+			var totalArea = fldCurve.ComputeArea(fldCurve.EngineData.IdleSpeed, fldCurve.N95hSpeed);
+			Assert.AreEqual((0.51 * totalArea).Value(),
+				fldCurve.ComputeArea(fldCurve.EngineData.IdleSpeed, fldCurve.PreferredSpeed).Value(), 1E-3);
+			AssertHelper.AreRelativeEqual(194.515816596908.SI<PerSecond>(), fldCurve.N95hSpeed);
+			AssertHelper.AreRelativeEqual(83.81645.SI<PerSecond>(), fldCurve.LoSpeed);
+			AssertHelper.AreRelativeEqual(219.084329211505.SI<PerSecond>(), fldCurve.HiSpeed);
+			AssertHelper.AreRelativeEqual(2300.SI<NewtonMeter>(), fldCurve.MaxTorque);
+			AssertHelper.AreRelativeEqual(-320.SI<NewtonMeter>(), fldCurve.MaxDragTorque);
+		}
+
+		[TestMethod]
+		public void TestPreferredSpeed2()
+		{
+			var fldData = new[] {
+				"560,1180,-149,0.6",
+				"600,1282,-148,0.6",
+				"800,1791,-149,0.6",
+				"1000,2300,-160,0.6",
+				"1200,2400,-179,0.6",
+				"1400,2300,-203,0.6",
+				"1600,2079,-235,0.49",
+				"1800,1857,-264,0.25",
+				"2000,1352,-301,0.25",
+				"2100,1100,-320,0.25",
+			};
+			var fldEntries = InputDataHelper.InputDataAsStream("n [U/min],Mfull [Nm],Mdrag [Nm],<PT1> [s] ", fldData);
+			var fldCurve = FullLoadCurveReader.Create(VectoCSVFile.ReadStream(fldEntries));
+			fldCurve.EngineData = new CombustionEngineData { IdleSpeed = 560.RPMtoRad() };
+
+			var totalArea = fldCurve.ComputeArea(fldCurve.EngineData.IdleSpeed, fldCurve.N95hSpeed);
+			Assert.AreEqual((0.51 * totalArea).Value(),
+				fldCurve.ComputeArea(fldCurve.EngineData.IdleSpeed, fldCurve.PreferredSpeed).Value(), 1E-3);
+			//AssertHelper.AreRelativeEqual(130.691151551712.SI<PerSecond>(), fldCurve.PreferredSpeed);
+		}
+
+		[TestMethod]
+		public void TestN95hSpeedInvalid()
+		{
+			var fldData = new[] {
+				"600,539.8228,-59.02274, 1.0",
+				"821,673.5694587,-62.77795, 1.0",
+				"1041,1102.461949,-68.37734, 1.0",
+				"1262,1112.899122,-76.0485, 1.0",
+				"1482,1098.632364,-85.00573, 1.0",
+				"1606,1093.403667,-90.9053, 1.0",
+				"1800,1058.081866,-100.937, 1.0",
+				"1995,992.0155535,-112.1166, 1.0",
+				"2189,926.7779212,-124.9432, 1.0",
+				"4000,811.7189964,-138.7132, 1.0",
+			};
+			var fldEntries = InputDataHelper.InputDataAsStream("n [U/min],Mfull [Nm],Mdrag [Nm],<PT1> [s] ", fldData);
+			var fldCurve = FullLoadCurveReader.Create(VectoCSVFile.ReadStream(fldEntries));
+			fldCurve.EngineData = new CombustionEngineData { IdleSpeed = 560.RPMtoRad() };
+
+			AssertHelper.Exception<VectoException>(() => { var tmp = fldCurve.N95hSpeed; });
+			//var totalArea = fldCurve.ComputeArea(fldCurve.EngineData.IdleSpeed, );
+			//Assert.AreEqual((0.51 * totalArea).Value(),
+			//	fldCurve.ComputeArea(fldCurve.EngineData.IdleSpeed, fldCurve.PreferredSpeed).Value(), 1E-3);
+			//AssertHelper.AreRelativeEqual(130.691151551712.SI<PerSecond>(), fldCurve.PreferredSpeed);
+		}
+
+		/// <summary>
+		///     [VECTO-78]
+		/// </summary>
+		[TestMethod]
+		public void Test_FileRead_WrongFileFormat_InsufficientColumns()
+		{
+			AssertHelper.Exception<VectoException>(
+				() => FullLoadCurveReader.ReadFromFile(@"TestData\Components\FullLoadCurve insufficient columns.vfld"),
+				"ERROR while reading FullLoadCurve File: Engine FullLoadCurve Data File must consist of at least 3 columns.");
+		}
+
+		/// <summary>
+		/// [VECTO-78]
+		/// </summary>
+		[TestMethod]
+		public void Test_FileRead_HeaderColumnsNotNamedCorrectly()
+		{
+			LogList.Clear();
+			var target = new MethodCallTarget {
+				ClassName = typeof(FullLoadCurveTest).AssemblyQualifiedName,
+				MethodName = "LogMethod_Test_FileRead_HeaderColumnsNotNamedCorrectly"
+			};
+			target.Parameters.Add(new MethodCallParameter("${level}"));
+			target.Parameters.Add(new MethodCallParameter("${message}"));
+			SimpleConfigurator.ConfigureForTargetLogging(target, LogLevel.Warn);
+			FullLoadCurveReader.ReadFromFile(@"TestData\Components\FullLoadCurve wrong header.vfld");
+			Assert.IsTrue(
+				LogList.Contains(
+					"FullLoadCurve: Header Line is not valid. Expected: \'engine speed, full load torque, motoring torque\', Got: \'n, Mfull, Mdrag, PT1\'. Falling back to column index."),
+				string.Join("\n", LogList));
+			LogList.Clear();
+		}
+
+		public static void LogMethod_Test_FileRead_HeaderColumnsNotNamedCorrectly(string level, string message)
+		{
+			LogList.Add(message);
+		}
+
+		/// <summary>
+		///     [VECTO-78]
+		/// </summary>
+		[TestMethod]
+		public void Test_FileRead_NoHeader()
+		{
+			var curve = FullLoadCurveReader.ReadFromFile(@"TestData\Components\FullLoadCurve no header.vfld");
+			var result = curve.FullLoadStationaryTorque(1.SI<PerSecond>());
+			Assert.AreNotEqual(result.Value(), 0.0);
+		}
+
+		/// <summary>
+		///     [VECTO-78]
+		/// </summary>
+		[TestMethod]
+		public void Test_FileRead_InsufficientEntries()
+		{
+			AssertHelper.Exception<VectoException>(
+				() => FullLoadCurveReader.ReadFromFile(@"TestData\Components\FullLoadCurve insufficient entries.vfld"),
+				"ERROR while reading FullLoadCurve File: FullLoadCurve must consist of at least two lines with numeric values (below file header)");
+		}
+
+		[TestMethod]
+		public void FullLoad_LossMap_Test()
+		{
+			var engineData = new CombustionEngineData {
+				FullLoadCurves =
+					new Dictionary<uint, EngineFullLoadCurve>() {
+						{ 0, FullLoadCurveReader.ReadFromFile(@"TestData\Components\12t Delivery Truck.vfld") },
+						{ 1, FullLoadCurveReader.ReadFromFile(@"TestData\Components\12t Delivery Truck.vfld") }
+					},
+				IdleSpeed = 560.RPMtoRad()
+			};
+
+			var gearboxData = new GearboxData();
+			gearboxData.Gears[1] = new GearData {
+				LossMap = TransmissionLossMapReader.ReadFromFile(@"TestData\Components\limited.vtlm", 1, "1"),
+				Ratio = 1
+			};
+
+			var axleGearData = new AxleGearData() {
+				AxleGear = new GearData {
+					Ratio = 1,
+					LossMap = TransmissionLossMapReader.ReadFromFile(@"TestData\Components\limited.vtlm", 1, "1"),
+				}
+			};
+
+			var runData = new VectoRunData { GearboxData = gearboxData, EngineData = engineData, AxleGearData = axleGearData };
+			Assert.IsFalse(runData.IsValid());
+		}
+
+		/// <summary>
+		///     [VECTO-190]
+		/// </summary>
+		[TestMethod]
+		public void TestSortingFullLoadEntries()
+		{
+			var fldEntries = new[] {
+				"600,1282,-148,0.6			 ",
+				"799.9999999,1791,-149,0.6	 ",
+				"560,1180,-149,0.6			 ",
+				"1000,2300,-160,0.6			 ",
+				"1599.999999,2079,-235,0.49	 ",
+				"1200,2300,-179,0.6			 ",
+				"1800,1857,-264,0.25		 ",
+				"1400,2300,-203,0.6			 ",
+				"2000.000001,1352,-301,0.25	 ",
+				"2100,1100,-320,0.25		 ",
+			};
+
+			var fldCurve =
+				FullLoadCurveReader.Create(
+					VectoCSVFile.ReadStream(InputDataHelper.InputDataAsStream("n [U/min],Mfull [Nm],Mdrag [Nm],<PT1> [s]", fldEntries)));
+
+			Assert.AreEqual(1180, fldCurve.FullLoadStationaryTorque(560.RPMtoRad()).Value(), Tolerance);
+			Assert.AreEqual(1352, fldCurve.FullLoadStationaryTorque(2000.RPMtoRad()).Value(), Tolerance);
+			Assert.AreEqual(1231, fldCurve.FullLoadStationaryTorque(580.RPMtoRad()).Value(), Tolerance);
+		}
+	}
 }
\ No newline at end of file
diff --git a/VectoCore/VectoCoreTest/TestData/MeasuredSpeed/Results/MeasuredSpeed.vsum b/VectoCore/VectoCoreTest/TestData/MeasuredSpeed/Results/MeasuredSpeed.vsum
index 55c1370d9ef54039aabbf8637047a006c82cf4a3..a4c6df0d7b9e8fe0f7350ad4e0919fe40d98201c 100644
--- a/VectoCore/VectoCoreTest/TestData/MeasuredSpeed/Results/MeasuredSpeed.vsum
+++ b/VectoCore/VectoCoreTest/TestData/MeasuredSpeed/Results/MeasuredSpeed.vsum
@@ -1,2 +1,3 @@
-Job [-],Input File [-],Cycle [-],Status,Vehicle manufacturer [-],VIN number,Vehicle model [-],HDV CO2 vehicle class [-],Chassis curb mass [kg],Loading [kg],Total vehicle mass [kg],Engine manufacturer [-],Engine model [-],Engine fuel type [-],Engine rated power [kW],Engine idling speed [rpm],Engine rated speed [rpm],Engine displacement [ccm],Engine WHTCUrban,Engine WHTCRural,Engine WHTCMotorway,Engine BFColdHot,Engine CFRegPer,Engine actual CF,CdxA [m²],total RRC [-],weighted RRC w/o trailer [-],r_dyn [m],Gearbox manufacturer [-],Gearbox model [-],Gearbox type [-],Gear ratio first gear [-],Gear ratio last gear [-],Torque converter manufacturer [-],Torque converter model [-],Retarder manufacturer [-],Retarder model [-],Retarder type [-],Angledrive manufacturer [-],Angledrive model [-],Angledrive ratio [-],Axle manufacturer [-],Axle model [-],Axle gear ratio [-],Auxiliary technology STP [-],Auxiliary technology FAN [-],Auxiliary technology AC [-],Auxiliary technology PS [-],Auxiliary technology ES [-],Auxiliary technology cycle [-],Cargo Volume [m³],time [s],distance [km],speed [km/h],altitudeDelta [m],FC-Map [g/h],FC-Map [g/km],FC-AUXc [g/h],FC-AUXc [g/km],FC-WHTCc [g/h],FC-WHTCc [g/km],FC-AAUX [g/h],FC-AAUX [g/km],FC-Final [g/h],FC-Final [g/km],FC-Final [l/100km],FC-Final [l/100tkm],FC-Final [l/100m³km],CO2 [g/km],CO2 [g/tkm],CO2 [g/m³km],P_wheel_in_pos [kW],P_fcmap_pos [kW],E_fcmap_pos [kWh],E_fcmap_neg [kWh],E_powertrain_inertia [kWh],E_aux_CYCLE [kWh],E_aux_sum [kWh],E_clutch_loss [kWh],E_tc_loss [kWh],E_shift_loss [kWh],E_gbx_loss [kWh],E_ret_loss [kWh],E_angle_loss [kWh],E_axl_loss [kWh],E_brake [kWh],E_vehi_inertia [kWh],E_air [kWh],E_roll [kWh],E_grad [kWh],a [m/s^2],a_pos [m/s^2],a_neg [m/s^2],AccelerationTimeShare [%],DecelerationTimeShare [%],CruiseTimeShare [%],StopTimeShare [%],max. speed [km/h,max. acc [m/s²],max. dec [m/s²],n_eng_avg [rpm],n_eng_max [rpm],gear shifts [-],Engine max. Load time share [%],CoastingTimeShare [%],BrakingTImeShare [%],Gear 0 TimeShare [%],Gear 1 TimeShare [%],Gear 2 TimeShare [%],Gear 3 TimeShare [%],Gear 4 TimeShare [%],Gear 5 TimeShare [%],Gear 6 TimeShare [%]
-11-0,MeasuredSpeed,MeasuredSpeed.vdri,Success,N/A,,N.A.,0,8862.0000,0.0000,8862.0000,N/A,Demo Engine,Diesel CI,0.0000,600.0000,0.0000,6000.0000,1,1,1,0,1,1,6.1650,0.00764995394918169,0.00764995394918169,0.5200,N/A,Demo,MT,6.6960,0.7280,n.a.,n.a.,n.a.,n.a.,None,n.a.,n.a.,n.a.,N/A,Demo,4.3000,,,,,,,,1299.0000,16.8354,46.6571,15.8669,7802.9085,167.2396,7802.9085,167.2396,7802.9085,167.2396,7802.9085,167.2396,7802.9085,167.2396,20.1009,,,528.4772,,,27.2225,37.8292,13.6500,0.2247,0.0000,1.9832,1.9832,0.0054,0.0000,0.0000,0.3207,0.0000,0.0000,1.8492,0.4631,0.0000,5.3351,3.1090,0.3597,0.0000,0.3186,-0.3291,23.3256,22.8637,39.4149,14.3957,80.5095,1.1306,1.6261,1126.9852,1962.5826,215.0000,4.3880,0.0000,39.8768,17.6289,6.9284,0.7698,1.0778,5.1578,48.0370,20.4003
+# VECTO 3.1.2.810 - 05.07.2017 13:06
+Job [-],Input File [-],Cycle [-],Status,Vehicle manufacturer [-],VIN number,Vehicle model [-],HDV CO2 vehicle class [-],Corrected Actual Curb Mass [kg],Loading [kg],Total vehicle mass [kg],Engine manufacturer [-],Engine model [-],Engine fuel type [-],Engine rated power [kW],Engine idling speed [rpm],Engine rated speed [rpm],Engine displacement [ccm],Engine WHTCUrban,Engine WHTCRural,Engine WHTCMotorway,Engine BFColdHot,Engine CFRegPer,Engine actual CF,CdxA [m²],total RRC [-],weighted RRC w/o trailer [-],r_dyn [m],Number axles vehicle driven [-],Number axles vehicle non-driven [-],Number axles trailer [-],Gearbox manufacturer [-],Gearbox model [-],Gearbox type [-],Gear ratio first gear [-],Gear ratio last gear [-],Torque converter manufacturer [-],Torque converter model [-],Retarder manufacturer [-],Retarder model [-],Retarder type [-],Angledrive manufacturer [-],Angledrive model [-],Angledrive ratio [-],Axle manufacturer [-],Axle model [-],Axle gear ratio [-],Auxiliary technology STP [-],Auxiliary technology FAN [-],Auxiliary technology AC [-],Auxiliary technology PS [-],Auxiliary technology ES [-],Auxiliary technology cycle [-],Cargo Volume [m³],time [s],distance [km],speed [km/h],altitudeDelta [m],FC-Map [g/h],FC-Map [g/km],FC-AUXc [g/h],FC-AUXc [g/km],FC-WHTCc [g/h],FC-WHTCc [g/km],FC-AAUX [g/h],FC-AAUX [g/km],FC-Final [g/h],FC-Final [g/km],FC-Final [l/100km],FC-Final [l/100tkm],FC-Final [l/100m³km],CO2 [g/km],CO2 [g/tkm],CO2 [g/m³km],P_wheel_in_pos [kW],P_fcmap_pos [kW],E_fcmap_pos [kWh],E_fcmap_neg [kWh],E_powertrain_inertia [kWh],E_aux_CYCLE [kWh],E_aux_sum [kWh],E_clutch_loss [kWh],E_tc_loss [kWh],E_shift_loss [kWh],E_gbx_loss [kWh],E_ret_loss [kWh],E_angle_loss [kWh],E_axl_loss [kWh],E_brake [kWh],E_vehi_inertia [kWh],E_air [kWh],E_roll [kWh],E_grad [kWh],a [m/s^2],a_pos [m/s^2],a_neg [m/s^2],AccelerationTimeShare [%],DecelerationTimeShare [%],CruiseTimeShare [%],max. speed [km/h],max. acc [m/s²],max. dec [m/s²],n_eng_avg [rpm],n_eng_max [rpm],gear shifts [-],StopTimeShare [%],Engine max. Load time share [%],CoastingTimeShare [%],BrakingTImeShare [%],Gear 0 TimeShare [%],Gear 1 TimeShare [%],Gear 2 TimeShare [%],Gear 3 TimeShare [%],Gear 4 TimeShare [%],Gear 5 TimeShare [%],Gear 6 TimeShare [%]
+11-0,MeasuredSpeed,MeasuredSpeed.vdri,Success,N/A,,N.A.,0,8862.0000,0.0000,8862.0000,N/A,Demo Engine,Diesel CI,0.0000,600.0000,0.0000,6000.0000,1,1,1,0,1,1,6.1650,0.00764995394918169,0.00764995394918169,0.5200,1,1,0,N/A,Demo,MT,6.6960,0.7280,n.a.,n.a.,n.a.,n.a.,None,n.a.,n.a.,n.a.,N/A,Demo,4.3000,,,,,,,,1299.0000,16.8354,46.6571,15.8669,7802.9085,167.2396,7802.9085,167.2396,7802.9085,167.2396,7802.9085,167.2396,7802.9085,167.2396,20.0047,,,523.4600,,,27.2225,37.8292,13.6500,0.2247,0.0000,1.9832,1.9832,0.0054,0.0000,0.0000,0.3207,0.0000,0.0000,1.8492,0.4631,0.0000,5.3351,3.1090,0.3597,0.0000,0.3186,-0.3291,23.3256,22.8637,39.4149,80.5095,1.1306,1.6261,1126.9852,1962.5826,215.0000,14.3957,4.3880,0.0000,39.8768,17.6289,6.9284,0.7698,1.0778,5.1578,48.0370,20.4003
diff --git a/VectoCore/VectoCoreTest/TestData/MeasuredSpeed/Results/MeasuredSpeedAux.vsum b/VectoCore/VectoCoreTest/TestData/MeasuredSpeed/Results/MeasuredSpeedAux.vsum
index 1507e0519ddf9f361cda12c4a8613ddfd7f27eca..88306e681960ff0c212e6dcff35ea8ed8a69c393 100644
--- a/VectoCore/VectoCoreTest/TestData/MeasuredSpeed/Results/MeasuredSpeedAux.vsum
+++ b/VectoCore/VectoCoreTest/TestData/MeasuredSpeed/Results/MeasuredSpeedAux.vsum
@@ -1,2 +1,3 @@
-Job [-],Input File [-],Cycle [-],Status,Vehicle manufacturer [-],VIN number,Vehicle model [-],HDV CO2 vehicle class [-],Chassis curb mass [kg],Loading [kg],Total vehicle mass [kg],Engine manufacturer [-],Engine model [-],Engine fuel type [-],Engine rated power [kW],Engine idling speed [rpm],Engine rated speed [rpm],Engine displacement [ccm],Engine WHTCUrban,Engine WHTCRural,Engine WHTCMotorway,Engine BFColdHot,Engine CFRegPer,Engine actual CF,CdxA [m²],total RRC [-],weighted RRC w/o trailer [-],r_dyn [m],Gearbox manufacturer [-],Gearbox model [-],Gearbox type [-],Gear ratio first gear [-],Gear ratio last gear [-],Torque converter manufacturer [-],Torque converter model [-],Retarder manufacturer [-],Retarder model [-],Retarder type [-],Angledrive manufacturer [-],Angledrive model [-],Angledrive ratio [-],Axle manufacturer [-],Axle model [-],Axle gear ratio [-],Auxiliary technology STP [-],Auxiliary technology FAN [-],Auxiliary technology AC [-],Auxiliary technology PS [-],Auxiliary technology ES [-],Auxiliary technology cycle [-],Auxiliary technology ALT [-],Cargo Volume [m³],time [s],distance [km],speed [km/h],altitudeDelta [m],FC-Map [g/h],FC-Map [g/km],FC-AUXc [g/h],FC-AUXc [g/km],FC-WHTCc [g/h],FC-WHTCc [g/km],FC-AAUX [g/h],FC-AAUX [g/km],FC-Final [g/h],FC-Final [g/km],FC-Final [l/100km],FC-Final [l/100tkm],FC-Final [l/100m³km],CO2 [g/km],CO2 [g/tkm],CO2 [g/m³km],P_wheel_in_pos [kW],P_fcmap_pos [kW],E_fcmap_pos [kWh],E_fcmap_neg [kWh],E_powertrain_inertia [kWh],E_aux_CYCLE [kWh],E_aux_ALT [kWh],E_aux_sum [kWh],E_clutch_loss [kWh],E_tc_loss [kWh],E_shift_loss [kWh],E_gbx_loss [kWh],E_ret_loss [kWh],E_angle_loss [kWh],E_axl_loss [kWh],E_brake [kWh],E_vehi_inertia [kWh],E_air [kWh],E_roll [kWh],E_grad [kWh],a [m/s^2],a_pos [m/s^2],a_neg [m/s^2],AccelerationTimeShare [%],DecelerationTimeShare [%],CruiseTimeShare [%],StopTimeShare [%],max. speed [km/h,max. acc [m/s²],max. dec [m/s²],n_eng_avg [rpm],n_eng_max [rpm],gear shifts [-],Engine max. Load time share [%],CoastingTimeShare [%],BrakingTImeShare [%],Gear 0 TimeShare [%],Gear 1 TimeShare [%],Gear 2 TimeShare [%],Gear 3 TimeShare [%],Gear 4 TimeShare [%],Gear 5 TimeShare [%],Gear 6 TimeShare [%]
-12-0,MeasuredSpeedAux,MeasuredSpeedAux.vdri,Success,N/A,,N.A.,0,8862.0000,0.0000,8862.0000,N/A,Demo Engine,Diesel CI,0.0000,600.0000,0.0000,6000.0000,1,1,1,0,1,1,6.1650,0.00764995394918169,0.00764995394918169,0.5200,N/A,Demo,MT,6.6960,0.7280,n.a.,n.a.,n.a.,n.a.,None,n.a.,n.a.,n.a.,N/A,Demo,4.3000,,,,,,,,,1299.0000,16.8340,46.6530,15.8669,7980.6637,171.0644,7980.6637,171.0644,7980.6637,171.0644,7980.6637,171.0644,7980.6637,171.0644,20.5606,,,540.5634,,,27.2187,38.7930,13.9978,0.2090,0.0000,1.9832,0.3805,2.3637,0.0054,0.0000,0.0000,0.3207,0.0000,0.0000,1.8490,0.4477,0.0000,5.3340,3.1087,0.3597,0.0000,0.3178,-0.3291,23.4026,22.8637,39.3380,14.3957,80.5095,1.1306,1.6261,1126.6442,1962.5826,215.0000,4.6189,0.0000,39.7998,17.6289,6.9284,0.7698,1.0778,5.1578,48.0370,20.4003
+# VECTO 3.1.2.810 - 05.07.2017 13:09
+Job [-],Input File [-],Cycle [-],Status,Vehicle manufacturer [-],VIN number,Vehicle model [-],HDV CO2 vehicle class [-],Corrected Actual Curb Mass [kg],Loading [kg],Total vehicle mass [kg],Engine manufacturer [-],Engine model [-],Engine fuel type [-],Engine rated power [kW],Engine idling speed [rpm],Engine rated speed [rpm],Engine displacement [ccm],Engine WHTCUrban,Engine WHTCRural,Engine WHTCMotorway,Engine BFColdHot,Engine CFRegPer,Engine actual CF,CdxA [m²],total RRC [-],weighted RRC w/o trailer [-],r_dyn [m],Number axles vehicle driven [-],Number axles vehicle non-driven [-],Number axles trailer [-],Gearbox manufacturer [-],Gearbox model [-],Gearbox type [-],Gear ratio first gear [-],Gear ratio last gear [-],Torque converter manufacturer [-],Torque converter model [-],Retarder manufacturer [-],Retarder model [-],Retarder type [-],Angledrive manufacturer [-],Angledrive model [-],Angledrive ratio [-],Axle manufacturer [-],Axle model [-],Axle gear ratio [-],Auxiliary technology STP [-],Auxiliary technology FAN [-],Auxiliary technology AC [-],Auxiliary technology PS [-],Auxiliary technology ES [-],Auxiliary technology cycle [-],Auxiliary technology ALT [-],Cargo Volume [m³],time [s],distance [km],speed [km/h],altitudeDelta [m],FC-Map [g/h],FC-Map [g/km],FC-AUXc [g/h],FC-AUXc [g/km],FC-WHTCc [g/h],FC-WHTCc [g/km],FC-AAUX [g/h],FC-AAUX [g/km],FC-Final [g/h],FC-Final [g/km],FC-Final [l/100km],FC-Final [l/100tkm],FC-Final [l/100m³km],CO2 [g/km],CO2 [g/tkm],CO2 [g/m³km],P_wheel_in_pos [kW],P_fcmap_pos [kW],E_fcmap_pos [kWh],E_fcmap_neg [kWh],E_powertrain_inertia [kWh],E_aux_CYCLE [kWh],E_aux_ALT [kWh],E_aux_sum [kWh],E_clutch_loss [kWh],E_tc_loss [kWh],E_shift_loss [kWh],E_gbx_loss [kWh],E_ret_loss [kWh],E_angle_loss [kWh],E_axl_loss [kWh],E_brake [kWh],E_vehi_inertia [kWh],E_air [kWh],E_roll [kWh],E_grad [kWh],a [m/s^2],a_pos [m/s^2],a_neg [m/s^2],AccelerationTimeShare [%],DecelerationTimeShare [%],CruiseTimeShare [%],max. speed [km/h],max. acc [m/s²],max. dec [m/s²],n_eng_avg [rpm],n_eng_max [rpm],gear shifts [-],StopTimeShare [%],Engine max. Load time share [%],CoastingTimeShare [%],BrakingTImeShare [%],Gear 0 TimeShare [%],Gear 1 TimeShare [%],Gear 2 TimeShare [%],Gear 3 TimeShare [%],Gear 4 TimeShare [%],Gear 5 TimeShare [%],Gear 6 TimeShare [%]
+29-0,MeasuredSpeedAux,MeasuredSpeedAux.vdri,Success,N/A,,N.A.,0,8862.0000,0.0000,8862.0000,N/A,Demo Engine,Diesel CI,0.0000,600.0000,0.0000,6000.0000,1,1,1,0,1,1,6.1650,0.00764995394918169,0.00764995394918169,0.5200,1,1,0,N/A,Demo,MT,6.6960,0.7280,n.a.,n.a.,n.a.,n.a.,None,n.a.,n.a.,n.a.,N/A,Demo,4.3000,,,,,,,,,1299.0000,16.8340,46.6530,15.8669,7980.6637,171.0644,7980.6637,171.0644,7980.6637,171.0644,7980.6637,171.0644,7980.6637,171.0644,20.4622,,,535.4315,,,27.2187,38.7930,13.9978,0.2090,0.0000,1.9832,0.3805,2.3637,0.0054,0.0000,0.0000,0.3207,0.0000,0.0000,1.8490,0.4477,0.0000,5.3340,3.1087,0.3597,0.0000,0.3178,-0.3291,23.4026,22.8637,39.3380,80.5095,1.1306,1.6261,1126.6442,1962.5826,215.0000,14.3957,4.6189,0.0000,39.7998,17.6289,6.9284,0.7698,1.0778,5.1578,48.0370,20.4003
diff --git a/VectoCore/VectoCoreTest/TestData/MeasuredSpeed/Results/MeasuredSpeedGear.vsum b/VectoCore/VectoCoreTest/TestData/MeasuredSpeed/Results/MeasuredSpeedGear.vsum
index f69b5970911632f5067de92d9409bcc83224950e..a7851512f98076d105ae32d10c395c72f198ef02 100644
--- a/VectoCore/VectoCoreTest/TestData/MeasuredSpeed/Results/MeasuredSpeedGear.vsum
+++ b/VectoCore/VectoCoreTest/TestData/MeasuredSpeed/Results/MeasuredSpeedGear.vsum
@@ -1,2 +1,3 @@
-Job [-],Input File [-],Cycle [-],Status,Vehicle manufacturer [-],VIN number,Vehicle model [-],HDV CO2 vehicle class [-],Chassis curb mass [kg],Loading [kg],Total vehicle mass [kg],Engine manufacturer [-],Engine model [-],Engine fuel type [-],Engine rated power [kW],Engine idling speed [rpm],Engine rated speed [rpm],Engine displacement [ccm],Engine WHTCUrban,Engine WHTCRural,Engine WHTCMotorway,Engine BFColdHot,Engine CFRegPer,Engine actual CF,CdxA [m²],total RRC [-],weighted RRC w/o trailer [-],r_dyn [m],Gearbox manufacturer [-],Gearbox model [-],Gearbox type [-],Gear ratio first gear [-],Gear ratio last gear [-],Torque converter manufacturer [-],Torque converter model [-],Retarder manufacturer [-],Retarder model [-],Retarder type [-],Angledrive manufacturer [-],Angledrive model [-],Angledrive ratio [-],Axle manufacturer [-],Axle model [-],Axle gear ratio [-],Auxiliary technology STP [-],Auxiliary technology FAN [-],Auxiliary technology AC [-],Auxiliary technology PS [-],Auxiliary technology ES [-],Auxiliary technology cycle [-],Cargo Volume [m³],time [s],distance [km],speed [km/h],altitudeDelta [m],FC-Map [g/h],FC-Map [g/km],FC-AUXc [g/h],FC-AUXc [g/km],FC-WHTCc [g/h],FC-WHTCc [g/km],FC-AAUX [g/h],FC-AAUX [g/km],FC-Final [g/h],FC-Final [g/km],FC-Final [l/100km],FC-Final [l/100tkm],FC-Final [l/100m³km],CO2 [g/km],CO2 [g/tkm],CO2 [g/m³km],P_wheel_in_pos [kW],P_fcmap_pos [kW],E_fcmap_pos [kWh],E_fcmap_neg [kWh],E_powertrain_inertia [kWh],E_aux_CYCLE [kWh],E_aux_sum [kWh],E_clutch_loss [kWh],E_tc_loss [kWh],E_shift_loss [kWh],E_gbx_loss [kWh],E_ret_loss [kWh],E_angle_loss [kWh],E_axl_loss [kWh],E_brake [kWh],E_vehi_inertia [kWh],E_air [kWh],E_roll [kWh],E_grad [kWh],a [m/s^2],a_pos [m/s^2],a_neg [m/s^2],AccelerationTimeShare [%],DecelerationTimeShare [%],CruiseTimeShare [%],StopTimeShare [%],max. speed [km/h,max. acc [m/s²],max. dec [m/s²],n_eng_avg [rpm],n_eng_max [rpm],gear shifts [-],Engine max. Load time share [%],CoastingTimeShare [%],BrakingTImeShare [%],Gear 0 TimeShare [%],Gear 1 TimeShare [%],Gear 2 TimeShare [%],Gear 3 TimeShare [%],Gear 4 TimeShare [%],Gear 5 TimeShare [%],Gear 6 TimeShare [%]
-18-0,MeasuredSpeedGear,MeasuredSpeed_Gear_Rural.vdri,Success,N/A,,N.A.,0,8862.0000,0.0000,8862.0000,N/A,Demo Engine,Diesel CI,0.0000,600.0000,0.0000,6000.0000,1,1,1,0,1,1,6.1650,0.00764995394918169,0.00764995394918169,0.5200,N/A,Demo,MT,6.6960,0.7280,n.a.,n.a.,n.a.,n.a.,None,n.a.,n.a.,n.a.,N/A,Demo,4.3000,,,,,,,,1299.0000,16.8712,46.7563,15.8669,7798.8920,166.7987,7798.8920,166.7987,7798.8920,166.7987,7798.8920,166.7987,7798.8920,166.7987,20.0479,,,527.0839,,,27.2335,37.7843,13.6338,0.1855,0.0000,1.9832,1.9832,0.0227,0.0000,0.0000,0.3036,0.0000,0.0000,1.8506,0.4425,0.0000,5.3535,3.1156,0.3598,0.0000,0.3070,-0.3441,23.5566,21.4011,40.6467,14.3957,80.5095,1.4057,1.9402,1082.0265,1962.3354,210.0000,3.3872,0.0000,40.1848,14.3957,1.7706,7.2363,1.6166,1.6936,49.9615,23.3256
+# VECTO 3.1.2.810 - 05.07.2017 13:04
+Job [-],Input File [-],Cycle [-],Status,Vehicle manufacturer [-],VIN number,Vehicle model [-],HDV CO2 vehicle class [-],Corrected Actual Curb Mass [kg],Loading [kg],Total vehicle mass [kg],Engine manufacturer [-],Engine model [-],Engine fuel type [-],Engine rated power [kW],Engine idling speed [rpm],Engine rated speed [rpm],Engine displacement [ccm],Engine WHTCUrban,Engine WHTCRural,Engine WHTCMotorway,Engine BFColdHot,Engine CFRegPer,Engine actual CF,CdxA [m²],total RRC [-],weighted RRC w/o trailer [-],r_dyn [m],Number axles vehicle driven [-],Number axles vehicle non-driven [-],Number axles trailer [-],Gearbox manufacturer [-],Gearbox model [-],Gearbox type [-],Gear ratio first gear [-],Gear ratio last gear [-],Torque converter manufacturer [-],Torque converter model [-],Retarder manufacturer [-],Retarder model [-],Retarder type [-],Angledrive manufacturer [-],Angledrive model [-],Angledrive ratio [-],Axle manufacturer [-],Axle model [-],Axle gear ratio [-],Auxiliary technology STP [-],Auxiliary technology FAN [-],Auxiliary technology AC [-],Auxiliary technology PS [-],Auxiliary technology ES [-],Auxiliary technology cycle [-],Cargo Volume [m³],time [s],distance [km],speed [km/h],altitudeDelta [m],FC-Map [g/h],FC-Map [g/km],FC-AUXc [g/h],FC-AUXc [g/km],FC-WHTCc [g/h],FC-WHTCc [g/km],FC-AAUX [g/h],FC-AAUX [g/km],FC-Final [g/h],FC-Final [g/km],FC-Final [l/100km],FC-Final [l/100tkm],FC-Final [l/100m³km],CO2 [g/km],CO2 [g/tkm],CO2 [g/m³km],P_wheel_in_pos [kW],P_fcmap_pos [kW],E_fcmap_pos [kWh],E_fcmap_neg [kWh],E_powertrain_inertia [kWh],E_aux_CYCLE [kWh],E_aux_sum [kWh],E_clutch_loss [kWh],E_tc_loss [kWh],E_shift_loss [kWh],E_gbx_loss [kWh],E_ret_loss [kWh],E_angle_loss [kWh],E_axl_loss [kWh],E_brake [kWh],E_vehi_inertia [kWh],E_air [kWh],E_roll [kWh],E_grad [kWh],a [m/s^2],a_pos [m/s^2],a_neg [m/s^2],AccelerationTimeShare [%],DecelerationTimeShare [%],CruiseTimeShare [%],max. speed [km/h],max. acc [m/s²],max. dec [m/s²],n_eng_avg [rpm],n_eng_max [rpm],gear shifts [-],StopTimeShare [%],Engine max. Load time share [%],CoastingTimeShare [%],BrakingTImeShare [%],Gear 0 TimeShare [%],Gear 1 TimeShare [%],Gear 2 TimeShare [%],Gear 3 TimeShare [%],Gear 4 TimeShare [%],Gear 5 TimeShare [%],Gear 6 TimeShare [%]
+2-0,MeasuredSpeedGear,MeasuredSpeed_Gear_Rural.vdri,Success,N/A,,N.A.,0,8862.0000,0.0000,8862.0000,N/A,Demo Engine,Diesel CI,0.0000,600.0000,0.0000,6000.0000,1,1,1,0,1,1,6.1650,0.00764995394918169,0.00764995394918169,0.5200,1,1,0,N/A,Demo,MT,6.6960,0.7280,n.a.,n.a.,n.a.,n.a.,None,n.a.,n.a.,n.a.,N/A,Demo,4.3000,,,,,,,,1299.0000,16.8712,46.7563,15.8669,7798.8920,166.7987,7798.8920,166.7987,7798.8920,166.7987,7798.8920,166.7987,7798.8920,166.7987,19.9520,,,522.0799,,,27.2335,37.7843,13.6338,0.1855,0.0000,1.9832,1.9832,0.0227,0.0000,0.0000,0.3036,0.0000,0.0000,1.8506,0.4425,0.0000,5.3535,3.1156,0.3598,0.0000,0.3070,-0.3441,23.5566,21.4011,40.6467,80.5095,1.4057,1.9402,1082.0265,1962.3354,211.0000,14.3957,3.3872,0.0000,40.1848,14.3957,1.7706,7.2363,1.6166,1.6936,49.9615,23.3256
diff --git a/VectoCore/VectoCoreTest/TestData/MeasuredSpeed/Results/MeasuredSpeedGearAT-PS.vsum b/VectoCore/VectoCoreTest/TestData/MeasuredSpeed/Results/MeasuredSpeedGearAT-PS.vsum
index ac48ed31fb069fd9b81bca6c785e32038effa169..c3978894dcb75020a4a8bd89012ebf38af3cf58e 100644
--- a/VectoCore/VectoCoreTest/TestData/MeasuredSpeed/Results/MeasuredSpeedGearAT-PS.vsum
+++ b/VectoCore/VectoCoreTest/TestData/MeasuredSpeed/Results/MeasuredSpeedGearAT-PS.vsum
@@ -1,2 +1,3 @@
-Job [-],Input File [-],Cycle [-],Status,Vehicle manufacturer [-],VIN number,Vehicle model [-],HDV CO2 vehicle class [-],Chassis curb mass [kg],Loading [kg],Total vehicle mass [kg],Engine manufacturer [-],Engine model [-],Engine fuel type [-],Engine rated power [kW],Engine idling speed [rpm],Engine rated speed [rpm],Engine displacement [ccm],Engine WHTCUrban,Engine WHTCRural,Engine WHTCMotorway,Engine BFColdHot,Engine CFRegPer,Engine actual CF,CdxA [m²],total RRC [-],weighted RRC w/o trailer [-],r_dyn [m],Gearbox manufacturer [-],Gearbox model [-],Gearbox type [-],Gear ratio first gear [-],Gear ratio last gear [-],Torque converter manufacturer [-],Torque converter model [-],Retarder manufacturer [-],Retarder model [-],Retarder type [-],Angledrive manufacturer [-],Angledrive model [-],Angledrive ratio [-],Axle manufacturer [-],Axle model [-],Axle gear ratio [-],Auxiliary technology STP [-],Auxiliary technology FAN [-],Auxiliary technology AC [-],Auxiliary technology PS [-],Auxiliary technology ES [-],Auxiliary technology cycle [-],Cargo Volume [m³],time [s],distance [km],speed [km/h],altitudeDelta [m],FC-Map [g/h],FC-Map [g/km],FC-AUXc [g/h],FC-AUXc [g/km],FC-WHTCc [g/h],FC-WHTCc [g/km],FC-AAUX [g/h],FC-AAUX [g/km],FC-Final [g/h],FC-Final [g/km],FC-Final [l/100km],FC-Final [l/100tkm],FC-Final [l/100m³km],CO2 [g/km],CO2 [g/tkm],CO2 [g/m³km],P_wheel_in_pos [kW],P_fcmap_pos [kW],E_fcmap_pos [kWh],E_fcmap_neg [kWh],E_powertrain_inertia [kWh],E_aux_CYCLE [kWh],E_aux_sum [kWh],E_clutch_loss [kWh],E_tc_loss [kWh],E_shift_loss [kWh],E_gbx_loss [kWh],E_ret_loss [kWh],E_angle_loss [kWh],E_axl_loss [kWh],E_brake [kWh],E_vehi_inertia [kWh],E_air [kWh],E_roll [kWh],E_grad [kWh],a [m/s^2],a_pos [m/s^2],a_neg [m/s^2],AccelerationTimeShare [%],DecelerationTimeShare [%],CruiseTimeShare [%],StopTimeShare [%],max. speed [km/h,max. acc [m/s²],max. dec [m/s²],n_eng_avg [rpm],n_eng_max [rpm],gear shifts [-],Engine max. Load time share [%],CoastingTimeShare [%],BrakingTImeShare [%],Gear 0 TimeShare [%],Gear 1 TimeShare [%],Gear 2 TimeShare [%],Gear 3 TimeShare [%]
-23-0,MeasuredSpeedGearAT-PS,MeasuredSpeedGear_AT-PS.vdri,Success,N/A,,N.A.,0,17000.0000,4800.0000,21800.0000,N/A,Generic Engine,Diesel CI,0.0000,560.0000,0.0000,12730.0000,1,1,1,0,1,1,3.2500,0.00590364808199548,0.00590364808199548,0.4700,N/A,AT Serial,ATPowerSplit,1.3500,0.7300,,,n.a.,n.a.,None,n.a.,n.a.,n.a.,N/A,AT Serial,5.8000,,,,,,,,379.0000,2.8856,27.4096,0.0036,10214.5287,372.6620,10214.5287,372.6620,10214.5287,372.6620,10214.5287,372.6620,10214.5287,372.6620,44.7911,9.3315,,1177.6120,245.3358,,40.8256,50.3483,5.3006,0.3386,0.0000,0.4738,0.4738,0.0000,0.3048,5.1676,0.1289,0.0000,0.0000,0.0963,2.6367,-0.0001,0.2436,1.0118,0.0002,-0.0004,0.6313,-0.8532,32.7177,24.0106,23.2190,20.0528,60.3000,1.1111,1.6111,954.9245,1538.8058,106.0000,0.0000,0.0000,33.7731,26.3852,20.3166,11.6095,41.6887
+# VECTO 3.1.2.810 - 05.07.2017 13:09
+Job [-],Input File [-],Cycle [-],Status,Vehicle manufacturer [-],VIN number,Vehicle model [-],HDV CO2 vehicle class [-],Corrected Actual Curb Mass [kg],Loading [kg],Total vehicle mass [kg],Engine manufacturer [-],Engine model [-],Engine fuel type [-],Engine rated power [kW],Engine idling speed [rpm],Engine rated speed [rpm],Engine displacement [ccm],Engine WHTCUrban,Engine WHTCRural,Engine WHTCMotorway,Engine BFColdHot,Engine CFRegPer,Engine actual CF,CdxA [m²],total RRC [-],weighted RRC w/o trailer [-],r_dyn [m],Number axles vehicle driven [-],Number axles vehicle non-driven [-],Number axles trailer [-],Gearbox manufacturer [-],Gearbox model [-],Gearbox type [-],Gear ratio first gear [-],Gear ratio last gear [-],Torque converter manufacturer [-],Torque converter model [-],Retarder manufacturer [-],Retarder model [-],Retarder type [-],Angledrive manufacturer [-],Angledrive model [-],Angledrive ratio [-],Axle manufacturer [-],Axle model [-],Axle gear ratio [-],Auxiliary technology STP [-],Auxiliary technology FAN [-],Auxiliary technology AC [-],Auxiliary technology PS [-],Auxiliary technology ES [-],Auxiliary technology cycle [-],Cargo Volume [m³],time [s],distance [km],speed [km/h],altitudeDelta [m],FC-Map [g/h],FC-Map [g/km],FC-AUXc [g/h],FC-AUXc [g/km],FC-WHTCc [g/h],FC-WHTCc [g/km],FC-AAUX [g/h],FC-AAUX [g/km],FC-Final [g/h],FC-Final [g/km],FC-Final [l/100km],FC-Final [l/100tkm],FC-Final [l/100m³km],CO2 [g/km],CO2 [g/tkm],CO2 [g/m³km],P_wheel_in_pos [kW],P_fcmap_pos [kW],E_fcmap_pos [kWh],E_fcmap_neg [kWh],E_powertrain_inertia [kWh],E_aux_CYCLE [kWh],E_aux_sum [kWh],E_clutch_loss [kWh],E_tc_loss [kWh],E_shift_loss [kWh],E_gbx_loss [kWh],E_ret_loss [kWh],E_angle_loss [kWh],E_axl_loss [kWh],E_brake [kWh],E_vehi_inertia [kWh],E_air [kWh],E_roll [kWh],E_grad [kWh],a [m/s^2],a_pos [m/s^2],a_neg [m/s^2],AccelerationTimeShare [%],DecelerationTimeShare [%],CruiseTimeShare [%],max. speed [km/h],max. acc [m/s²],max. dec [m/s²],n_eng_avg [rpm],n_eng_max [rpm],gear shifts [-],StopTimeShare [%],Engine max. Load time share [%],CoastingTimeShare [%],BrakingTImeShare [%],Gear 0 TimeShare [%],Gear 1 TimeShare [%],Gear 2 TimeShare [%],Gear 3 TimeShare [%]
+27-0,MeasuredSpeedGearAT-PS,MeasuredSpeedGear_AT-PS.vdri,Success,N/A,,N.A.,0,17000.0000,4800.0000,21800.0000,N/A,Generic Engine,Diesel CI,0.0000,560.0000,0.0000,12730.0000,1,1,1,0,1,1,3.2500,0.00590364808199548,0.00590364808199548,0.4700,1,2,0,N/A,AT Serial,ATPowerSplit,1.3500,0.7300,,,n.a.,n.a.,None,n.a.,n.a.,n.a.,N/A,AT Serial,5.8000,,,,,,,,379.0000,2.8856,27.4096,0.0036,10214.5287,372.6620,10214.5287,372.6620,10214.5287,372.6620,10214.5287,372.6620,10214.5287,372.6620,44.5768,9.2868,,1166.4322,243.0067,,40.8256,50.3483,5.3006,0.3386,0.0000,0.4738,0.4738,0.0000,0.3048,5.1676,0.1289,0.0000,0.0000,0.0963,2.6367,-0.0001,0.2436,1.0118,0.0002,-0.0004,0.6313,-0.8532,32.7177,24.0106,23.2190,60.3000,1.1111,1.6111,954.9245,1538.8058,106.0000,20.0528,0.0000,0.0000,33.7731,26.3852,20.3166,11.6095,41.6887
diff --git a/VectoCore/VectoCoreTest/TestData/MeasuredSpeed/Results/MeasuredSpeedGearAT-Ser.vsum b/VectoCore/VectoCoreTest/TestData/MeasuredSpeed/Results/MeasuredSpeedGearAT-Ser.vsum
index f38f36b15c4397c524ef348630b49ff44462e0ef..a2dd6d14b5d146ef62215131574fe236b230efda 100644
--- a/VectoCore/VectoCoreTest/TestData/MeasuredSpeed/Results/MeasuredSpeedGearAT-Ser.vsum
+++ b/VectoCore/VectoCoreTest/TestData/MeasuredSpeed/Results/MeasuredSpeedGearAT-Ser.vsum
@@ -1,2 +1,3 @@
-Job [-],Input File [-],Cycle [-],Status,Vehicle manufacturer [-],VIN number,Vehicle model [-],HDV CO2 vehicle class [-],Chassis curb mass [kg],Loading [kg],Total vehicle mass [kg],Engine manufacturer [-],Engine model [-],Engine fuel type [-],Engine rated power [kW],Engine idling speed [rpm],Engine rated speed [rpm],Engine displacement [ccm],Engine WHTCUrban,Engine WHTCRural,Engine WHTCMotorway,Engine BFColdHot,Engine CFRegPer,Engine actual CF,CdxA [m²],total RRC [-],weighted RRC w/o trailer [-],r_dyn [m],Gearbox manufacturer [-],Gearbox model [-],Gearbox type [-],Gear ratio first gear [-],Gear ratio last gear [-],Torque converter manufacturer [-],Torque converter model [-],Retarder manufacturer [-],Retarder model [-],Retarder type [-],Angledrive manufacturer [-],Angledrive model [-],Angledrive ratio [-],Axle manufacturer [-],Axle model [-],Axle gear ratio [-],Auxiliary technology STP [-],Auxiliary technology FAN [-],Auxiliary technology AC [-],Auxiliary technology PS [-],Auxiliary technology ES [-],Auxiliary technology cycle [-],Cargo Volume [m³],time [s],distance [km],speed [km/h],altitudeDelta [m],FC-Map [g/h],FC-Map [g/km],FC-AUXc [g/h],FC-AUXc [g/km],FC-WHTCc [g/h],FC-WHTCc [g/km],FC-AAUX [g/h],FC-AAUX [g/km],FC-Final [g/h],FC-Final [g/km],FC-Final [l/100km],FC-Final [l/100tkm],FC-Final [l/100m³km],CO2 [g/km],CO2 [g/tkm],CO2 [g/m³km],P_wheel_in_pos [kW],P_fcmap_pos [kW],E_fcmap_pos [kWh],E_fcmap_neg [kWh],E_powertrain_inertia [kWh],E_aux_CYCLE [kWh],E_aux_sum [kWh],E_clutch_loss [kWh],E_tc_loss [kWh],E_shift_loss [kWh],E_gbx_loss [kWh],E_ret_loss [kWh],E_angle_loss [kWh],E_axl_loss [kWh],E_brake [kWh],E_vehi_inertia [kWh],E_air [kWh],E_roll [kWh],E_grad [kWh],a [m/s^2],a_pos [m/s^2],a_neg [m/s^2],AccelerationTimeShare [%],DecelerationTimeShare [%],CruiseTimeShare [%],StopTimeShare [%],max. speed [km/h,max. acc [m/s²],max. dec [m/s²],n_eng_avg [rpm],n_eng_max [rpm],gear shifts [-],Engine max. Load time share [%],CoastingTimeShare [%],BrakingTImeShare [%],Gear 0 TimeShare [%],Gear 1 TimeShare [%],Gear 2 TimeShare [%],Gear 3 TimeShare [%],Gear 4 TimeShare [%],Gear 5 TimeShare [%],Gear 6 TimeShare [%]
-24-0,MeasuredSpeedGearAT-Ser,MeasuredSpeedGear_AT-Ser.vdri,Success,N/A,,N.A.,0,17000.0000,4800.0000,21800.0000,N/A,Generic Engine,Diesel CI,0.0000,560.0000,0.0000,12730.0000,1,1,1,0,1,1,3.2500,0.00590364808199548,0.00590364808199548,0.4700,N/A,AT Serial,ATSerial,3.4000,0.6200,,,n.a.,n.a.,None,n.a.,n.a.,n.a.,N/A,AT Serial,6.2000,,,,,,,,272.0000,1.0225,13.5328,-0.0054,7376.1702,545.0599,7376.1702,545.0599,7376.1702,545.0599,7376.1702,545.0599,7376.1702,545.0599,65.5120,13.6483,,1722.3894,358.8311,,23.4097,33.1204,2.5024,0.3511,0.0000,0.3400,0.3400,0.0000,0.0420,20.9532,0.1462,0.0000,0.0000,0.0453,0.9515,0.0000,0.0338,0.3586,0.0000,-0.0002,0.8827,-0.7816,22.4265,25.0000,18.7500,33.8235,40.6000,1.6935,1.3056,979.1068,1857.4892,138.0000,1.8382,0.0000,33.4559,33.8235,24.6324,8.0882,14.7059,13.6029,5.1471,0.0000
+# VECTO 3.1.2.810 - 05.07.2017 13:09
+Job [-],Input File [-],Cycle [-],Status,Vehicle manufacturer [-],VIN number,Vehicle model [-],HDV CO2 vehicle class [-],Corrected Actual Curb Mass [kg],Loading [kg],Total vehicle mass [kg],Engine manufacturer [-],Engine model [-],Engine fuel type [-],Engine rated power [kW],Engine idling speed [rpm],Engine rated speed [rpm],Engine displacement [ccm],Engine WHTCUrban,Engine WHTCRural,Engine WHTCMotorway,Engine BFColdHot,Engine CFRegPer,Engine actual CF,CdxA [m²],total RRC [-],weighted RRC w/o trailer [-],r_dyn [m],Number axles vehicle driven [-],Number axles vehicle non-driven [-],Number axles trailer [-],Gearbox manufacturer [-],Gearbox model [-],Gearbox type [-],Gear ratio first gear [-],Gear ratio last gear [-],Torque converter manufacturer [-],Torque converter model [-],Retarder manufacturer [-],Retarder model [-],Retarder type [-],Angledrive manufacturer [-],Angledrive model [-],Angledrive ratio [-],Axle manufacturer [-],Axle model [-],Axle gear ratio [-],Auxiliary technology STP [-],Auxiliary technology FAN [-],Auxiliary technology AC [-],Auxiliary technology PS [-],Auxiliary technology ES [-],Auxiliary technology cycle [-],Cargo Volume [m³],time [s],distance [km],speed [km/h],altitudeDelta [m],FC-Map [g/h],FC-Map [g/km],FC-AUXc [g/h],FC-AUXc [g/km],FC-WHTCc [g/h],FC-WHTCc [g/km],FC-AAUX [g/h],FC-AAUX [g/km],FC-Final [g/h],FC-Final [g/km],FC-Final [l/100km],FC-Final [l/100tkm],FC-Final [l/100m³km],CO2 [g/km],CO2 [g/tkm],CO2 [g/m³km],P_wheel_in_pos [kW],P_fcmap_pos [kW],E_fcmap_pos [kWh],E_fcmap_neg [kWh],E_powertrain_inertia [kWh],E_aux_CYCLE [kWh],E_aux_sum [kWh],E_clutch_loss [kWh],E_tc_loss [kWh],E_shift_loss [kWh],E_gbx_loss [kWh],E_ret_loss [kWh],E_angle_loss [kWh],E_axl_loss [kWh],E_brake [kWh],E_vehi_inertia [kWh],E_air [kWh],E_roll [kWh],E_grad [kWh],a [m/s^2],a_pos [m/s^2],a_neg [m/s^2],AccelerationTimeShare [%],DecelerationTimeShare [%],CruiseTimeShare [%],max. speed [km/h],max. acc [m/s²],max. dec [m/s²],n_eng_avg [rpm],n_eng_max [rpm],gear shifts [-],StopTimeShare [%],Engine max. Load time share [%],CoastingTimeShare [%],BrakingTImeShare [%],Gear 0 TimeShare [%],Gear 1 TimeShare [%],Gear 2 TimeShare [%],Gear 3 TimeShare [%],Gear 4 TimeShare [%],Gear 5 TimeShare [%],Gear 6 TimeShare [%]
+28-0,MeasuredSpeedGearAT-Ser,MeasuredSpeedGear_AT-Ser.vdri,Success,N/A,,N.A.,0,17000.0000,4800.0000,21800.0000,N/A,Generic Engine,Diesel CI,0.0000,560.0000,0.0000,12730.0000,1,1,1,0,1,1,3.2500,0.00590364808199548,0.00590364808199548,0.4700,1,2,0,N/A,AT Serial,ATSerial,3.4000,0.6200,,,n.a.,n.a.,None,n.a.,n.a.,n.a.,N/A,AT Serial,6.2000,,,,,,,,272.0000,1.0225,13.5328,-0.0054,7376.1701,545.0599,7376.1701,545.0599,7376.1701,545.0599,7376.1701,545.0599,7376.1701,545.0599,65.1986,13.5830,,1706.0376,355.4245,,23.4097,33.1204,2.5024,0.3511,0.0000,0.3400,0.3400,0.0000,0.0420,20.9532,0.1462,0.0000,0.0000,0.0453,0.9515,0.0000,0.0338,0.3586,0.0000,-0.0002,0.8827,-0.7816,22.4265,25.0000,18.7500,40.6000,1.6935,1.3056,979.1068,1857.4892,140.0000,33.8235,1.8382,0.0000,33.4559,33.8235,24.6324,8.0882,14.7059,13.6029,5.1471,0.0000
diff --git a/VectoCore/VectoCoreTest/TestData/MeasuredSpeed/Results/MeasuredSpeedGearAux.vsum b/VectoCore/VectoCoreTest/TestData/MeasuredSpeed/Results/MeasuredSpeedGearAux.vsum
index 6230cccc6f5c9cdaf985db886d6072f2b25aa2bb..ef18a6a2408f6825c7e84fc39e783f1d29fbb13a 100644
--- a/VectoCore/VectoCoreTest/TestData/MeasuredSpeed/Results/MeasuredSpeedGearAux.vsum
+++ b/VectoCore/VectoCoreTest/TestData/MeasuredSpeed/Results/MeasuredSpeedGearAux.vsum
@@ -1,2 +1,3 @@
-Job [-],Input File [-],Cycle [-],Status,Vehicle manufacturer [-],VIN number,Vehicle model [-],HDV CO2 vehicle class [-],Chassis curb mass [kg],Loading [kg],Total vehicle mass [kg],Engine manufacturer [-],Engine model [-],Engine fuel type [-],Engine rated power [kW],Engine idling speed [rpm],Engine rated speed [rpm],Engine displacement [ccm],Engine WHTCUrban,Engine WHTCRural,Engine WHTCMotorway,Engine BFColdHot,Engine CFRegPer,Engine actual CF,CdxA [m²],total RRC [-],weighted RRC w/o trailer [-],r_dyn [m],Gearbox manufacturer [-],Gearbox model [-],Gearbox type [-],Gear ratio first gear [-],Gear ratio last gear [-],Torque converter manufacturer [-],Torque converter model [-],Retarder manufacturer [-],Retarder model [-],Retarder type [-],Angledrive manufacturer [-],Angledrive model [-],Angledrive ratio [-],Axle manufacturer [-],Axle model [-],Axle gear ratio [-],Auxiliary technology STP [-],Auxiliary technology FAN [-],Auxiliary technology AC [-],Auxiliary technology PS [-],Auxiliary technology ES [-],Auxiliary technology cycle [-],Auxiliary technology ALT [-],Cargo Volume [m³],time [s],distance [km],speed [km/h],altitudeDelta [m],FC-Map [g/h],FC-Map [g/km],FC-AUXc [g/h],FC-AUXc [g/km],FC-WHTCc [g/h],FC-WHTCc [g/km],FC-AAUX [g/h],FC-AAUX [g/km],FC-Final [g/h],FC-Final [g/km],FC-Final [l/100km],FC-Final [l/100tkm],FC-Final [l/100m³km],CO2 [g/km],CO2 [g/tkm],CO2 [g/m³km],P_wheel_in_pos [kW],P_fcmap_pos [kW],E_fcmap_pos [kWh],E_fcmap_neg [kWh],E_powertrain_inertia [kWh],E_aux_CYCLE [kWh],E_aux_ALT [kWh],E_aux_sum [kWh],E_clutch_loss [kWh],E_tc_loss [kWh],E_shift_loss [kWh],E_gbx_loss [kWh],E_ret_loss [kWh],E_angle_loss [kWh],E_axl_loss [kWh],E_brake [kWh],E_vehi_inertia [kWh],E_air [kWh],E_roll [kWh],E_grad [kWh],a [m/s^2],a_pos [m/s^2],a_neg [m/s^2],AccelerationTimeShare [%],DecelerationTimeShare [%],CruiseTimeShare [%],StopTimeShare [%],max. speed [km/h,max. acc [m/s²],max. dec [m/s²],n_eng_avg [rpm],n_eng_max [rpm],gear shifts [-],Engine max. Load time share [%],CoastingTimeShare [%],BrakingTImeShare [%],Gear 0 TimeShare [%],Gear 1 TimeShare [%],Gear 2 TimeShare [%],Gear 3 TimeShare [%],Gear 4 TimeShare [%],Gear 5 TimeShare [%],Gear 6 TimeShare [%]
-20-0,MeasuredSpeedGearAux,MeasuredSpeed_Gear_Rural_Aux.vdri,Success,N/A,,N.A.,0,8862.0000,0.0000,8862.0000,N/A,Demo Engine,Diesel CI,0.0000,600.0000,0.0000,6000.0000,1,1,1,0,1,1,6.1650,0.00764995394918169,0.00764995394918169,0.5200,N/A,Demo,MT,6.6960,0.7280,n.a.,n.a.,n.a.,n.a.,None,n.a.,n.a.,n.a.,N/A,Demo,4.3000,,,,,,,,,1299.0000,16.8692,46.7506,15.8669,7952.3686,170.1019,7952.3686,170.1019,7952.3686,170.1019,7952.3686,170.1019,7952.3686,170.1019,20.4449,,,537.5221,,,27.2199,38.7271,13.9740,0.1710,0.0000,1.9829,0.3775,2.3604,0.0227,0.0000,0.0000,0.3048,0.0000,0.0000,1.8503,0.4150,0.0000,5.3532,3.1153,0.3598,0.0000,0.3034,-0.3378,23.4796,21.4781,40.6467,14.3957,80.5095,1.1306,1.6261,1087.0085,1962.3354,212.0000,3.4642,0.0000,40.1848,14.8576,1.6166,7.5443,1.2317,2.1555,49.2687,23.3256
+# VECTO 3.1.2.810 - 05.07.2017 13:07
+Job [-],Input File [-],Cycle [-],Status,Vehicle manufacturer [-],VIN number,Vehicle model [-],HDV CO2 vehicle class [-],Corrected Actual Curb Mass [kg],Loading [kg],Total vehicle mass [kg],Engine manufacturer [-],Engine model [-],Engine fuel type [-],Engine rated power [kW],Engine idling speed [rpm],Engine rated speed [rpm],Engine displacement [ccm],Engine WHTCUrban,Engine WHTCRural,Engine WHTCMotorway,Engine BFColdHot,Engine CFRegPer,Engine actual CF,CdxA [m²],total RRC [-],weighted RRC w/o trailer [-],r_dyn [m],Number axles vehicle driven [-],Number axles vehicle non-driven [-],Number axles trailer [-],Gearbox manufacturer [-],Gearbox model [-],Gearbox type [-],Gear ratio first gear [-],Gear ratio last gear [-],Torque converter manufacturer [-],Torque converter model [-],Retarder manufacturer [-],Retarder model [-],Retarder type [-],Angledrive manufacturer [-],Angledrive model [-],Angledrive ratio [-],Axle manufacturer [-],Axle model [-],Axle gear ratio [-],Auxiliary technology STP [-],Auxiliary technology FAN [-],Auxiliary technology AC [-],Auxiliary technology PS [-],Auxiliary technology ES [-],Auxiliary technology cycle [-],Auxiliary technology ALT [-],Cargo Volume [m³],time [s],distance [km],speed [km/h],altitudeDelta [m],FC-Map [g/h],FC-Map [g/km],FC-AUXc [g/h],FC-AUXc [g/km],FC-WHTCc [g/h],FC-WHTCc [g/km],FC-AAUX [g/h],FC-AAUX [g/km],FC-Final [g/h],FC-Final [g/km],FC-Final [l/100km],FC-Final [l/100tkm],FC-Final [l/100m³km],CO2 [g/km],CO2 [g/tkm],CO2 [g/m³km],P_wheel_in_pos [kW],P_fcmap_pos [kW],E_fcmap_pos [kWh],E_fcmap_neg [kWh],E_powertrain_inertia [kWh],E_aux_CYCLE [kWh],E_aux_ALT [kWh],E_aux_sum [kWh],E_clutch_loss [kWh],E_tc_loss [kWh],E_shift_loss [kWh],E_gbx_loss [kWh],E_ret_loss [kWh],E_angle_loss [kWh],E_axl_loss [kWh],E_brake [kWh],E_vehi_inertia [kWh],E_air [kWh],E_roll [kWh],E_grad [kWh],a [m/s^2],a_pos [m/s^2],a_neg [m/s^2],AccelerationTimeShare [%],DecelerationTimeShare [%],CruiseTimeShare [%],max. speed [km/h],max. acc [m/s²],max. dec [m/s²],n_eng_avg [rpm],n_eng_max [rpm],gear shifts [-],StopTimeShare [%],Engine max. Load time share [%],CoastingTimeShare [%],BrakingTImeShare [%],Gear 0 TimeShare [%],Gear 1 TimeShare [%],Gear 2 TimeShare [%],Gear 3 TimeShare [%],Gear 4 TimeShare [%],Gear 5 TimeShare [%],Gear 6 TimeShare [%]
+16-0,MeasuredSpeedGearAux,MeasuredSpeed_Gear_Rural_Aux.vdri,Success,N/A,,N.A.,0,8862.0000,0.0000,8862.0000,N/A,Demo Engine,Diesel CI,0.0000,600.0000,0.0000,6000.0000,1,1,1,0,1,1,6.1650,0.00764995394918169,0.00764995394918169,0.5200,1,1,0,N/A,Demo,MT,6.6960,0.7280,n.a.,n.a.,n.a.,n.a.,None,n.a.,n.a.,n.a.,N/A,Demo,4.3000,,,,,,,,,1299.0000,16.8692,46.7506,15.8669,7952.3686,170.1019,7952.3686,170.1019,7952.3686,170.1019,7952.3686,170.1019,7952.3686,170.1019,20.3471,,,532.4190,,,27.2199,38.7271,13.9740,0.1710,0.0000,1.9829,0.3775,2.3604,0.0227,0.0000,0.0000,0.3048,0.0000,0.0000,1.8503,0.4150,0.0000,5.3532,3.1153,0.3598,0.0000,0.3034,-0.3378,23.4796,21.4781,40.6467,80.5095,1.1306,1.6261,1087.0085,1962.3354,212.0000,14.3957,3.4642,0.0000,40.1848,14.8576,1.6166,7.5443,1.2317,2.1555,49.2687,23.3256
diff --git a/VectoCore/VectoCoreTest/TestData/MeasuredSpeed/Results/MeasuredSpeedGearVair.vsum b/VectoCore/VectoCoreTest/TestData/MeasuredSpeed/Results/MeasuredSpeedGearVair.vsum
index 08f2b1168b43ee5aeb9000951d8fef80351e9d10..ebb24e6617f97e7f8d53ac35232b2778c45859e2 100644
--- a/VectoCore/VectoCoreTest/TestData/MeasuredSpeed/Results/MeasuredSpeedGearVair.vsum
+++ b/VectoCore/VectoCoreTest/TestData/MeasuredSpeed/Results/MeasuredSpeedGearVair.vsum
@@ -1,2 +1,3 @@
-Job [-],Input File [-],Cycle [-],Status,Vehicle manufacturer [-],VIN number,Vehicle model [-],HDV CO2 vehicle class [-],Chassis curb mass [kg],Loading [kg],Total vehicle mass [kg],Engine manufacturer [-],Engine model [-],Engine fuel type [-],Engine rated power [kW],Engine idling speed [rpm],Engine rated speed [rpm],Engine displacement [ccm],Engine WHTCUrban,Engine WHTCRural,Engine WHTCMotorway,Engine BFColdHot,Engine CFRegPer,Engine actual CF,CdxA [m²],total RRC [-],weighted RRC w/o trailer [-],r_dyn [m],Gearbox manufacturer [-],Gearbox model [-],Gearbox type [-],Gear ratio first gear [-],Gear ratio last gear [-],Torque converter manufacturer [-],Torque converter model [-],Retarder manufacturer [-],Retarder model [-],Retarder type [-],Angledrive manufacturer [-],Angledrive model [-],Angledrive ratio [-],Axle manufacturer [-],Axle model [-],Axle gear ratio [-],Auxiliary technology STP [-],Auxiliary technology FAN [-],Auxiliary technology AC [-],Auxiliary technology PS [-],Auxiliary technology ES [-],Auxiliary technology cycle [-],Cargo Volume [m³],time [s],distance [km],speed [km/h],altitudeDelta [m],FC-Map [g/h],FC-Map [g/km],FC-AUXc [g/h],FC-AUXc [g/km],FC-WHTCc [g/h],FC-WHTCc [g/km],FC-AAUX [g/h],FC-AAUX [g/km],FC-Final [g/h],FC-Final [g/km],FC-Final [l/100km],FC-Final [l/100tkm],FC-Final [l/100m³km],CO2 [g/km],CO2 [g/tkm],CO2 [g/m³km],P_wheel_in_pos [kW],P_fcmap_pos [kW],E_fcmap_pos [kWh],E_fcmap_neg [kWh],E_powertrain_inertia [kWh],E_aux_CYCLE [kWh],E_aux_sum [kWh],E_clutch_loss [kWh],E_tc_loss [kWh],E_shift_loss [kWh],E_gbx_loss [kWh],E_ret_loss [kWh],E_angle_loss [kWh],E_axl_loss [kWh],E_brake [kWh],E_vehi_inertia [kWh],E_air [kWh],E_roll [kWh],E_grad [kWh],a [m/s^2],a_pos [m/s^2],a_neg [m/s^2],AccelerationTimeShare [%],DecelerationTimeShare [%],CruiseTimeShare [%],StopTimeShare [%],max. speed [km/h,max. acc [m/s²],max. dec [m/s²],n_eng_avg [rpm],n_eng_max [rpm],gear shifts [-],Engine max. Load time share [%],CoastingTimeShare [%],BrakingTImeShare [%],Gear 0 TimeShare [%],Gear 1 TimeShare [%],Gear 2 TimeShare [%],Gear 3 TimeShare [%],Gear 4 TimeShare [%],Gear 5 TimeShare [%],Gear 6 TimeShare [%]
-21-0,MeasuredSpeedGearVair,MeasuredSpeed_Gear_Rural_Vair.vdri,Success,N/A,,N.A.,0,8862.0000,0.0000,8862.0000,N/A,Demo Engine,Diesel CI,0.0000,600.0000,0.0000,6000.0000,1,1,1,0,1,1,6.1650,0.00764995394918169,0.00764995394918169,0.5200,N/A,Demo,MT,6.6960,0.7280,n.a.,n.a.,n.a.,n.a.,None,n.a.,n.a.,n.a.,N/A,Demo,4.3000,,,,,,,,1299.0000,16.8711,46.7558,15.8669,6301.5302,134.7753,6301.5302,134.7753,6301.5302,134.7753,6301.5302,134.7753,6301.5302,134.7753,16.1990,,,425.8899,,,20.1036,29.8660,10.7767,0.2894,0.0000,1.9832,1.9832,0.0268,0.0000,0.0000,0.2684,0.0000,0.0000,1.8468,0.6441,0.0000,2.2252,3.1156,0.3598,0.0000,0.3035,-0.3378,23.4796,21.4781,40.6467,14.3957,80.5095,1.1306,1.6261,1084.6394,1962.3354,210.0000,1.4627,0.0000,40.1848,14.7036,1.6166,7.3903,1.3857,2.0015,49.5766,23.3256
+# VECTO 3.1.2.810 - 05.07.2017 13:08
+Job [-],Input File [-],Cycle [-],Status,Vehicle manufacturer [-],VIN number,Vehicle model [-],HDV CO2 vehicle class [-],Corrected Actual Curb Mass [kg],Loading [kg],Total vehicle mass [kg],Engine manufacturer [-],Engine model [-],Engine fuel type [-],Engine rated power [kW],Engine idling speed [rpm],Engine rated speed [rpm],Engine displacement [ccm],Engine WHTCUrban,Engine WHTCRural,Engine WHTCMotorway,Engine BFColdHot,Engine CFRegPer,Engine actual CF,CdxA [m²],total RRC [-],weighted RRC w/o trailer [-],r_dyn [m],Number axles vehicle driven [-],Number axles vehicle non-driven [-],Number axles trailer [-],Gearbox manufacturer [-],Gearbox model [-],Gearbox type [-],Gear ratio first gear [-],Gear ratio last gear [-],Torque converter manufacturer [-],Torque converter model [-],Retarder manufacturer [-],Retarder model [-],Retarder type [-],Angledrive manufacturer [-],Angledrive model [-],Angledrive ratio [-],Axle manufacturer [-],Axle model [-],Axle gear ratio [-],Auxiliary technology STP [-],Auxiliary technology FAN [-],Auxiliary technology AC [-],Auxiliary technology PS [-],Auxiliary technology ES [-],Auxiliary technology cycle [-],Cargo Volume [m³],time [s],distance [km],speed [km/h],altitudeDelta [m],FC-Map [g/h],FC-Map [g/km],FC-AUXc [g/h],FC-AUXc [g/km],FC-WHTCc [g/h],FC-WHTCc [g/km],FC-AAUX [g/h],FC-AAUX [g/km],FC-Final [g/h],FC-Final [g/km],FC-Final [l/100km],FC-Final [l/100tkm],FC-Final [l/100m³km],CO2 [g/km],CO2 [g/tkm],CO2 [g/m³km],P_wheel_in_pos [kW],P_fcmap_pos [kW],E_fcmap_pos [kWh],E_fcmap_neg [kWh],E_powertrain_inertia [kWh],E_aux_CYCLE [kWh],E_aux_sum [kWh],E_clutch_loss [kWh],E_tc_loss [kWh],E_shift_loss [kWh],E_gbx_loss [kWh],E_ret_loss [kWh],E_angle_loss [kWh],E_axl_loss [kWh],E_brake [kWh],E_vehi_inertia [kWh],E_air [kWh],E_roll [kWh],E_grad [kWh],a [m/s^2],a_pos [m/s^2],a_neg [m/s^2],AccelerationTimeShare [%],DecelerationTimeShare [%],CruiseTimeShare [%],max. speed [km/h],max. acc [m/s²],max. dec [m/s²],n_eng_avg [rpm],n_eng_max [rpm],gear shifts [-],StopTimeShare [%],Engine max. Load time share [%],CoastingTimeShare [%],BrakingTImeShare [%],Gear 0 TimeShare [%],Gear 1 TimeShare [%],Gear 2 TimeShare [%],Gear 3 TimeShare [%],Gear 4 TimeShare [%],Gear 5 TimeShare [%],Gear 6 TimeShare [%]
+22-0,MeasuredSpeedGearVair,MeasuredSpeed_Gear_Rural_Vair.vdri,Success,N/A,,N.A.,0,8862.0000,0.0000,8862.0000,N/A,Demo Engine,Diesel CI,0.0000,600.0000,0.0000,6000.0000,1,1,1,0,1,1,6.1650,0.00764995394918169,0.00764995394918169,0.5200,1,1,0,N/A,Demo,MT,6.6960,0.7280,n.a.,n.a.,n.a.,n.a.,None,n.a.,n.a.,n.a.,N/A,Demo,4.3000,,,,,,,,1299.0000,16.8711,46.7558,15.8669,6301.5302,134.7753,6301.5302,134.7753,6301.5302,134.7753,6301.5302,134.7753,6301.5302,134.7753,16.1214,,,421.8467,,,20.1036,29.8660,10.7767,0.2894,0.0000,1.9832,1.9832,0.0268,0.0000,0.0000,0.2684,0.0000,0.0000,1.8468,0.6441,0.0000,2.2252,3.1156,0.3598,0.0000,0.3035,-0.3378,23.4796,21.4781,40.6467,80.5095,1.1306,1.6261,1084.6394,1962.3354,211.0000,14.3957,1.4627,0.0000,40.1848,14.7036,1.6166,7.3903,1.3857,2.0015,49.5766,23.3256
diff --git a/VectoCore/VectoCoreTest/TestData/MeasuredSpeed/Results/MeasuredSpeedGearVairAux.vsum b/VectoCore/VectoCoreTest/TestData/MeasuredSpeed/Results/MeasuredSpeedGearVairAux.vsum
index 43bbeaaf1be0e4e51821be134e3b3e4195b7ce17..5bf11fd67b101b290bfd426b0bb7b31d2c1f6f6f 100644
--- a/VectoCore/VectoCoreTest/TestData/MeasuredSpeed/Results/MeasuredSpeedGearVairAux.vsum
+++ b/VectoCore/VectoCoreTest/TestData/MeasuredSpeed/Results/MeasuredSpeedGearVairAux.vsum
@@ -1,2 +1,3 @@
-Job [-],Input File [-],Cycle [-],Status,Vehicle manufacturer [-],VIN number,Vehicle model [-],HDV CO2 vehicle class [-],Chassis curb mass [kg],Loading [kg],Total vehicle mass [kg],Engine manufacturer [-],Engine model [-],Engine fuel type [-],Engine rated power [kW],Engine idling speed [rpm],Engine rated speed [rpm],Engine displacement [ccm],Engine WHTCUrban,Engine WHTCRural,Engine WHTCMotorway,Engine BFColdHot,Engine CFRegPer,Engine actual CF,CdxA [m²],total RRC [-],weighted RRC w/o trailer [-],r_dyn [m],Gearbox manufacturer [-],Gearbox model [-],Gearbox type [-],Gear ratio first gear [-],Gear ratio last gear [-],Torque converter manufacturer [-],Torque converter model [-],Retarder manufacturer [-],Retarder model [-],Retarder type [-],Angledrive manufacturer [-],Angledrive model [-],Angledrive ratio [-],Axle manufacturer [-],Axle model [-],Axle gear ratio [-],Auxiliary technology STP [-],Auxiliary technology FAN [-],Auxiliary technology AC [-],Auxiliary technology PS [-],Auxiliary technology ES [-],Auxiliary technology cycle [-],Auxiliary technology ALT [-],Cargo Volume [m³],time [s],distance [km],speed [km/h],altitudeDelta [m],FC-Map [g/h],FC-Map [g/km],FC-AUXc [g/h],FC-AUXc [g/km],FC-WHTCc [g/h],FC-WHTCc [g/km],FC-AAUX [g/h],FC-AAUX [g/km],FC-Final [g/h],FC-Final [g/km],FC-Final [l/100km],FC-Final [l/100tkm],FC-Final [l/100m³km],CO2 [g/km],CO2 [g/tkm],CO2 [g/m³km],P_wheel_in_pos [kW],P_fcmap_pos [kW],E_fcmap_pos [kWh],E_fcmap_neg [kWh],E_powertrain_inertia [kWh],E_aux_CYCLE [kWh],E_aux_ALT [kWh],E_aux_sum [kWh],E_clutch_loss [kWh],E_tc_loss [kWh],E_shift_loss [kWh],E_gbx_loss [kWh],E_ret_loss [kWh],E_angle_loss [kWh],E_axl_loss [kWh],E_brake [kWh],E_vehi_inertia [kWh],E_air [kWh],E_roll [kWh],E_grad [kWh],a [m/s^2],a_pos [m/s^2],a_neg [m/s^2],AccelerationTimeShare [%],DecelerationTimeShare [%],CruiseTimeShare [%],StopTimeShare [%],max. speed [km/h,max. acc [m/s²],max. dec [m/s²],n_eng_avg [rpm],n_eng_max [rpm],gear shifts [-],Engine max. Load time share [%],CoastingTimeShare [%],BrakingTImeShare [%],Gear 0 TimeShare [%],Gear 1 TimeShare [%],Gear 2 TimeShare [%],Gear 3 TimeShare [%],Gear 4 TimeShare [%],Gear 5 TimeShare [%],Gear 6 TimeShare [%]
-22-0,MeasuredSpeedGearVairAux,MeasuredSpeed_Gear_Rural_VairAux.vdri,Success,N/A,,N.A.,0,8862.0000,0.0000,8862.0000,N/A,Demo Engine,Diesel CI,0.0000,600.0000,0.0000,6000.0000,1,1,1,0,1,1,6.1650,0.00764995394918169,0.00764995394918169,0.5200,N/A,Demo,MT,6.6960,0.7280,n.a.,n.a.,n.a.,n.a.,None,n.a.,n.a.,n.a.,N/A,Demo,4.3000,,,,,,,,,1299.0000,16.8711,46.7559,15.8669,6457.3752,138.1082,6457.3752,138.1082,6457.3752,138.1082,6457.3752,138.1082,6457.3752,138.1082,16.5995,,,436.4219,,,20.1038,30.7899,11.1100,0.2750,0.0000,1.9824,0.3775,2.3598,0.0268,0.0000,0.0000,0.2692,0.0000,0.0000,1.8468,0.6124,0.0000,2.2253,3.1156,0.3598,0.0000,0.3035,-0.3378,23.4796,21.4781,40.6467,14.3957,80.5095,1.1306,1.6261,1087.1418,1962.3354,212.0000,1.6166,0.0000,40.1848,14.9346,1.5396,7.5443,1.2317,2.1555,49.2687,23.3256
+# VECTO 3.1.2.810 - 05.07.2017 13:05
+Job [-],Input File [-],Cycle [-],Status,Vehicle manufacturer [-],VIN number,Vehicle model [-],HDV CO2 vehicle class [-],Corrected Actual Curb Mass [kg],Loading [kg],Total vehicle mass [kg],Engine manufacturer [-],Engine model [-],Engine fuel type [-],Engine rated power [kW],Engine idling speed [rpm],Engine rated speed [rpm],Engine displacement [ccm],Engine WHTCUrban,Engine WHTCRural,Engine WHTCMotorway,Engine BFColdHot,Engine CFRegPer,Engine actual CF,CdxA [m²],total RRC [-],weighted RRC w/o trailer [-],r_dyn [m],Number axles vehicle driven [-],Number axles vehicle non-driven [-],Number axles trailer [-],Gearbox manufacturer [-],Gearbox model [-],Gearbox type [-],Gear ratio first gear [-],Gear ratio last gear [-],Torque converter manufacturer [-],Torque converter model [-],Retarder manufacturer [-],Retarder model [-],Retarder type [-],Angledrive manufacturer [-],Angledrive model [-],Angledrive ratio [-],Axle manufacturer [-],Axle model [-],Axle gear ratio [-],Auxiliary technology STP [-],Auxiliary technology FAN [-],Auxiliary technology AC [-],Auxiliary technology PS [-],Auxiliary technology ES [-],Auxiliary technology cycle [-],Auxiliary technology ALT [-],Cargo Volume [m³],time [s],distance [km],speed [km/h],altitudeDelta [m],FC-Map [g/h],FC-Map [g/km],FC-AUXc [g/h],FC-AUXc [g/km],FC-WHTCc [g/h],FC-WHTCc [g/km],FC-AAUX [g/h],FC-AAUX [g/km],FC-Final [g/h],FC-Final [g/km],FC-Final [l/100km],FC-Final [l/100tkm],FC-Final [l/100m³km],CO2 [g/km],CO2 [g/tkm],CO2 [g/m³km],P_wheel_in_pos [kW],P_fcmap_pos [kW],E_fcmap_pos [kWh],E_fcmap_neg [kWh],E_powertrain_inertia [kWh],E_aux_CYCLE [kWh],E_aux_ALT [kWh],E_aux_sum [kWh],E_clutch_loss [kWh],E_tc_loss [kWh],E_shift_loss [kWh],E_gbx_loss [kWh],E_ret_loss [kWh],E_angle_loss [kWh],E_axl_loss [kWh],E_brake [kWh],E_vehi_inertia [kWh],E_air [kWh],E_roll [kWh],E_grad [kWh],a [m/s^2],a_pos [m/s^2],a_neg [m/s^2],AccelerationTimeShare [%],DecelerationTimeShare [%],CruiseTimeShare [%],max. speed [km/h],max. acc [m/s²],max. dec [m/s²],n_eng_avg [rpm],n_eng_max [rpm],gear shifts [-],StopTimeShare [%],Engine max. Load time share [%],CoastingTimeShare [%],BrakingTImeShare [%],Gear 0 TimeShare [%],Gear 1 TimeShare [%],Gear 2 TimeShare [%],Gear 3 TimeShare [%],Gear 4 TimeShare [%],Gear 5 TimeShare [%],Gear 6 TimeShare [%]
+7-0,MeasuredSpeedGearVairAux,MeasuredSpeed_Gear_Rural_VairAux.vdri,Success,N/A,,N.A.,0,8862.0000,0.0000,8862.0000,N/A,Demo Engine,Diesel CI,0.0000,600.0000,0.0000,6000.0000,1,1,1,0,1,1,6.1650,0.00764995394918169,0.00764995394918169,0.5200,1,1,0,N/A,Demo,MT,6.6960,0.7280,n.a.,n.a.,n.a.,n.a.,None,n.a.,n.a.,n.a.,N/A,Demo,4.3000,,,,,,,,,1299.0000,16.8711,46.7559,15.8669,6457.3752,138.1082,6457.3752,138.1082,6457.3752,138.1082,6457.3752,138.1082,6457.3752,138.1082,16.5201,,,432.2786,,,20.1038,30.7899,11.1100,0.2750,0.0000,1.9824,0.3775,2.3598,0.0268,0.0000,0.0000,0.2692,0.0000,0.0000,1.8468,0.6124,0.0000,2.2253,3.1156,0.3598,0.0000,0.3035,-0.3378,23.4796,21.4781,40.6467,80.5095,1.1306,1.6261,1087.1418,1962.3354,212.0000,14.3957,1.6166,0.0000,40.1848,14.9346,1.5396,7.5443,1.2317,2.1555,49.2687,23.3256
diff --git a/VectoCore/VectoCoreTest/TestData/MeasuredSpeed/Results/MeasuredSpeedGear_TractionInterruption.vsum b/VectoCore/VectoCoreTest/TestData/MeasuredSpeed/Results/MeasuredSpeedGear_TractionInterruption.vsum
index 9285413178b1e3bb9145fdb55936a11c395c6242..8bc456e1a5b7dfdac771d28e7979c6512c8babc1 100644
--- a/VectoCore/VectoCoreTest/TestData/MeasuredSpeed/Results/MeasuredSpeedGear_TractionInterruption.vsum
+++ b/VectoCore/VectoCoreTest/TestData/MeasuredSpeed/Results/MeasuredSpeedGear_TractionInterruption.vsum
@@ -1,2 +1,3 @@
-Job [-],Input File [-],Cycle [-],Status,Vehicle manufacturer [-],VIN number,Vehicle model [-],HDV CO2 vehicle class [-],Chassis curb mass [kg],Loading [kg],Total vehicle mass [kg],Engine manufacturer [-],Engine model [-],Engine fuel type [-],Engine rated power [kW],Engine idling speed [rpm],Engine rated speed [rpm],Engine displacement [ccm],Engine WHTCUrban,Engine WHTCRural,Engine WHTCMotorway,Engine BFColdHot,Engine CFRegPer,Engine actual CF,CdxA [m²],total RRC [-],weighted RRC w/o trailer [-],r_dyn [m],Gearbox manufacturer [-],Gearbox model [-],Gearbox type [-],Gear ratio first gear [-],Gear ratio last gear [-],Torque converter manufacturer [-],Torque converter model [-],Retarder manufacturer [-],Retarder model [-],Retarder type [-],Angledrive manufacturer [-],Angledrive model [-],Angledrive ratio [-],Axle manufacturer [-],Axle model [-],Axle gear ratio [-],Auxiliary technology STP [-],Auxiliary technology FAN [-],Auxiliary technology AC [-],Auxiliary technology PS [-],Auxiliary technology ES [-],Auxiliary technology cycle [-],Cargo Volume [m³],time [s],distance [km],speed [km/h],altitudeDelta [m],FC-Map [g/h],FC-Map [g/km],FC-AUXc [g/h],FC-AUXc [g/km],FC-WHTCc [g/h],FC-WHTCc [g/km],FC-AAUX [g/h],FC-AAUX [g/km],FC-Final [g/h],FC-Final [g/km],FC-Final [l/100km],FC-Final [l/100tkm],FC-Final [l/100m³km],CO2 [g/km],CO2 [g/tkm],CO2 [g/m³km],P_wheel_in_pos [kW],P_fcmap_pos [kW],E_fcmap_pos [kWh],E_fcmap_neg [kWh],E_powertrain_inertia [kWh],E_aux_CYCLE [kWh],E_aux_sum [kWh],E_clutch_loss [kWh],E_tc_loss [kWh],E_shift_loss [kWh],E_gbx_loss [kWh],E_ret_loss [kWh],E_angle_loss [kWh],E_axl_loss [kWh],E_brake [kWh],E_vehi_inertia [kWh],E_air [kWh],E_roll [kWh],E_grad [kWh],a [m/s^2],a_pos [m/s^2],a_neg [m/s^2],AccelerationTimeShare [%],DecelerationTimeShare [%],CruiseTimeShare [%],StopTimeShare [%],max. speed [km/h,max. acc [m/s²],max. dec [m/s²],n_eng_avg [rpm],n_eng_max [rpm],gear shifts [-],Engine max. Load time share [%],CoastingTimeShare [%],BrakingTImeShare [%],Gear 0 TimeShare [%],Gear 1 TimeShare [%],Gear 2 TimeShare [%],Gear 3 TimeShare [%],Gear 4 TimeShare [%],Gear 5 TimeShare [%],Gear 6 TimeShare [%]
-19-0,MeasuredSpeedGear_TractionInterruption,MeasuredSpeed_Gear_Rural_TractionInterruption.vdri,Success,N/A,,N.A.,0,8862.0000,0.0000,8862.0000,N/A,Demo Engine,Diesel CI,0.0000,600.0000,0.0000,6000.0000,1,1,1,0,1,1,6.1650,0.00764995394918169,0.00764995394918169,0.5200,N/A,Demo,MT,6.6960,0.7280,n.a.,n.a.,n.a.,n.a.,None,n.a.,n.a.,n.a.,N/A,Demo,4.3000,,,,,,,,1299.0000,16.8351,46.6562,15.8669,7799.7310,167.1746,7799.7310,167.1746,7799.7310,167.1746,7799.7310,167.1746,7799.7310,167.1746,20.0931,,,528.2716,,,27.1915,37.6343,13.5797,0.1687,0.0000,1.9832,1.9832,0.0052,0.0000,0.0000,0.2986,0.0000,0.0000,1.8478,0.4698,0.0000,5.3378,3.1090,0.3598,0.0000,0.3200,-0.3323,22.7868,22.1709,40.6467,14.3957,80.5095,1.8083,1.6261,1073.4169,1701.8773,209.0000,4.3880,0.0000,39.5689,17.4750,1.3087,6.2356,1.3857,1.4627,48.9607,23.1717
+# VECTO 3.1.2.810 - 05.07.2017 13:06
+Job [-],Input File [-],Cycle [-],Status,Vehicle manufacturer [-],VIN number,Vehicle model [-],HDV CO2 vehicle class [-],Corrected Actual Curb Mass [kg],Loading [kg],Total vehicle mass [kg],Engine manufacturer [-],Engine model [-],Engine fuel type [-],Engine rated power [kW],Engine idling speed [rpm],Engine rated speed [rpm],Engine displacement [ccm],Engine WHTCUrban,Engine WHTCRural,Engine WHTCMotorway,Engine BFColdHot,Engine CFRegPer,Engine actual CF,CdxA [m²],total RRC [-],weighted RRC w/o trailer [-],r_dyn [m],Number axles vehicle driven [-],Number axles vehicle non-driven [-],Number axles trailer [-],Gearbox manufacturer [-],Gearbox model [-],Gearbox type [-],Gear ratio first gear [-],Gear ratio last gear [-],Torque converter manufacturer [-],Torque converter model [-],Retarder manufacturer [-],Retarder model [-],Retarder type [-],Angledrive manufacturer [-],Angledrive model [-],Angledrive ratio [-],Axle manufacturer [-],Axle model [-],Axle gear ratio [-],Auxiliary technology STP [-],Auxiliary technology FAN [-],Auxiliary technology AC [-],Auxiliary technology PS [-],Auxiliary technology ES [-],Auxiliary technology cycle [-],Cargo Volume [m³],time [s],distance [km],speed [km/h],altitudeDelta [m],FC-Map [g/h],FC-Map [g/km],FC-AUXc [g/h],FC-AUXc [g/km],FC-WHTCc [g/h],FC-WHTCc [g/km],FC-AAUX [g/h],FC-AAUX [g/km],FC-Final [g/h],FC-Final [g/km],FC-Final [l/100km],FC-Final [l/100tkm],FC-Final [l/100m³km],CO2 [g/km],CO2 [g/tkm],CO2 [g/m³km],P_wheel_in_pos [kW],P_fcmap_pos [kW],E_fcmap_pos [kWh],E_fcmap_neg [kWh],E_powertrain_inertia [kWh],E_aux_CYCLE [kWh],E_aux_sum [kWh],E_clutch_loss [kWh],E_tc_loss [kWh],E_shift_loss [kWh],E_gbx_loss [kWh],E_ret_loss [kWh],E_angle_loss [kWh],E_axl_loss [kWh],E_brake [kWh],E_vehi_inertia [kWh],E_air [kWh],E_roll [kWh],E_grad [kWh],a [m/s^2],a_pos [m/s^2],a_neg [m/s^2],AccelerationTimeShare [%],DecelerationTimeShare [%],CruiseTimeShare [%],max. speed [km/h],max. acc [m/s²],max. dec [m/s²],n_eng_avg [rpm],n_eng_max [rpm],gear shifts [-],StopTimeShare [%],Engine max. Load time share [%],CoastingTimeShare [%],BrakingTImeShare [%],Gear 0 TimeShare [%],Gear 1 TimeShare [%],Gear 2 TimeShare [%],Gear 3 TimeShare [%],Gear 4 TimeShare [%],Gear 5 TimeShare [%],Gear 6 TimeShare [%]
+12-0,MeasuredSpeedGear_TractionInterruption,MeasuredSpeed_Gear_Rural_TractionInterruption.vdri,Success,N/A,,N.A.,0,8862.0000,0.0000,8862.0000,N/A,Demo Engine,Diesel CI,0.0000,600.0000,0.0000,6000.0000,1,1,1,0,1,1,6.1650,0.00764995394918169,0.00764995394918169,0.5200,1,1,0,N/A,Demo,MT,6.6960,0.7280,n.a.,n.a.,n.a.,n.a.,None,n.a.,n.a.,n.a.,N/A,Demo,4.3000,,,,,,,,1299.0000,16.8351,46.6562,15.8669,7799.7310,167.1746,7799.7310,167.1746,7799.7310,167.1746,7799.7310,167.1746,7799.7310,167.1746,19.9970,,,523.2564,,,27.1915,37.6343,13.5797,0.1687,0.0000,1.9832,1.9832,0.0052,0.0000,0.0000,0.2986,0.0000,0.0000,1.8478,0.4698,0.0000,5.3378,3.1090,0.3598,0.0000,0.3200,-0.3323,22.7868,22.1709,40.6467,80.5095,1.8083,1.6261,1073.4169,1701.8773,210.0000,14.3957,4.3880,0.0000,39.5689,17.4750,1.3087,6.2356,1.3857,1.4627,48.9607,23.1717
diff --git a/VectoCore/VectoCoreTest/TestData/MeasuredSpeed/Results/MeasuredSpeedVair.vsum b/VectoCore/VectoCoreTest/TestData/MeasuredSpeed/Results/MeasuredSpeedVair.vsum
index 89acc0f94e07f1e86c8eb7259403c0867a51fa39..e31f481da381f1afbbf50bd3b1176c9fa68df764 100644
--- a/VectoCore/VectoCoreTest/TestData/MeasuredSpeed/Results/MeasuredSpeedVair.vsum
+++ b/VectoCore/VectoCoreTest/TestData/MeasuredSpeed/Results/MeasuredSpeedVair.vsum
@@ -1,2 +1,3 @@
-Job [-],Input File [-],Cycle [-],Status,Vehicle manufacturer [-],VIN number,Vehicle model [-],HDV CO2 vehicle class [-],Chassis curb mass [kg],Loading [kg],Total vehicle mass [kg],Engine manufacturer [-],Engine model [-],Engine fuel type [-],Engine rated power [kW],Engine idling speed [rpm],Engine rated speed [rpm],Engine displacement [ccm],Engine WHTCUrban,Engine WHTCRural,Engine WHTCMotorway,Engine BFColdHot,Engine CFRegPer,Engine actual CF,CdxA [m²],total RRC [-],weighted RRC w/o trailer [-],r_dyn [m],Gearbox manufacturer [-],Gearbox model [-],Gearbox type [-],Gear ratio first gear [-],Gear ratio last gear [-],Torque converter manufacturer [-],Torque converter model [-],Retarder manufacturer [-],Retarder model [-],Retarder type [-],Angledrive manufacturer [-],Angledrive model [-],Angledrive ratio [-],Axle manufacturer [-],Axle model [-],Axle gear ratio [-],Auxiliary technology STP [-],Auxiliary technology FAN [-],Auxiliary technology AC [-],Auxiliary technology PS [-],Auxiliary technology ES [-],Auxiliary technology cycle [-],Cargo Volume [m³],time [s],distance [km],speed [km/h],altitudeDelta [m],FC-Map [g/h],FC-Map [g/km],FC-AUXc [g/h],FC-AUXc [g/km],FC-WHTCc [g/h],FC-WHTCc [g/km],FC-AAUX [g/h],FC-AAUX [g/km],FC-Final [g/h],FC-Final [g/km],FC-Final [l/100km],FC-Final [l/100tkm],FC-Final [l/100m³km],CO2 [g/km],CO2 [g/tkm],CO2 [g/m³km],P_wheel_in_pos [kW],P_fcmap_pos [kW],E_fcmap_pos [kWh],E_fcmap_neg [kWh],E_powertrain_inertia [kWh],E_aux_CYCLE [kWh],E_aux_sum [kWh],E_clutch_loss [kWh],E_tc_loss [kWh],E_shift_loss [kWh],E_gbx_loss [kWh],E_ret_loss [kWh],E_angle_loss [kWh],E_axl_loss [kWh],E_brake [kWh],E_vehi_inertia [kWh],E_air [kWh],E_roll [kWh],E_grad [kWh],a [m/s^2],a_pos [m/s^2],a_neg [m/s^2],AccelerationTimeShare [%],DecelerationTimeShare [%],CruiseTimeShare [%],StopTimeShare [%],max. speed [km/h,max. acc [m/s²],max. dec [m/s²],n_eng_avg [rpm],n_eng_max [rpm],gear shifts [-],Engine max. Load time share [%],CoastingTimeShare [%],BrakingTImeShare [%],Gear 0 TimeShare [%],Gear 1 TimeShare [%],Gear 2 TimeShare [%],Gear 3 TimeShare [%],Gear 4 TimeShare [%],Gear 5 TimeShare [%],Gear 6 TimeShare [%]
-13-0,MeasuredSpeedVair,MeasuredSpeedVair.vdri,Success,N/A,,N.A.,0,8862.0000,0.0000,8862.0000,N/A,Demo Engine,Diesel CI,0.0000,600.0000,0.0000,6000.0000,1,1,1,0,1,1,6.1650,0.00764995394918169,0.00764995394918169,0.5200,N/A,Demo,MT,6.6960,0.7280,n.a.,n.a.,n.a.,n.a.,None,n.a.,n.a.,n.a.,N/A,Demo,4.3000,,,,,,,,1299.0000,16.8461,46.6867,15.8669,6315.1012,135.2655,6315.1012,135.2655,6315.1012,135.2655,6315.1012,135.2655,6315.1012,135.2655,16.2579,,,427.4391,,,20.1448,29.9358,10.8018,0.3334,0.0000,1.9832,1.9832,0.0059,0.0000,0.0000,0.2828,0.0000,0.0000,1.8455,0.6560,0.0000,2.2245,3.1110,0.3596,0.0000,0.3170,-0.3301,23.0177,22.4018,40.1848,14.3957,80.5095,1.1306,1.6261,1121.6641,1962.5826,214.0000,2.6174,0.0000,39.8768,17.3210,7.0824,0.7698,1.0778,4.3880,48.6528,20.7082
+# VECTO 3.1.2.810 - 05.07.2017 13:07
+Job [-],Input File [-],Cycle [-],Status,Vehicle manufacturer [-],VIN number,Vehicle model [-],HDV CO2 vehicle class [-],Corrected Actual Curb Mass [kg],Loading [kg],Total vehicle mass [kg],Engine manufacturer [-],Engine model [-],Engine fuel type [-],Engine rated power [kW],Engine idling speed [rpm],Engine rated speed [rpm],Engine displacement [ccm],Engine WHTCUrban,Engine WHTCRural,Engine WHTCMotorway,Engine BFColdHot,Engine CFRegPer,Engine actual CF,CdxA [m²],total RRC [-],weighted RRC w/o trailer [-],r_dyn [m],Number axles vehicle driven [-],Number axles vehicle non-driven [-],Number axles trailer [-],Gearbox manufacturer [-],Gearbox model [-],Gearbox type [-],Gear ratio first gear [-],Gear ratio last gear [-],Torque converter manufacturer [-],Torque converter model [-],Retarder manufacturer [-],Retarder model [-],Retarder type [-],Angledrive manufacturer [-],Angledrive model [-],Angledrive ratio [-],Axle manufacturer [-],Axle model [-],Axle gear ratio [-],Auxiliary technology STP [-],Auxiliary technology FAN [-],Auxiliary technology AC [-],Auxiliary technology PS [-],Auxiliary technology ES [-],Auxiliary technology cycle [-],Cargo Volume [m³],time [s],distance [km],speed [km/h],altitudeDelta [m],FC-Map [g/h],FC-Map [g/km],FC-AUXc [g/h],FC-AUXc [g/km],FC-WHTCc [g/h],FC-WHTCc [g/km],FC-AAUX [g/h],FC-AAUX [g/km],FC-Final [g/h],FC-Final [g/km],FC-Final [l/100km],FC-Final [l/100tkm],FC-Final [l/100m³km],CO2 [g/km],CO2 [g/tkm],CO2 [g/m³km],P_wheel_in_pos [kW],P_fcmap_pos [kW],E_fcmap_pos [kWh],E_fcmap_neg [kWh],E_powertrain_inertia [kWh],E_aux_CYCLE [kWh],E_aux_sum [kWh],E_clutch_loss [kWh],E_tc_loss [kWh],E_shift_loss [kWh],E_gbx_loss [kWh],E_ret_loss [kWh],E_angle_loss [kWh],E_axl_loss [kWh],E_brake [kWh],E_vehi_inertia [kWh],E_air [kWh],E_roll [kWh],E_grad [kWh],a [m/s^2],a_pos [m/s^2],a_neg [m/s^2],AccelerationTimeShare [%],DecelerationTimeShare [%],CruiseTimeShare [%],max. speed [km/h],max. acc [m/s²],max. dec [m/s²],n_eng_avg [rpm],n_eng_max [rpm],gear shifts [-],StopTimeShare [%],Engine max. Load time share [%],CoastingTimeShare [%],BrakingTImeShare [%],Gear 0 TimeShare [%],Gear 1 TimeShare [%],Gear 2 TimeShare [%],Gear 3 TimeShare [%],Gear 4 TimeShare [%],Gear 5 TimeShare [%],Gear 6 TimeShare [%]
+21-0,MeasuredSpeedVair,MeasuredSpeedVair.vdri,Success,N/A,,N.A.,0,8862.0000,0.0000,8862.0000,N/A,Demo Engine,Diesel CI,0.0000,600.0000,0.0000,6000.0000,1,1,1,0,1,1,6.1650,0.00764995394918169,0.00764995394918169,0.5200,1,1,0,N/A,Demo,MT,6.6960,0.7280,n.a.,n.a.,n.a.,n.a.,None,n.a.,n.a.,n.a.,N/A,Demo,4.3000,,,,,,,,1299.0000,16.8461,46.6867,15.8669,6315.1012,135.2655,6315.1012,135.2655,6315.1012,135.2655,6315.1012,135.2655,6315.1012,135.2655,16.1801,,,423.3811,,,20.1448,29.9358,10.8018,0.3334,0.0000,1.9832,1.9832,0.0059,0.0000,0.0000,0.2828,0.0000,0.0000,1.8455,0.6560,0.0000,2.2245,3.1110,0.3596,0.0000,0.3170,-0.3301,23.0177,22.4018,40.1848,80.5095,1.1306,1.6261,1121.6641,1962.5826,214.0000,14.3957,2.6174,0.0000,39.8768,17.3210,7.0824,0.7698,1.0778,4.3880,48.6528,20.7082
diff --git a/VectoCore/VectoCoreTest/TestData/MeasuredSpeed/Results/MeasuredSpeedVairAux.vsum b/VectoCore/VectoCoreTest/TestData/MeasuredSpeed/Results/MeasuredSpeedVairAux.vsum
index 1ad973d87f7ac80733c5e30c8439b59bf4cf9a44..79bb6696cbab98488f33499daea1ecdd1dbeac00 100644
--- a/VectoCore/VectoCoreTest/TestData/MeasuredSpeed/Results/MeasuredSpeedVairAux.vsum
+++ b/VectoCore/VectoCoreTest/TestData/MeasuredSpeed/Results/MeasuredSpeedVairAux.vsum
@@ -1,2 +1,3 @@
-Job [-],Input File [-],Cycle [-],Status,Vehicle manufacturer [-],VIN number,Vehicle model [-],HDV CO2 vehicle class [-],Chassis curb mass [kg],Loading [kg],Total vehicle mass [kg],Engine manufacturer [-],Engine model [-],Engine fuel type [-],Engine rated power [kW],Engine idling speed [rpm],Engine rated speed [rpm],Engine displacement [ccm],Engine WHTCUrban,Engine WHTCRural,Engine WHTCMotorway,Engine BFColdHot,Engine CFRegPer,Engine actual CF,CdxA [m²],total RRC [-],weighted RRC w/o trailer [-],r_dyn [m],Gearbox manufacturer [-],Gearbox model [-],Gearbox type [-],Gear ratio first gear [-],Gear ratio last gear [-],Torque converter manufacturer [-],Torque converter model [-],Retarder manufacturer [-],Retarder model [-],Retarder type [-],Angledrive manufacturer [-],Angledrive model [-],Angledrive ratio [-],Axle manufacturer [-],Axle model [-],Axle gear ratio [-],Auxiliary technology STP [-],Auxiliary technology FAN [-],Auxiliary technology AC [-],Auxiliary technology PS [-],Auxiliary technology ES [-],Auxiliary technology cycle [-],Auxiliary technology ALT [-],Cargo Volume [m³],time [s],distance [km],speed [km/h],altitudeDelta [m],FC-Map [g/h],FC-Map [g/km],FC-AUXc [g/h],FC-AUXc [g/km],FC-WHTCc [g/h],FC-WHTCc [g/km],FC-AAUX [g/h],FC-AAUX [g/km],FC-Final [g/h],FC-Final [g/km],FC-Final [l/100km],FC-Final [l/100tkm],FC-Final [l/100m³km],CO2 [g/km],CO2 [g/tkm],CO2 [g/m³km],P_wheel_in_pos [kW],P_fcmap_pos [kW],E_fcmap_pos [kWh],E_fcmap_neg [kWh],E_powertrain_inertia [kWh],E_aux_CYCLE [kWh],E_aux_ALT [kWh],E_aux_sum [kWh],E_clutch_loss [kWh],E_tc_loss [kWh],E_shift_loss [kWh],E_gbx_loss [kWh],E_ret_loss [kWh],E_angle_loss [kWh],E_axl_loss [kWh],E_brake [kWh],E_vehi_inertia [kWh],E_air [kWh],E_roll [kWh],E_grad [kWh],a [m/s^2],a_pos [m/s^2],a_neg [m/s^2],AccelerationTimeShare [%],DecelerationTimeShare [%],CruiseTimeShare [%],StopTimeShare [%],max. speed [km/h,max. acc [m/s²],max. dec [m/s²],n_eng_avg [rpm],n_eng_max [rpm],gear shifts [-],Engine max. Load time share [%],CoastingTimeShare [%],BrakingTImeShare [%],Gear 0 TimeShare [%],Gear 1 TimeShare [%],Gear 2 TimeShare [%],Gear 3 TimeShare [%],Gear 4 TimeShare [%],Gear 5 TimeShare [%],Gear 6 TimeShare [%]
-17-0,MeasuredSpeedVairAux,MeasuredSpeedVairAux.vdri,Success,N/A,,N.A.,0,8862.0000,0.0000,8862.0000,N/A,Demo Engine,Diesel CI,0.0000,600.0000,0.0000,6000.0000,1,1,1,0,1,1,6.1650,0.00764995394918169,0.00764995394918169,0.5200,N/A,Demo,MT,6.6960,0.7280,n.a.,n.a.,n.a.,n.a.,None,n.a.,n.a.,n.a.,N/A,Demo,4.3000,,,,,,,,,1299.0000,16.8454,46.6846,15.8669,6484.3707,138.8975,6484.3707,138.8975,6484.3707,138.8975,6484.3707,138.8975,6484.3707,138.8975,16.6944,,,438.9161,,,20.1443,30.8711,11.1393,0.3170,0.0000,1.9832,0.3799,2.3631,0.0059,0.0000,0.0000,0.2829,0.0000,0.0000,1.8454,0.6301,0.0000,2.2245,3.1109,0.3596,0.0000,0.3170,-0.3301,23.0177,22.4018,40.1848,14.3957,80.5095,1.1306,1.6261,1121.4187,1962.5826,214.0000,2.7714,0.0000,39.8768,17.3210,7.0824,0.7698,1.0778,4.3880,48.6528,20.7082
+# VECTO 3.1.2.810 - 05.07.2017 13:05
+Job [-],Input File [-],Cycle [-],Status,Vehicle manufacturer [-],VIN number,Vehicle model [-],HDV CO2 vehicle class [-],Corrected Actual Curb Mass [kg],Loading [kg],Total vehicle mass [kg],Engine manufacturer [-],Engine model [-],Engine fuel type [-],Engine rated power [kW],Engine idling speed [rpm],Engine rated speed [rpm],Engine displacement [ccm],Engine WHTCUrban,Engine WHTCRural,Engine WHTCMotorway,Engine BFColdHot,Engine CFRegPer,Engine actual CF,CdxA [m²],total RRC [-],weighted RRC w/o trailer [-],r_dyn [m],Number axles vehicle driven [-],Number axles vehicle non-driven [-],Number axles trailer [-],Gearbox manufacturer [-],Gearbox model [-],Gearbox type [-],Gear ratio first gear [-],Gear ratio last gear [-],Torque converter manufacturer [-],Torque converter model [-],Retarder manufacturer [-],Retarder model [-],Retarder type [-],Angledrive manufacturer [-],Angledrive model [-],Angledrive ratio [-],Axle manufacturer [-],Axle model [-],Axle gear ratio [-],Auxiliary technology STP [-],Auxiliary technology FAN [-],Auxiliary technology AC [-],Auxiliary technology PS [-],Auxiliary technology ES [-],Auxiliary technology cycle [-],Auxiliary technology ALT [-],Cargo Volume [m³],time [s],distance [km],speed [km/h],altitudeDelta [m],FC-Map [g/h],FC-Map [g/km],FC-AUXc [g/h],FC-AUXc [g/km],FC-WHTCc [g/h],FC-WHTCc [g/km],FC-AAUX [g/h],FC-AAUX [g/km],FC-Final [g/h],FC-Final [g/km],FC-Final [l/100km],FC-Final [l/100tkm],FC-Final [l/100m³km],CO2 [g/km],CO2 [g/tkm],CO2 [g/m³km],P_wheel_in_pos [kW],P_fcmap_pos [kW],E_fcmap_pos [kWh],E_fcmap_neg [kWh],E_powertrain_inertia [kWh],E_aux_CYCLE [kWh],E_aux_ALT [kWh],E_aux_sum [kWh],E_clutch_loss [kWh],E_tc_loss [kWh],E_shift_loss [kWh],E_gbx_loss [kWh],E_ret_loss [kWh],E_angle_loss [kWh],E_axl_loss [kWh],E_brake [kWh],E_vehi_inertia [kWh],E_air [kWh],E_roll [kWh],E_grad [kWh],a [m/s^2],a_pos [m/s^2],a_neg [m/s^2],AccelerationTimeShare [%],DecelerationTimeShare [%],CruiseTimeShare [%],max. speed [km/h],max. acc [m/s²],max. dec [m/s²],n_eng_avg [rpm],n_eng_max [rpm],gear shifts [-],StopTimeShare [%],Engine max. Load time share [%],CoastingTimeShare [%],BrakingTImeShare [%],Gear 0 TimeShare [%],Gear 1 TimeShare [%],Gear 2 TimeShare [%],Gear 3 TimeShare [%],Gear 4 TimeShare [%],Gear 5 TimeShare [%],Gear 6 TimeShare [%]
+10-0,MeasuredSpeedVairAux,MeasuredSpeedVairAux.vdri,Success,N/A,,N.A.,0,8862.0000,0.0000,8862.0000,N/A,Demo Engine,Diesel CI,0.0000,600.0000,0.0000,6000.0000,1,1,1,0,1,1,6.1650,0.00764995394918169,0.00764995394918169,0.5200,1,1,0,N/A,Demo,MT,6.6960,0.7280,n.a.,n.a.,n.a.,n.a.,None,n.a.,n.a.,n.a.,N/A,Demo,4.3000,,,,,,,,,1299.0000,16.8454,46.6846,15.8669,6484.3707,138.8975,6484.3707,138.8975,6484.3707,138.8975,6484.3707,138.8975,6484.3707,138.8975,16.6145,,,434.7492,,,20.1443,30.8711,11.1393,0.3170,0.0000,1.9832,0.3799,2.3631,0.0059,0.0000,0.0000,0.2829,0.0000,0.0000,1.8454,0.6301,0.0000,2.2245,3.1109,0.3596,0.0000,0.3170,-0.3301,23.0177,22.4018,40.1848,80.5095,1.1306,1.6261,1121.4187,1962.5826,214.0000,14.3957,2.7714,0.0000,39.8768,17.3210,7.0824,0.7698,1.0778,4.3880,48.6528,20.7082
diff --git a/VectoCore/VectoCoreTest/TestData/MeasuredSpeed/Results/MeasuredSpeedVairBack.vsum b/VectoCore/VectoCoreTest/TestData/MeasuredSpeed/Results/MeasuredSpeedVairBack.vsum
index d2800166e6c5b5cb12db5b433c7307149fb42575..b455bf463cefc69d3bbd6c03ba4cb56e90dcbb5f 100644
--- a/VectoCore/VectoCoreTest/TestData/MeasuredSpeed/Results/MeasuredSpeedVairBack.vsum
+++ b/VectoCore/VectoCoreTest/TestData/MeasuredSpeed/Results/MeasuredSpeedVairBack.vsum
@@ -1,2 +1,3 @@
-Job [-],Input File [-],Cycle [-],Status,Vehicle manufacturer [-],VIN number,Vehicle model [-],HDV CO2 vehicle class [-],Chassis curb mass [kg],Loading [kg],Total vehicle mass [kg],Engine manufacturer [-],Engine model [-],Engine fuel type [-],Engine rated power [kW],Engine idling speed [rpm],Engine rated speed [rpm],Engine displacement [ccm],Engine WHTCUrban,Engine WHTCRural,Engine WHTCMotorway,Engine BFColdHot,Engine CFRegPer,Engine actual CF,CdxA [m²],total RRC [-],weighted RRC w/o trailer [-],r_dyn [m],Gearbox manufacturer [-],Gearbox model [-],Gearbox type [-],Gear ratio first gear [-],Gear ratio last gear [-],Torque converter manufacturer [-],Torque converter model [-],Retarder manufacturer [-],Retarder model [-],Retarder type [-],Angledrive manufacturer [-],Angledrive model [-],Angledrive ratio [-],Axle manufacturer [-],Axle model [-],Axle gear ratio [-],Auxiliary technology STP [-],Auxiliary technology FAN [-],Auxiliary technology AC [-],Auxiliary technology PS [-],Auxiliary technology ES [-],Auxiliary technology cycle [-],Cargo Volume [m³],time [s],distance [km],speed [km/h],altitudeDelta [m],FC-Map [g/h],FC-Map [g/km],FC-AUXc [g/h],FC-AUXc [g/km],FC-WHTCc [g/h],FC-WHTCc [g/km],FC-AAUX [g/h],FC-AAUX [g/km],FC-Final [g/h],FC-Final [g/km],FC-Final [l/100km],FC-Final [l/100tkm],FC-Final [l/100m³km],CO2 [g/km],CO2 [g/tkm],CO2 [g/m³km],P_wheel_in_pos [kW],P_fcmap_pos [kW],E_fcmap_pos [kWh],E_fcmap_neg [kWh],E_powertrain_inertia [kWh],E_aux_CYCLE [kWh],E_aux_sum [kWh],E_clutch_loss [kWh],E_tc_loss [kWh],E_shift_loss [kWh],E_gbx_loss [kWh],E_ret_loss [kWh],E_angle_loss [kWh],E_axl_loss [kWh],E_brake [kWh],E_vehi_inertia [kWh],E_air [kWh],E_roll [kWh],E_grad [kWh],a [m/s^2],a_pos [m/s^2],a_neg [m/s^2],AccelerationTimeShare [%],DecelerationTimeShare [%],CruiseTimeShare [%],StopTimeShare [%],max. speed [km/h,max. acc [m/s²],max. dec [m/s²],n_eng_avg [rpm],n_eng_max [rpm],gear shifts [-],Engine max. Load time share [%],CoastingTimeShare [%],BrakingTImeShare [%],Gear 0 TimeShare [%],Gear 1 TimeShare [%],Gear 2 TimeShare [%],Gear 3 TimeShare [%],Gear 4 TimeShare [%],Gear 5 TimeShare [%],Gear 6 TimeShare [%]
-15-0,MeasuredSpeedVairBack,MeasuredSpeedVairBack.vdri,Success,N/A,,N.A.,0,8862.0000,0.0000,8862.0000,N/A,Demo Engine,Diesel CI,0.0000,600.0000,0.0000,6000.0000,1,1,1,0,1,1,6.1650,0.00764995394918169,0.00764995394918169,0.5200,N/A,Demo,MT,6.6960,0.7280,n.a.,n.a.,n.a.,n.a.,None,n.a.,n.a.,n.a.,N/A,Demo,4.3000,,,,,,,,1299.0000,16.8501,46.6977,15.8669,4884.3611,104.5952,4884.3611,104.5952,4884.3611,104.5952,4884.3611,104.5952,4884.3611,104.5952,12.5715,,,330.5210,,,13.7605,22.3008,8.0469,0.5134,0.0000,1.9832,1.9832,0.0052,0.0000,0.0000,0.2534,0.0000,0.0000,1.8435,0.8337,0.0000,-0.8568,3.1117,0.3597,0.0000,0.3156,-0.3348,22.9407,21.7860,40.8776,14.3957,80.5095,1.1306,1.6261,1115.4956,1735.6300,211.0000,2.1555,0.0000,40.0308,17.7059,6.5435,0.7698,1.0778,3.6182,49.3457,20.9392
+# VECTO 3.1.2.810 - 05.07.2017 13:04
+Job [-],Input File [-],Cycle [-],Status,Vehicle manufacturer [-],VIN number,Vehicle model [-],HDV CO2 vehicle class [-],Corrected Actual Curb Mass [kg],Loading [kg],Total vehicle mass [kg],Engine manufacturer [-],Engine model [-],Engine fuel type [-],Engine rated power [kW],Engine idling speed [rpm],Engine rated speed [rpm],Engine displacement [ccm],Engine WHTCUrban,Engine WHTCRural,Engine WHTCMotorway,Engine BFColdHot,Engine CFRegPer,Engine actual CF,CdxA [m²],total RRC [-],weighted RRC w/o trailer [-],r_dyn [m],Number axles vehicle driven [-],Number axles vehicle non-driven [-],Number axles trailer [-],Gearbox manufacturer [-],Gearbox model [-],Gearbox type [-],Gear ratio first gear [-],Gear ratio last gear [-],Torque converter manufacturer [-],Torque converter model [-],Retarder manufacturer [-],Retarder model [-],Retarder type [-],Angledrive manufacturer [-],Angledrive model [-],Angledrive ratio [-],Axle manufacturer [-],Axle model [-],Axle gear ratio [-],Auxiliary technology STP [-],Auxiliary technology FAN [-],Auxiliary technology AC [-],Auxiliary technology PS [-],Auxiliary technology ES [-],Auxiliary technology cycle [-],Cargo Volume [m³],time [s],distance [km],speed [km/h],altitudeDelta [m],FC-Map [g/h],FC-Map [g/km],FC-AUXc [g/h],FC-AUXc [g/km],FC-WHTCc [g/h],FC-WHTCc [g/km],FC-AAUX [g/h],FC-AAUX [g/km],FC-Final [g/h],FC-Final [g/km],FC-Final [l/100km],FC-Final [l/100tkm],FC-Final [l/100m³km],CO2 [g/km],CO2 [g/tkm],CO2 [g/m³km],P_wheel_in_pos [kW],P_fcmap_pos [kW],E_fcmap_pos [kWh],E_fcmap_neg [kWh],E_powertrain_inertia [kWh],E_aux_CYCLE [kWh],E_aux_sum [kWh],E_clutch_loss [kWh],E_tc_loss [kWh],E_shift_loss [kWh],E_gbx_loss [kWh],E_ret_loss [kWh],E_angle_loss [kWh],E_axl_loss [kWh],E_brake [kWh],E_vehi_inertia [kWh],E_air [kWh],E_roll [kWh],E_grad [kWh],a [m/s^2],a_pos [m/s^2],a_neg [m/s^2],AccelerationTimeShare [%],DecelerationTimeShare [%],CruiseTimeShare [%],max. speed [km/h],max. acc [m/s²],max. dec [m/s²],n_eng_avg [rpm],n_eng_max [rpm],gear shifts [-],StopTimeShare [%],Engine max. Load time share [%],CoastingTimeShare [%],BrakingTImeShare [%],Gear 0 TimeShare [%],Gear 1 TimeShare [%],Gear 2 TimeShare [%],Gear 3 TimeShare [%],Gear 4 TimeShare [%],Gear 5 TimeShare [%],Gear 6 TimeShare [%]
+4-0,MeasuredSpeedVairBack,MeasuredSpeedVairBack.vdri,Success,N/A,,N.A.,0,8862.0000,0.0000,8862.0000,N/A,Demo Engine,Diesel CI,0.0000,600.0000,0.0000,6000.0000,1,1,1,0,1,1,6.1650,0.00764995394918169,0.00764995394918169,0.5200,1,1,0,N/A,Demo,MT,6.6960,0.7280,n.a.,n.a.,n.a.,n.a.,None,n.a.,n.a.,n.a.,N/A,Demo,4.3000,,,,,,,,1299.0000,16.8501,46.6977,15.8669,4884.3611,104.5952,4884.3611,104.5952,4884.3611,104.5952,4884.3611,104.5952,4884.3611,104.5952,12.5114,,,327.3831,,,13.7605,22.3008,8.0469,0.5134,0.0000,1.9832,1.9832,0.0052,0.0000,0.0000,0.2534,0.0000,0.0000,1.8435,0.8337,0.0000,-0.8568,3.1117,0.3597,0.0000,0.3156,-0.3348,22.9407,21.7860,40.8776,80.5095,1.1306,1.6261,1115.4956,1735.6300,211.0000,14.3957,2.1555,0.0000,40.0308,17.7059,6.5435,0.7698,1.0778,3.6182,49.3457,20.9392
diff --git a/VectoCore/VectoCoreTest/TestData/MeasuredSpeed/Results/MeasuredSpeedVairFront.vsum b/VectoCore/VectoCoreTest/TestData/MeasuredSpeed/Results/MeasuredSpeedVairFront.vsum
index 79f579b3d188dac89a5f8183f387ed81c1f63924..df0082b3e5260b18f2442658e05ede83fc00bd7c 100644
--- a/VectoCore/VectoCoreTest/TestData/MeasuredSpeed/Results/MeasuredSpeedVairFront.vsum
+++ b/VectoCore/VectoCoreTest/TestData/MeasuredSpeed/Results/MeasuredSpeedVairFront.vsum
@@ -1,2 +1,3 @@
-Job [-],Input File [-],Cycle [-],Status,Vehicle manufacturer [-],VIN number,Vehicle model [-],HDV CO2 vehicle class [-],Chassis curb mass [kg],Loading [kg],Total vehicle mass [kg],Engine manufacturer [-],Engine model [-],Engine fuel type [-],Engine rated power [kW],Engine idling speed [rpm],Engine rated speed [rpm],Engine displacement [ccm],Engine WHTCUrban,Engine WHTCRural,Engine WHTCMotorway,Engine BFColdHot,Engine CFRegPer,Engine actual CF,CdxA [m²],total RRC [-],weighted RRC w/o trailer [-],r_dyn [m],Gearbox manufacturer [-],Gearbox model [-],Gearbox type [-],Gear ratio first gear [-],Gear ratio last gear [-],Torque converter manufacturer [-],Torque converter model [-],Retarder manufacturer [-],Retarder model [-],Retarder type [-],Angledrive manufacturer [-],Angledrive model [-],Angledrive ratio [-],Axle manufacturer [-],Axle model [-],Axle gear ratio [-],Auxiliary technology STP [-],Auxiliary technology FAN [-],Auxiliary technology AC [-],Auxiliary technology PS [-],Auxiliary technology ES [-],Auxiliary technology cycle [-],Cargo Volume [m³],time [s],distance [km],speed [km/h],altitudeDelta [m],FC-Map [g/h],FC-Map [g/km],FC-AUXc [g/h],FC-AUXc [g/km],FC-WHTCc [g/h],FC-WHTCc [g/km],FC-AAUX [g/h],FC-AAUX [g/km],FC-Final [g/h],FC-Final [g/km],FC-Final [l/100km],FC-Final [l/100tkm],FC-Final [l/100m³km],CO2 [g/km],CO2 [g/tkm],CO2 [g/m³km],P_wheel_in_pos [kW],P_fcmap_pos [kW],E_fcmap_pos [kWh],E_fcmap_neg [kWh],E_powertrain_inertia [kWh],E_aux_CYCLE [kWh],E_aux_sum [kWh],E_clutch_loss [kWh],E_tc_loss [kWh],E_shift_loss [kWh],E_gbx_loss [kWh],E_ret_loss [kWh],E_angle_loss [kWh],E_axl_loss [kWh],E_brake [kWh],E_vehi_inertia [kWh],E_air [kWh],E_roll [kWh],E_grad [kWh],a [m/s^2],a_pos [m/s^2],a_neg [m/s^2],AccelerationTimeShare [%],DecelerationTimeShare [%],CruiseTimeShare [%],StopTimeShare [%],max. speed [km/h,max. acc [m/s²],max. dec [m/s²],n_eng_avg [rpm],n_eng_max [rpm],gear shifts [-],Engine max. Load time share [%],CoastingTimeShare [%],BrakingTImeShare [%],Gear 0 TimeShare [%],Gear 1 TimeShare [%],Gear 2 TimeShare [%],Gear 3 TimeShare [%],Gear 4 TimeShare [%],Gear 5 TimeShare [%],Gear 6 TimeShare [%]
-14-0,MeasuredSpeedVairFront,MeasuredSpeedVairFront.vdri,Success,N/A,,N.A.,0,8862.0000,0.0000,8862.0000,N/A,Demo Engine,Diesel CI,0.0000,600.0000,0.0000,6000.0000,1,1,1,0,1,1,6.1650,0.00764995394918169,0.00764995394918169,0.5200,N/A,Demo,MT,6.6960,0.7280,n.a.,n.a.,n.a.,n.a.,None,n.a.,n.a.,n.a.,N/A,Demo,4.3000,,,,,,,,1299.0000,16.8474,46.6902,15.8669,5478.1550,117.3298,5478.1550,117.3298,5478.1550,117.3298,5478.1550,117.3298,5478.1550,117.3298,14.1021,,,370.7622,,,16.2819,25.4228,9.1734,0.4011,0.0000,1.9832,1.9832,0.0055,0.0000,0.0000,0.2617,0.0000,0.0000,1.8447,0.6774,0.0000,0.5289,3.1112,0.3596,0.0000,0.3161,-0.3290,23.0177,22.4788,40.1078,14.3957,80.5095,1.1306,1.6261,1116.3935,1735.6300,211.0000,2.6174,0.0000,40.0308,17.2440,7.0054,0.7698,1.0778,3.6182,49.4996,20.7852
+# VECTO 3.1.2.810 - 05.07.2017 13:04
+Job [-],Input File [-],Cycle [-],Status,Vehicle manufacturer [-],VIN number,Vehicle model [-],HDV CO2 vehicle class [-],Corrected Actual Curb Mass [kg],Loading [kg],Total vehicle mass [kg],Engine manufacturer [-],Engine model [-],Engine fuel type [-],Engine rated power [kW],Engine idling speed [rpm],Engine rated speed [rpm],Engine displacement [ccm],Engine WHTCUrban,Engine WHTCRural,Engine WHTCMotorway,Engine BFColdHot,Engine CFRegPer,Engine actual CF,CdxA [m²],total RRC [-],weighted RRC w/o trailer [-],r_dyn [m],Number axles vehicle driven [-],Number axles vehicle non-driven [-],Number axles trailer [-],Gearbox manufacturer [-],Gearbox model [-],Gearbox type [-],Gear ratio first gear [-],Gear ratio last gear [-],Torque converter manufacturer [-],Torque converter model [-],Retarder manufacturer [-],Retarder model [-],Retarder type [-],Angledrive manufacturer [-],Angledrive model [-],Angledrive ratio [-],Axle manufacturer [-],Axle model [-],Axle gear ratio [-],Auxiliary technology STP [-],Auxiliary technology FAN [-],Auxiliary technology AC [-],Auxiliary technology PS [-],Auxiliary technology ES [-],Auxiliary technology cycle [-],Cargo Volume [m³],time [s],distance [km],speed [km/h],altitudeDelta [m],FC-Map [g/h],FC-Map [g/km],FC-AUXc [g/h],FC-AUXc [g/km],FC-WHTCc [g/h],FC-WHTCc [g/km],FC-AAUX [g/h],FC-AAUX [g/km],FC-Final [g/h],FC-Final [g/km],FC-Final [l/100km],FC-Final [l/100tkm],FC-Final [l/100m³km],CO2 [g/km],CO2 [g/tkm],CO2 [g/m³km],P_wheel_in_pos [kW],P_fcmap_pos [kW],E_fcmap_pos [kWh],E_fcmap_neg [kWh],E_powertrain_inertia [kWh],E_aux_CYCLE [kWh],E_aux_sum [kWh],E_clutch_loss [kWh],E_tc_loss [kWh],E_shift_loss [kWh],E_gbx_loss [kWh],E_ret_loss [kWh],E_angle_loss [kWh],E_axl_loss [kWh],E_brake [kWh],E_vehi_inertia [kWh],E_air [kWh],E_roll [kWh],E_grad [kWh],a [m/s^2],a_pos [m/s^2],a_neg [m/s^2],AccelerationTimeShare [%],DecelerationTimeShare [%],CruiseTimeShare [%],max. speed [km/h],max. acc [m/s²],max. dec [m/s²],n_eng_avg [rpm],n_eng_max [rpm],gear shifts [-],StopTimeShare [%],Engine max. Load time share [%],CoastingTimeShare [%],BrakingTImeShare [%],Gear 0 TimeShare [%],Gear 1 TimeShare [%],Gear 2 TimeShare [%],Gear 3 TimeShare [%],Gear 4 TimeShare [%],Gear 5 TimeShare [%],Gear 6 TimeShare [%]
+3-0,MeasuredSpeedVairFront,MeasuredSpeedVairFront.vdri,Success,N/A,,N.A.,0,8862.0000,0.0000,8862.0000,N/A,Demo Engine,Diesel CI,0.0000,600.0000,0.0000,6000.0000,1,1,1,0,1,1,6.1650,0.00764995394918169,0.00764995394918169,0.5200,1,1,0,N/A,Demo,MT,6.6960,0.7280,n.a.,n.a.,n.a.,n.a.,None,n.a.,n.a.,n.a.,N/A,Demo,4.3000,,,,,,,,1299.0000,16.8474,46.6902,15.8669,5478.1550,117.3298,5478.1550,117.3298,5478.1550,117.3298,5478.1550,117.3298,5478.1550,117.3298,14.0347,,,367.2423,,,16.2819,25.4228,9.1734,0.4011,0.0000,1.9832,1.9832,0.0055,0.0000,0.0000,0.2617,0.0000,0.0000,1.8447,0.6774,0.0000,0.5289,3.1112,0.3596,0.0000,0.3161,-0.3290,23.0177,22.4788,40.1078,80.5095,1.1306,1.6261,1116.3935,1735.6300,211.0000,14.3957,2.6174,0.0000,40.0308,17.2440,7.0054,0.7698,1.0778,3.6182,49.4996,20.7852
diff --git a/VectoCore/VectoCoreTest/TestData/MeasuredSpeed/Results/MeasuredSpeedVairNoWind.vsum b/VectoCore/VectoCoreTest/TestData/MeasuredSpeed/Results/MeasuredSpeedVairNoWind.vsum
index 600f442dd3648d87a7560758a8fa309cec1c3211..dde7578a5f82b05c44bd94778c1e935161f3b6af 100644
--- a/VectoCore/VectoCoreTest/TestData/MeasuredSpeed/Results/MeasuredSpeedVairNoWind.vsum
+++ b/VectoCore/VectoCoreTest/TestData/MeasuredSpeed/Results/MeasuredSpeedVairNoWind.vsum
@@ -1,2 +1,3 @@
-Job [-],Input File [-],Cycle [-],Status,Vehicle manufacturer [-],VIN number,Vehicle model [-],HDV CO2 vehicle class [-],Chassis curb mass [kg],Loading [kg],Total vehicle mass [kg],Engine manufacturer [-],Engine model [-],Engine fuel type [-],Engine rated power [kW],Engine idling speed [rpm],Engine rated speed [rpm],Engine displacement [ccm],Engine WHTCUrban,Engine WHTCRural,Engine WHTCMotorway,Engine BFColdHot,Engine CFRegPer,Engine actual CF,CdxA [m²],total RRC [-],weighted RRC w/o trailer [-],r_dyn [m],Gearbox manufacturer [-],Gearbox model [-],Gearbox type [-],Gear ratio first gear [-],Gear ratio last gear [-],Torque converter manufacturer [-],Torque converter model [-],Retarder manufacturer [-],Retarder model [-],Retarder type [-],Angledrive manufacturer [-],Angledrive model [-],Angledrive ratio [-],Axle manufacturer [-],Axle model [-],Axle gear ratio [-],Auxiliary technology STP [-],Auxiliary technology FAN [-],Auxiliary technology AC [-],Auxiliary technology PS [-],Auxiliary technology ES [-],Auxiliary technology cycle [-],Cargo Volume [m³],time [s],distance [km],speed [km/h],altitudeDelta [m],FC-Map [g/h],FC-Map [g/km],FC-AUXc [g/h],FC-AUXc [g/km],FC-WHTCc [g/h],FC-WHTCc [g/km],FC-AAUX [g/h],FC-AAUX [g/km],FC-Final [g/h],FC-Final [g/km],FC-Final [l/100km],FC-Final [l/100tkm],FC-Final [l/100m³km],CO2 [g/km],CO2 [g/tkm],CO2 [g/m³km],P_wheel_in_pos [kW],P_fcmap_pos [kW],E_fcmap_pos [kWh],E_fcmap_neg [kWh],E_powertrain_inertia [kWh],E_aux_CYCLE [kWh],E_aux_sum [kWh],E_clutch_loss [kWh],E_tc_loss [kWh],E_shift_loss [kWh],E_gbx_loss [kWh],E_ret_loss [kWh],E_angle_loss [kWh],E_axl_loss [kWh],E_brake [kWh],E_vehi_inertia [kWh],E_air [kWh],E_roll [kWh],E_grad [kWh],a [m/s^2],a_pos [m/s^2],a_neg [m/s^2],AccelerationTimeShare [%],DecelerationTimeShare [%],CruiseTimeShare [%],StopTimeShare [%],max. speed [km/h,max. acc [m/s²],max. dec [m/s²],n_eng_avg [rpm],n_eng_max [rpm],gear shifts [-],Engine max. Load time share [%],CoastingTimeShare [%],BrakingTImeShare [%],Gear 0 TimeShare [%],Gear 1 TimeShare [%],Gear 2 TimeShare [%],Gear 3 TimeShare [%],Gear 4 TimeShare [%],Gear 5 TimeShare [%],Gear 6 TimeShare [%]
-16-0,MeasuredSpeedVairNoWind,MeasuredSpeedVairNoWind.vdri,Success,N/A,,N.A.,0,8862.0000,0.0000,8862.0000,N/A,Demo Engine,Diesel CI,0.0000,600.0000,0.0000,6000.0000,1,1,1,0,1,1,6.1650,0.00764995394918169,0.00764995394918169,0.5200,N/A,Demo,MT,6.6960,0.7280,n.a.,n.a.,n.a.,n.a.,None,n.a.,n.a.,n.a.,N/A,Demo,4.3000,,,,,,,,1299.0000,16.8481,46.6923,15.8669,5249.0607,112.4182,5249.0607,112.4182,5249.0607,112.4182,5249.0607,112.4182,5249.0607,112.4182,13.5118,,,355.2414,,,15.2949,24.2055,8.7342,0.4389,0.0000,1.9832,1.9832,0.0054,0.0000,0.0000,0.2587,0.0000,0.0000,1.8442,0.7327,0.0000,0.0000,3.1114,0.3597,0.0000,0.3164,-0.3321,22.9407,22.0939,40.5697,14.3957,80.5095,1.1306,1.6261,1115.8093,1735.6300,211.0000,2.3865,0.0000,40.0308,17.3210,6.9284,0.7698,1.0778,3.6182,49.3457,20.9392
+# VECTO 3.1.2.810 - 05.07.2017 13:08
+Job [-],Input File [-],Cycle [-],Status,Vehicle manufacturer [-],VIN number,Vehicle model [-],HDV CO2 vehicle class [-],Corrected Actual Curb Mass [kg],Loading [kg],Total vehicle mass [kg],Engine manufacturer [-],Engine model [-],Engine fuel type [-],Engine rated power [kW],Engine idling speed [rpm],Engine rated speed [rpm],Engine displacement [ccm],Engine WHTCUrban,Engine WHTCRural,Engine WHTCMotorway,Engine BFColdHot,Engine CFRegPer,Engine actual CF,CdxA [m²],total RRC [-],weighted RRC w/o trailer [-],r_dyn [m],Number axles vehicle driven [-],Number axles vehicle non-driven [-],Number axles trailer [-],Gearbox manufacturer [-],Gearbox model [-],Gearbox type [-],Gear ratio first gear [-],Gear ratio last gear [-],Torque converter manufacturer [-],Torque converter model [-],Retarder manufacturer [-],Retarder model [-],Retarder type [-],Angledrive manufacturer [-],Angledrive model [-],Angledrive ratio [-],Axle manufacturer [-],Axle model [-],Axle gear ratio [-],Auxiliary technology STP [-],Auxiliary technology FAN [-],Auxiliary technology AC [-],Auxiliary technology PS [-],Auxiliary technology ES [-],Auxiliary technology cycle [-],Cargo Volume [m³],time [s],distance [km],speed [km/h],altitudeDelta [m],FC-Map [g/h],FC-Map [g/km],FC-AUXc [g/h],FC-AUXc [g/km],FC-WHTCc [g/h],FC-WHTCc [g/km],FC-AAUX [g/h],FC-AAUX [g/km],FC-Final [g/h],FC-Final [g/km],FC-Final [l/100km],FC-Final [l/100tkm],FC-Final [l/100m³km],CO2 [g/km],CO2 [g/tkm],CO2 [g/m³km],P_wheel_in_pos [kW],P_fcmap_pos [kW],E_fcmap_pos [kWh],E_fcmap_neg [kWh],E_powertrain_inertia [kWh],E_aux_CYCLE [kWh],E_aux_sum [kWh],E_clutch_loss [kWh],E_tc_loss [kWh],E_shift_loss [kWh],E_gbx_loss [kWh],E_ret_loss [kWh],E_angle_loss [kWh],E_axl_loss [kWh],E_brake [kWh],E_vehi_inertia [kWh],E_air [kWh],E_roll [kWh],E_grad [kWh],a [m/s^2],a_pos [m/s^2],a_neg [m/s^2],AccelerationTimeShare [%],DecelerationTimeShare [%],CruiseTimeShare [%],max. speed [km/h],max. acc [m/s²],max. dec [m/s²],n_eng_avg [rpm],n_eng_max [rpm],gear shifts [-],StopTimeShare [%],Engine max. Load time share [%],CoastingTimeShare [%],BrakingTImeShare [%],Gear 0 TimeShare [%],Gear 1 TimeShare [%],Gear 2 TimeShare [%],Gear 3 TimeShare [%],Gear 4 TimeShare [%],Gear 5 TimeShare [%],Gear 6 TimeShare [%]
+23-0,MeasuredSpeedVairNoWind,MeasuredSpeedVairNoWind.vdri,Success,N/A,,N.A.,0,8862.0000,0.0000,8862.0000,N/A,Demo Engine,Diesel CI,0.0000,600.0000,0.0000,6000.0000,1,1,1,0,1,1,6.1650,0.00764995394918169,0.00764995394918169,0.5200,1,1,0,N/A,Demo,MT,6.6960,0.7280,n.a.,n.a.,n.a.,n.a.,None,n.a.,n.a.,n.a.,N/A,Demo,4.3000,,,,,,,,1299.0000,16.8481,46.6923,15.8669,5249.0607,112.4182,5249.0607,112.4182,5249.0607,112.4182,5249.0607,112.4182,5249.0607,112.4182,13.4471,,,351.8689,,,15.2949,24.2055,8.7342,0.4389,0.0000,1.9832,1.9832,0.0054,0.0000,0.0000,0.2587,0.0000,0.0000,1.8442,0.7327,0.0000,0.0000,3.1114,0.3597,0.0000,0.3164,-0.3321,22.9407,22.0939,40.5697,80.5095,1.1306,1.6261,1115.8093,1735.6300,211.0000,14.3957,2.3865,0.0000,40.0308,17.3210,6.9284,0.7698,1.0778,3.6182,49.3457,20.9392
diff --git a/VectoCore/VectoCoreTest/TestData/Pwheel/Results/Pwheel.vsum b/VectoCore/VectoCoreTest/TestData/Pwheel/Results/Pwheel.vsum
index 14ee0ee472ccfae442a8e186808151f6a74731a3..afb680fc9b674a51b4fedd486cb85c09a61638bf 100644
--- a/VectoCore/VectoCoreTest/TestData/Pwheel/Results/Pwheel.vsum
+++ b/VectoCore/VectoCoreTest/TestData/Pwheel/Results/Pwheel.vsum
@@ -1,2 +1,3 @@
-Job [-],Input File [-],Cycle [-],Status,Vehicle manufacturer [-],VIN number,Vehicle model [-],HDV CO2 vehicle class [-],Chassis curb mass [kg],Loading [kg],Total vehicle mass [kg],Engine manufacturer [-],Engine model [-],Engine fuel type [-],Engine rated power [kW],Engine idling speed [rpm],Engine rated speed [rpm],Engine displacement [ccm],Engine WHTCUrban,Engine WHTCRural,Engine WHTCMotorway,Engine BFColdHot,Engine CFRegPer,Engine actual CF,CdxA [m²],total RRC [-],weighted RRC w/o trailer [-],r_dyn [m],Gearbox manufacturer [-],Gearbox model [-],Gearbox type [-],Gear ratio first gear [-],Gear ratio last gear [-],Torque converter manufacturer [-],Torque converter model [-],Retarder manufacturer [-],Retarder model [-],Retarder type [-],Angledrive manufacturer [-],Angledrive model [-],Angledrive ratio [-],Axle manufacturer [-],Axle model [-],Axle gear ratio [-],Auxiliary technology STP [-],Auxiliary technology FAN [-],Auxiliary technology AC [-],Auxiliary technology PS [-],Auxiliary technology ES [-],Auxiliary technology cycle [-],Cargo Volume [m³],time [s],distance [km],speed [km/h],altitudeDelta [m],FC-Map [g/h],FC-Map [g/km],FC-AUXc [g/h],FC-AUXc [g/km],FC-WHTCc [g/h],FC-WHTCc [g/km],FC-AAUX [g/h],FC-AAUX [g/km],FC-Final [g/h],FC-Final [g/km],FC-Final [l/100km],FC-Final [l/100tkm],FC-Final [l/100m³km],CO2 [g/km],CO2 [g/tkm],CO2 [g/m³km],P_wheel_in_pos [kW],P_fcmap_pos [kW],E_fcmap_pos [kWh],E_fcmap_neg [kWh],E_powertrain_inertia [kWh],E_aux_CYCLE [kWh],E_aux_sum [kWh],E_clutch_loss [kWh],E_tc_loss [kWh],E_shift_loss [kWh],E_gbx_loss [kWh],E_ret_loss [kWh],E_angle_loss [kWh],E_axl_loss [kWh],E_brake [kWh],E_vehi_inertia [kWh],E_air [kWh],E_roll [kWh],E_grad [kWh],a [m/s^2],a_pos [m/s^2],a_neg [m/s^2],AccelerationTimeShare [%],DecelerationTimeShare [%],CruiseTimeShare [%],StopTimeShare [%],max. speed [km/h,max. acc [m/s²],max. dec [m/s²],n_eng_avg [rpm],n_eng_max [rpm],gear shifts [-],Engine max. Load time share [%],CoastingTimeShare [%],BrakingTImeShare [%],Gear 0 TimeShare [%],Gear 1 TimeShare [%],Gear 2 TimeShare [%],Gear 3 TimeShare [%],Gear 4 TimeShare [%],Gear 5 TimeShare [%],Gear 6 TimeShare [%]
-15-0,Pwheel,Gear2_pt1_rep1_actual.vdri,Success,N/A,,N.A.,0,12000.0000,0.0000,12000.0000,N/A,OM906 175 kW,Diesel CI,0.0000,600.0000,0.0000,6374.0000,1,1,1,0,1,1,4.1500,0.0061139563906202,0.0061139563906202,0.4210,N/A,"G 85-6/6,7-0,73",MT,6.6960,0.7280,n.a.,n.a.,n.a.,n.a.,None,n.a.,n.a.,n.a.,N/A,"G 85-6/6,7-0,73",4.3000,,,,,,,,1.5000,,,,12705.4509,,12705.4509,,12705.4509,,12705.4509,,12705.4509,,,,,,,,59.3466,62.3778,0.0260,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0007,0.0000,0.0000,0.0006,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,66.6667,0.0000,0.0000,0.0000,1165.5495,1748.3243,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,66.6667,0.0000,0.0000,0.0000,0.0000
+# VECTO 3.1.2.810 - 05.07.2017 13:11
+Job [-],Input File [-],Cycle [-],Status,Vehicle manufacturer [-],VIN number,Vehicle model [-],HDV CO2 vehicle class [-],Corrected Actual Curb Mass [kg],Loading [kg],Total vehicle mass [kg],Engine manufacturer [-],Engine model [-],Engine fuel type [-],Engine rated power [kW],Engine idling speed [rpm],Engine rated speed [rpm],Engine displacement [ccm],Engine WHTCUrban,Engine WHTCRural,Engine WHTCMotorway,Engine BFColdHot,Engine CFRegPer,Engine actual CF,CdxA [m²],total RRC [-],weighted RRC w/o trailer [-],r_dyn [m],Number axles vehicle driven [-],Number axles vehicle non-driven [-],Number axles trailer [-],Gearbox manufacturer [-],Gearbox model [-],Gearbox type [-],Gear ratio first gear [-],Gear ratio last gear [-],Torque converter manufacturer [-],Torque converter model [-],Retarder manufacturer [-],Retarder model [-],Retarder type [-],Angledrive manufacturer [-],Angledrive model [-],Angledrive ratio [-],Axle manufacturer [-],Axle model [-],Axle gear ratio [-],Auxiliary technology STP [-],Auxiliary technology FAN [-],Auxiliary technology AC [-],Auxiliary technology PS [-],Auxiliary technology ES [-],Auxiliary technology cycle [-],Cargo Volume [m³],time [s],distance [km],speed [km/h],altitudeDelta [m],FC-Map [g/h],FC-Map [g/km],FC-AUXc [g/h],FC-AUXc [g/km],FC-WHTCc [g/h],FC-WHTCc [g/km],FC-AAUX [g/h],FC-AAUX [g/km],FC-Final [g/h],FC-Final [g/km],FC-Final [l/100km],FC-Final [l/100tkm],FC-Final [l/100m³km],CO2 [g/km],CO2 [g/tkm],CO2 [g/m³km],P_wheel_in_pos [kW],P_fcmap_pos [kW],E_fcmap_pos [kWh],E_fcmap_neg [kWh],E_powertrain_inertia [kWh],E_aux_CYCLE [kWh],E_aux_sum [kWh],E_clutch_loss [kWh],E_tc_loss [kWh],E_shift_loss [kWh],E_gbx_loss [kWh],E_ret_loss [kWh],E_angle_loss [kWh],E_axl_loss [kWh],E_brake [kWh],E_vehi_inertia [kWh],E_air [kWh],E_roll [kWh],E_grad [kWh],a [m/s^2],a_pos [m/s^2],a_neg [m/s^2],AccelerationTimeShare [%],DecelerationTimeShare [%],CruiseTimeShare [%],max. speed [km/h],max. acc [m/s²],max. dec [m/s²],n_eng_avg [rpm],n_eng_max [rpm],gear shifts [-],StopTimeShare [%],Engine max. Load time share [%],CoastingTimeShare [%],BrakingTImeShare [%],Gear 0 TimeShare [%],Gear 1 TimeShare [%],Gear 2 TimeShare [%],Gear 3 TimeShare [%],Gear 4 TimeShare [%],Gear 5 TimeShare [%],Gear 6 TimeShare [%]
+35-0,Pwheel,Gear2_pt1_rep1_actual.vdri,Success,N/A,,N.A.,0,12000.0000,0.0000,12000.0000,N/A,OM906 175 kW,Diesel CI,0.0000,600.0000,0.0000,6374.0000,1,1,1,0,1,1,4.1500,0.0061139563906202,0.0061139563906202,0.4210,1,1,0,N/A,"G 85-6/6,7-0,73",MT,6.6960,0.7280,n.a.,n.a.,n.a.,n.a.,None,n.a.,n.a.,n.a.,N/A,"G 85-6/6,7-0,73",4.3000,,,,,,,,1.5000,,,,12705.4509,,12705.4509,,12705.4509,,12705.4509,,12705.4509,,,,,,,,59.3466,62.3778,0.0260,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0007,0.0000,0.0000,0.0006,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,1165.5495,1748.3243,0.0000,66.6667,0.0000,0.0000,0.0000,0.0000,0.0000,66.6667,0.0000,0.0000,0.0000,0.0000
diff --git a/VectoCore/VectoCoreTest/TestData/Pwheel/Results/Pwheel_ultimate.vsum b/VectoCore/VectoCoreTest/TestData/Pwheel/Results/Pwheel_ultimate.vsum
index 87ce22a4b0c89441d9d5833cd5daa33f2ce1f857..4f59655bb0f10a82bd240279e94cb261c617add4 100644
--- a/VectoCore/VectoCoreTest/TestData/Pwheel/Results/Pwheel_ultimate.vsum
+++ b/VectoCore/VectoCoreTest/TestData/Pwheel/Results/Pwheel_ultimate.vsum
@@ -1,2 +1,3 @@
-Job [-],Input File [-],Cycle [-],Status,Vehicle manufacturer [-],VIN number,Vehicle model [-],HDV CO2 vehicle class [-],Chassis curb mass [kg],Loading [kg],Total vehicle mass [kg],Engine manufacturer [-],Engine model [-],Engine fuel type [-],Engine rated power [kW],Engine idling speed [rpm],Engine rated speed [rpm],Engine displacement [ccm],Engine WHTCUrban,Engine WHTCRural,Engine WHTCMotorway,Engine BFColdHot,Engine CFRegPer,Engine actual CF,CdxA [m²],total RRC [-],weighted RRC w/o trailer [-],r_dyn [m],Gearbox manufacturer [-],Gearbox model [-],Gearbox type [-],Gear ratio first gear [-],Gear ratio last gear [-],Torque converter manufacturer [-],Torque converter model [-],Retarder manufacturer [-],Retarder model [-],Retarder type [-],Angledrive manufacturer [-],Angledrive model [-],Angledrive ratio [-],Axle manufacturer [-],Axle model [-],Axle gear ratio [-],Auxiliary technology STP [-],Auxiliary technology FAN [-],Auxiliary technology AC [-],Auxiliary technology PS [-],Auxiliary technology ES [-],Auxiliary technology cycle [-],Cargo Volume [m³],time [s],distance [km],speed [km/h],altitudeDelta [m],FC-Map [g/h],FC-Map [g/km],FC-AUXc [g/h],FC-AUXc [g/km],FC-WHTCc [g/h],FC-WHTCc [g/km],FC-AAUX [g/h],FC-AAUX [g/km],FC-Final [g/h],FC-Final [g/km],FC-Final [l/100km],FC-Final [l/100tkm],FC-Final [l/100m³km],CO2 [g/km],CO2 [g/tkm],CO2 [g/m³km],P_wheel_in_pos [kW],P_fcmap_pos [kW],E_fcmap_pos [kWh],E_fcmap_neg [kWh],E_powertrain_inertia [kWh],E_aux_CYCLE [kWh],E_aux_sum [kWh],E_clutch_loss [kWh],E_tc_loss [kWh],E_shift_loss [kWh],E_gbx_loss [kWh],E_ret_loss [kWh],E_angle_loss [kWh],E_axl_loss [kWh],E_brake [kWh],E_vehi_inertia [kWh],E_air [kWh],E_roll [kWh],E_grad [kWh],a [m/s^2],a_pos [m/s^2],a_neg [m/s^2],AccelerationTimeShare [%],DecelerationTimeShare [%],CruiseTimeShare [%],StopTimeShare [%],max. speed [km/h,max. acc [m/s²],max. dec [m/s²],n_eng_avg [rpm],n_eng_max [rpm],gear shifts [-],Engine max. Load time share [%],CoastingTimeShare [%],BrakingTImeShare [%],Gear 0 TimeShare [%],Gear 1 TimeShare [%],Gear 2 TimeShare [%],Gear 3 TimeShare [%],Gear 4 TimeShare [%],Gear 5 TimeShare [%],Gear 6 TimeShare [%]
-16-0,Pwheel_ultimate,RD__1_Pwheel_AuxStd.vdri,Success,N/A,,N.A.,0,12000.0000,0.0000,12000.0000,N/A,OM906 175 kW,Diesel CI,0.0000,600.0000,0.0000,6374.0000,1,1,1,0,1,1,4.1500,0.0061139563906202,0.0061139563906202,0.4210,N/A,"G 85-6/6,7-0,73",MT,6.6960,0.7280,n.a.,n.a.,n.a.,n.a.,None,n.a.,n.a.,n.a.,N/A,"G 85-6/6,7-0,73",4.3000,,,,,,,,1566.4000,,,,10007.5012,,10007.5012,,10007.5012,,10007.5012,,10007.5012,,,,,,,,41.2262,47.3199,20.5894,0.9852,-0.0004,1.5039,1.5039,0.0000,0.0000,0.0000,0.6826,0.0000,0.0000,1.0764,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,100.0000,0.0000,0.0000,0.0000,1394.1646,2421.2271,52.0000,7.1757,0.0000,0.0000,0.2809,0.7150,8.7334,3.4729,10.2145,12.1297,64.4535
+# VECTO 3.1.2.810 - 05.07.2017 13:09
+Job [-],Input File [-],Cycle [-],Status,Vehicle manufacturer [-],VIN number,Vehicle model [-],HDV CO2 vehicle class [-],Corrected Actual Curb Mass [kg],Loading [kg],Total vehicle mass [kg],Engine manufacturer [-],Engine model [-],Engine fuel type [-],Engine rated power [kW],Engine idling speed [rpm],Engine rated speed [rpm],Engine displacement [ccm],Engine WHTCUrban,Engine WHTCRural,Engine WHTCMotorway,Engine BFColdHot,Engine CFRegPer,Engine actual CF,CdxA [m²],total RRC [-],weighted RRC w/o trailer [-],r_dyn [m],Number axles vehicle driven [-],Number axles vehicle non-driven [-],Number axles trailer [-],Gearbox manufacturer [-],Gearbox model [-],Gearbox type [-],Gear ratio first gear [-],Gear ratio last gear [-],Torque converter manufacturer [-],Torque converter model [-],Retarder manufacturer [-],Retarder model [-],Retarder type [-],Angledrive manufacturer [-],Angledrive model [-],Angledrive ratio [-],Axle manufacturer [-],Axle model [-],Axle gear ratio [-],Auxiliary technology STP [-],Auxiliary technology FAN [-],Auxiliary technology AC [-],Auxiliary technology PS [-],Auxiliary technology ES [-],Auxiliary technology cycle [-],Cargo Volume [m³],time [s],distance [km],speed [km/h],altitudeDelta [m],FC-Map [g/h],FC-Map [g/km],FC-AUXc [g/h],FC-AUXc [g/km],FC-WHTCc [g/h],FC-WHTCc [g/km],FC-AAUX [g/h],FC-AAUX [g/km],FC-Final [g/h],FC-Final [g/km],FC-Final [l/100km],FC-Final [l/100tkm],FC-Final [l/100m³km],CO2 [g/km],CO2 [g/tkm],CO2 [g/m³km],P_wheel_in_pos [kW],P_fcmap_pos [kW],E_fcmap_pos [kWh],E_fcmap_neg [kWh],E_powertrain_inertia [kWh],E_aux_CYCLE [kWh],E_aux_sum [kWh],E_clutch_loss [kWh],E_tc_loss [kWh],E_shift_loss [kWh],E_gbx_loss [kWh],E_ret_loss [kWh],E_angle_loss [kWh],E_axl_loss [kWh],E_brake [kWh],E_vehi_inertia [kWh],E_air [kWh],E_roll [kWh],E_grad [kWh],a [m/s^2],a_pos [m/s^2],a_neg [m/s^2],AccelerationTimeShare [%],DecelerationTimeShare [%],CruiseTimeShare [%],max. speed [km/h],max. acc [m/s²],max. dec [m/s²],n_eng_avg [rpm],n_eng_max [rpm],gear shifts [-],StopTimeShare [%],Engine max. Load time share [%],CoastingTimeShare [%],BrakingTImeShare [%],Gear 0 TimeShare [%],Gear 1 TimeShare [%],Gear 2 TimeShare [%],Gear 3 TimeShare [%],Gear 4 TimeShare [%],Gear 5 TimeShare [%],Gear 6 TimeShare [%]
+26-0,Pwheel_ultimate,RD__1_Pwheel_AuxStd.vdri,Success,N/A,,N.A.,0,12000.0000,0.0000,12000.0000,N/A,OM906 175 kW,Diesel CI,0.0000,600.0000,0.0000,6374.0000,1,1,1,0,1,1,4.1500,0.0061139563906202,0.0061139563906202,0.4210,1,1,0,N/A,"G 85-6/6,7-0,73",MT,6.6960,0.7280,n.a.,n.a.,n.a.,n.a.,None,n.a.,n.a.,n.a.,N/A,"G 85-6/6,7-0,73",4.3000,,,,,,,,1566.4000,,,,10007.5012,,10007.5012,,10007.5012,,10007.5012,,10007.5012,,,,,,,,41.2262,47.3199,20.5894,0.9852,-0.0004,1.5039,1.5039,0.0000,0.0000,0.0000,0.6826,0.0000,0.0000,1.0764,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,1394.1646,2421.2271,52.0000,100.0000,7.1757,0.0000,0.0000,0.2809,0.7150,8.7334,3.4729,10.2145,12.1297,64.4535
diff --git a/VectoCore/VectoCoreTest/TestData/Results/EngineOnlyCycles/24t Coach EngineOnly.vsum b/VectoCore/VectoCoreTest/TestData/Results/EngineOnlyCycles/24t Coach EngineOnly.vsum
index a601208566034a35c0d696026ba0cbe54ab42b3e..060ab24744a998787fe04ebfc0a624b4b9932ba1 100644
--- a/VectoCore/VectoCoreTest/TestData/Results/EngineOnlyCycles/24t Coach EngineOnly.vsum	
+++ b/VectoCore/VectoCoreTest/TestData/Results/EngineOnlyCycles/24t Coach EngineOnly.vsum	
@@ -1,4 +1,5 @@
-Job [-],Input File [-],Cycle [-],Status,Vehicle manufacturer [-],VIN number,Vehicle model [-],HDV CO2 vehicle class [-],Chassis curb mass [kg],Loading [kg],Total vehicle mass [kg],Engine manufacturer [-],Engine model [-],Engine fuel type [-],Engine rated power [kW],Engine idling speed [rpm],Engine rated speed [rpm],Engine displacement [ccm],Engine WHTCUrban,Engine WHTCRural,Engine WHTCMotorway,Engine BFColdHot,Engine CFRegPer,Engine actual CF,CdxA [m²],total RRC [-],weighted RRC w/o trailer [-],r_dyn [m],Gearbox manufacturer [-],Gearbox model [-],Gearbox type [-],Gear ratio first gear [-],Gear ratio last gear [-],Torque converter manufacturer [-],Torque converter model [-],Retarder manufacturer [-],Retarder model [-],Retarder type [-],Angledrive manufacturer [-],Angledrive model [-],Angledrive ratio [-],Axle manufacturer [-],Axle model [-],Axle gear ratio [-],Auxiliary technology STP [-],Auxiliary technology FAN [-],Auxiliary technology AC [-],Auxiliary technology PS [-],Auxiliary technology ES [-],Cargo Volume [m³],time [s],distance [km],speed [km/h],altitudeDelta [m],FC-Map [g/h],FC-Map [g/km],FC-AUXc [g/h],FC-AUXc [g/km],FC-WHTCc [g/h],FC-WHTCc [g/km],FC-AAUX [g/h],FC-AAUX [g/km],FC-Final [g/h],FC-Final [g/km],FC-Final [l/100km],FC-Final [l/100tkm],FC-Final [l/100m³km],CO2 [g/km],CO2 [g/tkm],CO2 [g/m³km],P_wheel_in_pos [kW],P_fcmap_pos [kW],E_fcmap_pos [kWh],E_fcmap_neg [kWh],E_powertrain_inertia [kWh],E_aux_cycle [kWh],E_aux_sum [kWh],E_clutch_loss [kWh],E_tc_loss [kWh],E_shift_loss [kWh],E_gbx_loss [kWh],E_ret_loss [kWh],E_angle_loss [kWh],E_axl_loss [kWh],E_brake [kWh],E_vehi_inertia [kWh],E_air [kWh],E_roll [kWh],E_grad [kWh],a [m/s^2],a_pos [m/s^2],a_neg [m/s^2],AccelerationTimeShare [%],DecelerationTimeShare [%],CruiseTimeShare [%],StopTimeShare [%],max. speed [km/h,max. acc [m/s²],max. dec [m/s²],n_eng_avg [rpm],n_eng_max [rpm],gear shifts [-],Engine max. Load time share [%],CoastingTimeShare [%],BrakingTImeShare [%]
-4-0,24t Coach EngineOnly,Engine Only1.vdri,Success,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,695.0000,,,,8102.2063,,8102.2063,,8102.2063,,8102.2063,,8102.2063,,,,,,,,0.0000,29.7166,5.7370,0.3730,0.0194,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,100.0000,0.0000,0.0000,0.0000,1304.7092,2453.5890,,0.0000,0.0000,0.0000
-4-1,24t Coach EngineOnly,Engine Only2.vdri,Success,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1006.0000,,,,8427.7489,,8427.7489,,8427.7489,,8427.7489,,8427.7489,,,,,,,,0.0000,30.5705,8.5428,0.5740,0.0161,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,100.0000,0.0000,0.0000,0.0000,1367.6228,2453.5890,,0.0000,0.0000,0.0000
-4-2,24t Coach EngineOnly,Engine Only3.vdri,Success,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,166.0000,,,,6526.0629,,6526.0629,,6526.0629,,6526.0629,,6526.0629,,,,,,,,0.0000,21.5508,0.9937,0.1371,0.0060,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,100.0000,0.0000,0.0000,0.0000,1210.3733,2453.5890,,0.0000,0.0000,0.0000
+# VECTO 3.1.2.810 - 05.07.2017 13:33
+Job [-],Input File [-],Cycle [-],Status,Vehicle manufacturer [-],VIN number,Vehicle model [-],HDV CO2 vehicle class [-],Corrected Actual Curb Mass [kg],Loading [kg],Total vehicle mass [kg],Engine manufacturer [-],Engine model [-],Engine fuel type [-],Engine rated power [kW],Engine idling speed [rpm],Engine rated speed [rpm],Engine displacement [ccm],Engine WHTCUrban,Engine WHTCRural,Engine WHTCMotorway,Engine BFColdHot,Engine CFRegPer,Engine actual CF,CdxA [m²],total RRC [-],weighted RRC w/o trailer [-],r_dyn [m],Number axles vehicle driven [-],Number axles vehicle non-driven [-],Number axles trailer [-],Gearbox manufacturer [-],Gearbox model [-],Gearbox type [-],Gear ratio first gear [-],Gear ratio last gear [-],Torque converter manufacturer [-],Torque converter model [-],Retarder manufacturer [-],Retarder model [-],Retarder type [-],Angledrive manufacturer [-],Angledrive model [-],Angledrive ratio [-],Axle manufacturer [-],Axle model [-],Axle gear ratio [-],Auxiliary technology STP [-],Auxiliary technology FAN [-],Auxiliary technology AC [-],Auxiliary technology PS [-],Auxiliary technology ES [-],Cargo Volume [m³],time [s],distance [km],speed [km/h],altitudeDelta [m],FC-Map [g/h],FC-Map [g/km],FC-AUXc [g/h],FC-AUXc [g/km],FC-WHTCc [g/h],FC-WHTCc [g/km],FC-AAUX [g/h],FC-AAUX [g/km],FC-Final [g/h],FC-Final [g/km],FC-Final [l/100km],FC-Final [l/100tkm],FC-Final [l/100m³km],CO2 [g/km],CO2 [g/tkm],CO2 [g/m³km],P_wheel_in_pos [kW],P_fcmap_pos [kW],E_fcmap_pos [kWh],E_fcmap_neg [kWh],E_powertrain_inertia [kWh],E_aux_cycle [kWh],E_aux_sum [kWh],E_clutch_loss [kWh],E_tc_loss [kWh],E_shift_loss [kWh],E_gbx_loss [kWh],E_ret_loss [kWh],E_angle_loss [kWh],E_axl_loss [kWh],E_brake [kWh],E_vehi_inertia [kWh],E_air [kWh],E_roll [kWh],E_grad [kWh],a [m/s^2],a_pos [m/s^2],a_neg [m/s^2],AccelerationTimeShare [%],DecelerationTimeShare [%],CruiseTimeShare [%],max. speed [km/h],max. acc [m/s²],max. dec [m/s²],n_eng_avg [rpm],n_eng_max [rpm],gear shifts [-],StopTimeShare [%],Engine max. Load time share [%],CoastingTimeShare [%],BrakingTImeShare [%]
+1-0,24t Coach EngineOnly,Engine Only1.vdri,Success,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,695.0000,,,,8102.2063,,8102.2063,,8102.2063,,8102.2063,,8102.2063,,,,,,,,0.0000,29.7166,5.7370,0.3730,0.0194,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,1304.7092,2453.5890,,100.0000,0.0000,0.0000,0.0000
+1-1,24t Coach EngineOnly,Engine Only2.vdri,Success,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1006.0000,,,,8427.7489,,8427.7489,,8427.7489,,8427.7489,,8427.7489,,,,,,,,0.0000,30.5705,8.5428,0.5740,0.0161,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,1367.6228,2453.5890,,100.0000,0.0000,0.0000,0.0000
+1-2,24t Coach EngineOnly,Engine Only3.vdri,Success,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,166.0000,,,,6526.0629,,6526.0629,,6526.0629,,6526.0629,,6526.0629,,,,,,,,0.0000,21.5508,0.9937,0.1371,0.0060,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,1210.3733,2453.5890,,100.0000,0.0000,0.0000,0.0000
diff --git a/VectoCore/VectoCoreTest/TestData/Results/EngineOnlyCycles/AuxWriteModFileSumFile.vsum b/VectoCore/VectoCoreTest/TestData/Results/EngineOnlyCycles/AuxWriteModFileSumFile.vsum
index 9a85ef3a85e29235dbde772effb23c3c37ace0c4..ccb7f6c39412915ecee1ee15f4980a26c4b5875d 100644
--- a/VectoCore/VectoCoreTest/TestData/Results/EngineOnlyCycles/AuxWriteModFileSumFile.vsum
+++ b/VectoCore/VectoCoreTest/TestData/Results/EngineOnlyCycles/AuxWriteModFileSumFile.vsum
@@ -1,2 +1,3 @@
-Job [-],Input File [-],Cycle [-],Status,Vehicle manufacturer [-],VIN number,Vehicle model [-],HDV CO2 vehicle class [-],Chassis curb mass [kg],Loading [kg],Total vehicle mass [kg],Engine manufacturer [-],Engine model [-],Engine fuel type [-],Engine rated power [kW],Engine idling speed [rpm],Engine rated speed [rpm],Engine displacement [ccm],Engine WHTCUrban,Engine WHTCRural,Engine WHTCMotorway,Engine BFColdHot,Engine CFRegPer,Engine actual CF,CdxA [m²],total RRC [-],weighted RRC w/o trailer [-],r_dyn [m],Gearbox manufacturer [-],Gearbox model [-],Gearbox type [-],Gear ratio first gear [-],Gear ratio last gear [-],Torque converter manufacturer [-],Torque converter model [-],Retarder manufacturer [-],Retarder model [-],Retarder type [-],Angledrive manufacturer [-],Angledrive model [-],Angledrive ratio [-],Axle manufacturer [-],Axle model [-],Axle gear ratio [-],Auxiliary technology STP [-],Auxiliary technology FAN [-],Auxiliary technology AC [-],Auxiliary technology PS [-],Auxiliary technology ES [-],Cargo Volume [m³],time [s],distance [km],speed [km/h],altitudeDelta [m],FC-Map [g/h],FC-Map [g/km],FC-AUXc [g/h],FC-AUXc [g/km],FC-WHTCc [g/h],FC-WHTCc [g/km],FC-AAUX [g/h],FC-AAUX [g/km],FC-Final [g/h],FC-Final [g/km],FC-Final [l/100km],FC-Final [l/100tkm],FC-Final [l/100m³km],CO2 [g/km],CO2 [g/tkm],CO2 [g/m³km],P_wheel_in_pos [kW],P_fcmap_pos [kW],E_fcmap_pos [kWh],E_fcmap_neg [kWh],E_powertrain_inertia [kWh],E_aux_FAN [kWh],E_aux_PS [kWh],E_aux_STP [kWh],E_aux_ES [kWh],E_aux_AC [kWh],E_aux_sum [kWh],E_clutch_loss [kWh],E_tc_loss [kWh],E_shift_loss [kWh],E_gbx_loss [kWh],E_ret_loss [kWh],E_angle_loss [kWh],E_axl_loss [kWh],E_brake [kWh],E_vehi_inertia [kWh],E_air [kWh],E_roll [kWh],E_grad [kWh],a [m/s^2],a_pos [m/s^2],a_neg [m/s^2],AccelerationTimeShare [%],DecelerationTimeShare [%],CruiseTimeShare [%],StopTimeShare [%],max. speed [km/h,max. acc [m/s²],max. dec [m/s²],n_eng_avg [rpm],n_eng_max [rpm],gear shifts [-],Engine max. Load time share [%],CoastingTimeShare [%],BrakingTImeShare [%]
-AuxWriteSumFile,MockJob,MockCycle.vdri,Pending,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,11.0000,0.0000,0.0000,0.0000,0.0000,,0.0000,,0.0000,,0.0000,,0.0000,,,,,,,,0.0000,0.0000,0.0000,0.0000,0.0000,0.0037,0.0049,0.0017,0.0052,0.0011,0.0165,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,100.0000,0.0000,0.0000,0.0000,0.0000,0.0000,,100.0000,0.0000,0.0000
+# VECTO 3.1.2.810 - 05.07.2017 13:27
+Job [-],Input File [-],Cycle [-],Status,Vehicle manufacturer [-],VIN number,Vehicle model [-],HDV CO2 vehicle class [-],Corrected Actual Curb Mass [kg],Loading [kg],Total vehicle mass [kg],Engine manufacturer [-],Engine model [-],Engine fuel type [-],Engine rated power [kW],Engine idling speed [rpm],Engine rated speed [rpm],Engine displacement [ccm],Engine WHTCUrban,Engine WHTCRural,Engine WHTCMotorway,Engine BFColdHot,Engine CFRegPer,Engine actual CF,CdxA [m²],total RRC [-],weighted RRC w/o trailer [-],r_dyn [m],Number axles vehicle driven [-],Number axles vehicle non-driven [-],Number axles trailer [-],Gearbox manufacturer [-],Gearbox model [-],Gearbox type [-],Gear ratio first gear [-],Gear ratio last gear [-],Torque converter manufacturer [-],Torque converter model [-],Retarder manufacturer [-],Retarder model [-],Retarder type [-],Angledrive manufacturer [-],Angledrive model [-],Angledrive ratio [-],Axle manufacturer [-],Axle model [-],Axle gear ratio [-],Auxiliary technology STP [-],Auxiliary technology FAN [-],Auxiliary technology AC [-],Auxiliary technology PS [-],Auxiliary technology ES [-],Cargo Volume [m³],time [s],distance [km],speed [km/h],altitudeDelta [m],FC-Map [g/h],FC-Map [g/km],FC-AUXc [g/h],FC-AUXc [g/km],FC-WHTCc [g/h],FC-WHTCc [g/km],FC-AAUX [g/h],FC-AAUX [g/km],FC-Final [g/h],FC-Final [g/km],FC-Final [l/100km],FC-Final [l/100tkm],FC-Final [l/100m³km],CO2 [g/km],CO2 [g/tkm],CO2 [g/m³km],P_wheel_in_pos [kW],P_fcmap_pos [kW],E_fcmap_pos [kWh],E_fcmap_neg [kWh],E_powertrain_inertia [kWh],E_aux_FAN [kWh],E_aux_PS [kWh],E_aux_STP [kWh],E_aux_ES [kWh],E_aux_AC [kWh],E_aux_sum [kWh],E_clutch_loss [kWh],E_tc_loss [kWh],E_shift_loss [kWh],E_gbx_loss [kWh],E_ret_loss [kWh],E_angle_loss [kWh],E_axl_loss [kWh],E_brake [kWh],E_vehi_inertia [kWh],E_air [kWh],E_roll [kWh],E_grad [kWh],a [m/s^2],a_pos [m/s^2],a_neg [m/s^2],AccelerationTimeShare [%],DecelerationTimeShare [%],CruiseTimeShare [%],max. speed [km/h],max. acc [m/s²],max. dec [m/s²],n_eng_avg [rpm],n_eng_max [rpm],gear shifts [-],StopTimeShare [%],Engine max. Load time share [%],CoastingTimeShare [%],BrakingTImeShare [%]
+0-0,MockJob,MockCycle.vdri,Pending,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,11.0000,0.0000,0.0000,0.0000,0.0000,,0.0000,,0.0000,,0.0000,,0.0000,,,,,,,,0.0000,0.0000,0.0000,0.0000,0.0000,0.0037,0.0049,0.0017,0.0052,0.0011,0.0165,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,0.0000,,100.0000,100.0000,0.0000,0.0000
diff --git a/VectoCore/VectoCoreTest/TestData/Results/Integration/job.vsum b/VectoCore/VectoCoreTest/TestData/Results/Integration/job.vsum
index 9c5bc61c4efc159d53803a834cdf5d268f19c1b3..ec42c9049485a58e24a0f668327c07de39daa950 100644
--- a/VectoCore/VectoCoreTest/TestData/Results/Integration/job.vsum
+++ b/VectoCore/VectoCoreTest/TestData/Results/Integration/job.vsum
@@ -1,2 +1,3 @@
-Job [-],Input File [-],Cycle [-],Status,Vehicle manufacturer [-],VIN number,Vehicle model [-],HDV CO2 vehicle class [-],Chassis curb mass [kg],Loading [kg],Total vehicle mass [kg],Engine manufacturer [-],Engine model [-],Engine fuel type [-],Engine rated power [kW],Engine idling speed [rpm],Engine rated speed [rpm],Engine displacement [ccm],Engine WHTCUrban,Engine WHTCRural,Engine WHTCMotorway,Engine BFColdHot,Engine CFRegPer,Engine actual CF,CdxA [m²],total RRC [-],weighted RRC w/o trailer [-],r_dyn [m],Gearbox manufacturer [-],Gearbox model [-],Gearbox type [-],Gear ratio first gear [-],Gear ratio last gear [-],Torque converter manufacturer [-],Torque converter model [-],Retarder manufacturer [-],Retarder model [-],Retarder type [-],Angledrive manufacturer [-],Angledrive model [-],Angledrive ratio [-],Axle manufacturer [-],Axle model [-],Axle gear ratio [-],Auxiliary technology STP [-],Auxiliary technology FAN [-],Auxiliary technology AC [-],Auxiliary technology PS [-],Auxiliary technology ES [-],Auxiliary technology cycle [-],Cargo Volume [m³],time [s],distance [km],speed [km/h],altitudeDelta [m],FC-Map [g/h],FC-Map [g/km],FC-AUXc [g/h],FC-AUXc [g/km],FC-WHTCc [g/h],FC-WHTCc [g/km],FC-AAUX [g/h],FC-AAUX [g/km],FC-Final [g/h],FC-Final [g/km],FC-Final [l/100km],FC-Final [l/100tkm],FC-Final [l/100m³km],CO2 [g/km],CO2 [g/tkm],CO2 [g/m³km],P_wheel_in_pos [kW],P_fcmap_pos [kW],E_fcmap_pos [kWh],E_fcmap_neg [kWh],E_powertrain_inertia [kWh],E_aux_CYCLE [kWh],E_aux_sum [kWh],E_clutch_loss [kWh],E_tc_loss [kWh],E_shift_loss [kWh],E_gbx_loss [kWh],E_ret_loss [kWh],E_angle_loss [kWh],E_axl_loss [kWh],E_brake [kWh],E_vehi_inertia [kWh],E_air [kWh],E_roll [kWh],E_grad [kWh],a [m/s^2],a_pos [m/s^2],a_neg [m/s^2],AccelerationTimeShare [%],DecelerationTimeShare [%],CruiseTimeShare [%],StopTimeShare [%],max. speed [km/h,max. acc [m/s²],max. dec [m/s²],n_eng_avg [rpm],n_eng_max [rpm],gear shifts [-],Engine max. Load time share [%],CoastingTimeShare [%],BrakingTImeShare [%],Gear 0 TimeShare [%],Gear 1 TimeShare [%],Gear 2 TimeShare [%],Gear 3 TimeShare [%],Gear 4 TimeShare [%],Gear 5 TimeShare [%],Gear 6 TimeShare [%],Gear 7 TimeShare [%],Gear 8 TimeShare [%]
-17-0,job,1-Gear-Test-dist.vdri,Success,N/A,,N.A.,0,15700.0000,3300.0000,19000.0000,N/A,Generic 24t Coach,Diesel CI,0.0000,560.0000,0.0000,12730.0000,1,1,1,0,1,1,3.2634,0.00640424928879442,0.00640424928879442,0.5200,N/A,Generic 24t Coach,AMT,6.3800,0.7600,n.a.,n.a.,N/A,N.A.,Secondary Retarder,N/A,N.A.,3.5,N/A,Generic 24t Coach,3.2404,,,,,,,,4117.5211,16.8120,14.6989,-43.9640,3744.2802,254.7313,3744.2802,254.7313,3744.2802,254.7313,3744.2802,254.7313,3744.2802,254.7313,30.6167,9.2778,,804.9509,243.9245,,9.0652,14.2586,16.3084,2.2015,0.0027,0.0000,0.0000,0.0082,0.0000,0.0000,1.0036,1.2154,4.8399,1.4517,1.9666,0.0835,0.2358,5.5710,-2.2714,0.0013,1.0278,-0.4017,0.2058,0.1818,99.5638,0.0486,20.0000,1.3773,0.6427,715.8760,1661.7867,11.0000,0.0227,0.0000,0.0322,0.2225,0.0000,0.0000,0.0000,0.0000,0.1012,0.2393,47.8636,51.5734
+# VECTO 3.1.2.810 - 05.07.2017 13:10
+Job [-],Input File [-],Cycle [-],Status,Vehicle manufacturer [-],VIN number,Vehicle model [-],HDV CO2 vehicle class [-],Corrected Actual Curb Mass [kg],Loading [kg],Total vehicle mass [kg],Engine manufacturer [-],Engine model [-],Engine fuel type [-],Engine rated power [kW],Engine idling speed [rpm],Engine rated speed [rpm],Engine displacement [ccm],Engine WHTCUrban,Engine WHTCRural,Engine WHTCMotorway,Engine BFColdHot,Engine CFRegPer,Engine actual CF,CdxA [m²],total RRC [-],weighted RRC w/o trailer [-],r_dyn [m],Number axles vehicle driven [-],Number axles vehicle non-driven [-],Number axles trailer [-],Gearbox manufacturer [-],Gearbox model [-],Gearbox type [-],Gear ratio first gear [-],Gear ratio last gear [-],Torque converter manufacturer [-],Torque converter model [-],Retarder manufacturer [-],Retarder model [-],Retarder type [-],Angledrive manufacturer [-],Angledrive model [-],Angledrive ratio [-],Axle manufacturer [-],Axle model [-],Axle gear ratio [-],Auxiliary technology STP [-],Auxiliary technology FAN [-],Auxiliary technology AC [-],Auxiliary technology PS [-],Auxiliary technology ES [-],Auxiliary technology cycle [-],Cargo Volume [m³],time [s],distance [km],speed [km/h],altitudeDelta [m],FC-Map [g/h],FC-Map [g/km],FC-AUXc [g/h],FC-AUXc [g/km],FC-WHTCc [g/h],FC-WHTCc [g/km],FC-AAUX [g/h],FC-AAUX [g/km],FC-Final [g/h],FC-Final [g/km],FC-Final [l/100km],FC-Final [l/100tkm],FC-Final [l/100m³km],CO2 [g/km],CO2 [g/tkm],CO2 [g/m³km],P_wheel_in_pos [kW],P_fcmap_pos [kW],E_fcmap_pos [kWh],E_fcmap_neg [kWh],E_powertrain_inertia [kWh],E_aux_CYCLE [kWh],E_aux_sum [kWh],E_clutch_loss [kWh],E_tc_loss [kWh],E_shift_loss [kWh],E_gbx_loss [kWh],E_ret_loss [kWh],E_angle_loss [kWh],E_axl_loss [kWh],E_brake [kWh],E_vehi_inertia [kWh],E_air [kWh],E_roll [kWh],E_grad [kWh],a [m/s^2],a_pos [m/s^2],a_neg [m/s^2],AccelerationTimeShare [%],DecelerationTimeShare [%],CruiseTimeShare [%],max. speed [km/h],max. acc [m/s²],max. dec [m/s²],n_eng_avg [rpm],n_eng_max [rpm],gear shifts [-],StopTimeShare [%],Engine max. Load time share [%],CoastingTimeShare [%],BrakingTImeShare [%],Gear 0 TimeShare [%],Gear 1 TimeShare [%],Gear 2 TimeShare [%],Gear 3 TimeShare [%],Gear 4 TimeShare [%],Gear 5 TimeShare [%],Gear 6 TimeShare [%],Gear 7 TimeShare [%],Gear 8 TimeShare [%]
+32-0,job,1-Gear-Test-dist.vdri,Success,N/A,,N.A.,0,15700.0000,3300.0000,19000.0000,N/A,Generic 24t Coach,Diesel CI,0.0000,560.0000,0.0000,12730.0000,1,1,1,0,1,1,3.2634,0.00640424928879442,0.00640424928879442,0.5200,1,2,0,N/A,Generic 24t Coach,AMT,6.3800,0.7600,n.a.,n.a.,N/A,N.A.,Secondary Retarder,N/A,N.A.,3.5,N/A,Generic 24t Coach,3.2404,,,,,,,,4117.5211,16.8120,14.6989,-43.9640,3744.2802,254.7313,3744.2802,254.7313,3744.2802,254.7313,3744.2802,254.7313,3744.2802,254.7313,30.4702,9.2334,,797.3089,241.6088,,9.0652,14.2586,16.3084,2.2015,0.0027,0.0000,0.0000,0.0082,0.0000,0.0000,1.0036,1.2154,4.8399,1.4517,1.9666,0.0835,0.2358,5.5710,-2.2714,0.0013,1.0278,-0.4017,0.2058,0.1818,99.5638,20.0000,1.3773,0.6427,715.8760,1661.7867,11.0000,0.0486,0.0227,0.0000,0.0322,0.2225,0.0000,0.0000,0.0000,0.0000,0.1012,0.2393,47.8636,51.5734
diff --git a/VectoCore/VectoCoreTest/VectoCoreTest.csproj b/VectoCore/VectoCoreTest/VectoCoreTest.csproj
index fcf0b2932db38f99aa99b37f27fa1852fb44d309..9d5741aa3cfee88d1b0fa57d535c768f5c0d8c17 100644
--- a/VectoCore/VectoCoreTest/VectoCoreTest.csproj
+++ b/VectoCore/VectoCoreTest/VectoCoreTest.csproj
@@ -36,10 +36,6 @@
     <WarningLevel>4</WarningLevel>
   </PropertyGroup>
   <ItemGroup>
-    <Reference Include="itextsharp, Version=5.5.7.0, Culture=neutral, PublicKeyToken=8354ae6d2174ddca, processorArchitecture=MSIL">
-      <SpecificVersion>False</SpecificVersion>
-      <HintPath>..\..\packages\iTextSharp.5.5.9\lib\itextsharp.dll</HintPath>
-    </Reference>
     <Reference Include="Microsoft.CSharp" />
     <Reference Include="Newtonsoft.Json, Version=8.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
       <SpecificVersion>False</SpecificVersion>
diff --git a/VectoCore/VectoCoreTest/XML/XMLDeclarationInputTest.cs b/VectoCore/VectoCoreTest/XML/XMLDeclarationInputTest.cs
index 25f0dc1d1985a3d49bc1c3f4a22d3cabc1b9eca9..ddd426858d7126ca1e641666b4e51043b656dc06 100644
--- a/VectoCore/VectoCoreTest/XML/XMLDeclarationInputTest.cs
+++ b/VectoCore/VectoCoreTest/XML/XMLDeclarationInputTest.cs
@@ -29,778 +29,778 @@
 *   Martin Rexeis, rexeis@ivt.tugraz.at, IVT, Graz University of Technology
 */
 
-using System.Collections.Generic;
-using System.IO;
-using System.Linq;
-using System.Windows.Forms;
-using System.Xml;
-using System.Xml.Linq;
-using Microsoft.VisualStudio.TestTools.UnitTesting;
-using TUGraz.VectoCommon.Exceptions;
-using TUGraz.VectoCommon.Models;
-using TUGraz.VectoCommon.Resources;
-using TUGraz.VectoCommon.Utils;
-using TUGraz.VectoCore.Configuration;
-using TUGraz.VectoCore.InputData.FileIO.XML.Declaration;
-using TUGraz.VectoCore.InputData.Reader;
-using TUGraz.VectoCore.InputData.Reader.ComponentData;
-using TUGraz.VectoCore.Models.Declaration;
-using TUGraz.VectoCore.Models.Simulation.Impl;
-using TUGraz.VectoCore.Models.SimulationComponent.Data.Engine;
-using TUGraz.VectoCore.OutputData;
-using TUGraz.VectoCore.OutputData.FileIO;
-using TUGraz.VectoCore.Tests.Utils;
-using TUGraz.VectoCore.Utils;
-
-namespace TUGraz.VectoCore.Tests.XML
-{
-	[TestClass]
-	public class XMLDeclarationInputTest
-	{
-		const string SampleVehicleDecl = "TestData/XML/XMLReaderDeclaration/vecto_vehicle-sample.xml";
-		const string SampleVehicleFullDecl = "TestData/XML/XMLReaderDeclaration/vecto_vehicle-sample_FULL.xml";
-
-		[TestMethod]
-		public void TestXMLInputEng()
-		{
-			var reader = XmlReader.Create(SampleVehicleDecl);
-
-			var inputDataProvider = new XMLDeclarationInputDataProvider(reader, true);
-
-			var engineDataProvider = inputDataProvider.EngineInputData;
-
-			Assert.IsTrue(engineDataProvider.SavedInDeclarationMode);
-
-			Assert.AreEqual("Generic 40t Long Haul Truck Engine", engineDataProvider.Model);
-			Assert.AreEqual(0.012730, engineDataProvider.Displacement.Value());
-			Assert.AreEqual(1.0097, engineDataProvider.WHTCUrban);
-			//AssertHelper.Exception<VectoException>(() => { var tmp = engineDataProvider.Inertia; });
-
-			var fcMapTable = engineDataProvider.FuelConsumptionMap;
-			Assert.AreEqual(112, fcMapTable.Rows.Count);
-			Assert.AreEqual("engine speed", fcMapTable.Columns[0].Caption);
-			Assert.AreEqual("torque", fcMapTable.Columns[1].Caption);
-			Assert.AreEqual("fuel consumption", fcMapTable.Columns[2].Caption);
-
-			Assert.AreEqual("560.00", fcMapTable.Rows[0][0]);
-			var fcMap = FuelConsumptionMapReader.Create(fcMapTable);
-			Assert.AreEqual(1256.SI().Gramm.Per.Hour.ConvertTo().Kilo.Gramm.Per.Second.Value(),
-				fcMap.GetFuelConsumption(0.SI<NewtonMeter>(), 560.RPMtoRad()).Value.Value());
-
-			var fldTable = engineDataProvider.FullLoadCurve;
-			Assert.AreEqual(10, fldTable.Rows.Count);
-			Assert.AreEqual("engine speed", fldTable.Columns[0].Caption);
-			Assert.AreEqual("full load torque", fldTable.Columns[1].Caption);
-			Assert.AreEqual("motoring torque", fldTable.Columns[2].Caption);
-			var fldMap = FullLoadCurveReader.Create(fldTable, true);
-		}
-
-		[TestMethod]
-		public void TestXMLInputGbx()
-		{
-			var reader = XmlReader.Create(SampleVehicleDecl);
-
-			var inputDataProvider = new XMLDeclarationInputDataProvider(reader, true);
-			var gearboxDataProvider = inputDataProvider.GearboxInputData;
-
-			Assert.AreEqual("Generic 40t Long Haul Truck Gearbox", gearboxDataProvider.Model);
-			Assert.AreEqual(GearboxType.AMT, gearboxDataProvider.Type);
-			var gears = gearboxDataProvider.Gears;
-			Assert.AreEqual(12, gears.Count);
-
-			Assert.AreEqual(1, gears.First().Gear);
-			Assert.AreEqual(14.93, gears.First().Ratio);
-			Assert.AreEqual("0.00", gears.First().LossMap.Rows[0][0]);
-			Assert.AreEqual("-350.00", gears.First().LossMap.Rows[0][1]);
-			Assert.AreEqual("12.06", gears.First().LossMap.Rows[0][2]);
-
-			var lossMap = TransmissionLossMapReader.Create(gears.First().LossMap, gears.First().Ratio,
-				gears.First().Gear.ToString());
-
-			Assert.AreEqual(5000, gears.First().MaxTorque.Value());
-		}
-
-		[TestMethod]
-		public void TestXMLInputAxlG()
-		{
-			var reader = XmlReader.Create(SampleVehicleDecl);
-
-			var inputDataProvider = new XMLDeclarationInputDataProvider(reader, true);
-			var axlegearDataProvider = inputDataProvider.AxleGearInputData;
-
-			Assert.AreEqual("Generic 40t Long Haul Truck AxleGear", axlegearDataProvider.Model);
-
-			var lossMapData = axlegearDataProvider.LossMap;
-			Assert.AreEqual(2.59, axlegearDataProvider.Ratio);
-			Assert.AreEqual("0.00", lossMapData.Rows[0][0]);
-			Assert.AreEqual("-5000.00", lossMapData.Rows[0][1]);
-			Assert.AreEqual("115.00", lossMapData.Rows[0][2]);
-
-			var lossMap = TransmissionLossMapReader.Create(lossMapData, axlegearDataProvider.Ratio, "AxleGear");
-			Assert.IsNotNull(lossMap);
-
-			AssertHelper.Exception<VectoException>(() => { var tmp = axlegearDataProvider.Efficiency; });
-		}
-
-		[TestMethod]
-		public void TestXMLInputRetarder()
-		{
-			var reader = XmlReader.Create(SampleVehicleDecl);
-
-			var inputDataProvider = new XMLDeclarationInputDataProvider(reader, true);
-			var retarderDataProvider = inputDataProvider.RetarderInputData;
-
-			Assert.AreEqual("Generic Retarder", retarderDataProvider.Model);
-
-			var lossMapData = retarderDataProvider.LossMap;
-
-			Assert.AreEqual(RetarderType.TransmissionOutputRetarder, retarderDataProvider.Type);
-
-			Assert.AreEqual("0.00", lossMapData.Rows[0][0]);
-			Assert.AreEqual("10.00", lossMapData.Rows[0][1]);
-
-			var lossMap = RetarderLossMapReader.Create(lossMapData);
-			Assert.IsNotNull(lossMap);
-		}
-
-		[TestMethod]
-		public void TestXMLInputAxleWheels()
-		{
-			var reader = XmlReader.Create(SampleVehicleDecl);
-
-			var inputDataProvider = new XMLDeclarationInputDataProvider(reader, true);
-			var vehicleDataProvider = inputDataProvider.VehicleInputData;
-
-			var axles = vehicleDataProvider.Axles;
-
-			Assert.AreEqual("315/70 R22.5", axles[0].Wheels);
-			Assert.AreEqual(0.0055, axles[0].RollResistanceCoefficient);
-			Assert.AreEqual(31300, axles[0].TyreTestLoad.Value());
-
-			Assert.AreEqual("315/70 R22.5", axles[1].Wheels);
-			Assert.AreEqual(0.0063, axles[1].RollResistanceCoefficient);
-			Assert.AreEqual(31300, axles[1].TyreTestLoad.Value());
-		}
-
-		[TestMethod]
-		public void TestXMLInputAxleWheelsDuplicates()
-		{
-			var reader = XmlReader.Create(SampleVehicleDecl);
-
-			var doc = new XmlDocument();
-			doc.Load(reader);
-			var nav = doc.CreateNavigator();
-			var manager = new XmlNamespaceManager(nav.NameTable);
-			var helper = new XPathHelper(ExecutionMode.Declaration);
-			helper.AddNamespaces(manager);
-
-			var firstAxle = nav.SelectSingleNode(helper.QueryAbs(
-				helper.NSPrefix(XMLNames.VectoInputDeclaration, Constants.XML.RootNSPrefix),
-				XMLNames.Component_Vehicle,
-				XMLNames.Vehicle_Components,
-				XMLNames.Component_AxleWheels,
-				XMLNames.ComponentDataWrapper,
-				XMLNames.AxleWheels_Axles,
-				helper.QueryConstraint(XMLNames.AxleWheels_Axles_Axle, "1", null, string.Empty)
-				), manager);
-			firstAxle.MoveToAttribute(XMLNames.AxleWheels_Axles_Axle_AxleNumber_Attr, string.Empty);
-			firstAxle.SetTypedValue(2);
-
-
-			var modified = XmlReader.Create(new StringReader(nav.OuterXml));
-
-			var inputDataProvider = new XMLDeclarationInputDataProvider(modified, true);
-			var vehicleDataProvider = inputDataProvider.VehicleInputData;
-
-			AssertHelper.Exception<VectoException>(() => { var axles = vehicleDataProvider.Axles; });
-		}
-
-		[TestMethod]
-		public void TestXMLInputAxleWheelsAxleNumTooLow()
-		{
-			var reader = XmlReader.Create(SampleVehicleDecl);
-
-			var doc = new XmlDocument();
-			doc.Load(reader);
-			var nav = doc.CreateNavigator();
-			var manager = new XmlNamespaceManager(nav.NameTable);
-			var helper = new XPathHelper(ExecutionMode.Declaration);
-			helper.AddNamespaces(manager);
-
-			var firstAxle = nav.SelectSingleNode(helper.QueryAbs(
-				helper.NSPrefix(XMLNames.VectoInputDeclaration, Constants.XML.RootNSPrefix),
-				XMLNames.Component_Vehicle,
-				XMLNames.Vehicle_Components,
-				XMLNames.Component_AxleWheels,
-				XMLNames.ComponentDataWrapper,
-				XMLNames.AxleWheels_Axles,
-				helper.QueryConstraint(XMLNames.AxleWheels_Axles_Axle, "1", null, string.Empty)
-				), manager);
-			firstAxle.MoveToAttribute(XMLNames.AxleWheels_Axles_Axle_AxleNumber_Attr, string.Empty);
-			firstAxle.SetTypedValue(0);
-
-
-			var modified = XmlReader.Create(new StringReader(nav.OuterXml));
-
-			AssertHelper.Exception<VectoException>(
-				() => { var inputDataProvider = new XMLDeclarationInputDataProvider(modified, true); });
-		}
-
-		[TestMethod]
-		public void TestXMLInputAxleWheelsAxleNumTooHigh()
-		{
-			var reader = XmlReader.Create(SampleVehicleDecl);
-
-			var doc = new XmlDocument();
-			doc.Load(reader);
-			var nav = doc.CreateNavigator();
-			var manager = new XmlNamespaceManager(nav.NameTable);
-			var helper = new XPathHelper(ExecutionMode.Declaration);
-			helper.AddNamespaces(manager);
-
-			var firstAxle = nav.SelectSingleNode(helper.QueryAbs(
-				helper.NSPrefix(XMLNames.VectoInputDeclaration, Constants.XML.RootNSPrefix),
-				XMLNames.Component_Vehicle,
-				XMLNames.Vehicle_Components,
-				XMLNames.Component_AxleWheels,
-				XMLNames.ComponentDataWrapper,
-				XMLNames.AxleWheels_Axles,
-				helper.QueryConstraint(XMLNames.AxleWheels_Axles_Axle, "1", null, string.Empty)
-				), manager);
-			firstAxle.MoveToAttribute(XMLNames.AxleWheels_Axles_Axle_AxleNumber_Attr, string.Empty);
-			firstAxle.SetTypedValue(3);
-
-
-			var modified = XmlReader.Create(new StringReader(nav.OuterXml));
-
-			var inputDataProvider = new XMLDeclarationInputDataProvider(modified, true);
-			var vehicleDataProvider = inputDataProvider.VehicleInputData;
-
-			AssertHelper.Exception<VectoException>(() => { var axles = vehicleDataProvider.Axles; });
-		}
-
-		[TestMethod]
-		public void TestXMLInputAuxiliaries()
-		{
-			var reader = XmlReader.Create(SampleVehicleDecl);
-
-			var inputDataProvider = new XMLDeclarationInputDataProvider(reader, true);
-			var auxDataProvider = inputDataProvider.AuxiliaryInputData();
-
-			var aux = auxDataProvider.Auxiliaries;
-			var aux1 = aux[0];
-
-			Assert.AreEqual(AuxiliaryType.Fan, aux1.Type);
-			Assert.AreEqual("Hydraulic driven - Constant displacement pump", aux1.Technology.First());
-
-			var aux3 = aux[2];
-			Assert.AreEqual(AuxiliaryType.ElectricSystem, aux3.Type);
-			Assert.AreEqual("Standard technology - LED headlights, all", aux3.Technology.First());
-		}
-
-		[TestMethod]
-		public void TestXMLInputADAS()
-		{
-			var reader = XmlReader.Create(SampleVehicleDecl);
-
-			var inputDataProvider = new XMLDeclarationInputDataProvider(reader, true);
-
-			var adas = inputDataProvider.DriverInputData;
-
-			Assert.AreEqual(DriverMode.Overspeed, adas.OverSpeedEcoRoll.Mode);
-		}
-
-		[TestMethod]
-		public void TestVehicleInput()
-		{
-			var reader = XmlReader.Create(SampleVehicleDecl);
-
-			var inputDataProvider = new XMLDeclarationInputDataProvider(reader, true);
-
-			var vehicleDataProvider = inputDataProvider.VehicleInputData;
-
-			Assert.AreEqual(VehicleCategory.Tractor, vehicleDataProvider.VehicleCategory);
-			Assert.AreEqual(AxleConfiguration.AxleConfig_4x2, vehicleDataProvider.AxleConfiguration);
-
-			Assert.AreEqual(7100.0, vehicleDataProvider.CurbMassChassis.Value());
-			Assert.AreEqual(40000.0, vehicleDataProvider.GrossVehicleMassRating.Value());
-			Assert.AreEqual(6.34, inputDataProvider.AirdragInputData.AirDragArea.Value());
-
-			Assert.AreEqual(1.0, inputDataProvider.RetarderInputData.Ratio);
-		}
-
-		[TestMethod]
-		public void TestXMLPowertrainGeneration()
-		{
-			var reader = XmlReader.Create(SampleVehicleDecl);
-
-			var fileWriter = new FileOutputWriter("foo");
-			var sumWriter = new FileOutputWriter("vecto_vehicle-sample_xml");
-			var sumData = new SummaryDataContainer(sumWriter);
-			var jobContainer = new JobContainer(sumData);
-			var dataProvider = new XMLDeclarationInputDataProvider(reader, true);
-
-			var runsFactory = new SimulatorFactory(ExecutionMode.Declaration, dataProvider, fileWriter);
-			runsFactory.WriteModalResults = true;
-
-			jobContainer.AddRuns(runsFactory);
-
-			Assert.AreEqual(8, jobContainer.Runs.Count);
-		}
-
-		[TestMethod]
-		public void TestFullFeaturedXMEngineering_TorqueConverter()
-		{
-			var reader = XmlReader.Create(SampleVehicleFullDecl);
-
-			var inputDataProvider = new XMLDeclarationInputDataProvider(reader, true);
-
-			var tcDataProvider = inputDataProvider.TorqueConverterInputData;
-
-
-			Assert.AreEqual(3, tcDataProvider.TCData.Rows.Count);
-			Assert.AreEqual("300.00", tcDataProvider.TCData.Rows[0][2]);
-			Assert.AreEqual("0.90", tcDataProvider.TCData.Rows[2][1]);
-		}
-
-		[TestMethod]
-		public void TestFullFeaturedXMLDeclaration_AngleDrive()
-		{
-			var reader = XmlReader.Create(SampleVehicleFullDecl);
-
-			var inputDataProvider = new XMLDeclarationInputDataProvider(reader, true);
-
-
-			var angledriveDataProvider = inputDataProvider.AngledriveInputData;
-
-			Assert.AreEqual(2.345, angledriveDataProvider.Ratio);
-			Assert.AreEqual(6, angledriveDataProvider.LossMap.Rows.Count);
-			Assert.AreEqual("-10000.00", angledriveDataProvider.LossMap.Rows[0][1]);
-
-			AssertHelper.Exception<VectoException>(() => { var tmp = angledriveDataProvider.Efficiency; });
-		}
-
-		[TestMethod]
-		public void TestVehicleInputData()
-		{
-			var reader = XmlReader.Create(SampleVehicleFullDecl);
-
-			var inputDataProvider = new XMLDeclarationInputDataProvider(reader, true);
-			var vehicleDataProvider = inputDataProvider.JobInputData().Vehicle;
-
-			Assert.AreEqual(VehicleCategory.Tractor, vehicleDataProvider.VehicleCategory);
-			Assert.AreEqual(AxleConfiguration.AxleConfig_4x2, vehicleDataProvider.AxleConfiguration);
-
-			Assert.AreEqual(7100.0, vehicleDataProvider.CurbMassChassis.Value());
-			Assert.AreEqual(40000.0, vehicleDataProvider.GrossVehicleMassRating.Value());
-			Assert.AreEqual(6.34, inputDataProvider.AirdragInputData.AirDragArea.Value());
-
-			Assert.AreEqual(1.0, inputDataProvider.RetarderInputData.Ratio);
-		}
-
-		[TestMethod]
-		public void TestFullFeaturedXMLDeclaration_TorqueLimits()
-		{
-			var reader = XmlReader.Create(SampleVehicleFullDecl);
-
-			var inputDataProvider = new XMLDeclarationInputDataProvider(reader, true);
-			var vehicleDataProvider = inputDataProvider.JobInputData().Vehicle;
-
-			var torqueLimits = vehicleDataProvider.TorqueLimits.OrderBy(x => x.Gear).ToList();
-			Assert.AreEqual(3, torqueLimits.Count);
-			Assert.AreEqual(1, torqueLimits[0].Gear);
-			Assert.AreEqual(2500, torqueLimits[0].MaxTorque.Value());
-			Assert.AreEqual(12, torqueLimits[2].Gear);
-		}
-
-		[TestMethod]
-		public void TestFullFeaturedXMLDeclaration_GbxTorqueLimits()
-		{
-			var reader = XmlReader.Create(SampleVehicleFullDecl);
-
-			var inputDataProvider = new XMLDeclarationInputDataProvider(reader, true);
-			var gearboxDataProvider = inputDataProvider.GearboxInputData;
-			var gears = gearboxDataProvider.Gears;
-
-			Assert.AreEqual(12, gears.Count);
-			Assert.AreEqual(1900, gears[0].MaxTorque.Value());
-			Assert.AreEqual(1900, gears[1].MaxTorque.Value());
-			Assert.IsNull(gears[11].MaxTorque);
-		}
-
-		[TestMethod]
-		public void TestFullFeaturedXMLDeclaration_GbxSpeedLimits()
-		{
-			var reader = XmlReader.Create(SampleVehicleFullDecl);
-
-			var inputDataProvider = new XMLDeclarationInputDataProvider(reader, true);
-			var gearboxDataProvider = inputDataProvider.GearboxInputData;
-			var gears = gearboxDataProvider.Gears;
-
-			Assert.AreEqual(12, gears.Count);
-			Assert.AreEqual(2000, gears[0].MaxInputSpeed.AsRPM, 1e-6);
-			Assert.AreEqual(2000, gears[1].MaxInputSpeed.AsRPM, 1e-6);
-			Assert.IsNull(gears[11].MaxInputSpeed);
-		}
-
-		[TestMethod]
-		public void TestElementNotAvailable()
-		{
-			var reader = XmlReader.Create(SampleVehicleDecl);
-
-			var doc = new XmlDocument();
-			doc.Load(reader);
-			var nav = doc.CreateNavigator();
-			var manager = new XmlNamespaceManager(nav.NameTable);
-			var helper = new XPathHelper(ExecutionMode.Declaration);
-			helper.AddNamespaces(manager);
-
-			var retarderRatio = nav.SelectSingleNode(helper.QueryAbs(
-				helper.NSPrefix(XMLNames.VectoInputDeclaration, Constants.XML.RootNSPrefix),
-				XMLNames.Component_Vehicle,
-				XMLNames.Vehicle_RetarderRatio), manager);
-			retarderRatio.DeleteSelf();
-
-			var modified = XmlReader.Create(new StringReader(nav.OuterXml));
-
-			var inputDataProvider = new XMLDeclarationInputDataProvider(modified, true);
-
-			AssertHelper.Exception<VectoException>(() => { var tmp = inputDataProvider.RetarderInputData.Ratio; });
-		}
-
-		[TestMethod]
-		public void TestRetarderTypeNone()
-		{
-			var reader = XmlReader.Create(SampleVehicleDecl);
-
-			var doc = new XmlDocument();
-			doc.Load(reader);
-			var nav = doc.CreateNavigator();
-			var manager = new XmlNamespaceManager(nav.NameTable);
-			var helper = new XPathHelper(ExecutionMode.Declaration);
-			helper.AddNamespaces(manager);
-
-			var retarderType = nav.SelectSingleNode(helper.QueryAbs(
-				helper.NSPrefix(XMLNames.VectoInputDeclaration, Constants.XML.RootNSPrefix),
-				XMLNames.Component_Vehicle,
-				XMLNames.Vehicle_RetarderType), manager);
-			retarderType.SetValue("None");
-
-			var retarder = nav.SelectSingleNode(helper.QueryAbs(
-				helper.NSPrefix(XMLNames.VectoInputDeclaration, Constants.XML.RootNSPrefix),
-				XMLNames.Component_Vehicle,
-				XMLNames.Vehicle_Components,
-				XMLNames.Component_Retarder), manager);
-			retarder.DeleteSelf();
-
-			var modified = XmlReader.Create(new StringReader(nav.OuterXml));
-
-			var inputDataProvider = new XMLDeclarationInputDataProvider(modified, true);
-
-			var factory = new SimulatorFactory(ExecutionMode.Declaration, inputDataProvider, new FileOutputWriter("dummy"));
-			var jobContainer = new JobContainer(null);
-			jobContainer.AddRuns(factory);
-			jobContainer.Execute();
-		}
-
-		[TestMethod]
-		public void TestRetarderTypes()
-		{
-			var retarderTypes = new Dictionary<string, RetarderType>() {
-				{ "None", RetarderType.None },
-				{ "Losses included in Gearbox", RetarderType.LossesIncludedInTransmission },
-				{ "Engine Retarder", RetarderType.EngineRetarder },
-				{ "Transmission Input Retarder", RetarderType.TransmissionInputRetarder },
-				{ "Transmission Output Retarder", RetarderType.TransmissionOutputRetarder }
-			}
-				;
-			foreach (var retarderType in retarderTypes) {
-				var reader = XmlReader.Create(SampleVehicleDecl);
-
-				var doc = new XmlDocument();
-				doc.Load(reader);
-				var nav = doc.CreateNavigator();
-				var manager = new XmlNamespaceManager(nav.NameTable);
-				var helper = new XPathHelper(ExecutionMode.Declaration);
-				helper.AddNamespaces(manager);
-
-				var xmlRetarderType = nav.SelectSingleNode(helper.QueryAbs(
-					helper.NSPrefix(XMLNames.VectoInputDeclaration, Constants.XML.RootNSPrefix),
-					XMLNames.Component_Vehicle,
-					XMLNames.Vehicle_RetarderType), manager);
-				xmlRetarderType.SetValue(retarderType.Key);
-
-				var modified = XmlReader.Create(new StringReader(nav.OuterXml));
-
-				var inputDataProvider = new XMLDeclarationInputDataProvider(modified, true);
-
-				Assert.AreEqual(retarderType.Value, inputDataProvider.RetarderInputData.Type);
-			}
-		}
-
-		[TestMethod]
-		public void TestAxleConfigurationTypes()
-		{
-			var axleConfigurations = new Dictionary<string, AxleConfiguration>() {
-				{ "4x2", AxleConfiguration.AxleConfig_4x2 },
-				//{ "4x4", AxleConfiguration.AxleConfig_4x4 },
-				{ "6x2", AxleConfiguration.AxleConfig_6x2 },
-				{ "6x4", AxleConfiguration.AxleConfig_6x4 },
-				//{ "6x6", AxleConfiguration.AxleConfig_6x6 },
-				//{ "8x2", AxleConfiguration.AxleConfig_8x2 },
-				{ "8x4", AxleConfiguration.AxleConfig_8x4 },
-				//{ "8x6", AxleConfiguration.AxleConfig_8x6 },
-				//{ "8x8", AxleConfiguration.AxleConfig_8x8 }
-			};
-			foreach (var axleConfiguration in axleConfigurations) {
-				var reader = XmlReader.Create(SampleVehicleDecl);
-
-				var doc = new XmlDocument();
-				doc.Load(reader);
-				var nav = doc.CreateNavigator();
-				var manager = new XmlNamespaceManager(nav.NameTable);
-				var helper = new XPathHelper(ExecutionMode.Declaration);
-				helper.AddNamespaces(manager);
-
-				var xmlRetarderType = nav.SelectSingleNode(helper.QueryAbs(
-					helper.NSPrefix(XMLNames.VectoInputDeclaration, Constants.XML.RootNSPrefix),
-					XMLNames.Component_Vehicle,
-					XMLNames.Vehicle_AxleConfiguration), manager);
-				xmlRetarderType.SetValue(axleConfiguration.Key);
-
-				var modified = XmlReader.Create(new StringReader(nav.OuterXml));
-
-				var inputDataProvider = new XMLDeclarationInputDataProvider(modified, true);
-
-				Assert.AreEqual(axleConfiguration.Value, inputDataProvider.VehicleInputData.AxleConfiguration);
-			}
-		}
-
-		[TestMethod]
-		public void TestVehicleCategoryTypes()
-		{
-			var vehicleCategories = new Dictionary<string, VehicleCategory>() {
-				{ "Rigid Truck", VehicleCategory.RigidTruck },
-				{ "Tractor", VehicleCategory.Tractor },
-				//{ "City Bus", VehicleCategory.CityBus },
-				//{ "Interurban Bus", VehicleCategory.InterurbanBus },
-				//{ "Coach", VehicleCategory.Coach }
-			};
-			foreach (var vehicleCategory in vehicleCategories) {
-				var reader = XmlReader.Create(SampleVehicleDecl);
-
-				var doc = new XmlDocument();
-				doc.Load(reader);
-				var nav = doc.CreateNavigator();
-				var manager = new XmlNamespaceManager(nav.NameTable);
-				var helper = new XPathHelper(ExecutionMode.Declaration);
-				helper.AddNamespaces(manager);
-
-				var xmlRetarderType = nav.SelectSingleNode(helper.QueryAbs(
-					helper.NSPrefix(XMLNames.VectoInputDeclaration, Constants.XML.RootNSPrefix),
-					XMLNames.Component_Vehicle,
-					XMLNames.Vehicle_VehicleCategory), manager);
-				xmlRetarderType.SetValue(vehicleCategory.Key);
-
-				var modified = XmlReader.Create(new StringReader(nav.OuterXml));
-
-				var inputDataProvider = new XMLDeclarationInputDataProvider(modified, true);
-
-				Assert.AreEqual(vehicleCategory.Value, inputDataProvider.VehicleInputData.VehicleCategory);
-			}
-		}
-
-
-		[TestMethod]
-		public void TestWheelsTypes()
-		{
-			var retarderTypes = new Dictionary<string, RetarderType>() { };
-			foreach (var retarderType in retarderTypes) {
-				var reader = XmlReader.Create(SampleVehicleDecl);
-
-				var doc = new XmlDocument();
-				doc.Load(reader);
-				var nav = doc.CreateNavigator();
-				var manager = new XmlNamespaceManager(nav.NameTable);
-				var helper = new XPathHelper(ExecutionMode.Declaration);
-				helper.AddNamespaces(manager);
-
-				var xmlRetarderType = nav.SelectSingleNode(helper.QueryAbs(
-					helper.NSPrefix(XMLNames.VectoInputDeclaration,
-						Constants.XML.RootNSPrefix),
-					XMLNames.Component_Vehicle,
-					XMLNames.Vehicle_RetarderType),
-					manager);
-				xmlRetarderType.SetValue(retarderType.Key);
-
-				var modified = XmlReader.Create(new StringReader(nav.OuterXml));
-
-				var inputDataProvider = new XMLDeclarationInputDataProvider(modified,
-					true);
-
-				Assert.AreEqual(retarderType.Value,
-					inputDataProvider.RetarderInputData.Type);
-			}
-		}
-
-		[TestMethod]
-		public void TestPTOTypeTypes()
-		{
-			var ptoTypes = new string[][] {
-				new[] { "none", "none" },
-				new[] { "only one engaged gearwheel above oil level", "none" },
-				new[] { "only the drive shaft of the PTO", "shift claw, synchronizer, sliding gearwheel" },
-				new[] { "only the drive shaft of the PTO", "multi-disc clutch" },
-				new[] { "only the drive shaft of the PTO", "multi-disc clutch, oil pump" },
-				new[] { "drive shaft and/or up to 2 gear wheels", "shift claw, synchronizer, sliding gearwheel" },
-				new[] { "drive shaft and/or up to 2 gear wheels", "multi-disc clutch" },
-				new[] { "drive shaft and/or up to 2 gear wheels", "multi-disc clutch, oil pump" },
-				new[] { "drive shaft and/or more than 2 gear wheels", "shift claw, synchronizer, sliding gearwheel" },
-				new[] { "drive shaft and/or more than 2 gear wheels", "multi-disc clutch" },
-				new[] { "drive shaft and/or more than 2 gear wheels", "multi-disc clutch, oil pump" },
-			};
-			foreach (var ptoType in ptoTypes) {
-				var reader = XmlReader.Create(SampleVehicleDecl);
-
-				var doc = new XmlDocument();
-				doc.Load(reader);
-				var nav = doc.CreateNavigator();
-				var manager = new XmlNamespaceManager(nav.NameTable);
-				var helper = new XPathHelper(ExecutionMode.Declaration);
-				helper.AddNamespaces(manager);
-
-				var ptoGearWheels = nav.SelectSingleNode(helper.QueryAbs(
-					helper.NSPrefix(XMLNames.VectoInputDeclaration,
-						Constants.XML.RootNSPrefix),
-					XMLNames.Component_Vehicle,
-					XMLNames.Vehicle_PTO,
-					XMLNames.Vehicle_PTO_ShaftsGearWheels),
-					manager);
-				ptoGearWheels.SetValue(ptoType[0]);
-				var ptoOther = nav.SelectSingleNode(helper.QueryAbs(
-					helper.NSPrefix(XMLNames.VectoInputDeclaration,
-						Constants.XML.RootNSPrefix),
-					XMLNames.Component_Vehicle,
-					XMLNames.Vehicle_PTO,
-					XMLNames.Vehicle_PTO_OtherElements),
-					manager);
-				ptoOther.SetValue(ptoType[1]);
-
-				var modified = XmlReader.Create(new StringReader(nav.OuterXml));
-
-				var inputDataProvider = new XMLDeclarationInputDataProvider(modified,
-					true);
-
-				if (ptoType[0] == "none") {
-					Assert.AreEqual("None",
-						inputDataProvider.PTOTransmissionInputData.PTOTransmissionType);
-				} else if (ptoType[0] == "only one engaged gearwheel above oil level") {
-					Assert.AreEqual(ptoType[0],
-						inputDataProvider.PTOTransmissionInputData.PTOTransmissionType);
-				} else {
-					Assert.AreEqual(string.Format("{0} - {1}", ptoType[0], ptoType[1]),
-						inputDataProvider.PTOTransmissionInputData.PTOTransmissionType);
-				}
-				DeclarationData.PTOTransmission.Lookup(inputDataProvider.PTOTransmissionInputData.PTOTransmissionType);
-			}
-		}
-
-		[TestMethod]
-		public void TestAngledriveTypes()
-		{
-			var angledriveTypes = new Dictionary<string, AngledriveType>() {
-				{ "None", AngledriveType.None },
-				{ "Losses included in Gearbox", AngledriveType.LossesIncludedInGearbox },
-				{ "Separate Angledrive", AngledriveType.SeparateAngledrive }
-			};
-			foreach (var angleDrive in angledriveTypes) {
-				var reader = XmlReader.Create(SampleVehicleDecl);
-
-				var doc = new XmlDocument();
-				doc.Load(reader);
-				var nav = doc.CreateNavigator();
-				var manager = new XmlNamespaceManager(nav.NameTable);
-				var helper = new XPathHelper(ExecutionMode.Declaration);
-				helper.AddNamespaces(manager);
-
-				var xmlRetarderType = nav.SelectSingleNode(helper.QueryAbs(
-					helper.NSPrefix(XMLNames.VectoInputDeclaration,
-						Constants.XML.RootNSPrefix),
-					XMLNames.Component_Vehicle,
-					XMLNames.Vehicle_AngledriveType),
-					manager);
-				xmlRetarderType.SetValue(angleDrive.Key);
-
-				var modified = XmlReader.Create(new StringReader(nav.OuterXml));
-
-				var inputDataProvider = new XMLDeclarationInputDataProvider(modified,
-					true);
-
-				Assert.AreEqual(angleDrive.Value, inputDataProvider.AngledriveInputData.Type);
-			}
-		}
-
-		[TestMethod]
-		public void TestGearboxTypes()
-		{
-			var gearboxTypes = new Dictionary<string, GearboxType>() {
-				{ "SMT", GearboxType.MT },
-				{ "AMT", GearboxType.AMT },
-				{ "APT-S", GearboxType.ATSerial },
-				{ "APT-P", GearboxType.ATPowerSplit }
-			};
-			foreach (var gearboxType in gearboxTypes) {
-				var reader = XmlReader.Create(SampleVehicleDecl);
-
-				var doc = new XmlDocument();
-				doc.Load(reader);
-				var nav = doc.CreateNavigator();
-				var manager = new XmlNamespaceManager(nav.NameTable);
-				var helper = new XPathHelper(ExecutionMode.Declaration);
-				helper.AddNamespaces(manager);
-
-				var xmlRetarderType = nav.SelectSingleNode(helper.QueryAbs(
-					helper.NSPrefix(XMLNames.VectoInputDeclaration,
-						Constants.XML.RootNSPrefix),
-					XMLNames.Component_Vehicle,
-					XMLNames.Vehicle_Components,
-					XMLNames.Component_Gearbox,
-					XMLNames.ComponentDataWrapper,
-					XMLNames.Gearbox_TransmissionType),
-					manager);
-				xmlRetarderType.SetValue(gearboxType.Key);
-
-				var modified = XmlReader.Create(new StringReader(nav.OuterXml));
-
-				var inputDataProvider = new XMLDeclarationInputDataProvider(modified,
-					true);
-
-				Assert.AreEqual(gearboxType.Value, inputDataProvider.GearboxInputData.Type);
-			}
-		}
-
-		[TestMethod]
-		public void TestPTOInputNone()
-		{
-			var reader = XmlReader.Create(SampleVehicleDecl);
-
-			var inputDataProvider = new XMLDeclarationInputDataProvider(reader, true);
-			var ptoDataProvider = inputDataProvider.PTOTransmissionInputData;
-
-			Assert.AreEqual("None", ptoDataProvider.PTOTransmissionType);
-		}
-
-		[TestMethod]
-		public void TestPTOInput()
-		{
-			var reader = XmlReader.Create(SampleVehicleFullDecl);
-
-			var inputDataProvider = new XMLDeclarationInputDataProvider(reader, true);
-			var ptoDataProvider = inputDataProvider.PTOTransmissionInputData;
-			var ptoLosses = DeclarationData.PTOTransmission.Lookup(ptoDataProvider.PTOTransmissionType);
-
-			Assert.AreEqual("only the drive shaft of the PTO - multi-disc clutch", ptoDataProvider.PTOTransmissionType);
-			Assert.AreEqual(1000, ptoLosses.Value());
-		}
-	}
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Windows.Forms;
+using System.Xml;
+using System.Xml.Linq;
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+using TUGraz.VectoCommon.Exceptions;
+using TUGraz.VectoCommon.Models;
+using TUGraz.VectoCommon.Resources;
+using TUGraz.VectoCommon.Utils;
+using TUGraz.VectoCore.Configuration;
+using TUGraz.VectoCore.InputData.FileIO.XML.Declaration;
+using TUGraz.VectoCore.InputData.Reader;
+using TUGraz.VectoCore.InputData.Reader.ComponentData;
+using TUGraz.VectoCore.Models.Declaration;
+using TUGraz.VectoCore.Models.Simulation.Impl;
+using TUGraz.VectoCore.Models.SimulationComponent.Data.Engine;
+using TUGraz.VectoCore.OutputData;
+using TUGraz.VectoCore.OutputData.FileIO;
+using TUGraz.VectoCore.Tests.Utils;
+using TUGraz.VectoCore.Utils;
+
+namespace TUGraz.VectoCore.Tests.XML
+{
+	[TestClass]
+	public class XMLDeclarationInputTest
+	{
+		const string SampleVehicleDecl = "TestData/XML/XMLReaderDeclaration/vecto_vehicle-sample.xml";
+		const string SampleVehicleFullDecl = "TestData/XML/XMLReaderDeclaration/vecto_vehicle-sample_FULL.xml";
+
+		[TestMethod]
+		public void TestXMLInputEng()
+		{
+			var reader = XmlReader.Create(SampleVehicleDecl);
+
+			var inputDataProvider = new XMLDeclarationInputDataProvider(reader, true);
+
+			var engineDataProvider = inputDataProvider.EngineInputData;
+
+			Assert.IsTrue(engineDataProvider.SavedInDeclarationMode);
+
+			Assert.AreEqual("Generic 40t Long Haul Truck Engine", engineDataProvider.Model);
+			Assert.AreEqual(0.012730, engineDataProvider.Displacement.Value());
+			Assert.AreEqual(1.0097, engineDataProvider.WHTCUrban);
+			//AssertHelper.Exception<VectoException>(() => { var tmp = engineDataProvider.Inertia; });
+
+			var fcMapTable = engineDataProvider.FuelConsumptionMap;
+			Assert.AreEqual(112, fcMapTable.Rows.Count);
+			Assert.AreEqual("engine speed", fcMapTable.Columns[0].Caption);
+			Assert.AreEqual("torque", fcMapTable.Columns[1].Caption);
+			Assert.AreEqual("fuel consumption", fcMapTable.Columns[2].Caption);
+
+			Assert.AreEqual("560.00", fcMapTable.Rows[0][0]);
+			var fcMap = FuelConsumptionMapReader.Create(fcMapTable);
+			Assert.AreEqual(1256.SI().Gramm.Per.Hour.ConvertTo().Kilo.Gramm.Per.Second.Value(),
+				fcMap.GetFuelConsumption(0.SI<NewtonMeter>(), 560.RPMtoRad()).Value.Value());
+
+			var fldTable = engineDataProvider.FullLoadCurve;
+			Assert.AreEqual(10, fldTable.Rows.Count);
+			Assert.AreEqual("engine speed", fldTable.Columns[0].Caption);
+			Assert.AreEqual("full load torque", fldTable.Columns[1].Caption);
+			Assert.AreEqual("motoring torque", fldTable.Columns[2].Caption);
+			var fldMap = FullLoadCurveReader.Create(fldTable, true);
+		}
+
+		[TestMethod]
+		public void TestXMLInputGbx()
+		{
+			var reader = XmlReader.Create(SampleVehicleDecl);
+
+			var inputDataProvider = new XMLDeclarationInputDataProvider(reader, true);
+			var gearboxDataProvider = inputDataProvider.GearboxInputData;
+
+			Assert.AreEqual("Generic 40t Long Haul Truck Gearbox", gearboxDataProvider.Model);
+			Assert.AreEqual(GearboxType.AMT, gearboxDataProvider.Type);
+			var gears = gearboxDataProvider.Gears;
+			Assert.AreEqual(12, gears.Count);
+
+			Assert.AreEqual(1, gears.First().Gear);
+			Assert.AreEqual(14.93, gears.First().Ratio);
+			Assert.AreEqual("0.00", gears.First().LossMap.Rows[0][0]);
+			Assert.AreEqual("-350.00", gears.First().LossMap.Rows[0][1]);
+			Assert.AreEqual("12.06", gears.First().LossMap.Rows[0][2]);
+
+			var lossMap = TransmissionLossMapReader.Create(gears.First().LossMap, gears.First().Ratio,
+				gears.First().Gear.ToString());
+
+			Assert.AreEqual(5000, gears.First().MaxTorque.Value());
+		}
+
+		[TestMethod]
+		public void TestXMLInputAxlG()
+		{
+			var reader = XmlReader.Create(SampleVehicleDecl);
+
+			var inputDataProvider = new XMLDeclarationInputDataProvider(reader, true);
+			var axlegearDataProvider = inputDataProvider.AxleGearInputData;
+
+			Assert.AreEqual("Generic 40t Long Haul Truck AxleGear", axlegearDataProvider.Model);
+
+			var lossMapData = axlegearDataProvider.LossMap;
+			Assert.AreEqual(2.59, axlegearDataProvider.Ratio);
+			Assert.AreEqual("0.00", lossMapData.Rows[0][0]);
+			Assert.AreEqual("-5000.00", lossMapData.Rows[0][1]);
+			Assert.AreEqual("115.00", lossMapData.Rows[0][2]);
+
+			var lossMap = TransmissionLossMapReader.Create(lossMapData, axlegearDataProvider.Ratio, "AxleGear");
+			Assert.IsNotNull(lossMap);
+
+			AssertHelper.Exception<VectoException>(() => { var tmp = axlegearDataProvider.Efficiency; });
+		}
+
+		[TestMethod]
+		public void TestXMLInputRetarder()
+		{
+			var reader = XmlReader.Create(SampleVehicleDecl);
+
+			var inputDataProvider = new XMLDeclarationInputDataProvider(reader, true);
+			var retarderDataProvider = inputDataProvider.RetarderInputData;
+
+			Assert.AreEqual("Generic Retarder", retarderDataProvider.Model);
+
+			var lossMapData = retarderDataProvider.LossMap;
+
+			Assert.AreEqual(RetarderType.TransmissionOutputRetarder, retarderDataProvider.Type);
+
+			Assert.AreEqual("0.00", lossMapData.Rows[0][0]);
+			Assert.AreEqual("10.00", lossMapData.Rows[0][1]);
+
+			var lossMap = RetarderLossMapReader.Create(lossMapData);
+			Assert.IsNotNull(lossMap);
+		}
+
+		[TestMethod]
+		public void TestXMLInputAxleWheels()
+		{
+			var reader = XmlReader.Create(SampleVehicleDecl);
+
+			var inputDataProvider = new XMLDeclarationInputDataProvider(reader, true);
+			var vehicleDataProvider = inputDataProvider.VehicleInputData;
+
+			var axles = vehicleDataProvider.Axles;
+
+			Assert.AreEqual("315/70 R22.5", axles[0].Wheels);
+			Assert.AreEqual(0.0055, axles[0].RollResistanceCoefficient);
+			Assert.AreEqual(31300, axles[0].TyreTestLoad.Value());
+
+			Assert.AreEqual("315/70 R22.5", axles[1].Wheels);
+			Assert.AreEqual(0.0063, axles[1].RollResistanceCoefficient);
+			Assert.AreEqual(31300, axles[1].TyreTestLoad.Value());
+		}
+
+		[TestMethod]
+		public void TestXMLInputAxleWheelsDuplicates()
+		{
+			var reader = XmlReader.Create(SampleVehicleDecl);
+
+			var doc = new XmlDocument();
+			doc.Load(reader);
+			var nav = doc.CreateNavigator();
+			var manager = new XmlNamespaceManager(nav.NameTable);
+			var helper = new XPathHelper(ExecutionMode.Declaration);
+			helper.AddNamespaces(manager);
+
+			var firstAxle = nav.SelectSingleNode(helper.QueryAbs(
+				helper.NSPrefix(XMLNames.VectoInputDeclaration, Constants.XML.RootNSPrefix),
+				XMLNames.Component_Vehicle,
+				XMLNames.Vehicle_Components,
+				XMLNames.Component_AxleWheels,
+				XMLNames.ComponentDataWrapper,
+				XMLNames.AxleWheels_Axles,
+				helper.QueryConstraint(XMLNames.AxleWheels_Axles_Axle, "1", null, string.Empty)
+				), manager);
+			firstAxle.MoveToAttribute(XMLNames.AxleWheels_Axles_Axle_AxleNumber_Attr, string.Empty);
+			firstAxle.SetTypedValue(2);
+
+
+			var modified = XmlReader.Create(new StringReader(nav.OuterXml));
+
+			var inputDataProvider = new XMLDeclarationInputDataProvider(modified, true);
+			var vehicleDataProvider = inputDataProvider.VehicleInputData;
+
+			AssertHelper.Exception<VectoException>(() => { var axles = vehicleDataProvider.Axles; });
+		}
+
+		[TestMethod]
+		public void TestXMLInputAxleWheelsAxleNumTooLow()
+		{
+			var reader = XmlReader.Create(SampleVehicleDecl);
+
+			var doc = new XmlDocument();
+			doc.Load(reader);
+			var nav = doc.CreateNavigator();
+			var manager = new XmlNamespaceManager(nav.NameTable);
+			var helper = new XPathHelper(ExecutionMode.Declaration);
+			helper.AddNamespaces(manager);
+
+			var firstAxle = nav.SelectSingleNode(helper.QueryAbs(
+				helper.NSPrefix(XMLNames.VectoInputDeclaration, Constants.XML.RootNSPrefix),
+				XMLNames.Component_Vehicle,
+				XMLNames.Vehicle_Components,
+				XMLNames.Component_AxleWheels,
+				XMLNames.ComponentDataWrapper,
+				XMLNames.AxleWheels_Axles,
+				helper.QueryConstraint(XMLNames.AxleWheels_Axles_Axle, "1", null, string.Empty)
+				), manager);
+			firstAxle.MoveToAttribute(XMLNames.AxleWheels_Axles_Axle_AxleNumber_Attr, string.Empty);
+			firstAxle.SetTypedValue(0);
+
+
+			var modified = XmlReader.Create(new StringReader(nav.OuterXml));
+
+			AssertHelper.Exception<VectoException>(
+				() => { var inputDataProvider = new XMLDeclarationInputDataProvider(modified, true); });
+		}
+
+		[TestMethod]
+		public void TestXMLInputAxleWheelsAxleNumTooHigh()
+		{
+			var reader = XmlReader.Create(SampleVehicleDecl);
+
+			var doc = new XmlDocument();
+			doc.Load(reader);
+			var nav = doc.CreateNavigator();
+			var manager = new XmlNamespaceManager(nav.NameTable);
+			var helper = new XPathHelper(ExecutionMode.Declaration);
+			helper.AddNamespaces(manager);
+
+			var firstAxle = nav.SelectSingleNode(helper.QueryAbs(
+				helper.NSPrefix(XMLNames.VectoInputDeclaration, Constants.XML.RootNSPrefix),
+				XMLNames.Component_Vehicle,
+				XMLNames.Vehicle_Components,
+				XMLNames.Component_AxleWheels,
+				XMLNames.ComponentDataWrapper,
+				XMLNames.AxleWheels_Axles,
+				helper.QueryConstraint(XMLNames.AxleWheels_Axles_Axle, "1", null, string.Empty)
+				), manager);
+			firstAxle.MoveToAttribute(XMLNames.AxleWheels_Axles_Axle_AxleNumber_Attr, string.Empty);
+			firstAxle.SetTypedValue(3);
+
+
+			var modified = XmlReader.Create(new StringReader(nav.OuterXml));
+
+			var inputDataProvider = new XMLDeclarationInputDataProvider(modified, true);
+			var vehicleDataProvider = inputDataProvider.VehicleInputData;
+
+			AssertHelper.Exception<VectoException>(() => { var axles = vehicleDataProvider.Axles; });
+		}
+
+		[TestMethod]
+		public void TestXMLInputAuxiliaries()
+		{
+			var reader = XmlReader.Create(SampleVehicleDecl);
+
+			var inputDataProvider = new XMLDeclarationInputDataProvider(reader, true);
+			var auxDataProvider = inputDataProvider.AuxiliaryInputData();
+
+			var aux = auxDataProvider.Auxiliaries;
+			var aux1 = aux[0];
+
+			Assert.AreEqual(AuxiliaryType.Fan, aux1.Type);
+			Assert.AreEqual("Hydraulic driven - Constant displacement pump", aux1.Technology.First());
+
+			var aux3 = aux[2];
+			Assert.AreEqual(AuxiliaryType.ElectricSystem, aux3.Type);
+			Assert.AreEqual("Standard technology - LED headlights, all", aux3.Technology.First());
+		}
+
+		[TestMethod]
+		public void TestXMLInputADAS()
+		{
+			var reader = XmlReader.Create(SampleVehicleDecl);
+
+			var inputDataProvider = new XMLDeclarationInputDataProvider(reader, true);
+
+			var adas = inputDataProvider.DriverInputData;
+
+			Assert.AreEqual(DriverMode.Overspeed, adas.OverSpeedEcoRoll.Mode);
+		}
+
+		[TestMethod]
+		public void TestVehicleInput()
+		{
+			var reader = XmlReader.Create(SampleVehicleDecl);
+
+			var inputDataProvider = new XMLDeclarationInputDataProvider(reader, true);
+
+			var vehicleDataProvider = inputDataProvider.VehicleInputData;
+
+			Assert.AreEqual(VehicleCategory.Tractor, vehicleDataProvider.VehicleCategory);
+			Assert.AreEqual(AxleConfiguration.AxleConfig_4x2, vehicleDataProvider.AxleConfiguration);
+
+			Assert.AreEqual(7100.0, vehicleDataProvider.CurbMassChassis.Value());
+			Assert.AreEqual(40000.0, vehicleDataProvider.GrossVehicleMassRating.Value());
+			Assert.AreEqual(6.34, inputDataProvider.AirdragInputData.AirDragArea.Value());
+
+			Assert.AreEqual(1.0, inputDataProvider.RetarderInputData.Ratio);
+		}
+
+		[TestMethod]
+		public void TestXMLPowertrainGeneration()
+		{
+			var reader = XmlReader.Create(SampleVehicleDecl);
+
+			var fileWriter = new FileOutputWriter("foo");
+			var sumWriter = new FileOutputWriter("vecto_vehicle-sample_xml");
+			var sumData = new SummaryDataContainer(sumWriter);
+			var jobContainer = new JobContainer(sumData);
+			var dataProvider = new XMLDeclarationInputDataProvider(reader, true);
+
+			var runsFactory = new SimulatorFactory(ExecutionMode.Declaration, dataProvider, fileWriter);
+			runsFactory.WriteModalResults = true;
+
+			jobContainer.AddRuns(runsFactory);
+
+			Assert.AreEqual(8, jobContainer.Runs.Count);
+		}
+
+		[TestMethod]
+		public void TestFullFeaturedXMEngineering_TorqueConverter()
+		{
+			var reader = XmlReader.Create(SampleVehicleFullDecl);
+
+			var inputDataProvider = new XMLDeclarationInputDataProvider(reader, true);
+
+			var tcDataProvider = inputDataProvider.TorqueConverterInputData;
+
+
+			Assert.AreEqual(3, tcDataProvider.TCData.Rows.Count);
+			Assert.AreEqual("300.00", tcDataProvider.TCData.Rows[0][2]);
+			Assert.AreEqual("0.90", tcDataProvider.TCData.Rows[2][1]);
+		}
+
+		[TestMethod]
+		public void TestFullFeaturedXMLDeclaration_AngleDrive()
+		{
+			var reader = XmlReader.Create(SampleVehicleFullDecl);
+
+			var inputDataProvider = new XMLDeclarationInputDataProvider(reader, true);
+
+
+			var angledriveDataProvider = inputDataProvider.AngledriveInputData;
+
+			Assert.AreEqual(2.345, angledriveDataProvider.Ratio);
+			Assert.AreEqual(6, angledriveDataProvider.LossMap.Rows.Count);
+			Assert.AreEqual("-10000.00", angledriveDataProvider.LossMap.Rows[0][1]);
+
+			AssertHelper.Exception<VectoException>(() => { var tmp = angledriveDataProvider.Efficiency; });
+		}
+
+		[TestMethod]
+		public void TestVehicleInputData()
+		{
+			var reader = XmlReader.Create(SampleVehicleFullDecl);
+
+			var inputDataProvider = new XMLDeclarationInputDataProvider(reader, true);
+			var vehicleDataProvider = inputDataProvider.JobInputData().Vehicle;
+
+			Assert.AreEqual(VehicleCategory.Tractor, vehicleDataProvider.VehicleCategory);
+			Assert.AreEqual(AxleConfiguration.AxleConfig_4x2, vehicleDataProvider.AxleConfiguration);
+
+			Assert.AreEqual(7100.0, vehicleDataProvider.CurbMassChassis.Value());
+			Assert.AreEqual(40000.0, vehicleDataProvider.GrossVehicleMassRating.Value());
+			Assert.AreEqual(6.34, inputDataProvider.AirdragInputData.AirDragArea.Value());
+
+			Assert.AreEqual(1.0, inputDataProvider.RetarderInputData.Ratio);
+		}
+
+		[TestMethod]
+		public void TestFullFeaturedXMLDeclaration_TorqueLimits()
+		{
+			var reader = XmlReader.Create(SampleVehicleFullDecl);
+
+			var inputDataProvider = new XMLDeclarationInputDataProvider(reader, true);
+			var vehicleDataProvider = inputDataProvider.JobInputData().Vehicle;
+
+			var torqueLimits = vehicleDataProvider.TorqueLimits.OrderBy(x => x.Gear).ToList();
+			Assert.AreEqual(3, torqueLimits.Count);
+			Assert.AreEqual(1, torqueLimits[0].Gear);
+			Assert.AreEqual(2500, torqueLimits[0].MaxTorque.Value());
+			Assert.AreEqual(12, torqueLimits[2].Gear);
+		}
+
+		[TestMethod]
+		public void TestFullFeaturedXMLDeclaration_GbxTorqueLimits()
+		{
+			var reader = XmlReader.Create(SampleVehicleFullDecl);
+
+			var inputDataProvider = new XMLDeclarationInputDataProvider(reader, true);
+			var gearboxDataProvider = inputDataProvider.GearboxInputData;
+			var gears = gearboxDataProvider.Gears;
+
+			Assert.AreEqual(12, gears.Count);
+			Assert.AreEqual(1900, gears[0].MaxTorque.Value());
+			Assert.AreEqual(1900, gears[1].MaxTorque.Value());
+			Assert.IsNull(gears[11].MaxTorque);
+		}
+
+		[TestMethod]
+		public void TestFullFeaturedXMLDeclaration_GbxSpeedLimits()
+		{
+			var reader = XmlReader.Create(SampleVehicleFullDecl);
+
+			var inputDataProvider = new XMLDeclarationInputDataProvider(reader, true);
+			var gearboxDataProvider = inputDataProvider.GearboxInputData;
+			var gears = gearboxDataProvider.Gears;
+
+			Assert.AreEqual(12, gears.Count);
+			Assert.AreEqual(2000, gears[0].MaxInputSpeed.AsRPM, 1e-6);
+			Assert.AreEqual(2000, gears[1].MaxInputSpeed.AsRPM, 1e-6);
+			Assert.IsNull(gears[11].MaxInputSpeed);
+		}
+
+		[TestMethod]
+		public void TestElementNotAvailable()
+		{
+			var reader = XmlReader.Create(SampleVehicleDecl);
+
+			var doc = new XmlDocument();
+			doc.Load(reader);
+			var nav = doc.CreateNavigator();
+			var manager = new XmlNamespaceManager(nav.NameTable);
+			var helper = new XPathHelper(ExecutionMode.Declaration);
+			helper.AddNamespaces(manager);
+
+			var retarderRatio = nav.SelectSingleNode(helper.QueryAbs(
+				helper.NSPrefix(XMLNames.VectoInputDeclaration, Constants.XML.RootNSPrefix),
+				XMLNames.Component_Vehicle,
+				XMLNames.Vehicle_RetarderRatio), manager);
+			retarderRatio.DeleteSelf();
+
+			var modified = XmlReader.Create(new StringReader(nav.OuterXml));
+
+			var inputDataProvider = new XMLDeclarationInputDataProvider(modified, true);
+
+			AssertHelper.Exception<VectoException>(() => { var tmp = inputDataProvider.RetarderInputData.Ratio; });
+		}
+
+		[TestMethod]
+		public void TestRetarderTypeNone()
+		{
+			var reader = XmlReader.Create(SampleVehicleDecl);
+
+			var doc = new XmlDocument();
+			doc.Load(reader);
+			var nav = doc.CreateNavigator();
+			var manager = new XmlNamespaceManager(nav.NameTable);
+			var helper = new XPathHelper(ExecutionMode.Declaration);
+			helper.AddNamespaces(manager);
+
+			var retarderType = nav.SelectSingleNode(helper.QueryAbs(
+				helper.NSPrefix(XMLNames.VectoInputDeclaration, Constants.XML.RootNSPrefix),
+				XMLNames.Component_Vehicle,
+				XMLNames.Vehicle_RetarderType), manager);
+			retarderType.SetValue("None");
+
+			var retarder = nav.SelectSingleNode(helper.QueryAbs(
+				helper.NSPrefix(XMLNames.VectoInputDeclaration, Constants.XML.RootNSPrefix),
+				XMLNames.Component_Vehicle,
+				XMLNames.Vehicle_Components,
+				XMLNames.Component_Retarder), manager);
+			retarder.DeleteSelf();
+
+			var modified = XmlReader.Create(new StringReader(nav.OuterXml));
+
+			var inputDataProvider = new XMLDeclarationInputDataProvider(modified, true);
+
+			var factory = new SimulatorFactory(ExecutionMode.Declaration, inputDataProvider, new FileOutputWriter("dummy"));
+			var jobContainer = new JobContainer(null);
+			jobContainer.AddRuns(factory);
+			jobContainer.Execute();
+		}
+
+		[TestMethod]
+		public void TestRetarderTypes()
+		{
+			var retarderTypes = new Dictionary<string, RetarderType>() {
+				{ "None", RetarderType.None },
+				{ "Losses included in Gearbox", RetarderType.LossesIncludedInTransmission },
+				{ "Engine Retarder", RetarderType.EngineRetarder },
+				{ "Transmission Input Retarder", RetarderType.TransmissionInputRetarder },
+				{ "Transmission Output Retarder", RetarderType.TransmissionOutputRetarder }
+			}
+				;
+			foreach (var retarderType in retarderTypes) {
+				var reader = XmlReader.Create(SampleVehicleDecl);
+
+				var doc = new XmlDocument();
+				doc.Load(reader);
+				var nav = doc.CreateNavigator();
+				var manager = new XmlNamespaceManager(nav.NameTable);
+				var helper = new XPathHelper(ExecutionMode.Declaration);
+				helper.AddNamespaces(manager);
+
+				var xmlRetarderType = nav.SelectSingleNode(helper.QueryAbs(
+					helper.NSPrefix(XMLNames.VectoInputDeclaration, Constants.XML.RootNSPrefix),
+					XMLNames.Component_Vehicle,
+					XMLNames.Vehicle_RetarderType), manager);
+				xmlRetarderType.SetValue(retarderType.Key);
+
+				var modified = XmlReader.Create(new StringReader(nav.OuterXml));
+
+				var inputDataProvider = new XMLDeclarationInputDataProvider(modified, true);
+
+				Assert.AreEqual(retarderType.Value, inputDataProvider.RetarderInputData.Type);
+			}
+		}
+
+		[TestMethod]
+		public void TestAxleConfigurationTypes()
+		{
+			var axleConfigurations = new Dictionary<string, AxleConfiguration>() {
+				{ "4x2", AxleConfiguration.AxleConfig_4x2 },
+				//{ "4x4", AxleConfiguration.AxleConfig_4x4 },
+				{ "6x2", AxleConfiguration.AxleConfig_6x2 },
+				{ "6x4", AxleConfiguration.AxleConfig_6x4 },
+				//{ "6x6", AxleConfiguration.AxleConfig_6x6 },
+				//{ "8x2", AxleConfiguration.AxleConfig_8x2 },
+				{ "8x4", AxleConfiguration.AxleConfig_8x4 },
+				//{ "8x6", AxleConfiguration.AxleConfig_8x6 },
+				//{ "8x8", AxleConfiguration.AxleConfig_8x8 }
+			};
+			foreach (var axleConfiguration in axleConfigurations) {
+				var reader = XmlReader.Create(SampleVehicleDecl);
+
+				var doc = new XmlDocument();
+				doc.Load(reader);
+				var nav = doc.CreateNavigator();
+				var manager = new XmlNamespaceManager(nav.NameTable);
+				var helper = new XPathHelper(ExecutionMode.Declaration);
+				helper.AddNamespaces(manager);
+
+				var xmlRetarderType = nav.SelectSingleNode(helper.QueryAbs(
+					helper.NSPrefix(XMLNames.VectoInputDeclaration, Constants.XML.RootNSPrefix),
+					XMLNames.Component_Vehicle,
+					XMLNames.Vehicle_AxleConfiguration), manager);
+				xmlRetarderType.SetValue(axleConfiguration.Key);
+
+				var modified = XmlReader.Create(new StringReader(nav.OuterXml));
+
+				var inputDataProvider = new XMLDeclarationInputDataProvider(modified, true);
+
+				Assert.AreEqual(axleConfiguration.Value, inputDataProvider.VehicleInputData.AxleConfiguration);
+			}
+		}
+
+		[TestMethod]
+		public void TestVehicleCategoryTypes()
+		{
+			var vehicleCategories = new Dictionary<string, VehicleCategory>() {
+				{ "Rigid Truck", VehicleCategory.RigidTruck },
+				{ "Tractor", VehicleCategory.Tractor },
+				//{ "City Bus", VehicleCategory.CityBus },
+				//{ "Interurban Bus", VehicleCategory.InterurbanBus },
+				//{ "Coach", VehicleCategory.Coach }
+			};
+			foreach (var vehicleCategory in vehicleCategories) {
+				var reader = XmlReader.Create(SampleVehicleDecl);
+
+				var doc = new XmlDocument();
+				doc.Load(reader);
+				var nav = doc.CreateNavigator();
+				var manager = new XmlNamespaceManager(nav.NameTable);
+				var helper = new XPathHelper(ExecutionMode.Declaration);
+				helper.AddNamespaces(manager);
+
+				var xmlRetarderType = nav.SelectSingleNode(helper.QueryAbs(
+					helper.NSPrefix(XMLNames.VectoInputDeclaration, Constants.XML.RootNSPrefix),
+					XMLNames.Component_Vehicle,
+					XMLNames.Vehicle_VehicleCategory), manager);
+				xmlRetarderType.SetValue(vehicleCategory.Key);
+
+				var modified = XmlReader.Create(new StringReader(nav.OuterXml));
+
+				var inputDataProvider = new XMLDeclarationInputDataProvider(modified, true);
+
+				Assert.AreEqual(vehicleCategory.Value, inputDataProvider.VehicleInputData.VehicleCategory);
+			}
+		}
+
+
+		[TestMethod]
+		public void TestWheelsTypes()
+		{
+			var retarderTypes = new Dictionary<string, RetarderType>() { };
+			foreach (var retarderType in retarderTypes) {
+				var reader = XmlReader.Create(SampleVehicleDecl);
+
+				var doc = new XmlDocument();
+				doc.Load(reader);
+				var nav = doc.CreateNavigator();
+				var manager = new XmlNamespaceManager(nav.NameTable);
+				var helper = new XPathHelper(ExecutionMode.Declaration);
+				helper.AddNamespaces(manager);
+
+				var xmlRetarderType = nav.SelectSingleNode(helper.QueryAbs(
+					helper.NSPrefix(XMLNames.VectoInputDeclaration,
+						Constants.XML.RootNSPrefix),
+					XMLNames.Component_Vehicle,
+					XMLNames.Vehicle_RetarderType),
+					manager);
+				xmlRetarderType.SetValue(retarderType.Key);
+
+				var modified = XmlReader.Create(new StringReader(nav.OuterXml));
+
+				var inputDataProvider = new XMLDeclarationInputDataProvider(modified,
+					true);
+
+				Assert.AreEqual(retarderType.Value,
+					inputDataProvider.RetarderInputData.Type);
+			}
+		}
+
+		[TestMethod]
+		public void TestPTOTypeTypes()
+		{
+			var ptoTypes = new string[][] {
+				new[] { "none", "none" },
+				new[] { "only one engaged gearwheel above oil level", "none" },
+				new[] { "only the drive shaft of the PTO", "shift claw, synchronizer, sliding gearwheel" },
+				new[] { "only the drive shaft of the PTO", "multi-disc clutch" },
+				new[] { "only the drive shaft of the PTO", "multi-disc clutch, oil pump" },
+				new[] { "drive shaft and/or up to 2 gear wheels", "shift claw, synchronizer, sliding gearwheel" },
+				new[] { "drive shaft and/or up to 2 gear wheels", "multi-disc clutch" },
+				new[] { "drive shaft and/or up to 2 gear wheels", "multi-disc clutch, oil pump" },
+				new[] { "drive shaft and/or more than 2 gear wheels", "shift claw, synchronizer, sliding gearwheel" },
+				new[] { "drive shaft and/or more than 2 gear wheels", "multi-disc clutch" },
+				new[] { "drive shaft and/or more than 2 gear wheels", "multi-disc clutch, oil pump" },
+			};
+			foreach (var ptoType in ptoTypes) {
+				var reader = XmlReader.Create(SampleVehicleDecl);
+
+				var doc = new XmlDocument();
+				doc.Load(reader);
+				var nav = doc.CreateNavigator();
+				var manager = new XmlNamespaceManager(nav.NameTable);
+				var helper = new XPathHelper(ExecutionMode.Declaration);
+				helper.AddNamespaces(manager);
+
+				var ptoGearWheels = nav.SelectSingleNode(helper.QueryAbs(
+					helper.NSPrefix(XMLNames.VectoInputDeclaration,
+						Constants.XML.RootNSPrefix),
+					XMLNames.Component_Vehicle,
+					XMLNames.Vehicle_PTO,
+					XMLNames.Vehicle_PTO_ShaftsGearWheels),
+					manager);
+				ptoGearWheels.SetValue(ptoType[0]);
+				var ptoOther = nav.SelectSingleNode(helper.QueryAbs(
+					helper.NSPrefix(XMLNames.VectoInputDeclaration,
+						Constants.XML.RootNSPrefix),
+					XMLNames.Component_Vehicle,
+					XMLNames.Vehicle_PTO,
+					XMLNames.Vehicle_PTO_OtherElements),
+					manager);
+				ptoOther.SetValue(ptoType[1]);
+
+				var modified = XmlReader.Create(new StringReader(nav.OuterXml));
+
+				var inputDataProvider = new XMLDeclarationInputDataProvider(modified,
+					true);
+
+				if (ptoType[0] == "none") {
+					Assert.AreEqual("None",
+						inputDataProvider.PTOTransmissionInputData.PTOTransmissionType);
+				} else if (ptoType[0] == "only one engaged gearwheel above oil level") {
+					Assert.AreEqual(ptoType[0],
+						inputDataProvider.PTOTransmissionInputData.PTOTransmissionType);
+				} else {
+					Assert.AreEqual(string.Format("{0} - {1}", ptoType[0], ptoType[1]),
+						inputDataProvider.PTOTransmissionInputData.PTOTransmissionType);
+				}
+				DeclarationData.PTOTransmission.Lookup(inputDataProvider.PTOTransmissionInputData.PTOTransmissionType);
+			}
+		}
+
+		[TestMethod]
+		public void TestAngledriveTypes()
+		{
+			var angledriveTypes = new Dictionary<string, AngledriveType>() {
+				{ "None", AngledriveType.None },
+				{ "Losses included in Gearbox", AngledriveType.LossesIncludedInGearbox },
+				{ "Separate Angledrive", AngledriveType.SeparateAngledrive }
+			};
+			foreach (var angleDrive in angledriveTypes) {
+				var reader = XmlReader.Create(SampleVehicleDecl);
+
+				var doc = new XmlDocument();
+				doc.Load(reader);
+				var nav = doc.CreateNavigator();
+				var manager = new XmlNamespaceManager(nav.NameTable);
+				var helper = new XPathHelper(ExecutionMode.Declaration);
+				helper.AddNamespaces(manager);
+
+				var xmlRetarderType = nav.SelectSingleNode(helper.QueryAbs(
+					helper.NSPrefix(XMLNames.VectoInputDeclaration,
+						Constants.XML.RootNSPrefix),
+					XMLNames.Component_Vehicle,
+					XMLNames.Vehicle_AngledriveType),
+					manager);
+				xmlRetarderType.SetValue(angleDrive.Key);
+
+				var modified = XmlReader.Create(new StringReader(nav.OuterXml));
+
+				var inputDataProvider = new XMLDeclarationInputDataProvider(modified,
+					true);
+
+				Assert.AreEqual(angleDrive.Value, inputDataProvider.AngledriveInputData.Type);
+			}
+		}
+
+		[TestMethod]
+		public void TestGearboxTypes()
+		{
+			var gearboxTypes = new Dictionary<string, GearboxType>() {
+				{ "SMT", GearboxType.MT },
+				{ "AMT", GearboxType.AMT },
+				{ "APT-S", GearboxType.ATSerial },
+				{ "APT-P", GearboxType.ATPowerSplit }
+			};
+			foreach (var gearboxType in gearboxTypes) {
+				var reader = XmlReader.Create(SampleVehicleDecl);
+
+				var doc = new XmlDocument();
+				doc.Load(reader);
+				var nav = doc.CreateNavigator();
+				var manager = new XmlNamespaceManager(nav.NameTable);
+				var helper = new XPathHelper(ExecutionMode.Declaration);
+				helper.AddNamespaces(manager);
+
+				var xmlRetarderType = nav.SelectSingleNode(helper.QueryAbs(
+					helper.NSPrefix(XMLNames.VectoInputDeclaration,
+						Constants.XML.RootNSPrefix),
+					XMLNames.Component_Vehicle,
+					XMLNames.Vehicle_Components,
+					XMLNames.Component_Gearbox,
+					XMLNames.ComponentDataWrapper,
+					XMLNames.Gearbox_TransmissionType),
+					manager);
+				xmlRetarderType.SetValue(gearboxType.Key);
+
+				var modified = XmlReader.Create(new StringReader(nav.OuterXml));
+
+				var inputDataProvider = new XMLDeclarationInputDataProvider(modified,
+					true);
+
+				Assert.AreEqual(gearboxType.Value, inputDataProvider.GearboxInputData.Type);
+			}
+		}
+
+		[TestMethod]
+		public void TestPTOInputNone()
+		{
+			var reader = XmlReader.Create(SampleVehicleDecl);
+
+			var inputDataProvider = new XMLDeclarationInputDataProvider(reader, true);
+			var ptoDataProvider = inputDataProvider.PTOTransmissionInputData;
+
+			Assert.AreEqual("None", ptoDataProvider.PTOTransmissionType);
+		}
+
+		[TestMethod]
+		public void TestPTOInput()
+		{
+			var reader = XmlReader.Create(SampleVehicleFullDecl);
+
+			var inputDataProvider = new XMLDeclarationInputDataProvider(reader, true);
+			var ptoDataProvider = inputDataProvider.PTOTransmissionInputData;
+			var lookup = DeclarationData.PTOTransmission.Lookup(ptoDataProvider.PTOTransmissionType);
+
+			Assert.AreEqual("only the drive shaft of the PTO - multi-disc clutch", ptoDataProvider.PTOTransmissionType);
+			Assert.AreEqual(1000, lookup.PowerDemand.Value());
+		}
+	}
 }
\ No newline at end of file
diff --git a/VectoCore/VectoCoreTest/XML/XMLWritingTest.cs b/VectoCore/VectoCoreTest/XML/XMLWritingTest.cs
index 1f4d70c0726e37d663fc3ce6ba383e13f259526c..5b200959dbcac2b69c609779fe1065754edbf601 100644
--- a/VectoCore/VectoCoreTest/XML/XMLWritingTest.cs
+++ b/VectoCore/VectoCoreTest/XML/XMLWritingTest.cs
@@ -29,162 +29,162 @@
 *   Martin Rexeis, rexeis@ivt.tugraz.at, IVT, Graz University of Technology
 */
 
-using System.IO;
-using System.Xml;
-using Microsoft.VisualStudio.TestTools.UnitTesting;
-using TUGraz.IVT.VectoXML.Writer;
-using TUGraz.VectoCommon.InputData;
-using TUGraz.VectoCore.InputData.FileIO.JSON;
-using TUGraz.VectoCore.InputData.FileIO.XML.Declaration;
-using TUGraz.VectoCore.InputData.FileIO.XML.Engineering;
-using TUGraz.VectoCore.OutputData.XML;
-
-namespace TUGraz.VectoCore.Tests.XML
-{
-	[TestClass]
-	public class XMLWritingTests
-	{
-		const string EngineOnlyJob = @"TestData\XML\EngineOnlyJob\EngineOnly.vecto";
-		const string EngineeringJob = @"TestData\XML\EngineeringJob\Class5_Tractor_4x2\Class5_Tractor_ENG.vecto";
-
-		const string EngineeringJobFull =
-			@"TestData\XML\XMLWriter\EngineeringJob\Class5_Tractor_4x2\Class5_Tractor_ENG-FULL.vecto";
-
-		const string DeclarationJob = @"TestData\XML\XMLWriter\DeclarationJob\Class5_Tractor_4x2\Class5_Tractor_DECL.vecto";
-
-		const string DeclarationJobFull =
-			@"TestData\XML\XMLWriter\DeclarationJob\Class5_Tractor_4x2\Class5_Tractor_DECL-FULL.vecto";
-
-
-		[TestMethod]
-		public void TestWriteEngineOnlySingleFile()
-		{
-			var outFile = "EngineOnlyJobSingleFile.xml";
-
-			if (File.Exists(outFile)) {
-				File.Delete(outFile);
-			}
-
-			var inputData = JSONInputDataFactory.ReadJsonJob(EngineOnlyJob);
-			var job =
-				new XMLEngineeringWriter(".", true, "TU Graz, IVT").GenerateVectoJob((IEngineeringInputDataProvider)inputData);
-			job.Save(outFile);
-
-			//var reader = XmlReader.Create(outFile);
-			var xml = new XMLEngineeringInputDataProvider(outFile, true);
-
-			Assert.IsNotNull(xml);
-			Assert.AreEqual("175kW 6.8l Engine", xml.JobInputData().JobName);
-		}
-
-		[TestMethod]
-		public void TestWriteEngineeringSingleFile()
-		{
-			var outFile = "EngineeringJobSingleFile.xml";
-
-			var inputData = JSONInputDataFactory.ReadJsonJob(EngineeringJob);
-			var job =
-				new XMLEngineeringWriter(".", true, "TU Graz, IVT").GenerateVectoJob((IEngineeringInputDataProvider)inputData);
-			job.Save(outFile);
-
-			var xml = new XMLEngineeringInputDataProvider(outFile, true);
-
-			Assert.IsNotNull(xml);
-			Assert.AreEqual("VEH-N.A.", xml.JobInputData().JobName);
-		}
-
-		[TestMethod]
-		public void TestWriteEngineeringSingleFileFull()
-		{
-			var outFile = "EngineeringJobSingleFileFull.xml";
-
-			var inputData = JSONInputDataFactory.ReadJsonJob(EngineeringJobFull);
-			var job =
-				new XMLEngineeringWriter(".", true, "TU Graz, IVT").GenerateVectoJob((IEngineeringInputDataProvider)inputData);
-			job.Save(outFile);
-
-			var xml = new XMLEngineeringInputDataProvider(outFile, true);
-
-			Assert.IsNotNull(xml);
-			Assert.AreEqual("VEH-N.A.", xml.JobInputData().JobName);
-		}
-
-		[TestMethod]
-		public void TestWriteEngineeringMultipleFilesFull()
-		{
-			var outFile = "EngineeringJobMultipleFilesFull.xml";
-			var outDir = "Engineering_MultipleFiles_Full";
-			Directory.CreateDirectory(outDir);
-
-			var inputData = JSONInputDataFactory.ReadJsonJob(EngineeringJobFull);
-			var job =
-				new XMLEngineeringWriter(outDir, false, "TU Graz, IVT").GenerateVectoJob((IEngineeringInputDataProvider)inputData);
-			job.Save(Path.Combine(outDir, outFile));
-
-			var xml = new XMLEngineeringInputDataProvider(Path.Combine(outDir, outFile), true);
-
-			Assert.IsNotNull(xml);
-			Assert.AreEqual("VEH-N.A.", xml.JobInputData().JobName);
-		}
-
-		[TestMethod]
-		public void TestWriteEngineeringMultipleFiles()
-		{
-			var inputData = JSONInputDataFactory.ReadJsonJob(EngineeringJob);
-			Directory.CreateDirectory("Engineering_MultipleFiles");
-			var job =
-				new XMLEngineeringWriter("Engineering_MultipleFiles", false, "TU Graz, IVT").GenerateVectoJob(
-					(IEngineeringInputDataProvider)inputData);
-			job.Save("Engineering_MultipleFiles/EngineeringJobMultipleFiles.xml");
-
-			//var xml = new XMLEngineeringInputDataProvider(outFile, true);
-
-			//Assert.IsNotNull(xml);
-			//Assert.AreEqual("VEH-N/A", xml.JobInputData().JobName);
-		}
-
-		[TestMethod]
-		public void TestWriteDeclarationJob()
-		{
-			var outputFile = "DeclarationJobSingleFile.xml";
-
-			if (File.Exists(outputFile)) {
-				File.Delete(outputFile);
-			}
-
-			var inputData = JSONInputDataFactory.ReadJsonJob(DeclarationJob);
-
-			var job = new XMLDeclarationWriter("TUG_IVT").GenerateVectoJob((IDeclarationInputDataProvider)inputData);
-
-			job.Save(outputFile);
-
-			var reader = XmlReader.Create(outputFile);
-			var xml = new XMLDeclarationInputDataProvider(reader, true);
-
-			Assert.IsNotNull(xml);
-			Assert.AreEqual("VEH-N.A.", xml.JobInputData().JobName);
-		}
-
-		[TestMethod]
-		public void TestWriteDeclarationJobFull()
-		{
-			var outputFile = "DeclarationJobFullSingleFile.xml";
-
-			if (File.Exists(outputFile)) {
-				File.Delete(outputFile);
-			}
-
-			var inputData = JSONInputDataFactory.ReadJsonJob(DeclarationJobFull);
-
-			var job = new XMLDeclarationWriter("TUG_IVT").GenerateVectoJob((IDeclarationInputDataProvider)inputData);
-
-			job.Save(outputFile);
-
-			var reader = XmlReader.Create(outputFile);
-			var xml = new XMLDeclarationInputDataProvider(reader, true);
-
-			Assert.IsNotNull(xml);
-			Assert.AreEqual("VEH-N.A.", xml.JobInputData().JobName);
-		}
-	}
+using System.IO;
+using System.Xml;
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+using TUGraz.IVT.VectoXML.Writer;
+using TUGraz.VectoCommon.InputData;
+using TUGraz.VectoCore.InputData.FileIO.JSON;
+using TUGraz.VectoCore.InputData.FileIO.XML.Declaration;
+using TUGraz.VectoCore.InputData.FileIO.XML.Engineering;
+using TUGraz.VectoCore.OutputData.XML;
+
+namespace TUGraz.VectoCore.Tests.XML
+{
+	[TestClass]
+	public class XMLWritingTests
+	{
+		const string EngineOnlyJob = @"TestData\XML\EngineOnlyJob\EngineOnly.vecto";
+		const string EngineeringJob = @"TestData\XML\EngineeringJob\Class5_Tractor_4x2\Class5_Tractor_ENG.vecto";
+
+		const string EngineeringJobFull =
+			@"TestData\XML\XMLWriter\EngineeringJob\Class5_Tractor_4x2\Class5_Tractor_ENG-FULL.vecto";
+
+		const string DeclarationJob = @"TestData\XML\XMLWriter\DeclarationJob\Class5_Tractor_4x2\Class5_Tractor_DECL.vecto";
+
+		const string DeclarationJobFull =
+			@"TestData\XML\XMLWriter\DeclarationJob\Class5_Tractor_4x2\Class5_Tractor_DECL-FULL.vecto";
+
+
+		[TestMethod]
+		public void TestWriteEngineOnlySingleFile()
+		{
+			var outFile = "EngineOnlyJobSingleFile.xml";
+
+			if (File.Exists(outFile)) {
+				File.Delete(outFile);
+			}
+
+			var inputData = JSONInputDataFactory.ReadJsonJob(EngineOnlyJob);
+			var job =
+				new XMLEngineeringWriter(".", true, "TU Graz, IVT").GenerateVectoJob((IEngineeringInputDataProvider)inputData);
+			job.Save(outFile);
+
+			//var reader = XmlReader.Create(outFile);
+			var xml = new XMLEngineeringInputDataProvider(outFile, true);
+
+			Assert.IsNotNull(xml);
+			Assert.AreEqual("175kW 6.8l Engine", xml.JobInputData().JobName);
+		}
+
+		[TestMethod]
+		public void TestWriteEngineeringSingleFile()
+		{
+			var outFile = "EngineeringJobSingleFile.xml";
+
+			var inputData = JSONInputDataFactory.ReadJsonJob(EngineeringJob);
+			var job =
+				new XMLEngineeringWriter(".", true, "TU Graz, IVT").GenerateVectoJob((IEngineeringInputDataProvider)inputData);
+			job.Save(outFile);
+
+			var xml = new XMLEngineeringInputDataProvider(outFile, true);
+
+			Assert.IsNotNull(xml);
+			Assert.AreEqual("VEH-N.A.", xml.JobInputData().JobName);
+		}
+
+		[TestMethod]
+		public void TestWriteEngineeringSingleFileFull()
+		{
+			var outFile = "EngineeringJobSingleFileFull.xml";
+
+			var inputData = JSONInputDataFactory.ReadJsonJob(EngineeringJobFull);
+			var job =
+				new XMLEngineeringWriter(".", true, "TU Graz, IVT").GenerateVectoJob((IEngineeringInputDataProvider)inputData);
+			job.Save(outFile);
+
+			var xml = new XMLEngineeringInputDataProvider(outFile, true);
+
+			Assert.IsNotNull(xml);
+			Assert.AreEqual("VEH-N.A.", xml.JobInputData().JobName);
+		}
+
+		[TestMethod]
+		public void TestWriteEngineeringMultipleFilesFull()
+		{
+			var outFile = "EngineeringJobMultipleFilesFull.xml";
+			var outDir = "Engineering_MultipleFiles_Full";
+			Directory.CreateDirectory(outDir);
+
+			var inputData = JSONInputDataFactory.ReadJsonJob(EngineeringJobFull);
+			var job =
+				new XMLEngineeringWriter(outDir, false, "TU Graz, IVT").GenerateVectoJob((IEngineeringInputDataProvider)inputData);
+			job.Save(Path.Combine(outDir, outFile));
+
+			var xml = new XMLEngineeringInputDataProvider(Path.Combine(outDir, outFile), true);
+
+			Assert.IsNotNull(xml);
+			Assert.AreEqual("VEH-N.A.", xml.JobInputData().JobName);
+		}
+
+		[TestMethod]
+		public void TestWriteEngineeringMultipleFiles()
+		{
+			var inputData = JSONInputDataFactory.ReadJsonJob(EngineeringJob);
+			Directory.CreateDirectory("Engineering_MultipleFiles");
+			var job =
+				new XMLEngineeringWriter("Engineering_MultipleFiles", false, "TU Graz, IVT").GenerateVectoJob(
+					(IEngineeringInputDataProvider)inputData);
+			job.Save("Engineering_MultipleFiles/EngineeringJobMultipleFiles.xml");
+
+			//var xml = new XMLEngineeringInputDataProvider(outFile, true);
+
+			//Assert.IsNotNull(xml);
+			//Assert.AreEqual("VEH-N/A", xml.JobInputData().JobName);
+		}
+
+		[TestMethod]
+		public void TestWriteDeclarationJob()
+		{
+			var outputFile = "DeclarationJobSingleFile.xml";
+
+			if (File.Exists(outputFile)) {
+				File.Delete(outputFile);
+			}
+
+			var inputData = JSONInputDataFactory.ReadJsonJob(DeclarationJob);
+
+			var job = new XMLDeclarationWriter("TUG_IVT").GenerateVectoJob((IDeclarationInputDataProvider)inputData);
+
+			job.Save(outputFile);
+
+			var reader = XmlReader.Create(outputFile);
+			var xml = new XMLDeclarationInputDataProvider(reader, true);
+
+			Assert.IsNotNull(xml);
+			Assert.AreEqual("VEH-N.A.", xml.JobInputData().JobName);
+		}
+
+		[TestMethod]
+		public void TestWriteDeclarationJobFull()
+		{
+			var outputFile = "DeclarationJobFullSingleFile.xml";
+
+			if (File.Exists(outputFile)) {
+				File.Delete(outputFile);
+			}
+
+			var inputData = JSONInputDataFactory.ReadJsonJob(DeclarationJobFull);
+
+			var job = new XMLDeclarationWriter("TUG_IVT").GenerateVectoJob((IDeclarationInputDataProvider)inputData);
+
+			job.Save(outputFile);
+
+			var reader = XmlReader.Create(outputFile);
+			var xml = new XMLDeclarationInputDataProvider(reader, true);
+
+			Assert.IsNotNull(xml);
+			Assert.AreEqual("VEH-N.A.", xml.JobInputData().JobName);
+		}
+	}
 }
\ No newline at end of file
diff --git a/packages/repositories.config b/packages/repositories.config
index 4120f2246cde378d2ddb8b7675eef96db1a0bc0d..96750bd818fd83effc632b7bb600d511c3f3c3a6 100644
--- a/packages/repositories.config
+++ b/packages/repositories.config
@@ -1,5 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
 <repositories>
+  <repository path="..\..\VECTO_API\Excel2XML\packages.config" />
+  <repository path="..\..\VECTO_API\VectoDB\packages.config" />
   <repository path="..\..\VECTO-Bugreports\BugReportTests\packages.config" />
   <repository path="..\VECTO\packages.config" />
   <repository path="..\VECTOAux\VectoAuxiliaries\packages.config" />